From e9bf1ecf8e2d9a46f9277521f1aff9b492d9567c Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Thu, 20 Jun 2024 19:24:30 -0400 Subject: [PATCH] improvement: support `--with` option in `igniter.new` --- .formatter.exs | 2 +- .github/dependabot.yml | 14 ++-- README.md | 14 +++- installer/lib/mix/tasks/igniter.new.ex | 99 ++++++++++++++------------ 4 files changed, 76 insertions(+), 53 deletions(-) diff --git a/.formatter.exs b/.formatter.exs index 482ccb3..b31acf7 100644 --- a/.formatter.exs +++ b/.formatter.exs @@ -1,7 +1,7 @@ spark_locals_without_parens = [attributes: 1, decrypt_by_default: 1, on_decrypt: 1, vault: 1] [ - inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"], + inputs: ["{mix,.formatter}.exs", "{config,lib,test,installer}/**/*.{ex,exs}"], locals_without_parens: spark_locals_without_parens, export: [ locals_without_parens: spark_locals_without_parens diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6977f1c..2f0ee6f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,6 +1,12 @@ version: 2 updates: -- package-ecosystem: mix - directory: "/" - schedule: - interval: "daily" + - package-ecosystem: mix + directory: "/" + schedule: + interval: weekly + day: thursday + groups: + production-dependencies: + dependency-type: production + dev-dependencies: + dependency-type: development diff --git a/README.md b/README.md index 842ee1d..eb9dd8e 100644 --- a/README.md +++ b/README.md @@ -31,14 +31,22 @@ Igniter can be added to an existing elixir project by adding it to your dependen You can also generate new projects with igniter preinstalled, and run installers in the same command. +First, install the archive: + +```elixir +mix archive.install hex igniter_new +``` + +Then you can run `mix igniter.new` + ``` mix igniter.new app_name --install ash ``` -To use this command, install the archive: +Or if you want to use a different project creator, specify the mix task name with the `--with` flag. Any arguments will be passed through to that task, with the exception of `--install` and `--example`. -```elixir -mix archive.install hex igniter_new +``` +mix igniter.new app_name --install ash --with phx.new --no-ecto ``` ## Patterns diff --git a/installer/lib/mix/tasks/igniter.new.ex b/installer/lib/mix/tasks/igniter.new.ex index 8721fe9..d2a6d0c 100644 --- a/installer/lib/mix/tasks/igniter.new.ex +++ b/installer/lib/mix/tasks/igniter.new.ex @@ -8,6 +8,7 @@ defmodule Mix.Tasks.Igniter.New do * `--install` - A comma-separated list of dependencies to install using `mix igniter.install` after creating the project. * `--example` - Request example code to be added to the project when installing packages. + * `--with` - The command to use instead of `new`, i.e `phx.new` """ @shortdoc "Creates a new Igniter application" use Mix.Task @@ -15,11 +16,20 @@ defmodule Mix.Tasks.Igniter.New do @igniter_version Mix.Project.config()[:version] @impl Mix.Task - def run([name | _ ] = argv) do - {options, argv, _errors} = OptionParser.parse(argv, - strict: [install: :keep, local: :string, example: :boolean], - aliases: [i: :install, l: :local, e: :example] - ) + def run([name | _] = argv) do + {options, argv, _errors} = + OptionParser.parse(argv, + strict: [install: :keep, local: :string, example: :boolean, with: :string], + aliases: [i: :install, l: :local, e: :example, w: :with] + ) + + install_with = options[:with] || "new" + + unless install_with in ["phx.new", "new"] do + if String.match?(install_with, ~r/\s/) do + raise ArgumentError, "The --with option must not contain any spaces, got: #{install_with}" + end + end install = options[:install] @@ -38,49 +48,48 @@ defmodule Mix.Tasks.Igniter.New do exit({:shutdown, 1}) end - exit = Mix.shell().cmd("mix new #{Enum.join(argv, " ")}") + Mix.Task.run(install_with, argv) - if exit == 0 do - version_requirement = - if options[:local] do - local = Path.join(["..", Path.relative_to_cwd(options[:local])]) - "path: #{inspect(local)}, override: true" - else - inspect(version_requirement()) + version_requirement = + if options[:local] do + local = Path.join(["..", Path.relative_to_cwd(options[:local])]) + "path: #{inspect(local)}, override: true" + else + inspect(version_requirement()) + end + + File.cd!(name) + + contents = + "mix.exs" + |> File.read!() + + if String.contains?(contents, "{:igniter") do + Mix.shell().info( + "It looks like the project already exists and igniter is already installed, not adding it to deps." + ) + else + # the spaces are required here to avoid the need for a format + new_contents = + String.replace( + contents, + "defp deps do\n [\n", + "defp deps do\n [\n {:igniter, #{version_requirement}},\n" + ) + + File.write!("mix.exs", new_contents) + end + + unless Enum.empty?(install) do + Mix.shell().cmd("mix deps.get") + Mix.shell().cmd("mix compile") + + example = + if options[:example] do + "--example" end - File.cd!(name) - - contents = - "mix.exs" - |> File.read!() - - if String.contains?(contents, "{:igniter") do - Mix.shell().info("It looks like the project already exists and igniter is already installed, not adding it to deps.") - else - # the spaces are required here to avoid the need for a format - new_contents = - String.replace(contents, "defp deps do\n [\n", "defp deps do\n [\n {:igniter, #{version_requirement}}\n") - - File.write!("mix.exs", new_contents) - end - - unless Enum.empty?(install) do - Mix.shell().cmd("mix deps.get") - Mix.shell().cmd("mix compile") - - example = - if options[:example] do - "--example" - end - - Mix.shell().cmd("mix igniter.install #{Enum.join(install, ",")} --yes #{example}") - end - - else - Mix.shell().info("Aborting command because associated `mix new` command failed.") - - exit({:shutdown, 1}) + Mix.shell().cmd("mix igniter.install #{Enum.join(install, ",")} --yes #{example}") end :ok