improvement: speed up page load by not loading functions

This commit is contained in:
Zach Daniel 2022-09-29 12:56:07 -04:00
parent ec92ad0676
commit d84c23df6f
48 changed files with 1268 additions and 605 deletions

View file

@ -18,6 +18,7 @@
render_attributes: 1, render_attributes: 1,
use_path_for_name?: 1, use_path_for_name?: 1,
add_name_to_path?: 1, add_name_to_path?: 1,
item_type: 1,
sanitized_name_attribute: 1, sanitized_name_attribute: 1,
show_docs_on: 1, show_docs_on: 1,
header_ids?: 1 header_ids?: 1

View file

@ -88,6 +88,15 @@ defmodule AshHq.Docs.Search do
} }
end end
custom :mix_tasks, AshHq.Docs.Search.Steps.SearchResource do
input %{
query: arg(:query),
library_versions: arg(:library_versions),
types: arg(:types),
resource: AshHq.Docs.MixTask
}
end
custom :build_results, AshHq.Docs.Search.Steps.BuildResults do custom :build_results, AshHq.Docs.Search.Steps.BuildResults do
input %{ input %{
dsls: result(:dsls), dsls: result(:dsls),
@ -96,7 +105,8 @@ defmodule AshHq.Docs.Search do
library_versions: result(:library_versions), library_versions: result(:library_versions),
extensions: result(:extensions), extensions: result(:extensions),
functions: result(:functions), functions: result(:functions),
modules: result(:modules) modules: result(:modules),
mix_tasks: result(:mix_tasks)
} }
end end
end end

View file

@ -124,7 +124,8 @@ defmodule AshHq.Docs.Importer do
extensions: result[:extensions], extensions: result[:extensions],
doc: result[:doc], doc: result[:doc],
guides: add_text(result[:guides], library.name, version), guides: add_text(result[:guides], library.name, version),
modules: result[:modules] modules: result[:modules],
mix_tasks: result[:mix_tasks]
} }
) )
end) end)

View file

@ -10,6 +10,7 @@ defmodule AshHq.Docs.Registry do
entry AshHq.Docs.Guide entry AshHq.Docs.Guide
entry AshHq.Docs.Library entry AshHq.Docs.Library
entry AshHq.Docs.LibraryVersion entry AshHq.Docs.LibraryVersion
entry AshHq.Docs.MixTask
entry AshHq.Docs.Module entry AshHq.Docs.Module
entry AshHq.Docs.Option entry AshHq.Docs.Option
end end

View file

@ -64,6 +64,10 @@ defmodule AshHq.Docs.LibraryVersion do
allow_nil? false allow_nil? false
end end
argument :mix_tasks, {:array, :map} do
allow_nil? false
end
argument :extensions, {:array, :map} do argument :extensions, {:array, :map} do
allow_nil? false allow_nil? false
end end
@ -73,12 +77,16 @@ defmodule AshHq.Docs.LibraryVersion do
change {AshHq.Docs.Changes.AddArgToRelationship, change {AshHq.Docs.Changes.AddArgToRelationship,
attr: :id, arg: :library_version, rel: :modules, generate: &Ash.UUID.generate/0} attr: :id, arg: :library_version, rel: :modules, generate: &Ash.UUID.generate/0}
change {AshHq.Docs.Changes.AddArgToRelationship,
attr: :id, arg: :library_version, rel: :mix_tasks, generate: &Ash.UUID.generate/0}
change {AshHq.Docs.Changes.AddArgToRelationship, change {AshHq.Docs.Changes.AddArgToRelationship,
attr: :id, arg: :library_version, rel: :extensions, generate: &Ash.UUID.generate/0} attr: :id, arg: :library_version, rel: :extensions, generate: &Ash.UUID.generate/0}
change manage_relationship(:guides, type: :create) change manage_relationship(:guides, type: :create)
change manage_relationship(:library, type: :append_and_remove) change manage_relationship(:library, type: :append_and_remove)
change manage_relationship(:modules, type: :create) change manage_relationship(:modules, type: :create)
change manage_relationship(:mix_tasks, type: :create)
change manage_relationship(:extensions, type: :create) change manage_relationship(:extensions, type: :create)
end end
@ -126,5 +134,6 @@ defmodule AshHq.Docs.LibraryVersion do
has_many :extensions, AshHq.Docs.Extension has_many :extensions, AshHq.Docs.Extension
has_many :guides, AshHq.Docs.Guide has_many :guides, AshHq.Docs.Guide
has_many :modules, AshHq.Docs.Module has_many :modules, AshHq.Docs.Module
has_many :mix_tasks, AshHq.Docs.MixTask
end end
end end

View file

@ -0,0 +1,95 @@
defmodule AshHq.Docs.MixTask do
@moduledoc false
use AshHq.Resource,
data_layer: AshPostgres.DataLayer,
extensions: [AshHq.Docs.Extensions.Search, AshHq.Docs.Extensions.RenderMarkdown]
resource do
description "Represents a mix task that has been exposed by a library"
end
render_markdown do
render_attributes doc: :doc_html
end
search do
doc_attribute :doc
load_for_search [
:version_name,
:library_name,
:library_id
]
item_type "Mix Task"
type "Mix Tasks"
end
postgres do
table "mix_tasks"
repo AshHq.Repo
references do
reference :library_version, on_delete: :delete
end
end
attributes do
uuid_primary_key :id
attribute :name, :string do
allow_nil? false
end
attribute :category, :string do
allow_nil? false
default "Misc"
end
attribute :file, :string
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 :order, :integer do
allow_nil? false
end
end
actions do
defaults [:read, :update, :destroy]
create :create do
primary? true
argument :library_version, :uuid
change manage_relationship(:library_version, type: :append_and_remove)
end
end
code_interface do
define_for AshHq.Docs
end
aggregates do
first :version_name, :library_version, :version
first :library_name, [:library_version, :library], :name
first :library_id, [:library_version, :library], :id
end
relationships do
belongs_to :library_version, AshHq.Docs.LibraryVersion do
allow_nil? true
end
end
end

View file

@ -6,22 +6,57 @@ defmodule AshHqWeb.Components.DocSidebar do
alias Surface.Components.LivePatch alias Surface.Components.LivePatch
alias Phoenix.LiveView.JS alias Phoenix.LiveView.JS
prop(class, :css_class, default: "") prop class, :css_class, default: ""
prop(libraries, :list, required: true) prop libraries, :list, required: true
prop(extension, :any, default: nil) prop extension, :any, default: nil
prop(guide, :any, default: nil) prop guide, :any, default: nil
prop(library, :any, default: nil) prop library, :any, default: nil
prop(library_version, :any, default: nil) prop library_version, :any, default: nil
prop(selected_versions, :map, default: %{}) prop selected_versions, :map, default: %{}
prop(id, :string, required: true) prop id, :string, required: true
prop(dsl, :any, required: true) prop dsl, :any, required: true
prop(module, :any, required: true) prop module, :any, required: true
prop(add_version, :event, required: true) prop mix_task, :any, required: true
prop(remove_version, :event, required: true) prop add_version, :event, required: true
prop(change_version, :event, required: true) prop remove_version, :event, required: true
prop change_version, :event, required: true
data guides_by_category_and_library, :any
data extensions, :any
data modules_by_category, :any
data mix_tasks_by_category, :any
@spec render(any) :: Phoenix.LiveView.Rendered.t() @spec render(any) :: Phoenix.LiveView.Rendered.t()
def render(assigns) do def render(assigns) do
assigns =
assign(
assigns,
guides_by_category_and_library:
guides_by_category_and_library(
assigns[:libraries],
assigns[:library_version],
assigns[:selected_versions]
),
extensions:
get_extensions(
assigns[:libraries],
assigns[:library_versions],
assigns[:selected_versions]
),
modules_by_category:
modules_by_category(
assigns[:libraries],
assigns[:library_version],
assigns[:selected_versions]
),
mix_tasks_by_category:
mix_tasks_by_category(
assigns[:libraries],
assigns[:library_version],
assigns[:selected_versions]
)
)
~F""" ~F"""
<aside <aside
id={@id} id={@id}
@ -44,7 +79,7 @@ defmodule AshHqWeb.Components.DocSidebar do
<div> <div>
Guides Guides
</div> </div>
{#for {category, guides_by_library} <- guides_by_category_and_library(@libraries, @selected_versions)} {#for {category, guides_by_library} <- @guides_by_category_and_library}
<div class="text-base-light-500"> <div class="text-base-light-500">
<button <button
phx-click={collapse("#{@id}-#{String.replace(category, " ", "-")}")} phx-click={collapse("#{@id}-#{String.replace(category, " ", "-")}")}
@ -91,7 +126,7 @@ defmodule AshHqWeb.Components.DocSidebar do
Reference Reference
</div> </div>
<div class="ml-2 space-y-2"> <div class="ml-2 space-y-2">
{#if !Enum.empty?(get_extensions(@libraries, @selected_versions))} {#if !Enum.empty?(@extensions)}
<div class="text-base-light-500"> <div class="text-base-light-500">
<button phx-click={collapse("#{@id}-extension")} class="flex flex-row items-center"> <button phx-click={collapse("#{@id}-extension")} class="flex flex-row items-center">
<div id={"#{@id}-extension-chevron-down"}> <div id={"#{@id}-extension-chevron-down"}>
@ -105,7 +140,7 @@ defmodule AshHqWeb.Components.DocSidebar do
</div> </div>
{/if} {/if}
<div id={"#{@id}-extension"}> <div id={"#{@id}-extension"}>
{#for {library, extensions} <- get_extensions(@libraries, @selected_versions)} {#for {library, extensions} <- @extensions}
<li class="ml-3 text-base-light-200 p-1"> <li class="ml-3 text-base-light-200 p-1">
{library} {library}
<ul> <ul>
@ -128,6 +163,51 @@ defmodule AshHqWeb.Components.DocSidebar do
{/for} {/for}
</div> </div>
{#if !Enum.empty?(@mix_tasks_by_category)}
<div class="text-base-light-500">
<button phx-click={collapse("#{@id}-mix-tasks")} class="flex flex-row items-center">
<div id={"#{@id}-mix-tasks-chevron-down"}>
<Heroicons.Outline.ChevronDownIcon class="w-3 h-3 mr-1" />
</div>
<div id={"#{@id}-mix-tasks-chevron-right"} class="-rotate-90" style="display: none;">
<Heroicons.Outline.ChevronDownIcon class="w-3 h-3 mr-1" />
</div>
Mix Tasks
</button>
</div>
{/if}
<div id={"#{@id}-mix-tasks"}>
{#for {category, mix_tasks} <- @mix_tasks_by_category}
<div class="ml-4">
<span class="text-sm text-base-light-900 dark:text-base-dark-100">{category}</span>
</div>
{#for mix_task <- mix_tasks}
<li class="ml-4">
<LivePatch
to={DocRoutes.doc_link(mix_task, @selected_versions)}
class="flex items-center space-x-2 pt-1 text-base font-normal text-base-light-900 rounded-lg dark:text-base-dark-100 hover:bg-base-light-100 dark:hover:bg-base-light-700"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="w-4 h-4"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M6.75 7.5l3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0021 18V6a2.25 2.25 0 00-2.25-2.25H5.25A2.25 2.25 0 003 6v12a2.25 2.25 0 002.25 2.25z"
/>
</svg>
<span class="">{mix_task.name}</span>
</LivePatch>
</li>
{/for}
{/for}
</div>
<div class="text-base-light-500"> <div class="text-base-light-500">
<button phx-click={collapse("#{@id}-modules")} class="flex flex-row items-center"> <button phx-click={collapse("#{@id}-modules")} class="flex flex-row items-center">
<div id={"#{@id}-modules-chevron-down"}> <div id={"#{@id}-modules-chevron-down"}>
@ -140,7 +220,37 @@ defmodule AshHqWeb.Components.DocSidebar do
</button> </button>
</div> </div>
<div id={"#{@id}-modules"}> <div id={"#{@id}-modules"}>
{#for {category, modules} <- modules_by_category(@libraries, @selected_versions)} {#for {category, modules} <- @modules_by_category}
<div class="ml-4">
<span class="text-sm text-base-light-900 dark:text-base-dark-100">{category}</span>
</div>
{#for module <- modules}
<li class="ml-4">
<LivePatch
to={DocRoutes.doc_link(module, @selected_versions)}
class="flex items-center space-x-2 pt-1 text-base font-normal text-base-light-900 rounded-lg dark:text-base-dark-100 hover:bg-base-light-100 dark:hover:bg-base-light-700"
>
<Heroicons.Outline.CodeIcon class="h-4 w-4" />
<span class="">{module.name}</span>
</LivePatch>
</li>
{/for}
{/for}
</div>
<div class="text-base-light-500">
<button phx-click={collapse("#{@id}-modules")} class="flex flex-row items-center">
<div id={"#{@id}-modules-chevron-down"}>
<Heroicons.Outline.ChevronDownIcon class="w-3 h-3 mr-1" />
</div>
<div id={"#{@id}-modules-chevron-right"} class="-rotate-90" style="display: none;">
<Heroicons.Outline.ChevronDownIcon class="w-3 h-3 mr-1" />
</div>
Modules
</button>
</div>
<div id={"#{@id}-modules"}>
{#for {category, modules} <- @modules_by_category}
<div class="ml-4"> <div class="ml-4">
<span class="text-sm text-base-light-900 dark:text-base-dark-100">{category}</span> <span class="text-sm text-base-light-900 dark:text-base-dark-100">{category}</span>
</div> </div>
@ -236,9 +346,25 @@ defmodule AshHqWeb.Components.DocSidebar do
""" """
end end
defp selected_version(library, library_version, selected_versions) do
selected_version = selected_versions[library.id]
if library_version && library_version.library_id == library.id do
library_version
else
if selected_version == "latest" do
AshHqWeb.Helpers.latest_version(library)
else
if selected_version not in [nil, ""] do
Enum.find(library.versions, &(&1.id == selected_version))
end
end
end
end
@start_guides ["Tutorials", "Topics", "How To", "Misc"] @start_guides ["Tutorials", "Topics", "How To", "Misc"]
defp guides_by_category_and_library(libraries, selected_versions) do defp guides_by_category_and_library(libraries, library_version, selected_versions) do
libraries = libraries =
Enum.filter(libraries, fn library -> Enum.filter(libraries, fn library ->
selected_versions[library.id] && selected_versions[library.id] != "" selected_versions[library.id] && selected_versions[library.id] != ""
@ -251,8 +377,8 @@ defmodule AshHqWeb.Components.DocSidebar do
libraries libraries
|> Enum.flat_map(fn library -> |> Enum.flat_map(fn library ->
library.versions library
|> Enum.find(&Ash.Resource.loaded?(&1, :guides)) |> selected_version(library_version, selected_versions)
|> case do |> case do
nil -> nil ->
[] []
@ -286,49 +412,32 @@ defmodule AshHqWeb.Components.DocSidebar do
|> partially_alphabetically_sort(@start_guides, []) |> partially_alphabetically_sort(@start_guides, [])
end end
defp get_extensions(libraries, selected_versions) do defp get_extensions(libraries, library_version, selected_versions) do
libraries libraries
|> Enum.filter(fn library ->
selected_versions[library.id] && selected_versions[library.id] != ""
end)
|> Enum.sort_by(& &1.order) |> Enum.sort_by(& &1.order)
|> Enum.flat_map(fn library -> |> Enum.map(&{&1.display_name, selected_version(&1, library_version, selected_versions)})
case Enum.find(library.versions, &Ash.Resource.loaded?(&1, :extensions)) do |> Enum.filter(&elem(&1, 1))
nil -> |> Enum.flat_map(fn {name, version} ->
[]
version ->
case version.extensions do case version.extensions do
[] -> [] ->
[] []
%Ash.NotLoaded{} ->
raise "extensions not selected for #{version.version} | #{version.id} of #{name}"
extensions -> extensions ->
[{library.display_name, extensions}] [{name, extensions}]
end
end end
end) end)
end end
@last_categories ["Errors"] @last_categories ["Errors"]
defp modules_by_category(libraries, selected_versions) do defp modules_by_category(libraries, library_version, selected_versions) do
libraries =
Enum.filter(libraries, fn library ->
selected_versions[library.id] && selected_versions[library.id] != ""
end)
libraries libraries
|> Enum.flat_map(fn library -> |> Enum.map(&selected_version(&1, library_version, selected_versions))
library.versions |> Enum.filter(& &1)
|> Enum.find(&Ash.Resource.loaded?(&1, :modules)) |> Enum.flat_map(& &1.modules)
|> case do
nil ->
[]
%{modules: modules} ->
modules
end
end)
|> Enum.group_by(fn module -> |> Enum.group_by(fn module ->
module.category module.category
end) end)
@ -336,6 +445,21 @@ defmodule AshHqWeb.Components.DocSidebar do
|> Enum.map(fn {category, modules} -> |> Enum.map(fn {category, modules} ->
{category, Enum.sort_by(modules, & &1.name)} {category, Enum.sort_by(modules, & &1.name)}
end) end)
|> partially_alphabetically_sort([], [])
end
defp mix_tasks_by_category(libraries, library_version, selected_versions) do
libraries
|> Enum.map(&selected_version(&1, library_version, selected_versions))
|> Enum.filter(& &1)
|> Enum.flat_map(& &1.mix_tasks)
|> Enum.group_by(fn mix_task ->
mix_task.category
end)
|> Enum.sort_by(fn {category, _} -> category end)
|> Enum.map(fn {category, mix_tasks} ->
{category, Enum.sort_by(mix_tasks, & &1.name)}
end)
|> partially_alphabetically_sort([], @last_categories) |> partially_alphabetically_sort([], @last_categories)
end end

View file

@ -161,6 +161,24 @@ defmodule AshHqWeb.Components.Search do
defp render_item_type(assigns, item) do defp render_item_type(assigns, item) do
case item_type(item) do case item_type(item) do
"Mix Task" ->
~F"""
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="w-4 h-4"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M6.75 7.5l3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0021 18V6a2.25 2.25 0 00-2.25-2.25H5.25A2.25 2.25 0 003 6v12a2.25 2.25 0 002.25 2.25z"
/>
</svg>
"""
"Function" -> "Function" ->
case item.type do case item.type do
type when type in [:function, :macro] -> type when type in [:function, :macro] ->

View file

@ -10,6 +10,18 @@ defmodule AshHqWeb.DocRoutes do
"/docs/dsl/#{name}" "/docs/dsl/#{name}"
end end
def doc_link(
%AshHq.Docs.MixTask{
sanitized_name: sanitized_name,
library_name: library_name,
version_name: version_name,
library_id: library_id
},
selected_versions
) do
"/docs/mix_task/#{library_name}/#{version(version_name, library_id, selected_versions)}/#{sanitized_name}"
end
def doc_link( def doc_link(
%AshHq.Docs.Module{ %AshHq.Docs.Module{
sanitized_name: sanitized_name, sanitized_name: sanitized_name,

View file

@ -6,13 +6,18 @@ defmodule AshHqWeb.Helpers do
alias AshHqWeb.DocRoutes alias AshHqWeb.DocRoutes
def latest_version(library) do def latest_version(library) do
Enum.at(library.versions, 0) library.versions
|> Enum.min(&(Version.compare(&1.version, &2.version) != :lt))
end end
def source_link(%AshHq.Docs.Module{file: file}, library, library_version) do def source_link(%AshHq.Docs.Module{file: file}, library, library_version) do
"https://github.com/ash-project/#{library.name}/tree/v#{library_version.version}/#{file}" "https://github.com/ash-project/#{library.name}/tree/v#{library_version.version}/#{file}"
end end
def source_link(%AshHq.Docs.MixTask{file: file}, library, library_version) do
"https://github.com/ash-project/#{library.name}/tree/v#{library_version.version}/#{file}"
end
def source_link(%AshHq.Docs.Function{file: file, line: line}, library, library_version) do def source_link(%AshHq.Docs.Function{file: file, line: line}, library, library_version) do
if line do if line do
"https://github.com/ash-project/#{library.name}/tree/v#{library_version.version}/#{file}#L#{line}" "https://github.com/ash-project/#{library.name}/tree/v#{library_version.version}/#{file}#L#{line}"
@ -37,8 +42,6 @@ defmodule AshHqWeb.Helpers do
"<pre><code>#{render_mix_dep(libraries, library, selected_versions, text)}</code></pre>" "<pre><code>#{render_mix_dep(libraries, library, selected_versions, text)}</code></pre>"
rescue rescue
e -> e ->
IO.inspect(__STACKTRACE__)
Logger.error( Logger.error(
"Invalid link #{Exception.format(:error, e)}\n#{Exception.format_stacktrace(__STACKTRACE__)}" "Invalid link #{Exception.format(:error, e)}\n#{Exception.format_stacktrace(__STACKTRACE__)}"
) )
@ -87,8 +90,6 @@ defmodule AshHqWeb.Helpers do
render_link(libraries, selected_versions, library, type, item, text, rest) render_link(libraries, selected_versions, library, type, item, text, rest)
rescue rescue
e -> e ->
IO.inspect(__STACKTRACE__)
Logger.error( Logger.error(
"Invalid link #{Exception.format(:error, e)}\n#{Exception.format_stacktrace(__STACKTRACE__)}" "Invalid link #{Exception.format(:error, e)}\n#{Exception.format_stacktrace(__STACKTRACE__)}"
) )

View file

@ -29,6 +29,7 @@ defmodule AshHqWeb.Pages.Docs do
data dsl, :any data dsl, :any
data options, :list, default: [] data options, :list, default: []
data module, :any data module, :any
data mix_task, :any
data positional_options, :list data positional_options, :list
@spec render(any) :: Phoenix.LiveView.Rendered.t() @spec render(any) :: Phoenix.LiveView.Rendered.t()
@ -51,6 +52,7 @@ defmodule AshHqWeb.Pages.Docs do
libraries={@libraries} libraries={@libraries}
extension={@extension} extension={@extension}
module={@module} module={@module}
mix_task={@mix_task}
guide={@guide} guide={@guide}
library={@library} library={@library}
library_version={@library_version} library_version={@library_version}
@ -66,6 +68,7 @@ defmodule AshHqWeb.Pages.Docs do
class="hidden xl:block w-80 overflow-x-hidden custom-scrollbar" class="hidden xl:block w-80 overflow-x-hidden custom-scrollbar"
remove_version={@remove_version} remove_version={@remove_version}
module={@module} module={@module}
mix_task={@mix_task}
libraries={@libraries} libraries={@libraries}
extension={@extension} extension={@extension}
guide={@guide} guide={@guide}
@ -87,6 +90,13 @@ defmodule AshHqWeb.Pages.Docs do
{#if @module} {#if @module}
<h2>{@module.name} <SourceLink module_or_function={@module} library={@library} library_version={@library_version} /></h2> <h2>{@module.name} <SourceLink module_or_function={@module} library={@library} library_version={@library_version} /></h2>
{/if} {/if}
{#if @mix_task}
<h2>{@mix_task.name} <SourceLink
module_or_function={@mix_task}
library={@library}
library_version={@library_version}
/></h2>
{/if}
{#if @library_version} {#if @library_version}
<div class="static mb-6 md:absolute right-2 top-2 border rounded-lg flex flex-row w-fit"> <div class="static mb-6 md:absolute right-2 top-2 border rounded-lg flex flex-row w-fit">
<div class="border-r pl-2 pr-2 dark:text-black bg-primary-light-600 dark:bg-primary-dark-600 rounded-l-lg"> <div class="border-r pl-2 pr-2 dark:text-black bg-primary-light-600 dark:bg-primary-dark-600 rounded-l-lg">
@ -279,11 +289,19 @@ defmodule AshHqWeb.Pages.Docs do
end end
def update(assigns, socket) do def update(assigns, socket) do
if (assigns[:selected_versions] == socket.assigns[:selected_versions] &&
Map.get(socket.assigns.library_version || %{}, :id) ==
Map.get(assigns[:library_version] || %{}, :id)) || !socket.assigns[:loaded_once?] do
{:ok, {:ok,
socket socket
|> assign(assigns) |> assign(assigns)
|> assign(loaded_once: true) |> assign(:loaded_once?, false)
|> load_docs(assigns[:loaded_once] || false)} |> load_docs()}
else
{:ok,
socket
|> assign(assigns)}
end
end end
defp modules_in_scope(nil, _, _, _), do: [] defp modules_in_scope(nil, _, _, _), do: []
@ -373,20 +391,9 @@ defmodule AshHqWeb.Pages.Docs do
) )
end end
def load_docs(socket, _loaded_once?) do def load_docs(socket) do
socket = assign_library(socket) socket = assign_library(socket)
new_libraries =
socket.assigns.libraries
|> Enum.map(fn library ->
Map.update!(library, :versions, fn versions ->
latest_version = AshHqWeb.Helpers.latest_version(library)
Enum.map(versions, fn version ->
if (latest_version && version.id == latest_version.id) ||
version.id == socket.assigns[:selected_versions][library.id] ||
(socket.assigns[:library_version] &&
socket.assigns[:library_version].id == version.id) do
dsls_query = dsls_query =
AshHq.Docs.Dsl AshHq.Docs.Dsl
|> Ash.Query.sort(order: :asc) |> Ash.Query.sort(order: :asc)
@ -397,11 +404,6 @@ defmodule AshHqWeb.Pages.Docs do
|> Ash.Query.sort(order: :asc) |> Ash.Query.sort(order: :asc)
|> load_for_search(socket.assigns[:params]["dsl_path"]) |> load_for_search(socket.assigns[:params]["dsl_path"])
functions_query =
AshHq.Docs.Function
|> Ash.Query.sort(name: :asc, arity: :asc)
|> load_for_search(socket.assigns[:params]["module"])
guides_query = guides_query =
AshHq.Docs.Guide AshHq.Docs.Guide
|> Ash.Query.new() |> Ash.Query.new()
@ -410,25 +412,59 @@ defmodule AshHqWeb.Pages.Docs do
modules_query = modules_query =
AshHq.Docs.Module AshHq.Docs.Module
|> Ash.Query.sort(order: :asc) |> Ash.Query.sort(order: :asc)
|> Ash.Query.load(functions: functions_query)
|> load_for_search(socket.assigns[:params]["module"]) |> load_for_search(socket.assigns[:params]["module"])
mix_tasks_query =
AshHq.Docs.MixTask
|> Ash.Query.sort(order: :asc)
|> load_for_search(socket.assigns[:params]["mix_task"])
extensions_query = extensions_query =
AshHq.Docs.Extension AshHq.Docs.Extension
|> Ash.Query.sort(order: :asc) |> Ash.Query.sort(order: :asc)
|> Ash.Query.load(options: options_query, dsls: dsls_query) |> Ash.Query.load(options: options_query, dsls: dsls_query)
|> load_for_search(socket.assigns[:params]["extension"]) |> load_for_search(socket.assigns[:params]["extension"])
AshHq.Docs.load!( new_libraries =
version, socket.assigns.libraries
[extensions: extensions_query, guides: guides_query, modules: modules_query], |> Enum.flat_map(fn library ->
latest_version = AshHqWeb.Helpers.latest_version(library)
Enum.filter(library.versions, fn version ->
(latest_version && version.id == latest_version.id) ||
version.id == socket.assigns[:selected_versions][library.id] ||
(socket.assigns[:library_version] &&
socket.assigns[:library_version].id == version.id) ||
(socket.assigns.params["version"] &&
socket.assigns.params["version"] ==
version.version)
end)
end)
|> AshHq.Docs.load!(
[
extensions: extensions_query,
guides: guides_query,
modules: modules_query,
mix_tasks: mix_tasks_query
],
lazy?: true lazy?: true
) )
|> Enum.reduce(socket.assigns.libraries, fn library_version, libraries ->
Enum.map(libraries, fn library ->
if library.id == library_version.library_id do
Map.update!(library, :versions, fn versions ->
Enum.map(versions, fn current_version ->
if current_version.id == library_version.id do
library_version
else else
version current_version
end end
end) end)
end) end)
else
library
end
end)
end) end)
socket socket
@ -437,6 +473,7 @@ defmodule AshHqWeb.Pages.Docs do
|> assign_extension() |> assign_extension()
|> assign_guide() |> assign_guide()
|> assign_module() |> assign_module()
|> assign_mix_task()
|> assign_dsl() |> assign_dsl()
|> assign_docs() |> assign_docs()
end end
@ -604,14 +641,36 @@ defmodule AshHqWeb.Pages.Docs do
&(&1.sanitized_name == socket.assigns[:params]["module"]) &(&1.sanitized_name == socket.assigns[:params]["module"])
) )
functions_query =
AshHq.Docs.Function
|> Ash.Query.sort(name: :asc, arity: :asc)
|> load_for_search(socket.assigns[:params]["module"])
assign(socket, assign(socket,
module: module module: AshHq.Docs.load!(module, [functions: functions_query], lazy?: true)
) )
else else
assign(socket, :module, nil) assign(socket, :module, nil)
end end
end end
defp assign_mix_task(socket) do
if socket.assigns.library && socket.assigns.library_version &&
socket.assigns[:params]["mix_task"] do
mix_task =
Enum.find(
socket.assigns.library_version.mix_tasks,
&(&1.sanitized_name == socket.assigns[:params]["mix_task"])
)
assign(socket,
mix_task: mix_task
)
else
assign(socket, :mix_task, nil)
end
end
defp assign_docs(socket) do defp assign_docs(socket) do
cond do cond do
socket.assigns.module -> socket.assigns.module ->
@ -621,6 +680,13 @@ defmodule AshHqWeb.Pages.Docs do
options: [] options: []
) )
socket.assigns.mix_task ->
assign(socket,
docs: socket.assigns.mix_task.html_for,
doc_path: [socket.assigns.library.name, socket.assigns.mix_task.name],
options: []
)
socket.assigns.dsl -> socket.assigns.dsl ->
assign(socket, assign(socket,
docs: socket.assigns.dsl.html_for, docs: socket.assigns.dsl.html_for,

View file

@ -38,6 +38,7 @@ defmodule AshHqWeb.Router do
live "/docs/dsl/:library/:version/:extension", AppViewLive, :docs_dsl live "/docs/dsl/:library/:version/:extension", AppViewLive, :docs_dsl
live "/docs/dsl/:library/:version/:extension/*dsl_path", AppViewLive, :docs_dsl live "/docs/dsl/:library/:version/:extension/*dsl_path", AppViewLive, :docs_dsl
live "/docs/module/:library/:version/:module", AppViewLive, :docs_dsl live "/docs/module/:library/:version/:module", AppViewLive, :docs_dsl
live "/docs/mix_task/:library/:version/:mix_task", AppViewLive, :docs_dsl
get "/unsubscribe", MailingListController, :unsubscribe get "/unsubscribe", MailingListController, :unsubscribe
end end

View file

@ -56,7 +56,6 @@ defmodule AshHqWeb.AppViewLive do
/> />
<CatalogueModal <CatalogueModal
id="catalogue-box" id="catalogue-box"
close={close_catalogue()}
libraries={@libraries} libraries={@libraries}
selected_versions={@selected_versions} selected_versions={@selected_versions}
change_versions="change-versions" change_versions="change-versions"

View file

@ -33,9 +33,9 @@ defmodule AshHq.MixProject do
# Type `mix help deps` for examples and options. # Type `mix help deps` for examples and options.
defp deps do defp deps do
[ [
{:ash, github: "ash-project/ash", override: true}, # {:ash, github: "ash-project/ash", override: true},
# {:ash, "~> 2.0.0-rc.8"}, # {:ash, "~> 2.0.0-rc.8"},
# {:ash, path: "../ash", override: true}, {:ash, path: "../ash", override: true},
# {:ash_postgres, "~> 1.0.0-rc.3"}, # {:ash_postgres, "~> 1.0.0-rc.3"},
{:ash_postgres, github: "ash-project/ash_postgres"}, {:ash_postgres, github: "ash-project/ash_postgres"},
@ -95,7 +95,8 @@ defmodule AshHq.MixProject do
{:credo, ">= 0.0.0", only: :dev, runtime: false}, {:credo, ">= 0.0.0", only: :dev, runtime: false},
{:dialyxir, ">= 0.0.0", only: :dev, runtime: false}, {:dialyxir, ">= 0.0.0", only: :dev, runtime: false},
{:sobelow, ">= 0.0.0", only: :dev, runtime: false}, {:sobelow, ">= 0.0.0", only: :dev, runtime: false},
{:excoveralls, "~> 0.14", only: [:dev, :test]} {:excoveralls, "~> 0.14", only: [:dev, :test]},
{:eflame, "~> 1.0", only: [:dev, :test]}
] ]
end end

View file

@ -1,10 +1,10 @@
%{ %{
"absinthe": {:hex, :absinthe, "1.7.0", "36819e7b1fd5046c9c734f27fe7e564aed3bda59f0354c37cd2df88fd32dd014", [:mix], [{:dataloader, "~> 1.0.0", [hex: :dataloader, repo: "hexpm", optional: true]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0 or ~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "566a5b5519afc9b29c4d367f0c6768162de3ec03e9bf9916f9dc2bcbe7c09643"}, "absinthe": {:hex, :absinthe, "1.7.0", "36819e7b1fd5046c9c734f27fe7e564aed3bda59f0354c37cd2df88fd32dd014", [:mix], [{:dataloader, "~> 1.0.0", [hex: :dataloader, repo: "hexpm", optional: true]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0 or ~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "566a5b5519afc9b29c4d367f0c6768162de3ec03e9bf9916f9dc2bcbe7c09643"},
"absinthe_plug": {:hex, :absinthe_plug, "1.5.8", "38d230641ba9dca8f72f1fed2dfc8abd53b3907d1996363da32434ab6ee5d6ab", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bbb04176647b735828861e7b2705465e53e2cf54ccf5a73ddd1ebd855f996e5a"}, "absinthe_plug": {:hex, :absinthe_plug, "1.5.8", "38d230641ba9dca8f72f1fed2dfc8abd53b3907d1996363da32434ab6ee5d6ab", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bbb04176647b735828861e7b2705465e53e2cf54ccf5a73ddd1ebd855f996e5a"},
"ash": {:git, "https://github.com/ash-project/ash.git", "8f1a43419b2a701b49b23ba6585171829077b35e", []}, "ash": {:git, "https://github.com/ash-project/ash.git", "37a5fdc89b182e2842f90d5468a161f32da813e9", []},
"ash_graphql": {:git, "https://github.com/ash-project/ash_graphql.git", "d859026ddb11b2d359cab29641257aeed303743b", []}, "ash_graphql": {:git, "https://github.com/ash-project/ash_graphql.git", "1d31f7a20c2ee9545245f2539f1628d0f5a1afe9", []},
"ash_phoenix": {:git, "https://github.com/ash-project/ash_phoenix.git", "75f07d12358b3473c4780c51333ef44aedf4c839", []}, "ash_phoenix": {:git, "https://github.com/ash-project/ash_phoenix.git", "75f07d12358b3473c4780c51333ef44aedf4c839", []},
"ash_postgres": {:git, "https://github.com/ash-project/ash_postgres.git", "0fa1ee05f4a6ba5461394dfef096ed8f9c1ada57", []}, "ash_postgres": {:git, "https://github.com/ash-project/ash_postgres.git", "12cf97d89e3fab29575b45baf5a5e6fb9d839e1a", []},
"bcrypt_elixir": {:hex, :bcrypt_elixir, "3.0.1", "9be815469e6bfefec40fa74658ecbbe6897acfb57614df1416eeccd4903f602c", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "486bb95efb645d1efc6794c1ddd776a186a9a713abf06f45708a6ce324fb96cf"}, "bcrypt_elixir": {:hex, :bcrypt_elixir, "3.0.1", "9be815469e6bfefec40fa74658ecbbe6897acfb57614df1416eeccd4903f602c", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "486bb95efb645d1efc6794c1ddd776a186a9a713abf06f45708a6ce324fb96cf"},
"bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"}, "bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
"castore": {:hex, :castore, "0.1.18", "deb5b9ab02400561b6f5708f3e7660fc35ca2d51bfc6a940d2f513f89c2975fc", [:mix], [], "hexpm", "61bbaf6452b782ef80b33cdb45701afbcf0a918a45ebe7e73f1130d661e66a06"}, "castore": {:hex, :castore, "0.1.18", "deb5b9ab02400561b6f5708f3e7660fc35ca2d51bfc6a940d2f513f89c2975fc", [:mix], [], "hexpm", "61bbaf6452b782ef80b33cdb45701afbcf0a918a45ebe7e73f1130d661e66a06"},
@ -26,6 +26,8 @@
"ecto": {:hex, :ecto, "3.8.4", "e06b8b87e62b27fea17fd2ff6041572ddd10339fd16cdf58446e402c6c90a74b", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f9244288b8d42db40515463a008cf3f4e0e564bb9c249fe87bf28a6d79fe82d4"}, "ecto": {:hex, :ecto, "3.8.4", "e06b8b87e62b27fea17fd2ff6041572ddd10339fd16cdf58446e402c6c90a74b", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f9244288b8d42db40515463a008cf3f4e0e564bb9c249fe87bf28a6d79fe82d4"},
"ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.4", "5d43fd088d39a158c860b17e8d210669587f63ec89ea122a4654861c8c6e2db4", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.15.7", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "311db02f1b772e3d0dc7f56a05044b5e1499d78ed6abf38885e1ca70059449e5"}, "ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.4", "5d43fd088d39a158c860b17e8d210669587f63ec89ea122a4654861c8c6e2db4", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.15.7", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "311db02f1b772e3d0dc7f56a05044b5e1499d78ed6abf38885e1ca70059449e5"},
"ecto_sql": {:hex, :ecto_sql, "3.8.3", "a7d22c624202546a39d615ed7a6b784580391e65723f2d24f65941b4dd73d471", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.8.4", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "348cb17fb9e6daf6f251a87049eafcb57805e2892e5e6a0f5dea0985d367329b"}, "ecto_sql": {:hex, :ecto_sql, "3.8.3", "a7d22c624202546a39d615ed7a6b784580391e65723f2d24f65941b4dd73d471", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.8.4", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "348cb17fb9e6daf6f251a87049eafcb57805e2892e5e6a0f5dea0985d367329b"},
"eflambe": {:git, "https://github.com/DockYard/flame_on.git", "3f4e3bfa2e5546d95fb94d7ecb4b459bc4398c41", []},
"eflame": {:hex, :eflame, "1.0.1", "0664d287e39eef3c413749254b3af5f4f8b00be71c1af67d325331c4890be0fc", [:mix], [], "hexpm", "e0b08854a66f9013129de0b008488f3411ae9b69b902187837f994d7a99cf04e"},
"elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"}, "elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"},
"elixir_sense": {:git, "https://github.com/elixir-lsp/elixir_sense.git", "12bdf7ac9971a9f1cb278b66364f912d63af4c0f", []}, "elixir_sense": {:git, "https://github.com/elixir-lsp/elixir_sense.git", "12bdf7ac9971a9f1cb278b66364f912d63af4c0f", []},
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},

View file

@ -9,63 +9,67 @@ defmodule AshHq.Repo.Migrations.MigrateResources1 do
def up do def up do
create table(:options, primary_key: false) do create table(:options, primary_key: false) do
add :id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
add :name, :text, null: false add(:name, :text, null: false)
add :type, :text, null: false add(:type, :text, null: false)
add :doc, :text, null: false, default: "" add(:doc, :text, null: false, default: "")
add :doc_html, :text add(:doc_html, :text)
add :required, :boolean, null: false, default: false add(:required, :boolean, null: false, default: false)
add :default, :text add(:default, :text)
add :path, {:array, :text} add(:path, {:array, :text})
add :order, :bigint, null: false add(:order, :bigint, null: false)
add :dsl_id, :uuid, null: false add(:dsl_id, :uuid, null: false)
add :library_version_id, :uuid, null: false add(:library_version_id, :uuid, null: false)
add :extension_id, :uuid, null: false add(:extension_id, :uuid, null: false)
end end
create table(:modules, primary_key: false) do create table(:modules, primary_key: false) do
add :id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
add :name, :text, null: false add(:name, :text, null: false)
add :doc, :text, null: false, default: "" add(:doc, :text, null: false, default: "")
add :doc_html, :text add(:doc_html, :text)
add :order, :bigint, null: false add(:order, :bigint, null: false)
add :library_version_id, :uuid, null: false add(:library_version_id, :uuid, null: false)
add :extension_id, :uuid, null: false add(:extension_id, :uuid, null: false)
end end
create table(:library_versions, primary_key: false) do create table(:library_versions, primary_key: false) do
add :id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
end end
alter table(:modules) do alter table(:modules) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "modules_library_version_id_fkey", name: "modules_library_version_id_fkey",
type: :uuid type: :uuid
) )
)
end end
alter table(:library_versions) do alter table(:library_versions) do
add :version, :text, null: false add(:version, :text, null: false)
add :data, :map add(:data, :map)
add :doc, :text, null: false, default: "" add(:doc, :text, null: false, default: "")
add :doc_html, :text add(:doc_html, :text)
add :processed, :boolean, default: false add(:processed, :boolean, default: false)
add :library_id, :uuid, null: false add(:library_id, :uuid, null: false)
end end
create table(:libraries, primary_key: false) do create table(:libraries, primary_key: false) do
add :id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
end end
alter table(:library_versions) do alter table(:library_versions) do
modify :library_id, modify(
:library_id,
references(:libraries, references(:libraries,
column: :id, column: :id,
name: "library_versions_library_id_fkey", name: "library_versions_library_id_fkey",
type: :uuid type: :uuid
) )
)
end end
create unique_index(:library_versions, [:library_id, :version], create unique_index(:library_versions, [:library_id, :version],
@ -73,84 +77,96 @@ defmodule AshHq.Repo.Migrations.MigrateResources1 do
) )
alter table(:libraries) do alter table(:libraries) do
add :name, :text, null: false add(:name, :text, null: false)
add :display_name, :text, null: false add(:display_name, :text, null: false)
add :track_branches, {:array, :text}, default: [] add(:track_branches, {:array, :text}, default: [])
end end
create table(:guides, primary_key: false) do create table(:guides, primary_key: false) do
add :id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
add :order, :bigint, null: false add(:order, :bigint, null: false)
add :name, :text, null: false add(:name, :text, null: false)
add :text, :text, null: false, default: "" add(:text, :text, null: false, default: "")
add :text_html, :text add(:text_html, :text)
add :library_version_id, add(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "guides_library_version_id_fkey", name: "guides_library_version_id_fkey",
type: :uuid type: :uuid
), ),
null: false null: false
)
end end
create table(:functions, primary_key: false) do create table(:functions, primary_key: false) do
add :id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
add :name, :text, null: false add(:name, :text, null: false)
add :arity, :bigint, null: false add(:arity, :bigint, null: false)
add :type, :text, null: false add(:type, :text, null: false)
add :heads, {:array, :text}, default: [] add(:heads, {:array, :text}, default: [])
add :doc, :text, null: false, default: "" add(:doc, :text, null: false, default: "")
add :doc_html, :text add(:doc_html, :text)
add :order, :bigint, null: false add(:order, :bigint, null: false)
add :library_version_id, add(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "functions_library_version_id_fkey", name: "functions_library_version_id_fkey",
type: :uuid type: :uuid
), ),
null: false null: false
)
add :extension_id, :uuid, null: false add(:extension_id, :uuid, null: false)
add :module_id, :uuid, null: false add(:module_id, :uuid, null: false)
end end
create table(:extensions, primary_key: false) do create table(:extensions, primary_key: false) do
add :id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
end end
alter table(:modules) do alter table(:modules) do
modify :extension_id, modify(
:extension_id,
references(:extensions, column: :id, name: "modules_extension_id_fkey", type: :uuid) references(:extensions, column: :id, name: "modules_extension_id_fkey", type: :uuid)
)
end end
alter table(:functions) do alter table(:functions) do
modify :extension_id, modify(
:extension_id,
references(:extensions, column: :id, name: "functions_extension_id_fkey", type: :uuid) references(:extensions, column: :id, name: "functions_extension_id_fkey", type: :uuid)
)
end end
alter table(:functions) do alter table(:functions) do
modify :module_id, modify(
:module_id,
references(:modules, column: :id, name: "functions_module_id_fkey", type: :uuid) references(:modules, column: :id, name: "functions_module_id_fkey", type: :uuid)
)
end end
alter table(:extensions) do alter table(:extensions) do
add :name, :text, null: false add(:name, :text, null: false)
add :target, :text add(:target, :text)
add :default_for_target, :boolean, default: false add(:default_for_target, :boolean, default: false)
add :doc, :text, null: false, default: "" add(:doc, :text, null: false, default: "")
add :doc_html, :text add(:doc_html, :text)
add :type, :text, null: false add(:type, :text, null: false)
add :order, :bigint, null: false add(:order, :bigint, null: false)
add :library_version_id, add(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "extensions_library_version_id_fkey", name: "extensions_library_version_id_fkey",
type: :uuid type: :uuid
), ),
null: false null: false
)
end end
create unique_index(:extensions, [:library_version_id, :name], create unique_index(:extensions, [:library_version_id, :name],
@ -158,178 +174,190 @@ defmodule AshHq.Repo.Migrations.MigrateResources1 do
) )
create table(:dsls, primary_key: false) do create table(:dsls, primary_key: false) do
add :id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
end end
alter table(:options) do alter table(:options) do
modify :dsl_id, references(:dsls, column: :id, name: "options_dsl_id_fkey", type: :uuid) modify(:dsl_id, references(:dsls, column: :id, name: "options_dsl_id_fkey", type: :uuid))
end end
alter table(:options) do alter table(:options) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "options_library_version_id_fkey", name: "options_library_version_id_fkey",
type: :uuid type: :uuid
) )
)
end end
alter table(:options) do alter table(:options) do
modify :extension_id, modify(
:extension_id,
references(:extensions, column: :id, name: "options_extension_id_fkey", type: :uuid) references(:extensions, column: :id, name: "options_extension_id_fkey", type: :uuid)
)
end end
alter table(:dsls) do alter table(:dsls) do
add :name, :text, null: false add(:name, :text, null: false)
add :doc, :text, null: false, default: "" add(:doc, :text, null: false, default: "")
add :doc_html, :text add(:doc_html, :text)
add :examples, {:array, :text} add(:examples, {:array, :text})
add :args, {:array, :text} add(:args, {:array, :text})
add :path, {:array, :text} add(:path, {:array, :text})
add :recursive_as, :text add(:recursive_as, :text)
add :order, :bigint, null: false add(:order, :bigint, null: false)
add :type, :text, null: false add(:type, :text, null: false)
add :library_version_id, add(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "dsls_library_version_id_fkey", name: "dsls_library_version_id_fkey",
type: :uuid type: :uuid
), ),
null: false null: false
)
add :extension_id, add(
:extension_id,
references(:extensions, column: :id, name: "dsls_extension_id_fkey", type: :uuid), references(:extensions, column: :id, name: "dsls_extension_id_fkey", type: :uuid),
null: false null: false
)
add :dsl_id, references(:dsls, column: :id, name: "dsls_dsl_id_fkey", type: :uuid) add(:dsl_id, references(:dsls, column: :id, name: "dsls_dsl_id_fkey", type: :uuid))
end end
end end
def down do def down do
drop constraint(:dsls, "dsls_dsl_id_fkey") drop(constraint(:dsls, "dsls_dsl_id_fkey"))
drop constraint(:dsls, "dsls_extension_id_fkey") drop(constraint(:dsls, "dsls_extension_id_fkey"))
drop constraint(:dsls, "dsls_library_version_id_fkey") drop(constraint(:dsls, "dsls_library_version_id_fkey"))
alter table(:dsls) do alter table(:dsls) do
remove :dsl_id remove(:dsl_id)
remove :extension_id remove(:extension_id)
remove :library_version_id remove(:library_version_id)
remove :type remove(:type)
remove :order remove(:order)
remove :recursive_as remove(:recursive_as)
remove :path remove(:path)
remove :args remove(:args)
remove :examples remove(:examples)
remove :doc_html remove(:doc_html)
remove :doc remove(:doc)
remove :name remove(:name)
end end
drop constraint(:options, "options_extension_id_fkey") drop(constraint(:options, "options_extension_id_fkey"))
alter table(:options) do alter table(:options) do
modify :extension_id, :uuid modify(:extension_id, :uuid)
end end
drop constraint(:options, "options_library_version_id_fkey") drop(constraint(:options, "options_library_version_id_fkey"))
alter table(:options) do alter table(:options) do
modify :library_version_id, :uuid modify(:library_version_id, :uuid)
end end
drop constraint(:options, "options_dsl_id_fkey") drop(constraint(:options, "options_dsl_id_fkey"))
alter table(:options) do alter table(:options) do
modify :dsl_id, :uuid modify(:dsl_id, :uuid)
end end
drop table(:dsls) drop(table(:dsls))
drop_if_exists unique_index(:extensions, [:library_version_id, :name], drop_if_exists(
unique_index(:extensions, [:library_version_id, :name],
name: "extensions_unique_name_by_library_version_index" name: "extensions_unique_name_by_library_version_index"
) )
drop constraint(:extensions, "extensions_library_version_id_fkey")
alter table(:extensions) do
remove :library_version_id
remove :order
remove :type
remove :doc_html
remove :doc
remove :default_for_target
remove :target
remove :name
end
drop constraint(:functions, "functions_module_id_fkey")
alter table(:functions) do
modify :module_id, :uuid
end
drop constraint(:functions, "functions_extension_id_fkey")
alter table(:functions) do
modify :extension_id, :uuid
end
drop constraint(:modules, "modules_extension_id_fkey")
alter table(:modules) do
modify :extension_id, :uuid
end
drop table(:extensions)
drop constraint(:functions, "functions_library_version_id_fkey")
drop table(:functions)
drop constraint(:guides, "guides_library_version_id_fkey")
drop table(:guides)
alter table(:libraries) do
remove :track_branches
remove :display_name
remove :name
end
drop_if_exists unique_index(:library_versions, [:library_id, :version],
name: "library_versions_unique_version_for_library_index"
) )
drop constraint(:library_versions, "library_versions_library_id_fkey") drop(constraint(:extensions, "extensions_library_version_id_fkey"))
alter table(:library_versions) do alter table(:extensions) do
modify :library_id, :uuid remove(:library_version_id)
remove(:order)
remove(:type)
remove(:doc_html)
remove(:doc)
remove(:default_for_target)
remove(:target)
remove(:name)
end end
drop table(:libraries) drop(constraint(:functions, "functions_module_id_fkey"))
alter table(:library_versions) do alter table(:functions) do
remove :library_id modify(:module_id, :uuid)
remove :processed
remove :doc_html
remove :doc
remove :data
remove :version
end end
drop constraint(:modules, "modules_library_version_id_fkey") drop(constraint(:functions, "functions_extension_id_fkey"))
alter table(:functions) do
modify(:extension_id, :uuid)
end
drop(constraint(:modules, "modules_extension_id_fkey"))
alter table(:modules) do alter table(:modules) do
modify :library_version_id, :uuid modify(:extension_id, :uuid)
end end
drop table(:library_versions) drop(table(:extensions))
drop table(:modules) drop(constraint(:functions, "functions_library_version_id_fkey"))
drop table(:options) drop(table(:functions))
drop(constraint(:guides, "guides_library_version_id_fkey"))
drop(table(:guides))
alter table(:libraries) do
remove(:track_branches)
remove(:display_name)
remove(:name)
end
drop_if_exists(
unique_index(:library_versions, [:library_id, :version],
name: "library_versions_unique_version_for_library_index"
)
)
drop(constraint(:library_versions, "library_versions_library_id_fkey"))
alter table(:library_versions) do
modify(:library_id, :uuid)
end
drop(table(:libraries))
alter table(:library_versions) do
remove(:library_id)
remove(:processed)
remove(:doc_html)
remove(:doc)
remove(:data)
remove(:version)
end
drop(constraint(:modules, "modules_library_version_id_fkey"))
alter table(:modules) do
modify(:library_version_id, :uuid)
end
drop(table(:library_versions))
drop(table(:modules))
drop(table(:options))
end end
end end

View file

@ -13,7 +13,8 @@ defmodule AshHq.Repo.Migrations.AddTsvectorIndices do
def change do def change do
for {table, {header, text}} <- @config do for {table, {header, text}} <- @config do
execute """ execute(
"""
CREATE INDEX #{table}_search_index ON #{table} USING GIN(( CREATE INDEX #{table}_search_index ON #{table} USING GIN((
setweight(to_tsvector('english', #{header}), 'A') || setweight(to_tsvector('english', #{header}), 'A') ||
setweight(to_tsvector('english', #{text}), 'D') setweight(to_tsvector('english', #{text}), 'D')
@ -22,6 +23,7 @@ defmodule AshHq.Repo.Migrations.AddTsvectorIndices do
""" """
DROP INDEX #{table}_search_index DROP INDEX #{table}_search_index
""" """
)
end end
end end
end end

View file

@ -9,20 +9,29 @@ defmodule AshHq.Repo.Migrations.MigrateResources2 do
def up do def up do
alter table(:modules) do alter table(:modules) do
remove :extension_id remove(:extension_id)
end end
alter table(:functions) do alter table(:functions) do
remove :extension_id remove(:extension_id)
end end
end end
def down do def down do
alter table(:functions) do alter table(:functions) do
add :extension_id, references(:extensions, column: :id, name: "functions_extension_id_fkey", type: :uuid), null: false add(
:extension_id,
references(:extensions, column: :id, name: "functions_extension_id_fkey", type: :uuid),
null: false
)
end end
alter table(:modules) do alter table(:modules) do
add :extension_id, references(:extensions, column: :id, name: "modules_extension_id_fkey", type: :uuid), null: false add(
:extension_id,
references(:extensions, column: :id, name: "modules_extension_id_fkey", type: :uuid),
null: false
)
end end
end end
end end

View file

@ -8,144 +8,168 @@ defmodule AshHq.Repo.Migrations.MigrateResources3 do
use Ecto.Migration use Ecto.Migration
def up do def up do
drop constraint(:options, "options_library_version_id_fkey") drop(constraint(:options, "options_library_version_id_fkey"))
alter table(:options) do alter table(:options) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "options_library_version_id_fkey", name: "options_library_version_id_fkey",
type: :uuid, type: :uuid,
on_delete: :delete_all on_delete: :delete_all
) )
)
end end
drop constraint(:modules, "modules_library_version_id_fkey") drop(constraint(:modules, "modules_library_version_id_fkey"))
alter table(:modules) do alter table(:modules) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "modules_library_version_id_fkey", name: "modules_library_version_id_fkey",
type: :uuid, type: :uuid,
on_delete: :delete_all on_delete: :delete_all
) )
)
end end
drop constraint(:guides, "guides_library_version_id_fkey") drop(constraint(:guides, "guides_library_version_id_fkey"))
alter table(:guides) do alter table(:guides) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "guides_library_version_id_fkey", name: "guides_library_version_id_fkey",
type: :uuid, type: :uuid,
on_delete: :delete_all on_delete: :delete_all
) )
)
end end
drop constraint(:functions, "functions_library_version_id_fkey") drop(constraint(:functions, "functions_library_version_id_fkey"))
alter table(:functions) do alter table(:functions) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "functions_library_version_id_fkey", name: "functions_library_version_id_fkey",
type: :uuid, type: :uuid,
on_delete: :delete_all on_delete: :delete_all
) )
)
end end
drop constraint(:extensions, "extensions_library_version_id_fkey") drop(constraint(:extensions, "extensions_library_version_id_fkey"))
alter table(:extensions) do alter table(:extensions) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "extensions_library_version_id_fkey", name: "extensions_library_version_id_fkey",
type: :uuid, type: :uuid,
on_delete: :delete_all on_delete: :delete_all
) )
)
end end
drop constraint(:dsls, "dsls_library_version_id_fkey") drop(constraint(:dsls, "dsls_library_version_id_fkey"))
alter table(:dsls) do alter table(:dsls) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "dsls_library_version_id_fkey", name: "dsls_library_version_id_fkey",
type: :uuid, type: :uuid,
on_delete: :delete_all on_delete: :delete_all
) )
)
end end
end end
def down do def down do
drop constraint(:dsls, "dsls_library_version_id_fkey") drop(constraint(:dsls, "dsls_library_version_id_fkey"))
alter table(:dsls) do alter table(:dsls) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "dsls_library_version_id_fkey", name: "dsls_library_version_id_fkey",
type: :uuid type: :uuid
) )
)
end end
drop constraint(:extensions, "extensions_library_version_id_fkey") drop(constraint(:extensions, "extensions_library_version_id_fkey"))
alter table(:extensions) do alter table(:extensions) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "extensions_library_version_id_fkey", name: "extensions_library_version_id_fkey",
type: :uuid type: :uuid
) )
)
end end
drop constraint(:functions, "functions_library_version_id_fkey") drop(constraint(:functions, "functions_library_version_id_fkey"))
alter table(:functions) do alter table(:functions) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "functions_library_version_id_fkey", name: "functions_library_version_id_fkey",
type: :uuid type: :uuid
) )
)
end end
drop constraint(:guides, "guides_library_version_id_fkey") drop(constraint(:guides, "guides_library_version_id_fkey"))
alter table(:guides) do alter table(:guides) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "guides_library_version_id_fkey", name: "guides_library_version_id_fkey",
type: :uuid type: :uuid
) )
)
end end
drop constraint(:modules, "modules_library_version_id_fkey") drop(constraint(:modules, "modules_library_version_id_fkey"))
alter table(:modules) do alter table(:modules) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "modules_library_version_id_fkey", name: "modules_library_version_id_fkey",
type: :uuid type: :uuid
) )
)
end end
drop constraint(:options, "options_library_version_id_fkey") drop(constraint(:options, "options_library_version_id_fkey"))
alter table(:options) do alter table(:options) do
modify :library_version_id, modify(
:library_version_id,
references(:library_versions, references(:library_versions,
column: :id, column: :id,
name: "options_library_version_id_fkey", name: "options_library_version_id_fkey",
type: :uuid type: :uuid
) )
)
end end
end end
end end

View file

@ -9,15 +9,15 @@ defmodule AshHq.Repo.Migrations.MigrateResources4 do
def up do def up do
alter table(:guides) do alter table(:guides) do
add :category, :text, default: "Guides" add(:category, :text, default: "Guides")
add :route, :text, null: false add(:route, :text, null: false)
end end
end end
def down do def down do
alter table(:guides) do alter table(:guides) do
remove :route remove(:route)
remove :category remove(:category)
end end
end end
end end

View file

@ -9,21 +9,21 @@ defmodule AshHq.Repo.Migrations.MigrateResources5 do
def up do def up do
alter table(:libraries) do alter table(:libraries) do
add :description, :text add(:description, :text)
end end
alter table(:guides) do alter table(:guides) do
modify :category, :text, null: false modify(:category, :text, null: false)
end end
end end
def down do def down do
alter table(:guides) do alter table(:guides) do
modify :category, :text, null: true modify(:category, :text, null: true)
end end
alter table(:libraries) do alter table(:libraries) do
remove :description remove(:description)
end end
end end
end end

View file

@ -9,34 +9,34 @@ defmodule AshHq.Repo.Migrations.MigrateResources6 do
def up do def up do
alter table(:library_versions) do alter table(:library_versions) do
remove :processed remove(:processed)
remove :data remove(:data)
end end
alter table(:libraries) do alter table(:libraries) do
remove :description remove(:description)
modify :track_branches, {:array, :text}, default: nil modify(:track_branches, {:array, :text}, default: nil)
end end
alter table(:functions) do alter table(:functions) do
modify :heads, {:array, :text}, default: nil modify(:heads, {:array, :text}, default: nil)
end end
end end
def down do def down do
alter table(:functions) do alter table(:functions) do
modify :heads, {:array, :text}, default: [] modify(:heads, {:array, :text}, default: [])
end end
alter table(:libraries) do alter table(:libraries) do
modify :track_branches, {:array, :text}, default: [] modify(:track_branches, {:array, :text}, default: [])
add :description, :text add(:description, :text)
end end
alter table(:library_versions) do alter table(:library_versions) do
add :data, :map add(:data, :map)
add :processed, :boolean, default: false add(:processed, :boolean, default: false)
end end
end end
end end

View file

@ -9,13 +9,13 @@ defmodule AshHq.Repo.Migrations.MigrateResources7 do
def up do def up do
alter table(:modules) do alter table(:modules) do
add :category, :text, null: false, default: "Misc" add(:category, :text, null: false, default: "Misc")
end end
end end
def down do def down do
alter table(:modules) do alter table(:modules) do
remove :category remove(:category)
end end
end end
end end

View file

@ -9,13 +9,13 @@ defmodule AshHq.Repo.Migrations.MigrateResources8 do
def up do def up do
alter table(:modules) do alter table(:modules) do
add :category_index, :bigint, null: false, default: 0 add(:category_index, :bigint, null: false, default: 0)
end end
end end
def down do def down do
alter table(:modules) do alter table(:modules) do
remove :category_index remove(:category_index)
end end
end end
end end

View file

@ -9,49 +9,49 @@ defmodule AshHq.Repo.Migrations.MigrateResources9 do
def up do def up do
alter table(:options) do alter table(:options) do
add :argument_index, :bigint add(:argument_index, :bigint)
end end
alter table(:modules) do alter table(:modules) do
add :file, :text add(:file, :text)
end end
alter table(:guides) do alter table(:guides) do
modify :category, :text, default: "Topics" modify(:category, :text, default: "Topics")
end end
alter table(:functions) do alter table(:functions) do
add :file, :text add(:file, :text)
add :line, :bigint add(:line, :bigint)
end end
alter table(:dsls) do alter table(:dsls) do
add :imports, {:array, :text} add(:imports, {:array, :text})
add :links, :map add(:links, :map)
end end
end end
def down do def down do
alter table(:dsls) do alter table(:dsls) do
remove :links remove(:links)
remove :imports remove(:imports)
end end
alter table(:functions) do alter table(:functions) do
remove :line remove(:line)
remove :file remove(:file)
end end
alter table(:guides) do alter table(:guides) do
modify :category, :text, default: "Guides" modify(:category, :text, default: "Guides")
end end
alter table(:modules) do alter table(:modules) do
remove :file remove(:file)
end end
alter table(:options) do alter table(:options) do
remove :argument_index remove(:argument_index)
end end
end end
end end

View file

@ -9,15 +9,15 @@ defmodule AshHq.Repo.Migrations.MigrateResources10 do
def up do def up do
alter table(:library_versions) do alter table(:library_versions) do
remove :doc_html remove(:doc_html)
remove :doc remove(:doc)
end end
end end
def down do def down do
alter table(:library_versions) do alter table(:library_versions) do
add :doc, :text, null: false, default: "" add(:doc, :text, null: false, default: "")
add :doc_html, :text add(:doc_html, :text)
end end
end end
end end

View file

@ -9,13 +9,13 @@ defmodule AshHq.Repo.Migrations.MigrateResources11 do
def up do def up do
alter table(:library_versions) do alter table(:library_versions) do
add :default_guide, :text, null: false add(:default_guide, :text, null: false)
end end
end end
def down do def down do
alter table(:library_versions) do alter table(:library_versions) do
remove :default_guide remove(:default_guide)
end end
end end
end end

View file

@ -9,13 +9,13 @@ defmodule AshHq.Repo.Migrations.MigrateResources12 do
def up do def up do
alter table(:library_versions) do alter table(:library_versions) do
modify :default_guide, :text, null: true modify(:default_guide, :text, null: true)
end end
end end
def down do def down do
alter table(:library_versions) do alter table(:library_versions) do
modify :default_guide, :text, null: false modify(:default_guide, :text, null: false)
end end
end end
end end

View file

@ -9,7 +9,7 @@ defmodule AshHq.Repo.Migrations.MigrateResources13 do
def up do def up do
alter table(:options) do alter table(:options) do
add :links, :map add(:links, :map)
end end
execute(""" execute("""
@ -203,7 +203,7 @@ defmodule AshHq.Repo.Migrations.MigrateResources13 do
""") """)
alter table(:options) do alter table(:options) do
remove :links remove(:links)
end end
end end
end end

View file

@ -9,61 +9,61 @@ defmodule AshHq.Repo.Migrations.MigrateResources14 do
def up do def up do
alter table(:options) do alter table(:options) do
add :sanitized_name, :text add(:sanitized_name, :text)
end end
alter table(:modules) do alter table(:modules) do
add :sanitized_name, :text add(:sanitized_name, :text)
end end
alter table(:library_versions) do alter table(:library_versions) do
add :sanitized_version, :text add(:sanitized_version, :text)
end end
alter table(:guides) do alter table(:guides) do
add :sanitized_name, :text add(:sanitized_name, :text)
end end
alter table(:functions) do alter table(:functions) do
add :sanitized_name, :text add(:sanitized_name, :text)
end end
alter table(:extensions) do alter table(:extensions) do
add :sanitized_name, :text add(:sanitized_name, :text)
end end
alter table(:dsls) do alter table(:dsls) do
add :sanitized_name, :text add(:sanitized_name, :text)
end end
end end
def down do def down do
alter table(:dsls) do alter table(:dsls) do
remove :sanitized_name remove(:sanitized_name)
end end
alter table(:extensions) do alter table(:extensions) do
remove :sanitized_name remove(:sanitized_name)
end end
alter table(:functions) do alter table(:functions) do
remove :sanitized_name remove(:sanitized_name)
end end
alter table(:guides) do alter table(:guides) do
remove :sanitized_name remove(:sanitized_name)
end end
alter table(:library_versions) do alter table(:library_versions) do
remove :sanitized_version remove(:sanitized_version)
end end
alter table(:modules) do alter table(:modules) do
remove :sanitized_name remove(:sanitized_name)
end end
alter table(:options) do alter table(:options) do
remove :sanitized_name remove(:sanitized_name)
end end
end end
end end

View file

@ -9,61 +9,61 @@ defmodule AshHq.Repo.Migrations.MigrateResources15 do
def up do def up do
alter table(:options) do alter table(:options) do
modify :sanitized_name, :text, null: false modify(:sanitized_name, :text, null: false)
end end
alter table(:modules) do alter table(:modules) do
modify :sanitized_name, :text, null: false modify(:sanitized_name, :text, null: false)
end end
alter table(:library_versions) do alter table(:library_versions) do
modify :sanitized_version, :text, null: false modify(:sanitized_version, :text, null: false)
end end
alter table(:guides) do alter table(:guides) do
modify :sanitized_name, :text, null: false modify(:sanitized_name, :text, null: false)
end end
alter table(:functions) do alter table(:functions) do
modify :sanitized_name, :text, null: false modify(:sanitized_name, :text, null: false)
end end
alter table(:extensions) do alter table(:extensions) do
modify :sanitized_name, :text, null: false modify(:sanitized_name, :text, null: false)
end end
alter table(:dsls) do alter table(:dsls) do
modify :sanitized_name, :text, null: false modify(:sanitized_name, :text, null: false)
end end
end end
def down do def down do
alter table(:dsls) do alter table(:dsls) do
modify :sanitized_name, :text, null: true modify(:sanitized_name, :text, null: true)
end end
alter table(:extensions) do alter table(:extensions) do
modify :sanitized_name, :text, null: true modify(:sanitized_name, :text, null: true)
end end
alter table(:functions) do alter table(:functions) do
modify :sanitized_name, :text, null: true modify(:sanitized_name, :text, null: true)
end end
alter table(:guides) do alter table(:guides) do
modify :sanitized_name, :text, null: true modify(:sanitized_name, :text, null: true)
end end
alter table(:library_versions) do alter table(:library_versions) do
modify :sanitized_version, :text, null: true modify(:sanitized_version, :text, null: true)
end end
alter table(:modules) do alter table(:modules) do
modify :sanitized_name, :text, null: true modify(:sanitized_name, :text, null: true)
end end
alter table(:options) do alter table(:options) do
modify :sanitized_name, :text, null: true modify(:sanitized_name, :text, null: true)
end end
end end
end end

View file

@ -9,27 +9,27 @@ defmodule AshHq.Repo.Migrations.MigrateResources16 do
def up do def up do
alter table(:options) do alter table(:options) do
remove :sanitized_name remove(:sanitized_name)
add :sanitized_path, :text, null: false add(:sanitized_path, :text, null: false)
end end
alter table(:dsls) do alter table(:dsls) do
remove :sanitized_name remove(:sanitized_name)
add :sanitized_path, :text, null: false add(:sanitized_path, :text, null: false)
end end
end end
def down do def down do
alter table(:dsls) do alter table(:dsls) do
remove :sanitized_path remove(:sanitized_path)
add :sanitized_name, :text, null: false add(:sanitized_name, :text, null: false)
end end
alter table(:options) do alter table(:options) do
remove :sanitized_path remove(:sanitized_path)
add :sanitized_name, :text, null: false add(:sanitized_name, :text, null: false)
end end
end end
end end

View file

@ -9,46 +9,48 @@ defmodule AshHq.Repo.Migrations.MigrateResources17 do
def up do def up do
create table(:users, primary_key: false) do create table(:users, primary_key: false) do
add :id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
add :email, :citext, null: false add(:email, :citext, null: false)
add :confirmed_at, :utc_datetime_usec add(:confirmed_at, :utc_datetime_usec)
add :hashed_password, :text add(:hashed_password, :text)
add :created_at, :utc_datetime_usec, null: false, default: fragment("now()") add(:created_at, :utc_datetime_usec, null: false, default: fragment("now()"))
add :updated_at, :utc_datetime_usec, null: false, default: fragment("now()") add(:updated_at, :utc_datetime_usec, null: false, default: fragment("now()"))
end end
create unique_index(:users, [:email], name: "users_unique_email_index") create unique_index(:users, [:email], name: "users_unique_email_index")
create table(:user_tokens, primary_key: false) do create table(:user_tokens, primary_key: false) do
add :id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
add :token, :binary add(:token, :binary)
add :context, :text add(:context, :text)
add :sent_to, :text add(:sent_to, :text)
add :created_at, :utc_datetime_usec, null: false, default: fragment("now()") add(:created_at, :utc_datetime_usec, null: false, default: fragment("now()"))
add :user_id, add(
:user_id,
references(:users, references(:users,
column: :id, column: :id,
name: "user_tokens_user_id_fkey", name: "user_tokens_user_id_fkey",
type: :uuid, type: :uuid,
prefix: "public" prefix: "public"
) )
)
end end
create unique_index(:user_tokens, [:context, :token], name: "user_tokens_token_context_index") create unique_index(:user_tokens, [:context, :token], name: "user_tokens_token_context_index")
end end
def down do def down do
drop_if_exists unique_index(:user_tokens, [:context, :token], drop_if_exists(
name: "user_tokens_token_context_index" unique_index(:user_tokens, [:context, :token], name: "user_tokens_token_context_index")
) )
drop constraint(:user_tokens, "user_tokens_user_id_fkey") drop(constraint(:user_tokens, "user_tokens_user_id_fkey"))
drop table(:user_tokens) drop(table(:user_tokens))
drop_if_exists unique_index(:users, [:email], name: "users_unique_email_index") drop_if_exists(unique_index(:users, [:email], name: "users_unique_email_index"))
drop table(:users) drop(table(:users))
end end
end end

View file

@ -8,10 +8,11 @@ defmodule AshHq.Repo.Migrations.MigrateResources18 do
use Ecto.Migration use Ecto.Migration
def up do def up do
drop constraint(:user_tokens, "user_tokens_user_id_fkey") drop(constraint(:user_tokens, "user_tokens_user_id_fkey"))
alter table(:user_tokens) do alter table(:user_tokens) do
modify :user_id, modify(
:user_id,
references(:users, references(:users,
column: :id, column: :id,
prefix: "public", prefix: "public",
@ -20,20 +21,23 @@ defmodule AshHq.Repo.Migrations.MigrateResources18 do
on_delete: :delete_all, on_delete: :delete_all,
on_update: :update_all on_update: :update_all
) )
)
end end
end end
def down do def down do
drop constraint(:user_tokens, "user_tokens_user_id_fkey") drop(constraint(:user_tokens, "user_tokens_user_id_fkey"))
alter table(:user_tokens) do alter table(:user_tokens) do
modify :user_id, modify(
:user_id,
references(:users, references(:users,
column: :id, column: :id,
prefix: "public", prefix: "public",
name: "user_tokens_user_id_fkey", name: "user_tokens_user_id_fkey",
type: :uuid type: :uuid
) )
)
end end
end end
end end

View file

@ -9,13 +9,13 @@ defmodule AshHq.Repo.Migrations.MigrateResources19 do
def up do def up do
alter table(:guides) do alter table(:guides) do
remove :sanitized_name remove(:sanitized_name)
end end
end end
def down do def down do
alter table(:guides) do alter table(:guides) do
add :sanitized_name, :text, null: false add(:sanitized_name, :text, null: false)
end end
end end
end end

View file

@ -9,13 +9,13 @@ defmodule AshHq.Repo.Migrations.MigrateResources20 do
def up do def up do
alter table(:library_versions) do alter table(:library_versions) do
add :branch, :boolean, null: false, default: false add(:branch, :boolean, null: false, default: false)
end end
end end
def down do def down do
alter table(:library_versions) do alter table(:library_versions) do
remove :branch remove(:branch)
end end
end end
end end

View file

@ -9,23 +9,23 @@ defmodule AshHq.Repo.Migrations.MigrateResources21 do
def up do def up do
alter table(:library_versions) do alter table(:library_versions) do
remove :default_guide remove(:default_guide)
remove :branch remove(:branch)
end end
alter table(:libraries) do alter table(:libraries) do
remove :track_branches remove(:track_branches)
end end
end end
def down do def down do
alter table(:libraries) do alter table(:libraries) do
add :track_branches, {:array, :text} add(:track_branches, {:array, :text})
end end
alter table(:library_versions) do alter table(:library_versions) do
add :branch, :boolean, null: false, default: false add(:branch, :boolean, null: false, default: false)
add :default_guide, :text add(:default_guide, :text)
end end
end end
end end

View file

@ -9,7 +9,7 @@ defmodule AshHq.Repo.Migrations.AddLibraryOrder do
def up do def up do
alter table(:libraries) do alter table(:libraries) do
add :order, :bigint, null: true add(:order, :bigint, null: true)
end end
execute(""" execute("""
@ -18,13 +18,13 @@ defmodule AshHq.Repo.Migrations.AddLibraryOrder do
""") """)
alter table(:libraries) do alter table(:libraries) do
modify :order, :bigint, null: false modify(:order, :bigint, null: false)
end end
end end
def down do def down do
alter table(:libraries) do alter table(:libraries) do
remove :order remove(:order)
end end
end end
end end

View file

@ -12,6 +12,6 @@ defmodule AshHq.Repo.Migrations.MigrateResources22 do
end end
def down do def down do
drop_if_exists unique_index(:libraries, [:order], name: "libraries_unique_order_index") drop_if_exists(unique_index(:libraries, [:order], name: "libraries_unique_order_index"))
end end
end end

View file

@ -9,13 +9,13 @@ defmodule AshHq.Repo.Migrations.MigrateResources23 do
def up do def up do
alter table(:modules) do alter table(:modules) do
remove :category_index remove(:category_index)
end end
end end
def down do def down do
alter table(:modules) do alter table(:modules) do
add :category_index, :bigint, null: false, default: 0 add(:category_index, :bigint, null: false, default: 0)
end end
end end
end end

View file

@ -9,18 +9,18 @@ defmodule AshHq.Repo.Migrations.MigrateResources24 do
def up do def up do
create table(:emails, primary_key: false) do create table(:emails, primary_key: false) do
add :updated_at, :utc_datetime_usec, null: false, default: fragment("now()") add(:updated_at, :utc_datetime_usec, null: false, default: fragment("now()"))
add :inserted_at, :utc_datetime_usec, null: false, default: fragment("now()") add(:inserted_at, :utc_datetime_usec, null: false, default: fragment("now()"))
add :id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
add :email, :citext, null: false add(:email, :citext, null: false)
end end
create unique_index(:emails, [:email], name: "emails_unique_email_index") create unique_index(:emails, [:email], name: "emails_unique_email_index")
end end
def down do def down do
drop_if_exists unique_index(:emails, [:email], name: "emails_unique_email_index") drop_if_exists(unique_index(:emails, [:email], name: "emails_unique_email_index"))
drop table(:emails) drop(table(:emails))
end end
end end

View file

@ -9,71 +9,71 @@ defmodule AshHq.Repo.Migrations.MigrateResources25 do
def up do def up do
alter table(:options) do alter table(:options) do
modify :extension_id, :uuid, null: true modify(:extension_id, :uuid, null: true)
modify :library_version_id, :uuid, null: true modify(:library_version_id, :uuid, null: true)
modify :dsl_id, :uuid, null: true modify(:dsl_id, :uuid, null: true)
end end
alter table(:modules) do alter table(:modules) do
modify :library_version_id, :uuid, null: true modify(:library_version_id, :uuid, null: true)
end end
alter table(:library_versions) do alter table(:library_versions) do
modify :library_id, :uuid, null: true modify(:library_id, :uuid, null: true)
end end
alter table(:guides) do alter table(:guides) do
modify :library_version_id, :uuid, null: true modify(:library_version_id, :uuid, null: true)
end end
alter table(:functions) do alter table(:functions) do
modify :module_id, :uuid, null: true modify(:module_id, :uuid, null: true)
modify :library_version_id, :uuid, null: true modify(:library_version_id, :uuid, null: true)
add :heads_html, {:array, :text} add(:heads_html, {:array, :text})
end end
alter table(:extensions) do alter table(:extensions) do
modify :library_version_id, :uuid, null: true modify(:library_version_id, :uuid, null: true)
end end
alter table(:dsls) do alter table(:dsls) do
modify :extension_id, :uuid, null: true modify(:extension_id, :uuid, null: true)
modify :library_version_id, :uuid, null: true modify(:library_version_id, :uuid, null: true)
end end
end end
def down do def down do
alter table(:dsls) do alter table(:dsls) do
modify :library_version_id, :uuid, null: false modify(:library_version_id, :uuid, null: false)
modify :extension_id, :uuid, null: false modify(:extension_id, :uuid, null: false)
end end
alter table(:extensions) do alter table(:extensions) do
modify :library_version_id, :uuid, null: false modify(:library_version_id, :uuid, null: false)
end end
alter table(:functions) do alter table(:functions) do
remove :heads_html remove(:heads_html)
modify :library_version_id, :uuid, null: false modify(:library_version_id, :uuid, null: false)
modify :module_id, :uuid, null: false modify(:module_id, :uuid, null: false)
end end
alter table(:guides) do alter table(:guides) do
modify :library_version_id, :uuid, null: false modify(:library_version_id, :uuid, null: false)
end end
alter table(:library_versions) do alter table(:library_versions) do
modify :library_id, :uuid, null: false modify(:library_id, :uuid, null: false)
end end
alter table(:modules) do alter table(:modules) do
modify :library_version_id, :uuid, null: false modify(:library_version_id, :uuid, null: false)
end end
alter table(:options) do alter table(:options) do
modify :dsl_id, :uuid, null: false modify(:dsl_id, :uuid, null: false)
modify :library_version_id, :uuid, null: false modify(:library_version_id, :uuid, null: false)
modify :extension_id, :uuid, null: false modify(:extension_id, :uuid, null: false)
end end
end end
end end

View file

@ -12,6 +12,6 @@ defmodule AshHq.Repo.Migrations.MigrateResources27 do
end end
def down do def down do
drop_if_exists unique_index(:libraries, [:name], name: "libraries_unique_name_index") drop_if_exists(unique_index(:libraries, [:name], name: "libraries_unique_name_index"))
end end
end end

View file

@ -0,0 +1,66 @@
defmodule AshHq.Repo.Migrations.MigrateResources28 do
@moduledoc """
Updates resources based on their most recent snapshots.
This file was autogenerated with `mix ash_postgres.generate_migrations`
"""
use Ecto.Migration
def up do
create table(:mix_tasks, primary_key: false) do
add(:sanitized_name, :text, null: false)
add(:id, :uuid, null: false, default: fragment("uuid_generate_v4()"), primary_key: true)
add(:name, :text, null: false)
add(:category, :text, null: false, default: "Misc")
add(:file, :text)
add(:doc, :text, null: false, default: "")
add(:doc_html, :text)
add(:order, :bigint, null: false)
add(
:library_version_id,
references(:library_versions,
column: :id,
name: "mix_tasks_library_version_id_fkey",
type: :uuid,
prefix: "public",
on_delete: :delete_all
)
)
end
execute("""
CREATE INDEX mix_tasks_name_lower_index ON mix_tasks(lower(name));
""")
execute("""
CREATE INDEX mix_tasks_name_trigram_index ON mix_tasks USING GIST (name gist_trgm_ops);
""")
execute("""
CREATE INDEX mix_tasks_search_index ON mix_tasks USING GIN((
setweight(to_tsvector('english', name), 'A') ||
setweight(to_tsvector('english', doc), 'D')
));
""")
end
def down do
execute("""
DROP INDEX mix_tasks_search_index;
""")
execute("""
DROP INDEX mix_tasks_name_trigram_index;
""")
execute("""
DROP INDEX mix_tasks_name_lower_index;
""")
drop(constraint(:mix_tasks, "mix_tasks_library_version_id_fkey"))
drop(table(:mix_tasks))
end
end

View file

@ -0,0 +1,142 @@
{
"attributes": [
{
"allow_nil?": false,
"default": "nil",
"generated?": false,
"primary_key?": false,
"references": null,
"size": null,
"source": "sanitized_name",
"type": "text"
},
{
"allow_nil?": false,
"default": "fragment(\"uuid_generate_v4()\")",
"generated?": false,
"primary_key?": true,
"references": null,
"size": null,
"source": "id",
"type": "uuid"
},
{
"allow_nil?": false,
"default": "nil",
"generated?": false,
"primary_key?": false,
"references": null,
"size": null,
"source": "name",
"type": "text"
},
{
"allow_nil?": false,
"default": "\"Misc\"",
"generated?": false,
"primary_key?": false,
"references": null,
"size": null,
"source": "category",
"type": "text"
},
{
"allow_nil?": true,
"default": "nil",
"generated?": false,
"primary_key?": false,
"references": null,
"size": null,
"source": "file",
"type": "text"
},
{
"allow_nil?": false,
"default": "\"\"",
"generated?": false,
"primary_key?": false,
"references": null,
"size": null,
"source": "doc",
"type": "text"
},
{
"allow_nil?": true,
"default": "nil",
"generated?": false,
"primary_key?": false,
"references": null,
"size": null,
"source": "doc_html",
"type": "text"
},
{
"allow_nil?": false,
"default": "nil",
"generated?": false,
"primary_key?": false,
"references": null,
"size": null,
"source": "order",
"type": "bigint"
},
{
"allow_nil?": true,
"default": "nil",
"generated?": false,
"primary_key?": false,
"references": {
"destination_attribute": "id",
"destination_attribute_default": null,
"destination_attribute_generated": null,
"multitenancy": {
"attribute": null,
"global": null,
"strategy": null
},
"name": "mix_tasks_library_version_id_fkey",
"on_delete": "delete",
"on_update": null,
"schema": "public",
"table": "library_versions"
},
"size": null,
"source": "library_version_id",
"type": "uuid"
}
],
"base_filter": null,
"check_constraints": [],
"custom_indexes": [],
"custom_statements": [
{
"code?": false,
"down": "DROP INDEX mix_tasks_name_lower_index;",
"name": "name_index",
"up": "CREATE INDEX mix_tasks_name_lower_index ON mix_tasks(lower(name));\n"
},
{
"code?": false,
"down": "DROP INDEX mix_tasks_name_trigram_index;",
"name": "trigram_index",
"up": "CREATE INDEX mix_tasks_name_trigram_index ON mix_tasks USING GIST (name gist_trgm_ops);\n"
},
{
"code?": false,
"down": "DROP INDEX mix_tasks_search_index;",
"name": "search_index",
"up": "CREATE INDEX mix_tasks_search_index ON mix_tasks USING GIN((\n setweight(to_tsvector('english', name), 'A') ||\n setweight(to_tsvector('english', doc), 'D')\n));\n"
}
],
"has_create_action": true,
"hash": "F388F84B5CBCF451EC7BF4FFE450D0C3716BDA729376CF2566FF2B92911EC459",
"identities": [],
"multitenancy": {
"attribute": null,
"global": null,
"strategy": null
},
"repo": "Elixir.AshHq.Repo",
"schema": null,
"table": "mix_tasks"
}

View file

@ -316,6 +316,37 @@ defmodule Utils do
} }
end end
def build_mix_task(mix_task, category, order) do
{:docs_v1, _, :elixir, _, docs, _, _} = Code.fetch_docs(mix_task)
module_doc =
case docs do
%{"en" => en} ->
en
_ ->
""
end
module_info =
try do
mix_task.module_info(:compile)
rescue
_ ->
nil
end
file = file(module_info[:source])
%{
name: Mix.Task.task_name(mix_task),
doc: module_doc,
file: file,
order: order,
category: category
}
end
defp file(nil), do: nil defp file(nil), do: nil
defp file(path) do defp file(path) do
@ -395,7 +426,8 @@ case Enum.at(dsls, 0) do
acc = %{ acc = %{
doc: Utils.module_docs(dsl), doc: Utils.module_docs(dsl),
guides: [], guides: [],
modules: [] modules: [],
mix_tasks: []
} }
acc = acc =
@ -419,6 +451,19 @@ case Enum.at(dsls, 0) do
end) end)
end) end)
acc =
Utils.try_apply(fn -> dsl.mix_tasks() end, [])
|> List.wrap()
|> Enum.reduce(acc, fn {category, mix_tasks}, acc ->
mix_tasks
|> Enum.with_index()
|> Enum.reduce(acc, fn {mix_task, order}, acc ->
Map.update!(acc, :mix_tasks, fn mix_tasks ->
[Utils.build_mix_task(mix_task, category, order) | mix_tasks]
end)
end)
end)
data = data =
extensions extensions
|> Enum.with_index() |> Enum.with_index()