Class: Inferno::DSL::FHIREvaluation::Rules::AllExtensionsUsed

Inherits:
Inferno::DSL::FHIREvaluation::Rule show all
Defined in:
lib/inferno/dsl/fhir_evaluation/rules/all_extensions_used.rb

Instance Method Summary collapse

Instance Method Details

#check(context) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_extensions_used.rb', line 8

def check(context)
  all_extensions = collect_profile_extensions(context.ig.profiles)
  unused_extensions = remove_found_resource_extensions(all_extensions, context.data)
  if unused_extensions.any? { |_profile, extensions| !extensions.empty? }
    message = get_fail_message(unused_extensions)
    result = EvaluationResult.new(message, rule: self)
  else
    message = 'All extensions specified in profiles are represented in instances.'
    result = EvaluationResult.new(message, severity: 'success', rule: self)
  end

  context.add_result result
end

#collect_profile_extensions(profiles) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_extensions_used.rb', line 22

def collect_profile_extensions(profiles)
  extensions = Hash.new { |extension, profile| extension[profile] = Set.new }
  profiles.each do |profile|
    profile.each_element do |value, |
      next unless ['type'] == 'ElementDefinition'

      path_end = value.id.split('.')[-1]
      next unless path_end.include?('extension')

      value.type.each do |element_definition|
        element_definition.profile.each do |extension_url|
          extensions[profile.url].add(extension_url)
        end
      end
    end
  end
  extensions
end

#get_fail_message(extensions) ⇒ Object



65
66
67
68
69
70
71
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_extensions_used.rb', line 65

def get_fail_message(extensions)
  message = 'Found extensions specified in profiles, but not used in instances:'
  extensions.each do |profile, extension|
    message += "\n Profile: #{profile}, \n\tExtensions: #{extension.join(', ')}" unless extension.empty?
  end
  message
end

#remove_found_resource_extensions(extensions, examples) ⇒ Object

rubocop:disable Metrics/CyclomaticComplexity



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_extensions_used.rb', line 42

def remove_found_resource_extensions(extensions, examples)
  unused_extensions = extensions.dup
  examples.each do |resource|
    resource.each_element do |value, , path|
      path_elements = path.split('.')
      next unless path_elements.length > 1

      next unless path_elements[-2].include?('extension') && path_elements[-1] == 'url'

      profiles = resource&.meta&.profile || []
      update_unused_extensions(profiles, value, unused_extensions, extensions)
    end
  end
  unused_extensions
end

#update_unused_extensions(profiles, value, unused_extensions, extensions) ⇒ Object

rubocop:enable Metrics/CyclomaticComplexity



59
60
61
62
63
# File 'lib/inferno/dsl/fhir_evaluation/rules/all_extensions_used.rb', line 59

def update_unused_extensions(profiles, value, unused_extensions, extensions)
  profiles.each do |profile|
    unused_extensions[profile].delete(value) if extensions.key?(profile)
  end
end