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
|
||||
compiled_name = :"#{prefix}#{name}"
|
||||
|
||||
quote do
|
||||
@koans unquote(compiled_name)
|
||||
def unquote(compiled_name)() do
|
||||
try do
|
||||
unquote(body)
|
||||
@@ -17,9 +19,12 @@ defmodule Koans do
|
||||
|
||||
defmacro __using__(opts) do
|
||||
quote do
|
||||
Module.register_attribute(__MODULE__, :koans, accumulate: true)
|
||||
require ExUnit.Assertions
|
||||
import Koans
|
||||
import BlankAssertions
|
||||
|
||||
@before_compile KoansBuilder
|
||||
end
|
||||
end
|
||||
|
||||
@@ -27,3 +32,14 @@ defmodule Koans do
|
||||
@prefix
|
||||
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
|
||||
|
||||
defp extract_koans_from(module) do
|
||||
module.__info__(:functions)
|
||||
|> Enum.map(fn({name, _arity}) -> name end)
|
||||
module.all_koans
|
||||
|> Enum.filter(&koan?/1)
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user