fhir_models 3.0.1 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bab3bfcfe4d96afc6c714673eab6679bda2af15e
4
- data.tar.gz: 58bb4aa2afa1f20df0bd5c24d309088208635f5c
3
+ metadata.gz: ecf5c1936f2720e5d6bd078a8f90f04f1c893b92
4
+ data.tar.gz: f9e7defc1c7cffa0476e7cac9eb6ac24551df0bc
5
5
  SHA512:
6
- metadata.gz: 8ee9a2d5cccf24322c39e05d4f1189cec3f98c0e99347248c595af69dbfa0d7cba20d9ac53155365221cacf8ca3debb14d50d91a8186b9e5491ba631c4d6f66b
7
- data.tar.gz: 4f5a5ea76105e08e7be2723fc7db678950d99b31ca5a5a1740d1820800ebe48a534b4c68010b7f40b5797e3e888768b41c2e4c326f785b519fa0950949586b98
6
+ metadata.gz: 784aab30766ed214c764e9674bc66d91d62e870cc4fb89ae8b3eae89d5c45844c3a8c35e14a42ddd322e84137d3b3026b53a622f8d5d55bdbb7fdc8c7270fa12
7
+ data.tar.gz: 254312b628d5d818c4e6e42897b970e02dfb1142de6b88449057b3dde136d62be76fcec1f0187ee70a8ff30c3e3521fbf5f5367c6bf3687a671a0c826a271831
data/.rubocop_todo.yml CHANGED
@@ -6,6 +6,15 @@
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
+ Performance/Caller:
10
+ Enabled: false
11
+
12
+ Style/MultipleComparison:
13
+ Enabled: false
14
+
15
+ Style/YodaCondition:
16
+ Enabled: false
17
+
9
18
  # Offense count: 37
10
19
  Metrics/AbcSize:
11
20
  Max: 423
@@ -13,7 +22,7 @@ Metrics/AbcSize:
13
22
  # Offense count: 10
14
23
  # Configuration parameters: CountComments, ExcludedMethods.
15
24
  Metrics/BlockLength:
16
- Max: 101
25
+ Max: 120
17
26
 
18
27
  # Offense count: 1
19
28
  # Configuration parameters: CountBlocks.
data/fhir_models.gemspec CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency 'nokogiri', '>= 1.6'
24
24
  spec.add_dependency 'date_time_precision', '>= 0.8'
25
25
  spec.add_dependency 'bcp47', '>= 0.3'
26
- spec.add_dependency 'mime-types', '>= 1.16', '< 3'
26
+ spec.add_dependency 'mime-types', '>= 1.16'
27
27
 
28
28
  spec.add_development_dependency 'bundler'
29
29
  spec.add_development_dependency 'rake'
@@ -197,7 +197,7 @@ module FHIR
197
197
  def self.get_codes(uri)
198
198
  return nil if uri.nil?
199
199
  return @@cache[uri] if @@cache[uri]
200
- valueset = expansions.select { |x| x['url'] == uri }.first
200
+ valueset = expansions.find { |x| x['url'] == uri } || valuesets.find { |x| x['url'] == uri && x['resourceType'] == 'ValueSet' }
201
201
  unless valueset.nil?
202
202
  @@cache[uri] = {}
203
203
  if !valueset['expansion'].nil? && !valueset['expansion']['contains'].nil?
@@ -206,11 +206,18 @@ module FHIR
206
206
  valueset['expansion']['contains'].each { |x| @@cache[uri][x['system']] << x['code'] }
207
207
  end
208
208
  if !valueset['compose'].nil? && !valueset['compose']['include'].nil?
209
- included_systems = valueset['compose']['include'].map { |x| x['system'] }.uniq
210
- included_systems.each { |x| @@cache[uri][x] = [] unless @@cache[uri].keys.include?(x) }
209
+ # for each system, if codes are included add those, otherwise lookup the codesystem in the list
210
+ included_systems = []
211
+ valueset['compose']['include'].each do |code_group|
212
+ system_url = code_group['system']
213
+ @@cache[uri][system_url] ||= []
214
+ code_group['concept'].each { |y| @@cache[uri][system_url] << y['code'] } if code_group['concept']
215
+ included_systems << system_url
216
+ end
217
+ included_systems.each { |x| @@cache[uri][x] ||= [] }
211
218
  systems = valuesets.select { |x| x['resourceType'] == 'CodeSystem' && included_systems.include?(x['url']) }
212
- systems.each do |x|
213
- x['concept'].each { |y| @@cache[uri][x['url']] << y['code'] } if x['concept']
219
+ systems.each do |included_system|
220
+ included_system['concept'].each { |y| @@cache[uri][included_system['url']] << y['code'] } if included_system['concept']
214
221
  end
215
222
  end
216
223
  @@cache[uri].each { |_system, codes| codes.uniq! }
@@ -235,7 +235,7 @@ module FHIR
235
235
  end
236
236
  else
237
237
  the_codes.each do |code|
238
- has_valid_code = true if check_binding(meta['binding']['uri'], code)
238
+ has_valid_code = true if check_binding_uri(meta['binding']['uri'], code)
239
239
  break if has_valid_code
240
240
  end
241
241
  end
@@ -277,7 +277,7 @@ module FHIR
277
277
  end
278
278
  deprecate :is_primitive?, :primitive?
279
279
 
280
- def check_binding(uri, value)
280
+ def check_binding_uri(uri, value)
281
281
  valid = false
282
282
  if uri == 'http://hl7.org/fhir/ValueSet/content-type' || uri == 'http://www.rfc-editor.org/bcp/bcp13.txt'
283
283
  matches = MIME::Types[value]
@@ -288,11 +288,11 @@ module FHIR
288
288
  has_region = !(value =~ /-/).nil?
289
289
  valid = !BCP47::Language.identify(value.downcase).nil? && (!has_region || !BCP47::Region.identify(value.upcase).nil?)
290
290
  else
291
- FHIR.logger.warn "Unable to check_binding on unknown ValueSet: #{uri}"
291
+ FHIR.logger.warn "Unable to check_binding_uri on unknown ValueSet: #{uri}"
292
292
  end
293
293
  valid
294
294
  end
295
295
 
296
- private :validate_reference_type, :check_binding, :validate_field
296
+ private :validate_reference_type, :check_binding_uri, :validate_field
297
297
  end
298
298
  end
@@ -113,9 +113,10 @@ module FHIR
113
113
  path = element.local_name || element.path
114
114
  path = path[(@hierarchy.path.size + 1)..-1] if path.start_with? @hierarchy.path
115
115
 
116
- begin
116
+ if element.type && !element.type.empty?
117
117
  data_type_found = element.type.first.code
118
- rescue
118
+ else
119
+ @warnings << "Unable to guess data type for #{describe_element(element)}"
119
120
  data_type_found = nil
120
121
  end
121
122
 
@@ -139,16 +140,12 @@ module FHIR
139
140
  nodes = nodes.select { |x| extension_profile.profile == x['url'] }
140
141
  end
141
142
 
142
- # Check the cardinality
143
- min = element.min
144
- max = element.max == '*' ? Float::INFINITY : element.max.to_i
145
- if (nodes.size < min) || (nodes.size > max)
146
- @errors << "#{describe_element(element)} failed cardinality test (#{min}..#{max}) -- found #{nodes.size}"
147
- end
143
+ verify_cardinality(element, nodes)
148
144
 
149
145
  return if nodes.empty?
150
146
  # Check the datatype for each node, only if the element has one declared, and it isn't the root element
151
147
  if !element.type.empty? && element.path != id
148
+ # element.type not being empty implies data_type_found != nil, for valid profiles
152
149
  codeable_concept_pattern = element.pattern && element.pattern.is_a?(FHIR::CodeableConcept)
153
150
  matching_pattern = false
154
151
  nodes.each do |value|
@@ -165,18 +162,18 @@ module FHIR
165
162
  # if extension_def
166
163
  # verified_extension = extension_def.validates_resource?(FHIR::Extension.new(deep_copy(value)))
167
164
  # end
168
- elsif data_type_found
165
+ else
169
166
  temp = @errors
170
167
  @errors = []
171
168
  verified_data_type = data_type?(data_type_found, value)
172
- temp_messages << @errors
169
+ temp_messages += @errors
173
170
  @errors = temp
174
171
  end
175
- if data_type_found && (verified_extension || verified_data_type)
172
+ if verified_extension || verified_data_type
176
173
  matching_type += 1
177
174
  if data_type_found == 'code' # then check the binding
178
175
  unless element.binding.nil?
179
- matching_type += check_binding(element, value)
176
+ matching_type += check_binding_element(element, value)
180
177
  end
181
178
  elsif data_type_found == 'CodeableConcept' && codeable_concept_pattern
182
179
  vcc = FHIR::CodeableConcept.new(value)
@@ -189,12 +186,8 @@ module FHIR
189
186
  elsif data_type_found == 'String' && !element.maxLength.nil? && (value.size > element.maxLength)
190
187
  @errors << "#{describe_element(element)} exceed maximum length of #{element.maxLength}: #{value}"
191
188
  end
192
- elsif data_type_found
193
- temp_messages << "#{describe_element(element)} is not a valid #{data_type_found}: '#{value}'"
194
189
  else
195
- # we don't know the data type... so we say "OK"
196
- matching_type += 1
197
- @warnings >> "Unable to guess data type for #{describe_element(element)}"
190
+ temp_messages << "#{describe_element(element)} is not a valid #{data_type_found}: '#{value}'"
198
191
  end
199
192
 
200
193
  if matching_type <= 0
@@ -203,9 +196,7 @@ module FHIR
203
196
  else
204
197
  @warnings += temp_messages
205
198
  end
206
- if !element.fixed.nil? && element.fixed != value
207
- @errors << "#{describe_element(element)} value of '#{value}' did not match fixed value: #{element.fixed}"
208
- end
199
+ verify_fixed_value(element, value)
209
200
  end
210
201
  if codeable_concept_pattern && matching_pattern == false
211
202
  @errors << "#{describe_element(element)} CodeableConcept did not match defined pattern: #{element.pattern.to_hash}"
@@ -244,6 +235,17 @@ module FHIR
244
235
  end
245
236
  end
246
237
 
238
+ def verify_cardinality(element, nodes)
239
+ # Check the cardinality
240
+ min = element.min
241
+ max = element.max == '*' ? Float::INFINITY : element.max.to_i
242
+ @errors << "#{describe_element(element)} failed cardinality test (#{min}..#{max}) -- found #{nodes.size}" if (nodes.size < min) || (nodes.size > max)
243
+ end
244
+
245
+ def verify_fixed_value(element, value)
246
+ @errors << "#{describe_element(element)} value of '#{value}' did not match fixed value: #{element.fixed}" if !element.fixed.nil? && element.fixed != value
247
+ end
248
+
247
249
  # data_type_code == a FHIR DataType code (see http://hl7.org/fhir/2015May/datatypes.html)
248
250
  # value == the representation of the value
249
251
  def data_type?(data_type_code, value)
@@ -322,7 +324,7 @@ module FHIR
322
324
  end
323
325
  deprecate :is_data_type?, :data_type?
324
326
 
325
- def check_binding(element, value)
327
+ def check_binding_element(element, value)
326
328
  vs_uri = element.binding.valueSetUri || element.binding.valueSetReference.reference
327
329
  valueset = FHIR::Definitions.get_codes(vs_uri)
328
330
 
@@ -353,7 +355,7 @@ module FHIR
353
355
  end
354
356
  end
355
357
  elsif !valueset.values.flatten.include?(value)
356
- message = "#{element.path} has invalid code '#{value}' from #{valueset}"
358
+ message = "#{element.path} has invalid code '#{value}' from #{vs_uri}"
357
359
  if element.binding.strength == 'required'
358
360
  @errors << message
359
361
  matching_type -= 1
@@ -368,13 +370,12 @@ module FHIR
368
370
  def some_type_of_xml_or_json?(code)
369
371
  m = code.downcase
370
372
  return true if m == 'xml' || m == 'json'
371
- return true if (m.starts_with?('application/') || m.starts_with?('text/')) && (m.ends_with?('json') || m.ends_with?('xml'))
372
- return true if m.starts_with?('application/xml') || m.starts_with?('text/xml')
373
- return true if m.starts_with?('application/json') || m.starts_with?('text/json')
373
+ return true if m.start_with?('application/', 'text/') && m.end_with?('json', 'xml')
374
+ return true if m.start_with?('application/xml', 'text/xml', 'application/json', 'text/json')
374
375
  false
375
376
  end
376
377
  deprecate :is_some_type_of_xml_or_json, :some_type_of_xml_or_json?
377
378
 
378
- private :valid_json?, :get_json_nodes, :build_hierarchy, :verify_element, :check_binding
379
+ private :valid_json?, :get_json_nodes, :build_hierarchy, :verify_element, :check_binding_element
379
380
  end
380
381
  end
@@ -1,5 +1,5 @@
1
1
  module FHIR
2
2
  module Models
3
- VERSION = '3.0.1'.freeze
3
+ VERSION = '3.0.2'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fhir_models
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Walonoski
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2017-05-02 00:00:00.000000000 Z
13
+ date: 2017-08-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -61,9 +61,6 @@ dependencies:
61
61
  - - ">="
62
62
  - !ruby/object:Gem::Version
63
63
  version: '1.16'
64
- - - "<"
65
- - !ruby/object:Gem::Version
66
- version: '3'
67
64
  type: :runtime
68
65
  prerelease: false
69
66
  version_requirements: !ruby/object:Gem::Requirement
@@ -71,9 +68,6 @@ dependencies:
71
68
  - - ">="
72
69
  - !ruby/object:Gem::Version
73
70
  version: '1.16'
74
- - - "<"
75
- - !ruby/object:Gem::Version
76
- version: '3'
77
71
  - !ruby/object:Gem::Dependency
78
72
  name: bundler
79
73
  requirement: !ruby/object:Gem::Requirement
@@ -1633,7 +1627,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1633
1627
  version: '0'
1634
1628
  requirements: []
1635
1629
  rubyforge_project:
1636
- rubygems_version: 2.6.7
1630
+ rubygems_version: 2.6.12
1637
1631
  signing_key:
1638
1632
  specification_version: 4
1639
1633
  summary: A Gem for handling FHIR models in ruby