Skip to content

Commit

Permalink
improvement: support --with option in igniter.new
Browse files Browse the repository at this point in the history
  • Loading branch information
zachdaniel committed Jun 20, 2024
1 parent 62ddc0b commit e9bf1ec
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 48 deletions.
2 changes: 1 addition & 1 deletion .formatter.exs
Original file line number Diff line number Diff line change
@@ -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
Expand Down
14 changes: 10 additions & 4 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -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
14 changes: 11 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
89 changes: 49 additions & 40 deletions installer/lib/mix/tasks/igniter.new.ex
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,28 @@ 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

@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]
Expand All @@ -38,49 +48,48 @@ defmodule Mix.Tasks.Igniter.New do
exit({:shutdown, 1})
end

exit = Mix.shell().cmd("mix new #{Enum.join(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())
end
Mix.Task.run(install_with, argv)

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.")
version_requirement =
if options[:local] do
local = Path.join(["..", Path.relative_to_cwd(options[:local])])
"path: #{inspect(local)}, override: true"
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)
inspect(version_requirement())
end

unless Enum.empty?(install) do
Mix.shell().cmd("mix deps.get")
Mix.shell().cmd("mix compile")
File.cd!(name)

example =
if options[:example] do
"--example"
end

Mix.shell().cmd("mix igniter.install #{Enum.join(install, ",")} --yes #{example}")
end
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
Mix.shell().info("Aborting command because associated `mix new` command failed.")
# 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

exit({:shutdown, 1})
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

:ok
Expand Down

0 comments on commit e9bf1ec

Please sign in to comment.