From 989d1f11f375c546e9749479126f40a525b1b5f6 Mon Sep 17 00:00:00 2001 From: Matt Beanland Date: Mon, 20 Oct 2025 12:09:22 +1030 Subject: [PATCH] added reuse compliance --- .formatter.exs | 4 + .github/ISSUE_TEMPLATE/bug_report.md | 6 + .github/ISSUE_TEMPLATE/feature_request.md | 6 + .github/workflows/reuse.yaml | 15 ++ .gitignore.license | 3 + .iex.exs | 4 + .tool-versions | 2 + .tool-versions.license | 3 + .vscode/launch.json | 3 + CHANGELOG.md | 10 + LICENSE.md => LICENSES/MIT.md | 2 +- README.md | 13 +- VERSION | 1 - config/config.exs | 4 + config/dev.exs | 4 + config/prod.exs | 4 + config/runtime.exs | 4 + config/test.exs | 4 + diffo.livemd | 8 +- lib/CHANGELOG.md | 12 - lib/diffo.ex | 4 + lib/diffo/access/access.ex | 4 + lib/diffo/access/assigner/assignable_value.ex | 6 +- lib/diffo/access/assigner/assigner.ex | 4 + lib/diffo/access/assigner/assignment.ex | 6 +- lib/diffo/access/resources/cable.ex | 4 + lib/diffo/access/resources/card.ex | 4 + .../characteristic_values/cable_value.ex | 6 +- .../characteristic_values/card_value.ex | 7 +- .../characteristic_values/float_unit.ex | 6 +- .../characteristic_values/integer_unit.ex | 6 +- .../characteristic_values/path_value.ex | 6 +- .../characteristic_values/shelf_value.ex | 6 +- lib/diffo/access/resources/path.ex | 4 + lib/diffo/access/resources/shelf.ex | 4 + .../aggregate_interface.ex | 7 +- .../bandwidth_profile.ex | 6 +- .../services/characteristic_values/circuit.ex | 6 +- .../characteristic_values/constraints.ex | 6 +- .../services/characteristic_values/dslam.ex | 6 +- .../services/characteristic_values/line.ex | 6 +- lib/diffo/access/services/dsl_access.ex | 4 + lib/diffo/application.ex | 4 + lib/diffo/changes/detail_relationship.ex | 12 +- lib/diffo/helpers/util.ex | 4 + lib/diffo/helpers/uuid.ex | 4 + lib/diffo/provider-mermaid-class-diagram.mmd | 253 ------------------ lib/diffo/provider-mermaid-class-diagram.png | Bin 91424 -> 0 bytes lib/diffo/provider.ex | 4 + .../provider/components/base_instance.ex | 6 +- .../provider/components/characteristic.ex | 4 + lib/diffo/provider/components/entity.ex | 6 +- lib/diffo/provider/components/entity_ref.ex | 4 + .../components/external_identifier.ex | 4 + lib/diffo/provider/components/feature.ex | 4 + .../components/instance-mermaid-flowchart.mmd | 19 -- lib/diffo/provider/components/instance.ex | 4 + .../provider/components/instance/extension.ex | 4 + .../instance/extension/characteristic.ex | 4 + .../components/instance/extension/feature.ex | 4 + .../components/instance/extension/info.ex | 4 + .../components/instance/extension/party.ex | 4 + .../components/instance/extension/place.ex | 4 + .../instance/extension/relationship.ex | 4 + .../instance/extension/specification.ex | 4 + .../provider/components/instance/util.ex | 4 + lib/diffo/provider/components/note.ex | 4 + lib/diffo/provider/components/party.ex | 6 +- lib/diffo/provider/components/party_ref.ex | 4 + lib/diffo/provider/components/place.ex | 6 +- lib/diffo/provider/components/place_ref.ex | 4 + .../provider/components/process_status.ex | 4 + lib/diffo/provider/components/relationship.ex | 15 +- .../provider/components/specification.ex | 4 + .../provider/instance-mermaid-flowchart.mmd | 19 -- lib/diffo/provider/outstanding.ex | 4 + lib/diffo/provider/reference.ex | 5 + lib/diffo/provider/service.ex | 4 + lib/diffo/repo.ex | 4 + lib/diffo/validations/href_ends_with_id.ex | 4 + lib/diffo/validations/is_related_different.ex | 4 + lib/diffo/validations/is_uuid4_or_nil.ex | 4 + lib/mix/tasks/diagram.ex | 4 + logos/diffo.jpg.license | 3 + mix.exs | 7 +- mix.lock.license | 3 + test/access/cable_test.exs | 4 + test/access/card_test.exs | 4 + test/access/characteristic_value_test.exs | 4 + test/access/dsl_access_test.exs | 4 + test/access/path_test.exs | 4 + test/access/shelf_test.exs | 6 +- test/diffo_test.exs | 4 + test/provider/characteristic_test.exs | 5 +- test/provider/entity_ref_test.exs | 4 + test/provider/entity_test.exs | 4 + test/provider/external_identifier_test.exs | 4 + test/provider/feature_test.exs | 4 + test/provider/instance_test.exs | 14 +- test/provider/note_test.exs | 4 + test/provider/party_ref_test.exs | 4 + test/provider/party_test.exs | 4 + test/provider/place_ref_test.exs | 4 + test/provider/place_test.exs | 4 + test/provider/process_status_test.exs | 4 + test/provider/reference_test.exs | 4 + test/provider/relationship_test.exs | 4 + test/provider/specification_test.exs | 4 + test/support/characteristics.ex | 4 + test/support/parties.ex | 4 + test/support/places.ex | 4 + test/test_helper.exs | 4 + 112 files changed, 486 insertions(+), 341 deletions(-) create mode 100644 .github/workflows/reuse.yaml create mode 100644 .gitignore.license create mode 100644 .tool-versions create mode 100644 .tool-versions.license rename LICENSE.md => LICENSES/MIT.md (89%) delete mode 100644 VERSION delete mode 100644 lib/CHANGELOG.md delete mode 100644 lib/diffo/provider-mermaid-class-diagram.mmd delete mode 100644 lib/diffo/provider-mermaid-class-diagram.png delete mode 100644 lib/diffo/provider/components/instance-mermaid-flowchart.mmd delete mode 100644 lib/diffo/provider/instance-mermaid-flowchart.mmd create mode 100644 logos/diffo.jpg.license create mode 100644 mix.lock.license diff --git a/.formatter.exs b/.formatter.exs index 5d748fa..f710659 100644 --- a/.formatter.exs +++ b/.formatter.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + # Used by "mix format" locals_without_parens = [ id: 1, diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index dd84ea7..1ed04de 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,3 +1,9 @@ + + --- name: Bug report about: Create a report to help us improve diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index bbcbbe7..180face 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,3 +1,9 @@ + + --- name: Feature request about: Suggest an idea for this project diff --git a/.github/workflows/reuse.yaml b/.github/workflows/reuse.yaml new file mode 100644 index 0000000..03eb3b6 --- /dev/null +++ b/.github/workflows/reuse.yaml @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + +name: REUSE Compliance Check + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: REUSE Compliance Check + uses: fsfe/reuse-action@v6 \ No newline at end of file diff --git a/.gitignore.license b/.gitignore.license new file mode 100644 index 0000000..40c9cb0 --- /dev/null +++ b/.gitignore.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2025 diffo contributors + +SPDX-License-Identifier: MIT \ No newline at end of file diff --git a/.iex.exs b/.iex.exs index 0639bc5..e0a8779 100644 --- a/.iex.exs +++ b/.iex.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + IEx.configure( inspect: [ custom_options: [sort_maps: true] diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..bf44d4a --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +erlang 28.1 +elixir 1.18.4-otp-28 diff --git a/.tool-versions.license b/.tool-versions.license new file mode 100644 index 0000000..40c9cb0 --- /dev/null +++ b/.tool-versions.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2025 diffo contributors + +SPDX-License-Identifier: MIT \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 5f395d2..4a9df11 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: 2025 diffo contributors +// +// SPDX-License-Identifier: MIT { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. diff --git a/CHANGELOG.md b/CHANGELOG.md index b459b0d..ee859e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ + + # Change Log All notable changes to this project will be documented in this file. @@ -19,4 +25,8 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline * customise instance via specification * improve relationships to avoid circular loads +## [v0.1.1](https://github.com/diffo-dev/diffo/compare/v0.1.1...v0.1.2) (2025-10-20) + +### Features +* REUSE compliant \ No newline at end of file diff --git a/LICENSE.md b/LICENSES/MIT.md similarity index 89% rename from LICENSE.md rename to LICENSES/MIT.md index f51aea3..75229b8 100644 --- a/LICENSE.md +++ b/LICENSES/MIT.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 Matthew Graham Beanland +Copyright (c) 2025 Matthew Graham Beanland and [contributors](https://github.com/diffo-dev/diffo/graphs/contributors) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 48a0163..e433263 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,16 @@ + + # Diffo +[![Module Version](https://img.shields.io/hexpm/v/diffo)](https://hex.pm/packages/diffo) +[![Hex Docs](https://img.shields.io/badge/hex-docs-lightgreen)](https://hexdocs.pm/diffo/) +[![License](https://img.shields.io/hexpm/l/diffo)](https://github.com/diffo-dev/diffo/blob/master/LICENSES/MIT.md) +[![REUSE status](https://api.reuse.software/badge/github.com/diffo-dev/diffo)](https://api.reuse.software/info/github.com/diffo-dev/diffo) + Diffo is a Telecommunications Management Forum (TMF) Service and Resource Manager, built for autonomous networks. It is implemented using the [Ash Framework](https://www.ash-hq.org) leveraging core and community extensions including some created and maintained by [diffo-dev](https://github.com/diffo-dev/). As such it is highly customizable using Spark DSL and as necessary Elixir. @@ -28,7 +39,7 @@ by adding `diffo` to your list of dependencies in `mix.exs`: ```elixir def deps do [ - {:diffo, "~> 0.1.1"} + {:diffo, "~> 0.1.2"} ] end ``` diff --git a/VERSION b/VERSION deleted file mode 100644 index 6da28dd..0000000 --- a/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.1.1 \ No newline at end of file diff --git a/config/config.exs b/config/config.exs index a3425ae..0122845 100644 --- a/config/config.exs +++ b/config/config.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + import Config config :spark, diff --git a/config/dev.exs b/config/dev.exs index 634bffe..6e022e3 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + import Config config :boltx, Bolt, diff --git a/config/prod.exs b/config/prod.exs index becde76..4eaf659 100644 --- a/config/prod.exs +++ b/config/prod.exs @@ -1 +1,5 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + import Config diff --git a/config/runtime.exs b/config/runtime.exs index 3fd4866..3d490de 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + import Config if config_env() == :prod do diff --git a/config/test.exs b/config/test.exs index ef988ad..c297265 100644 --- a/config/test.exs +++ b/config/test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + import Config config :logger, level: :warning diff --git a/diffo.livemd b/diffo.livemd index 5cfaf4b..aecc286 100644 --- a/diffo.livemd +++ b/diffo.livemd @@ -1,9 +1,15 @@ + + # Diffo TMF Service and Resource Manager ```elixir Mix.install( [ - {:diffo, "~> 0.1.1"} + {:diffo, "~> 0.1.2"} ], consolidate_protocols: false ) diff --git a/lib/CHANGELOG.md b/lib/CHANGELOG.md deleted file mode 100644 index e82d554..0000000 --- a/lib/CHANGELOG.md +++ /dev/null @@ -1,12 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](Https://conventionalcommits.org) for commit guidelines. - - - -## [v0.1.0](https://github.com/diffo-dev/diffo/compare/v0.1.0...v0.1.0) (2025-08-10) - -### Features: -* initial version using Neo4j DataLayer - diff --git a/lib/diffo.ex b/lib/diffo.ex index 69c755a..7fc29c1 100644 --- a/lib/diffo.ex +++ b/lib/diffo.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 ash_neo4j contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/access/access.ex b/lib/diffo/access/access.ex index 9b80fda..6b67b67 100644 --- a/lib/diffo/access/access.ex +++ b/lib/diffo/access/access.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/access/assigner/assignable_value.ex b/lib/diffo/access/assigner/assignable_value.ex index aea603a..9120594 100644 --- a/lib/diffo/access/assigner/assignable_value.ex +++ b/lib/diffo/access/assigner/assignable_value.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.AssignableValue do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,7 +12,7 @@ defmodule Diffo.Access.AssignableValue do jason do pick [:first, :last, :free, :type, :algorithm] - compact true + compact(true) end typed_struct do diff --git a/lib/diffo/access/assigner/assigner.ex b/lib/diffo/access/assigner/assigner.ex index 1531595..447b293 100644 --- a/lib/diffo/access/assigner/assigner.ex +++ b/lib/diffo/access/assigner/assigner.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.Assigner do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/access/assigner/assignment.ex b/lib/diffo/access/assigner/assignment.ex index 9327dc3..6ff6859 100644 --- a/lib/diffo/access/assigner/assignment.ex +++ b/lib/diffo/access/assigner/assignment.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.Assignment do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,7 +12,7 @@ defmodule Diffo.Access.Assignment do jason do pick [:id, :assignee_id, :operation] - compact true + compact(true) end typed_struct do diff --git a/lib/diffo/access/resources/cable.ex b/lib/diffo/access/resources/cable.ex index 32db1a5..4c42582 100644 --- a/lib/diffo/access/resources/cable.ex +++ b/lib/diffo/access/resources/cable.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.Cable do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/access/resources/card.ex b/lib/diffo/access/resources/card.ex index e79b561..2e24924 100644 --- a/lib/diffo/access/resources/card.ex +++ b/lib/diffo/access/resources/card.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.Card do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/access/resources/characteristic_values/cable_value.ex b/lib/diffo/access/resources/characteristic_values/cable_value.ex index 03249b7..cdcaf97 100644 --- a/lib/diffo/access/resources/characteristic_values/cable_value.ex +++ b/lib/diffo/access/resources/characteristic_values/cable_value.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.CableValue do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,7 +12,7 @@ defmodule Diffo.Access.CableValue do jason do pick [:name, :pairs, :length, :loss, :technology] - compact true + compact(true) end outstanding do diff --git a/lib/diffo/access/resources/characteristic_values/card_value.ex b/lib/diffo/access/resources/characteristic_values/card_value.ex index 8a1ee27..dce1677 100644 --- a/lib/diffo/access/resources/characteristic_values/card_value.ex +++ b/lib/diffo/access/resources/characteristic_values/card_value.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.CardValue do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,14 +12,13 @@ defmodule Diffo.Access.CardValue do jason do pick [:name, :family, :model, :technology] - compact true + compact(true) end outstanding do expect [:name] end - typed_struct do field :name, :string, description: "the card name" diff --git a/lib/diffo/access/resources/characteristic_values/float_unit.ex b/lib/diffo/access/resources/characteristic_values/float_unit.ex index 90e99ee..57c9600 100644 --- a/lib/diffo/access/resources/characteristic_values/float_unit.ex +++ b/lib/diffo/access/resources/characteristic_values/float_unit.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.FloatUnit do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,7 +12,7 @@ defmodule Diffo.Access.FloatUnit do jason do pick [:amount, :unit] - compact true + compact(true) end outstanding do diff --git a/lib/diffo/access/resources/characteristic_values/integer_unit.ex b/lib/diffo/access/resources/characteristic_values/integer_unit.ex index 5bf743b..764edaa 100644 --- a/lib/diffo/access/resources/characteristic_values/integer_unit.ex +++ b/lib/diffo/access/resources/characteristic_values/integer_unit.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.IntegerUnit do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,7 +12,7 @@ defmodule Diffo.Access.IntegerUnit do jason do pick [:amount, :unit] - compact true + compact(true) end outstanding do diff --git a/lib/diffo/access/resources/characteristic_values/path_value.ex b/lib/diffo/access/resources/characteristic_values/path_value.ex index ea89317..aa935ea 100644 --- a/lib/diffo/access/resources/characteristic_values/path_value.ex +++ b/lib/diffo/access/resources/characteristic_values/path_value.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.PathValue do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,7 +12,7 @@ defmodule Diffo.Access.PathValue do jason do pick [:name, :sections, :length, :loss, :technology] - compact true + compact(true) end outstanding do diff --git a/lib/diffo/access/resources/characteristic_values/shelf_value.ex b/lib/diffo/access/resources/characteristic_values/shelf_value.ex index 0ead01f..7c44dc2 100644 --- a/lib/diffo/access/resources/characteristic_values/shelf_value.ex +++ b/lib/diffo/access/resources/characteristic_values/shelf_value.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.ShelfValue do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,7 +12,7 @@ defmodule Diffo.Access.ShelfValue do jason do pick [:name, :family, :model, :technology] - compact true + compact(true) end outstanding do diff --git a/lib/diffo/access/resources/path.ex b/lib/diffo/access/resources/path.ex index 2a57ee5..bbf1262 100644 --- a/lib/diffo/access/resources/path.ex +++ b/lib/diffo/access/resources/path.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.Path do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/access/resources/shelf.ex b/lib/diffo/access/resources/shelf.ex index 6f8e59a..eb08bbd 100644 --- a/lib/diffo/access/resources/shelf.ex +++ b/lib/diffo/access/resources/shelf.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.Shelf do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/access/services/characteristic_values/aggregate_interface.ex b/lib/diffo/access/services/characteristic_values/aggregate_interface.ex index 2fd76f0..383ee18 100644 --- a/lib/diffo/access/services/characteristic_values/aggregate_interface.ex +++ b/lib/diffo/access/services/characteristic_values/aggregate_interface.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.AggregateInterface do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,14 +12,13 @@ defmodule Diffo.Access.AggregateInterface do jason do pick [:name, :physical_interface, :physical_layer, :link_layer, :svlan_id, :vpi] - compact true + compact(true) end outstanding do expect [:name] end - typed_struct do field :name, :string, description: "the name of the aggregate interface" diff --git a/lib/diffo/access/services/characteristic_values/bandwidth_profile.ex b/lib/diffo/access/services/characteristic_values/bandwidth_profile.ex index 9ae189e..a7a5ac9 100644 --- a/lib/diffo/access/services/characteristic_values/bandwidth_profile.ex +++ b/lib/diffo/access/services/characteristic_values/bandwidth_profile.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.BandwidthProfile do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,7 +12,7 @@ defmodule Diffo.Access.BandwidthProfile do jason do pick [:downstream, :upstream, :units] - compact true + compact(true) end outstanding do diff --git a/lib/diffo/access/services/characteristic_values/circuit.ex b/lib/diffo/access/services/characteristic_values/circuit.ex index 4b8ee31..e3b33eb 100644 --- a/lib/diffo/access/services/characteristic_values/circuit.ex +++ b/lib/diffo/access/services/characteristic_values/circuit.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.Circuit do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -10,7 +14,7 @@ defmodule Diffo.Access.Circuit do jason do pick [:circuit_id, :cvlan_id, :vci, :encapsulation, :bandwidth_profile] - compact true + compact(true) end outstanding do diff --git a/lib/diffo/access/services/characteristic_values/constraints.ex b/lib/diffo/access/services/characteristic_values/constraints.ex index edee05d..f2baef6 100644 --- a/lib/diffo/access/services/characteristic_values/constraints.ex +++ b/lib/diffo/access/services/characteristic_values/constraints.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.Constraints do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,7 +12,7 @@ defmodule Diffo.Access.Constraints do jason do pick [:max_latency, :min_profile] - compact true + compact(true) end outstanding do diff --git a/lib/diffo/access/services/characteristic_values/dslam.ex b/lib/diffo/access/services/characteristic_values/dslam.ex index b3a9891..051d8e4 100644 --- a/lib/diffo/access/services/characteristic_values/dslam.ex +++ b/lib/diffo/access/services/characteristic_values/dslam.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.Dslam do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,7 +12,7 @@ defmodule Diffo.Access.Dslam do jason do pick [:name, :family, :model, :technology] - compact true + compact(true) end outstanding do diff --git a/lib/diffo/access/services/characteristic_values/line.ex b/lib/diffo/access/services/characteristic_values/line.ex index 6fc815d..5095654 100644 --- a/lib/diffo/access/services/characteristic_values/line.ex +++ b/lib/diffo/access/services/characteristic_values/line.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.Line do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -8,7 +12,7 @@ defmodule Diffo.Access.Line do jason do pick [:port, :slot, :standard, :profile] - compact true + compact(true) end outstanding do diff --git a/lib/diffo/access/services/dsl_access.ex b/lib/diffo/access/services/dsl_access.ex index 5d680a0..98cb2cc 100644 --- a/lib/diffo/access/services/dsl_access.ex +++ b/lib/diffo/access/services/dsl_access.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.DslAccess do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/application.ex b/lib/diffo/application.ex index 23c5123..a49a67f 100644 --- a/lib/diffo/application.ex +++ b/lib/diffo/application.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Application do @moduledoc false diff --git a/lib/diffo/changes/detail_relationship.ex b/lib/diffo/changes/detail_relationship.ex index 9043a8d..137ec97 100644 --- a/lib/diffo/changes/detail_relationship.ex +++ b/lib/diffo/changes/detail_relationship.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Changes.DetailRelationship do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -10,13 +14,17 @@ defmodule Diffo.Changes.DetailRelationship do def change(changeset, _opts, _context) do target_id = Ash.Changeset.get_argument_or_attribute(changeset, :target_id) + case Diffo.Provider.get_instance_by_id(target_id) do {:ok, target} -> - Ash.Changeset.force_change_attributes(changeset, target_href: Map.get(target, :href), target_type: Map.get(target, :type)) + Ash.Changeset.force_change_attributes(changeset, + target_href: Map.get(target, :href), + target_type: Map.get(target, :type) + ) + {:error, _error} -> changeset end - end # this can be used as follows, where it will set the target_href and target_type from that target instance diff --git a/lib/diffo/helpers/util.ex b/lib/diffo/helpers/util.ex index 0aa071c..5618bc5 100644 --- a/lib/diffo/helpers/util.ex +++ b/lib/diffo/helpers/util.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Util do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/helpers/uuid.ex b/lib/diffo/helpers/uuid.ex index 18aa352..1dbe288 100644 --- a/lib/diffo/helpers/uuid.ex +++ b/lib/diffo/helpers/uuid.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Uuid do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider-mermaid-class-diagram.mmd b/lib/diffo/provider-mermaid-class-diagram.mmd deleted file mode 100644 index 4c1a1b3..0000000 --- a/lib/diffo/provider-mermaid-class-diagram.mmd +++ /dev/null @@ -1,253 +0,0 @@ -classDiagram - class Specification { - UUID id - String name - String description - String category - Instance[] instances - destroy() - read() - create(UUID id, Atom type, String name, Integer major_version, ...) - list() - find_by_name(CiString query) - find_by_category(CiString query) - get_latest(CiString query) - describe(String description) - categorise(String category) - next_minor() - next_patch() - } - class Instance { - UUID id - Atom which - Boolean expected_id_from_twin - Atom type - String name - Atom service_operating_status - UUID specification_id - Atom service_state - ExternalIdentifier[] external_identifiers - Specification specification - ProcessStatus[] process_statuses - Feature[] features - Characteristic[] characteristics - EntityRef[] entities - PlaceRef[] places - PartyRef[] parties - destroy() - read() - create(UUID specified_by, UUID id, String name, Atom type, ...) - list() - find_by_name(CiString query) - find_by_specification_id(String query) - name(String name) - specify(UUID specification_id) - cancel() - feasibilityCheck() - reserve() - deactivate() - activate() - suspend() - terminate() - status(Atom service_operating_status) - } - class Relationship { - Atom alias - Atom type - UUID source_id - UUID target_id - Instance source - Instance target - Characteristic[] characteristic - destroy() - read() - create(UUID source_id, UUID target_id, Atom type, Atom alias) - list() - list_service_relationships_from(UUID instance_id) - list_resource_relationships_from(UUID instance_id) - update(Atom alias, Atom type) - } - class Characteristic { - Atom name - Term value - Atom type - UUID feature_id - UUID instance_id - UUID relationship_id - Feature feature - Instance instance - Relationship relationship - destroy() - read() - create(UUID feature_id, UUID instance_id, UUID relationship_id, Atom name, ...) - find_by_name(CiString query) - list() - list_characteristics_by_related_id(UUID related_id, Atom type) - update(Term value) - } - class Feature { - Atom name - Boolean isEnabled - UUID instance_id - Instance instance - Characteristic[] featureCharacteristic - destroy() - read() - create(UUID instance_id, Atom name, Boolean isEnabled) - find_by_name(CiString query) - list() - list_features_by_related_id(UUID related_id) - update(Boolean isEnabled) - } - class Place { - String id - String href - String name - Atom type - Atom referredType - PlaceRef[] place_refs - destroy() - read() - create(String id, String href, String name, Atom type, ...) - find_by_name(CiString query) - list() - update(String href, String name, Atom type, Atom referredType) - } - class PlaceRef { - Atom role - UUID instance_id - String place_id - Instance instance - Place place - destroy() - read() - create(UUID instance_id, Atom role, String place_id) - list() - list_place_refs_by_instance_id(UUID instance_id) - list_place_refs_by_place_id(String place_id) - find_by_place_id(CiString query) - update(Atom role) - } - class Party { - String id - String href - String name - Atom type - Atom referredType - PartyRef[] party_refs - ExternalIdentifier[] external_identifiers - destroy() - read() - create(String id, String href, String name, Atom type, ...) - find_by_name(CiString query) - list() - update(String href, String name, Atom type, Atom referredType) - } - class PartyRef { - Atom role - UUID instance_id - String party_id - Instance instance - Party party - destroy() - read() - create(UUID instance_id, Atom role, String party_id) - list() - list_party_refs_by_instance_id(UUID instance_id) - list_party_refs_by_party_id(String party_id) - find_by_party_id(CiString query) - update(Atom role) - } - class ExternalIdentifier { - String type - String external_id - UUID instance_id - String owner_id - Instance instance - Party owner - destroy() - read() - create(String type, String external_id, String owner_id, UUID instance_id) - find_by_external_id(CiString query) - list() - list_external_identifiers_by_instance_id(UUID instance_id) - list_external_identifiers_by_owner_id(String owner_id) - update(String type, String external_id, String owner_id, UUID instance_id) - } - class ProcessStatus { - String code - Atom severity - String message - Term parameterized_message - UUID instance_id - Instance instance - destroy() - read() - create(UUID instance_id, String code, Atom severity, String message, ...) - list() - list_process_statuses_by_instance_id(UUID instance_id) - update(String code, Atom severity, String message, Term parameterized_message) - } - class Note { - String text - String note_id - UUID instance_id - String author_id - Instance instance - Party author - destroy() - read() - create(UUID instance_id, String text, String note_id, String author_id) - find_by_note_id(CiString query) - list() - list_notes_by_instance_id(UUID instance_id) - list_notes_by_author_id(String author_id) - update(UUID instance_id, String text, String note_id, String author_id) - } - class Entity { - String id - String href - String name - Atom type - Atom referredType - EntityRef[] entity_refs - destroy() - read() - create(String id, String href, String name, Atom type, ...) - find_by_name(CiString query) - list() - update(String href, String name, Atom type, Atom referredType) - } - class EntityRef { - Atom role - UUID instance_id - String entity_id - Instance instance - Entity entity - destroy() - read() - create(UUID instance_id, Atom role, String entity_id) - list() - list_entity_refs_by_instance_id(UUID instance_id) - list_entity_refs_by_entity_id(String entity_id) - find_by_entity_id(CiString query) - update(Atom role) - } - - Characteristic -- Feature - Characteristic -- Instance - Characteristic -- Relationship - Entity -- EntityRef - EntityRef -- Instance - ExternalIdentifier -- Instance - ExternalIdentifier -- Party - Feature -- Instance - Instance -- Note - Instance -- PartyRef - Instance -- PlaceRef - Instance -- ProcessStatus - Instance -- Relationship - Instance -- Specification - Note -- Party - Party -- PartyRef - Place -- PlaceRef diff --git a/lib/diffo/provider-mermaid-class-diagram.png b/lib/diffo/provider-mermaid-class-diagram.png deleted file mode 100644 index b73ceeb3617b157fe1ffdb99818ea0fa403fdf91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91424 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%0A^ac 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 C()Bt3 diff --git a/lib/diffo/provider.ex b/lib/diffo/provider.ex index 9d27945..88c148a 100644 --- a/lib/diffo/provider.ex +++ b/lib/diffo/provider.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/base_instance.ex b/lib/diffo/provider/components/base_instance.ex index 04936ad..af3473d 100644 --- a/lib/diffo/provider/components/base_instance.ex +++ b/lib/diffo/provider/components/base_instance.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.BaseInstance do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -54,7 +58,7 @@ defmodule Diffo.Provider.BaseInstance do :type ] - compact true + compact(true) customize fn result, record -> result diff --git a/lib/diffo/provider/components/characteristic.ex b/lib/diffo/provider/components/characteristic.ex index 557ac3d..121b8d6 100644 --- a/lib/diffo/provider/components/characteristic.ex +++ b/lib/diffo/provider/components/characteristic.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Characteristic do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/entity.ex b/lib/diffo/provider/components/entity.ex index be1c421..a64e1e2 100644 --- a/lib/diffo/provider/components/entity.ex +++ b/lib/diffo/provider/components/entity.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Entity do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -25,7 +29,7 @@ defmodule Diffo.Provider.Entity do jason do pick [:id, :href, :name, :referredType, :type] - compact true + compact(true) rename referredType: "@referredType", type: "@type" end diff --git a/lib/diffo/provider/components/entity_ref.ex b/lib/diffo/provider/components/entity_ref.ex index 4d39a2c..2236526 100644 --- a/lib/diffo/provider/components/entity_ref.ex +++ b/lib/diffo/provider/components/entity_ref.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.EntityRef do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/external_identifier.ex b/lib/diffo/provider/components/external_identifier.ex index 2609db8..1d222b2 100644 --- a/lib/diffo/provider/components/external_identifier.ex +++ b/lib/diffo/provider/components/external_identifier.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.ExternalIdentifier do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/feature.ex b/lib/diffo/provider/components/feature.ex index 4c8bd2b..ef20f18 100644 --- a/lib/diffo/provider/components/feature.ex +++ b/lib/diffo/provider/components/feature.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Feature do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/instance-mermaid-flowchart.mmd b/lib/diffo/provider/components/instance-mermaid-flowchart.mmd deleted file mode 100644 index 3af3446..0000000 --- a/lib/diffo/provider/components/instance-mermaid-flowchart.mmd +++ /dev/null @@ -1,19 +0,0 @@ -stateDiagram-v2 -initial --> cancelled: cancel -initial --> feasibilityChecked: feasibilityCheck -feasibilityChecked --> cancelled: cancel -feasibilityChecked --> reserved: reserve -reserved --> cancelled: cancel -reserved --> inactive: deactivate -inactive --> active: activate -active --> inactive: deactivate -active --> suspended: suspend -suspended --> active: activate -suspended --> terminated: terminate -terminated --> active: activate -active --> terminated: terminate -inactive --> terminated: terminate -reserved --> active: activate -feasibilityChecked --> active: activate -initial --> reserved: reserve -initial --> active: activate \ No newline at end of file diff --git a/lib/diffo/provider/components/instance.ex b/lib/diffo/provider/components/instance.ex index 596e6e5..a9d28ad 100644 --- a/lib/diffo/provider/components/instance.ex +++ b/lib/diffo/provider/components/instance.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Instance do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/instance/extension.ex b/lib/diffo/provider/components/instance/extension.ex index e9871f0..7879295 100644 --- a/lib/diffo/provider/components/instance/extension.ex +++ b/lib/diffo/provider/components/instance/extension.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Instance.Extension do @moduledoc """ DSL Extension customising an Instance diff --git a/lib/diffo/provider/components/instance/extension/characteristic.ex b/lib/diffo/provider/components/instance/extension/characteristic.ex index 5dced4e..47f01e0 100644 --- a/lib/diffo/provider/components/instance/extension/characteristic.ex +++ b/lib/diffo/provider/components/instance/extension/characteristic.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Instance.Characteristic do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/instance/extension/feature.ex b/lib/diffo/provider/components/instance/extension/feature.ex index 07af5bd..04b5e15 100644 --- a/lib/diffo/provider/components/instance/extension/feature.ex +++ b/lib/diffo/provider/components/instance/extension/feature.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Instance.Feature do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/instance/extension/info.ex b/lib/diffo/provider/components/instance/extension/info.ex index aa1597a..938a782 100644 --- a/lib/diffo/provider/components/instance/extension/info.ex +++ b/lib/diffo/provider/components/instance/extension/info.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Instance.Extension.Info do use Spark.InfoGenerator, extension: Diffo.Provider.Instance.Extension, diff --git a/lib/diffo/provider/components/instance/extension/party.ex b/lib/diffo/provider/components/instance/extension/party.ex index ec6a860..ee63035 100644 --- a/lib/diffo/provider/components/instance/extension/party.ex +++ b/lib/diffo/provider/components/instance/extension/party.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Instance.Party do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/instance/extension/place.ex b/lib/diffo/provider/components/instance/extension/place.ex index 8ce5805..feebb6d 100644 --- a/lib/diffo/provider/components/instance/extension/place.ex +++ b/lib/diffo/provider/components/instance/extension/place.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Instance.Place do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/instance/extension/relationship.ex b/lib/diffo/provider/components/instance/extension/relationship.ex index cce60e8..18e2b95 100644 --- a/lib/diffo/provider/components/instance/extension/relationship.ex +++ b/lib/diffo/provider/components/instance/extension/relationship.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Instance.Relationship do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/instance/extension/specification.ex b/lib/diffo/provider/components/instance/extension/specification.ex index 325b6f1..0abec37 100644 --- a/lib/diffo/provider/components/instance/extension/specification.ex +++ b/lib/diffo/provider/components/instance/extension/specification.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Instance.Specification do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/instance/util.ex b/lib/diffo/provider/components/instance/util.ex index f7867be..c5162a8 100644 --- a/lib/diffo/provider/components/instance/util.ex +++ b/lib/diffo/provider/components/instance/util.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Instance.Util do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/note.ex b/lib/diffo/provider/components/note.ex index 89facef..be1e95b 100644 --- a/lib/diffo/provider/components/note.ex +++ b/lib/diffo/provider/components/note.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Note do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/party.ex b/lib/diffo/provider/components/party.ex index 98a92c0..36028c3 100644 --- a/lib/diffo/provider/components/party.ex +++ b/lib/diffo/provider/components/party.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Party do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -31,7 +35,7 @@ defmodule Diffo.Provider.Party do jason do pick [:id, :href, :name, :referredType, :type] - compact true + compact(true) rename referredType: "@referredType", type: "@type" end diff --git a/lib/diffo/provider/components/party_ref.ex b/lib/diffo/provider/components/party_ref.ex index 7611444..987a30f 100644 --- a/lib/diffo/provider/components/party_ref.ex +++ b/lib/diffo/provider/components/party_ref.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.PartyRef do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/place.ex b/lib/diffo/provider/components/place.ex index e9534be..dadbbec 100644 --- a/lib/diffo/provider/components/place.ex +++ b/lib/diffo/provider/components/place.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Place do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -25,7 +29,7 @@ defmodule Diffo.Provider.Place do jason do pick [:id, :href, :name, :referredType, :type] - compact true + compact(true) rename referredType: "@referredType", type: "@type" end diff --git a/lib/diffo/provider/components/place_ref.ex b/lib/diffo/provider/components/place_ref.ex index 59faa17..3de1c26 100644 --- a/lib/diffo/provider/components/place_ref.ex +++ b/lib/diffo/provider/components/place_ref.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.PlaceRef do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/process_status.ex b/lib/diffo/provider/components/process_status.ex index b406761..2918267 100644 --- a/lib/diffo/provider/components/process_status.ex +++ b/lib/diffo/provider/components/process_status.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.ProcessStatus do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/components/relationship.ex b/lib/diffo/provider/components/relationship.ex index 8a3250d..83b22d5 100644 --- a/lib/diffo/provider/components/relationship.ex +++ b/lib/diffo/provider/components/relationship.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Relationship do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -28,9 +32,14 @@ defmodule Diffo.Provider.Relationship do customize fn result, record -> target_type = Map.get(record, :target_type) - reference = %Diffo.Provider.Reference{id: record.target_id, href: Map.get(record, :target_href)} - list_name = Diffo.Provider.Relationship.derive_relationship_characteristic_list_name(target_type) + reference = %Diffo.Provider.Reference{ + id: record.target_id, + href: Map.get(record, :target_href) + } + + list_name = + Diffo.Provider.Relationship.derive_relationship_characteristic_list_name(target_type) result |> Diffo.Util.set(target_type, reference) @@ -183,7 +192,7 @@ defmodule Diffo.Provider.Relationship do prepare build( load: [:characteristics], sort: [alias: :asc, type: :asc, inserted_at: :asc] - ) + ) end @doc """ diff --git a/lib/diffo/provider/components/specification.ex b/lib/diffo/provider/components/specification.ex index c09c5ae..18a7adf 100644 --- a/lib/diffo/provider/components/specification.ex +++ b/lib/diffo/provider/components/specification.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Specification do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/instance-mermaid-flowchart.mmd b/lib/diffo/provider/instance-mermaid-flowchart.mmd deleted file mode 100644 index 3af3446..0000000 --- a/lib/diffo/provider/instance-mermaid-flowchart.mmd +++ /dev/null @@ -1,19 +0,0 @@ -stateDiagram-v2 -initial --> cancelled: cancel -initial --> feasibilityChecked: feasibilityCheck -feasibilityChecked --> cancelled: cancel -feasibilityChecked --> reserved: reserve -reserved --> cancelled: cancel -reserved --> inactive: deactivate -inactive --> active: activate -active --> inactive: deactivate -active --> suspended: suspend -suspended --> active: activate -suspended --> terminated: terminate -terminated --> active: activate -active --> terminated: terminate -inactive --> terminated: terminate -reserved --> active: activate -feasibilityChecked --> active: activate -initial --> reserved: reserve -initial --> active: activate \ No newline at end of file diff --git a/lib/diffo/provider/outstanding.ex b/lib/diffo/provider/outstanding.ex index b6d4b9d..c89730d 100644 --- a/lib/diffo/provider/outstanding.ex +++ b/lib/diffo/provider/outstanding.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Outstanding do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/provider/reference.ex b/lib/diffo/provider/reference.ex index 4e96343..0a3c730 100644 --- a/lib/diffo/provider/reference.ex +++ b/lib/diffo/provider/reference.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Reference do @moduledoc """ Diffo - TMF Service and Resource Management with a difference @@ -38,6 +42,7 @@ defmodule Diffo.Provider.Reference do case reference.href do nil -> Jason.encode!(%{id: reference.id}) + _ -> Jason.OrderedObject.new(id: reference.id, href: reference.href) |> Jason.encode!() diff --git a/lib/diffo/provider/service.ex b/lib/diffo/provider/service.ex index a60a468..d03aba8 100644 --- a/lib/diffo/provider/service.ex +++ b/lib/diffo/provider/service.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.Service do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/repo.ex b/lib/diffo/repo.ex index bbf5587..2370f9e 100644 --- a/lib/diffo/repo.ex +++ b/lib/diffo/repo.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Repo do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/validations/href_ends_with_id.ex b/lib/diffo/validations/href_ends_with_id.ex index bb5e4fc..e8a397e 100644 --- a/lib/diffo/validations/href_ends_with_id.ex +++ b/lib/diffo/validations/href_ends_with_id.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Validations.HrefEndsWithId do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/validations/is_related_different.ex b/lib/diffo/validations/is_related_different.ex index 0b6f4a0..e64b10a 100644 --- a/lib/diffo/validations/is_related_different.ex +++ b/lib/diffo/validations/is_related_different.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Validations.IsRelatedDifferent do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/diffo/validations/is_uuid4_or_nil.ex b/lib/diffo/validations/is_uuid4_or_nil.ex index 100ace7..5c594f9 100644 --- a/lib/diffo/validations/is_uuid4_or_nil.ex +++ b/lib/diffo/validations/is_uuid4_or_nil.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Validations.IsUuid4OrNil do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/lib/mix/tasks/diagram.ex b/lib/mix/tasks/diagram.ex index 5d31f07..050e1a7 100644 --- a/lib/mix/tasks/diagram.ex +++ b/lib/mix/tasks/diagram.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Mix.Tasks.Diagram do @moduledoc "The diagram mix task: `mix help diagram`" use Mix.Task diff --git a/logos/diffo.jpg.license b/logos/diffo.jpg.license new file mode 100644 index 0000000..40c9cb0 --- /dev/null +++ b/logos/diffo.jpg.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2025 diffo contributors + +SPDX-License-Identifier: MIT \ No newline at end of file diff --git a/mix.exs b/mix.exs index 6e423a9..2d375ec 100644 --- a/mix.exs +++ b/mix.exs @@ -1,9 +1,12 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT defmodule Diffo.MixProject do @moduledoc false use Mix.Project - @version "0.1.1" + @version "0.1.2" @name "Diffo" @description "TMF Service and Resource Manager with a difference" @github_url "https://github.com/diffo-dev/diffo" @@ -61,7 +64,7 @@ defmodule Diffo.MixProject do logo: "logos/diffo.jpg", extras: [ "README.md": [title: "Guide"], - "LICENSE.md": [title: "License"] + "LICENSES/MIT.md": [title: "License"] ] ] end diff --git a/mix.lock.license b/mix.lock.license new file mode 100644 index 0000000..40c9cb0 --- /dev/null +++ b/mix.lock.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2025 diffo contributors + +SPDX-License-Identifier: MIT \ No newline at end of file diff --git a/test/access/cable_test.exs b/test/access/cable_test.exs index 06a09c8..7e2ff2b 100644 --- a/test/access/cable_test.exs +++ b/test/access/cable_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.CableTest do @moduledoc false use ExUnit.Case diff --git a/test/access/card_test.exs b/test/access/card_test.exs index 3e8c9a1..5f6e4e1 100644 --- a/test/access/card_test.exs +++ b/test/access/card_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.CardTest do @moduledoc false use ExUnit.Case diff --git a/test/access/characteristic_value_test.exs b/test/access/characteristic_value_test.exs index 34ed889..304bd28 100644 --- a/test/access/characteristic_value_test.exs +++ b/test/access/characteristic_value_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.CharacteristicValueTest do @moduledoc false use ExUnit.Case diff --git a/test/access/dsl_access_test.exs b/test/access/dsl_access_test.exs index 79cf679..fc329df 100644 --- a/test/access/dsl_access_test.exs +++ b/test/access/dsl_access_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.DslAccessTest do @moduledoc false use ExUnit.Case diff --git a/test/access/path_test.exs b/test/access/path_test.exs index 0458375..0b885ba 100644 --- a/test/access/path_test.exs +++ b/test/access/path_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.PathTest do @moduledoc false use ExUnit.Case diff --git a/test/access/shelf_test.exs b/test/access/shelf_test.exs index 81bc5d2..c84c3e6 100644 --- a/test/access/shelf_test.exs +++ b/test/access/shelf_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Access.ShelfTest do @moduledoc false use ExUnit.Case @@ -111,7 +115,7 @@ defmodule Diffo.Access.ShelfTest do [card0, card1, card2, card3] = cards - #resource relationships are sorted in the create order of the relationships + # resource relationships are sorted in the create order of the relationships assert encoding == ~s({\"id\":\"#{shelf.id}",\"href\":\"resourceInventoryManagement/v4/resource/shelf/#{shelf.id}",\"category\":\"Network Resource\",\"resourceSpecification\":{\"id\":\"ef016d85-9dbd-429c-84da-1df56cc7dda5\",\"href\":\"resourceCatalogManagement/v4/resourceSpecification/ef016d85-9dbd-429c-84da-1df56cc7dda5\",\"name\":\"shelf\",\"version\":\"v1.0.0\"},\"resourceRelationship\":[{\"type\":\"contains\",\"resource\":{\"id\":\"#{card0.id}\",\"href\":\"resourceInventoryManagement/v4/resource/card/#{card0.id}\"}},{\"type\":\"contains\",\"resource\":{\"id\":\"#{card1.id}\",\"href\":\"resourceInventoryManagement/v4/resource/card/#{card1.id}\"}},{\"type\":\"contains\",\"resource\":{\"id\":\"#{card2.id}\",\"href\":\"resourceInventoryManagement/v4/resource/card/#{card2.id}\"}},{\"type\":\"contains\",\"resource\":{\"id\":\"#{card3.id}\",\"href\":\"resourceInventoryManagement/v4/resource/card/#{card3.id}\"}}],\"resourceCharacteristic\":[{\"name\":\"shelf\",\"value\":{\"name\":\"QDONC-1001\",\"family\":\"ISAM\",\"model\":\"ISAM7330\",\"technology\":\"DSLAM\"}},{\"name\":\"slots\",\"value\":{\"first\":1,\"last\":10,\"free\":10,\"type\":\"LineCard\",\"algorithm\":\"lowest\"}}],\"place\":[{\"id\":\"DONC-0001\",\"href\":\"place/telstra/DONC-0001\",\"name\":\"esaId\",\"role\":\"ServingArea\",\"@referredType\":\"GeographicLocation\",\"@type\":\"PlaceRef\"}],\"relatedParty\":[{\"id\":\"Access\",\"name\":\"organizationId\",\"role\":\"Provider\",\"@referredType\":\"Organization\",\"@type\":\"PartyRef\"}]}) end diff --git a/test/diffo_test.exs b/test/diffo_test.exs index ae70181..4bd2e52 100644 --- a/test/diffo_test.exs +++ b/test/diffo_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule DiffoTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/characteristic_test.exs b/test/provider/characteristic_test.exs index 1833af2..5c15345 100644 --- a/test/provider/characteristic_test.exs +++ b/test/provider/characteristic_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.CharacteristicTest do @moduledoc false use ExUnit.Case @@ -81,7 +85,6 @@ defmodule Diffo.Provider.CharacteristicTest do assert characteristic.value == "port13" end - test "create forward and reverse characteristic with same name on same relationship - success" do specification = Diffo.Provider.create_specification!(%{name: "evc"}) diff --git a/test/provider/entity_ref_test.exs b/test/provider/entity_ref_test.exs index 6ecd68a..aadab82 100644 --- a/test/provider/entity_ref_test.exs +++ b/test/provider/entity_ref_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.EntityRefTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/entity_test.exs b/test/provider/entity_test.exs index 71d610c..e1e4639 100644 --- a/test/provider/entity_test.exs +++ b/test/provider/entity_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.EntityTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/external_identifier_test.exs b/test/provider/external_identifier_test.exs index 1d59055..f6f6d0d 100644 --- a/test/provider/external_identifier_test.exs +++ b/test/provider/external_identifier_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.ExternalIdentifierTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/feature_test.exs b/test/provider/feature_test.exs index 1af479f..6806e64 100644 --- a/test/provider/feature_test.exs +++ b/test/provider/feature_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.FeatureTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/instance_test.exs b/test/provider/instance_test.exs index 71944df..ec4777b 100644 --- a/test/provider/instance_test.exs +++ b/test/provider/instance_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.InstanceTest do @moduledoc false use ExUnit.Case @@ -585,12 +589,12 @@ defmodule Diffo.Provider.InstanceTest do characteristics: [forward_relationship_characteristic.id] }) - _reverse_relationship = + _reverse_relationship = Diffo.Provider.create_relationship!(%{ type: :providedTo, source_id: child_instance.id, target_id: parent_instance.id - }) + }) place = Diffo.Provider.create_place!(%{ @@ -797,7 +801,7 @@ defmodule Diffo.Provider.InstanceTest do characteristics: [forward_relationship_characteristic.id] }) - _reverse_relationship = + _reverse_relationship = Diffo.Provider.create_relationship!(%{ type: :providedTo, source_id: child_instance.id, @@ -1025,7 +1029,7 @@ defmodule Diffo.Provider.InstanceTest do child_instance = Diffo.Provider.create_instance!(%{specified_by: child_specification.id, type: :resource}) - _reverse_relationship = + _reverse_relationship = Diffo.Provider.create_relationship!(%{ type: :assignedTo, source_id: child_instance.id, @@ -1358,7 +1362,7 @@ defmodule Diffo.Provider.InstanceTest do child_instance = Diffo.Provider.create_instance!(%{specified_by: child_specification.id, type: :resource}) - reverse_relationship = + reverse_relationship = Diffo.Provider.create_relationship!(%{ type: :assignedTo, source_id: child_instance.id, diff --git a/test/provider/note_test.exs b/test/provider/note_test.exs index 7bfc1a7..0b9560c 100644 --- a/test/provider/note_test.exs +++ b/test/provider/note_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.NoteTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/party_ref_test.exs b/test/provider/party_ref_test.exs index fa430a5..fd21bf0 100644 --- a/test/provider/party_ref_test.exs +++ b/test/provider/party_ref_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.PartyRefTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/party_test.exs b/test/provider/party_test.exs index 0051322..03c38e2 100644 --- a/test/provider/party_test.exs +++ b/test/provider/party_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.PartyTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/place_ref_test.exs b/test/provider/place_ref_test.exs index 1e5d794..c2fbeec 100644 --- a/test/provider/place_ref_test.exs +++ b/test/provider/place_ref_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.PlaceRefTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/place_test.exs b/test/provider/place_test.exs index b189391..46f1018 100644 --- a/test/provider/place_test.exs +++ b/test/provider/place_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.PlaceTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/process_status_test.exs b/test/provider/process_status_test.exs index c331b61..9fc7bbc 100644 --- a/test/provider/process_status_test.exs +++ b/test/provider/process_status_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.ProcessStatus.ProcessStatus do @moduledoc false use ExUnit.Case diff --git a/test/provider/reference_test.exs b/test/provider/reference_test.exs index d306824..2e7d24d 100644 --- a/test/provider/reference_test.exs +++ b/test/provider/reference_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.ReferenceTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/relationship_test.exs b/test/provider/relationship_test.exs index bfe3448..b4de649 100644 --- a/test/provider/relationship_test.exs +++ b/test/provider/relationship_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.RelationshipTest do @moduledoc false use ExUnit.Case diff --git a/test/provider/specification_test.exs b/test/provider/specification_test.exs index 5f21460..e826397 100644 --- a/test/provider/specification_test.exs +++ b/test/provider/specification_test.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Provider.SpecificationTest do @moduledoc false use ExUnit.Case diff --git a/test/support/characteristics.ex b/test/support/characteristics.ex index c9f16b9..54c43e5 100644 --- a/test/support/characteristics.ex +++ b/test/support/characteristics.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Test.Characteristics do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/test/support/parties.ex b/test/support/parties.ex index 6d8cc6d..37f0b71 100644 --- a/test/support/parties.ex +++ b/test/support/parties.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Test.Parties do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/test/support/places.ex b/test/support/places.ex index f0e8683..6cc29cf 100644 --- a/test/support/places.ex +++ b/test/support/places.ex @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + defmodule Diffo.Test.Places do @moduledoc """ Diffo - TMF Service and Resource Management with a difference diff --git a/test/test_helper.exs b/test/test_helper.exs index 7755b8b..5d462db 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2025 diffo contributors +# +# SPDX-License-Identifier: MIT + Mix.Task.run("app.start") ExUnit.start() level = Application.get_env(:logger, :console) |> Keyword.get(:level)