From e4f6575b239a35a01974b3a489061bd81ad5f823 Mon Sep 17 00:00:00 2001 From: Dan Wolfson Date: Wed, 16 Sep 2026 10:14:49 -0500 Subject: [PATCH 1/2] fix(dr-egeria): split Lineage Linker commands per relationship type, fix ISC/component membership sync, fix Update-template attribute leakage Split the generic Link/Update Lineage Relationship command pair into a dedicated command pair per relationship type (Data Flow, Control Flow, Process Call, Lineage Mapping, Data Mapping, Ultimate Source, Ultimate Destination), each exposing only its own type's attributes instead of a selector offering every type's attributes at once. In the process, added the real oneWay/integrationStyle/protocol/frequency/dataExchanged (and Process Call's lineNumber) fields to both the compact spec and the pyegeria SDK's DataFlowProperties/ProcessCallProperties/LineageMapping- Properties/UltimateSourceProperties/UltimateDestinationProperties -- these are real fields on the Egeria DTOs that had no home on the pydantic models, so a caller passing them would validate silently and have them dropped before serialization. Fixed SolutionComponentProcessor/SupplyChainProcessor (solution_ architect.py) syncing In Information Supply Chain/Implemented By via the ImplementedBy relationship instead of CollectionMembership -- InformationSupplyChain is a Collection subtype, so component membership in a supply chain belongs to the same add_to_collection/remove_from_ collection mechanism every other ISC membership sync in this file already uses. Reported live: 71 components each carrying In Information Supply Chain fanned each chain out to 143 ImplementedBy links. Fixed generate_md_cmd_templates.py/generate_dr_help.py injecting generic Referenceable attributes (GUID, Status, Qualified Name, Category, ...) into every "Update" command's template/help entry regardless of whether it targets a Referenceable element at all -- affected 14 commands total (the 7 new Lineage Linker ones plus 7 pre-existing: Update Certification, Update License, Update Next Process Step, Update Data Scope, Update Governance Expectations, Update Governance Measurements, Update Search Keyword). Now consults the registered processor's supports_target_element_lookup() (the same signal the runtime Create<->Update rewrite logic already relies on) instead of a verb-only heuristic. Signed-off-by: Dan Wolfson Co-Authored-By: Claude Sonnet 5 Signed-off-by: Dan Wolfson --- commands/tech/generate_dr_help.py | 32 +- commands/tech/generate_md_cmd_templates.py | 50 +- docs/dr_egeria_manual.md | 4 +- .../commands_lineage_linker_compact.json | 558 ++++++++++++++++-- md_processing/dr_egeria.py | 15 +- md_processing/v2/lineage_linker.py | 128 ++-- md_processing/v2/solution_architect.py | 42 +- pyegeria/omvs/lineage_linker.py | 49 ++ .../Action Author/Update_Next_Process_Step.md | 180 ------ .../advanced/Curation/Update_Data_Scope.md | 178 ------ .../Update_Governance_Expectations.md | 190 ------ .../Update_Governance_Measurements.md | 190 ------ .../Curation/Update_Search_Keyword.md | 190 ------ .../Update_Certification.md | 190 ------ .../Governance Officer/Update_License.md | 190 ------ .../Lineage Linker/Link_Control_Flow.md | 90 +++ .../advanced/Lineage Linker/Link_Data_Flow.md | 132 +++++ ...e_Relationship.md => Link_Data_Mapping.md} | 32 +- .../Lineage Linker/Link_Lineage_Mapping.md | 116 ++++ .../Lineage Linker/Link_Process_Call.md | 140 +++++ .../Link_Ultimate_Destination.md | 116 ++++ .../Lineage Linker/Link_Ultimate_Source.md | 116 ++++ .../Unlink_Lineage_Relationship.md | 4 +- .../Lineage Linker/Update_Control_Flow.md | 58 ++ .../Lineage Linker/Update_Data_Flow.md | 100 ++++ .../Lineage Linker/Update_Data_Mapping.md | 80 +++ .../Lineage Linker/Update_Lineage_Mapping.md | 84 +++ .../Update_Lineage_Relationship.md | 346 ----------- .../Lineage Linker/Update_Process_Call.md | 108 ++++ .../Update_Ultimate_Destination.md | 84 +++ .../Lineage Linker/Update_Ultimate_Source.md | 84 +++ .../basic/Curation/Update_Data_Scope.md | 66 --- .../Update_Governance_Expectations.md | 66 --- .../Update_Governance_Measurements.md | 66 --- .../basic/Curation/Update_Search_Keyword.md | 66 --- ...e_Relationship.md => Link_Control_Flow.md} | 14 +- .../basic/Lineage Linker/Link_Data_Flow.md | 84 +++ .../basic/Lineage Linker/Link_Data_Mapping.md | 40 ++ .../Lineage Linker/Link_Lineage_Mapping.md | 84 +++ .../basic/Lineage Linker/Link_Process_Call.md | 84 +++ .../Link_Ultimate_Destination.md | 84 +++ .../Lineage Linker/Link_Ultimate_Source.md | 84 +++ .../Unlink_Lineage_Relationship.md | 4 +- 43 files changed, 2534 insertions(+), 2084 deletions(-) create mode 100644 sample-data/templates/advanced/Lineage Linker/Link_Control_Flow.md create mode 100644 sample-data/templates/advanced/Lineage Linker/Link_Data_Flow.md rename sample-data/templates/advanced/Lineage Linker/{Link_Lineage_Relationship.md => Link_Data_Mapping.md} (68%) create mode 100644 sample-data/templates/advanced/Lineage Linker/Link_Lineage_Mapping.md create mode 100644 sample-data/templates/advanced/Lineage Linker/Link_Process_Call.md create mode 100644 sample-data/templates/advanced/Lineage Linker/Link_Ultimate_Destination.md create mode 100644 sample-data/templates/advanced/Lineage Linker/Link_Ultimate_Source.md create mode 100644 sample-data/templates/advanced/Lineage Linker/Update_Control_Flow.md create mode 100644 sample-data/templates/advanced/Lineage Linker/Update_Data_Flow.md create mode 100644 sample-data/templates/advanced/Lineage Linker/Update_Data_Mapping.md create mode 100644 sample-data/templates/advanced/Lineage Linker/Update_Lineage_Mapping.md delete mode 100644 sample-data/templates/advanced/Lineage Linker/Update_Lineage_Relationship.md create mode 100644 sample-data/templates/advanced/Lineage Linker/Update_Process_Call.md create mode 100644 sample-data/templates/advanced/Lineage Linker/Update_Ultimate_Destination.md create mode 100644 sample-data/templates/advanced/Lineage Linker/Update_Ultimate_Source.md rename sample-data/templates/basic/Lineage Linker/{Link_Lineage_Relationship.md => Link_Control_Flow.md} (60%) create mode 100644 sample-data/templates/basic/Lineage Linker/Link_Data_Flow.md create mode 100644 sample-data/templates/basic/Lineage Linker/Link_Data_Mapping.md create mode 100644 sample-data/templates/basic/Lineage Linker/Link_Lineage_Mapping.md create mode 100644 sample-data/templates/basic/Lineage Linker/Link_Process_Call.md create mode 100644 sample-data/templates/basic/Lineage Linker/Link_Ultimate_Destination.md create mode 100644 sample-data/templates/basic/Lineage Linker/Link_Ultimate_Source.md diff --git a/commands/tech/generate_dr_help.py b/commands/tech/generate_dr_help.py index 0b7dd5dd..917044e4 100644 --- a/commands/tech/generate_dr_help.py +++ b/commands/tech/generate_dr_help.py @@ -42,6 +42,36 @@ # colorize=True) logger.add("debug_log", rotation="1 day", retention="1 week", compression="zip", level="TRACE", format=log_format, colorize=True) +# --------------------------------------------------------------------------- +# See generate_md_cmd_templates.py's identical helper for the full rationale: +# relationship-only Update commands (their processor's +# supports_target_element_lookup() returns False) must not get the generic +# Referenceable upsert attributes (GUID, Qualified Name, Status, ...) -- +# `command_verb in ["Create", "Update"]` alone can't distinguish them from a +# genuine element Update, and the compact spec's `upsert` flag means +# something else entirely (Create<->Update variant-name auto-generation). +_dispatcher_processors: Optional[dict] = None + + +def _get_dispatcher_processors() -> dict: + global _dispatcher_processors + if _dispatcher_processors is None: + from md_processing.dr_egeria import setup_dispatcher + _dispatcher_processors = setup_dispatcher(None).processors + return _dispatcher_processors + + +def _update_targets_referenceable_element(command_name: str) -> bool: + try: + processor_cls = _get_dispatcher_processors().get(command_name) + if processor_cls is None or "supports_target_element_lookup" not in vars(processor_cls): + return True + return bool(processor_cls.supports_target_element_lookup(None)) + except Exception as e: + logger.warning(f"Could not determine target-element support for '{command_name}': {e}") + return True + + def get_iso8601_datetime(): """Returns the current date and time in ISO 8601 format.""" return datetime.now().strftime('%Y-%m-%dT%H:%M:%S') @@ -79,7 +109,7 @@ def _extract_help_fields(command: dict, client: Optional[ServerClient] = None): command_spec = get_command_spec(command) verb = command_spec.get('verb', None) from md_processing.md_processing_utils.md_processing_constants import LINK_VERBS - if verb in ["Create", "Update"]: + if verb == "Create" or (verb == "Update" and _update_targets_referenceable_element(command)): distinguished_attributes = command_spec.get('Attributes', []) attributes = add_default_upsert_attributes(distinguished_attributes) elif verb in LINK_VERBS: diff --git a/commands/tech/generate_md_cmd_templates.py b/commands/tech/generate_md_cmd_templates.py index 36fc536d..61070d65 100644 --- a/commands/tech/generate_md_cmd_templates.py +++ b/commands/tech/generate_md_cmd_templates.py @@ -40,6 +40,51 @@ LEVEL_ORDER = ["Common", "Domain", "Basic", "Advanced", "Expert", "Invisible"] +# --------------------------------------------------------------------------- +# Relationship-only Update commands must not get the generic Referenceable +# upsert attributes (GUID, Qualified Name, Status, Category, ...) injected -- +# they update a relationship's own properties by its own GUID, not a +# Referenceable element's. Confirmed 2026-09-16: the prior `command_verb in +# ["Create", "Update"]` gate here matched every "Update" command regardless +# of target, which is a different (broader) signal than compact_loader.py's +# actual runtime gate (`spec.get("upsert")` -- that flag means "does this +# command's Create variant auto-generate an Update synonym", not "does it +# target a Referenceable element", so it can't be reused here either: ~50 +# legitimate element Create commands have upsert=False and still need these +# defaults). The processor's own `supports_target_element_lookup()` override +# (see AsyncBaseCommandProcessor and its relationship-only subclass +# overrides -- LineageLinkProcessor, GovernanceLinkProcessor, etc.) is the +# actual runtime source of truth for this distinction, so this generator +# reads it directly from the registered dispatcher rather than re-deriving +# a second, possibly-diverging heuristic from the compact spec. +_dispatcher_processors: Optional[dict] = None + + +def _get_dispatcher_processors() -> dict: + global _dispatcher_processors + if _dispatcher_processors is None: + from md_processing.dr_egeria import setup_dispatcher + # No live calls happen at registration time -- a dummy client is fine, + # this dispatcher is only ever used here to inspect registered classes. + _dispatcher_processors = setup_dispatcher(None).processors + return _dispatcher_processors + + +def _update_targets_referenceable_element(command_name: str) -> bool: + """True unless the command's registered processor declares itself + relationship-only via `supports_target_element_lookup() -> False`. + Defaults to True (preserve prior behaviour) if the command isn't + registered or the check can't be made -- never silently strips an + element command's attributes.""" + try: + processor_cls = _get_dispatcher_processors().get(command_name) + if processor_cls is None or "supports_target_element_lookup" not in vars(processor_cls): + return True + return bool(processor_cls.supports_target_element_lookup(None)) + except Exception as e: + logger.warning(f"Could not determine target-element support for '{command_name}': {e}") + return True + def _level_visible(attr_level: str, usage_level: str = "Advanced") -> bool: """Return True if attr_level should be rendered at the given usage_level ceiling. @@ -302,8 +347,9 @@ def main(): from md_processing.md_processing_utils.md_processing_constants import LINK_VERBS if command_verb in LINK_VERBS: attributes = add_default_link_attributes(copy.deepcopy(distinguished_attributes)) - elif command_verb in ["Create", "Update"]: - # Create, Update uses upsert defaults + elif command_verb == "Create" or (command_verb == "Update" and _update_targets_referenceable_element(command)): + # Create always targets a Referenceable element in this codebase (confirmed); + # Update only sometimes does -- see _update_targets_referenceable_element. attributes = add_default_upsert_attributes(copy.deepcopy(distinguished_attributes)) else: attributes = copy.deepcopy(distinguished_attributes) diff --git a/docs/dr_egeria_manual.md b/docs/dr_egeria_manual.md index e7da3cad..50ed1ce5 100644 --- a/docs/dr_egeria_manual.md +++ b/docs/dr_egeria_manual.md @@ -242,7 +242,9 @@ Dr.Egeria organizes its commands into "families," each corresponding to a specif - **Solution Architect**: Manage solution blueprints, components, information supply chains, and design patterns (e.g., `Create Design Pattern`, `Link Nested Design Patterns`, `Link Specialized Design Patterns`, `Link Related Design Patterns`). - **Concept Models** (0571, added 2026-08-21): `Create Concept Bead`, `Create Concept Bead Attribute`, `Create Concept Bead Relationship`, and 8 relationship commands — `Link Concept Design`, `Link Concept Bead Relationship End`, `Link Typed By Concept Bead`, `Link Is A Concept Bead`, `Link Concept Bead Attribute Link`, `Link Concept Bead Extension`, `Link Solution Component Port`, `Link Solution Port Delegation` (`Detach`/`Unlink`/`Remove` variants auto-derived from each `Link` command). Routed through the existing generic `SolutionArchitectProcessor`/`SolutionLinkProcessor` (new `om_type` branches, no new processor classes needed) — auto-registered via `register_solution_architect_processors()`'s family-driven loop, same as every other Solution Architect command. - `Create Concept Model` (added 2026-08-21) creates the `ConceptModel` container `Link Concept Design` attaches elements to. No dedicated `/solution-architect/concept-models` REST endpoint exists yet, so this routes through the generic `Collection Manager` creation path instead — added `"Concept Model"` to `COLLECTION_SUBTYPES` (`md_processing_constants.py`), which per this repo's own convention is the entire wiring step (auto-routes to `CollectionManagerProcessor`'s existing generic-collection-subtype fallback, no bespoke pyegeria method needed). Live-verified end to end against a running 6.2-SNAPSHOT server: `Create Concept Model` → `Create Concept Bead` → `Link Concept Design`, with the `ConceptDesign` relationship confirmed present via direct fetch afterward. - - `Link Implemented By` (0737, added 2026-09-13): attaches a design object (Information Supply Chain, Solution Component, Governance Definition, ...) to its implementation via the `ImplementedBy` relationship — a cross-OMVS call to `governance_officer`'s `linkDesignToImplementation`/`detachDesignFromImplementation` endpoints (`Detach`/`Unlink`/`Remove` variants auto-derived, same mechanism as the Concept Model relationship commands above). `Create Information Supply Chain` also gained an `Implemented By` (Reference Name List) attribute, synced the same way as its existing `Nested Information Supply Chains`/`In Information Supply Chain` attributes. Investigating a user report that `Link Information Supply Chain Child` created `ImplementedBy` instead of `CollectionMembership` found the command already correct in the current code (confirmed live) — the report didn't reproduce, likely stale from an earlier release. Along the way, fixed a real latent bug: `_get_supply_chain_rel_elements()` read a nonexistent `implementedByList` field instead of the real `implementedBy` (confirmed against `AttributedMetadataElement.java` and a live element fetch) — this had silently made the `Implemented By` sync's as-is diff always see zero existing relationships. + - `Link Implemented By` (0737, added 2026-09-13): attaches a design object (Information Supply Chain, Solution Component, Governance Definition, ...) to its implementation via the `ImplementedBy` relationship — a cross-OMVS call to `governance_officer`'s `linkDesignToImplementation`/`detachDesignFromImplementation` endpoints (`Detach`/`Unlink`/`Remove` variants auto-derived, same mechanism as the Concept Model relationship commands above). Along the way, fixed a real latent bug: `_get_supply_chain_rel_elements()` read a nonexistent `implementedByList` field instead of the real `implementedBy` (confirmed against `AttributedMetadataElement.java` and a live element fetch) — this had silently made the `Implemented By` sync's as-is diff always see zero existing relationships. + - **Correction, 2026-09-16:** the paragraph above's `Create Information Supply Chain`/`Create Solution Component` sync was itself wrong — `In Information Supply Chain` (on `Create Solution Component`) and `Implemented By` (on `Create Information Supply Chain`) were both syncing via `ImplementedBy` (the mechanism `Link Implemented By` legitimately uses), when `InformationSupplyChain` is a Collection subtype and these two attributes are ordinary collection membership. Reported live: 71 components each carrying `In Information Supply Chain` fanned each chain out to 143 `ImplementedBy` links, alongside the 47 correct `CollectionMembership`s from explicit `Add Member` blocks. Both sync points (`SolutionComponentProcessor._sync_all_rels`'s "Supply Chains" block and `SupplyChainProcessor._sync_rels`'s "Implemented By" block, `solution_architect.py`) now call `_async_add_to_collection`/`_async_remove_from_collection` with `CollectionMembershipProperties`, matching every other ISC membership sync in this file. Pre-existing bad `ImplementedBy` links created before this fix are not auto-cleaned — the as-is fetch now reads `collectionMembers`, not `implementedBy`, so a re-sync no longer sees or touches them; removing them is a separate one-off cleanup against affected servers. +- **Lineage Linker** (added 2026-09-16): Create/update/detach the seven Lineage Linker OMVS relationship types (0750/0755/0770 — DataFlow, ControlFlow, ProcessCall, LineageMapping, DataMapping, UltimateSource, UltimateDestination) between two elements, e.g. `Link Data Flow`, `Update Process Call`, `Link Data Mapping`. One dedicated `Link`/`Update` command pair per type (each with only its own type's attributes — Guard/Mandatory Guard for `Control Flow`; Query/Query ID/Query Type for `Data Mapping`; One Way/Integration Style/Protocol/Frequency/Data Exchanged, reused from Solution Architect's `SolutionLinkingWire` attributes, for the rest), plus one shared `Unlink Lineage Relationship` command since detaching only needs the relationship's own GUID. Split from an earlier single generic command triple that used a `Lineage Relationship Type` selector attribute offering every type's attributes regardless of which type was picked. The split also surfaced and fixed a real gap: the pyegeria SDK's `DataFlowProperties`/`ProcessCallProperties`/`LineageMappingProperties`/`UltimateSourceProperties`/`UltimateDestinationProperties` (`pyegeria/omvs/lineage_linker.py`) were missing `oneWay`/`integrationStyle`/`protocol`/`frequency`/`dataExchanged` (and `ProcessCallProperties` was missing `lineNumber`) entirely — real fields on the Egeria DTOs (`DataLineageRelationshipProperties`/`ProcessCallProperties.java`) that had no home on the pydantic model, so a caller passing them would validate silently and have them dropped before serialization (the `PyegeriaModel` `extra='ignore'` gotcha — see the SDK section below). - **Governance Officer**: Manage governance definitions, policies, and responsibilities. - **Action Author**: Define governance action process flows — reusable single-step action types and multi-step processes — and wire them to the engines and elements that execute them, without writing code (e.g., `Create Governance Action Process`, `Create Governance Action Process Step`, `Link First Process Step`, `Link Next Process Step`, `Link Action to Action Executor`, `Link Action to Target`). - **Curation**: Apply classifications and relationships to *existing* Referenceable elements after the fact — this family creates no elements of its own, it curates ones created elsewhere. Every command names a `Target Element` (Reference Name) and either a classification level/status or a second element to relate to. diff --git a/md_processing/data/compact_commands/commands_lineage_linker_compact.json b/md_processing/data/compact_commands/commands_lineage_linker_compact.json index a8953f28..f339739e 100644 --- a/md_processing/data/compact_commands/commands_lineage_linker_compact.json +++ b/md_processing/data/compact_commands/commands_lineage_linker_compact.json @@ -238,7 +238,7 @@ "default_value": "", "valid_values": [], "existing_element": "", - "description": "The GUID of the lineage relationship, as returned when it was linked (Link Lineage Relationship's output).", + "description": "The GUID of the lineage relationship, as returned when it was linked (a Link command's output).", "generated": false, "style": "Simple", "user_specified": true, @@ -249,84 +249,341 @@ "level": "Basic", "Journal Entry": "" }, - "Lineage Relationship Type": { - "variable_name": "relationship_type", + "One Way": { + "variable_name": "one_way", + "inUpdate": true, + "attr_labels": "Unidirectional", + "examples": "", + "default_value": "True", + "valid_values": [], + "existing_element": "", + "description": "Is the link one way or bi-directional?", + "generated": false, + "style": "Bool", + "user_specified": true, + "unique": false, + "input_required": false, + "min_cardinality": 0, + "max_cardinality": 1, + "level": "Basic", + "Journal Entry": "" + }, + "Integration Style": { + "variable_name": "integration_style", "inUpdate": true, "attr_labels": "", "examples": "", "default_value": "", - "valid_values": [ - "DataFlow", - "ControlFlow", - "ProcessCall", - "LineageMapping", - "DataMapping", - "UltimateSource", - "UltimateDestination" - ], + "valid_values": [], "existing_element": "", - "description": "The kind of lineage relationship to create/update -- determines which of the type-specific properties below apply (Formula/Formula Type: DataFlow, ProcessCall, DataMapping; Guard/Mandatory Guard: ControlFlow; Query/Query ID/Query Type: DataMapping only).", + "description": "The integration style of the information supply chain (e.g. how data flows between segments).", "generated": false, - "style": "Valid Value", + "style": "Simple", "user_specified": true, "unique": false, - "input_required": true, - "min_cardinality": 1, + "input_required": false, + "min_cardinality": 0, + "max_cardinality": 1, + "level": "Domain", + "Journal Entry": "" + }, + "Protocol": { + "variable_name": "protocol", + "inUpdate": true, + "attr_labels": "", + "examples": "", + "default_value": "", + "valid_values": [], + "existing_element": "", + "description": "Name of the protocol used for interaction.", + "generated": false, + "style": "Simple", + "user_specified": true, + "unique": false, + "input_required": false, + "min_cardinality": 0, + "max_cardinality": 1, + "level": "Common", + "Journal Entry": "" + }, + "Frequency": { + "variable_name": "frequency", + "inUpdate": true, + "attr_labels": "", + "examples": "", + "default_value": "", + "valid_values": [], + "existing_element": "", + "description": "A frequency of interaction.", + "generated": false, + "style": "Simple", + "user_specified": true, + "unique": false, + "input_required": false, + "min_cardinality": 0, "max_cardinality": 1, "level": "Basic", "Journal Entry": "" + }, + "Data Exchanged": { + "variable_name": "data_exchanged", + "inUpdate": true, + "attr_labels": "", + "examples": "", + "default_value": "", + "valid_values": [], + "existing_element": "", + "description": "The data exchanged in an interaction.", + "generated": false, + "style": "Simple", + "user_specified": true, + "unique": false, + "input_required": false, + "min_cardinality": 0, + "max_cardinality": 1, + "level": "Domain", + "Journal Entry": "" + }, + "Line Number": { + "variable_name": "line_number", + "inUpdate": true, + "attr_labels": "", + "examples": "", + "default_value": "", + "valid_values": [], + "existing_element": "", + "description": "Line number in the source code where this process call is made (ProcessCall only).", + "generated": false, + "style": "Simple", + "user_specified": true, + "unique": false, + "input_required": false, + "min_cardinality": 0, + "max_cardinality": 1, + "level": "Advanced", + "Journal Entry": "" } }, "bundles": { - "Lineage Link Base": { + "Lineage Unlink Base": { + "inherits": null, + "own_attributes": [ + "Lineage Relationship" + ] + }, + "Data Flow Properties Base": { "inherits": null, "own_attributes": [ - "Element One", - "Element Two", - "Lineage Relationship Type", "ISC Qualified Name", "Label", "Description", + "One Way", + "Integration Style", + "Protocol", + "Frequency", + "Data Exchanged", "Formula", - "Formula Type", + "Formula Type" + ] + }, + "Control Flow Properties Base": { + "inherits": null, + "own_attributes": [ + "ISC Qualified Name", + "Label", + "Description", "Guard", - "Mandatory Guard", - "Query ID", - "Query", - "Query Type" + "Mandatory Guard" ] }, - "Lineage Update Base": { + "Process Call Properties Base": { + "inherits": null, + "own_attributes": [ + "ISC Qualified Name", + "Label", + "Description", + "One Way", + "Integration Style", + "Protocol", + "Frequency", + "Data Exchanged", + "Formula", + "Formula Type", + "Line Number" + ] + }, + "Lineage Mapping Properties Base": { + "inherits": null, + "own_attributes": [ + "ISC Qualified Name", + "Label", + "Description", + "One Way", + "Integration Style", + "Protocol", + "Frequency", + "Data Exchanged" + ] + }, + "Data Mapping Properties Base": { "inherits": null, "own_attributes": [ - "Lineage Relationship", - "Lineage Relationship Type", "ISC Qualified Name", "Label", "Description", "Formula", "Formula Type", - "Guard", - "Mandatory Guard", "Query ID", "Query", "Query Type" ] }, - "Lineage Unlink Base": { + "Ultimate Source Properties Base": { + "inherits": null, + "own_attributes": [ + "ISC Qualified Name", + "Label", + "Description", + "One Way", + "Integration Style", + "Protocol", + "Frequency", + "Data Exchanged" + ] + }, + "Ultimate Destination Properties Base": { "inherits": null, + "own_attributes": [ + "ISC Qualified Name", + "Label", + "Description", + "One Way", + "Integration Style", + "Protocol", + "Frequency", + "Data Exchanged" + ] + }, + "Link Data Flow": { + "inherits": "Data Flow Properties Base", + "own_attributes": [ + "Element One", + "Element Two" + ] + }, + "Update Data Flow": { + "inherits": "Data Flow Properties Base", + "own_attributes": [ + "Lineage Relationship" + ] + }, + "Link Control Flow": { + "inherits": "Control Flow Properties Base", + "own_attributes": [ + "Element One", + "Element Two" + ] + }, + "Update Control Flow": { + "inherits": "Control Flow Properties Base", + "own_attributes": [ + "Lineage Relationship" + ] + }, + "Link Process Call": { + "inherits": "Process Call Properties Base", + "own_attributes": [ + "Element One", + "Element Two" + ] + }, + "Update Process Call": { + "inherits": "Process Call Properties Base", + "own_attributes": [ + "Lineage Relationship" + ] + }, + "Link Lineage Mapping": { + "inherits": "Lineage Mapping Properties Base", + "own_attributes": [ + "Element One", + "Element Two" + ] + }, + "Update Lineage Mapping": { + "inherits": "Lineage Mapping Properties Base", + "own_attributes": [ + "Lineage Relationship" + ] + }, + "Link Data Mapping": { + "inherits": "Data Mapping Properties Base", + "own_attributes": [ + "Element One", + "Element Two" + ] + }, + "Update Data Mapping": { + "inherits": "Data Mapping Properties Base", + "own_attributes": [ + "Lineage Relationship" + ] + }, + "Link Ultimate Source": { + "inherits": "Ultimate Source Properties Base", + "own_attributes": [ + "Element One", + "Element Two" + ] + }, + "Update Ultimate Source": { + "inherits": "Ultimate Source Properties Base", + "own_attributes": [ + "Lineage Relationship" + ] + }, + "Link Ultimate Destination": { + "inherits": "Ultimate Destination Properties Base", + "own_attributes": [ + "Element One", + "Element Two" + ] + }, + "Update Ultimate Destination": { + "inherits": "Ultimate Destination Properties Base", "own_attributes": [ "Lineage Relationship" ] } }, "commands": { - "Link Lineage Relationship": { + "Unlink Lineage Relationship": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [ + "Detach Lineage Relationship" + ], + "family": "Lineage Linker", + "description": "Detach (delete) an existing lineage relationship of any type, identified by its own relationship GUID (as returned by any Link command).", + "verb": "Unlink", + "upsert": false, + "attach": false, + "level": "Basic", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "", + "bundle": "Lineage Unlink Base", + "custom_attributes": [], + "Journal Entry": "" + }, + "Link Data Flow": { "display_name": "lineage_relationship", "qn_prefix": "", "alternate_names": [], "family": "Lineage Linker", - "description": "Create a lineage relationship (DataFlow, ControlFlow, ProcessCall, LineageMapping, DataMapping, UltimateSource, or UltimateDestination) between two elements, e.g. to trace how data moves through a pipeline.", + "description": "Create a DataFlow lineage relationship between two elements.", "verb": "Link", "upsert": false, "attach": false, @@ -335,17 +592,17 @@ "find_constraints": "", "extra_find": "", "extra_constraints": "", - "OM_TYPE": "", - "bundle": "Lineage Link Base", + "OM_TYPE": "DataFlow", + "bundle": "Link Data Flow", "custom_attributes": [], "Journal Entry": "" }, - "Update Lineage Relationship": { + "Update Data Flow": { "display_name": "lineage_relationship", "qn_prefix": "", "alternate_names": [], "family": "Lineage Linker", - "description": "Update the properties of an existing lineage relationship, identified by its own relationship GUID (as returned by Link Lineage Relationship).", + "description": "Update the properties of an existing DataFlow lineage relationship, identified by its own relationship GUID.", "verb": "Update", "upsert": false, "attach": false, @@ -354,20 +611,18 @@ "find_constraints": "", "extra_find": "", "extra_constraints": "", - "OM_TYPE": "", - "bundle": "Lineage Update Base", + "OM_TYPE": "DataFlow", + "bundle": "Update Data Flow", "custom_attributes": [], "Journal Entry": "" }, - "Unlink Lineage Relationship": { + "Link Control Flow": { "display_name": "lineage_relationship", "qn_prefix": "", - "alternate_names": [ - "Detach Lineage Relationship" - ], + "alternate_names": [], "family": "Lineage Linker", - "description": "Detach (delete) an existing lineage relationship, identified by its own relationship GUID (as returned by Link Lineage Relationship).", - "verb": "Unlink", + "description": "Create a ControlFlow lineage relationship between two elements.", + "verb": "Link", "upsert": false, "attach": false, "level": "Basic", @@ -375,8 +630,217 @@ "find_constraints": "", "extra_find": "", "extra_constraints": "", - "OM_TYPE": "", - "bundle": "Lineage Unlink Base", + "OM_TYPE": "ControlFlow", + "bundle": "Link Control Flow", + "custom_attributes": [], + "Journal Entry": "" + }, + "Update Control Flow": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [], + "family": "Lineage Linker", + "description": "Update the properties of an existing ControlFlow lineage relationship, identified by its own relationship GUID.", + "verb": "Update", + "upsert": false, + "attach": false, + "level": "Advanced", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "ControlFlow", + "bundle": "Update Control Flow", + "custom_attributes": [], + "Journal Entry": "" + }, + "Link Process Call": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [], + "family": "Lineage Linker", + "description": "Create a ProcessCall lineage relationship between two elements.", + "verb": "Link", + "upsert": false, + "attach": false, + "level": "Basic", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "ProcessCall", + "bundle": "Link Process Call", + "custom_attributes": [], + "Journal Entry": "" + }, + "Update Process Call": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [], + "family": "Lineage Linker", + "description": "Update the properties of an existing ProcessCall lineage relationship, identified by its own relationship GUID.", + "verb": "Update", + "upsert": false, + "attach": false, + "level": "Advanced", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "ProcessCall", + "bundle": "Update Process Call", + "custom_attributes": [], + "Journal Entry": "" + }, + "Link Lineage Mapping": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [], + "family": "Lineage Linker", + "description": "Create a LineageMapping lineage relationship between two elements.", + "verb": "Link", + "upsert": false, + "attach": false, + "level": "Basic", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "LineageMapping", + "bundle": "Link Lineage Mapping", + "custom_attributes": [], + "Journal Entry": "" + }, + "Update Lineage Mapping": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [], + "family": "Lineage Linker", + "description": "Update the properties of an existing LineageMapping lineage relationship, identified by its own relationship GUID.", + "verb": "Update", + "upsert": false, + "attach": false, + "level": "Advanced", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "LineageMapping", + "bundle": "Update Lineage Mapping", + "custom_attributes": [], + "Journal Entry": "" + }, + "Link Data Mapping": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [], + "family": "Lineage Linker", + "description": "Create a DataMapping lineage relationship between two elements.", + "verb": "Link", + "upsert": false, + "attach": false, + "level": "Basic", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "DataMapping", + "bundle": "Link Data Mapping", + "custom_attributes": [], + "Journal Entry": "" + }, + "Update Data Mapping": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [], + "family": "Lineage Linker", + "description": "Update the properties of an existing DataMapping lineage relationship, identified by its own relationship GUID.", + "verb": "Update", + "upsert": false, + "attach": false, + "level": "Advanced", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "DataMapping", + "bundle": "Update Data Mapping", + "custom_attributes": [], + "Journal Entry": "" + }, + "Link Ultimate Source": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [], + "family": "Lineage Linker", + "description": "Create a UltimateSource lineage relationship between two elements.", + "verb": "Link", + "upsert": false, + "attach": false, + "level": "Basic", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "UltimateSource", + "bundle": "Link Ultimate Source", + "custom_attributes": [], + "Journal Entry": "" + }, + "Update Ultimate Source": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [], + "family": "Lineage Linker", + "description": "Update the properties of an existing UltimateSource lineage relationship, identified by its own relationship GUID.", + "verb": "Update", + "upsert": false, + "attach": false, + "level": "Advanced", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "UltimateSource", + "bundle": "Update Ultimate Source", + "custom_attributes": [], + "Journal Entry": "" + }, + "Link Ultimate Destination": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [], + "family": "Lineage Linker", + "description": "Create a UltimateDestination lineage relationship between two elements.", + "verb": "Link", + "upsert": false, + "attach": false, + "level": "Basic", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "UltimateDestination", + "bundle": "Link Ultimate Destination", + "custom_attributes": [], + "Journal Entry": "" + }, + "Update Ultimate Destination": { + "display_name": "lineage_relationship", + "qn_prefix": "", + "alternate_names": [], + "family": "Lineage Linker", + "description": "Update the properties of an existing UltimateDestination lineage relationship, identified by its own relationship GUID.", + "verb": "Update", + "upsert": false, + "attach": false, + "level": "Advanced", + "find_method": "", + "find_constraints": "", + "extra_find": "", + "extra_constraints": "", + "OM_TYPE": "UltimateDestination", + "bundle": "Update Ultimate Destination", "custom_attributes": [], "Journal Entry": "" } diff --git a/md_processing/dr_egeria.py b/md_processing/dr_egeria.py index 49bd7df2..a0925f3a 100644 --- a/md_processing/dr_egeria.py +++ b/md_processing/dr_egeria.py @@ -394,14 +394,15 @@ def reg(base, cls): reg("Update Certification", GovernanceLinkProcessor) reg("Update License", GovernanceLinkProcessor) - # Lineage Linker -- one generic Link/Update/Unlink command triple covering - # all seven Lineage Linker OMVS relationship types (DataFlow, ControlFlow, - # ProcessCall, LineageMapping, DataMapping, UltimateSource, - # UltimateDestination) via a "Relationship Type" selector attribute, - # rather than a separate command pair per type. - reg("Link Lineage Relationship", LineageLinkProcessor) + # Lineage Linker -- a dedicated Link/Update command pair per relationship + # type (2026-09-16 split from one generic selector-attribute command triple + # -- see lineage_linker.py's module docstring for why), plus one shared + # Unlink command since detach only needs the relationship GUID. + for _lineage_type in ("Data Flow", "Control Flow", "Process Call", "Lineage Mapping", + "Data Mapping", "Ultimate Source", "Ultimate Destination"): + reg(f"Link {_lineage_type}", LineageLinkProcessor) + reg(f"Update {_lineage_type}", UpdateLineageRelationshipProcessor) reg("Unlink Lineage Relationship", LineageLinkProcessor) - reg("Update Lineage Relationship", UpdateLineageRelationshipProcessor) # Asset Maker (Automated Curation's create-from-template surface) reg("Create Element", AssetMakerProcessor) diff --git a/md_processing/v2/lineage_linker.py b/md_processing/v2/lineage_linker.py index 75cb4a86..304bfd43 100644 --- a/md_processing/v2/lineage_linker.py +++ b/md_processing/v2/lineage_linker.py @@ -1,22 +1,27 @@ """ -Lineage Linker Processor for Dr.Egeria v2. - -Handles `Link Lineage Relationship`, `Update Lineage Relationship`, and -`Unlink Lineage Relationship` -- the Lineage Linker OMVS's seven relationship -types (DataFlow, ControlFlow, ProcessCall, LineageMapping, DataMapping, -UltimateSource, UltimateDestination; see pyegeria's -omvs/lineage_linker.py and egeria-project.org/types/2/0223-Data-Flows-And- -Control-Flows) modeled as ONE generic Link/Update/Unlink command triple with -a `Relationship Type` selector attribute, mirroring the OMVS client's own -generic `link_lineage(element_one, relationship_type_name, element_two, -body)` design -- rather than seven separate Link/Unlink command pairs, which -would just be fourteen thin wrappers around the same two endpoints. +Lineage Linker Processors for Dr.Egeria v2. + +Handles `Link `, `Update `, and `Unlink Lineage Relationship` -- +the Lineage Linker OMVS's seven relationship types (DataFlow, ControlFlow, +ProcessCall, LineageMapping, DataMapping, UltimateSource, +UltimateDestination; see pyegeria's omvs/lineage_linker.py and +egeria-project.org/types/2/0223-Data-Flows-And-Control-Flows). Split +2026-09-16 into one dedicated Link/Update command pair per relationship type +(Link Data Flow, Update Data Flow, Link Control Flow, ...) rather than one +generic command with a "Lineage Relationship Type" selector attribute -- the +generic form let a user pick, say, DataFlow and then be offered every other +type's attributes too (Guard/Mandatory Guard, Query/Query ID/Query Type, +...), none of which apply. Each command's own `OM_TYPE` in the compact spec +now says which relationship type it builds, so LineageLinkProcessor / +UpdateLineageRelationshipProcessor read that instead of a user-supplied +selector -- one class per verb still handles all seven types, just routed by +command identity rather than by attribute value. DataFlow is the one exception: the OMVS exposes a *separate* dedicated endpoint for it (`link_data_flow` -> .../from-elements/.../via/.../ to-elements/.../attach, distinct from link_lineage's .../elements/.../.../ -attach), so `_link()` below routes to it specifically when Relationship Type -== "DataFlow"; every other type goes through the generic `link_lineage`. +attach), so `_link()` below routes to it specifically when OM_TYPE == +"DataFlow"; every other type goes through the generic `link_lineage`. Unlike Link (which resolves its two element ends via the framework's standard Reference Name attribute-resolution pass -- see the "guid" key @@ -24,7 +29,32 @@ relationship itself directly by its own GUID (as returned by Link's output) -- `update_lineage`/`detach_lineage` take that relationship GUID, not the two element ends, so there's no element resolution involved for those two -commands. +commands. Unlink stays a single generic command (not split per type) since +detaching a relationship only needs its GUID -- no type-specific properties +are involved. + +Full attribute set per type, confirmed against +open-metadata-framework/.../properties/lineage/*.java (the compact JSON's +prior attribute set was missing One Way/Integration Style/Protocol/ +Frequency/Data Exchanged for every DataLineageRelationshipProperties +subtype, and Line Number for ProcessCall -- these are real fields on the +Java DTOs, just never wired into Dr.Egeria; the reused attribute +definitions -- One Way/Integration Style/Protocol/Frequency/Data Exchanged +-- come from Solution Architect's SolutionLinkingWire commands, which +already modeled the same DataLineageRelationshipProperties shape): + DataFlow: ISC Qualified Name, Label, Description, One Way, + Integration Style, Protocol, Frequency, + Data Exchanged, Formula, Formula Type + ControlFlow: ISC Qualified Name, Label, Description, Guard, + Mandatory Guard + ProcessCall: DataFlow's set + Line Number + LineageMapping: DataFlow's set minus Formula/Formula Type + DataMapping: ISC Qualified Name, Label, Description, Formula, + Formula Type, Query ID, Query, Query Type + UltimateSource/ + UltimateDestination: same as LineageMapping (LineageBoundaryProperties + also carries a system-computed `hops` map, not + exposed here -- not user-authored) """ from typing import Any, Dict, Optional @@ -52,18 +82,21 @@ def _guid(attributes: Dict[str, Any], name: str) -> Optional[str]: } # Which of the shared optional attributes actually apply to each relationship -# type -- see lineage_linker.py's *Properties classes in pyegeria. Attributes -# not listed for a given type are simply omitted from the properties body -# even if the user set them (no error -- matches how Report's execution -# params handle attributes that don't apply to every report spec). +# type -- see lineage_linker.py's *Properties classes in pyegeria, and the +# Java DTO hierarchy in the module docstring above. Attributes not listed for +# a given type are simply omitted from the properties body even if somehow +# present (no error -- matches how Report's execution params handle +# attributes that don't apply to every report spec). +_DATA_LINEAGE_ATTRS = ["One Way", "Integration Style", "Protocol", "Frequency", "Data Exchanged"] + _TYPE_SPECIFIC_ATTRS = { - "DataFlow": ["Formula", "Formula Type"], + "DataFlow": _DATA_LINEAGE_ATTRS + ["Formula", "Formula Type"], "ControlFlow": ["Guard", "Mandatory Guard"], - "ProcessCall": ["Formula", "Formula Type"], - "LineageMapping": [], + "ProcessCall": _DATA_LINEAGE_ATTRS + ["Formula", "Formula Type", "Line Number"], + "LineageMapping": _DATA_LINEAGE_ATTRS, "DataMapping": ["Formula", "Formula Type", "Query ID", "Query", "Query Type"], - "UltimateSource": [], - "UltimateDestination": [], + "UltimateSource": _DATA_LINEAGE_ATTRS, + "UltimateDestination": _DATA_LINEAGE_ATTRS, } _ATTR_TO_PROPERTY = { @@ -74,6 +107,12 @@ def _guid(attributes: Dict[str, Any], name: str) -> Optional[str]: "Query ID": "queryId", "Query": "query", "Query Type": "queryType", + "One Way": "oneWay", + "Integration Style": "integrationStyle", + "Protocol": "protocol", + "Frequency": "frequency", + "Data Exchanged": "dataExchanged", + "Line Number": "lineNumber", } @@ -92,20 +131,20 @@ def _build_relationship_properties(relationship_type: str, attributes: Dict[str, class LineageLinkProcessor(AsyncBaseCommandProcessor): - """Processor for Link Lineage Relationship AND Unlink Lineage Relationship. + """Processor for every `Link ` AND `Unlink Lineage Relationship` command. One class handles both verbs -- not a design choice, a requirement: the compact-spec tooling's build_command_variants() treats every LINK_VERBS member (Link/Attach/Add/Detach/Unlink/Remove) as synonyms of the SAME underlying command for variant-registration purposes (see - md_processing_constants._expand_command_phrase), so "Link Lineage - Relationship" and "Unlink Lineage Relationship" both generate a variant - set containing *each other's* exact name. Registering them to two - different processor classes means whichever reg() call runs later - silently wins the dispatcher slot for both. CurationLinkProcessor - (curation.py) hits the same constraint and resolves it the same way -- - branch on self.command.verb inside one class -- so this follows that - established pattern rather than inventing a new one. + md_processing_constants._expand_command_phrase), so "Link Data Flow" and + an "Unlink Data Flow" variant name would generate a variant set + containing *each other's* exact name. Registering them to two different + processor classes means whichever reg() call runs later silently wins + the dispatcher slot for both. CurationLinkProcessor (curation.py) hits + the same constraint and resolves it the same way -- branch on + self.command.verb inside one class -- so this follows that established + pattern rather than inventing a new one. """ def supports_target_element_lookup(self) -> bool: @@ -127,9 +166,9 @@ async def apply_changes(self) -> str: if not element_one_guid or not element_two_guid: raise ValueError("Element One and Element Two must both resolve to existing elements.") - relationship_type = _v(attributes, "Lineage Relationship Type") + relationship_type = self.get_command_spec().get("OM_TYPE") if relationship_type not in _RELATIONSHIP_PROPERTIES_CLASS: - raise ValueError(f"Relationship Type must be one of {sorted(_RELATIONSHIP_PROPERTIES_CLASS)}.") + raise ValueError(f"Command spec OM_TYPE must be one of {sorted(_RELATIONSHIP_PROPERTIES_CLASS)}.") properties = _build_relationship_properties(relationship_type, attributes) body = {"class": "NewRelationshipRequestBody", "properties": properties} @@ -165,20 +204,17 @@ async def apply_changes(self) -> str: class UpdateLineageRelationshipProcessor(AsyncBaseCommandProcessor): - """Processor for Update Lineage Relationship.""" + """Processor for every `Update ` command.""" def supports_target_element_lookup(self) -> bool: # Relationship-only processor. Without this override, # AsyncBaseCommandProcessor.execute()'s step-5 Create<->Update # upsert-transition logic (as_is_element always None here + no # qualified_name to plan against) silently rewrites every "Update - # Lineage Relationship" command to "Create Lineage Relationship" - # instead of calling apply_changes() with verb="Update" -- confirmed - # live (ISSUE-68 follow-up): with all required attributes present, - # command.verb ends execute() as "Create", not "Update". Pre-existing - # bug, not introduced by this change; just never exercised before - # since no prior test ran this command with a full valid attribute - # set through --validate/--process. + # " command to "Create " instead of calling + # apply_changes() with verb="Update" -- confirmed live (ISSUE-68 + # follow-up) on the predecessor generic command; carried forward + # into the per-type split unchanged. return False async def fetch_as_is(self) -> Optional[Dict[str, Any]]: @@ -190,9 +226,9 @@ async def apply_changes(self) -> str: if not relationship_guid: raise ValueError("Lineage Relationship (GUID) is required.") - relationship_type = _v(attributes, "Lineage Relationship Type") + relationship_type = self.get_command_spec().get("OM_TYPE") if relationship_type not in _RELATIONSHIP_PROPERTIES_CLASS: - raise ValueError(f"Relationship Type must be one of {sorted(_RELATIONSHIP_PROPERTIES_CLASS)}.") + raise ValueError(f"Command spec OM_TYPE must be one of {sorted(_RELATIONSHIP_PROPERTIES_CLASS)}.") properties = _build_relationship_properties(relationship_type, attributes) body = {"class": "UpdateRelationshipRequestBody", "properties": properties, "mergeUpdate": True} @@ -200,5 +236,5 @@ async def apply_changes(self) -> str: await self.client._async_update_lineage(relationship_guid, body) self.parsed_output["guid"] = relationship_guid - logger.success(f"Updated lineage relationship {relationship_guid}") + logger.success(f"Updated {relationship_type} relationship {relationship_guid}") return await self.render_result_markdown(relationship_guid) diff --git a/md_processing/v2/solution_architect.py b/md_processing/v2/solution_architect.py index 9a137527..a6096aef 100644 --- a/md_processing/v2/solution_architect.py +++ b/md_processing/v2/solution_architect.py @@ -248,11 +248,13 @@ async def _sync_all_rels(self, guid: str, sc_guids: Set[str], parent_guids: Set[ rel_els = {} if known_new else await self._get_component_related_elements(guid) combined_results = {"added": [], "removed": [], "errors": []} - # 1. Supply Chains + # 1. Supply Chains -- InformationSupplyChain is a Collection subtype, so membership + # (not ImplementedBy, which is a design->implementation relationship for a different + # purpose) is the correct mechanism: the component is a CollectionMember of the ISC. as_is_sc = set(rel_els.get("supply_chain_guids", [])) res = await self.sync_members(as_is_sc, sc_guids, - lambda sc: self.client._async_link_design_to_implementation(sc, guid, None), - lambda sc: self.client._async_detach_design_from_implementation(sc, guid), + lambda sc: self.client._async_add_to_collection(sc, guid, {"class": "NewRelationshipRequestBody", "properties": {"class": "CollectionMembershipProperties", "membershipRationale": "linked by Dr.Egeria v2"}}), + lambda sc: self.client._async_remove_from_collection(sc, guid, None), replace_all) for k in combined_results: combined_results[k].extend(res.get(k, [])) @@ -468,14 +470,19 @@ async def _sync_rels(self, guid: str, parent_guids: Set[str], nested_guids: Set[ replace_all) for k in combined_results: combined_results[k].extend(res.get(k, [])) - # 3. Implemented By (elements that implement this ISC via ImplementedBy, 0737) -- - # governance_officer.link/detach_design_to/from_implementation, this ISC is the - # design (end 1), the implementer is end 2. + # 3. Implemented By -- InformationSupplyChain is a Collection subtype, so membership + # (not ImplementedBy -- that's a design->implementation relationship for a different + # purpose) is the correct mechanism here too: the implementer is a CollectionMember + # of this ISC. Mirrors the fix applied to SolutionComponentProcessor._sync_all_rels' + # "1. Supply Chains" sync -- both were using ImplementedBy where CollectionMembership + # was correct (2026-09-16, reported live: 71 components each carrying "In Information + # Supply Chain" produced 143 ImplementedBy links fanning out from each chain, alongside + # the 47 correct CollectionMemberships from explicit Add Member blocks). if implemented_by_guids is not None: as_is_implemented_by = set(rel_els.get("implemented_by_guids", [])) res = await self.sync_members(as_is_implemented_by, implemented_by_guids, - lambda i: self.client.governance_officer._async_link_design_to_implementation(guid, i, None), - lambda i: self.client.governance_officer._async_detach_design_from_implementation(guid, i, None), + lambda i: self.client._async_add_to_collection(guid, i, {"class": "NewRelationshipRequestBody", "properties": {"class": "CollectionMembershipProperties", "membershipRationale": "linked by Dr.Egeria v2"}}), + lambda i: self.client._async_remove_from_collection(guid, i, None), replace_all) for k in combined_results: combined_results[k].extend(res.get(k, [])) @@ -500,17 +507,20 @@ async def _get_supply_chain_rel_elements(self, guid: str) -> Dict[str, Any]: if related.get('elementHeader', {}).get('type', {}).get('typeName') == 'InformationSupplyChain': res["parent_guids"].append(related['elementHeader']['guid']) - # Nested (child ISCs that are members of this ISC's collection) + # Nested (child ISCs) vs Implemented By (non-ISC members, e.g. components) -- + # both are now CollectionMembers of this ISC (see the "3. Implemented By" fix + # in _sync_rels above), split by whether the member is itself an + # InformationSupplyChain. Previously implemented_by_guids was read from a + # separate "implementedBy" relationship field (ImplementedBy, 0737) -- now + # stale since the sync no longer creates that relationship; collectionMembers + # is the correct as-is source for both once membership is the mechanism. for element in el_struct.get("collectionMembers", []): related = element.get('relatedElement', {}) + m_guid = related.get('elementHeader', {}).get('guid') if related.get('elementHeader', {}).get('type', {}).get('typeName') == 'InformationSupplyChain': - res["nested_guids"].append(related['elementHeader']['guid']) - - # Implemented By - # Field name confirmed 2026-09-13 against AttributedMetadataElement.java - # ("implementedBy", not "implementedByList") and a live element fetch. - for element in el_struct.get("implementedBy", []): - res["implemented_by_guids"].append(element['relatedElement']['elementHeader']['guid']) + res["nested_guids"].append(m_guid) + else: + res["implemented_by_guids"].append(m_guid) # Supply To for element in el_struct.get("supplyTo", []): diff --git a/pyegeria/omvs/lineage_linker.py b/pyegeria/omvs/lineage_linker.py index a8d24586..f82cb1bf 100644 --- a/pyegeria/omvs/lineage_linker.py +++ b/pyegeria/omvs/lineage_linker.py @@ -20,11 +20,39 @@ from pyegeria.core.utils import dynamic_catch +# Field set mirrors the real Java DTO inheritance chain (confirmed against +# open-metadata-framework/.../properties/lineage/*.java): +# LabeledRelationshipProperties: label, description +# LineageRelationshipProperties: + isc_qualified_name +# DataLineageRelationshipProperties: + one_way, integration_style, protocol, +# frequency, data_exchanged +# DataFlowProperties: + formula, formula_type +# ProcessCallProperties: + formula, formula_type, line_number +# LineageMappingProperties: (no additional fields) +# LineageBoundaryProperties: + hops (system-computed graph-distance map, +# not exposed here -- not user-authored) +# UltimateSourceProperties / UltimateDestinationProperties: (no additional fields) +# ControlFlowProperties: + guard, mandatory_guard (skips DataLineageRelationshipProperties) +# DataMappingProperties: + formula, formula_type, query_id, query, query_type +# (also skips DataLineageRelationshipProperties) +# Previously these pyegeria models only carried isc_qualified_name/label/description +# plus their own type-specific fields -- one_way/integration_style/protocol/ +# frequency/data_exchanged/line_number were real fields on the Egeria DTOs that had +# no home here, so a caller passing them (even via a correctly-shaped dict) would +# validate silently and have the fields dropped before serialization (PyegeriaModel's +# extra='ignore' -- see CLAUDE.md's "request-body Pydantic model missing a field" +# gotcha; this is that same class of defect). + class DataFlowProperties(RelationshipBeanProperties): class_: Annotated[Literal["DataFlowProperties"], Field(alias="class")] isc_qualified_name: Optional[str] = None label: Optional[str] = None description: Optional[str] = None + one_way: Optional[bool] = None + integration_style: Optional[str] = None + protocol: Optional[str] = None + frequency: Optional[str] = None + data_exchanged: Optional[str] = None formula: Optional[str] = None formula_type: Optional[str] = None @@ -43,8 +71,14 @@ class ProcessCallProperties(RelationshipBeanProperties): isc_qualified_name: Optional[str] = None label: Optional[str] = None description: Optional[str] = None + one_way: Optional[bool] = None + integration_style: Optional[str] = None + protocol: Optional[str] = None + frequency: Optional[str] = None + data_exchanged: Optional[str] = None formula: Optional[str] = None formula_type: Optional[str] = None + line_number: Optional[str] = None class LineageMappingProperties(RelationshipBeanProperties): @@ -52,6 +86,11 @@ class LineageMappingProperties(RelationshipBeanProperties): isc_qualified_name: Optional[str] = None label: Optional[str] = None description: Optional[str] = None + one_way: Optional[bool] = None + integration_style: Optional[str] = None + protocol: Optional[str] = None + frequency: Optional[str] = None + data_exchanged: Optional[str] = None class DataMappingProperties(RelationshipBeanProperties): @@ -71,6 +110,11 @@ class UltimateSourceProperties(RelationshipBeanProperties): isc_qualified_name: Optional[str] = None label: Optional[str] = None description: Optional[str] = None + one_way: Optional[bool] = None + integration_style: Optional[str] = None + protocol: Optional[str] = None + frequency: Optional[str] = None + data_exchanged: Optional[str] = None class UltimateDestinationProperties(RelationshipBeanProperties): @@ -78,6 +122,11 @@ class UltimateDestinationProperties(RelationshipBeanProperties): isc_qualified_name: Optional[str] = None label: Optional[str] = None description: Optional[str] = None + one_way: Optional[bool] = None + integration_style: Optional[str] = None + protocol: Optional[str] = None + frequency: Optional[str] = None + data_exchanged: Optional[str] = None class LineageLinker(ServerClient): diff --git a/sample-data/templates/advanced/Action Author/Update_Next_Process_Step.md b/sample-data/templates/advanced/Action Author/Update_Next_Process_Step.md index 4ce63abb..cc94476d 100644 --- a/sample-data/templates/advanced/Action Author/Update_Next_Process_Step.md +++ b/sample-data/templates/advanced/Action Author/Update_Next_Process_Step.md @@ -29,24 +29,6 @@ ___ > **Description**: A description. -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - ### GUID > **Input Required**: False @@ -75,44 +57,6 @@ ___ > **Description**: Informational value passed to the process step; the step's behaviour may vary depending on the guard it receives. -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - ### Effective From > **Input Required**: False @@ -195,128 +139,4 @@ ___ > **Default Value**: false -### Status -> **Input Required**: False - -> **Attribute Type**: Valid Value - -> **Description**: The status of the digital product. There is a list of valid values that this conforms to. - -> **Default Value**: ACTIVE - - -### User Defined Status -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Only valid if Status is set to OTHER. User defined & managed status values. - - -### Classifications -> **Input Required**: false - -> **Attribute Type**: Named DICT - -> **Description**: Optionally specify the initial classifications for a collection. Multiple classifications can be specified. - -> **Alternative Labels**: classification - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Is Own Anchor -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Generally True. - -> **Alternative Labels**: Own Anchor - -> **Default Value**: True - - -### Anchor ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Anchor identity for the collection. Typically a qualified name but if display name is unique then it could be used (not recommended) - - -### Parent ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Unique name of the parent element. - -> **Alternative Labels**: Parent; - - -### Parent Relationship Type Name -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The kind of the relationship to the parent element. - - -### Anchor Scope Name -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Optional qualified name of an anchor scope. - - -### Parent at End1 -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Is the parent at end1 of the relationship? - -> **Default Value**: True - - -### Merge Update -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: If True, only those attributes specified in the update will be updated; If False, any attributes not provided during the update will be set to None. - -> **Alternative Labels**: Merge - -> **Default Value**: True - - -### Additional Properties -> **Input Required**: False - -> **Attribute Type**: Dictionary - -> **Description**: Additional user defined values organized as name value pairs in a dictionary. - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Supplementary Properties -> **Input Required**: False - -> **Attribute Type**: Named DICT - -> **Description**: Provide supplementary information to the element using the structure of a glossary term - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - ___ diff --git a/sample-data/templates/advanced/Curation/Update_Data_Scope.md b/sample-data/templates/advanced/Curation/Update_Data_Scope.md index 62df171a..2363a931 100644 --- a/sample-data/templates/advanced/Curation/Update_Data_Scope.md +++ b/sample-data/templates/advanced/Curation/Update_Data_Scope.md @@ -27,72 +27,6 @@ ___ > **Description**: A description. -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### GUID -> **Input Required**: False - -> **Attribute Type**: GUID - -> **Description**: A system generated unique identifier. - -> **Alternative Labels**: Guid; guid - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - ### Effective From > **Input Required**: False @@ -169,116 +103,4 @@ ___ > | example_key | example_value | -### Status -> **Input Required**: False - -> **Attribute Type**: Valid Value - -> **Description**: The status of the digital product. There is a list of valid values that this conforms to. - -> **Default Value**: ACTIVE - - -### User Defined Status -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Only valid if Status is set to OTHER. User defined & managed status values. - - -### Classifications -> **Input Required**: false - -> **Attribute Type**: Named DICT - -> **Description**: Optionally specify the initial classifications for a collection. Multiple classifications can be specified. - -> **Alternative Labels**: classification - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Is Own Anchor -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Generally True. - -> **Alternative Labels**: Own Anchor - -> **Default Value**: True - - -### Anchor ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Anchor identity for the collection. Typically a qualified name but if display name is unique then it could be used (not recommended) - - -### Parent ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Unique name of the parent element. - -> **Alternative Labels**: Parent; - - -### Parent Relationship Type Name -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The kind of the relationship to the parent element. - - -### Anchor Scope Name -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Optional qualified name of an anchor scope. - - -### Parent at End1 -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Is the parent at end1 of the relationship? - -> **Default Value**: True - - -### Merge Update -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: If True, only those attributes specified in the update will be updated; If False, any attributes not provided during the update will be set to None. - -> **Alternative Labels**: Merge - -> **Default Value**: True - - -### Supplementary Properties -> **Input Required**: False - -> **Attribute Type**: Named DICT - -> **Description**: Provide supplementary information to the element using the structure of a glossary term - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - ___ diff --git a/sample-data/templates/advanced/Curation/Update_Governance_Expectations.md b/sample-data/templates/advanced/Curation/Update_Governance_Expectations.md index c2c1af5f..091b3fcd 100644 --- a/sample-data/templates/advanced/Curation/Update_Governance_Expectations.md +++ b/sample-data/templates/advanced/Curation/Update_Governance_Expectations.md @@ -31,72 +31,6 @@ ___ > **Description**: A text entry into a journal. -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### GUID -> **Input Required**: False - -> **Attribute Type**: GUID - -> **Description**: A system generated unique identifier. - -> **Alternative Labels**: Guid; guid - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - ### Effective From > **Input Required**: False @@ -161,128 +95,4 @@ ___ > **Description**: A user provided or system generated request id for a conversation. -### Status -> **Input Required**: False - -> **Attribute Type**: Valid Value - -> **Description**: The status of the digital product. There is a list of valid values that this conforms to. - -> **Default Value**: ACTIVE - - -### User Defined Status -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Only valid if Status is set to OTHER. User defined & managed status values. - - -### Classifications -> **Input Required**: false - -> **Attribute Type**: Named DICT - -> **Description**: Optionally specify the initial classifications for a collection. Multiple classifications can be specified. - -> **Alternative Labels**: classification - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Is Own Anchor -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Generally True. - -> **Alternative Labels**: Own Anchor - -> **Default Value**: True - - -### Anchor ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Anchor identity for the collection. Typically a qualified name but if display name is unique then it could be used (not recommended) - - -### Parent ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Unique name of the parent element. - -> **Alternative Labels**: Parent; - - -### Parent Relationship Type Name -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The kind of the relationship to the parent element. - - -### Anchor Scope Name -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Optional qualified name of an anchor scope. - - -### Parent at End1 -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Is the parent at end1 of the relationship? - -> **Default Value**: True - - -### Merge Update -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: If True, only those attributes specified in the update will be updated; If False, any attributes not provided during the update will be set to None. - -> **Alternative Labels**: Merge - -> **Default Value**: True - - -### Additional Properties -> **Input Required**: False - -> **Attribute Type**: Dictionary - -> **Description**: Additional user defined values organized as name value pairs in a dictionary. - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Supplementary Properties -> **Input Required**: False - -> **Attribute Type**: Named DICT - -> **Description**: Provide supplementary information to the element using the structure of a glossary term - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - ___ diff --git a/sample-data/templates/advanced/Curation/Update_Governance_Measurements.md b/sample-data/templates/advanced/Curation/Update_Governance_Measurements.md index 6d96ee23..f07083fb 100644 --- a/sample-data/templates/advanced/Curation/Update_Governance_Measurements.md +++ b/sample-data/templates/advanced/Curation/Update_Governance_Measurements.md @@ -31,72 +31,6 @@ ___ > **Description**: A text entry into a journal. -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### GUID -> **Input Required**: False - -> **Attribute Type**: GUID - -> **Description**: A system generated unique identifier. - -> **Alternative Labels**: Guid; guid - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - ### Effective From > **Input Required**: False @@ -161,128 +95,4 @@ ___ > **Description**: A user provided or system generated request id for a conversation. -### Status -> **Input Required**: False - -> **Attribute Type**: Valid Value - -> **Description**: The status of the digital product. There is a list of valid values that this conforms to. - -> **Default Value**: ACTIVE - - -### User Defined Status -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Only valid if Status is set to OTHER. User defined & managed status values. - - -### Classifications -> **Input Required**: false - -> **Attribute Type**: Named DICT - -> **Description**: Optionally specify the initial classifications for a collection. Multiple classifications can be specified. - -> **Alternative Labels**: classification - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Is Own Anchor -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Generally True. - -> **Alternative Labels**: Own Anchor - -> **Default Value**: True - - -### Anchor ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Anchor identity for the collection. Typically a qualified name but if display name is unique then it could be used (not recommended) - - -### Parent ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Unique name of the parent element. - -> **Alternative Labels**: Parent; - - -### Parent Relationship Type Name -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The kind of the relationship to the parent element. - - -### Anchor Scope Name -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Optional qualified name of an anchor scope. - - -### Parent at End1 -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Is the parent at end1 of the relationship? - -> **Default Value**: True - - -### Merge Update -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: If True, only those attributes specified in the update will be updated; If False, any attributes not provided during the update will be set to None. - -> **Alternative Labels**: Merge - -> **Default Value**: True - - -### Additional Properties -> **Input Required**: False - -> **Attribute Type**: Dictionary - -> **Description**: Additional user defined values organized as name value pairs in a dictionary. - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Supplementary Properties -> **Input Required**: False - -> **Attribute Type**: Named DICT - -> **Description**: Provide supplementary information to the element using the structure of a glossary term - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - ___ diff --git a/sample-data/templates/advanced/Curation/Update_Search_Keyword.md b/sample-data/templates/advanced/Curation/Update_Search_Keyword.md index 77a4899a..8563f935 100644 --- a/sample-data/templates/advanced/Curation/Update_Search_Keyword.md +++ b/sample-data/templates/advanced/Curation/Update_Search_Keyword.md @@ -53,72 +53,6 @@ ___ > **Description**: A description. -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### GUID -> **Input Required**: False - -> **Attribute Type**: GUID - -> **Description**: A system generated unique identifier. - -> **Alternative Labels**: Guid; guid - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - ### Effective From > **Input Required**: False @@ -201,128 +135,4 @@ ___ > **Default Value**: false -### Status -> **Input Required**: False - -> **Attribute Type**: Valid Value - -> **Description**: The status of the digital product. There is a list of valid values that this conforms to. - -> **Default Value**: ACTIVE - - -### User Defined Status -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Only valid if Status is set to OTHER. User defined & managed status values. - - -### Classifications -> **Input Required**: false - -> **Attribute Type**: Named DICT - -> **Description**: Optionally specify the initial classifications for a collection. Multiple classifications can be specified. - -> **Alternative Labels**: classification - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Is Own Anchor -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Generally True. - -> **Alternative Labels**: Own Anchor - -> **Default Value**: True - - -### Anchor ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Anchor identity for the collection. Typically a qualified name but if display name is unique then it could be used (not recommended) - - -### Parent ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Unique name of the parent element. - -> **Alternative Labels**: Parent; - - -### Parent Relationship Type Name -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The kind of the relationship to the parent element. - - -### Anchor Scope Name -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Optional qualified name of an anchor scope. - - -### Parent at End1 -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Is the parent at end1 of the relationship? - -> **Default Value**: True - - -### Merge Update -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: If True, only those attributes specified in the update will be updated; If False, any attributes not provided during the update will be set to None. - -> **Alternative Labels**: Merge - -> **Default Value**: True - - -### Additional Properties -> **Input Required**: False - -> **Attribute Type**: Dictionary - -> **Description**: Additional user defined values organized as name value pairs in a dictionary. - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Supplementary Properties -> **Input Required**: False - -> **Attribute Type**: Named DICT - -> **Description**: Provide supplementary information to the element using the structure of a glossary term - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - ___ diff --git a/sample-data/templates/advanced/Governance Officer/Update_Certification.md b/sample-data/templates/advanced/Governance Officer/Update_Certification.md index 3ba3571e..6d5c667f 100644 --- a/sample-data/templates/advanced/Governance Officer/Update_Certification.md +++ b/sample-data/templates/advanced/Governance Officer/Update_Certification.md @@ -169,72 +169,6 @@ ___ > | example_key | example_value | -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### GUID -> **Input Required**: False - -> **Attribute Type**: GUID - -> **Description**: A system generated unique identifier. - -> **Alternative Labels**: Guid; guid - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - ### Effective From > **Input Required**: False @@ -317,128 +251,4 @@ ___ > **Default Value**: false -### Status -> **Input Required**: False - -> **Attribute Type**: Valid Value - -> **Description**: The status of the digital product. There is a list of valid values that this conforms to. - -> **Default Value**: ACTIVE - - -### User Defined Status -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Only valid if Status is set to OTHER. User defined & managed status values. - - -### Classifications -> **Input Required**: false - -> **Attribute Type**: Named DICT - -> **Description**: Optionally specify the initial classifications for a collection. Multiple classifications can be specified. - -> **Alternative Labels**: classification - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Is Own Anchor -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Generally True. - -> **Alternative Labels**: Own Anchor - -> **Default Value**: True - - -### Anchor ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Anchor identity for the collection. Typically a qualified name but if display name is unique then it could be used (not recommended) - - -### Parent ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Unique name of the parent element. - -> **Alternative Labels**: Parent; - - -### Parent Relationship Type Name -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The kind of the relationship to the parent element. - - -### Anchor Scope Name -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Optional qualified name of an anchor scope. - - -### Parent at End1 -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Is the parent at end1 of the relationship? - -> **Default Value**: True - - -### Merge Update -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: If True, only those attributes specified in the update will be updated; If False, any attributes not provided during the update will be set to None. - -> **Alternative Labels**: Merge - -> **Default Value**: True - - -### Additional Properties -> **Input Required**: False - -> **Attribute Type**: Dictionary - -> **Description**: Additional user defined values organized as name value pairs in a dictionary. - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Supplementary Properties -> **Input Required**: False - -> **Attribute Type**: Named DICT - -> **Description**: Provide supplementary information to the element using the structure of a glossary term - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - ___ diff --git a/sample-data/templates/advanced/Governance Officer/Update_License.md b/sample-data/templates/advanced/Governance Officer/Update_License.md index a9502772..3819c17e 100644 --- a/sample-data/templates/advanced/Governance Officer/Update_License.md +++ b/sample-data/templates/advanced/Governance Officer/Update_License.md @@ -169,72 +169,6 @@ ___ > | example_key | example_value | -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### GUID -> **Input Required**: False - -> **Attribute Type**: GUID - -> **Description**: A system generated unique identifier. - -> **Alternative Labels**: Guid; guid - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - ### Effective From > **Input Required**: False @@ -317,128 +251,4 @@ ___ > **Default Value**: false -### Status -> **Input Required**: False - -> **Attribute Type**: Valid Value - -> **Description**: The status of the digital product. There is a list of valid values that this conforms to. - -> **Default Value**: ACTIVE - - -### User Defined Status -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Only valid if Status is set to OTHER. User defined & managed status values. - - -### Classifications -> **Input Required**: false - -> **Attribute Type**: Named DICT - -> **Description**: Optionally specify the initial classifications for a collection. Multiple classifications can be specified. - -> **Alternative Labels**: classification - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Is Own Anchor -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Generally True. - -> **Alternative Labels**: Own Anchor - -> **Default Value**: True - - -### Anchor ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Anchor identity for the collection. Typically a qualified name but if display name is unique then it could be used (not recommended) - - -### Parent ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Unique name of the parent element. - -> **Alternative Labels**: Parent; - - -### Parent Relationship Type Name -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The kind of the relationship to the parent element. - - -### Anchor Scope Name -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Optional qualified name of an anchor scope. - - -### Parent at End1 -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Is the parent at end1 of the relationship? - -> **Default Value**: True - - -### Merge Update -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: If True, only those attributes specified in the update will be updated; If False, any attributes not provided during the update will be set to None. - -> **Alternative Labels**: Merge - -> **Default Value**: True - - -### Additional Properties -> **Input Required**: False - -> **Attribute Type**: Dictionary - -> **Description**: Additional user defined values organized as name value pairs in a dictionary. - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Supplementary Properties -> **Input Required**: False - -> **Attribute Type**: Named DICT - -> **Description**: Provide supplementary information to the element using the structure of a glossary term - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - ___ diff --git a/sample-data/templates/advanced/Lineage Linker/Link_Control_Flow.md b/sample-data/templates/advanced/Lineage Linker/Link_Control_Flow.md new file mode 100644 index 00000000..4f455d2b --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Link_Control_Flow.md @@ -0,0 +1,90 @@ +___ + +## Link Control Flow +> Create a ControlFlow lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Guard +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Informational value passed to the process step; the step's behaviour may vary depending on the guard it receives. + + +### Mandatory Guard +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Whether this guard must be present for the step to be actioned. + +> **Default Value**: false + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +### Effective Time +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: An ISO-8601 string representing the time to use for evaluating effectivity of the elements related to this one. + + +### Effective From +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element becomes effective (visible). + + +### Effective To +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element is no longer effective (visible). + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Link_Data_Flow.md b/sample-data/templates/advanced/Lineage Linker/Link_Data_Flow.md new file mode 100644 index 00000000..5b7f1f26 --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Link_Data_Flow.md @@ -0,0 +1,132 @@ +___ + +## Link Data Flow +> Create a DataFlow lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +### Formula +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The logic implemented by this process, expressed in the language of the business rather than any one implementation language. + + +### Formula Type +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The specification language used to express the Formula (e.g. SQL, Python, natural language). + + +### Effective Time +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: An ISO-8601 string representing the time to use for evaluating effectivity of the elements related to this one. + + +### Effective From +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element becomes effective (visible). + + +### Effective To +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element is no longer effective (visible). + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Link_Lineage_Relationship.md b/sample-data/templates/advanced/Lineage Linker/Link_Data_Mapping.md similarity index 68% rename from sample-data/templates/advanced/Lineage Linker/Link_Lineage_Relationship.md rename to sample-data/templates/advanced/Lineage Linker/Link_Data_Mapping.md index 620e029c..3afcb1e6 100644 --- a/sample-data/templates/advanced/Lineage Linker/Link_Lineage_Relationship.md +++ b/sample-data/templates/advanced/Lineage Linker/Link_Data_Mapping.md @@ -1,7 +1,7 @@ ___ -## Link Lineage Relationship -> Create a lineage relationship (DataFlow, ControlFlow, ProcessCall, LineageMapping, DataMapping, UltimateSource, or UltimateDestination) between two elements, e.g. to trace how data moves through a pipeline. +## Link Data Mapping +> Create a DataMapping lineage relationship between two elements. ### Element One > **Input Required**: True @@ -19,16 +19,6 @@ ___ > **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. -### Lineage Relationship Type -> **Input Required**: True - -> **Attribute Type**: Valid Value - -> **Description**: The kind of lineage relationship to create/update -- determines which of the type-specific properties below apply (Formula/Formula Type: DataFlow, ProcessCall, DataMapping; Guard/Mandatory Guard: ControlFlow; Query/Query ID/Query Type: DataMapping only). - -> **Valid Values**: DataFlow,ControlFlow,ProcessCall,LineageMapping,DataMapping,UltimateSource,UltimateDestination - - ### Label > **Input Required**: False @@ -47,24 +37,6 @@ ___ > **Description**: A description. -### Guard -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Informational value passed to the process step; the step's behaviour may vary depending on the guard it receives. - - -### Mandatory Guard -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Whether this guard must be present for the step to be actioned. - -> **Default Value**: false - - ### ISC Qualified Name > **Input Required**: False diff --git a/sample-data/templates/advanced/Lineage Linker/Link_Lineage_Mapping.md b/sample-data/templates/advanced/Lineage Linker/Link_Lineage_Mapping.md new file mode 100644 index 00000000..dcc38cf2 --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Link_Lineage_Mapping.md @@ -0,0 +1,116 @@ +___ + +## Link Lineage Mapping +> Create a LineageMapping lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +### Effective Time +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: An ISO-8601 string representing the time to use for evaluating effectivity of the elements related to this one. + + +### Effective From +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element becomes effective (visible). + + +### Effective To +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element is no longer effective (visible). + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Link_Process_Call.md b/sample-data/templates/advanced/Lineage Linker/Link_Process_Call.md new file mode 100644 index 00000000..3c470385 --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Link_Process_Call.md @@ -0,0 +1,140 @@ +___ + +## Link Process Call +> Create a ProcessCall lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +### Formula +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The logic implemented by this process, expressed in the language of the business rather than any one implementation language. + + +### Formula Type +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The specification language used to express the Formula (e.g. SQL, Python, natural language). + + +### Line Number +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Line number in the source code where this process call is made (ProcessCall only). + + +### Effective Time +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: An ISO-8601 string representing the time to use for evaluating effectivity of the elements related to this one. + + +### Effective From +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element becomes effective (visible). + + +### Effective To +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element is no longer effective (visible). + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Link_Ultimate_Destination.md b/sample-data/templates/advanced/Lineage Linker/Link_Ultimate_Destination.md new file mode 100644 index 00000000..5b5c93ce --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Link_Ultimate_Destination.md @@ -0,0 +1,116 @@ +___ + +## Link Ultimate Destination +> Create a UltimateDestination lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +### Effective Time +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: An ISO-8601 string representing the time to use for evaluating effectivity of the elements related to this one. + + +### Effective From +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element becomes effective (visible). + + +### Effective To +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element is no longer effective (visible). + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Link_Ultimate_Source.md b/sample-data/templates/advanced/Lineage Linker/Link_Ultimate_Source.md new file mode 100644 index 00000000..4435d427 --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Link_Ultimate_Source.md @@ -0,0 +1,116 @@ +___ + +## Link Ultimate Source +> Create a UltimateSource lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +### Effective Time +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: An ISO-8601 string representing the time to use for evaluating effectivity of the elements related to this one. + + +### Effective From +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element becomes effective (visible). + + +### Effective To +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A string in ISO-8601 format that defines the when an element is no longer effective (visible). + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Unlink_Lineage_Relationship.md b/sample-data/templates/advanced/Lineage Linker/Unlink_Lineage_Relationship.md index 112826ea..568d0624 100644 --- a/sample-data/templates/advanced/Lineage Linker/Unlink_Lineage_Relationship.md +++ b/sample-data/templates/advanced/Lineage Linker/Unlink_Lineage_Relationship.md @@ -1,7 +1,7 @@ ___ ## Unlink Lineage Relationship -> Detach (delete) an existing lineage relationship, identified by its own relationship GUID (as returned by Link Lineage Relationship). +> Detach (delete) an existing lineage relationship of any type, identified by its own relationship GUID (as returned by any Link command). > > **Alternative Names**: Detach Lineage Relationship @@ -10,7 +10,7 @@ ___ > **Attribute Type**: Simple -> **Description**: The GUID of the lineage relationship, as returned when it was linked (Link Lineage Relationship's output). +> **Description**: The GUID of the lineage relationship, as returned when it was linked (a Link command's output). ### Effective Time diff --git a/sample-data/templates/advanced/Lineage Linker/Update_Control_Flow.md b/sample-data/templates/advanced/Lineage Linker/Update_Control_Flow.md new file mode 100644 index 00000000..4c48abae --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Update_Control_Flow.md @@ -0,0 +1,58 @@ +___ + +## Update Control Flow +> Update the properties of an existing ControlFlow lineage relationship, identified by its own relationship GUID. + +### Lineage Relationship +> **Input Required**: True + +> **Attribute Type**: Simple + +> **Description**: The GUID of the lineage relationship, as returned when it was linked (a Link command's output). + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Guard +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Informational value passed to the process step; the step's behaviour may vary depending on the guard it receives. + + +### Mandatory Guard +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Whether this guard must be present for the step to be actioned. + +> **Default Value**: false + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Update_Data_Flow.md b/sample-data/templates/advanced/Lineage Linker/Update_Data_Flow.md new file mode 100644 index 00000000..ab205bb5 --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Update_Data_Flow.md @@ -0,0 +1,100 @@ +___ + +## Update Data Flow +> Update the properties of an existing DataFlow lineage relationship, identified by its own relationship GUID. + +### Lineage Relationship +> **Input Required**: True + +> **Attribute Type**: Simple + +> **Description**: The GUID of the lineage relationship, as returned when it was linked (a Link command's output). + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +### Formula +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The logic implemented by this process, expressed in the language of the business rather than any one implementation language. + + +### Formula Type +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The specification language used to express the Formula (e.g. SQL, Python, natural language). + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Update_Data_Mapping.md b/sample-data/templates/advanced/Lineage Linker/Update_Data_Mapping.md new file mode 100644 index 00000000..4dddd6c4 --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Update_Data_Mapping.md @@ -0,0 +1,80 @@ +___ + +## Update Data Mapping +> Update the properties of an existing DataMapping lineage relationship, identified by its own relationship GUID. + +### Lineage Relationship +> **Input Required**: True + +> **Attribute Type**: Simple + +> **Description**: The GUID of the lineage relationship, as returned when it was linked (a Link command's output). + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +### Formula +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The logic implemented by this process, expressed in the language of the business rather than any one implementation language. + + +### Formula Type +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The specification language used to express the Formula (e.g. SQL, Python, natural language). + + +### Query ID +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Identifier for the query fragment (DataMapping only) that this relationship represents. + + +### Query +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The query text (DataMapping only) that this relationship represents. + + +### Query Type +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The query language used to express Query (DataMapping only), e.g. SQL. + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Update_Lineage_Mapping.md b/sample-data/templates/advanced/Lineage Linker/Update_Lineage_Mapping.md new file mode 100644 index 00000000..e8c059de --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Update_Lineage_Mapping.md @@ -0,0 +1,84 @@ +___ + +## Update Lineage Mapping +> Update the properties of an existing LineageMapping lineage relationship, identified by its own relationship GUID. + +### Lineage Relationship +> **Input Required**: True + +> **Attribute Type**: Simple + +> **Description**: The GUID of the lineage relationship, as returned when it was linked (a Link command's output). + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Update_Lineage_Relationship.md b/sample-data/templates/advanced/Lineage Linker/Update_Lineage_Relationship.md deleted file mode 100644 index c857c494..00000000 --- a/sample-data/templates/advanced/Lineage Linker/Update_Lineage_Relationship.md +++ /dev/null @@ -1,346 +0,0 @@ -___ - -## Update Lineage Relationship -> Update the properties of an existing lineage relationship, identified by its own relationship GUID (as returned by Link Lineage Relationship). - -### Lineage Relationship -> **Input Required**: True - -> **Attribute Type**: Simple - -> **Description**: The GUID of the lineage relationship, as returned when it was linked (Link Lineage Relationship's output). - - -### Lineage Relationship Type -> **Input Required**: True - -> **Attribute Type**: Valid Value - -> **Description**: The kind of lineage relationship to create/update -- determines which of the type-specific properties below apply (Formula/Formula Type: DataFlow, ProcessCall, DataMapping; Guard/Mandatory Guard: ControlFlow; Query/Query ID/Query Type: DataMapping only). - -> **Valid Values**: DataFlow,ControlFlow,ProcessCall,LineageMapping,DataMapping,UltimateSource,UltimateDestination - - -### Label -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A label used to identify or categorise a relationship link. - -> **Alternative Labels**: Wire Label - - -### Description -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A description. - - -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - -### Journal Entry -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: - - -### Guard -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Informational value passed to the process step; the step's behaviour may vary depending on the guard it receives. - - -### Mandatory Guard -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Whether this guard must be present for the step to be actioned. - -> **Default Value**: false - - -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### GUID -> **Input Required**: False - -> **Attribute Type**: GUID - -> **Description**: A system generated unique identifier. - -> **Alternative Labels**: Guid; guid - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - -### ISC Qualified Name -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. - - -### Formula -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The logic implemented by this process, expressed in the language of the business rather than any one implementation language. - - -### Formula Type -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The specification language used to express the Formula (e.g. SQL, Python, natural language). - - -### Query ID -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Identifier for the query fragment (DataMapping only) that this relationship represents. - - -### Query -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The query text (DataMapping only) that this relationship represents. - - -### Query Type -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The query language used to express Query (DataMapping only), e.g. SQL. - - -### Status -> **Input Required**: False - -> **Attribute Type**: Valid Value - -> **Description**: The status of the digital product. There is a list of valid values that this conforms to. - -> **Default Value**: ACTIVE - - -### User Defined Status -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Only valid if Status is set to OTHER. User defined & managed status values. - - -### Classifications -> **Input Required**: false - -> **Attribute Type**: Named DICT - -> **Description**: Optionally specify the initial classifications for a collection. Multiple classifications can be specified. - -> **Alternative Labels**: classification - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### Is Own Anchor -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Generally True. - -> **Alternative Labels**: Own Anchor - -> **Default Value**: True - - -### Anchor ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Anchor identity for the collection. Typically a qualified name but if display name is unique then it could be used (not recommended) - - -### Parent ID -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Unique name of the parent element. - -> **Alternative Labels**: Parent; - - -### Parent Relationship Type Name -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: The kind of the relationship to the parent element. - - -### Anchor Scope Name -> **Input Required**: False - -> **Attribute Type**: Reference Name - -> **Description**: Optional qualified name of an anchor scope. - - -### Parent at End1 -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: Is the parent at end1 of the relationship? - -> **Default Value**: True - - -### Effective Time -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: An ISO-8601 string representing the time to use for evaluating effectivity of the elements related to this one. - - -### Effective From -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A string in ISO-8601 format that defines the when an element becomes effective (visible). - - -### Effective To -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A string in ISO-8601 format that defines the when an element is no longer effective (visible). - - -### Merge Update -> **Input Required**: False - -> **Attribute Type**: Bool - -> **Description**: If True, only those attributes specified in the update will be updated; If False, any attributes not provided during the update will be set to None. - -> **Alternative Labels**: Merge - -> **Default Value**: True - - -### Additional Properties -> **Input Required**: False - -> **Attribute Type**: Dictionary - -> **Description**: Additional user defined values organized as name value pairs in a dictionary. - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -### External Source GUID -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Identifier of an external source that is associated with this element. - - -### External Source Name -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Name of an external element that is associated with this element. - - -### Supplementary Properties -> **Input Required**: False - -> **Attribute Type**: Named DICT - -> **Description**: Provide supplementary information to the element using the structure of a glossary term - -> | Parameter Name | Parameter Value | -> |---|---| -> | example_key | example_value | - - -___ diff --git a/sample-data/templates/advanced/Lineage Linker/Update_Process_Call.md b/sample-data/templates/advanced/Lineage Linker/Update_Process_Call.md new file mode 100644 index 00000000..3c6ec32b --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Update_Process_Call.md @@ -0,0 +1,108 @@ +___ + +## Update Process Call +> Update the properties of an existing ProcessCall lineage relationship, identified by its own relationship GUID. + +### Lineage Relationship +> **Input Required**: True + +> **Attribute Type**: Simple + +> **Description**: The GUID of the lineage relationship, as returned when it was linked (a Link command's output). + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +### Formula +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The logic implemented by this process, expressed in the language of the business rather than any one implementation language. + + +### Formula Type +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The specification language used to express the Formula (e.g. SQL, Python, natural language). + + +### Line Number +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Line number in the source code where this process call is made (ProcessCall only). + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Update_Ultimate_Destination.md b/sample-data/templates/advanced/Lineage Linker/Update_Ultimate_Destination.md new file mode 100644 index 00000000..c5ac8534 --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Update_Ultimate_Destination.md @@ -0,0 +1,84 @@ +___ + +## Update Ultimate Destination +> Update the properties of an existing UltimateDestination lineage relationship, identified by its own relationship GUID. + +### Lineage Relationship +> **Input Required**: True + +> **Attribute Type**: Simple + +> **Description**: The GUID of the lineage relationship, as returned when it was linked (a Link command's output). + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +___ diff --git a/sample-data/templates/advanced/Lineage Linker/Update_Ultimate_Source.md b/sample-data/templates/advanced/Lineage Linker/Update_Ultimate_Source.md new file mode 100644 index 00000000..dd8568e3 --- /dev/null +++ b/sample-data/templates/advanced/Lineage Linker/Update_Ultimate_Source.md @@ -0,0 +1,84 @@ +___ + +## Update Ultimate Source +> Update the properties of an existing UltimateSource lineage relationship, identified by its own relationship GUID. + +### Lineage Relationship +> **Input Required**: True + +> **Attribute Type**: Simple + +> **Description**: The GUID of the lineage relationship, as returned when it was linked (a Link command's output). + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +### ISC Qualified Name +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Qualified name of the Information Supply Chain this lineage relationship belongs to, if any. + + +___ diff --git a/sample-data/templates/basic/Curation/Update_Data_Scope.md b/sample-data/templates/basic/Curation/Update_Data_Scope.md index 55dec0fd..1499b096 100644 --- a/sample-data/templates/basic/Curation/Update_Data_Scope.md +++ b/sample-data/templates/basic/Curation/Update_Data_Scope.md @@ -27,70 +27,4 @@ ___ > **Description**: A description. -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### GUID -> **Input Required**: False - -> **Attribute Type**: GUID - -> **Description**: A system generated unique identifier. - -> **Alternative Labels**: Guid; guid - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - ___ diff --git a/sample-data/templates/basic/Curation/Update_Governance_Expectations.md b/sample-data/templates/basic/Curation/Update_Governance_Expectations.md index 0b3c4045..856306f9 100644 --- a/sample-data/templates/basic/Curation/Update_Governance_Expectations.md +++ b/sample-data/templates/basic/Curation/Update_Governance_Expectations.md @@ -31,70 +31,4 @@ ___ > **Description**: A text entry into a journal. -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### GUID -> **Input Required**: False - -> **Attribute Type**: GUID - -> **Description**: A system generated unique identifier. - -> **Alternative Labels**: Guid; guid - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - ___ diff --git a/sample-data/templates/basic/Curation/Update_Governance_Measurements.md b/sample-data/templates/basic/Curation/Update_Governance_Measurements.md index da6c113c..e6b38fd4 100644 --- a/sample-data/templates/basic/Curation/Update_Governance_Measurements.md +++ b/sample-data/templates/basic/Curation/Update_Governance_Measurements.md @@ -31,70 +31,4 @@ ___ > **Description**: A text entry into a journal. -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### GUID -> **Input Required**: False - -> **Attribute Type**: GUID - -> **Description**: A system generated unique identifier. - -> **Alternative Labels**: Guid; guid - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - ___ diff --git a/sample-data/templates/basic/Curation/Update_Search_Keyword.md b/sample-data/templates/basic/Curation/Update_Search_Keyword.md index 05cff17f..59630669 100644 --- a/sample-data/templates/basic/Curation/Update_Search_Keyword.md +++ b/sample-data/templates/basic/Curation/Update_Search_Keyword.md @@ -53,70 +53,4 @@ ___ > **Description**: A description. -### Category -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: A user specified category name that can be used for example, to define product types or agreement types. - -> **Alternative Labels**: Category Name - - -### Qualified Name -> **Input Required**: False - -> **Attribute Type**: QN - -> **Description**: A unique qualified name for the element. Generated using the qualified name pattern if not user specified. - - -### Version Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Published product version identifier. - -> **Alternative Labels**: Version - -> **Default Value**: 1.0 - - -### Identifier -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: role identifier - -> **Alternative Labels**: ID - - -### GUID -> **Input Required**: False - -> **Attribute Type**: GUID - -> **Description**: A system generated unique identifier. - -> **Alternative Labels**: Guid; guid - - -### URL -> **Input Required**: False - -> **Attribute Type**: Simple - -> **Description**: Link to supporting information - - -### Search Keywords -> **Input Required**: False - -> **Attribute Type**: Simple List - -> **Description**: Keywords to facilitate finding the element - - ___ diff --git a/sample-data/templates/basic/Lineage Linker/Link_Lineage_Relationship.md b/sample-data/templates/basic/Lineage Linker/Link_Control_Flow.md similarity index 60% rename from sample-data/templates/basic/Lineage Linker/Link_Lineage_Relationship.md rename to sample-data/templates/basic/Lineage Linker/Link_Control_Flow.md index 89f45417..b8e10c77 100644 --- a/sample-data/templates/basic/Lineage Linker/Link_Lineage_Relationship.md +++ b/sample-data/templates/basic/Lineage Linker/Link_Control_Flow.md @@ -1,7 +1,7 @@ ___ -## Link Lineage Relationship -> Create a lineage relationship (DataFlow, ControlFlow, ProcessCall, LineageMapping, DataMapping, UltimateSource, or UltimateDestination) between two elements, e.g. to trace how data moves through a pipeline. +## Link Control Flow +> Create a ControlFlow lineage relationship between two elements. ### Element One > **Input Required**: True @@ -19,16 +19,6 @@ ___ > **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. -### Lineage Relationship Type -> **Input Required**: True - -> **Attribute Type**: Valid Value - -> **Description**: The kind of lineage relationship to create/update -- determines which of the type-specific properties below apply (Formula/Formula Type: DataFlow, ProcessCall, DataMapping; Guard/Mandatory Guard: ControlFlow; Query/Query ID/Query Type: DataMapping only). - -> **Valid Values**: DataFlow,ControlFlow,ProcessCall,LineageMapping,DataMapping,UltimateSource,UltimateDestination - - ### Label > **Input Required**: False diff --git a/sample-data/templates/basic/Lineage Linker/Link_Data_Flow.md b/sample-data/templates/basic/Lineage Linker/Link_Data_Flow.md new file mode 100644 index 00000000..add0f9ec --- /dev/null +++ b/sample-data/templates/basic/Lineage Linker/Link_Data_Flow.md @@ -0,0 +1,84 @@ +___ + +## Link Data Flow +> Create a DataFlow lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +___ diff --git a/sample-data/templates/basic/Lineage Linker/Link_Data_Mapping.md b/sample-data/templates/basic/Lineage Linker/Link_Data_Mapping.md new file mode 100644 index 00000000..1498999a --- /dev/null +++ b/sample-data/templates/basic/Lineage Linker/Link_Data_Mapping.md @@ -0,0 +1,40 @@ +___ + +## Link Data Mapping +> Create a DataMapping lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +___ diff --git a/sample-data/templates/basic/Lineage Linker/Link_Lineage_Mapping.md b/sample-data/templates/basic/Lineage Linker/Link_Lineage_Mapping.md new file mode 100644 index 00000000..4bb54616 --- /dev/null +++ b/sample-data/templates/basic/Lineage Linker/Link_Lineage_Mapping.md @@ -0,0 +1,84 @@ +___ + +## Link Lineage Mapping +> Create a LineageMapping lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +___ diff --git a/sample-data/templates/basic/Lineage Linker/Link_Process_Call.md b/sample-data/templates/basic/Lineage Linker/Link_Process_Call.md new file mode 100644 index 00000000..a567bce4 --- /dev/null +++ b/sample-data/templates/basic/Lineage Linker/Link_Process_Call.md @@ -0,0 +1,84 @@ +___ + +## Link Process Call +> Create a ProcessCall lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +___ diff --git a/sample-data/templates/basic/Lineage Linker/Link_Ultimate_Destination.md b/sample-data/templates/basic/Lineage Linker/Link_Ultimate_Destination.md new file mode 100644 index 00000000..a377f159 --- /dev/null +++ b/sample-data/templates/basic/Lineage Linker/Link_Ultimate_Destination.md @@ -0,0 +1,84 @@ +___ + +## Link Ultimate Destination +> Create a UltimateDestination lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +___ diff --git a/sample-data/templates/basic/Lineage Linker/Link_Ultimate_Source.md b/sample-data/templates/basic/Lineage Linker/Link_Ultimate_Source.md new file mode 100644 index 00000000..4ba1b707 --- /dev/null +++ b/sample-data/templates/basic/Lineage Linker/Link_Ultimate_Source.md @@ -0,0 +1,84 @@ +___ + +## Link Ultimate Source +> Create a UltimateSource lineage relationship between two elements. + +### Element One +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end one of the lineage relationship. + + +### Element Two +> **Input Required**: True + +> **Attribute Type**: Reference Name + +> **Description**: Qualified name, display name, or GUID of the element at end two of the lineage relationship. + + +### Label +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A label used to identify or categorise a relationship link. + +> **Alternative Labels**: Wire Label + + +### Integration Style +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The integration style of the information supply chain (e.g. how data flows between segments). + + +### Data Exchanged +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: The data exchanged in an interaction. + + +### Description +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A description. + + +### Protocol +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: Name of the protocol used for interaction. + + +### One Way +> **Input Required**: False + +> **Attribute Type**: Bool + +> **Description**: Is the link one way or bi-directional? + +> **Alternative Labels**: Unidirectional + +> **Default Value**: True + + +### Frequency +> **Input Required**: False + +> **Attribute Type**: Simple + +> **Description**: A frequency of interaction. + + +___ diff --git a/sample-data/templates/basic/Lineage Linker/Unlink_Lineage_Relationship.md b/sample-data/templates/basic/Lineage Linker/Unlink_Lineage_Relationship.md index fd248288..4bc20e49 100644 --- a/sample-data/templates/basic/Lineage Linker/Unlink_Lineage_Relationship.md +++ b/sample-data/templates/basic/Lineage Linker/Unlink_Lineage_Relationship.md @@ -1,7 +1,7 @@ ___ ## Unlink Lineage Relationship -> Detach (delete) an existing lineage relationship, identified by its own relationship GUID (as returned by Link Lineage Relationship). +> Detach (delete) an existing lineage relationship of any type, identified by its own relationship GUID (as returned by any Link command). > > **Alternative Names**: Detach Lineage Relationship @@ -10,7 +10,7 @@ ___ > **Attribute Type**: Simple -> **Description**: The GUID of the lineage relationship, as returned when it was linked (Link Lineage Relationship's output). +> **Description**: The GUID of the lineage relationship, as returned when it was linked (a Link command's output). ___ From 6a0dafe3503511c89219a63a019987e163a3320a Mon Sep 17 00:00:00 2001 From: Dan Wolfson Date: Wed, 16 Sep 2026 11:05:13 -0500 Subject: [PATCH 2/2] fix(tests): update two my_profile assertions left stale by PR #365 PR #365 (just merged into main, "my_profile_app updates 9/14/2026") changed CreateSubscriptionRequestScreen.action_create_subscription to also set a "GUID" key, and changed shop_for_data_handler.py's create_subscription_callback to build a NewElementRequestBody instead of NewAgreementRequestBody (matching create_digital_subscription's own signature in collection_manager.py -- DigitalSubscription is created via CollectionManager's generic create, so NewAgreementRequestBody was never the right class). These two assertions were the only ones in that PR's otherwise-thorough test rewrite that weren't updated to match, so they failed deterministically on main once merged in. Not flaky -- an earlier commit on this branch wrongly diagnosed these as CI-only nondeterminism (13 local/Docker reproduction attempts all passed, because they ran against pre-PR-#365 code) and added a retry mitigation instead of a real fix; that commit has been reverted in favor of this one. Signed-off-by: Dan Wolfson Co-Authored-By: Claude Sonnet 5 Signed-off-by: Dan Wolfson --- tests/micro-tests/my_profile/test_screens.py | 1 + .../micro-tests/my_profile/test_shop_for_data_handler.py | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/micro-tests/my_profile/test_screens.py b/tests/micro-tests/my_profile/test_screens.py index 897f828f..f54daca8 100644 --- a/tests/micro-tests/my_profile/test_screens.py +++ b/tests/micro-tests/my_profile/test_screens.py @@ -282,6 +282,7 @@ async def test_create_subscription_request_screen(self): assert app.dismissed_result == { "externalSourceGUID": "guid-item-123", "guid": "guid-item-123", + "GUID": "guid-item-123", "displayName": "My Sub", "Status": "ACTIVE", } diff --git a/tests/micro-tests/my_profile/test_shop_for_data_handler.py b/tests/micro-tests/my_profile/test_shop_for_data_handler.py index 4cee85da..1e865325 100644 --- a/tests/micro-tests/my_profile/test_shop_for_data_handler.py +++ b/tests/micro-tests/my_profile/test_shop_for_data_handler.py @@ -399,9 +399,11 @@ def test_create_subscription_callback_creates_subscription_with_client(self, bac else: assert mock_client.create_digital_subscription.called call_args = mock_client.create_digital_subscription.call_args[0][0] - assert call_args["class"] == "NewAgreementRequestBody" - assert call_args["initialStatus"] == "ACTIVE" - assert call_args["externalSourceGUID"] == "guid-prod-123" + # DigitalSubscription is created via CollectionManager's generic create + # (create_digital_subscription's own signature: body: dict | NewElementRequestBody, + # collection_manager.py) -- NewAgreementRequestBody was never the right class here. + assert call_args["class"] == "NewElementRequestBody" + assert call_args["properties"]["contentStatus"] == "ACTIVE" assert call_args["properties"]["displayName"] == display_name assert any("Created digital subscription successfully" in msg for msg in app.log_messages)