diff --git a/lib/data_food_consortium/connector/importer.rb b/lib/data_food_consortium/connector/importer.rb index 3a89486104..1ac146873a 100644 --- a/lib/data_food_consortium/connector/importer.rb +++ b/lib/data_food_consortium/connector/importer.rb @@ -75,13 +75,11 @@ module DataFoodConsortium property = subject.__send__(:findSemanticProperty, property_id) - # Some properties have a one-to-one match to the method name. - setter_name = "#{statement.predicate.fragment}=" - if property.value.is_a?(Enumerable) property.value << value - elsif subject.respond_to?(setter_name) - subject.public_send(setter_name, value) + else + setter = guess_setter_name(statement.predicate) + subject.try(setter, value) if setter end end @@ -92,6 +90,16 @@ module DataFoodConsortium def resolve_object(object) @subjects[object] || object.object end + + def guess_setter_name(predicate) + fragment = predicate.fragment + + # Some predicates are named like `hasQuantity` + # but the attribute name would be `quantity`. + name = fragment.sub(/^has/, "").camelize(:lower) + + "#{name}=" + end end end end diff --git a/spec/lib/data_food_consortium/connector/importer_spec.rb b/spec/lib/data_food_consortium/connector/importer_spec.rb index bccc0984ad..b04a3237fb 100644 --- a/spec/lib/data_food_consortium/connector/importer_spec.rb +++ b/spec/lib/data_food_consortium/connector/importer_spec.rb @@ -77,7 +77,9 @@ describe DataFoodConsortium::Connector::Importer, vcr: true do tomato, items = import(product) expect(tomato.name).to eq "Tomato" + expect(tomato.quantity).to eq items expect(items.value).to eq 5 + expect(items.unit[:fragment]).to eq "Piece" # Pending matching concepts: #expect(items.unit).to eq piece