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
Current section
409 Versions
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…