Current section

Files

Jump to
igniter lib igniter phoenix generator.ex
Raw

lib/igniter/phoenix/generator.ex

defmodule Igniter.Phoenix.Generator do
@moduledoc false
# Wrap Phx.New.Generator
# https://github.com/phoenixframework/phoenix/blob/7586cbee9e37afbe0b3cdbd560b9e6aa60d32bf6/installer/lib/phx_new/generator.ex#L69
def copy_from(igniter, project, mod, name) when is_atom(name) do
mapping = mod.template_files(name)
templates =
for {format, _project_location, files} <- mapping,
{source, target_path} <- files,
source = to_string(source) do
target = expand_path_with_bindings(target_path, project)
{format, source, target}
end
Enum.reduce(templates, igniter, fn {format, source, target}, acc ->
case format do
:keep ->
acc
:text ->
contents = mod.render(name, source, project.binding)
Igniter.create_new_file(acc, target, contents, on_exists: :overwrite)
:config ->
contents = mod.render(name, source, project.binding)
config_inject(acc, target, contents)
:prod_config ->
contents = mod.render(name, source, project.binding)
prod_only_config_inject(acc, target, contents)
:eex ->
contents = mod.render(name, source, project.binding)
Igniter.create_new_file(acc, target, contents, on_exists: :overwrite)
end
end)
end
defp expand_path_with_bindings(path, project) do
Regex.replace(Regex.recompile!(~r/:[a-zA-Z0-9_]+/), path, fn ":" <> key, _ ->
project |> Map.fetch!(:"#{key}") |> to_string()
end)
end
defp config_inject(igniter, file, to_inject) do
patterns = [
"""
import Config
__cursor__()
"""
]
Igniter.create_or_update_elixir_file(igniter, file, to_inject, fn zipper ->
case Igniter.Code.Common.move_to_cursor_match_in_scope(zipper, patterns) do
{:ok, zipper} ->
{:ok, Igniter.Code.Common.add_code(zipper, to_inject)}
_ ->
{:warning,
"""
Could not automatically inject the following config into #{file}
#{to_inject}
"""}
end
end)
end
defp prod_only_config_inject(igniter, file, to_inject) do
patterns = [
"""
if config_env() == :prod do
__cursor__()
end
""",
"""
if :prod == config_env() do
__cursor__()
end
"""
]
Igniter.create_or_update_elixir_file(igniter, file, to_inject, fn zipper ->
case Igniter.Code.Common.move_to_cursor_match_in_scope(zipper, patterns) do
{:ok, zipper} ->
{:ok, Igniter.Code.Common.add_code(zipper, to_inject)}
_ ->
{:warning,
"""
Could not automatically inject the following config into #{file}
#{to_inject}
"""}
end
end)
end
def gen_ecto_config(igniter, %{binding: binding}) do
adapter_config = binding[:adapter_config]
config_inject(igniter, "config/dev.exs", """
# Configure your database
config :#{binding[:app_name]}, #{binding[:app_module]}.Repo#{kw_to_config(adapter_config[:dev])}
""")
end
defp kw_to_config(kw) do
Enum.map(kw, fn
{k, {:literal, v}} -> ",\n #{k}: #{v}"
{k, v} -> ",\n #{k}: #{inspect(v)}"
end)
end
end