Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,14 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline

### Fixes

* fixed relationship enrichment inconsistent across neo4j versions
* fixed relationship enrichment inconsistent across neo4j versions

## [v0.1.6](https://github.com/diffo-dev/diffo/compare/v0.1.5...v0.1.6) (2026-03-19)

### Fixes

* incorrect domain label

### Maintenance

* improved error handling
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ by adding `diffo` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:diffo, "~> 0.1.5"}
{:diffo, "~> 0.1.6"}
]
end
```
Expand Down
2 changes: 1 addition & 1 deletion diffo.livemd
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ SPDX-License-Identifier: MIT
```elixir
Mix.install(
[
{:diffo, "~> 0.1.5"}
{:diffo, "~> 0.1.6"}
],
consolidate_protocols: false
)
Expand Down
4 changes: 1 addition & 3 deletions documentation/dsls/DSL-Diffo.Provider.Instance.Extension.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,7 @@ Configuration for Instance Features
features do
feature :dynamic_line_management do
is_enabled? true
characteristics do
characteristic :constraints, Diffo.Access.Constraints
end
characteristic :constraints, Diffo.Access.Constraints
end
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ SPDX-License-Identifier: MIT
```elixir
Mix.install(
[
{:diffo, "~> 0.1.5"}
{:diffo, "~> 0.1.6"}
],
consolidate_protocols: false
)
Expand Down
2 changes: 1 addition & 1 deletion lib/diffo/helpers/uuid.ex
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ defmodule Diffo.Uuid do

case info do
{:ok, result} ->
if result[:version] == 4 do
if result[:version] == 4 and result[:variant] == :rfc4122 do
true
else
false
Expand Down
21 changes: 15 additions & 6 deletions lib/diffo/provider/components/instance/extension/characteristic.ex
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ defmodule Diffo.Provider.Instance.Characteristic do
[] ->
changeset

{:error, error} ->
Ash.Changeset.add_error(changeset, error)

_ ->
characteristic_ids = Enum.map(characteristics, &Map.get(&1, :id))
Ash.Changeset.force_set_argument(changeset, :characteristics, characteristic_ids)
Expand All @@ -43,14 +46,20 @@ defmodule Diffo.Provider.Instance.Characteristic do
characteristics = Info.characteristics(module)

Enum.reduce_while(characteristics, [], fn %{name: name, value_type: value_type}, acc ->
value = struct(value_type)
try do
value = struct(value_type)

case Provider.create_characteristic(%{name: name, type: type, value: value}) do
{:ok, result} ->
{:cont, [result | acc]}
case Provider.create_characteristic(%{name: name, type: type, value: value}) do
{:ok, result} ->
{:cont, [result | acc]}

{:error, _error} ->
{:halt, []}
{:error, error} ->
{:halt, {:error, error}}
end
rescue
_e in UndefinedFunctionError ->
{:halt,
{:error, "couldn't create characteristic with value of unknown type #{value_type}"}}
end
end)
end
Expand Down
52 changes: 34 additions & 18 deletions lib/diffo/provider/components/instance/extension/feature.ex
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ defmodule Diffo.Provider.Instance.Feature do
[] ->
changeset

{:error, error} ->
Ash.Changeset.add_error(changeset, error)

_ ->
feature_ids = Enum.map(features, &Map.get(&1, :id))
Ash.Changeset.force_set_argument(changeset, :features, feature_ids)
Expand All @@ -49,28 +52,41 @@ defmodule Diffo.Provider.Instance.Feature do
fn %{name: name, is_enabled?: isEnabled, characteristics: characteristics}, acc ->
characteristic_ids =
Enum.reduce_while(characteristics, [], fn %{name: name, value_type: value_type}, acc ->
value = struct(value_type)
try do
value = struct(value_type)

case Provider.create_characteristic(%{name: name, value: value, type: :feature}) do
{:ok, result} ->
{:cont, [result.id | acc]}

{:error, error} ->
{:halt, {:error, error}}
end
rescue
_e in UndefinedFunctionError ->
{:halt,
{:error,
"couldn't create feature characteristic with value of unknown type #{value_type}"}}
end
end)

case Provider.create_characteristic(%{name: name, value: value, type: :feature}) do
case characteristic_ids do
{:error, error} ->
{:halt, {:error, error}}

_ ->
# create feature with feature characteristics
case Provider.create_feature(%{
name: name,
isEnabled: isEnabled,
characteristics: characteristic_ids
}) do
{:ok, result} ->
{:cont, [result.id | acc]}
{:cont, [result | acc]}

{:error, _error} ->
{:halt, []}
{:error, error} ->
{:halt, {:error, error}}
end
end)

# create feature with feature characteristics
case Provider.create_feature(%{
name: name,
isEnabled: isEnabled,
characteristics: characteristic_ids
}) do
{:ok, result} ->
{:cont, [result | acc]}

{:error, _error} ->
{:halt, []}
end
end
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ defmodule Diffo.Provider.Instance.Specification do
{:ok, specification} ->
Ash.Changeset.force_set_argument(changeset, :specified_by, specification.id)

{:error, _error} ->
Logger.error("couldn't find/create required specification")
{:error, error} ->
Ash.Changeset.add_error(changeset, error)
end
end

Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ defmodule Diffo.MixProject do
@moduledoc false
use Mix.Project

@version "0.1.5"
@version "0.1.6"
@name "Diffo"
@description "TMF Service and Resource Manager with a difference"
@github_url "https://github.com/diffo-dev/diffo"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#
# SPDX-License-Identifier: MIT

defmodule Diffo.Test.AssignerTest do
defmodule Diffo.InstanceExtension.AssignerTest do
@moduledoc false
use ExUnit.Case
alias Diffo.Provider.Specification
Expand Down
29 changes: 29 additions & 0 deletions test/instance_extension/characteristic_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# SPDX-FileCopyrightText: 2025 diffo contributors <https://github.com/diffo-dev/diffo/graphs.contributors>
#
# SPDX-License-Identifier: MIT

defmodule Diffo.InstanceExtension.CharacteristicTest do
@moduledoc false
use ExUnit.Case
alias Diffo.Test.Servo

setup_all do
AshNeo4j.BoltyHelper.start()
end

setup do
on_exit(fn ->
AshNeo4j.Neo4jHelper.delete_all()
end)
end

describe "characteristic" do
test "create resource fails when characteristic value type invalid" do
{:error, error} = Servo.build_invalid_characteristic(%{})
%Ash.Error.Invalid{errors: errors} = error

assert hd(errors).message ==
"couldn't create characteristic with value of unknown type Elixir.InvalidValue"
end
end
end
29 changes: 29 additions & 0 deletions test/instance_extension/feature_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# SPDX-FileCopyrightText: 2025 diffo contributors <https://github.com/diffo-dev/diffo/graphs.contributors>
#
# SPDX-License-Identifier: MIT

defmodule Diffo.InstanceExtension.FeatureTest do
@moduledoc false
use ExUnit.Case
alias Diffo.Test.Servo

setup_all do
AshNeo4j.BoltyHelper.start()
end

setup do
on_exit(fn ->
AshNeo4j.Neo4jHelper.delete_all()
end)
end

describe "feature" do
test "create resource with fails when feature characteristic value type invalid" do
{:error, error} = Servo.build_invalid_feature_characteristic(%{})
%Ash.Error.Invalid{errors: errors} = error

assert hd(errors).message ==
"couldn't create feature characteristic with value of unknown type Elixir.InvalidValue"
end
end
end
27 changes: 27 additions & 0 deletions test/instance_extension/specification_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# SPDX-FileCopyrightText: 2025 diffo contributors <https://github.com/diffo-dev/diffo/graphs.contributors>
#
# SPDX-License-Identifier: MIT

defmodule Diffo.InstanceExtension.SpecificationTest do
@moduledoc false
use ExUnit.Case
alias Diffo.Test.Servo

setup_all do
AshNeo4j.BoltyHelper.start()
end

setup do
on_exit(fn ->
AshNeo4j.Neo4jHelper.delete_all()
end)
end

describe "specification" do
test "create resource fails when specification id not uuid v4" do
{:error, error} = Servo.build_invalid_specification(%{})
%Ash.Error.Invalid{errors: errors} = error
assert hd(errors).message == "must be a uuid v4 or nil"
end
end
end
2 changes: 1 addition & 1 deletion test/provider/instance_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ defmodule Diffo.Provider.InstanceTest do
end

setup do
on_exit(fn ->
on_exit(fn ->
AshNeo4j.Neo4jHelper.delete_all()
end)
end
Expand Down
32 changes: 32 additions & 0 deletions test/support/resource/deployment_class_value.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# SPDX-FileCopyrightText: 2025 diffo contributors <https://github.com/diffo-dev/diffo/graphs.contributors>
#
# SPDX-License-Identifier: MIT

defmodule Diffo.Test.DeploymentClassValue do
@moduledoc """
Diffo - TMF Service and Resource Management with a difference

DeploymentClassValue - AshTyped Struct for DeploymentClass Feature Characteristic Value
"""
use Ash.TypedStruct, extensions: [AshJason.TypedStruct, AshOutstanding.TypedStruct]

jason do
pick [:class, :mask]
compact true
end

outstanding do
expect [:name]
end

typed_struct do
field :class, :string, description: "the deployment class"
field :mask, :string, description: "the mask name"
end

defimpl String.Chars do
def to_string(struct) do
inspect(struct)
end
end
end
66 changes: 66 additions & 0 deletions test/support/resource/invalid/invalid_characteristic.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# SPDX-FileCopyrightText: 2025 diffo contributors <https://github.com/diffo-dev/diffo/graphs.contributors>
#
# SPDX-License-Identifier: MIT

defmodule Diffo.Test.InvalidCharacteristic do
@moduledoc """
Diffo - TMF Service and Resource Management with a difference

InvalidCharacteristic - Resource Instance with an Invalid Characteristic
"""

alias Diffo.Provider.BaseInstance
alias Diffo.Provider.Instance.ActionHelper

alias Diffo.Test.Servo

use Ash.Resource,
fragments: [BaseInstance],
domain: Servo

resource do
description "Ash Resource with an invalid characteristic"
end

specification do
id "3caf29b9-0b91-4b8f-8568-2960131b1feb"
name "invalidCharacteristic"
type :resourceSpecification
category "Network Resource"
end

characteristics do
characteristic :invalid, InvalidValue
end

actions do
create :build do
description "creates a new InvalidCharacteristic resource instance for build"
accept [:id, :name, :type, :which]
argument :specified_by, :uuid, public?: false
argument :relationships, {:array, :struct}
argument :features, {:array, :uuid}, public?: false
argument :characteristics, {:array, :uuid}, public?: false
argument :places, {:array, :struct}
argument :parties, {:array, :struct}

change set_attribute(:type, :resource)

change before_action(fn changeset, _context ->
ActionHelper.build_before(changeset)
end)

change after_action(fn changeset, result, _context ->
ActionHelper.build_after(
changeset,
result,
Servo,
:get_invalid_characteristic_by_id
)
end)

change load [:href]
upsert? false
end
end
end
Loading
Loading