mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-01 02:03:22 +00:00
Add product quantity to DFC export
This commit is contained in:
@@ -22,7 +22,8 @@ class DfcBuilder
|
||||
)
|
||||
|
||||
DataFoodConsortium::Connector::SuppliedProduct.new(
|
||||
id, name: variant.name, description: variant.description
|
||||
id, name: variant.name, description: variant.description,
|
||||
quantity: QuantitativeValueBuilder.quantity(variant),
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# Describes the quantity contained in a product, for example:
|
||||
#
|
||||
# - 1 piece of apple, usually meaning the whole fruit
|
||||
# - 2 litres of milk, for example in a big bottle or pouch
|
||||
# - 750 grams of bread, for example a loaf
|
||||
#
|
||||
# The DFC also supports specific units like loafs and cans but we don't have
|
||||
# standardised data within OFN to map to these types.
|
||||
class QuantitativeValueBuilder < DfcBuilder
|
||||
def self.quantity(variant)
|
||||
DataFoodConsortium::Connector::QuantitativeValue.new(
|
||||
unit: unit(variant),
|
||||
value: variant.unit_value,
|
||||
)
|
||||
end
|
||||
|
||||
def self.unit(variant)
|
||||
case variant.product.variant_unit
|
||||
when "volume"
|
||||
DfcLoader.connector.MEASURES.UNIT.QUANTITYUNIT.LITRE
|
||||
when "weight"
|
||||
DfcLoader.connector.MEASURES.UNIT.QUANTITYUNIT.GRAM
|
||||
else
|
||||
DfcLoader.connector.MEASURES.UNIT.QUANTITYUNIT.PIECE
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,46 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require DfcProvider::Engine.root.join("spec/spec_helper")
|
||||
|
||||
describe QuantitativeValueBuilder do
|
||||
subject(:builder) { described_class }
|
||||
let(:variant) { build(:variant, product: product) }
|
||||
let(:product) { build(:product, name: "Apple") }
|
||||
|
||||
describe ".quantity" do
|
||||
it "recognises items" do
|
||||
product.variant_unit = "item"
|
||||
variant.unit_value = 1
|
||||
quantity = builder.quantity(variant)
|
||||
|
||||
expect(quantity.value).to eq 1.0
|
||||
expect(quantity.unit.semanticId).to eq "dfc-m:Piece"
|
||||
end
|
||||
|
||||
it "recognises volume" do
|
||||
product.variant_unit = "volume"
|
||||
variant.unit_value = 2
|
||||
quantity = builder.quantity(variant)
|
||||
|
||||
expect(quantity.value).to eq 2.0
|
||||
expect(quantity.unit.semanticId).to eq "dfc-m:Litre"
|
||||
end
|
||||
|
||||
it "recognises weight" do
|
||||
product.variant_unit = "weight"
|
||||
variant.unit_value = 1000 # 1kg
|
||||
quantity = builder.quantity(variant)
|
||||
|
||||
expect(quantity.value).to eq 1000.0
|
||||
expect(quantity.unit.semanticId).to eq "dfc-m:Gram"
|
||||
end
|
||||
|
||||
it "falls back to items" do
|
||||
product.variant_unit = nil
|
||||
quantity = builder.quantity(variant)
|
||||
|
||||
expect(quantity.value).to eq 1.0
|
||||
expect(quantity.unit.semanticId).to eq "dfc-m:Piece"
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,26 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require DfcProvider::Engine.root.join("spec/spec_helper")
|
||||
|
||||
describe DfcBuilder do
|
||||
let(:variant) {
|
||||
build(:variant, id: 5).tap { |v| v.product.supplier_id = 7 }
|
||||
}
|
||||
|
||||
describe ".supplied_product" do
|
||||
it "assigns a semantic id" do
|
||||
product = DfcBuilder.supplied_product(variant)
|
||||
|
||||
expect(product.semanticId).to eq(
|
||||
"http://test.host/api/dfc-v1.6/enterprises/7/supplied_products/5"
|
||||
)
|
||||
end
|
||||
|
||||
it "assigns a quantity" do
|
||||
product = DfcBuilder.supplied_product(variant)
|
||||
|
||||
expect(product.quantity.value).to eq 1.0
|
||||
expect(product.quantity.unit.semanticId).to eq "dfc-m:Gram"
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user