Current section
Files
Jump to
Current section
Files
lib/mix/tasks/compile/sugar.ex
defmodule Mix.Tasks.Compile.Sugar do
use Mix.Task
@hidden true
@shortdoc "Compile Sugar source files"
@recursive true
@manifest ".compile.sugar"
@moduledoc """
A task to compile Sugar source files.
## Command line options
* `--force` - forces compilation regardless of mod times
* `--path` - overrides the default location to search
"""
@switches [ force: :boolean, docs: :boolean, ignore_module_conflict: :boolean,
debug_info: :boolean, warnings_as_errors: :boolean ]
@doc """
Runs this task.
"""
def run(args) do
OptionParser.parse(args, switches: @switches) |> elem(0)
|> do_compile
end
@doc """
The manifests for this compiler.
"""
def manifests, do: [manifest]
defp manifest, do: Path.join(Mix.Project.compile_path, @manifest)
defp do_compile(opts) do
app = Mix.Project.config[:app]
compile_path = Mix.Project.compile_path
watch_exts = ["dtl","haml","eex"]
opts = [ app: app,
path: "lib/#{app}/views",
compile_path: compile_path ] |> Keyword.merge(opts)
source_paths = [opts[:path]]
templates = Sugar.Views.Finder.all(opts[:path])
# Source files + Mix setup + Dynamo config + Templates
to_watch = Mix.Utils.extract_files(source_paths, watch_exts)
to_watch = Mix.Tasks.Compile.Elixir.manifests ++ to_watch
# to_watch = to_watch ++ Enum.map(templates, &template_mtime(&1))
manifest = manifest()
if opts[:force] || Mix.Utils.stale?(to_watch, [manifest]) do
# to_compile = Mix.Utils.extract_files(source_paths, watch_exts)
File.mkdir_p!(compile_path)
true = Code.prepend_path compile_path
:ok = :application.ensure_started(:templates)
_ = templates
|> Enum.map(fn(template) ->
{:ok,t} = template.engine.compile template
name = template.key |> String.replace("/", "_")
if t.binary do
File.write! Path.join(compile_path, "#{name}.beam"), t.binary
end
Mix.shell.info "Generated #{name}"
end)
# compiled =
Sugar.Templates.get_all_templates
|> Map.keys
# Mix.Utils.write_manifest(manifest, compiled)
end
end
# defp template_mtime(%Templates.Template{key: key, updated_at: updated_at}) do
# { key, updated_at }
# end
end