There's a lot of open issues
A library to easily integrate the DFC standard within your application.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

 Project Readme

Data Food Consortium Ruby connector

The Data Food Consortium connector is a tool to help you to integrate the DFC standard within you application. Each concept of the DFC ontology can be manipulated with the help of the corresponding class supplied by the connector.

This connector will also help you to generate the JSON-LD required by the other DFC compliant platforms to exchange data.

The Data Food Consortium project (DFC) which aims to provide interoperability between food supply chain platforms. We use the Semantizer library inside our connector library to help developers to exchange JSON-LD data expressed with the DFC ontology.

Get started

You can install the connector with the following command: gem install datafoodconsortium-connector.

Then in you Ruby file, import the newly installed connector:

require 'datafoodconsortium/connector'

The connector is a singleton. To get it, access the instance member of the class:

connector = DataFoodConsortium::Connector::Connector.instance

You can then load our different SKOS vocabularies providing the corresponding JSON-LD files:

connector.loadMeasures(JSON.parse(File.read("/path/to/measures.json")))
connector.loadFacets(JSON.parse(File.read("/path/to/facets.json")))
connector.loadProductTypes(JSON.parse(File.read("/path/to/productTypes.json")))

Then you can create product like:

tomato = DataFoodConsortium::Connector::SuppliedProduct.new(
  "https://myplatform.com/tomato",
  name: "Tomato", 
  description: "Awesome tomato"
)

Remark: The first argument is the semantic id (URI) of the object. Be sure to provide one except for anonymous objects like Price, QuantitativeValue, NutrientCharacteristic, PhysicalCharacteristic and AllergenCharacteristic.

You can set the different properties for the object, like adding a certification. The connector provide helpers to get the certification from the previously loaded vocabularies:

tomato.addCertification(connector.FACETS.CERTIFICATION.BIODYNAMICLABEL.DEMETER)

Remark: To get a list of possible values you can browse our VocBench (you must register and ask an admin for permission). To ease this process we have planned to publish another tool which does not require registration (ShowVoc). Alternatively we would generate a documentation listing the different taxons.

To finish you can export the DFC object to JSON-LD with:

puts connector.export(tomato)

Note that you can export mutiple objects passing them to the method: connector.export(object1, object2, ...).

This will output DFC compliant valid JSON-LD:

{
  "@context": "http://static.datafoodconsortium.org/ontologies/context.json",
  "@id": "https://myplatform.com/tomato",
  "@type": "dfc-b:SuppliedProduct",
  "dfc-b:name": "Tomato",
  "dfc-b:description": "Awesome tomato",
  "dfc-b:alcoholPercentage": 0.0,
  "dfc-b:lifetime": "",
  "dfc-b:usageOrStorageCondition": "",
  "dfc-b:hasCertification": "dfc-f:Demeter",
  "dfc-b:totalTheoreticalStock": 0.0
}

Important: Please note that the exporter does not dereference the objects. If you want to include them in the output, just pass these objects to the export method:

puts connector.export(catalogItem, tomato)

This will append the added object into the @graph:

{
  "@context": "http://static.datafoodconsortium.org/ontologies/context.json",
  "@graph": [
    {
      "@type": "dfc-b:CatalogItem",
      "dfc-b:references": "https://myplatform.com/tomato",
      "@id": "https://myplatform.com/catalogItem"
    },
    {
      "@id": "https://myplatform.com/tomato",
      "@type": "dfc-b:SuppliedProduct",
      "dfc-b:name": "Tomato",
      "dfc-b:description": "Awesome tomato",
      "dfc-b:alcoholPercentage": 0.0,
      "dfc-b:lifetime": "",
      "dfc-b:usageOrStorageCondition": "",
      "dfc-b:hasCertification": "dfc-f:Demeter",
      "dfc-b:totalTheoreticalStock": 0.0
    }
  ]
}

Complete example

This example demonstrates how to export a producer's data in JSON-LD like required by the DFC 1.7.1 practical example.

# Customer category defined by the Enterprise.
customerCategory = DataFoodConsortium::Connector::CustomerCategory.new(
    "https://myplatform.com/cc",
    description: "description"
)

# SuppliedProduct suppled by the Enterprise.
suppliedProduct = DataFoodConsortium::Connector::SuppliedProduct.new(
    "https://myplatform.com/sp", 
    name: "name", 
    description: "description", 
    productType: connector.PRODUCT_TYPES.VEGETABLE.ARTICHOKE,
    quantity: DataFoodConsortium::Connector::QuantitativeValue.new(
        unit: connector.MEASURES.KILOGRAM,
        value: 1.2
    ),
    totalTheoreticalStock: 123,
    alcoholPercentage: 2.6,
    lifetime: "lifetime",
    usageOrStorageConditions: "usageOrStorageConditions",
    certifications: [connector.FACETS.CERTIFICATION.BIODYNAMICLABEL.DEMETER],
    claims: [
      connector.FACETS.CLAIM.NUTRITIONALCLAIM.ENERGYFREE,
      connector.FACETS.CLAIM.NUTRITIONALCLAIM.FATFREE,
      connector.FACETS.CLAIM.NUTRITIONALCLAIM.HIGHFIBRE
    ],
    allergenCharacteristics: [
      
    ], 
    nutrientCharacteristics: [
      DataFoodConsortium::Connector::NutrientCharacteristic.new(
        nutrientDimension: connector.MEASURES.CALCIUM,
        unit: connector.MEASURES.GRAM,
        value: 8.47
      )
    ], 
    physicalCharacteristics: [
      DataFoodConsortium::Connector::PhysicalCharacteristic.new(
        physicalDimension: connector.MEASURES.WEIGHT,
        unit: connector.MEASURES.KILOGRAM,
        value: 3.25
      )
    ],
    geographicalOrigin: connector.FACETS.TERRITORIALORIGIN.EUROPE.FRANCE.NORMANDY,
    natureOrigin: connector.FACETS.NATUREORIGIN.PLANTORIGIN,
    partOrigin: connector.FACETS.NATUREORIGIN.PLANTORIGIN
)

# The Offer sell a CatalogItem for a price to a CustomerCategory.
offer = DataFoodConsortium::Connector::Offer.new(
    "https://myplatform.com/o",
    price: DataFoodConsortium::Connector::Price.new(
        value: 12.78,
        vatRate: 5.22,
        unit: connector.MEASURES.EURO
    ),
    stockLimitation: 52,  
    offeredTo: customerCategory
)

# The CatalogItem holds the stock limitation and allows the product to be sold through an Offer.
catalogItem = DataFoodConsortium::Connector::CatalogItem.new(
    "https://myplatform.com/ci",
    product: suppliedProduct, 
    sku: "sku", 
    stockLimitation: 10, 
    offers: [offer]
)

# The Enterprise that the producer is affiliated to.
enterprise = DataFoodConsortium::Connector::Enterprise.new(
    "https://myplatform.com/e",
    name: "name", 
    description: "description", 
    vatNumber: "vatNumber", 
    customerCategories: [customerCategory], 
    suppliedProducts: [suppliedProduct], 
    catalogItems: [catalogItem], 
)

# Address of the producer.
address = DataFoodConsortium::Connector::Address.new(
    "https://myplatform.com/a",
    street: "street", 
    postalCode: "postalCode", 
    city: "city", 
    country: "country"
)

# The producer itself.
person = DataFoodConsortium::Connector::Person.new(
    "https://myplatform.com/p",
    firstName: "firstName", 
    lastName: "lastName", 
    affiliatedOrganizations: [enterprise], 
    localizations: [address]
)

To export all of these information into JSON-LD, use:

connector.export(
  person, 
  address, 
  enterprise, 
  customerCategory, 
  suppliedProduct, 
  catalogItem, 
  offer
)

Documentation

A basic documentation could be generated with Yard.

You could install it with gem install yard.

To produce the documentation just type yard doc. Then open the index.html file in the /doc folder.

Tests

Some unit tests are in the /spec folder.

To run them, just type rspec.

Contributing

Contributions are welcome.

The Pull Requests should be made on our source code generator repository as the code hosted on this repository is generated.