From db5b6e5406d8e8604de70c8c0818d441c1577adf Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Fri, 11 Aug 2023 15:31:34 +1000 Subject: [PATCH] Enable DFC importer to import OFN objects --- .../connector/importer.rb | 35 +++++++++++-------- engines/dfc_provider/lib/dfc_provider.rb | 1 + .../connector/connector_spec.rb | 4 +-- .../connector/importer_spec.rb | 10 +++--- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/engines/dfc_provider/lib/data_food_consortium/connector/importer.rb b/engines/dfc_provider/lib/data_food_consortium/connector/importer.rb index e46a021d73..81c6624f11 100644 --- a/engines/dfc_provider/lib/data_food_consortium/connector/importer.rb +++ b/engines/dfc_provider/lib/data_food_consortium/connector/importer.rb @@ -15,21 +15,28 @@ module DataFoodConsortium ].freeze def self.type_map - @type_map ||= TYPES.each_with_object({}) do |clazz, result| - # Methods with variable arguments have a negative arity of -n-1 - # where n is the number of required arguments. - number_of_required_args = -1 * (clazz.instance_method(:initialize).arity + 1) - args = Array.new(number_of_required_args) - type_uri = clazz.new(*args).semanticType - result[type_uri] = clazz - - # Add support for the old DFC v1.7 URLs: - new_type_uri = type_uri.gsub( - "https://github.com/datafoodconsortium/ontology/releases/latest/download/DFC_BusinessOntology.owl#", - "http://static.datafoodconsortium.org/ontologies/DFC_BusinessOntology.owl#" - ) - result[new_type_uri] = clazz + unless @type_map + @type_map = {} + TYPES.each(&method(:register_type)) end + + @type_map + end + + def self.register_type(clazz) + # Methods with variable arguments have a negative arity of -n-1 + # where n is the number of required arguments. + number_of_required_args = -1 * (clazz.instance_method(:initialize).arity + 1) + args = Array.new(number_of_required_args) + type_uri = clazz.new(*args).semanticType + type_map[type_uri] = clazz + + # Add support for the old DFC v1.7 URLs: + new_type_uri = type_uri.gsub( + "https://github.com/datafoodconsortium/ontology/releases/latest/download/DFC_BusinessOntology.owl#", + "http://static.datafoodconsortium.org/ontologies/DFC_BusinessOntology.owl#" + ) + type_map[new_type_uri] = clazz end def import(json_string_or_io) diff --git a/engines/dfc_provider/lib/dfc_provider.rb b/engines/dfc_provider/lib/dfc_provider.rb index d6be00d677..4676736439 100644 --- a/engines/dfc_provider/lib/dfc_provider.rb +++ b/engines/dfc_provider/lib/dfc_provider.rb @@ -10,4 +10,5 @@ require "dfc_provider/engine" require "dfc_provider/supplied_product" module DfcProvider + DataFoodConsortium::Connector::Importer.register_type(SuppliedProduct) end diff --git a/engines/dfc_provider/spec/lib/data_food_consortium/connector/connector_spec.rb b/engines/dfc_provider/spec/lib/data_food_consortium/connector/connector_spec.rb index 48d7cbd3e6..f0bda34bf9 100644 --- a/engines/dfc_provider/spec/lib/data_food_consortium/connector/connector_spec.rb +++ b/engines/dfc_provider/spec/lib/data_food_consortium/connector/connector_spec.rb @@ -21,7 +21,7 @@ describe DataFoodConsortium::Connector::Connector, vcr: true do it "imports" do json = connector.export(product) result = connector.import(json) - expect(result.class).to eq product.class + expect(result).to be_a product.class expect(result.semanticType).to eq product.semanticType expect(result.semanticId).to eq "https://example.net/tomato" expect(result.name).to eq "Tomato" @@ -32,7 +32,7 @@ describe DataFoodConsortium::Connector::Connector, vcr: true do io = StringIO.new(json) result = connector.import(io) - expect(result.class).to eq product.class + expect(result).to be_a product.class expect(result.semanticType).to eq product.semanticType expect(result.semanticId).to eq "https://example.net/tomato" expect(result.name).to eq "Tomato" diff --git a/engines/dfc_provider/spec/lib/data_food_consortium/connector/importer_spec.rb b/engines/dfc_provider/spec/lib/data_food_consortium/connector/importer_spec.rb index e64dce16a7..04e9407ce6 100644 --- a/engines/dfc_provider/spec/lib/data_food_consortium/connector/importer_spec.rb +++ b/engines/dfc_provider/spec/lib/data_food_consortium/connector/importer_spec.rb @@ -100,7 +100,7 @@ describe DataFoodConsortium::Connector::Importer do it "imports a single object with simple properties" do result = import(product) - expect(result.class).to eq product.class + expect(result).to be_a product.class expect(result.semanticType).to eq product.semanticType expect(result.semanticId).to eq "https://example.net/tomato" expect(result.name).to eq "Tomato" @@ -111,7 +111,7 @@ describe DataFoodConsortium::Connector::Importer do it "imports an object with referenced context" do result = connector.import(product_data) - expect(result.class).to eq DataFoodConsortium::Connector::SuppliedProduct + expect(result).to be_a DataFoodConsortium::Connector::SuppliedProduct expect(result.semanticType).to eq "https://github.com/datafoodconsortium/ontology/releases/latest/download/DFC_BusinessOntology.owl#SuppliedProduct" expect(result.semanticId).to eq "https://example.net/tomato" expect(result.name).to eq "Tomato" @@ -122,7 +122,7 @@ describe DataFoodConsortium::Connector::Importer do it "imports an object with included context" do result = connector.import(product_data_with_context) - expect(result.class).to eq DataFoodConsortium::Connector::SuppliedProduct + expect(result).to be_a DataFoodConsortium::Connector::SuppliedProduct expect(result.semanticType).to eq "https://github.com/datafoodconsortium/ontology/releases/latest/download/DFC_BusinessOntology.owl#SuppliedProduct" expect(result.semanticId).to eq "https://example.net/tomato" expect(result.name).to eq "Tomato" @@ -133,7 +133,7 @@ describe DataFoodConsortium::Connector::Importer do it "imports an object with DFC v1.8 context" do result = connector.import(product_data_with_context_v1_8) - expect(result.class).to eq DataFoodConsortium::Connector::SuppliedProduct + expect(result).to be_a DataFoodConsortium::Connector::SuppliedProduct expect(result.semanticType).to eq "https://github.com/datafoodconsortium/ontology/releases/latest/download/DFC_BusinessOntology.owl#SuppliedProduct" expect(result.semanticId).to eq "https://example.net/tomato" expect(result.name).to eq "Tomato" @@ -149,7 +149,7 @@ describe DataFoodConsortium::Connector::Importer do item, tomato = result - expect(item.class).to eq catalog_item.class + expect(item).to be_a catalog_item.class expect(item.semanticType).to eq catalog_item.semanticType expect(item.semanticId).to eq "https://example.net/tomatoItem" expect(tomato.name).to eq "Tomato"