From 98d55f4c1019e160618d5190c05fe56b7823b1f6 Mon Sep 17 00:00:00 2001 From: Matt Beanland Date: Fri, 8 May 2026 21:25:17 +0930 Subject: [PATCH] spark formatter --- .formatter.exs | 53 ++++++---- lib/diffo/provider/assigner/assignment.ex | 1 - lib/diffo/provider/components/entity.ex | 1 - lib/diffo/provider/components/entity_ref.ex | 1 - lib/diffo/provider/components/event.ex | 1 - .../components/external_identifier.ex | 1 - lib/diffo/provider/components/feature.ex | 1 - .../provider/components/instance/extension.ex | 30 ++++-- .../instance/extension/characteristic.ex | 5 +- .../components/instance/extension/party.ex | 17 +++- .../instance/extension/party_declaration.ex | 11 ++- .../persisters/persist_characteristics.ex | 13 ++- .../extension/persisters/persist_features.ex | 13 ++- .../extension/persisters/persist_parties.ex | 13 ++- .../extension/persisters/persist_places.ex | 13 ++- .../persisters/persist_specification.ex | 30 ++++-- .../instance/extension/place_declaration.ex | 11 ++- .../instance/extension/specification.ex | 12 ++- .../transformers/transform_behaviour.ex | 96 +++++++++++-------- .../extension/verifiers/verify_behaviour.ex | 37 ++++--- .../extension/verifiers/verify_features.ex | 6 +- .../extension/verifiers/verify_parties.ex | 3 +- .../verifiers/verify_specification.ex | 36 ++++--- .../provider/components/instance/util.ex | 1 - lib/diffo/provider/components/note.ex | 1 - .../extension/persisters/persist_instances.ex | 13 ++- .../extension/persisters/persist_parties.ex | 13 ++- .../extension/persisters/persist_places.ex | 13 ++- .../party/extension/verifiers/verify_roles.ex | 63 ++++++++---- lib/diffo/provider/components/party_ref.ex | 1 - .../extension/persisters/persist_instances.ex | 13 ++- .../extension/persisters/persist_parties.ex | 13 ++- .../extension/persisters/persist_places.ex | 13 ++- .../place/extension/verifiers/verify_roles.ex | 63 ++++++++---- lib/diffo/provider/components/place_ref.ex | 1 - .../provider/components/process_status.ex | 1 - .../provider/components/specification.ex | 14 ++- lib/diffo/type/value.ex | 12 ++- mix.exs | 2 +- test/instance_extension/party_test.exs | 25 +++-- test/instance_extension/place_test.exs | 35 +++---- test/instance_extension/transformer_test.exs | 5 +- test/provider/place_test.exs | 3 +- test/provider/versioning_test.exs | 60 ++++++++---- test/support/resource/carrier.ex | 30 +++--- test/support/resource/exchange_building.ex | 32 +++---- 46 files changed, 554 insertions(+), 278 deletions(-) diff --git a/.formatter.exs b/.formatter.exs index a6a9c7d..c0ee74e 100644 --- a/.formatter.exs +++ b/.formatter.exs @@ -3,33 +3,46 @@ # SPDX-License-Identifier: MIT # Used by "mix format" -locals_without_parens = [ - id: 1, +spark_locals_without_parens = [ + calculate: 1, category: 1, - is_enabled?: 1, characteristic: 2, - pick: 1, - rename: 1, - field: 3, - expect: 1, - relate: 1, - guard: 1, - customize: 1, - order: 1, - initial_states: 1, - default_initial_state: 1, - state_attribute: 1, - transition: 1, - compact: 1, - label: 1 + characteristic: 3, + constraints: 1, + create: 1, + create: 2, + description: 1, + feature: 1, + feature: 2, + id: 1, + is_enabled?: 1, + major_version: 1, + minor_version: 1, + name: 1, + parties: 2, + parties: 3, + party: 2, + party: 3, + patch_version: 1, + place: 2, + place: 3, + places: 2, + places: 3, + reference: 1, + role: 2, + role: 3, + tmf_version: 1, + type: 1, + update: 1, + update: 2 ] [ plugins: [Spark.Formatter], inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"], - import_deps: [:ash], - locals_without_parens: locals_without_parens, + import_deps: [:ash, :ash_jason, :ash_neo4j, :ash_outstanding, :ash_state_machine], + locals_without_parens: spark_locals_without_parens, export: [ - locals_without_parens: locals_without_parens + locals_without_parens: spark_locals_without_parens ] ] diff --git a/lib/diffo/provider/assigner/assignment.ex b/lib/diffo/provider/assigner/assignment.ex index 9f34ea0..a2cb1d1 100644 --- a/lib/diffo/provider/assigner/assignment.ex +++ b/lib/diffo/provider/assigner/assignment.ex @@ -42,5 +42,4 @@ defmodule Diffo.Provider.Assignment do inspect(struct) end end - end diff --git a/lib/diffo/provider/components/entity.ex b/lib/diffo/provider/components/entity.ex index ab9a017..35477c2 100644 --- a/lib/diffo/provider/components/entity.ex +++ b/lib/diffo/provider/components/entity.ex @@ -140,5 +140,4 @@ defmodule Diffo.Provider.Entity do preparations do prepare build(sort: [id: :asc]) end - end diff --git a/lib/diffo/provider/components/entity_ref.ex b/lib/diffo/provider/components/entity_ref.ex index 8d09ff3..f2ec7af 100644 --- a/lib/diffo/provider/components/entity_ref.ex +++ b/lib/diffo/provider/components/entity_ref.ex @@ -121,5 +121,4 @@ defmodule Diffo.Provider.EntityRef do preparations do prepare build(load: [:entity], sort: [created_at: :desc]) end - end diff --git a/lib/diffo/provider/components/event.ex b/lib/diffo/provider/components/event.ex index 1ec9167..11edcd5 100644 --- a/lib/diffo/provider/components/event.ex +++ b/lib/diffo/provider/components/event.ex @@ -153,5 +153,4 @@ defmodule Diffo.Provider.Event do Diffo.Util.to_iso8601(record.created_at) ) end - end diff --git a/lib/diffo/provider/components/external_identifier.ex b/lib/diffo/provider/components/external_identifier.ex index 4bd7702..5ee72d3 100644 --- a/lib/diffo/provider/components/external_identifier.ex +++ b/lib/diffo/provider/components/external_identifier.ex @@ -144,5 +144,4 @@ defmodule Diffo.Provider.ExternalIdentifier do preparations do prepare build(load: [:owner], sort: [created_at: :desc]) end - end diff --git a/lib/diffo/provider/components/feature.ex b/lib/diffo/provider/components/feature.ex index 505c72b..5fc2cc4 100644 --- a/lib/diffo/provider/components/feature.ex +++ b/lib/diffo/provider/components/feature.ex @@ -135,5 +135,4 @@ defmodule Diffo.Provider.Feature do preparations do prepare build(load: [:characteristics], sort: [name: :asc]) end - end diff --git a/lib/diffo/provider/components/instance/extension.ex b/lib/diffo/provider/components/instance/extension.ex index 0c8fd74..9fc716c 100644 --- a/lib/diffo/provider/components/instance/extension.ex +++ b/lib/diffo/provider/components/instance/extension.ex @@ -61,7 +61,8 @@ defmodule Diffo.Provider.Instance.Extension do schema: [ id: [ type: :string, - doc: "The id of the specification, a uuid4 the same in all environments, unique for name and major_version.", + doc: + "The id of the specification, a uuid4 the same in all environments, unique for name and major_version.", required: true ], name: [ @@ -114,7 +115,8 @@ defmodule Diffo.Provider.Instance.Extension do required: true ], value_type: [ - doc: "The type of the characteristic's value. An atom module name such as an Ash.TypedStruct for a scalar value, or `{:array, module}` for an array of values of that type.", + doc: + "The type of the characteristic's value. An atom module name such as an Ash.TypedStruct for a scalar value, or `{:array, module}` for an array of values of that type.", type: :any ] ] @@ -182,11 +184,13 @@ defmodule Diffo.Provider.Instance.Extension do required: true ], party_type: [ - doc: "The module of the Party kind. An atom module name such as a BaseParty-derived resource.", + doc: + "The module of the Party kind. An atom module name such as a BaseParty-derived resource.", type: :any ], reference: [ - doc: "If true, no direct PartyRef edge is created; the party is reachable by graph traversal.", + doc: + "If true, no direct PartyRef edge is created; the party is reachable by graph traversal.", type: :boolean, default: false ], @@ -215,7 +219,8 @@ defmodule Diffo.Provider.Instance.Extension do @party_schema ++ [ constraints: [ - doc: "Multiplicity constraints on the number of parties in this role, e.g. [min: 1, max: 3]", + doc: + "Multiplicity constraints on the number of parties in this role, e.g. [min: 1, max: 3]", type: :keyword_list ] ] @@ -247,7 +252,8 @@ defmodule Diffo.Provider.Instance.Extension do type: :any ], reference: [ - doc: "If true, no direct PlaceRef edge is created; the place is reachable by graph traversal.", + doc: + "If true, no direct PlaceRef edge is created; the place is reachable by graph traversal.", type: :boolean, default: false ], @@ -276,7 +282,8 @@ defmodule Diffo.Provider.Instance.Extension do @place_schema ++ [ constraints: [ - doc: "Multiplicity constraints on the number of places in this role, e.g. [min: 1, max: 3]", + doc: + "Multiplicity constraints on the number of places in this role, e.g. [min: 1, max: 3]", type: :keyword_list ] ] @@ -299,7 +306,8 @@ defmodule Diffo.Provider.Instance.Extension do @structure %Spark.Dsl.Section{ name: :structure, - describe: "Defines the structural shape of the Instance — its specification, characteristics, features, parties, and places", + describe: + "Defines the structural shape of the Instance — its specification, characteristics, features, parties, and places", examples: [ """ structure do @@ -330,7 +338,8 @@ defmodule Diffo.Provider.Instance.Extension do @action_create %Spark.Dsl.Entity{ name: :create, - describe: "Marks a create action for instance build wiring, injecting :specified_by, :features, and :characteristics arguments", + describe: + "Marks a create action for instance build wiring, injecting :specified_by, :features, and :characteristics arguments", target: Diffo.Provider.Instance.Extension.ActionCreate, args: [:name], schema: [ @@ -372,7 +381,8 @@ defmodule Diffo.Provider.Instance.Extension do @behaviour_section %Spark.Dsl.Section{ name: :behaviour, - describe: "Defines the behavioural wiring for the Instance — actions, and in future triggers and tasks", + describe: + "Defines the behavioural wiring for the Instance — actions, and in future triggers and tasks", examples: [ """ behaviour do diff --git a/lib/diffo/provider/components/instance/extension/characteristic.ex b/lib/diffo/provider/components/instance/extension/characteristic.ex index 92226d3..b746dfc 100644 --- a/lib/diffo/provider/components/instance/extension/characteristic.ex +++ b/lib/diffo/provider/components/instance/extension/characteristic.ex @@ -66,7 +66,10 @@ defmodule Diffo.Provider.Instance.Characteristic do def relate_instance(result, changeset) when is_struct(result) and is_struct(changeset, Ash.Changeset) do characteristics = Ash.Changeset.get_argument(changeset, :characteristics) - Provider.relate_instance_characteristics(%Instance{id: result.id}, %{characteristics: characteristics}) + + Provider.relate_instance_characteristics(%Instance{id: result.id}, %{ + characteristics: characteristics + }) end @doc """ diff --git a/lib/diffo/provider/components/instance/extension/party.ex b/lib/diffo/provider/components/instance/extension/party.ex index 26bb9b4..7a9b800 100644 --- a/lib/diffo/provider/components/instance/extension/party.ex +++ b/lib/diffo/provider/components/instance/extension/party.ex @@ -17,6 +17,7 @@ defmodule Diffo.Provider.Instance.Party do changeset else parties = Ash.Changeset.get_argument(changeset, :parties) || [] + changeset |> validate_roles(parties, declarations) |> validate_constraints(parties, declarations) @@ -55,15 +56,23 @@ defmodule Diffo.Provider.Instance.Party do defp check_min(cs, _role, _count, nil), do: cs defp check_min(cs, _role, count, min) when count >= min, do: cs + defp check_min(cs, role, count, min), - do: Ash.Changeset.add_error(cs, field: :parties, - message: "role #{inspect(role)} requires at least #{min} (got #{count})") + do: + Ash.Changeset.add_error(cs, + field: :parties, + message: "role #{inspect(role)} requires at least #{min} (got #{count})" + ) defp check_max(cs, _role, _count, nil), do: cs defp check_max(cs, _role, count, max) when count <= max, do: cs + defp check_max(cs, role, count, max), - do: Ash.Changeset.add_error(cs, field: :parties, - message: "role #{inspect(role)} allows at most #{max} (got #{count})") + do: + Ash.Changeset.add_error(cs, + field: :parties, + message: "role #{inspect(role)} allows at most #{max} (got #{count})" + ) @doc """ Relates the parties in the changeset with the Extended Instance by creating party_ref diff --git a/lib/diffo/provider/components/instance/extension/party_declaration.ex b/lib/diffo/provider/components/instance/extension/party_declaration.ex index e1cff0c..45194e2 100644 --- a/lib/diffo/provider/components/instance/extension/party_declaration.ex +++ b/lib/diffo/provider/components/instance/extension/party_declaration.ex @@ -6,8 +6,15 @@ defmodule Diffo.Provider.Instance.Extension.PartyDeclaration do @moduledoc """ PartyDeclaration - DSL entity declaring a party role on an Instance """ - defstruct [:role, :party_type, :multiple, :reference, :calculate, :constraints, - __spark_metadata__: nil] + defstruct [ + :role, + :party_type, + :multiple, + :reference, + :calculate, + :constraints, + __spark_metadata__: nil + ] defimpl String.Chars do def to_string(struct), do: inspect(struct) diff --git a/lib/diffo/provider/components/instance/extension/persisters/persist_characteristics.ex b/lib/diffo/provider/components/instance/extension/persisters/persist_characteristics.ex index e622fcc..2266fa1 100644 --- a/lib/diffo/provider/components/instance/extension/persisters/persist_characteristics.ex +++ b/lib/diffo/provider/components/instance/extension/persisters/persist_characteristics.ex @@ -13,9 +13,14 @@ defmodule Diffo.Provider.Instance.Extension.Persisters.PersistCharacteristics do escaped = Macro.escape(declarations) dsl_state = Transformer.persist(dsl_state, :characteristics, declarations) - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def characteristics, do: unquote(escaped) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def characteristics, do: unquote(escaped) + end + )} end end diff --git a/lib/diffo/provider/components/instance/extension/persisters/persist_features.ex b/lib/diffo/provider/components/instance/extension/persisters/persist_features.ex index 53fd427..3cf3414 100644 --- a/lib/diffo/provider/components/instance/extension/persisters/persist_features.ex +++ b/lib/diffo/provider/components/instance/extension/persisters/persist_features.ex @@ -13,9 +13,14 @@ defmodule Diffo.Provider.Instance.Extension.Persisters.PersistFeatures do escaped = Macro.escape(declarations) dsl_state = Transformer.persist(dsl_state, :features, declarations) - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def features, do: unquote(escaped) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def features, do: unquote(escaped) + end + )} end end diff --git a/lib/diffo/provider/components/instance/extension/persisters/persist_parties.ex b/lib/diffo/provider/components/instance/extension/persisters/persist_parties.ex index ff25478..3278630 100644 --- a/lib/diffo/provider/components/instance/extension/persisters/persist_parties.ex +++ b/lib/diffo/provider/components/instance/extension/persisters/persist_parties.ex @@ -13,9 +13,14 @@ defmodule Diffo.Provider.Instance.Extension.Persisters.PersistParties do escaped = Macro.escape(declarations) dsl_state = Transformer.persist(dsl_state, :parties, declarations) - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def parties, do: unquote(escaped) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def parties, do: unquote(escaped) + end + )} end end diff --git a/lib/diffo/provider/components/instance/extension/persisters/persist_places.ex b/lib/diffo/provider/components/instance/extension/persisters/persist_places.ex index ec90dd6..4295061 100644 --- a/lib/diffo/provider/components/instance/extension/persisters/persist_places.ex +++ b/lib/diffo/provider/components/instance/extension/persisters/persist_places.ex @@ -13,9 +13,14 @@ defmodule Diffo.Provider.Instance.Extension.Persisters.PersistPlaces do escaped = Macro.escape(declarations) dsl_state = Transformer.persist(dsl_state, :places, declarations) - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def places, do: unquote(escaped) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def places, do: unquote(escaped) + end + )} end end diff --git a/lib/diffo/provider/components/instance/extension/persisters/persist_specification.ex b/lib/diffo/provider/components/instance/extension/persisters/persist_specification.ex index b5f6a1b..db87d31 100644 --- a/lib/diffo/provider/components/instance/extension/persisters/persist_specification.ex +++ b/lib/diffo/provider/components/instance/extension/persisters/persist_specification.ex @@ -12,10 +12,19 @@ defmodule Diffo.Provider.Instance.Extension.Persisters.PersistSpecification do spec = [ id: Transformer.get_option(dsl_state, [:structure, :specification], :id), name: Transformer.get_option(dsl_state, [:structure, :specification], :name), - type: Transformer.get_option(dsl_state, [:structure, :specification], :type, :serviceSpecification), - major_version: Transformer.get_option(dsl_state, [:structure, :specification], :major_version, 1), - minor_version: Transformer.get_option(dsl_state, [:structure, :specification], :minor_version), - patch_version: Transformer.get_option(dsl_state, [:structure, :specification], :patch_version), + type: + Transformer.get_option( + dsl_state, + [:structure, :specification], + :type, + :serviceSpecification + ), + major_version: + Transformer.get_option(dsl_state, [:structure, :specification], :major_version, 1), + minor_version: + Transformer.get_option(dsl_state, [:structure, :specification], :minor_version), + patch_version: + Transformer.get_option(dsl_state, [:structure, :specification], :patch_version), tmf_version: Transformer.get_option(dsl_state, [:structure, :specification], :tmf_version), description: Transformer.get_option(dsl_state, [:structure, :specification], :description), category: Transformer.get_option(dsl_state, [:structure, :specification], :category) @@ -24,9 +33,14 @@ defmodule Diffo.Provider.Instance.Extension.Persisters.PersistSpecification do escaped = Macro.escape(spec) dsl_state = Transformer.persist(dsl_state, :specification, spec) - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def specification, do: unquote(escaped) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def specification, do: unquote(escaped) + end + )} end end diff --git a/lib/diffo/provider/components/instance/extension/place_declaration.ex b/lib/diffo/provider/components/instance/extension/place_declaration.ex index 1d53d72..3469946 100644 --- a/lib/diffo/provider/components/instance/extension/place_declaration.ex +++ b/lib/diffo/provider/components/instance/extension/place_declaration.ex @@ -6,8 +6,15 @@ defmodule Diffo.Provider.Instance.Extension.PlaceDeclaration do @moduledoc """ PlaceDeclaration - DSL entity declaring a place role on an Instance """ - defstruct [:role, :place_type, :multiple, :reference, :calculate, :constraints, - __spark_metadata__: nil] + defstruct [ + :role, + :place_type, + :multiple, + :reference, + :calculate, + :constraints, + __spark_metadata__: nil + ] defimpl String.Chars do def to_string(struct), do: inspect(struct) diff --git a/lib/diffo/provider/components/instance/extension/specification.ex b/lib/diffo/provider/components/instance/extension/specification.ex index 3691d09..25f892b 100644 --- a/lib/diffo/provider/components/instance/extension/specification.ex +++ b/lib/diffo/provider/components/instance/extension/specification.ex @@ -12,7 +12,17 @@ defmodule Diffo.Provider.Instance.Specification do @doc """ Struct for a Specification """ - defstruct [:id, :name, :type, :major_version, :minor_version, :patch_version, :tmf_version, :description, :category] + defstruct [ + :id, + :name, + :type, + :major_version, + :minor_version, + :patch_version, + :tmf_version, + :description, + :category + ] @doc """ Sets the specified_by argument in the changeset, ensuring the Extended Instance's specification exists diff --git a/lib/diffo/provider/components/instance/extension/transformers/transform_behaviour.ex b/lib/diffo/provider/components/instance/extension/transformers/transform_behaviour.ex index aac21c2..0064f9f 100644 --- a/lib/diffo/provider/components/instance/extension/transformers/transform_behaviour.ex +++ b/lib/diffo/provider/components/instance/extension/transformers/transform_behaviour.ex @@ -22,50 +22,59 @@ defmodule Diffo.Provider.Instance.Extension.Transformers.TransformBehaviour do {build_before_body, build_after_body} = if spec[:id] do - before_body = quote do - changeset - |> Diffo.Provider.Instance.Specification.set_specified_by_argument(specification()) - |> Diffo.Provider.Instance.Feature.set_features_argument(features()) - |> Diffo.Provider.Instance.Characteristic.set_characteristics_argument(characteristics()) - |> Diffo.Provider.Instance.Party.validate_parties(parties()) - end - - after_body = quote do - Diffo.Provider.Instance.ActionHelper.build_after(changeset, result) - end + before_body = + quote do + changeset + |> Diffo.Provider.Instance.Specification.set_specified_by_argument(specification()) + |> Diffo.Provider.Instance.Feature.set_features_argument(features()) + |> Diffo.Provider.Instance.Characteristic.set_characteristics_argument( + characteristics() + ) + |> Diffo.Provider.Instance.Party.validate_parties(parties()) + end + + after_body = + quote do + Diffo.Provider.Instance.ActionHelper.build_after(changeset, result) + end {before_body, after_body} else {quote(do: changeset), quote(do: {:ok, result})} end - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def build_before(changeset), do: unquote(build_before_body) - - @doc false - def build_after(changeset, result), do: unquote(build_after_body) - - @doc false - def characteristic(name), do: Enum.find(characteristics(), &(&1.name == name)) - - @doc false - def feature(name), do: Enum.find(features(), &(&1.name == name)) - - @doc false - def feature_characteristic(feature_name, char_name) do - case feature(feature_name) do - nil -> nil - f -> Enum.find(f.characteristics, &(&1.name == char_name)) - end - end - - @doc false - def party(role), do: Enum.find(parties(), &(&1.role == role)) - - @doc false - def place(role), do: Enum.find(places(), &(&1.role == role)) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def build_before(changeset), do: unquote(build_before_body) + + @doc false + def build_after(changeset, result), do: unquote(build_after_body) + + @doc false + def characteristic(name), do: Enum.find(characteristics(), &(&1.name == name)) + + @doc false + def feature(name), do: Enum.find(features(), &(&1.name == name)) + + @doc false + def feature_characteristic(feature_name, char_name) do + case feature(feature_name) do + nil -> nil + f -> Enum.find(f.characteristics, &(&1.name == char_name)) + end + end + + @doc false + def party(role), do: Enum.find(parties(), &(&1.role == role)) + + @doc false + def place(role), do: Enum.find(places(), &(&1.role == role)) + end + )} end defp inject_create_arguments(dsl_state) do @@ -73,7 +82,8 @@ defmodule Diffo.Provider.Instance.Extension.Transformers.TransformBehaviour do Transformer.get_entities(dsl_state, [:behaviour, :actions]) |> Enum.filter(&is_struct(&1, ActionCreate)) - Enum.reduce(action_create_declarations, dsl_state, fn %ActionCreate{name: action_name}, dsl_state -> + Enum.reduce(action_create_declarations, dsl_state, fn %ActionCreate{name: action_name}, + dsl_state -> action = Transformer.get_entities(dsl_state, [:actions]) |> Enum.find(&(is_struct(&1, Ash.Resource.Actions.Create) and &1.name == action_name)) @@ -85,10 +95,16 @@ defmodule Diffo.Provider.Instance.Extension.Transformers.TransformBehaviour do @build_args |> Enum.reject(fn {name, _} -> MapSet.member?(existing, name) end) |> Enum.map(fn {name, type} -> - %Ash.Resource.Actions.Argument{name: name, type: type, public?: false, allow_nil?: true} + %Ash.Resource.Actions.Argument{ + name: name, + type: type, + public?: false, + allow_nil?: true + } end) updated = %{action | arguments: action.arguments ++ new_args} + Transformer.replace_entity(dsl_state, [:actions], updated, fn entity -> is_struct(entity, Ash.Resource.Actions.Create) and entity.name == action_name end) diff --git a/lib/diffo/provider/components/instance/extension/verifiers/verify_behaviour.ex b/lib/diffo/provider/components/instance/extension/verifiers/verify_behaviour.ex index 7cc10db..4196362 100644 --- a/lib/diffo/provider/components/instance/extension/verifiers/verify_behaviour.ex +++ b/lib/diffo/provider/components/instance/extension/verifiers/verify_behaviour.ex @@ -17,8 +17,15 @@ defmodule Diffo.Provider.Instance.Extension.Verifiers.VerifyBehaviour do behaviour_actions = Verifier.get_entities(dsl_state, [:behaviour, :actions]) ash_actions = Verifier.get_entities(dsl_state, [:actions]) - create_names = ash_actions |> Enum.filter(&is_struct(&1, Ash.Resource.Actions.Create)) |> MapSet.new(& &1.name) - update_names = ash_actions |> Enum.filter(&is_struct(&1, Ash.Resource.Actions.Update)) |> MapSet.new(& &1.name) + create_names = + ash_actions + |> Enum.filter(&is_struct(&1, Ash.Resource.Actions.Create)) + |> MapSet.new(& &1.name) + + update_names = + ash_actions + |> Enum.filter(&is_struct(&1, Ash.Resource.Actions.Update)) + |> MapSet.new(& &1.name) errors = Enum.flat_map(behaviour_actions, fn @@ -26,22 +33,28 @@ defmodule Diffo.Provider.Instance.Extension.Verifiers.VerifyBehaviour do if MapSet.member?(create_names, name) do [] else - [DslError.exception( - module: resource, - path: [:behaviour, :actions], - message: "behaviour: create #{inspect(name)} does not exist as a create action on this resource" - )] + [ + DslError.exception( + module: resource, + path: [:behaviour, :actions], + message: + "behaviour: create #{inspect(name)} does not exist as a create action on this resource" + ) + ] end %ActionUpdate{name: name} -> if MapSet.member?(update_names, name) do [] else - [DslError.exception( - module: resource, - path: [:behaviour, :actions], - message: "behaviour: update #{inspect(name)} does not exist as an update action on this resource" - )] + [ + DslError.exception( + module: resource, + path: [:behaviour, :actions], + message: + "behaviour: update #{inspect(name)} does not exist as an update action on this resource" + ) + ] end end) diff --git a/lib/diffo/provider/components/instance/extension/verifiers/verify_features.ex b/lib/diffo/provider/components/instance/extension/verifiers/verify_features.ex index d85e65f..424731b 100644 --- a/lib/diffo/provider/components/instance/extension/verifiers/verify_features.ex +++ b/lib/diffo/provider/components/instance/extension/verifiers/verify_features.ex @@ -36,7 +36,8 @@ defmodule Diffo.Provider.Instance.Extension.Verifiers.VerifyFeatures do DslError.exception( module: resource, path: [:structure, :features, feature.name, :characteristics], - message: "features: characteristic name #{inspect(name)} is declared more than once in #{inspect(feature.name)}" + message: + "features: characteristic name #{inspect(name)} is declared more than once in #{inspect(feature.name)}" ) end) @@ -50,7 +51,8 @@ defmodule Diffo.Provider.Instance.Extension.Verifiers.VerifyFeatures do DslError.exception( module: resource, path: [:structure, :features, feature.name, :characteristics, char.name], - message: "features: characteristic value_type #{inspect(module)} does not exist" + message: + "features: characteristic value_type #{inspect(module)} does not exist" ) | inner_acc ] diff --git a/lib/diffo/provider/components/instance/extension/verifiers/verify_parties.ex b/lib/diffo/provider/components/instance/extension/verifiers/verify_parties.ex index 63bd593..67de82b 100644 --- a/lib/diffo/provider/components/instance/extension/verifiers/verify_parties.ex +++ b/lib/diffo/provider/components/instance/extension/verifiers/verify_parties.ex @@ -48,7 +48,8 @@ defmodule Diffo.Provider.Instance.Extension.Verifiers.VerifyParties do DslError.exception( module: resource, path: [:structure, :parties, party.role], - message: "parties: party_type #{inspect(party.party_type)} does not extend BaseParty" + message: + "parties: party_type #{inspect(party.party_type)} does not extend BaseParty" ) | acc ] diff --git a/lib/diffo/provider/components/instance/extension/verifiers/verify_specification.ex b/lib/diffo/provider/components/instance/extension/verifiers/verify_specification.ex index c5d6621..4902596 100644 --- a/lib/diffo/provider/components/instance/extension/verifiers/verify_specification.ex +++ b/lib/diffo/provider/components/instance/extension/verifiers/verify_specification.ex @@ -10,7 +10,16 @@ defmodule Diffo.Provider.Instance.Extension.Verifiers.VerifySpecification do alias Spark.Error.DslError # Fields validated against Specification attribute constraints (id handled separately) - @spec_fields [:name, :type, :major_version, :minor_version, :patch_version, :tmf_version, :description, :category] + @spec_fields [ + :name, + :type, + :major_version, + :minor_version, + :patch_version, + :tmf_version, + :description, + :category + ] @impl true def verify(dsl_state) do @@ -28,11 +37,13 @@ defmodule Diffo.Provider.Instance.Extension.Verifiers.VerifySpecification do spec_id = Verifier.get_option(dsl_state, [:structure, :specification], :id) if spec_id && !Diffo.Uuid.uuid4?(spec_id) do - [DslError.exception( - module: resource, - path: [:structure, :specification, :id], - message: "specification: id must be a valid UUID4" - )] + [ + DslError.exception( + module: resource, + path: [:structure, :specification, :id], + message: "specification: id must be a valid UUID4" + ) + ] else [] end @@ -53,11 +64,13 @@ defmodule Diffo.Provider.Instance.Extension.Verifiers.VerifySpecification do [] {:error, errors} -> - [DslError.exception( - module: resource, - path: [:structure, :specification, field], - message: "specification: #{field} - #{format_errors(errors)}" - )] + [ + DslError.exception( + module: resource, + path: [:structure, :specification, field], + message: "specification: #{field} - #{format_errors(errors)}" + ) + ] end else [] @@ -75,6 +88,7 @@ defmodule Diffo.Provider.Instance.Extension.Verifiers.VerifySpecification do defp format_error(kwlist) do {message, bindings} = Keyword.pop(kwlist, :message, "invalid value") + Enum.reduce(bindings, message, fn {key, val}, msg -> String.replace(msg, "%{#{key}}", to_string(val)) end) diff --git a/lib/diffo/provider/components/instance/util.ex b/lib/diffo/provider/components/instance/util.ex index ad5a604..3092cf2 100644 --- a/lib/diffo/provider/components/instance/util.ex +++ b/lib/diffo/provider/components/instance/util.ex @@ -180,5 +180,4 @@ defmodule Diffo.Provider.Instance.Util do _ -> nil end end - end diff --git a/lib/diffo/provider/components/note.ex b/lib/diffo/provider/components/note.ex index 7cc4aaf..16747bd 100644 --- a/lib/diffo/provider/components/note.ex +++ b/lib/diffo/provider/components/note.ex @@ -148,5 +148,4 @@ defmodule Diffo.Provider.Note do preparations do prepare build(load: [:author], sort: [timestamp: :desc]) end - end diff --git a/lib/diffo/provider/components/party/extension/persisters/persist_instances.ex b/lib/diffo/provider/components/party/extension/persisters/persist_instances.ex index 49823d1..364b19c 100644 --- a/lib/diffo/provider/components/party/extension/persisters/persist_instances.ex +++ b/lib/diffo/provider/components/party/extension/persisters/persist_instances.ex @@ -13,9 +13,14 @@ defmodule Diffo.Provider.Party.Extension.Persisters.PersistInstances do escaped = Macro.escape(declarations) dsl_state = Transformer.persist(dsl_state, :instances, declarations) - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def instances, do: unquote(escaped) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def instances, do: unquote(escaped) + end + )} end end diff --git a/lib/diffo/provider/components/party/extension/persisters/persist_parties.ex b/lib/diffo/provider/components/party/extension/persisters/persist_parties.ex index f6e6590..943c332 100644 --- a/lib/diffo/provider/components/party/extension/persisters/persist_parties.ex +++ b/lib/diffo/provider/components/party/extension/persisters/persist_parties.ex @@ -13,9 +13,14 @@ defmodule Diffo.Provider.Party.Extension.Persisters.PersistParties do escaped = Macro.escape(declarations) dsl_state = Transformer.persist(dsl_state, :parties, declarations) - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def parties, do: unquote(escaped) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def parties, do: unquote(escaped) + end + )} end end diff --git a/lib/diffo/provider/components/party/extension/persisters/persist_places.ex b/lib/diffo/provider/components/party/extension/persisters/persist_places.ex index 453b1de..6a83be1 100644 --- a/lib/diffo/provider/components/party/extension/persisters/persist_places.ex +++ b/lib/diffo/provider/components/party/extension/persisters/persist_places.ex @@ -13,9 +13,14 @@ defmodule Diffo.Provider.Party.Extension.Persisters.PersistPlaces do escaped = Macro.escape(declarations) dsl_state = Transformer.persist(dsl_state, :places, declarations) - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def places, do: unquote(escaped) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def places, do: unquote(escaped) + end + )} end end diff --git a/lib/diffo/provider/components/party/extension/verifiers/verify_roles.ex b/lib/diffo/provider/components/party/extension/verifiers/verify_roles.ex index d2bdba5..050c4c1 100644 --- a/lib/diffo/provider/components/party/extension/verifiers/verify_roles.ex +++ b/lib/diffo/provider/components/party/extension/verifiers/verify_roles.ex @@ -17,12 +17,36 @@ defmodule Diffo.Provider.Party.Extension.Verifiers.VerifyRoles do resource = Verifier.get_persisted(dsl_state, :module) errors = - check_section(dsl_state, [:instances], :party_type, &InstanceInfo.instance?/1, - "instances", "instance_type", "BaseInstance", resource) ++ - check_section(dsl_state, [:parties], :party_type, &PartyInfo.party?/1, - "parties", "party_type", "BaseParty", resource) ++ - check_section(dsl_state, [:places], :place_type, &PlaceInfo.place?/1, - "places", "place_type", "BasePlace", resource) + check_section( + dsl_state, + [:instances], + :party_type, + &InstanceInfo.instance?/1, + "instances", + "instance_type", + "BaseInstance", + resource + ) ++ + check_section( + dsl_state, + [:parties], + :party_type, + &PartyInfo.party?/1, + "parties", + "party_type", + "BaseParty", + resource + ) ++ + check_section( + dsl_state, + [:places], + :place_type, + &PlaceInfo.place?/1, + "places", + "place_type", + "BasePlace", + resource + ) case errors do [] -> :ok @@ -32,6 +56,7 @@ defmodule Diffo.Provider.Party.Extension.Verifiers.VerifyRoles do defp check_section(dsl_state, path, type_field, type_check?, section, field, base, resource) do entities = Verifier.get_entities(dsl_state, path) + duplicate_errors(entities, section, resource) ++ type_errors(entities, type_field, type_check?, section, field, base, resource) end @@ -58,18 +83,24 @@ defmodule Diffo.Provider.Party.Extension.Verifiers.VerifyRoles do acc !Code.ensure_loaded?(mod) -> - [DslError.exception( - module: resource, - path: [String.to_atom(section)], - message: "#{section}: #{field} #{inspect(mod)} does not exist" - ) | acc] + [ + DslError.exception( + module: resource, + path: [String.to_atom(section)], + message: "#{section}: #{field} #{inspect(mod)} does not exist" + ) + | acc + ] !type_check?.(mod) -> - [DslError.exception( - module: resource, - path: [String.to_atom(section)], - message: "#{section}: #{field} #{inspect(mod)} does not extend #{base}" - ) | acc] + [ + DslError.exception( + module: resource, + path: [String.to_atom(section)], + message: "#{section}: #{field} #{inspect(mod)} does not extend #{base}" + ) + | acc + ] true -> acc diff --git a/lib/diffo/provider/components/party_ref.ex b/lib/diffo/provider/components/party_ref.ex index 1d041df..b5569c9 100644 --- a/lib/diffo/provider/components/party_ref.ex +++ b/lib/diffo/provider/components/party_ref.ex @@ -200,5 +200,4 @@ defmodule Diffo.Provider.PartyRef do result end end - end diff --git a/lib/diffo/provider/components/place/extension/persisters/persist_instances.ex b/lib/diffo/provider/components/place/extension/persisters/persist_instances.ex index d64d3f3..2ef8471 100644 --- a/lib/diffo/provider/components/place/extension/persisters/persist_instances.ex +++ b/lib/diffo/provider/components/place/extension/persisters/persist_instances.ex @@ -13,9 +13,14 @@ defmodule Diffo.Provider.Place.Extension.Persisters.PersistInstances do escaped = Macro.escape(declarations) dsl_state = Transformer.persist(dsl_state, :instances, declarations) - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def instances, do: unquote(escaped) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def instances, do: unquote(escaped) + end + )} end end diff --git a/lib/diffo/provider/components/place/extension/persisters/persist_parties.ex b/lib/diffo/provider/components/place/extension/persisters/persist_parties.ex index 6612423..bdc46f3 100644 --- a/lib/diffo/provider/components/place/extension/persisters/persist_parties.ex +++ b/lib/diffo/provider/components/place/extension/persisters/persist_parties.ex @@ -13,9 +13,14 @@ defmodule Diffo.Provider.Place.Extension.Persisters.PersistParties do escaped = Macro.escape(declarations) dsl_state = Transformer.persist(dsl_state, :parties, declarations) - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def parties, do: unquote(escaped) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def parties, do: unquote(escaped) + end + )} end end diff --git a/lib/diffo/provider/components/place/extension/persisters/persist_places.ex b/lib/diffo/provider/components/place/extension/persisters/persist_places.ex index 3fa789d..93549a0 100644 --- a/lib/diffo/provider/components/place/extension/persisters/persist_places.ex +++ b/lib/diffo/provider/components/place/extension/persisters/persist_places.ex @@ -13,9 +13,14 @@ defmodule Diffo.Provider.Place.Extension.Persisters.PersistPlaces do escaped = Macro.escape(declarations) dsl_state = Transformer.persist(dsl_state, :places, declarations) - {:ok, Transformer.eval(dsl_state, [], quote do - @doc false - def places, do: unquote(escaped) - end)} + {:ok, + Transformer.eval( + dsl_state, + [], + quote do + @doc false + def places, do: unquote(escaped) + end + )} end end diff --git a/lib/diffo/provider/components/place/extension/verifiers/verify_roles.ex b/lib/diffo/provider/components/place/extension/verifiers/verify_roles.ex index 70991df..756d041 100644 --- a/lib/diffo/provider/components/place/extension/verifiers/verify_roles.ex +++ b/lib/diffo/provider/components/place/extension/verifiers/verify_roles.ex @@ -17,12 +17,36 @@ defmodule Diffo.Provider.Place.Extension.Verifiers.VerifyRoles do resource = Verifier.get_persisted(dsl_state, :module) errors = - check_section(dsl_state, [:instances], :instance_type, &InstanceInfo.instance?/1, - "instances", "instance_type", "BaseInstance", resource) ++ - check_section(dsl_state, [:parties], :party_type, &PartyInfo.party?/1, - "parties", "party_type", "BaseParty", resource) ++ - check_section(dsl_state, [:places], :place_type, &PlaceInfo.place?/1, - "places", "place_type", "BasePlace", resource) + check_section( + dsl_state, + [:instances], + :instance_type, + &InstanceInfo.instance?/1, + "instances", + "instance_type", + "BaseInstance", + resource + ) ++ + check_section( + dsl_state, + [:parties], + :party_type, + &PartyInfo.party?/1, + "parties", + "party_type", + "BaseParty", + resource + ) ++ + check_section( + dsl_state, + [:places], + :place_type, + &PlaceInfo.place?/1, + "places", + "place_type", + "BasePlace", + resource + ) case errors do [] -> :ok @@ -32,6 +56,7 @@ defmodule Diffo.Provider.Place.Extension.Verifiers.VerifyRoles do defp check_section(dsl_state, path, type_field, type_check?, section, field, base, resource) do entities = Verifier.get_entities(dsl_state, path) + duplicate_errors(entities, section, resource) ++ type_errors(entities, type_field, type_check?, section, field, base, resource) end @@ -58,18 +83,24 @@ defmodule Diffo.Provider.Place.Extension.Verifiers.VerifyRoles do acc !Code.ensure_loaded?(mod) -> - [DslError.exception( - module: resource, - path: [String.to_atom(section)], - message: "#{section}: #{field} #{inspect(mod)} does not exist" - ) | acc] + [ + DslError.exception( + module: resource, + path: [String.to_atom(section)], + message: "#{section}: #{field} #{inspect(mod)} does not exist" + ) + | acc + ] !type_check?.(mod) -> - [DslError.exception( - module: resource, - path: [String.to_atom(section)], - message: "#{section}: #{field} #{inspect(mod)} does not extend #{base}" - ) | acc] + [ + DslError.exception( + module: resource, + path: [String.to_atom(section)], + message: "#{section}: #{field} #{inspect(mod)} does not extend #{base}" + ) + | acc + ] true -> acc diff --git a/lib/diffo/provider/components/place_ref.ex b/lib/diffo/provider/components/place_ref.ex index a2acd0b..d412dd9 100644 --- a/lib/diffo/provider/components/place_ref.ex +++ b/lib/diffo/provider/components/place_ref.ex @@ -169,5 +169,4 @@ defmodule Diffo.Provider.PlaceRef do sort: [role: :asc, created_at: :desc] ) end - end diff --git a/lib/diffo/provider/components/process_status.ex b/lib/diffo/provider/components/process_status.ex index 6843260..4f83696 100644 --- a/lib/diffo/provider/components/process_status.ex +++ b/lib/diffo/provider/components/process_status.ex @@ -124,5 +124,4 @@ defmodule Diffo.Provider.ProcessStatus do preparations do prepare build(sort: [timestamp: :desc]) end - end diff --git a/lib/diffo/provider/components/specification.ex b/lib/diffo/provider/components/specification.ex index dc90930..066f97f 100644 --- a/lib/diffo/provider/components/specification.ex +++ b/lib/diffo/provider/components/specification.ex @@ -84,7 +84,19 @@ defmodule Diffo.Provider.Specification do create :create do description "creates a major version of a named serviceSpecification or resourceSpecification" - accept [:id, :type, :name, :major_version, :minor_version, :patch_version, :tmf_version, :description, :category] + + accept [ + :id, + :type, + :name, + :major_version, + :minor_version, + :patch_version, + :tmf_version, + :description, + :category + ] + change load [:version, :href, :instance_type] upsert? true upsert_identity :unique_major_version_per_name diff --git a/lib/diffo/type/value.ex b/lib/diffo/type/value.ex index 5fbcd5e..99b3789 100644 --- a/lib/diffo/type/value.ex +++ b/lib/diffo/type/value.ex @@ -96,13 +96,19 @@ defmodule Diffo.Type.Value do def cast_input(value, constraints), do: super(value, constraints) def handle_change(_old_value, nil, _constraints), do: {:ok, nil} - def handle_change(old_value, new_value, constraints), do: super(old_value, new_value, constraints) + + def handle_change(old_value, new_value, constraints), + do: super(old_value, new_value, constraints) def handle_change_array(_old_values, nil, _constraints), do: {:ok, nil} - def handle_change_array(old_values, new_values, constraints), do: super(old_values, new_values, constraints) + + def handle_change_array(old_values, new_values, constraints), + do: super(old_values, new_values, constraints) def prepare_change_array(_old_values, nil, _constraints), do: {:ok, nil} - def prepare_change_array(old_values, new_values, constraints), do: super(old_values, new_values, constraints) + + def prepare_change_array(old_values, new_values, constraints), + do: super(old_values, new_values, constraints) def primitive(type, value), do: Diffo.Type.Primitive.wrap(type, value) diff --git a/mix.exs b/mix.exs index 54c61f3..d412f59 100644 --- a/mix.exs +++ b/mix.exs @@ -76,7 +76,7 @@ defmodule Diffo.MixProject do ] ], groups_for_extras: [ - "DSLs": ~r/documentation\/dsls\// + DSLs: ~r/documentation\/dsls\// ] ] end diff --git a/test/instance_extension/party_test.exs b/test/instance_extension/party_test.exs index e9e19c3..56f717a 100644 --- a/test/instance_extension/party_test.exs +++ b/test/instance_extension/party_test.exs @@ -131,6 +131,7 @@ defmodule Diffo.InstanceExtension.PartyTest do %Party{id: p3.id, role: :installer}, %Party{id: p4.id, role: :installer} ] + assert {:error, _} = Servo.build_shelf(%{name: "s", parties: parties}) end @@ -139,6 +140,7 @@ defmodule Diffo.InstanceExtension.PartyTest do %Party{id: org.id, role: :facilitator}, %Party{id: p1.id, role: :installer} ] + assert {:ok, shelf} = Servo.build_shelf(%{name: "s", parties: parties}) assert length(shelf.parties) == 2 end @@ -149,6 +151,7 @@ defmodule Diffo.InstanceExtension.PartyTest do %Party{id: p2.id, role: :installer}, %Party{id: p3.id, role: :installer} ] + assert {:ok, _shelf} = Servo.build_shelf(%{name: "s", parties: parties}) end end @@ -166,11 +169,12 @@ defmodule Diffo.InstanceExtension.PartyTest do describe "BaseParty — complex pattern (Carrier)" do test "domain-specific attributes are accepted and persisted" do - {:ok, carrier} = Nbn.create_carrier(%{ - name: "Acme Wholesale", - abn: "51824753556", - trading_name: "Acme" - }) + {:ok, carrier} = + Nbn.create_carrier(%{ + name: "Acme Wholesale", + abn: "51824753556", + trading_name: "Acme" + }) assert carrier.name == "Acme Wholesale" assert carrier.type == :Organization @@ -179,11 +183,12 @@ defmodule Diffo.InstanceExtension.PartyTest do end test "domain-specific attributes are readable after creation" do - {:ok, carrier} = Nbn.create_carrier(%{ - name: "Acme Wholesale", - abn: "51824753556", - trading_name: "Acme" - }) + {:ok, carrier} = + Nbn.create_carrier(%{ + name: "Acme Wholesale", + abn: "51824753556", + trading_name: "Acme" + }) {:ok, loaded} = Nbn.get_carrier_by_id(carrier.id) assert loaded.abn == "51824753556" diff --git a/test/instance_extension/place_test.exs b/test/instance_extension/place_test.exs index 122a3a5..87e5cf5 100644 --- a/test/instance_extension/place_test.exs +++ b/test/instance_extension/place_test.exs @@ -89,12 +89,13 @@ defmodule Diffo.InstanceExtension.PlaceTest do describe "BasePlace — complex pattern (ExchangeBuilding)" do test "domain-specific attributes are accepted and persisted" do - {:ok, building} = Nbn.create_exchange_building(%{ - id: "EX-MEL-001", - name: "Melbourne Central Exchange", - nli: "MEXMELB0001", - access_type: :unmanned - }) + {:ok, building} = + Nbn.create_exchange_building(%{ + id: "EX-MEL-001", + name: "Melbourne Central Exchange", + nli: "MEXMELB0001", + access_type: :unmanned + }) assert building.name == "Melbourne Central Exchange" assert building.type == :GeographicSite @@ -103,12 +104,13 @@ defmodule Diffo.InstanceExtension.PlaceTest do end test "domain-specific attributes are readable after creation" do - {:ok, _building} = Nbn.create_exchange_building(%{ - id: "EX-MEL-002", - name: "South Yarra Exchange", - nli: "MEXMELB0002", - access_type: :attended - }) + {:ok, _building} = + Nbn.create_exchange_building(%{ + id: "EX-MEL-002", + name: "South Yarra Exchange", + nli: "MEXMELB0002", + access_type: :attended + }) {:ok, loaded} = Nbn.get_exchange_building_by_id("EX-MEL-002") assert loaded.nli == "MEXMELB0002" @@ -116,10 +118,11 @@ defmodule Diffo.InstanceExtension.PlaceTest do end test "domain-specific attributes are nil when not provided" do - {:ok, building} = Nbn.create_exchange_building(%{ - id: "EX-MEL-003", - name: "Bare Exchange" - }) + {:ok, building} = + Nbn.create_exchange_building(%{ + id: "EX-MEL-003", + name: "Bare Exchange" + }) assert building.nli == nil assert building.access_type == nil diff --git a/test/instance_extension/transformer_test.exs b/test/instance_extension/transformer_test.exs index 8231982..1e1ed66 100644 --- a/test/instance_extension/transformer_test.exs +++ b/test/instance_extension/transformer_test.exs @@ -231,7 +231,10 @@ defmodule Diffo.InstanceExtension.TransformerTest do test "injected arguments are not public" do action = Ash.Resource.Info.action(Shelf, :build) - injected = Enum.filter(action.arguments, &(&1.name in [:specified_by, :features, :characteristics])) + + injected = + Enum.filter(action.arguments, &(&1.name in [:specified_by, :features, :characteristics])) + assert Enum.all?(injected, &(&1.public? == false)) end diff --git a/test/provider/place_test.exs b/test/provider/place_test.exs index d4ee671..5980cfe 100644 --- a/test/provider/place_test.exs +++ b/test/provider/place_test.exs @@ -284,7 +284,8 @@ defmodule Diffo.Provider.PlaceTest do type: :GeographicAddress }) - {:error, _error} = place |> Diffo.Provider.update_place(%{referred_type: :GeographicAddress}) + {:error, _error} = + place |> Diffo.Provider.update_place(%{referred_type: :GeographicAddress}) end test "update referred_type - failure - PlaceRef requires referred_type" do diff --git a/test/provider/versioning_test.exs b/test/provider/versioning_test.exs index 441fb43..d8fc68b 100644 --- a/test/provider/versioning_test.exs +++ b/test/provider/versioning_test.exs @@ -81,8 +81,11 @@ defmodule Diffo.Provider.VersioningTest do {:ok, v1} = Servo.build_broadband(%{}) {:ok, v2} = Servo.build_broadband_v2(%{}) - v1_instances = Diffo.Provider.find_instances_by_specification_id!(Broadband.specification()[:id]) - v2_instances = Diffo.Provider.find_instances_by_specification_id!(BroadbandV2.specification()[:id]) + v1_instances = + Diffo.Provider.find_instances_by_specification_id!(Broadband.specification()[:id]) + + v2_instances = + Diffo.Provider.find_instances_by_specification_id!(BroadbandV2.specification()[:id]) assert length(v1_instances) == 1 assert length(v2_instances) == 1 @@ -102,9 +105,10 @@ defmodule Diffo.Provider.VersioningTest do {:ok, v1} = Servo.build_broadband(%{}) {:ok, instance} = Diffo.Provider.get_instance_by_id(v1.id) - {:ok, migrated} = Diffo.Provider.respecify_instance(instance, %{ - specified_by: BroadbandV2.specification()[:id] - }) + {:ok, migrated} = + Diffo.Provider.respecify_instance(instance, %{ + specified_by: BroadbandV2.specification()[:id] + }) assert migrated.specification.id == BroadbandV2.specification()[:id] end @@ -112,22 +116,30 @@ defmodule Diffo.Provider.VersioningTest do test "migrated instance is found by V2 specification" do {:ok, v1} = Servo.build_broadband(%{}) {:ok, instance} = Diffo.Provider.get_instance_by_id(v1.id) - {:ok, _} = Diffo.Provider.respecify_instance(instance, %{ - specified_by: BroadbandV2.specification()[:id] - }) - v2_instances = Diffo.Provider.find_instances_by_specification_id!(BroadbandV2.specification()[:id]) + {:ok, _} = + Diffo.Provider.respecify_instance(instance, %{ + specified_by: BroadbandV2.specification()[:id] + }) + + v2_instances = + Diffo.Provider.find_instances_by_specification_id!(BroadbandV2.specification()[:id]) + assert Enum.any?(v2_instances, &(&1.id == v1.id)) end test "migrated instance is no longer found by V1 specification" do {:ok, v1} = Servo.build_broadband(%{}) {:ok, instance} = Diffo.Provider.get_instance_by_id(v1.id) - {:ok, _} = Diffo.Provider.respecify_instance(instance, %{ - specified_by: BroadbandV2.specification()[:id] - }) - v1_instances = Diffo.Provider.find_instances_by_specification_id!(Broadband.specification()[:id]) + {:ok, _} = + Diffo.Provider.respecify_instance(instance, %{ + specified_by: BroadbandV2.specification()[:id] + }) + + v1_instances = + Diffo.Provider.find_instances_by_specification_id!(Broadband.specification()[:id]) + refute Enum.any?(v1_instances, &(&1.id == v1.id)) end @@ -137,11 +149,25 @@ defmodule Diffo.Provider.VersioningTest do {:ok, instance_a} = Diffo.Provider.get_instance_by_id(v1_a.id) {:ok, instance_b} = Diffo.Provider.get_instance_by_id(v1_b.id) - {:ok, _} = Diffo.Provider.respecify_instance(instance_a, %{specified_by: BroadbandV2.specification()[:id]}) - {:ok, _} = Diffo.Provider.respecify_instance(instance_b, %{specified_by: BroadbandV2.specification()[:id]}) - assert Diffo.Provider.find_instances_by_specification_id!(Broadband.specification()[:id]) == [] - assert length(Diffo.Provider.find_instances_by_specification_id!(BroadbandV2.specification()[:id])) == 3 + {:ok, _} = + Diffo.Provider.respecify_instance(instance_a, %{ + specified_by: BroadbandV2.specification()[:id] + }) + + {:ok, _} = + Diffo.Provider.respecify_instance(instance_b, %{ + specified_by: BroadbandV2.specification()[:id] + }) + + assert Diffo.Provider.find_instances_by_specification_id!(Broadband.specification()[:id]) == + [] + + assert length( + Diffo.Provider.find_instances_by_specification_id!( + BroadbandV2.specification()[:id] + ) + ) == 3 end end end diff --git a/test/support/resource/carrier.ex b/test/support/resource/carrier.ex index 1f8c31d..c99abf6 100644 --- a/test/support/resource/carrier.ex +++ b/test/support/resource/carrier.ex @@ -22,17 +22,10 @@ defmodule Diffo.Test.Carrier do plural_name :carriers end - attributes do - attribute :abn, :string do - description "Australian Business Number" - allow_nil? true - public? true - end - - attribute :trading_name, :string do - description "Trading name, distinct from legal name" - allow_nil? true - public? true + actions do + create :build do + accept [:id, :href, :name, :abn, :trading_name] + change set_attribute(:type, :Organization) end end @@ -45,10 +38,17 @@ defmodule Diffo.Test.Carrier do expect [:id, :name, :type] end - actions do - create :build do - accept [:id, :href, :name, :abn, :trading_name] - change set_attribute(:type, :Organization) + attributes do + attribute :abn, :string do + description "Australian Business Number" + allow_nil? true + public? true + end + + attribute :trading_name, :string do + description "Trading name, distinct from legal name" + allow_nil? true + public? true end end diff --git a/test/support/resource/exchange_building.ex b/test/support/resource/exchange_building.ex index d6c3edc..d12d96c 100644 --- a/test/support/resource/exchange_building.ex +++ b/test/support/resource/exchange_building.ex @@ -22,18 +22,10 @@ defmodule Diffo.Test.ExchangeBuilding do plural_name :exchange_buildings end - attributes do - attribute :nli, :string do - description "Network Location Identifier" - allow_nil? true - public? true - end - - attribute :access_type, :atom do - description "Access type for the exchange building" - allow_nil? true - public? true - constraints one_of: [:attended, :unmanned, :restricted] + actions do + create :build do + accept [:id, :href, :name, :nli, :access_type] + change set_attribute(:type, :GeographicSite) end end @@ -47,10 +39,18 @@ defmodule Diffo.Test.ExchangeBuilding do expect [:id, :name, :type] end - actions do - create :build do - accept [:id, :href, :name, :nli, :access_type] - change set_attribute(:type, :GeographicSite) + attributes do + attribute :nli, :string do + description "Network Location Identifier" + allow_nil? true + public? true + end + + attribute :access_type, :atom do + description "Access type for the exchange building" + allow_nil? true + public? true + constraints one_of: [:attended, :unmanned, :restricted] end end