This repository has been archived by the owner on Jan 23, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 35
/
generic_generator.rb
116 lines (100 loc) · 4.09 KB
/
generic_generator.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# frozen_string_literal: true
require_relative '../generator_base'
require_relative '../sequence_metadata'
require_relative '../search_parameter_metadata'
require_relative './read_test'
require_relative './profile_validation_test'
require_relative './search_test'
require_relative './interaction_test'
require_relative '../generic_generator_utilities'
module Inferno
module Generator
class GenericGenerator < Generator::Base
include ReadTest
include ProfileValidationTest
include SearchTest
include InteractionTest
include Inferno::Generator::GenericGeneratorUtilties
def resource_profiles
resources_by_type['StructureDefinition'].reject { |definition| definition['type'] == 'Extension' }
end
def sequence_metadata
@sequence_metadata ||= resource_profiles.map { |profile| SequenceMetadata.new(profile, @path, search_parameter_metadata, capability_statement) }
end
def search_parameter_metadata
@search_parameter_metadata ||= resources_by_type['SearchParameter'].map { |parameter_json| SearchParameterMetadata.new(parameter_json) }
end
def generate
generate_sequences
copy_static_files
generate_module
end
def generate_sequences
sequence_metadata.each do |metadata|
create_read_test(metadata)
create_search_tests(metadata)
create_profile_validation_test(metadata)
create_interaction_tests(metadata)
generate_sequence(metadata)
end
end
def generate_sequence(metadata)
puts "Generating #{metadata.title}\n"
file_name = File.join(sequence_out_path, metadata.file_name + '.rb')
template = ERB.new(File.read(File.join(__dir__, 'templates/sequence.rb.erb')))
output = template.result_with_hash(metadata: metadata)
FileUtils.mkdir_p(sequence_out_path + '/') unless File.directory?(sequence_out_path + '/')
File.write(file_name, output)
generate_sequence_definitions(metadata)
end
def generate_sequence_definitions(metadata)
output_directory = File.join(sequence_out_path, 'profile_definitions')
file_name = File.join(output_directory, metadata.file_name + '_definitions.rb')
template = ERB.new(File.read(File.join(__dir__, 'templates/sequence_definition.rb.erb')))
output = template.result_with_hash(sequence_definition_hash(metadata))
FileUtils.mkdir_p(sequence_out_path + '/profile_definitions/') unless File.directory?(sequence_out_path + '/profile_definitions/')
File.write(file_name, output)
end
def sequence_definition_hash(metadata)
search_parameters = metadata.search_parameter_metadata&.map do |param_metadata|
{
url: param_metadata.url,
code: param_metadata.code,
expression: param_metadata.expression,
multipleOr: param_metadata.multiple_or,
multipleOrExpectation: param_metadata.multiple_or_expectation,
multipleAnd: param_metadata.multiple_and,
multipleAndExpectation: param_metadata.multiple_and_expectation,
modifiers: param_metadata.modifiers,
comparators: param_metadata.comparators
}
end
search_parameters ||= []
{
class_name: metadata.class_name + 'Definition',
search_parameters: structure_to_string(search_parameters)
}
end
def module_file_path
"#{module_yml_out_path}/#{@path}_module.yml"
end
def generate_module
file_name = module_file_path
module_info = {
title: @path,
sequences: sequence_metadata,
resource_path: @path,
description: ''
}
template = ERB.new(File.read(File.join(__dir__, 'templates/module.yml.erb')))
output = template.result_with_hash(module_info)
File.write(file_name, output)
end
def copy_static_files
Dir.glob(File.join(__dir__, 'static', '*')).each do |static_file|
FileUtils.cp(static_file, sequence_out_path)
end
end
end
end
end