openbeautyfacts 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +111 -0
- data/Rakefile +19 -0
- data/lib/openbeautyfacts.rb +60 -0
- data/lib/openbeautyfacts/additive.rb +51 -0
- data/lib/openbeautyfacts/allergen.rb +33 -0
- data/lib/openbeautyfacts/brand.rb +33 -0
- data/lib/openbeautyfacts/category.rb +33 -0
- data/lib/openbeautyfacts/city.rb +33 -0
- data/lib/openbeautyfacts/contributor.rb +33 -0
- data/lib/openbeautyfacts/country.rb +33 -0
- data/lib/openbeautyfacts/faq.rb +50 -0
- data/lib/openbeautyfacts/ingredient_that_may_be_from_palm_oil.rb +33 -0
- data/lib/openbeautyfacts/label.rb +33 -0
- data/lib/openbeautyfacts/locale.rb +30 -0
- data/lib/openbeautyfacts/manufacturing_place.rb +33 -0
- data/lib/openbeautyfacts/origin.rb +33 -0
- data/lib/openbeautyfacts/packager_code.rb +33 -0
- data/lib/openbeautyfacts/packaging.rb +33 -0
- data/lib/openbeautyfacts/press.rb +56 -0
- data/lib/openbeautyfacts/product.rb +185 -0
- data/lib/openbeautyfacts/product_state.rb +33 -0
- data/lib/openbeautyfacts/purchase_place.rb +33 -0
- data/lib/openbeautyfacts/store.rb +33 -0
- data/lib/openbeautyfacts/trace.rb +33 -0
- data/lib/openbeautyfacts/user.rb +41 -0
- data/lib/openbeautyfacts/version.rb +3 -0
- data/test/fixtures/additives.yml +1422 -0
- data/test/fixtures/additives_locale.yml +1422 -0
- data/test/fixtures/brands.yml +2144 -0
- data/test/fixtures/brands_locale.yml +2024 -0
- data/test/fixtures/faq.yml +1031 -0
- data/test/fixtures/fetch_product_3600550362626.yml +104 -0
- data/test/fixtures/index.yml +169 -0
- data/test/fixtures/login_user.yml +40 -0
- data/test/fixtures/press.yml +986 -0
- data/test/fixtures/product_3600550362626.yml +104 -0
- data/test/fixtures/product_states.yml +936 -0
- data/test/fixtures/product_states_locale.yml +976 -0
- data/test/fixtures/products_for_brand.yml +1707 -0
- data/test/fixtures/products_for_state.yml +2260 -0
- data/test/fixtures/products_with_additive.yml +1723 -0
- data/test/fixtures/search_doux.yml +538 -0
- data/test/fixtures/search_doux_1_000_000.yml +257 -0
- data/test/minitest_helper.rb +12 -0
- data/test/test_openbeautyfacts.rb +193 -0
- metadata +188 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dc1875dd0d4f35000da26600c17317afe76eb644
|
4
|
+
data.tar.gz: 04cf3b96a42e49e6aecab11762630c8bbe68c002
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 10ea3c62fed84fc3f5a9a0d1f1676da2999342095f8b65c2e1cbf2e408473cf04af7a5b221e5dcc443b2ed618239d0b8dd960a3b220abbe8804a275251d55de3
|
7
|
+
data.tar.gz: b35cc9a9329c61020d69eed0a55b5b57a9af3a4241cbe5e1d886fa227c6ce77ffc920822a6dd209dd300e0f8e5a8e545a0cf2c90c4667455ae21d0669b264943
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Nicolas Leger
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
# Open Beauty Facts
|
2
|
+
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/openbeautyfacts.svg)](http://badge.fury.io/rb/openbeautyfacts)
|
4
|
+
[![Build Status](https://travis-ci.org/openbeautyfacts/openbeautyfacts-ruby.svg?branch=master)](https://travis-ci.org/openbeautyfacts/openbeautyfacts-ruby)
|
5
|
+
[![Dependency Status](https://gemnasium.com/openbeautyfacts/openbeautyfacts-ruby.svg)](https://gemnasium.com/openbeautyfacts/openbeautyfacts-ruby)
|
6
|
+
[![Code Climate](https://codeclimate.com/github/openbeautyfacts/openbeautyfacts-ruby/badges/gpa.svg)](https://codeclimate.com/github/openbeautyfacts/openbeautyfacts-ruby)
|
7
|
+
[![Coverage Status](https://coveralls.io/repos/github/openfoodfacts/openbeautyfacts-ruby/badge.svg?branch=master)](https://coveralls.io/github/openbeautyfacts/openbeautyfacts-ruby?branch=master)
|
8
|
+
[![Documentation](http://inch-ci.org/github/openbeautyfacts/openbeautyfacts-ruby.svg?branch=master)](http://inch-ci.org/github/openbeautyfacts/openbeautyfacts-ruby)
|
9
|
+
|
10
|
+
API Wrapper for [Open Beauty Facts](http://openbeautyfacts.org/), the open database about beauty products.
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
Add this line to your application's Gemfile:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
gem 'openbeautyfacts'
|
18
|
+
```
|
19
|
+
|
20
|
+
And then execute:
|
21
|
+
|
22
|
+
$ bundle
|
23
|
+
|
24
|
+
Or install it yourself as:
|
25
|
+
|
26
|
+
$ gem install openbeautyfacts
|
27
|
+
|
28
|
+
## Models
|
29
|
+
|
30
|
+
All data is available for World, French, UK and US version for now. You should update the gem page URLs mapping for others.
|
31
|
+
|
32
|
+
- Additive
|
33
|
+
- Brand
|
34
|
+
- Category
|
35
|
+
- City
|
36
|
+
- Contributor
|
37
|
+
- Country
|
38
|
+
- Faq
|
39
|
+
- IngredientThatMayBeFromPalmOil
|
40
|
+
- Label
|
41
|
+
- Locale
|
42
|
+
- ManufacturingPlace
|
43
|
+
- Origin
|
44
|
+
- PackagerCode
|
45
|
+
- Packaging
|
46
|
+
- Press
|
47
|
+
- Product
|
48
|
+
- ProductState
|
49
|
+
- PurchasePlace
|
50
|
+
- Store
|
51
|
+
- Trace
|
52
|
+
- User
|
53
|
+
|
54
|
+
## Usage
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
require 'openbeautyfacts'
|
58
|
+
|
59
|
+
# Browse a product
|
60
|
+
|
61
|
+
code = "3029330003533"
|
62
|
+
product = Openbeautyfacts::Product.get(code, locale: 'fr')
|
63
|
+
|
64
|
+
product.product_name
|
65
|
+
# => "Crousti Moelleux Complet"
|
66
|
+
|
67
|
+
product.nutriments.to_hash
|
68
|
+
# => {"sodium"=>"0.44", "sugars"=>6.5, "fat_unit"=>"g", "carbohydrates_unit"=>"g", "proteins_unit"=>"g", "nutrition-score-fr_100g"=>-2, "fat"=>2.5, "proteins_serving"=>12.8, "sodium_serving"=>0.535, "salt"=>1.1176, "proteins"=>10.5, "nutrition-score-uk_serving"=>-2, "nutrition-score-fr"=>-2, "fat_serving"=>3.04, "sugars_unit"=>"g", "sugars_100g"=>"6.5", "sodium_unit"=>"g", "saturated-fat_unit"=>"g", "saturated-fat_serving"=>0.608, "sodium_100g"=>0.44, "fiber_unit"=>"g", "energy"=>1067, "energy_unit"=>"kJ", "sugars_serving"=>7.9, "carbohydrates_100g"=>44, "nutrition-score-uk"=>-2, "proteins_100g"=>10.5, "fiber_serving"=>7.29, "carbohydrates_serving"=>53.5, "nutrition-score-fr_serving"=>-2, "energy_serving"=>1300, "fat_100g"=>"2.5", "saturated-fat_100g"=>"0.5", "nutrition-score-uk_100g"=>-2, "fiber"=>6, "salt_serving"=>1.36, "salt_100g"=>"1.1176", "carbohydrates"=>44, "fiber_100g"=>6, "energy_100g"=>1067, "saturated-fat"=>0.5}
|
69
|
+
|
70
|
+
# Update product
|
71
|
+
|
72
|
+
user = Openbeautyfacts::User.login("USERNAME", "PASSWORD")
|
73
|
+
if user
|
74
|
+
product.brands = "Jacquet"
|
75
|
+
product.update
|
76
|
+
# true
|
77
|
+
end
|
78
|
+
|
79
|
+
# Search products
|
80
|
+
|
81
|
+
products = Openbeautyfacts::Product.search("Chocolate", locale: 'world', page_size: 3)
|
82
|
+
# => [#<Openbeautyfacts::Product _id="3045140105502" code="3045140105502" id="3045140105502" image_small_url="http://en.openbeautyfacts.org/images/products/304/514/010/5502/front.7.100.jpg" lc="en" product_name="Milka au lait du Pays Alpin">, #<Openbeautyfacts::Product _id="3046920028363" code="3046920028363" id="3046920028363" image_small_url="http://en.openbeautyfacts.org/images/products/304/692/002/8363/front.5.100.jpg" lc="en" product_name="Tableta de chocolate negro \"Lindt Excellence\" 85% cacao">, #<Openbeautyfacts::Product _id="3046920029759" code="3046920029759" id="3046920029759" image_small_url="http://en.openbeautyfacts.org/images/products/304/692/002/9759/front.9.100.jpg" lc="en" product_name="Tableta de chocolate negro \"Lindt Excellence\" 90% cacao">]
|
83
|
+
|
84
|
+
# You might need to fetch full product data from results
|
85
|
+
|
86
|
+
products.first.fetch
|
87
|
+
|
88
|
+
# By product state
|
89
|
+
|
90
|
+
product_states = Openbeautyfacts::ProductState.all
|
91
|
+
product_states.last.products
|
92
|
+
|
93
|
+
# Config
|
94
|
+
|
95
|
+
Openbeautyfacts::Locale.all
|
96
|
+
# => ["ad", "ad-es", "ad-fr", "ad-pt", "ae", "al", "am", "ar", "at", "au", "ax", "az", "bd", "be", "be-de", "be-fr", "bf", "bg", "bi", "bi-rn", "bn", "br", "by", "by-be", "bz", "ca", "ca-fr", "cg", "ch", "ch-fr", "ch-it", "ci", "cl", "cn", "co", "cr", "cu", "cy", "cy-tr", "cz", "de", "dk", "do", "dz", "dz-fr", "ec", "eg", "es", "es-ca", "es-eu", "es-gl", "fi", "fi-sv", "fr", "ga", "gf", "gn", "gp", "gr", "hk", "hr", "hu", "id", "ie", "ie-ga", "il", "il-ar", "il-ru", "in", "iq", "iq-ku", "ir", "is", "it", "jp", "ke", "ke-sw", "kh", "kr", "kw", "kz", "kz-kk", "lb", "lk", "lk-ta", "lu", "lu-de", "lu-lb", "lv", "ma", "ma-es", "ma-fr", "mc", "md", "mf", "ml", "mn", "mo", "mo-zh", "mq", "mr", "mt", "mt-mt", "mu", "mx", "my", "nc", "nl", "no", "nz", "nz-mi", "pa", "pe", "pf", "ph", "ph-tl", "pl", "pm", "pt", "qa", "re", "ro", "rs", "ru", "sa", "se", "sg", "sg-ms", "sg-ta", "sg-zh", "si", "sk", "sn", "sy", "th", "tn", "tr", "tw", "tz", "tz-sw", "ua", "uk", "us", "ve", "vn", "vu", "vu-bi", "world", "ye", "yt", "za", "za-af", "za-nr", "za-ss", "za-st", "za-tn", "za-ts", "za-ve", "za-xh", "za-zu"]
|
97
|
+
```
|
98
|
+
|
99
|
+
## Development
|
100
|
+
|
101
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
102
|
+
|
103
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
104
|
+
|
105
|
+
## Contributing
|
106
|
+
|
107
|
+
1. Fork it ( https://github.com/openbeautyfacts/openbeautyfacts-ruby/fork )
|
108
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
109
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
110
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
111
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
Rake::TestTask.new do |task|
|
5
|
+
task.libs << "lib"
|
6
|
+
task.libs << "test"
|
7
|
+
task.pattern = "test/test_*.rb"
|
8
|
+
end
|
9
|
+
|
10
|
+
task default: :test
|
11
|
+
|
12
|
+
desc 'Load gem inside irb console'
|
13
|
+
task :console do
|
14
|
+
require 'irb'
|
15
|
+
require 'irb/completion'
|
16
|
+
require File.join(__FILE__, '../lib/openbeautyfacts')
|
17
|
+
ARGV.clear
|
18
|
+
IRB.start
|
19
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative 'openbeautyfacts/additive'
|
2
|
+
require_relative 'openbeautyfacts/brand'
|
3
|
+
require_relative 'openbeautyfacts/category'
|
4
|
+
require_relative 'openbeautyfacts/city'
|
5
|
+
require_relative 'openbeautyfacts/contributor'
|
6
|
+
require_relative 'openbeautyfacts/country'
|
7
|
+
require_relative 'openbeautyfacts/faq'
|
8
|
+
require_relative 'openbeautyfacts/ingredient_that_may_be_from_palm_oil'
|
9
|
+
require_relative 'openbeautyfacts/label'
|
10
|
+
require_relative 'openbeautyfacts/locale'
|
11
|
+
require_relative 'openbeautyfacts/manufacturing_place'
|
12
|
+
require_relative 'openbeautyfacts/origin'
|
13
|
+
require_relative 'openbeautyfacts/packager_code'
|
14
|
+
require_relative 'openbeautyfacts/packaging'
|
15
|
+
require_relative 'openbeautyfacts/press'
|
16
|
+
require_relative 'openbeautyfacts/product'
|
17
|
+
require_relative 'openbeautyfacts/product_state'
|
18
|
+
require_relative 'openbeautyfacts/purchase_place'
|
19
|
+
require_relative 'openbeautyfacts/store'
|
20
|
+
require_relative 'openbeautyfacts/trace'
|
21
|
+
require_relative 'openbeautyfacts/user'
|
22
|
+
require_relative 'openbeautyfacts/version'
|
23
|
+
|
24
|
+
require 'json'
|
25
|
+
require 'nokogiri'
|
26
|
+
require 'open-uri'
|
27
|
+
|
28
|
+
module Openbeautyfacts
|
29
|
+
|
30
|
+
DEFAULT_LOCALE = Locale::GLOBAL
|
31
|
+
DEFAULT_DOMAIN = 'openbeautyfacts.org'
|
32
|
+
|
33
|
+
class << self
|
34
|
+
|
35
|
+
# Return locale from link
|
36
|
+
#
|
37
|
+
def locale_from_link(link)
|
38
|
+
Locale.locale_from_link(link)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Get locales
|
42
|
+
#
|
43
|
+
def locales
|
44
|
+
Locale.all
|
45
|
+
end
|
46
|
+
|
47
|
+
# Get product
|
48
|
+
#
|
49
|
+
def product(barcode, locale: DEFAULT_LOCALE)
|
50
|
+
Product.get(barcode, locale: locale)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Return product API URL
|
54
|
+
#
|
55
|
+
def product_url(barcode, locale: DEFAULT_LOCALE)
|
56
|
+
Product.url(barcode, locale: locale)
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module Openbeautyfacts
|
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: DEFAULT_LOCALE, domain: DEFAULT_DOMAIN)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
page_url = "http://#{locale}.#{domain}/#{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[3].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 Openbeautyfacts
|
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: DEFAULT_LOCALE, domain: DEFAULT_DOMAIN)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.#{domain}/#{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 Openbeautyfacts
|
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: DEFAULT_LOCALE, domain: DEFAULT_DOMAIN)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.#{domain}/#{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 Openbeautyfacts
|
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: DEFAULT_LOCALE, domain: DEFAULT_DOMAIN)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.#{domain}/#{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 Openbeautyfacts
|
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: DEFAULT_LOCALE, domain: DEFAULT_DOMAIN)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.#{domain}/#{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 Openbeautyfacts
|
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: DEFAULT_LOCALE, domain: DEFAULT_DOMAIN)
|
19
|
+
if path = LOCALE_PATHS[locale]
|
20
|
+
Product.tags_from_page(self, "http://#{locale}.#{domain}/#{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
|