Files
elixir-koans/lib/watcher.ex
Ahmed Ismail edf50fdf80 Add credo to the project and:
- Run mix credo --all to identify possible code optimizations
 - Resolve most of the errors generated by credo such as:
   - Numbers larger than 9999 should be written with underscores: 58_127
   - Modules should have a @moduledoc tag
   - Comparison will always return true
2023-11-10 00:57:21 +05:00

54 lines
1.5 KiB
Elixir

defmodule Watcher do
@moduledoc false
use GenServer
def start_link() do
GenServer.start_link(__MODULE__, dirs: ["lib/koans"])
end
def init(args) do
{:ok, watcher_pid} = FileSystem.start_link(args)
FileSystem.subscribe(watcher_pid)
{:ok, %{watcher_pid: watcher_pid}}
end
def handle_info({:file_event, watcher_pid, {path, events}}, %{watcher_pid: watcher_pid} = state) do
# respond to renamed as well due to that some editors use temporary files for atomic writes (ex: TextMate)
if Enum.member?(events, :modified) || Enum.member?(events, :renamed) do
path |> normalize |> reload
end
{:noreply, state}
end
defp reload(file) do
if String.match?(file, Runner.koan_path_pattern()) do
try do
file
|> portable_load_file
|> Enum.map(&elem(&1, 0))
|> Enum.find(&Runner.koan?/1)
|> Runner.modules_to_run()
|> Runner.run()
rescue
e -> Display.show_compile_error(e)
end
end
end
# Elixir 1.7 deprecates Code.load_file in favor of Code.compile_file. In
# order to avoid the depecation warnings while maintaining backwards
# compatibility, we check the sytem version and execute conditionally.
defp portable_load_file(file) do
if Version.match?(System.version(), "~> 1.7") do
Code.compile_file(file)
else
Code.load_file(file)
end
end
defp normalize(file) do
String.replace_suffix(file, "___jb_tmp___", "")
end
end