openfoodfacts 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +28 -2
- data/lib/openfoodfacts.rb +17 -0
- data/lib/openfoodfacts/additive.rb +51 -0
- data/lib/openfoodfacts/allergen.rb +33 -0
- data/lib/openfoodfacts/brand.rb +33 -0
- data/lib/openfoodfacts/category.rb +33 -0
- data/lib/openfoodfacts/city.rb +33 -0
- data/lib/openfoodfacts/contributor.rb +33 -0
- data/lib/openfoodfacts/country.rb +33 -0
- data/lib/openfoodfacts/faq.rb +50 -0
- data/lib/openfoodfacts/ingredient_that_may_be_from_palm_oil.rb +33 -0
- data/lib/openfoodfacts/label.rb +33 -0
- data/lib/openfoodfacts/manufacturing_place.rb +33 -0
- data/lib/openfoodfacts/origin.rb +33 -0
- data/lib/openfoodfacts/packager_code.rb +33 -0
- data/lib/openfoodfacts/packaging.rb +33 -0
- data/lib/openfoodfacts/press.rb +56 -0
- data/lib/openfoodfacts/product.rb +63 -1
- data/lib/openfoodfacts/product_state.rb +12 -28
- data/lib/openfoodfacts/purchase_place.rb +33 -0
- data/lib/openfoodfacts/store.rb +33 -0
- data/lib/openfoodfacts/trace.rb +33 -0
- data/lib/openfoodfacts/version.rb +1 -1
- data/test/fixtures/additives.yml +1767 -0
- data/test/fixtures/additives_locale.yml +1767 -0
- data/test/fixtures/brands.yml +24231 -0
- data/test/fixtures/brands_locale.yml +13592 -0
- data/test/fixtures/faq.yml +1025 -0
- data/test/fixtures/press.yml +2459 -0
- data/test/fixtures/product_states_locale.yml +948 -0
- data/test/fixtures/products_for_brand.yml +4171 -0
- data/test/fixtures/products_with_additive.yml +1834 -0
- data/test/test_openfoodfacts.rb +78 -0
- metadata +29 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd868f38cbc5e9fd890a62c71a25f0676e665be1
|
4
|
+
data.tar.gz: 0c4ff491f6376b0cd0336894925ee6abc05f6ac6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1791ac7c859f1e4c09150a726f32d79c74425da186f599dea4acc9daa6e4641b0455a5192554a7db417bb869a81374dce9bd4ee998be5020b0b58849bad0174
|
7
|
+
data.tar.gz: 72adbba81b6941d695b866dfdeef6f9dd8fb7a0facefc6b84c6b99f9f2fd91d314fec9cf2437d41b0b839e0dc0a86eb8b7fb9ea6a5e4fda5dbc3b394cc1194fe
|
data/README.md
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/openfoodfacts.svg)](http://badge.fury.io/rb/openfoodfacts)
|
4
4
|
[![Build Status](https://travis-ci.org/openfoodfacts/openfoodfacts-ruby.svg?branch=master)](https://travis-ci.org/openfoodfacts/openfoodfacts-ruby.svg?branch=master)
|
5
|
-
[![Dependency Status](https://gemnasium.com/
|
6
|
-
[![Code Climate](https://codeclimate.com/github/
|
5
|
+
[![Dependency Status](https://gemnasium.com/openfoodfacts/openfoodfacts-ruby.svg)](https://gemnasium.com/openfoodfacts/openfoodfacts-ruby)
|
6
|
+
[![Code Climate](https://codeclimate.com/github/openfoodfacts/openfoodfacts-ruby/badges/gpa.svg)](https://codeclimate.com/github/openfoodfacts/openfoodfacts-ruby)
|
7
7
|
[![Coverage Status](https://coveralls.io/repos/nicolasleger/openfoodfacts-ruby/badge.svg)](https://coveralls.io/r/nicolasleger/openfoodfacts-ruby)
|
8
8
|
|
9
9
|
API Wrapper for [OpenFoodFacts](https://openfoodfacts.org/), the open database about food.
|
@@ -24,6 +24,32 @@ Or install it yourself as:
|
|
24
24
|
|
25
25
|
$ gem install openfoodfacts
|
26
26
|
|
27
|
+
## Models
|
28
|
+
|
29
|
+
All data is available for World, French, UK and US version for now. You should update the gem page URLs mapping for others.
|
30
|
+
|
31
|
+
- Additive
|
32
|
+
- Brand
|
33
|
+
- Category
|
34
|
+
- City
|
35
|
+
- Contributor
|
36
|
+
- Country
|
37
|
+
- Faq
|
38
|
+
- IngredientThatMayBeFromPalmOil
|
39
|
+
- Label
|
40
|
+
- Locale
|
41
|
+
- ManufacturingPlace
|
42
|
+
- Origin
|
43
|
+
- PackagerCode
|
44
|
+
- Packaging
|
45
|
+
- Press
|
46
|
+
- Product
|
47
|
+
- ProductState
|
48
|
+
- PurchasePlace
|
49
|
+
- Store
|
50
|
+
- Trace
|
51
|
+
- User
|
52
|
+
|
27
53
|
## Usage
|
28
54
|
|
29
55
|
```ruby
|
data/lib/openfoodfacts.rb
CHANGED
@@ -1,6 +1,23 @@
|
|
1
|
+
require_relative 'openfoodfacts/additive'
|
2
|
+
require_relative 'openfoodfacts/brand'
|
3
|
+
require_relative 'openfoodfacts/category'
|
4
|
+
require_relative 'openfoodfacts/city'
|
5
|
+
require_relative 'openfoodfacts/contributor'
|
6
|
+
require_relative 'openfoodfacts/country'
|
7
|
+
require_relative 'openfoodfacts/faq'
|
8
|
+
require_relative 'openfoodfacts/ingredient_that_may_be_from_palm_oil'
|
9
|
+
require_relative 'openfoodfacts/label'
|
1
10
|
require_relative 'openfoodfacts/locale'
|
11
|
+
require_relative 'openfoodfacts/manufacturing_place'
|
12
|
+
require_relative 'openfoodfacts/origin'
|
13
|
+
require_relative 'openfoodfacts/packager_code'
|
14
|
+
require_relative 'openfoodfacts/packaging'
|
15
|
+
require_relative 'openfoodfacts/press'
|
2
16
|
require_relative 'openfoodfacts/product'
|
3
17
|
require_relative 'openfoodfacts/product_state'
|
18
|
+
require_relative 'openfoodfacts/purchase_place'
|
19
|
+
require_relative 'openfoodfacts/store'
|
20
|
+
require_relative 'openfoodfacts/trace'
|
4
21
|
require_relative 'openfoodfacts/user'
|
5
22
|
require_relative 'openfoodfacts/version'
|
6
23
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module Openfoodfacts
|
4
|
+
class Additive < Hashie::Mash
|
5
|
+
|
6
|
+
# TODO: Add more locales
|
7
|
+
LOCALE_PATHS = {
|
8
|
+
'fr' => 'additifs',
|
9
|
+
'uk' => 'additives',
|
10
|
+
'us' => 'additives',
|
11
|
+
'world' => 'additives'
|
12
|
+
}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# Get additives
|
17
|
+
#
|
18
|
+
def all(locale: Openfoodfacts::DEFAULT_LOCALE)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
page_url = "http://#{locale}.openfoodfacts.org/#{path}"
|
21
|
+
|
22
|
+
Product.tags_from_page(self, page_url) do |tag|
|
23
|
+
columns = tag.css('td')
|
24
|
+
|
25
|
+
link = tag.css('a').first
|
26
|
+
attributes = {
|
27
|
+
"name" => link.text.strip,
|
28
|
+
"url" => URI.join(page_url, link.attr('href')).to_s,
|
29
|
+
"products_count" => columns[1].text.to_i,
|
30
|
+
}
|
31
|
+
|
32
|
+
riskiness = columns[2].attr('class')
|
33
|
+
if riskiness
|
34
|
+
attributes["riskiness"] = riskiness[/level_(\d+)/, 1].to_i
|
35
|
+
end
|
36
|
+
|
37
|
+
new(attributes)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
# Get products with additive
|
45
|
+
#
|
46
|
+
def products(page: -1)
|
47
|
+
Product.from_website_page(url, page: page, products_count: products_count) if url
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module Openfoodfacts
|
4
|
+
class Allergen < Hashie::Mash
|
5
|
+
|
6
|
+
# TODO: Add more locales
|
7
|
+
LOCALE_PATHS = {
|
8
|
+
'fr' => 'allergenes',
|
9
|
+
'uk' => 'allergens',
|
10
|
+
'us' => 'allergens',
|
11
|
+
'world' => 'allergens'
|
12
|
+
}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# Get allergens
|
17
|
+
#
|
18
|
+
def all(locale: Openfoodfacts::DEFAULT_LOCALE)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.openfoodfacts.org/#{path}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get products with allergen
|
27
|
+
#
|
28
|
+
def products(page: -1)
|
29
|
+
Product.from_website_page(url, page: page, products_count: products_count) if url
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module Openfoodfacts
|
4
|
+
class Brand < Hashie::Mash
|
5
|
+
|
6
|
+
# TODO: Add more locales
|
7
|
+
LOCALE_PATHS = {
|
8
|
+
'fr' => 'marques',
|
9
|
+
'uk' => 'brands',
|
10
|
+
'us' => 'brands',
|
11
|
+
'world' => 'brands'
|
12
|
+
}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# Get product brands
|
17
|
+
#
|
18
|
+
def all(locale: Openfoodfacts::DEFAULT_LOCALE)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.openfoodfacts.org/#{path}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get products with brand
|
27
|
+
#
|
28
|
+
def products(page: -1)
|
29
|
+
Product.from_website_page(url, page: page, products_count: products_count) if url
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module Openfoodfacts
|
4
|
+
class Category < Hashie::Mash
|
5
|
+
|
6
|
+
# TODO: Add more locales
|
7
|
+
LOCALE_PATHS = {
|
8
|
+
'fr' => 'categories',
|
9
|
+
'uk' => 'categories',
|
10
|
+
'us' => 'categories',
|
11
|
+
'world' => 'categories'
|
12
|
+
}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# Get categories
|
17
|
+
#
|
18
|
+
def all(locale: Openfoodfacts::DEFAULT_LOCALE)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.openfoodfacts.org/#{path}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get products with category
|
27
|
+
#
|
28
|
+
def products(page: -1)
|
29
|
+
Product.from_website_page(url, page: page, products_count: products_count) if url
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module Openfoodfacts
|
4
|
+
class City < Hashie::Mash
|
5
|
+
|
6
|
+
# TODO: Add more locales
|
7
|
+
LOCALE_PATHS = {
|
8
|
+
'fr' => 'communes',
|
9
|
+
'uk' => 'cities',
|
10
|
+
'us' => 'cities',
|
11
|
+
'world' => 'cities'
|
12
|
+
}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# Get cities
|
17
|
+
#
|
18
|
+
def all(locale: Openfoodfacts::DEFAULT_LOCALE)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.openfoodfacts.org/#{path}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get products with city
|
27
|
+
#
|
28
|
+
def products(page: -1)
|
29
|
+
Product.from_website_page(url, page: page, products_count: products_count) if url
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module Openfoodfacts
|
4
|
+
class Contributor < Hashie::Mash
|
5
|
+
|
6
|
+
# TODO: Add more locales
|
7
|
+
LOCALE_PATHS = {
|
8
|
+
'fr' => 'contributeurs',
|
9
|
+
'uk' => 'contributors',
|
10
|
+
'us' => 'contributors',
|
11
|
+
'world' => 'contributors'
|
12
|
+
}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# Get contributors
|
17
|
+
#
|
18
|
+
def all(locale: Openfoodfacts::DEFAULT_LOCALE)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.openfoodfacts.org/#{path}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get products for contributor
|
27
|
+
#
|
28
|
+
def products(page: -1)
|
29
|
+
Product.from_website_page(url, page: page, products_count: products_count) if url
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module Openfoodfacts
|
4
|
+
class Country < Hashie::Mash
|
5
|
+
|
6
|
+
# TODO: Add more locales
|
7
|
+
LOCALE_PATHS = {
|
8
|
+
'fr' => 'pays',
|
9
|
+
'uk' => 'countries',
|
10
|
+
'us' => 'countries',
|
11
|
+
'world' => 'countries'
|
12
|
+
}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# Get countries
|
17
|
+
#
|
18
|
+
def all(locale: Openfoodfacts::DEFAULT_LOCALE)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.openfoodfacts.org/#{path}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get products with country
|
27
|
+
#
|
28
|
+
def products(page: -1)
|
29
|
+
Product.from_website_page(url, page: page, products_count: products_count) if url
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
require 'nokogiri'
|
3
|
+
require 'open-uri'
|
4
|
+
|
5
|
+
module Openfoodfacts
|
6
|
+
class Faq < Hashie::Mash
|
7
|
+
|
8
|
+
# TODO: Add more locales
|
9
|
+
LOCALE_PATHS = {
|
10
|
+
'fr' => 'questions-frequentes',
|
11
|
+
'uk' => 'faq',
|
12
|
+
'us' => 'faq',
|
13
|
+
'world' => 'faq'
|
14
|
+
}
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def items(locale: Openfoodfacts::DEFAULT_LOCALE)
|
18
|
+
if path = LOCALE_PATHS[locale]
|
19
|
+
html = open("http://#{locale}.openfoodfacts.org/#{path}").read
|
20
|
+
dom = Nokogiri::HTML.fragment(html)
|
21
|
+
|
22
|
+
titles = dom.css('#main_column h2')
|
23
|
+
titles.each_with_index.map do |item, index|
|
24
|
+
paragraphs = []
|
25
|
+
|
26
|
+
element = item.next_sibling
|
27
|
+
while !element.nil? && element.node_name != 'h2'
|
28
|
+
if element.node_name == 'p'
|
29
|
+
paragraphs.push(element)
|
30
|
+
end
|
31
|
+
|
32
|
+
element = element.next_sibling
|
33
|
+
end
|
34
|
+
|
35
|
+
if index == titles.length - 1
|
36
|
+
paragraphs = paragraphs[0..-3]
|
37
|
+
end
|
38
|
+
|
39
|
+
new({
|
40
|
+
"question" => item.text.strip,
|
41
|
+
"answer" => paragraphs.map { |paragraph| paragraph.text.strip.gsub(/\r?\n/, ' ') }.join("\n\n"),
|
42
|
+
"answer_html" => paragraphs.map(&:to_html).join
|
43
|
+
})
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module Openfoodfacts
|
4
|
+
class IngredientThatMayBeFromPalmOil < Hashie::Mash
|
5
|
+
|
6
|
+
# TODO: Add more locales
|
7
|
+
LOCALE_PATHS = {
|
8
|
+
'fr' => 'ingredients-pouvant-etre-issus-de-l-huile-de-palme',
|
9
|
+
'uk' => 'ingredients-that-may-be-from-palm-oil',
|
10
|
+
'us' => 'ingredients-that-may-be-from-palm-oil',
|
11
|
+
'world' => 'ingredients-that-may-be-from-palm-oil'
|
12
|
+
}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# Get ingredients that may be from palm oil
|
17
|
+
#
|
18
|
+
def all(locale: Openfoodfacts::DEFAULT_LOCALE)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.openfoodfacts.org/#{path}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get products with ingredient that may be from palm oil
|
27
|
+
#
|
28
|
+
def products(page: -1)
|
29
|
+
Product.from_website_page(url, page: page, products_count: products_count) if url
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module Openfoodfacts
|
4
|
+
class Label < Hashie::Mash
|
5
|
+
|
6
|
+
# TODO: Add more locales
|
7
|
+
LOCALE_PATHS = {
|
8
|
+
'fr' => 'labels',
|
9
|
+
'uk' => 'labels',
|
10
|
+
'us' => 'labels',
|
11
|
+
'world' => 'labels'
|
12
|
+
}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# Get labels
|
17
|
+
#
|
18
|
+
def all(locale: Openfoodfacts::DEFAULT_LOCALE)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.openfoodfacts.org/#{path}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get products with label
|
27
|
+
#
|
28
|
+
def products(page: -1)
|
29
|
+
Product.from_website_page(url, page: page, products_count: products_count) if url
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|