Packages

ash_postgres

2.3.1
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

Security advisory: This version has known vulnerabilities. View advisories

Current section

409 Versions

Jump to

Compare versions

6 files changed
+66 additions
-40 deletions
  @@ -5,16 +5,19 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline
5 5
6 6 <!-- changelog -->
7 7
8 + ## [v2.3.1](https://github.com/ash-project/ash_postgres/compare/v2.3.0...v2.3.1) (2024-09-05)
9 +
10 + ### Improvements:
11 +
12 + - [`mix ash_postgres.gen.migrations`] better imported index names
13 +
14 + - [`mix ash_postgres.gen.migrations`] add `--extend` option, forwarded to generated resource
15 +
8 16 ## [v2.3.0](https://github.com/ash-project/ash_postgres/compare/v2.2.5...v2.3.0) (2024-09-05)
9 17
10 -
11 -
12 -
13 18 ### Features:
14 19
15 - * `mix ash_postgres.gen.resources`
16 -
17 - * `mix ash_postgres.gen.resources`
20 + - [`mix ash_postgres.gen.resources`] Add `mix ash_postgres.gen.resources` for importing tables from an existing database as resources
18 21
19 22 ## [v2.2.5](https://github.com/ash-project/ash_postgres/compare/v2.2.4...v2.2.5) (2024-09-04)
  @@ -1,7 +1,7 @@
1 1 {<<"links">>,
2 2 [{<<"GitHub">>,<<"https://github.com/ash-project/ash_postgres">>}]}.
3 3 {<<"name">>,<<"ash_postgres">>}.
4 - {<<"version">>,<<"2.3.0">>}.
4 + {<<"version">>,<<"2.3.1">>}.
5 5 {<<"description">>,<<"The PostgreSQL data layer for Ash Framework">>}.
6 6 {<<"elixir">>,<<"~> 1.13">>}.
7 7 {<<"app">>,<<"ash_postgres">>}.
  @@ -23,6 +23,7 @@ defmodule Mix.Tasks.AshPostgres.Gen.Resources do
23 23 - `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.
24 24 - `skip-tables`, `s` - The tables to skip generating resources for, comma separated. Can be specified multiple times. See the section on tables for more.
25 25 - `snapshots-only` - Only generate snapshots for the generated resources, and not migraitons.
26 + - `extend`, `e` - Extension or extensions to apply to the generated resources. See `mix ash.patch.extend` for more.
26 27 - `yes`, `y` - Answer yes (or skip) to all questions.
27 28
28 29 ## Tables
  @@ -45,6 +46,7 @@ defmodule Mix.Tasks.AshPostgres.Gen.Resources do
45 46 yes: :boolean,
46 47 tables: :keep,
47 48 skip_tables: :keep,
49 + extend: :keep,
48 50 snapshots_only: :boolean,
49 51 domain: :keep
50 52 ],
  @@ -52,6 +54,7 @@ defmodule Mix.Tasks.AshPostgres.Gen.Resources do
52 54 t: :tables,
53 55 y: :boolean,
54 56 r: :repo,
57 + e: :extend,
55 58 d: :domain,
56 59 s: :skip_tables
57 60 ]
  @@ -13,33 +13,7 @@ defmodule AshPostgres.ResourceGenerator do
13 13
14 14 igniter = Igniter.include_all_elixir_files(igniter)
15 15
16 - opts =
17 - if opts[:tables] do
18 - Keyword.put(
19 - opts,
20 - :tables,
21 - opts[:tables]
22 - |> List.wrap()
23 - |> Enum.join(",")
24 - |> String.split(",")
25 - )
26 - else
27 - opts
28 - end
29 -
30 - opts =
31 - if opts[:skip_tables] do
32 - Keyword.put(
33 - opts,
34 - :skip_tables,
35 - opts[:skip_tables]
36 - |> List.wrap()
37 - |> Enum.join(",")
38 - |> String.split(",")
39 - )
40 - else
41 - opts
42 - end
16 + opts = handle_csv_opts(opts, [:tables, :skip_tables, :extend])
43 17
44 18 specs =
45 19 repos
  @@ -47,6 +21,7 @@ defmodule AshPostgres.ResourceGenerator do
47 21 |> Enum.map(fn %{table_name: table} = spec ->
48 22 resource =
49 23 table
24 + |> Inflex.singularize()
50 25 |> Macro.camelize()
51 26 |> then(&Module.concat([domain, &1]))
52 27
  @@ -75,6 +50,23 @@ defmodule AshPostgres.ResourceGenerator do
75 50 end)
76 51 end
77 52
53 + defp handle_csv_opts(opts, keys) do
54 + Enum.reduce(keys, opts, fn key, opts ->
55 + opts
56 + |> Keyword.get_values(key)
57 + |> case do
58 + [] ->
59 + opts
60 +
61 + values ->
62 + values
63 + |> Enum.join(",")
64 + |> String.split(",", trim: true)
65 + |> then(&Keyword.put(opts, key, &1))
66 + end
67 + end)
68 + end
69 +
78 70 defp table_to_resource(
79 71 igniter,
80 72 %AshPostgres.ResourceGenerator.Spec{} = table_spec,
  @@ -113,6 +105,15 @@ defmodule AshPostgres.ResourceGenerator do
113 105 igniter
114 106 |> Ash.Domain.Igniter.add_resource_reference(domain, table_spec.resource)
115 107 |> Igniter.Code.Module.create_module(table_spec.resource, resource)
108 + |> then(fn igniter ->
109 + if opts[:extend] do
110 + Igniter.compose_task(igniter, "ash.patch.extend", [
111 + table_spec.resource | opts[:extend] || []
112 + ])
113 + else
114 + igniter
115 + end
116 + end)
116 117 end
117 118
118 119 defp check_constraints(%{check_constraints: _check_constraints}, true) do
  @@ -150,7 +151,7 @@ defmodule AshPostgres.ResourceGenerator do
150 151
151 152 indexes ->
152 153 """
153 - skip_unique_indexes [#{Enum.map_join(indexes, ",", &":#{&1.name}")}]
154 + skip_unique_indexes [#{Enum.map_join(indexes, ",", &":#{&1.identity_name}")}]
154 155 """
155 156 end
156 157 end
  @@ -167,7 +168,7 @@ defmodule AshPostgres.ResourceGenerator do
167 168 indexes ->
168 169 indexes
169 170 |> Enum.map_join(", ", fn index ->
170 - "#{index.name}: \"#{index.name}\""
171 + "#{index.identity_name}: \"#{index.name}\""
171 172 end)
172 173 |> then(&"identity_index_names [#{&1}]")
173 174 end
  @@ -179,7 +180,7 @@ defmodule AshPostgres.ResourceGenerator do
179 180 unique? && Enum.all?(columns, &Regex.match?(~r/^[0-9a-zA-Z_]+$/, &1))
180 181 end)
181 182 |> Enum.map(fn index ->
182 - name = index.name
183 + name = index.identity_name
183 184
184 185 fields = "[" <> Enum.map_join(index.columns, ", ", &":#{&1}") <> "]"
  @@ -48,7 +48,16 @@ defmodule AshPostgres.ResourceGenerator.Spec do
48 48
49 49 defmodule Index do
50 50 @moduledoc false
51 - defstruct [:name, :columns, :unique?, :nulls_distinct, :where_clause, :using, :include]
51 + defstruct [
52 + :name,
53 + :columns,
54 + :unique?,
55 + :nulls_distinct,
56 + :where_clause,
57 + :using,
58 + :include,
59 + :identity_name
60 + ]
52 61 end
53 62
54 63 defmodule CheckConstraint do
  @@ -196,7 +205,8 @@ defmodule AshPostgres.ResourceGenerator.Spec do
196 205 contype = 'c'
197 206 AND conrelid::regclass::text = $1
198 207 """,
199 - [spec.table_name]
208 + [spec.table_name],
209 + log: false
200 210 )
201 211
202 212 attribute = Enum.find(spec.attributes, & &1.primary_key?) || Enum.at(spec.attributes, 0)
  @@ -290,9 +300,18 @@ defmodule AshPostgres.ResourceGenerator.Spec do
290 300 nil
291 301 end
292 302
303 + identity_name =
304 + index_name
305 + |> String.trim_leading(spec.table_name <> "_")
306 + |> String.trim_leading("unique_")
307 + |> String.replace("_unique_", "_")
308 + |> String.trim_trailing("_index")
309 + |> String.replace("_index_", "_")
310 +
293 311 [
294 312 %Index{
295 313 name: index_name,
314 + identity_name: identity_name,
296 315 columns: Enum.uniq(columns),
297 316 unique?: is_unique,
298 317 include: include,
Loading more files…