diff --git a/lib/ash_hq/docs/resources/dsl/dsl.ex b/lib/ash_hq/docs/resources/dsl/dsl.ex index 2c33f8b4..0fe7be37 100644 --- a/lib/ash_hq/docs/resources/dsl/dsl.ex +++ b/lib/ash_hq/docs/resources/dsl/dsl.ex @@ -21,8 +21,6 @@ defmodule AshHq.Docs.Dsl do doc_attribute :doc load_for_search [ - :extension_name, - :extension_target, :extension_module, :library_name ] @@ -137,9 +135,7 @@ defmodule AshHq.Docs.Dsl do calculations do calculate :extension_type, :string, expr(extension.type) calculate :extension_order, :integer, expr(extension.order) - calculate :extension_name, :string, expr(extension.name) calculate :extension_module, :string, expr(extension.module) - calculate :extension_target, :string, expr(extension.target) calculate :version_name, :string, expr(library_version.version) calculate :library_name, :string, expr(library_version.library.name) calculate :library_id, :string, expr(library_version.library.id) diff --git a/lib/ash_hq/docs/resources/extension/extension.ex b/lib/ash_hq/docs/resources/extension/extension.ex index 61df9e81..ede7933f 100644 --- a/lib/ash_hq/docs/resources/extension/extension.ex +++ b/lib/ash_hq/docs/resources/extension/extension.ex @@ -2,8 +2,7 @@ defmodule AshHq.Docs.Extension do @moduledoc false use Ash.Resource, - data_layer: AshSqlite.DataLayer, - extensions: [AshHq.Docs.Extensions.Search, AshHq.Docs.Extensions.RenderMarkdown] + data_layer: AshSqlite.DataLayer sqlite do table "extensions" @@ -14,15 +13,6 @@ defmodule AshHq.Docs.Extension do end end - search do - doc_attribute :doc - load_for_search library_version: [:library_display_name, :library_name] - end - - render_markdown do - render_attributes doc: :doc_html - end - actions do defaults [:update, :destroy] @@ -52,35 +42,6 @@ defmodule AshHq.Docs.Extension do attributes do uuid_primary_key :id - attribute :name, :string do - allow_nil? false - end - - attribute :target, :string - - attribute :default_for_target, :boolean do - default false - end - - attribute :doc, :string do - allow_nil? false - constraints trim?: false, allow_empty?: true - default "" - end - - attribute :doc_html, :string do - constraints trim?: false, allow_empty?: true - writable? false - end - - attribute :type, :string do - allow_nil? false - end - - attribute :order, :integer do - allow_nil? false - end - attribute :module, :string timestamps() @@ -104,8 +65,4 @@ defmodule AshHq.Docs.Extension do resource do description "An Ash DSL extension." end - - identities do - identity :unique_name_by_library_version, [:name, :library_version_id] - end end diff --git a/lib/ash_hq/docs/resources/option/option.ex b/lib/ash_hq/docs/resources/option/option.ex index 31f2809b..cdeb8d86 100644 --- a/lib/ash_hq/docs/resources/option/option.ex +++ b/lib/ash_hq/docs/resources/option/option.ex @@ -19,9 +19,7 @@ defmodule AshHq.Docs.Option do doc_attribute :doc load_for_search [ - :extension_name, :extension_module, - :extension_target, :library_name ] @@ -126,9 +124,7 @@ defmodule AshHq.Docs.Option do calculations do calculate :extension_type, :string, expr(dsl.extension.type) - calculate :extension_name, :string, expr(dsl.extension.name) calculate :extension_order, :integer, expr(dsl.extension.order) - calculate :extension_target, :string, expr(dsl.extension.target) calculate :extension_module, :string, expr(dsl.extension.module) calculate :version_name, :string, expr(library_version.version) calculate :library_name, :string, expr(library_version.library.name) diff --git a/lib/ash_hq_web/controllers/dsl_redirect_controller.ex b/lib/ash_hq_web/controllers/dsl_redirect_controller.ex deleted file mode 100644 index e885a4e8..00000000 --- a/lib/ash_hq_web/controllers/dsl_redirect_controller.ex +++ /dev/null @@ -1,19 +0,0 @@ -defmodule AshHqWeb.DslRedirectController do - use AshHqWeb, :controller - - def show(conn, %{"library" => library, "extension" => extension_name, "dsl_path" => dsl_path}) do - library = AshHq.Docs.Library.by_name!(library, load: [latest_library_version: :extensions]) - - extension = - library.latest_library_version.extensions - |> Enum.find(fn extension -> - AshHqWeb.DocRoutes.sanitize_name(extension.module) == extension_name || - AshHqWeb.DocRoutes.sanitize_name(extension.name) == extension_name - end) - |> Kernel.||(raise Ash.Error.Query.NotFound) - - target = AshHqWeb.DocRoutes.sanitize_name(extension.target) - - redirect(conn, to: "/docs/dsl/#{target}##{Enum.join(dsl_path, "-")}") - end -end diff --git a/lib/ash_hq_web/router.ex b/lib/ash_hq_web/router.ex index 4af7d2a5..38e27a12 100644 --- a/lib/ash_hq_web/router.ex +++ b/lib/ash_hq_web/router.ex @@ -66,8 +66,6 @@ defmodule AshHqWeb.Router do live("/forum/:channel", AppViewLive, :forum) live("/forum/:channel/:id", AppViewLive, :forum) - get("/docs/dsl/:library/:version/:extension/*dsl_path", DslRedirectController, :show) - get("/unsubscribe", MailingListController, :unsubscribe) end diff --git a/mix.lock b/mix.lock index fc71ea62..43558278 100644 --- a/mix.lock +++ b/mix.lock @@ -4,7 +4,7 @@ "appsignal": {:hex, :appsignal, "2.7.9", "efc11601a848f153752778356bc86f9af03e925f15a961f714cd702a83cee434", [:make, :mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:decorator, "~> 1.2.3 or ~> 1.3", [hex: :decorator, repo: "hexpm", optional: false]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:poison, ">= 1.3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "84fff1dcba3d3fcf542c528ffb0f4eba891da0f68125fcf57e9b30d1a1a4a6e9"}, "appsignal_phoenix": {:hex, :appsignal_phoenix, "2.3.4", "c83a8e15a51456db7d722a21bfe9a45e23618b550219caa8fb6d4853f61b5734", [:mix], [{:appsignal, ">= 2.7.6 and < 3.0.0", [hex: :appsignal, repo: "hexpm", optional: false]}, {:appsignal_plug, ">= 2.0.15 and < 3.0.0", [hex: :appsignal_plug, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.11 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_live_view, "~> 0.9", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1ca040fbfa653bdda25735031d8b89c81ebb50c475bc35d5ac0e13236e5f6600"}, "appsignal_plug": {:hex, :appsignal_plug, "2.0.15", "758a8a78944878e8461bbc77ca86219121a56f4299c6d79940ab083cf9afea00", [:mix], [{:appsignal, ">= 2.7.6 and < 3.0.0", [hex: :appsignal, repo: "hexpm", optional: false]}, {:plug, ">= 1.1.0", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1c6059049e2081e808aaef04e2b9917e06277f61a35a0e103db860d08cbc41f1"}, - "ash": {:git, "https://github.com/ash-project/ash.git", "8ce6e065ce7f37cbd0c15a9054502059215571ad", []}, + "ash": {:git, "https://github.com/ash-project/ash.git", "6c5cd551ff16f01a707cbd49c689899b9366aa8b", []}, "ash_admin": {:git, "https://github.com/ash-project/ash_admin.git", "3002af9ec69dc475582ef5f445064e4594bf45ac", []}, "ash_appsignal": {:hex, :ash_appsignal, "0.1.2", "a6eb1927a13c11006aad0d9ffaa011143344dd04c9b07ab94f459498b8ddc6d4", [:mix], [{:appsignal, "~> 2.0", [hex: :appsignal, repo: "hexpm", optional: false]}, {:ash, ">= 2.14.14", [hex: :ash, repo: "hexpm", optional: false]}], "hexpm", "dae3158337d2a36b76f04519ebe6d08ef5296823831993cef6069eeb879c5b94"}, "ash_authentication": {:hex, :ash_authentication, "3.11.15", "7834446cdd13bb471bded630aa0e0e4fb8795ffffe0c294dc22448d3778ff035", [:mix], [{:ash, ">= 2.5.11 and < 3.0.0-0", [hex: :ash, repo: "hexpm", optional: false]}, {:assent, "~> 0.2", [hex: :assent, repo: "hexpm", optional: false]}, {:bcrypt_elixir, "~> 3.0", [hex: :bcrypt_elixir, repo: "hexpm", optional: false]}, {:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:finch, "~> 0.16.0", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:joken, "~> 2.5", [hex: :joken, repo: "hexpm", optional: false]}, {:plug, "~> 1.13", [hex: :plug, repo: "hexpm", optional: false]}, {:spark, ">= 1.1.39 and < 2.0.0-0", [hex: :spark, repo: "hexpm", optional: false]}], "hexpm", "931926d8dd3fc5ac54a354d69aad6aed30438977d7971bf3fdfae4c563557d21"}, @@ -15,8 +15,8 @@ "ash_json_api": {:git, "https://github.com/ash-project/ash_json_api.git", "31ece4fad9920c7e45c600d38ac82218296c4612", []}, "ash_oban": {:git, "https://github.com/ash-project/ash_oban.git", "36a441f78195f4f4e656f6a0cf268084704ff174", []}, "ash_phoenix": {:git, "https://github.com/ash-project/ash_phoenix.git", "35e4d2931e1664383c9a085a90f846e58986c8c8", []}, - "ash_postgres": {:git, "https://github.com/ash-project/ash_postgres.git", "54908395ebcd8e9a5f8e7e30c1cee3f57e233448", []}, - "ash_sqlite": {:git, "https://github.com/ash-project/ash_sqlite.git", "55bdce140f7ba9df9479923de2ab276be3e28588", []}, + "ash_postgres": {:git, "https://github.com/ash-project/ash_postgres.git", "40c1a13652dc65406692ffbcaf6d78d1d8aa07c4", []}, + "ash_sqlite": {:git, "https://github.com/ash-project/ash_sqlite.git", "75ffda1076a81cf1793fe0a170c1df73021e83c9", []}, "assent": {:hex, :assent, "0.2.7", "aa68f68e577077c091ce722bff8fe1ae56b95b274bb8107f7a5406cc15a65da7", [:mix], [{:certifi, ">= 0.0.0", [hex: :certifi, repo: "hexpm", optional: true]}, {:finch, "~> 0.15", [hex: :finch, repo: "hexpm", optional: true]}, {:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: true]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:ssl_verify_fun, ">= 0.0.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: true]}], "hexpm", "08106af439de4f9de114c0334de4c848de7cfbe53a5a52d342a784c4f6bc86f3"}, "bcrypt_elixir": {:hex, :bcrypt_elixir, "3.1.0", "0b110a9a6c619b19a7f73fa3004aa11d6e719a67e672d1633dc36b6b2290a0f7", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "2ad2acb5a8bc049e8d5aa267802631912bb80d5f4110a178ae7999e69dca1bf7"}, "bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"}, diff --git a/priv/resource_snapshots/sqlite_repo/extensions/20240112161922.json b/priv/resource_snapshots/sqlite_repo/extensions/20240112161922.json new file mode 100644 index 00000000..49cd5d95 --- /dev/null +++ b/priv/resource_snapshots/sqlite_repo/extensions/20240112161922.json @@ -0,0 +1,112 @@ +{ + "attributes": [ + { + "default": "nil", + "size": null, + "type": "text", + "source": "sanitized_name", + "references": null, + "allow_nil?": false, + "primary_key?": false, + "generated?": false + }, + { + "default": "nil", + "size": null, + "type": "uuid", + "source": "id", + "references": null, + "allow_nil?": false, + "primary_key?": true, + "generated?": false + }, + { + "default": "nil", + "size": null, + "type": "text", + "source": "doc", + "references": null, + "allow_nil?": false, + "primary_key?": false, + "generated?": false + }, + { + "default": "nil", + "size": null, + "type": "text", + "source": "doc_html", + "references": null, + "allow_nil?": true, + "primary_key?": false, + "generated?": false + }, + { + "default": "nil", + "size": null, + "type": "text", + "source": "module", + "references": null, + "allow_nil?": true, + "primary_key?": false, + "generated?": false + }, + { + "default": "nil", + "size": null, + "type": "utc_datetime_usec", + "source": "inserted_at", + "references": null, + "allow_nil?": false, + "primary_key?": false, + "generated?": false + }, + { + "default": "nil", + "size": null, + "type": "utc_datetime_usec", + "source": "updated_at", + "references": null, + "allow_nil?": false, + "primary_key?": false, + "generated?": false + }, + { + "default": "nil", + "size": null, + "type": "uuid", + "source": "library_version_id", + "references": { + "name": "extensions_library_version_id_fkey", + "table": "library_versions", + "multitenancy": { + "global": null, + "strategy": null, + "attribute": null + }, + "destination_attribute": "id", + "primary_key?": true, + "deferrable": false, + "destination_attribute_default": null, + "destination_attribute_generated": null, + "on_delete": "delete", + "on_update": null + }, + "allow_nil?": true, + "primary_key?": false, + "generated?": false + } + ], + "table": "extensions", + "hash": "D5A8C840F686B00B4BBF777766E090ABF33DF738E31C4B55C9A74021F6DE5F93", + "repo": "Elixir.AshHq.SqliteRepo", + "custom_indexes": [], + "custom_statements": [], + "multitenancy": { + "global": null, + "strategy": null, + "attribute": null + }, + "identities": [], + "base_filter": null, + "has_create_action": true +} \ No newline at end of file diff --git a/priv/resource_snapshots/sqlite_repo/extensions/20240112164605.json b/priv/resource_snapshots/sqlite_repo/extensions/20240112164605.json new file mode 100644 index 00000000..3465bc97 --- /dev/null +++ b/priv/resource_snapshots/sqlite_repo/extensions/20240112164605.json @@ -0,0 +1,102 @@ +{ + "attributes": [ + { + "default": "nil", + "size": null, + "type": "text", + "source": "sanitized_name", + "references": null, + "allow_nil?": false, + "generated?": false, + "primary_key?": false + }, + { + "default": "nil", + "size": null, + "type": "uuid", + "source": "id", + "references": null, + "allow_nil?": false, + "generated?": false, + "primary_key?": true + }, + { + "default": "nil", + "size": null, + "type": "text", + "source": "doc", + "references": null, + "allow_nil?": false, + "generated?": false, + "primary_key?": false + }, + { + "default": "nil", + "size": null, + "type": "text", + "source": "module", + "references": null, + "allow_nil?": true, + "generated?": false, + "primary_key?": false + }, + { + "default": "nil", + "size": null, + "type": "utc_datetime_usec", + "source": "inserted_at", + "references": null, + "allow_nil?": false, + "generated?": false, + "primary_key?": false + }, + { + "default": "nil", + "size": null, + "type": "utc_datetime_usec", + "source": "updated_at", + "references": null, + "allow_nil?": false, + "generated?": false, + "primary_key?": false + }, + { + "default": "nil", + "size": null, + "type": "uuid", + "source": "library_version_id", + "references": { + "name": "extensions_library_version_id_fkey", + "table": "library_versions", + "on_delete": "delete", + "destination_attribute": "id", + "on_update": null, + "primary_key?": true, + "multitenancy": { + "global": null, + "attribute": null, + "strategy": null + }, + "deferrable": false, + "destination_attribute_default": null, + "destination_attribute_generated": null + }, + "allow_nil?": true, + "generated?": false, + "primary_key?": false + } + ], + "table": "extensions", + "hash": "434F994CE5D27E22BB6C339D676EE91C369BF6EB4A229A3572FB0E63F9C1D585", + "repo": "Elixir.AshHq.SqliteRepo", + "identities": [], + "multitenancy": { + "global": null, + "attribute": null, + "strategy": null + }, + "custom_indexes": [], + "base_filter": null, + "custom_statements": [], + "has_create_action": true +} \ No newline at end of file diff --git a/priv/resource_snapshots/sqlite_repo/extensions/20240112165439.json b/priv/resource_snapshots/sqlite_repo/extensions/20240112165439.json new file mode 100644 index 00000000..850a23d1 --- /dev/null +++ b/priv/resource_snapshots/sqlite_repo/extensions/20240112165439.json @@ -0,0 +1,82 @@ +{ + "attributes": [ + { + "default": "nil", + "size": null, + "type": "uuid", + "source": "id", + "references": null, + "allow_nil?": false, + "generated?": false, + "primary_key?": true + }, + { + "default": "nil", + "size": null, + "type": "text", + "source": "module", + "references": null, + "allow_nil?": true, + "generated?": false, + "primary_key?": false + }, + { + "default": "nil", + "size": null, + "type": "utc_datetime_usec", + "source": "inserted_at", + "references": null, + "allow_nil?": false, + "generated?": false, + "primary_key?": false + }, + { + "default": "nil", + "size": null, + "type": "utc_datetime_usec", + "source": "updated_at", + "references": null, + "allow_nil?": false, + "generated?": false, + "primary_key?": false + }, + { + "default": "nil", + "size": null, + "type": "uuid", + "source": "library_version_id", + "references": { + "name": "extensions_library_version_id_fkey", + "table": "library_versions", + "multitenancy": { + "global": null, + "strategy": null, + "attribute": null + }, + "on_delete": "delete", + "on_update": null, + "deferrable": false, + "destination_attribute": "id", + "primary_key?": true, + "destination_attribute_default": null, + "destination_attribute_generated": null + }, + "allow_nil?": true, + "generated?": false, + "primary_key?": false + } + ], + "table": "extensions", + "hash": "1AC8484F12B89285D069CA667A143EAEAE254A3242DF31B11951A459DCC23E10", + "repo": "Elixir.AshHq.SqliteRepo", + "multitenancy": { + "global": null, + "strategy": null, + "attribute": null + }, + "base_filter": null, + "identities": [], + "custom_indexes": [], + "custom_statements": [], + "has_create_action": true +} \ No newline at end of file diff --git a/priv/scripts/build_dsl_docs.exs b/priv/scripts/build_dsl_docs.exs index 4bcfa4e6..87de2b20 100644 --- a/priv/scripts/build_dsl_docs.exs +++ b/priv/scripts/build_dsl_docs.exs @@ -104,16 +104,11 @@ defmodule Utils do default end - def build(extension, all_extensions, order) do + def build(extension, all_extensions, _order) do %{ - name: extension.name, - target: extension[:target], - module: inspect(extension.module), - default_for_target: extension[:default_for_target?] || false, - type: extension[:type], - order: order, - doc: module_docs(extension.module) || "No documentation", - dsls: build_sections(extension.module.sections(), extension.module, all_extensions) + module: inspect(extension), + doc: module_docs(extension) || "No documentation", + dsls: build_sections(extension.sections(), extension, all_extensions) } end @@ -126,13 +121,13 @@ defmodule Utils do entities = all_extensions |> Enum.flat_map(fn extension -> - extension.module.dsl_patches() + extension.dsl_patches() |> Enum.filter(&match?(%Spark.Dsl.Patch.AddEntity{section_path: ^section_path}, &1)) |> Enum.map(fn %{entity: entity} -> - if extension.module == this_extension_module do + if extension == this_extension_module do entity else - Map.put(entity, :__requires_extension__, inspect(extension.module)) + Map.put(entity, :__requires_extension__, inspect(extension)) end end) end) @@ -741,19 +736,21 @@ acc = %{ mix_tasks: [] } -extensions = - mix_project.project[:docs][:spark][:extensions] || mix_project.project[:docs][:spark_extensions] - {:ok, all_modules} = name |> String.to_atom() |> :application.get_key(:modules) +extensions = + Enum.filter(all_modules, fn module -> + Spark.implements_behaviour?(module, Spark.Dsl.Extension) + end) + all_modules = all_modules |> Kernel.||([]) |> Enum.reject(fn module -> - Enum.find(extensions || [], &(&1.module == module)) + Enum.find(extensions || [], &(&1 == module)) end) all_modules = diff --git a/priv/sqlite_repo/migrations/20240112161922_migrate_resources2.exs b/priv/sqlite_repo/migrations/20240112161922_migrate_resources2.exs new file mode 100644 index 00000000..27b81f2d --- /dev/null +++ b/priv/sqlite_repo/migrations/20240112161922_migrate_resources2.exs @@ -0,0 +1,38 @@ +defmodule AshHq.SqliteRepo.Migrations.MigrateResources2 do + @moduledoc """ + Updates resources based on their most recent snapshots. + + This file was autogenerated with `mix ash_sqlite.generate_migrations` + """ + + use Ecto.Migration + + def up do + drop_if_exists unique_index(:extensions, [:library_version_id, :name], + name: "extensions_unique_name_by_library_version_index" + ) + + alter table(:extensions) do + remove :order + remove :type + remove :default_for_target + remove :target + remove :name + end + + end + + def down do + create unique_index(:extensions, [:library_version_id, :name], + name: "extensions_unique_name_by_library_version_index" + ) + + alter table(:extensions) do + add :name, :text, null: false + add :target, :text + add :default_for_target, :boolean + add :type, :text, null: false + add :order, :bigint, null: false + end + end +end diff --git a/priv/sqlite_repo/migrations/20240112164605_migrate_resources3.exs b/priv/sqlite_repo/migrations/20240112164605_migrate_resources3.exs new file mode 100644 index 00000000..1d654db7 --- /dev/null +++ b/priv/sqlite_repo/migrations/20240112164605_migrate_resources3.exs @@ -0,0 +1,21 @@ +defmodule AshHq.SqliteRepo.Migrations.MigrateResources3 do + @moduledoc """ + Updates resources based on their most recent snapshots. + + This file was autogenerated with `mix ash_sqlite.generate_migrations` + """ + + use Ecto.Migration + + def up do + alter table(:extensions) do + remove :doc_html + end + end + + def down do + alter table(:extensions) do + add :doc_html, :text + end + end +end diff --git a/priv/sqlite_repo/migrations/20240112165439_remove_extension_fields.exs b/priv/sqlite_repo/migrations/20240112165439_remove_extension_fields.exs new file mode 100644 index 00000000..2ccc3308 --- /dev/null +++ b/priv/sqlite_repo/migrations/20240112165439_remove_extension_fields.exs @@ -0,0 +1,24 @@ +defmodule AshHq.SqliteRepo.Migrations.RemoveExtensionFields do + @moduledoc """ + Updates resources based on their most recent snapshots. + + This file was autogenerated with `mix ash_sqlite.generate_migrations` + """ + + use Ecto.Migration + + def up do + alter table(:extensions) do + remove :doc + remove :sanitized_name + end + + end + + def down do + alter table(:extensions) do + add :sanitized_name, :text, null: false + add :doc, :text, null: false + end + end +end