Packages

ash_postgres

2.6.29
2.10.0 2.9.1 2.9.0 2.8.0 2.7.0 2.6.32 2.6.31 2.6.30 2.6.29 2.6.28 2.6.27 2.6.26 2.6.25 2.6.24 2.6.23 2.6.22 2.6.21 2.6.20 2.6.19 2.6.18 2.6.17 2.6.16 2.6.15 2.6.14 2.6.13 2.6.12 2.6.11 2.6.10 2.6.9 2.6.8 2.6.7 2.6.6 2.6.5 2.6.4 2.6.3 2.6.2 2.6.1 2.6.0 2.5.22 2.5.21 2.5.20 2.5.19 2.5.18 2.5.17 2.5.16 2.5.15 2.5.14 2.5.13 2.5.12 2.5.11 2.5.10 2.5.9 2.5.8 2.5.7 2.5.6 2.5.5 2.5.4 2.5.3 2.5.2 2.5.1 2.5.0 2.4.21 2.4.20 2.4.19 2.4.18 2.4.17 2.4.16 2.4.15 2.4.14 2.4.13 2.4.12 2.4.11 2.4.10 2.4.9 2.4.8 2.4.7 2.4.6 2.4.5 2.4.4 2.4.3 2.4.2 2.4.1 2.4.0 2.3.1 2.3.0 2.2.5 2.2.4 2.2.3 2.2.2 2.2.1 2.2.0 2.1.19 2.1.18 2.1.17 2.1.15 2.1.14 2.1.13 2.1.12 2.1.11 2.1.10 2.1.9 2.1.8 2.1.6 2.1.5 2.1.4 2.1.3 2.1.2 2.1.1 2.1.0 2.0.12 2.0.11 2.0.10 2.0.9 2.0.8 2.0.7 2.0.6 2.0.5 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 2.0.0-rc.15 2.0.0-rc.14 2.0.0-rc.13 2.0.0-rc.12 2.0.0-rc.11 2.0.0-rc.10 2.0.0-rc.9 2.0.0-rc.8 2.0.0-rc.7 2.0.0-rc.6 2.0.0-rc.5 2.0.0-rc.4 2.0.0-rc.3 2.0.0-rc.2 2.0.0-rc.1 2.0.0-rc.0 1.5.30 1.5.29 1.5.28 1.5.27 1.5.26 1.5.25 1.5.24 1.5.23 1.5.22 1.5.21 1.5.20 1.5.19 1.5.18 1.5.17 1.5.16 1.5.15 1.5.14 1.5.13 1.5.12 1.5.11 1.5.10 1.5.9 1.5.8 1.5.7 1.5.6 1.5.5 1.5.4 1.5.3 1.5.2 1.5.1 1.5.0 1.4.0 1.3.68 1.3.67 1.3.66 1.3.65 1.3.64 1.3.63 1.3.62 1.3.61 1.3.60 1.3.59 1.3.58 1.3.56 1.3.55 1.3.54 1.3.53 1.3.52 1.3.51 1.3.50 1.3.49 1.3.48 1.3.47 1.3.46 1.3.45 1.3.44 1.3.43 1.3.42 1.3.41 1.3.40 1.3.39 1.3.38 1.3.37 1.3.36 1.3.35 1.3.34 1.3.33 1.3.32 1.3.31 1.3.30 1.3.29 1.3.28 1.3.26 1.3.25 1.3.24 1.3.23 1.3.22 1.3.21 1.3.20 1.3.19 1.3.18 1.3.17 1.3.16 1.3.15 1.3.14 1.3.12 1.3.11 1.3.10 1.3.9 1.3.8 1.3.6 1.3.5 1.3.4 1.3.3 1.3.2 1.3.1 1.3.0 1.3.0-rc.4 1.3.0-rc.3 1.3.0-rc.2 1.3.0-rc.0 1.2.6 1.2.5 1.2.4 1.2.3 1.2.2 1.2.1 1.2.0 1.2.0-rc.1 1.2.0-rc.0 1.1.3 1.1.2 1.1.1 1.1.0 1.0.0 1.0.0-rc.9 1.0.0-rc.8 1.0.0-rc.7 1.0.0-rc.6 1.0.0-rc.5 1.0.0-rc.4 1.0.0-rc.3 1.0.0-rc.2 1.0.0-rc.1 1.0.0-rc.0 1.0.0-pre.3 1.0.0-pre.2 1.0.0-pre.1 1.0.0-pre.0 0.43.0 0.42.0-rc.7 0.42.0-rc.6 0.42.0-rc.5 0.42.0-rc.4 0.42.0-rc.3 0.42.0-rc.1 0.42.0-rc.0 0.41.7 0.41.6 0.41.5 0.41.4 0.41.3 0.41.2 0.41.1 0.41.0-rc0 retired 0.41.0-rc.9 0.41.0-rc.8 0.41.0-rc.7 0.41.0-rc.6 0.41.0-rc.5 0.41.0-rc.4 0.41.0-rc.3 0.41.0-rc.2 0.41.0-rc.1 0.41.0-rc.0 0.40.11 0.40.10 0.40.9 0.40.8 0.40.7 0.40.6 0.40.5 0.40.4 0.40.3 0.40.2 0.40.1 0.40.0-rc5 0.40.0-rc4 0.40.0-rc3 0.40.0-rc2 0.40.0-rc1 0.39.0-rc0 0.38.11 0.38.10 0.38.9 0.38.8 0.38.7 0.38.6 0.38.5 0.38.4 0.38.3 0.38.2 0.38.1 0.38.0 0.37.8 0.37.7 0.37.6 0.37.5 0.37.4 0.37.3 0.37.2 0.37.1 0.37.0 0.36.5 0.36.4 0.36.3 0.36.2 0.36.1 0.36.0 0.35.5 0.35.4 0.35.3 0.35.1 0.34.5 0.34.4 0.34.3 0.34.2 0.34.1 0.34.0 0.33.1 0.33.0 0.32.2 0.32.1 0.32.0 0.31.1 0.30.1 0.29.6 0.29.5 0.29.4 0.29.3 0.29.2 0.29.1 0.28.1 0.28.0 0.27.0 0.26.2 0.26.1 0.26.0 0.25.5 0.25.4 0.25.3 0.25.2 0.25.1 0.25.0 0.24.0 0.23.2 0.23.1 0.23.0 0.22.1 0.22.0 0.21.0 0.20.1 0.20.0 0.19.0 0.18.0 0.17.0 0.16.1 0.15.0 0.14.0 0.13.0 0.12.1 0.12.0 0.11.2 0.10.0 0.9.0 0.8.0 0.7.0 0.6.0 0.5.0 0.4.0 0.3.0 0.2.1 0.2.0 0.1.4 0.1.3 0.1.2 0.1.1 0.1.1-rc.2 0.1.1-rc.1 0.1.1-rc.0 0.1.0

The PostgreSQL data layer for Ash Framework

Current section

Files

Jump to
ash_postgres lib mix tasks ash_postgres.gen.resources.ex
Raw

lib/mix/tasks/ash_postgres.gen.resources.ex

# SPDX-FileCopyrightText: 2019 ash_postgres contributors <https://github.com/ash-project/ash_postgres/graphs.contributors>
#
# SPDX-License-Identifier: MIT
if Code.ensure_loaded?(Igniter) do
defmodule Mix.Tasks.AshPostgres.Gen.Resources do
use Igniter.Mix.Task
@example "mix ash_postgres.gen.resources MyApp.MyDomain"
@shortdoc "Generates resources based on a database schema"
@moduledoc """
#{@shortdoc}
## Example
`#{@example}`
## Domain
The domain will be generated if it does not exist. If you aren't sure,
we suggest using something like `MyApp.App`.
## Options
- `repo`, `r` - The repo or repos to generate resources for, comma separated. Can be specified multiple times. Defaults to all repos.
- `tables`, `t` - Defaults to `public.*`. The tables to generate resources for, comma separated. Can be specified multiple times. See the section on tables for more.
- `skip-tables`, `s` - The tables to skip generating resources for, comma separated. Can be specified multiple times. See the section on tables for more. `schema_migrations` is always skipped.
- `snapshots-only` - Only generate snapshots for the generated resources, and not migrations.
- `extend`, `e` - Extension or extensions to apply to the generated resources. See `mix ash.patch.extend` for more.
- `yes`, `y` - Answer yes (or skip) to all questions.
- `default-actions` - Add default actions for each resource. Defaults to `true`.
- `public` - Mark all attributes and relationships as `public? true`. Defaults to `true`.
- `no-migrations` - Do not generate snapshots & migrations for the resources. Defaults to `false`.
- `skip-unknown` - Skip any attributes with types that we don't have a corresponding Elixir type for, and relationships that we can't assume the name of.
## Tables
When specifying tables to include with `--tables`, you can specify the table name, or the schema and table name separated by a period.
For example, `users` will generate resources for the `users` table in the `public` schema, but `accounts.users` will generate resources for the `users` table in the `accounts` schema.
To include all tables in a given schema, add a period only with no table name, i.e `schema.`, i.e `accounts.`.
When skipping tables with `--skip-tables`, the same rules apply, except that the `schema.` format is not supported.
"""
@impl Igniter.Mix.Task
def info(_argv, _parent) do
%Igniter.Mix.Task.Info{
positional: [:domain],
example: @example,
schema: [
repo: :keep,
yes: :boolean,
tables: :keep,
skip_tables: :keep,
default_actions: :boolean,
public: :boolean,
extend: :keep,
skip_unknown: :boolean,
migrations: :boolean,
snapshots_only: :boolean,
domain: :keep
],
aliases: [
t: :tables,
y: :boolean,
r: :repo,
e: :extend,
d: :domain,
s: :skip_tables
],
defaults: [
default_actions: true,
migrations: true,
public: true
]
}
end
@impl Igniter.Mix.Task
def igniter(igniter) do
Mix.Task.run("compile")
options = igniter.args.options
domain = igniter.args.positional.domain
domain = Igniter.Project.Module.parse(domain)
repos =
case options[:repo] do
[] ->
Mix.Project.config()[:app]
|> Application.get_env(:ecto_repos, [])
repos ->
repos
end
repos =
repos
|> List.wrap()
|> Enum.map(fn v ->
if is_binary(v) do
Igniter.Project.Module.parse(v)
else
v
end
end)
case repos do
[] ->
igniter
|> Igniter.add_warning("No ecto repos configured.")
repos ->
Mix.shell().info("Generating resources from #{inspect(repos)}")
prompt =
"""
Would you like to generate migrations for the current structure? (recommended)
If #{IO.ANSI.green()}yes#{IO.ANSI.reset()}:
We will generate migrations based on the generated resources.
You should then change your database name in your config, and
run `mix ash.setup`.
If you already have ecto migrations you'd like to use, run
this command with `--snapshots-only`, in which case only resource
snapshots will be generated.
#{IO.ANSI.green()}
Going forward, your resources will be the source of truth.#{IO.ANSI.reset()}
#{IO.ANSI.red()}
*WARNING*
If you run `mix ash.reset` after this command without updating
your config, you will be *deleting the database you just used to
generate these resources*!#{IO.ANSI.reset()}
If #{IO.ANSI.red()}no#{IO.ANSI.reset()}:
We will not generate any migrations. This means you have migrations already that
can get you from zero to the current starting point.
#{IO.ANSI.yellow()}
You will have to hand-write migrations from this point on.#{IO.ANSI.reset()}
"""
options =
cond do
options[:migrations] == false ->
Keyword.put(options, :no_migrations, true)
options[:migrations] || options[:yes] || Mix.shell().yes?(prompt) ->
Keyword.put(options, :no_migrations, false)
true ->
Keyword.put(options, :no_migrations, true)
end
migration_opts =
if options[:snapshots_only] do
["--snapshots-only"]
else
[]
end
igniter
|> Igniter.compose_task("ash.gen.domain", [inspect(domain), "--ignore-if-exists"])
|> AshPostgres.ResourceGenerator.generate(repos, domain, options)
|> then(fn igniter ->
if options[:no_migrations] do
igniter
else
Igniter.add_task(igniter, "ash_postgres.generate_migrations", [
"import_resources" | migration_opts
])
end
end)
end
end
end
else
defmodule Mix.Tasks.AshPostgres.Gen.Resources do
@example "mix ash_postgres.gen.resource MyApp.MyDomain"
@shortdoc "Generates resources based on a database schema"
@moduledoc """
#{@shortdoc}
## Example
`#{@example}`
"""
use Mix.Task
def run(_argv) do
Mix.shell().error("""
The task 'ash_postgres.gen.resources' requires igniter to be run.
Please install igniter and try again.
For more information, see: https://hexdocs.pm/igniter
""")
exit({:shutdown, 1})
end
end
end