Merge pull request #39 from ukutaht/force_order

Force koan order using macros and attributes
This commit is contained in:
Uku Taht
2016-03-08 22:35:36 +02:00
3 changed files with 14 additions and 22 deletions

View File

@@ -8,7 +8,7 @@ defmodule Display do
IO.puts("Now meditate upon #{display_module(module)}")
IO.puts("---------------------------------------")
IO.puts(format_cyan(last_failure_location))
IO.puts(display_koan(name))
IO.puts(name)
IO.puts(format_red(Macro.to_string(expr)))
end
@@ -55,8 +55,4 @@ defmodule Display do
defp display_module(module) do
Module.split(module) |> List.last
end
defp display_koan(name) do
String.replace(to_string(name), Koans.prefix, "")
end
end

View File

@@ -1,9 +1,8 @@
defmodule Koans do
@prefix "koan: "
defmacro koan(name, body) do
compiled_name = :"#{prefix}#{name}"
compiled_name = String.to_atom(name)
quote do
@koans unquote(compiled_name)
def unquote(compiled_name)() do
try do
unquote(body)
@@ -17,13 +16,21 @@ 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 Koans
end
end
def prefix do
@prefix
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

View File

@@ -28,8 +28,7 @@ defmodule Runner do
def run_module(module) do
Display.considering(module)
koans = extract_koans_from(module)
koans = module.all_koans
passed = Enum.take_while(koans, fn(name) ->
run_koan(module, name) == :passed
end)
@@ -49,14 +48,4 @@ defmodule Runner do
:failed
end
end
defp extract_koans_from(module) do
module.__info__(:functions)
|> Enum.map(fn({name, _arity}) -> name end)
|> Enum.filter(&koan?/1)
end
defp koan?(fun_name) do
String.starts_with?(to_string(fun_name), Koans.prefix)
end
end