feat: list arguments for resource actions in class diagrams (#399)

This commit is contained in:
Ali Ahmed 2022-10-06 00:04:21 -06:00 committed by GitHub
parent 41b4b7fdbb
commit 0b7db5f3fb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 17 deletions

View file

@ -13,6 +13,7 @@ defmodule Ash.Api.Info.Diagram do
@indent " "
@show_private? false
@argument_print_limit 4
@default_opts indent: @indent, show_private?: @show_private?
@ -123,6 +124,28 @@ defmodule Ash.Api.Info.Diagram do
Enum.map_join(list, "\n", fn item -> "#{indent}#{indent}#{template_fn.(item)}" end)
end
defp list_arguments_and_attributes(resource, action) do
arguments = action.arguments
attributes =
case action.type do
:read -> []
_ -> action.accept |> Enum.map(&Ash.Resource.Info.attribute(resource, &1))
end
list_arguments(arguments ++ attributes)
end
defp list_arguments(arguments) when length(arguments) > @argument_print_limit do
{displayed_args, _rest} = Enum.split(arguments, @argument_print_limit)
list_arguments(displayed_args) <> ", ..."
end
defp list_arguments(arguments) do
arguments
|> Enum.map_join(", ", &"#{class_short_type(&1.type)} #{&1.name}")
end
@doc """
Generates a Mermaid Class Diagram for a given API.
@ -163,7 +186,11 @@ defmodule Ash.Api.Info.Diagram do
indent,
&"#{resource_name(&1.destination)}#{if &1.cardinality == :many, do: "[]", else: ""} #{&1.name}"
),
join_template(actions, indent, &"#{&1.name}()")
join_template(
actions,
indent,
&"#{&1.name}(#{list_arguments_and_attributes(resource, &1)})"
)
]
|> Enum.reject(&(&1 == ""))
|> Enum.join("\n")

View file

@ -29,11 +29,11 @@ defmodule Ash.Test.Api.Info.DiagramTest do
String last_name
String email
Org org
destroy()
destroy(UUID id, String first_name, String last_name, String email)
read()
for_org()
create()
update()
for_org(UUID org)
create(UUID org, UUID id, String first_name, String last_name, ...)
update(UUID id, String first_name, String last_name, String email)
approve()
unapprove()
}
@ -41,11 +41,11 @@ defmodule Ash.Test.Api.Info.DiagramTest do
UUID id
String name
User[] users
destroy()
update()
destroy(UUID id, String name)
update(UUID id, String name)
read()
create()
by_name()
create(UUID id, String name)
by_name(String name)
}
Org -- User
@ -86,11 +86,11 @@ defmodule Ash.Test.Api.Info.DiagramTest do
Boolean approved
UUID org_id
Org org
destroy()
destroy(UUID id, String first_name, String last_name, String email)
read()
for_org()
create()
update()
for_org(UUID org)
create(UUID org, UUID id, String first_name, String last_name, ...)
update(UUID id, String first_name, String last_name, String email)
approve()
unapprove()
}
@ -98,11 +98,11 @@ defmodule Ash.Test.Api.Info.DiagramTest do
UUID id
String name
User[] users
destroy()
update()
destroy(UUID id, String name)
update(UUID id, String name)
read()
create()
by_name()
create(UUID id, String name)
by_name(String name)
}
Org -- User