Force koan order using macros and attributes
This commit is contained in:
16
lib/koans.ex
16
lib/koans.ex
@@ -3,7 +3,9 @@ defmodule Koans do
|
|||||||
|
|
||||||
defmacro koan(name, body) do
|
defmacro koan(name, body) do
|
||||||
compiled_name = :"#{prefix}#{name}"
|
compiled_name = :"#{prefix}#{name}"
|
||||||
|
|
||||||
quote do
|
quote do
|
||||||
|
@koans unquote(compiled_name)
|
||||||
def unquote(compiled_name)() do
|
def unquote(compiled_name)() do
|
||||||
try do
|
try do
|
||||||
unquote(body)
|
unquote(body)
|
||||||
@@ -17,9 +19,12 @@ defmodule Koans do
|
|||||||
|
|
||||||
defmacro __using__(opts) do
|
defmacro __using__(opts) do
|
||||||
quote do
|
quote do
|
||||||
|
Module.register_attribute(__MODULE__, :koans, accumulate: true)
|
||||||
require ExUnit.Assertions
|
require ExUnit.Assertions
|
||||||
import Koans
|
import Koans
|
||||||
import BlankAssertions
|
import BlankAssertions
|
||||||
|
|
||||||
|
@before_compile KoansBuilder
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -27,3 +32,14 @@ defmodule Koans do
|
|||||||
@prefix
|
@prefix
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defmodule KoansBuilder do
|
||||||
|
defmacro __before_compile__(env) do
|
||||||
|
koans = Module.get_attribute(env.module, :koans) |> Enum.reverse
|
||||||
|
quote do
|
||||||
|
def all_koans do
|
||||||
|
unquote(koans)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|||||||
@@ -51,8 +51,7 @@ defmodule Runner do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp extract_koans_from(module) do
|
defp extract_koans_from(module) do
|
||||||
module.__info__(:functions)
|
module.all_koans
|
||||||
|> Enum.map(fn({name, _arity}) -> name end)
|
|
||||||
|> Enum.filter(&koan?/1)
|
|> Enum.filter(&koan?/1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user