fhir_models 1.6.4 → 1.6.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f89ba6a33ad77f32f671ea353426b6e0f2e5e9c8
4
- data.tar.gz: 348c0ac6566160061a8ecea33defd3485ea7ef6a
3
+ metadata.gz: d8d5ba026745d19e4eab57461d9df5dbf731b540
4
+ data.tar.gz: b5acd0da79199bb9ea202c56674b065f7ce94432
5
5
  SHA512:
6
- metadata.gz: 5404719231935514e1d38a67b6858353313fe5da2994ff6c19b3be590a249b84fe850d45bf3a87bfd288280d2c3ee3ae9d0320a1309d13c9303e884f77f6d38f
7
- data.tar.gz: 8aa770cc117faff9e3c3f2c2b3ce8506f89edd2f24026cf3050d1e0db45a12969262e6286b7bf918df5d182856be214a685c15a8480763dcbfad6df469909d15
6
+ metadata.gz: e40b0e89ced0a5de56edcc4e637f99e3fa94abb3ccd6574398f34f3341075dfb807b6535ecbb0a317387dc22e3dde418a06a4c70264e347c02a12cb4570ff630
7
+ data.tar.gz: 589812ea7e6f30e2136c4270a895cef564e7775e12d2d0bc51109f9c16c9a0da4f48a4eb3ece0958f9f5533289653891bd210dee85fab687e487d4ded6bd1162
data/.rubocop.yml CHANGED
@@ -3,6 +3,8 @@ AllCops:
3
3
  Exclude:
4
4
  - 'test/**/*'
5
5
  - 'lib/fhir_models/fhir/**/*'
6
+ - 'lib/fhir_models/fluentpath/evaluate.rb'
7
+ - 'tmp/**/*'
6
8
 
7
9
  #################### Lint ################################
8
10
 
data/Rakefile CHANGED
@@ -19,6 +19,8 @@ task :rubocop do
19
19
  RuboCop::RakeTask.new
20
20
  end
21
21
 
22
- task default: [:test, :rubocop] do
22
+ task test: [:rubocop] do
23
23
  system('open coverage/index.html')
24
24
  end
25
+
26
+ task default: [:test]
data/bin/console CHANGED
@@ -7,8 +7,8 @@ require 'fhir_models'
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
9
  # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
10
+ require 'pry'
11
+ Pry.start
12
12
 
13
- require 'irb'
14
- IRB.start
13
+ # require 'irb'
14
+ # IRB.start
data/lib/fhir_models.rb CHANGED
@@ -15,6 +15,7 @@ Dir.chdir('lib') do
15
15
 
16
16
  require_relative 'fhir_models/fhir'
17
17
 
18
+ require_relative 'fhir_models/fhir/metadata'
18
19
  # require generated models
19
20
  Dir['fhir_models/fhir/**/*.rb'].each do |file|
20
21
  require_relative file
@@ -50,27 +50,12 @@ module FHIR
50
50
  value.map! do |child|
51
51
  obj = child
52
52
  unless [FHIR::RESOURCES, FHIR::TYPES].flatten.include? child.class.name.gsub('FHIR::', '')
53
- if child['resourceType']
54
- klass = Module.const_get("FHIR::#{child['resourceType']}") rescue nil
55
- end
56
- begin
57
- obj = klass.new(child)
58
- rescue => e
59
- FHIR.logger.error("Unable to inflate embedded class #{klass}\n#{e.backtrace}")
60
- end
53
+ obj = make_child(child, klass)
61
54
  end
62
55
  obj
63
56
  end
64
57
  else # handle single object
65
- if value['resourceType']
66
- klass = Module.const_get("FHIR::#{value['resourceType']}") rescue nil
67
- end
68
- begin
69
- obj = klass.new(value)
70
- value = obj
71
- rescue => e
72
- FHIR.logger.error("Unable to inflate embedded class #{klass}\n#{e.backtrace}")
73
- end
58
+ value = make_child(value, klass)
74
59
  # if there is only one of these, but cardinality allows more, we need to wrap it in an array.
75
60
  value = [ value ] if(value && (meta['max'] > 1))
76
61
  end
@@ -96,6 +81,18 @@ module FHIR
96
81
  self
97
82
  end
98
83
 
84
+ def make_child(child, klass)
85
+ if child['resourceType']
86
+ klass = Module.const_get("FHIR::#{child['resourceType']}") rescue nil
87
+ end
88
+ begin
89
+ obj = klass.new(child)
90
+ rescue => e
91
+ FHIR.logger.error("Unable to inflate embedded class #{klass}\n#{e.backtrace}")
92
+ end
93
+ obj
94
+ end
95
+
99
96
  def convert_primitive(value, meta)
100
97
  return value if !value.is_a?(String)
101
98
 
@@ -117,6 +114,6 @@ module FHIR
117
114
  rval
118
115
  end
119
116
 
120
- private :convert_primitive
117
+ private :make_child, :convert_primitive
121
118
  end
122
119
  end
@@ -52,7 +52,7 @@ module FHIR
52
52
  end
53
53
 
54
54
  def to_reference
55
- FHIR::Reference.new(reference: "#{self.class.name.demodulize}/#{self.id}")
55
+ FHIR::Reference.new(reference: "#{self.class.name.split('::').last}/#{self.id}")
56
56
  end
57
57
 
58
58
  def equals?(other, exclude=[])
@@ -185,32 +185,7 @@ module FHIR
185
185
  if klassname=='Reference'
186
186
  validation = v.validate(contained_here)
187
187
  errors[field] << validation if !validation.empty?
188
- if v.reference && meta['type_profiles']
189
- matches_one_profile = false
190
- meta['type_profiles'].each do |p|
191
- basetype = p.split('/').last
192
- matches_one_profile = true if v.reference.include?(basetype)
193
- # check profiled resources
194
- profile_basetype = FHIR::Definitions.get_basetype(p)
195
- matches_one_profile = true if profile_basetype && v.reference.include?(profile_basetype)
196
- end
197
- matches_one_profile = true if meta['type_profiles'].include?('http://hl7.org/fhir/StructureDefinition/Resource')
198
- if !matches_one_profile && v.reference.start_with?('#')
199
- # we need to look at the local contained resources
200
- begin
201
- r = contained_here.select{|x|x.id==v.reference[1..-1]}.first
202
- rescue
203
- FHIR.logger.warn "Unable to resolve reference #{v.reference}"
204
- end
205
- if !r.nil?
206
- meta['type_profiles'].each do |p|
207
- p = p.split('/').last
208
- matches_one_profile = true if r.resourceType==p
209
- end
210
- end
211
- end
212
- errors[field] << "#{meta['path']}: incorrect Reference type, expected #{meta['type_profiles'].map{|x|x.split('/').last}.join('|')}" if !matches_one_profile
213
- end
188
+ validate_reference_type(v, meta, contained_here, errors[field])
214
189
  else
215
190
  errors[field] << "#{meta['path']}: expected Reference, found #{klassname}"
216
191
  end
@@ -260,6 +235,33 @@ module FHIR
260
235
  errors.delete(field) if errors[field].empty?
261
236
  end
262
237
 
238
+ def validate_reference_type(ref, meta, contained_here, errors)
239
+ if ref.reference && meta['type_profiles']
240
+ matches_one_profile = false
241
+ meta['type_profiles'].each do |p|
242
+ basetype = p.split('/').last
243
+ matches_one_profile = true if ref.reference.include?(basetype)
244
+ # check profiled resources
245
+ profile_basetype = FHIR::Definitions.get_basetype(p)
246
+ matches_one_profile = true if profile_basetype && ref.reference.include?(profile_basetype)
247
+ end
248
+ matches_one_profile = true if meta['type_profiles'].include?('http://hl7.org/fhir/StructureDefinition/Resource')
249
+ if !matches_one_profile && ref.reference.start_with?('#')
250
+ # we need to look at the local contained resources
251
+ r = contained_here.find{|x|x.id==ref.reference[1..-1]}
252
+ if !r.nil?
253
+ meta['type_profiles'].each do |p|
254
+ p = p.split('/').last
255
+ matches_one_profile = true if r.resourceType==p
256
+ end
257
+ else
258
+ FHIR.logger.warn "Unable to resolve reference #{ref.reference}"
259
+ end
260
+ end
261
+ errors << "#{meta['path']}: incorrect Reference type, expected #{meta['type_profiles'].map{|x|x.split('/').last}.join('|')}" if !matches_one_profile
262
+ end
263
+ end
264
+
263
265
  def is_primitive?(datatype, value)
264
266
  # Remaining data types: handle special cases before checking type StructureDefinitions
265
267
  case datatype.downcase
@@ -299,16 +301,16 @@ module FHIR
299
301
  json_or_xml = value.downcase.include?('xml') || value.downcase.include?('json')
300
302
  known_weird = ['application/cql+text'].include?(value)
301
303
  valid = json_or_xml || known_weird || (!matches.nil? && !matches.empty?)
302
- elsif uri=='http://tools.ietf.org/html/bcp47'
303
- hasRegion = (!(value =~ /-/).nil?)
304
- valid = !BCP47::Language.identify(value.downcase).nil? && (!hasRegion || !BCP47::Region.identify(value.upcase).nil?)
304
+ elsif uri=='http://hl7.org/fhir/ValueSet/languages' || uri=='http://tools.ietf.org/html/bcp47'
305
+ has_region = (!(value =~ /-/).nil?)
306
+ valid = !BCP47::Language.identify(value.downcase).nil? && (!has_region || !BCP47::Region.identify(value.upcase).nil?)
305
307
  else
306
308
  FHIR.logger.warn "Unable to check_binding on unknown ValueSet: #{uri}"
307
309
  end
308
310
  valid
309
311
  end
310
312
 
311
- private :is_primitive?, :check_binding, :validate_field
313
+ private :validate_reference_type, :is_primitive?, :check_binding, :validate_field
312
314
 
313
315
  end
314
316
  end
@@ -412,10 +412,10 @@ module FHIR
412
412
  end
413
413
 
414
414
  resource_type = json['resourceType']
415
- baseType = snapshot.element[0].path
415
+ base_type = snapshot.element[0].path
416
416
  snapshot.element.each do |element|
417
417
  path = element.path
418
- path = path[(baseType.size+1)..-1] if path.start_with? baseType
418
+ path = path[(base_type.size+1)..-1] if path.start_with? base_type
419
419
 
420
420
  nodes = get_json_nodes(json, path)
421
421
 
@@ -546,18 +546,18 @@ module FHIR
546
546
  if FHIR::RESOURCES.include?(data_type_code)
547
547
  definition = FHIR::Definitions.get_resource_definition(data_type_code)
548
548
  if !definition.nil?
549
- retVal = false
549
+ ret_val = false
550
550
  begin
551
551
  klass = Module.const_get("FHIR::#{data_type_code}")
552
- retVal = definition.validates_resource?(klass.new(deep_copy(value)))
553
- if !retVal
552
+ ret_val = definition.validates_resource?(klass.new(deep_copy(value)))
553
+ if !ret_val
554
554
  @errors += definition.errors
555
555
  @warnings += definition.warnings
556
556
  end
557
557
  rescue
558
558
  @errors << "Unable to verify #{data_type_code} as a FHIR Resource."
559
559
  end
560
- return retVal
560
+ return ret_val
561
561
  end
562
562
  end
563
563
 
@@ -615,18 +615,18 @@ module FHIR
615
615
  resource_type = value['resourceType']
616
616
  definition = FHIR::Definitions.get_resource_definition(resource_type)
617
617
  if !definition.nil?
618
- retVal = false
618
+ ret_val = false
619
619
  begin
620
620
  klass = Module.const_get("FHIR::#{resource_type}")
621
- retVal = definition.validates_resource?(klass.new(deep_copy(value)))
622
- if !retVal
621
+ ret_val = definition.validates_resource?(klass.new(deep_copy(value)))
622
+ if !ret_val
623
623
  @errors += definition.errors
624
624
  @warnings += definition.warnings
625
625
  end
626
626
  rescue
627
627
  @errors << "Unable to verify #{resource_type} as a FHIR Resource."
628
628
  end
629
- retVal
629
+ ret_val
630
630
  else
631
631
  @errors << "Unable to find base Resource definition: #{resource_type}"
632
632
  false
@@ -638,18 +638,18 @@ module FHIR
638
638
  definition = FHIR::Definitions.get_type_definition(data_type_code)
639
639
  definition = FHIR::Definitions.get_resource_definition(data_type_code) if definition.nil?
640
640
  if !definition.nil?
641
- retVal = false
641
+ ret_val = false
642
642
  begin
643
643
  klass = Module.const_get("FHIR::#{data_type_code}")
644
- retVal = definition.validates_resource?(klass.new(deep_copy(value)))
645
- if !retVal
644
+ ret_val = definition.validates_resource?(klass.new(deep_copy(value)))
645
+ if !ret_val
646
646
  @errors += definition.errors
647
647
  @warnings += definition.warnings
648
648
  end
649
649
  rescue
650
650
  @errors << "Unable to verify #{data_type_code} as a FHIR type."
651
651
  end
652
- retVal
652
+ ret_val
653
653
  else
654
654
  @errors << "Unable to find base type definition: #{data_type_code}"
655
655
  false
@@ -659,26 +659,26 @@ module FHIR
659
659
 
660
660
  def check_binding(element, value)
661
661
 
662
- vsUri = element.binding.valueSetUri || element.binding.valueSetReference.reference
663
- valueset = FHIR::Definitions.get_codes(vsUri)
662
+ vs_uri = element.binding.valueSetUri || element.binding.valueSetReference.reference
663
+ valueset = FHIR::Definitions.get_codes(vs_uri)
664
664
 
665
665
  matching_type = 0
666
666
 
667
- if vsUri=='http://hl7.org/fhir/ValueSet/content-type' || vsUri=='http://www.rfc-editor.org/bcp/bcp13.txt'
667
+ if vs_uri=='http://hl7.org/fhir/ValueSet/content-type' || vs_uri=='http://www.rfc-editor.org/bcp/bcp13.txt'
668
668
  matches = MIME::Types[value]
669
669
  if (matches.nil? || matches.size==0) && !is_some_type_of_xml_or_json(value)
670
670
  @errors << "#{element.path} has invalid mime-type: '#{value}'"
671
671
  matching_type-=1 if element.binding.strength=='required'
672
672
  end
673
- elsif vsUri=='http://tools.ietf.org/html/bcp47'
674
- hasRegion = (!(value =~ /-/).nil?)
675
- valid = !BCP47::Language.identify(value.downcase).nil? && (!hasRegion || !BCP47::Region.identify(value.upcase).nil?)
673
+ elsif vs_uri=='http://hl7.org/fhir/ValueSet/languages' || vs_uri=='http://tools.ietf.org/html/bcp47'
674
+ has_region = (!(value =~ /-/).nil?)
675
+ valid = !BCP47::Language.identify(value.downcase).nil? && (!has_region || !BCP47::Region.identify(value.upcase).nil?)
676
676
  if !valid
677
677
  @errors << "#{element.path} has unrecognized language: '#{value}'"
678
678
  matching_type-=1 if element.binding.strength=='required'
679
679
  end
680
680
  elsif valueset.nil?
681
- @warnings << "#{element.path} has unknown ValueSet: '#{vsUri}'"
681
+ @warnings << "#{element.path} has unknown ValueSet: '#{vs_uri}'"
682
682
  matching_type-=1 if element.binding.strength=='required'
683
683
  elsif !valueset.values.flatten.include?(value)
684
684
  message = "#{element.path} has invalid code '#{value}' from #{valueset}"
@@ -42,25 +42,25 @@ module FHIR
42
42
  from_json(to_json)
43
43
  end
44
44
 
45
- def warning(path, attribute, message, valueA, valueB)
45
+ def warning(path, attribute, message, value_a, value_b)
46
46
  obj = clone
47
47
  obj.status = 'WARNING'
48
48
  obj.path = path
49
49
  obj.attribute = attribute
50
50
  obj.message = message
51
- obj.valueA = valueA
52
- obj.valueB = valueB
51
+ obj.valueA = value_a
52
+ obj.valueB = value_b
53
53
  obj
54
54
  end
55
55
 
56
- def error(path, attribute, message, valueA, valueB)
56
+ def error(path, attribute, message, value_a, value_b)
57
57
  obj = clone
58
58
  obj.status = 'ERROR'
59
59
  obj.path = path
60
60
  obj.attribute = attribute
61
61
  obj.message = message
62
- obj.valueA = valueA
63
- obj.valueB = valueB
62
+ obj.valueA = value_a
63
+ obj.valueB = value_b
64
64
  obj
65
65
  end
66
66
 
@@ -64,6 +64,10 @@ module FluentPath
64
64
  return true
65
65
  end
66
66
 
67
+ def self.clean_index(tree, index)
68
+ tree[index] = nil if !index.nil?
69
+ end
70
+
67
71
  # evaluate a parsed expression given some context data
68
72
  def self.compute(tree, data)
69
73
  tree = tree.tree if tree.is_a?(FluentPath::Expression)
@@ -104,7 +108,7 @@ module FluentPath
104
108
  end
105
109
  if previous_node.is_a?(Hash) || previous_node.is_a?(Array)
106
110
  tree[index] = get(node, previous_node)
107
- tree[previous_index] = nil if !previous_index.nil?
111
+ clean_index(tree, previous_index)
108
112
  elsif !previous_node.is_a?(FluentPath::Expression)
109
113
  tree[index] = get(node, data)
110
114
  end
@@ -131,16 +135,15 @@ module FluentPath
131
135
  convert_to_boolean(sub)
132
136
  end
133
137
  tree[index] = previous_node
134
- tree[previous_index] = nil if !previous_index.nil?
138
+ clean_index(tree, previous_index)
135
139
  elsif previous_node.is_a?(Hash)
136
140
  sub = compute(block, previous_node)
137
141
  if convert_to_boolean(sub)
138
142
  tree[index] = previous_node
139
- tree[previous_index] = nil if !previous_index.nil?
143
+ clean_index(tree, previous_index)
140
144
  else
141
145
  tree[index] = {}
142
- tree[previous_index] = nil if !previous_index.nil?
143
-
146
+ clean_index(tree, previous_index)
144
147
  end
145
148
  else
146
149
  raise "Where function not applicable to #{previous_node.class}: #{previous_node}"
@@ -162,10 +165,10 @@ module FluentPath
162
165
  compute(block.clone, item)
163
166
  end
164
167
  tree[index] = previous_node
165
- tree[previous_index] = nil if !previous_index.nil?
168
+ clean_index(tree, previous_index)
166
169
  elsif previous_node.is_a?(Hash)
167
170
  tree[index] = compute(block, previous_node)
168
- tree[previous_index] = nil if !previous_index.nil?
171
+ clean_index(tree, previous_index)
169
172
  else
170
173
  raise "Select function not applicable to #{previous_node.class}: #{previous_node}"
171
174
  end
@@ -191,7 +194,7 @@ module FluentPath
191
194
  end
192
195
  ext = exts.select{|x|x['url']==url}.first
193
196
  tree[index] = ext
194
- tree[previous_index] = nil if !previous_index.nil?
197
+ clean_index(tree, previous_index)
195
198
  else
196
199
  raise "Extension function not applicable to #{exts.class}: #{exts}"
197
200
  end
@@ -204,7 +207,7 @@ module FluentPath
204
207
  # otherwise, use the context as data
205
208
  if previous_node.is_a?(Hash)
206
209
  tree[index] = previous_node.values
207
- tree[previous_index] = nil if !previous_index.nil?
210
+ clean_index(tree, previous_index)
208
211
  substitutions+=1
209
212
  elsif data.is_a?(Hash)
210
213
  tree[index] = data.values
@@ -217,7 +220,7 @@ module FluentPath
217
220
  # the previous node should be an Array of length > 1
218
221
  if previous_node.is_a?(Array)
219
222
  tree[index] = previous_node.first
220
- tree[previous_index] = nil if !previous_index.nil?
223
+ clean_index(tree, previous_index)
221
224
  else
222
225
  raise "First function is not applicable to #{previous_node.class}: #{previous_node}"
223
226
  end
@@ -225,7 +228,7 @@ module FluentPath
225
228
  # the previous node should be an Array of length > 1
226
229
  if previous_node.is_a?(Array)
227
230
  tree[index] = previous_node.last
228
- tree[previous_index] = nil if !previous_index.nil?
231
+ clean_index(tree, previous_index)
229
232
  else
230
233
  raise "Last function is not applicable to #{previous_node.class}: #{previous_node}"
231
234
  end
@@ -233,7 +236,7 @@ module FluentPath
233
236
  # the previous node should be an Array of length > 1
234
237
  if previous_node.is_a?(Array)
235
238
  tree[index] = previous_node.last(previous_node.length-1)
236
- tree[previous_index] = nil if !previous_index.nil?
239
+ clean_index(tree, previous_index)
237
240
  else
238
241
  raise "Tail function is not applicable to #{previous_node.class}: #{previous_node}"
239
242
  end
@@ -268,28 +271,28 @@ module FluentPath
268
271
  result = true
269
272
  previous_node.each{|item| result = (result && convert_to_boolean(item))}
270
273
  tree[index] = result
271
- tree[previous_index] = nil if !previous_index.nil?
274
+ clean_index(tree, previous_index)
272
275
  else
273
276
  tree[index] = convert_to_boolean(previous_node)
274
- tree[previous_index] = nil if !previous_index.nil?
277
+ clean_index(tree, previous_index)
275
278
  end
276
279
  when :not
277
280
  tree[index] = !convert_to_boolean(previous_node)
278
- tree[previous_index] = nil if !previous_index.nil?
281
+ clean_index(tree, previous_index)
279
282
  when :count
280
283
  tree[index] = 0
281
284
  tree[index] = 1 if !previous_node.nil?
282
285
  tree[index] = previous_node.length if previous_node.is_a?(Array)
283
- tree[previous_index] = nil if !previous_index.nil?
286
+ clean_index(tree, previous_index)
284
287
  when :empty
285
288
  tree[index] = (previous_node==:null || previous_node.empty? rescue previous_node.nil?)
286
- tree[previous_index] = nil if !previous_index.nil?
289
+ clean_index(tree, previous_index)
287
290
  when :exists
288
291
  tree[index] = !previous_node.nil? && previous_node!=:null
289
- tree[previous_index] = nil if !previous_index.nil?
292
+ clean_index(tree, previous_index)
290
293
  when :distinct
291
294
  tree[index] = (previous_node.uniq rescue previous_node)
292
- tree[previous_index] = nil if !previous_index.nil?
295
+ clean_index(tree, previous_index)
293
296
  when :startsWith
294
297
  # the previous node should be a data (as String)
295
298
  # the next node should be a block or subexpression (as FluentPath::Expression)
@@ -303,7 +306,7 @@ module FluentPath
303
306
  FHIR.logger.debug 'Evaling StartsWith Block....'
304
307
  prefix = compute(block, data)
305
308
  tree[index] = previous_node.start_with?(prefix) rescue false
306
- tree[previous_index] = nil if !previous_index.nil?
309
+ clean_index(tree, previous_index)
307
310
  else
308
311
  raise "StartsWith function not applicable to #{previous_node.class}: #{previous_node}"
309
312
  end
@@ -331,7 +334,7 @@ module FluentPath
331
334
  length = previous_node.length - start
332
335
  end
333
336
  tree[index] = previous_node[start..(start+length)]
334
- tree[previous_index] = nil if !previous_index.nil?
337
+ clean_index(tree, previous_index)
335
338
  else
336
339
  raise "Substring function not applicable to #{previous_node.class}: #{previous_node}"
337
340
  end
@@ -349,7 +352,7 @@ module FluentPath
349
352
  FHIR.logger.debug 'Evaling Contains Block....'
350
353
  substring = compute(block, data)
351
354
  tree[index] = previous_node.include?(substring) rescue false
352
- tree[previous_index] = nil if !previous_index.nil?
355
+ clean_index(tree, previous_index)
353
356
  else
354
357
  raise "Contains function not applicable to #{previous_node.class}: #{previous_node}"
355
358
  end
@@ -370,7 +373,7 @@ module FluentPath
370
373
  end
371
374
  if previous_node.is_a?(String) || previous_node==true || previous_node==false || previous_node.is_a?(Numeric)
372
375
  tree[index] = array.include?(previous_node) rescue false
373
- tree[previous_index] = nil if !previous_index.nil?
376
+ clean_index(tree, previous_index)
374
377
  else
375
378
  raise "In function not applicable to #{previous_node.class}: #{previous_node}"
376
379
  end
@@ -385,7 +388,7 @@ module FluentPath
385
388
  tree[index] = 0
386
389
  tree[index] = 1 if convert_to_boolean(previous_node)
387
390
  end
388
- tree[previous_index] = nil if !previous_index.nil?
391
+ clean_index(tree, previous_index)
389
392
  break
390
393
  else
391
394
  raise "Function not implemented: #{node}"
@@ -100,8 +100,8 @@ namespace :fhir do
100
100
  d = FHIR::Definitions
101
101
  defs = d.get_complex_types + d.get_resource_definitions
102
102
  invariants = {}
103
- defs.each do |structureDef|
104
- structureDef['snapshot']['element'].each do |element|
103
+ defs.each do |structure_definition|
104
+ structure_definition['snapshot']['element'].each do |element|
105
105
  if element['constraint']
106
106
  element['constraint'].each do |constraint|
107
107
  if constraint['expression']
@@ -1,5 +1,5 @@
1
1
  module FHIR
2
2
  module Models
3
- VERSION = '1.6.4'.freeze
3
+ VERSION = '1.6.6'.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: 1.6.4
4
+ version: 1.6.6
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: 2016-10-10 00:00:00.000000000 Z
13
+ date: 2016-10-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -1293,8 +1293,8 @@ files:
1293
1293
  - lib/fhir_models/fhir/types/Timing.rb
1294
1294
  - lib/fhir_models/fhir/types/TriggerDefinition.rb
1295
1295
  - lib/fhir_models/fhir/types/UsageContext.rb
1296
- - lib/fhir_models/fhir_ext/StructureDefinition.rb
1297
- - lib/fhir_models/fhir_ext/StructureDefinitionFinding.rb
1296
+ - lib/fhir_models/fhir_ext/structure_definition.rb
1297
+ - lib/fhir_models/fhir_ext/structure_definition_finding.rb
1298
1298
  - lib/fhir_models/fluentpath/evaluate.rb
1299
1299
  - lib/fhir_models/fluentpath/expression.rb
1300
1300
  - lib/fhir_models/fluentpath/parse.rb