From 632da408d8d8e82e5828c83c4a45154a74bcbdf8 Mon Sep 17 00:00:00 2001 From: Lucas Tucker Date: Mon, 22 Jun 2026 17:05:31 -0400 Subject: [PATCH 1/2] Move metadata extractor upgrades to Core --- .../dsl/must_support_metadata_extractor.rb | 21 +++++++-- .../must_support_metadata_extractor_spec.rb | 46 +++++++++++++++++++ 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/lib/inferno/dsl/must_support_metadata_extractor.rb b/lib/inferno/dsl/must_support_metadata_extractor.rb index 12f009fcb..0aa7519a1 100644 --- a/lib/inferno/dsl/must_support_metadata_extractor.rb +++ b/lib/inferno/dsl/must_support_metadata_extractor.rb @@ -198,11 +198,22 @@ def save_pattern_slice(pattern_element, discriminator_path, metadata) system: pattern_element.patternCoding.system } elsif pattern_element.patternIdentifier - { - type: 'patternIdentifier', - path: runtime_path, - system: pattern_element.patternIdentifier.system - } + identifier_type_coding = pattern_element.patternIdentifier.type&.coding&.first + if identifier_type_coding + type_path = runtime_path.present? ? "#{runtime_path}.type" : 'type' + { + type: 'patternCodeableConcept', + path: type_path, + code: identifier_type_coding.code, + system: identifier_type_coding.system + } + else + { + type: 'patternIdentifier', + path: runtime_path, + system: pattern_element.patternIdentifier.system + } + end elsif required_binding_pattern?(pattern_element) { type: 'requiredBinding', diff --git a/spec/inferno/dsl/must_support_metadata_extractor_spec.rb b/spec/inferno/dsl/must_support_metadata_extractor_spec.rb index 92c4cda69..a23ad72fa 100644 --- a/spec/inferno/dsl/must_support_metadata_extractor_spec.rb +++ b/spec/inferno/dsl/must_support_metadata_extractor_spec.rb @@ -384,6 +384,52 @@ } ) end + + it 'emits a patternCodeableConcept discriminator for a patternIdentifier slice with type.coding' do + discriminator = FHIR::ElementDefinition::Slicing::Discriminator.new(type: 'value', path: '$this') + slicing = FHIR::ElementDefinition::Slicing.new(discriminator: [discriminator]) + identifier_type = FHIR::CodeableConcept.new( + coding: [FHIR::Coding.new(system: 'http://terminology.hl7.org/CodeSystem/v2-0203', code: 'PI')] + ) + profile_elements = [ + FHIR::ElementDefinition.new( + id: 'Organization.identifier', + path: 'Organization.identifier', + mustSupport: false, + slicing: + ), + FHIR::ElementDefinition.new( + id: 'Organization.identifier:PI', + path: 'Organization.identifier', + sliceName: 'PI', + mustSupport: true, + patternIdentifier: FHIR::Identifier.new(type: identifier_type) + ) + ] + org_profile = instance_double( + FHIR::StructureDefinition, + baseDefinition: 'baseDefinition', + name: 'organization', + type: 'Organization', + version: '2.2.0' + ) + + slices = described_class.new(profile_elements, org_profile, 'Organization', ig_resources).value_slices + + expect(slices).to contain_exactly( + { + slice_id: 'Organization.identifier:PI', + slice_name: 'PI', + path: 'identifier', + discriminator: { + type: 'patternCodeableConcept', + path: 'type', + code: 'PI', + system: 'http://terminology.hl7.org/CodeSystem/v2-0203' + } + } + ) + end end describe '#must_support_elements' do From d39a5b067cb8d74777a4c2071160ea49e5b780df Mon Sep 17 00:00:00 2001 From: Lucas Tucker Date: Mon, 22 Jun 2026 17:50:33 -0400 Subject: [PATCH 2/2] Fix rubocop issue --- .../dsl/must_support_metadata_extractor.rb | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/lib/inferno/dsl/must_support_metadata_extractor.rb b/lib/inferno/dsl/must_support_metadata_extractor.rb index 0aa7519a1..37eaab752 100644 --- a/lib/inferno/dsl/must_support_metadata_extractor.rb +++ b/lib/inferno/dsl/must_support_metadata_extractor.rb @@ -198,22 +198,7 @@ def save_pattern_slice(pattern_element, discriminator_path, metadata) system: pattern_element.patternCoding.system } elsif pattern_element.patternIdentifier - identifier_type_coding = pattern_element.patternIdentifier.type&.coding&.first - if identifier_type_coding - type_path = runtime_path.present? ? "#{runtime_path}.type" : 'type' - { - type: 'patternCodeableConcept', - path: type_path, - code: identifier_type_coding.code, - system: identifier_type_coding.system - } - else - { - type: 'patternIdentifier', - path: runtime_path, - system: pattern_element.patternIdentifier.system - } - end + save_pattern_identifier_slice(pattern_element.patternIdentifier, runtime_path) elsif required_binding_pattern?(pattern_element) { type: 'requiredBinding', @@ -233,6 +218,25 @@ def required_binding_pattern?(pattern_element) pattern_element.binding&.strength == 'required' && pattern_element.binding&.valueSet end + def save_pattern_identifier_slice(pattern_identifier, runtime_path) + identifier_type_coding = pattern_identifier.type&.coding&.first + if identifier_type_coding + type_path = runtime_path.present? ? "#{runtime_path}.type" : 'type' + { + type: 'patternCodeableConcept', + path: type_path, + code: identifier_type_coding.code, + system: identifier_type_coding.system + } + else + { + type: 'patternIdentifier', + path: runtime_path, + system: pattern_identifier.system + } + end + end + def extract_required_binding_values(pattern_element, metadata) value_extractor = ValueExtractor.new(ig_resources, resource, profile_elements)