Class: DaVinciDTRTestKit::Generator

Inherits:
Object
  • Object
show all
Defined in:
lib/davinci_dtr_test_kit/generator.rb,
lib/davinci_dtr_test_kit/generator/ig_metadata.rb,
lib/davinci_dtr_test_kit/generator/profile_metadata_extractor.rb

Overview

Generates profile metadata files (used by the test kit's must support tests) from a DTR IG package into cross_suite/generated/<ig_version>.

Defined Under Namespace

Classes: IGMetadata, ProfileMetadataExtractor

Constant Summary collapse

TARGET_IG_VERSIONS =
['2.2.0'].freeze
TARGET_PROFILES_AND_ELEMENT_SCOPE =

Must support checks are scoped to only differential for standard and adaptive

{
  'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/DTR-QPackageBundle' => 'snapshot',
  'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters' => 'snapshot',
  'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-base-questionnaire' => 'snapshot',
  'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-questionnaire-adapt' => 'differential',
  'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-questionnaire-adapt-search' => 'snapshot',
  'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-std-questionnaire' => 'differential'
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ig_file_name) ⇒ Generator

Returns a new instance of Generator.



39
40
41
# File 'lib/davinci_dtr_test_kit/generator.rb', line 39

def initialize(ig_file_name)
  self.ig_file_name = ig_file_name
end

Instance Attribute Details

#ig_file_nameObject

Returns the value of attribute ig_file_name.



37
38
39
# File 'lib/davinci_dtr_test_kit/generator.rb', line 37

def ig_file_name
  @ig_file_name
end

#ig_metadataObject

Returns the value of attribute ig_metadata.



37
38
39
# File 'lib/davinci_dtr_test_kit/generator.rb', line 37

def 
  @ig_metadata
end

#ig_resourcesObject

Returns the value of attribute ig_resources.



37
38
39
# File 'lib/davinci_dtr_test_kit/generator.rb', line 37

def ig_resources
  @ig_resources
end

Class Method Details

.generateObject



26
27
28
29
30
31
32
33
34
35
# File 'lib/davinci_dtr_test_kit/generator.rb', line 26

def self.generate
  ig_packages = Dir.glob(File.join(Dir.pwd, 'lib', 'davinci_dtr_test_kit', 'igs', '*.tgz'))

  ig_packages.each do |ig_package|
    generator = new(ig_package)
    next unless TARGET_IG_VERSIONS.include?(generator.ig_version_from_file_name)

    generator.generate
  end
end

Instance Method Details

#add_parameters_slice_discriminators(profile_metadata) ⇒ Object

This is a workaround for Inferno Core treating slice discriminators defined with patternString as unsupported. The QuestionnairePackage Output Parameters profile slices Parameters.parameter by name (packagebundle and outcome), so replace only unsupported discriminators with equivalent value metadata. If Core gets updated to support patternString, this method becomes a no-op and can be removed.



106
107
108
109
110
111
112
113
114
115
# File 'lib/davinci_dtr_test_kit/generator.rb', line 106

def add_parameters_slice_discriminators()
  .must_supports[:slices].each do |slice|
    next unless slice.dig(:discriminator, :type) == 'unsupported'

    slice[:discriminator] = {
      type: 'value',
      values: [{ path: 'name', value: slice[:slice_name] }]
    }
  end
end

#base_output_dirObject



86
87
88
# File 'lib/davinci_dtr_test_kit/generator.rb', line 86

def base_output_dir
  File.join(__dir__, 'cross_suite', 'generated', .ig_version)
end

#extract_metadataObject



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/davinci_dtr_test_kit/generator.rb', line 68

def 
  self. = IGMetadata.new
  .ig_version = "v#{ig_resources.ig_resource.version}"
  .profiles = target_profiles.map do |profile|
    element_scope = TARGET_PROFILES_AND_ELEMENT_SCOPE[profile.url]
     = ProfileMetadataExtractor.new(profile.url, ig_resources, element_scope).

    # handle gap when looking at differential
    .must_supports[:recursive_elements] << 'item' if element_scope == 'differential'
    add_parameters_slice_discriminators() if questionnaire_package_output_parameters?(profile)

    
  end

  FileUtils.mkdir_p(base_output_dir)
  File.write(File.join(base_output_dir, 'metadata.yml'), YAML.dump(.to_hash))
end

#generateObject



47
48
49
50
51
52
# File 'lib/davinci_dtr_test_kit/generator.rb', line 47

def generate
  puts "Generating profile metadata for IG #{File.basename(ig_file_name)}"
  load_ig_package
  
  
end

#ig_version_from_file_nameObject



43
44
45
# File 'lib/davinci_dtr_test_kit/generator.rb', line 43

def ig_version_from_file_name
  File.basename(ig_file_name, '.tgz').split('_').last
end

#load_ig_packageObject



54
55
56
57
58
59
# File 'lib/davinci_dtr_test_kit/generator.rb', line 54

def load_ig_package
  self.ig_resources = Inferno::Entities::IG.from_file(
    ig_file_name,
    standalone_resources_directory: ig_file_name.chomp('.tgz')
  )
end

#questionnaire_package_output_parameters?(profile) ⇒ Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/davinci_dtr_test_kit/generator.rb', line 98

def questionnaire_package_output_parameters?(profile)
  profile.url == 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters'
end

#target_profilesObject

DTR profiles analyzed include the Questionnaires



62
63
64
65
66
# File 'lib/davinci_dtr_test_kit/generator.rb', line 62

def target_profiles
  ig_resources.resources_by_type['StructureDefinition'].select do |structure_definition|
    TARGET_PROFILES_AND_ELEMENT_SCOPE.key?(structure_definition.url)
  end
end

#write_profile_metadataObject



90
91
92
93
94
95
96
# File 'lib/davinci_dtr_test_kit/generator.rb', line 90

def 
  .profiles.each do ||
     = File.join(base_output_dir, .snake_case_for_profile())
    FileUtils.mkdir_p()
    File.write(File.join(, 'metadata.yml'), YAML.dump(.to_hash))
  end
end