Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions lib/fhir_models/bootstrap/hashable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,31 +27,35 @@ def prune(thing)
blank = ->(obj) { obj.respond_to?(:empty?) ? obj.empty? : obj.nil? }
if thing.is_a?(Array)
return nil if thing.empty?
thing.map! { |i| prune(i) }
thing.reject!(&blank)

thing
.map { |i| prune(i) }
.reject(&blank)
elsif thing.is_a?(Hash)
return {} if thing.empty?

new_thing = {}
thing.each do |key, value|
thing[key] = prune(value)
end
thing.delete_if do |_key, value|
blank.call(value)
new_thing[key] = prune(value) unless blank.call(value)
end
new_thing
else
thing
end
thing
end

def from_hash(hash)
def from_hash(original_hash)
# eliminate empty stuff
hash = prune(hash) unless hash.empty?
pruned_hash = prune(original_hash) unless original_hash.empty?
# clear the existing variables
self.class::METADATA.each do |key, value|
local_name = key
local_name = value['local_name'] if value['local_name']
instance_variable_set("@#{local_name}", nil)
end
# set the variables to the hash values
hash.each do |key, value|
pruned_hash&.each_key do |key|
value = original_hash[key]
key = key.to_s
meta = self.class::METADATA[key]
next if meta.nil?
Expand Down
28 changes: 22 additions & 6 deletions test/unit/hashable_test.rb
Original file line number Diff line number Diff line change
@@ -1,10 +1,26 @@
require_relative '../test_helper'

class HashableTest < Test::Unit::TestCase
def test_to_hash
patient = FHIR::Patient.new
patient_hash = patient.to_hash
assert patient_hash.is_a?(Hash)
end

def test_to_hash
patient = FHIR::Patient.new
patient_hash = patient.to_hash
assert patient_hash.is_a?(Hash)
end
def test_prune_does_not_modify_hash
original_hash = {
a: nil,
b: [],
c: {},
d: [[]],
e: { a: nil, b: { c: [] }, d: [] }
}

original_hash_string = JSON.generate(original_hash)
resource = FHIR::Patient.new

end
resource.send(:prune, original_hash)

assert JSON.generate(original_hash) == original_hash_string
end
end