Enable DFC importer to import OFN objects

This commit is contained in:
Maikel Linke
2023-08-11 15:31:34 +10:00
parent fcf7b94278
commit db5b6e5406
4 changed files with 29 additions and 21 deletions

View File

@@ -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)

View File

@@ -10,4 +10,5 @@ require "dfc_provider/engine"
require "dfc_provider/supplied_product"
module DfcProvider
DataFoodConsortium::Connector::Importer.register_type(SuppliedProduct)
end

View File

@@ -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"

View File

@@ -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"