Packages

Arke project generator. Provides a `mix arke.new` task to bootstrap a new Elixir application with Arke dependencies.

Current section

Files

Jump to
arke_new lib arke_new single.ex
Raw

lib/arke_new/single.ex

defmodule Arke.New.Single do
@moduledoc false
use Arke.New.Generator
alias Arke.New.{Project}
template(:new, [
{:eex, :project,
"arke_single/github/workflows/build-push-docker.yml":
".github/workflows/build-push-docker.yml",
"arke_single/github/workflows/build-push-docker-dev.yml":
".github/workflows/build-push-docker-dev.yml",
"arke_single/github/workflows/build-push-docker-staging.yml":
".github/workflows/build-push-docker-staging.yml",
"arke_single/github/pull_request_template.md": ".github/pull_request_template.md",
"arke_single/config/config.exs": "config/config.exs",
"arke_single/config/config.exs": "config/config.exs",
"arke_single/config/dev.exs": "config/dev.exs",
"arke_single/config/prod.exs": "config/prod.exs",
"arke_single/config/runtime.exs": "config/runtime.exs",
"arke_single/config/test.exs": "config/test.exs",
"arke_single/lib/app_name/application.ex": "lib/:app/application.ex",
"arke_single/lib/app_name.ex": "lib/:app.ex",
"arke_single/lib/app_name_web.ex": "lib/:lib_arke_app.ex",
"arke_single/lib/registry/arke.json": "lib/registry/arke.json",
"arke_single/lib/registry/group.json": "lib/registry/group.json",
"arke_single/lib/registry/parameter.json": "lib/registry/parameter.json",
"arke_single/rel/overlays/bin/migrate": "rel/overlays/bin/migrate",
"arke_single/rel/overlays/bin/migrate.bat": "rel/overlays/bin/migrate.bat",
"arke_single/rel/overlays/bin/server": "rel/overlays/bin/server",
"arke_single/rel/overlays/bin/server.bat": "rel/overlays/bin/server.bat",
"arke_single/rel/env.sh.eex": "rel/env.sh.eex",
"starter/plugs/arke_router_plug.ex": "lib/:lib_arke_app/plugs/arke_router_plug.ex",
"starter/views/error_view.ex": "lib/:lib_arke_app/views/error_view.ex",
"starter/views/error_helpers.ex": "lib/:lib_arke_app/views/error_helpers.ex",
"starter/controllers/page_controller.ex": "lib/:lib_arke_app/controllers/page_controller.ex",
"starter/endpoint.ex": "lib/:lib_arke_app/endpoint.ex",
"starter/router.ex": "lib/:lib_arke_app/router.ex",
"starter/telemetry.ex": "lib/:lib_arke_app/telemetry.ex",
"arke_single/mix.exs": "mix.exs",
"arke_single/README.md": "README.md",
"arke_single/formatter.exs": ".formatter.exs",
"arke_single/gitignore": ".gitignore",
"arke_single/env": ".env",
"arke_single/iex.exs": ".iex.exs",
"arke_single/Dockerfile": "Dockerfile",
"arke_single/docker-compose.yml": "docker-compose.yml",
"arke_single/dockerignore": ".dockerignore",
"starter_test/support/conn_case.ex": "test/support/conn_case.ex",
"arke_single/test/test_helper.exs": "test/test_helper.exs",
"starter_test/views/error_view_test.exs": "test/:lib_arke_app/views/error_view_test.exs"},
{:keep, :project,
"starter/controllers": "lib/:lib_arke_app/controllers",
"starter/plugs": "lib/:lib_arke_app/plugs",
"starter_test/controllers": "test/:lib_arke_app/controllers"}
])
template(:mailer, [
{:eex, :app, "arke_mailer/lib/app_name/mailer.ex": "lib/:app/mailer.ex"},
{:eex, :app, "arke_mailer/lib/app_name/email_manager.ex": "lib/:app/email_manager.ex"}
])
template(:terraform, [
{:eex, :terraform,
"terraform/environments/cluster/main.tf": "environments/cluster/main.tf",
"terraform/environments/cluster/outputs.tf": "environments/cluster/outputs.tf",
"terraform/environments/cluster/provider.tf": "environments/cluster/provider.tf",
"terraform/environments/cluster/variables.tf": "environments/cluster/variables.tf",
"terraform/environments/develop/main.tf": "environments/develop/main.tf",
"terraform/environments/develop/outputs.tf": "environments/develop/outputs.tf",
"terraform/environments/develop/provider.tf": "environments/develop/provider.tf",
"terraform/environments/develop/variables.tf": "environments/develop/variables.tf",
"terraform/environments/prod/main.tf": "environments/prod/main.tf",
"terraform/environments/prod/outputs.tf": "environments/prod/outputs.tf",
"terraform/environments/prod/provider.tf": "environments/prod/provider.tf",
"terraform/environments/prod/variables.tf": "environments/prod/variables.tf",
"terraform/modules/backend/main.tf": "modules/backend/main.tf",
"terraform/modules/backend/outputs.tf": "modules/backend/outputs.tf",
"terraform/modules/backend/variables.tf": "modules/backend/variables.tf",
"terraform/modules/frontend/main.tf": "modules/frontend/main.tf",
"terraform/modules/frontend/outputs.tf": "modules/frontend/outputs.tf",
"terraform/modules/frontend/variables.tf": "modules/frontend/variables.tf",
"terraform/README.md": "README.md",
},
])
def prepare_project(%Project{app: app} = project) when not is_nil(app) do
%Project{project | project_path: project.base_path}
|> put_root_app()
|> put_starter_app()
end
defp put_root_app(%Project{app: app, opts: opts} = project) do
%Project{
project
| root_app: app,
root_mod: Module.concat([opts[:project] || Macro.camelize(app)])
}
end
defp put_starter_app(%Project{app: app,base_path: base_path} = project) do
%Project{
project
| arke_app: app,
app_path: base_path,
lib_arke_app: "#{app}_web",
arke_ns: Module.concat(["#{project.root_mod}Web"]),
starter_path: project.project_path
}
end
def gen_tf(%Project{} = project) do
copy_from(project, __MODULE__, :terraform)
end
def gen_mailer(%Project{} = project) do
copy_from(project, __MODULE__, :mailer)
end
def generate(%Project{} = project) do
copy_from(project, __MODULE__, :new)
gen_mailer(project)
if Project.terraform?(project), do: gen_tf(project)
project
end
end