yummly 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c543836edc5084b18fc2f74f83c580808310eeef
4
- data.tar.gz: 6b55ff04a87be2cd86c12c1573c8390407a3da6b
3
+ metadata.gz: 78e584a537c9ead08a12229ece8b465b98182324
4
+ data.tar.gz: 4231fb36513103e5392bd5b38d3a548574fc791a
5
5
  SHA512:
6
- metadata.gz: d2a6c05a915f931d0740a61bb84b28f5fc7fe9583ed47e33a939e36796cdf8796c2ff9c7048011a9654333b2952a42bedf8798c11c6497f01daafac600dbad1d
7
- data.tar.gz: 8f663597afe7489ebc0c5029c303ddd95512ecdacaa424f33f27b4339d46b5eea04942439d9c08640d53f719673aeeea71c9c0d0a31dc3b64537102f5ea486db
6
+ metadata.gz: 609b03d8ba5bf41c245bf9d00458b5a5cdea08397c134499dc965fce3e1e48e751ea9b962d8504fced923d60928bc61ec8af832416cd8569bc2c32b5e677ee37
7
+ data.tar.gz: bbd42efa959d1b8a60de140da85805000606b4437c6803f5a9fcaf549effc1dbc2f064c2a508175a38907038d903397cff0befc7e0369127c40ee67f8735ded6
@@ -0,0 +1,7 @@
1
+ rvm:
2
+ - "1.9.3"
3
+ - "2.0.0"
4
+ - "1.9.2"
5
+ - jruby-19mode
6
+ - rbx-19mode
7
+ - jruby-18mode
data/README.md CHANGED
@@ -1,11 +1,12 @@
1
+ [![Code Climate](https://codeclimate.com/repos/51b73d4a13d6371539009033/badges/9791fe90f214cf14a27b/gpa.png)](https://codeclimate.com/repos/51b73d4a13d6371539009033/feed)
2
+ [![Build Status](https://travis-ci.org/twmills/yummly.png?branch=master)](https://travis-ci.org/twmills/yummly)
3
+
1
4
  # Yummly
2
5
 
3
6
  This is the unofficial ruby wrapper to the Yummly API, "the world's largest and most powerful recipe search site".
4
7
 
5
8
  https://developer.yummly.com/
6
9
 
7
- Still in the baking phase. Tests are being written, lots of churn at the moment.
8
-
9
10
  ## Installation
10
11
 
11
12
  Add this line to your application's Gemfile:
@@ -24,6 +25,7 @@ Or install it yourself as:
24
25
 
25
26
  First, configure Yummly with your APP key and ID, for example in an initializer if you're using Rails:
26
27
 
28
+ # config/initializers/yummly.rb
27
29
  Yummly.configure do |config|
28
30
  config.app_id = "21334"
29
31
  config.app_key = "XXXXXXXXXXXXXXXXX"
@@ -68,6 +70,18 @@ For example, to access the thumbnail image for a recipe:
68
70
 
69
71
  Explore the Yummly::Recipe class to see the full range of available attributes.
70
72
 
73
+ ## Errors
74
+
75
+ The yummly gem handles the API's exceptions by raising the following errors:
76
+
77
+ * **Yummly::PermissionError** - When your credentials are incorrect or you've exceeded the rate limit.
78
+ * **Yummly::InternalServerError** - When something's gone wrong on Yummly's servers
79
+ * **Yummly::Error** - Any other unexpected error that is returned.
80
+
81
+ _**Note:** There had been some discussion about raising an exception when a 404 is encountered, i.e. when a recipe doesn't
82
+ exist for a given ID. Currently the find call returns nil if a recipe cannot be found, but I may raise a new error in
83
+ the future if this is considered a truly exceptional case._
84
+
71
85
  ## Contributing
72
86
 
73
87
  1. Fork it
data/Rakefile CHANGED
@@ -1 +1,4 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new(:spec)
4
+ task :default => :spec
@@ -40,8 +40,6 @@ module Yummly
40
40
  end
41
41
 
42
42
  class Error < StandardError; end
43
- class NotFoundError < Error; end
44
43
  class PermissionError < Error; end
45
- class NotImplementedError < Error; end
46
44
  class InternalServerError < Error; end
47
45
  end
@@ -18,7 +18,7 @@ module Yummly
18
18
  # recipe = Yummly::Api.find('French-Onion-Soup-The-Pioneer-Woman-Cooks-_-Ree-Drummond-41364')
19
19
  def self.find(id)
20
20
  recipe_json = Yummly::Connection.get("recipe/#{id}")
21
- Yummly::Recipe.new(recipe_json)
21
+ recipe_json.nil? ? nil : Yummly::Recipe.new(recipe_json)
22
22
  end
23
23
 
24
24
  # Searches for recipes that match the supplied search terms.
@@ -27,10 +27,10 @@ module Yummly
27
27
  nil
28
28
  when 200 then
29
29
  JSON.parse(response.body)
30
- when 501 then
31
- raise Yummly::NotImplementedError, response.body
32
30
  when 500 then
33
31
  raise Yummly::InternalServerError, "An internal error on the Yummly servers was encountered: #{response.body}"
32
+ else
33
+ raise Yummly::Error, response.body
34
34
  end
35
35
  end
36
36
 
@@ -1,43 +1,43 @@
1
- # This class maps a Yummly response to attributes on to a recipe object. Because the search and find API calls return
1
+ # This class maps a Yummly json to attributes on to a recipe object. Because the search and find API calls return
2
2
  # recipe data slightly different structures, it also automatically rectifies these differences where possible.
3
3
  #
4
- # When a response attribute is an array, collections of related objects will be created for convenience. For example,
4
+ # When a json attribute is an array, collections of related objects will be created for convenience. For example,
5
5
  # the "images" attribute on the response maps to the #images method which returns a collection of Yummlly::Image
6
6
  # objects.
7
7
  module Yummly
8
8
  class Recipe
9
9
 
10
- attr_accessor :response
10
+ attr_accessor :json
11
11
 
12
- def initialize(recipe_json)
13
- @response = recipe_json
12
+ def initialize(json)
13
+ @json = json
14
14
  end
15
15
 
16
16
  # Nutrition attribute’s search parameter name.
17
17
  def attribute
18
- response["attribute"]
18
+ json["attribute"]
19
19
  end
20
20
 
21
21
  def attributes
22
- response["attributes"]
22
+ json["attributes"]
23
23
  end
24
24
 
25
25
  def attribution
26
- @attribution ||= Yummly::Attribution.new(response["attribution"])
26
+ @attribution ||= Yummly::Attribution.new(json["attribution"])
27
27
  end
28
28
 
29
29
  def description
30
- response["description"]
30
+ json["description"]
31
31
  end
32
32
 
33
33
  # @return [Yummly::Flavor] instance of a Yummly::Flavor object
34
34
  def flavor
35
- @flavor ||= Yummly::Flavor.new(response["flavors"])
35
+ @flavor ||= Yummly::Flavor.new(json["flavors"])
36
36
  end
37
37
 
38
38
  # @return [String] the Yummly id for this recipe.
39
39
  def id
40
- response["id"]
40
+ json["id"]
41
41
  end
42
42
 
43
43
  # @return [Array] collection of Yummly::Image objects.
@@ -47,23 +47,23 @@ module Yummly
47
47
 
48
48
  # @return [Array] collection of strings of ingredients.
49
49
  def ingredients
50
- response["ingredients"] || ingredient_lines
50
+ json["ingredients"] || ingredient_lines
51
51
  end
52
52
 
53
53
  # @return [Array] collection of strings of ingredients.
54
54
  def ingredient_lines
55
- response["ingredientLines"]
55
+ json["ingredientLines"]
56
56
  end
57
57
 
58
- # Returns the name of the recipe, automatically finding it using the correct response node.
58
+ # Returns the name of the recipe, automatically finding it using the correct json node.
59
59
  # @return [String] name of the recipe
60
60
  def name
61
- response["name"] || recipe_name
61
+ json["name"] || recipe_name
62
62
  end
63
63
 
64
64
  # @return [Integer] number of servings this recipe provides.
65
65
  def number_of_servings
66
- response["numberOfServings"]
66
+ json["numberOfServings"]
67
67
  end
68
68
 
69
69
  # The nutritional composition of the recipe, in the form of a list of nutrients and their amounts, per serving. We
@@ -71,23 +71,23 @@ module Yummly
71
71
  # are only estimates and you should be clear about that in what you tell your users.
72
72
  # @return [Array] collection of Yummly::NutritionEstimate objects.
73
73
  def nutrition_estimates
74
- @nutrition_estimates ||= response["nutritionEstimates"].collect { |ne| Yummly::NutritionEstimate.new(ne) }
74
+ @nutrition_estimates ||= json["nutritionEstimates"].collect { |ne| Yummly::NutritionEstimate.new(ne) }
75
75
  end
76
76
 
77
77
  def rating
78
- response["rating"]
78
+ json["rating"]
79
79
  end
80
80
 
81
81
  def recipe_name
82
- response["recipeName"]
82
+ json["recipeName"]
83
83
  end
84
84
 
85
85
  def total_time
86
- response["totalTime"]
86
+ json["totalTime"]
87
87
  end
88
88
 
89
89
  def total_time_in_seconds
90
- response["totalTimeInSeconds"]
90
+ json["totalTimeInSeconds"]
91
91
  end
92
92
 
93
93
  def thumbnail
@@ -98,11 +98,11 @@ module Yummly
98
98
 
99
99
  private
100
100
 
101
- # The search and find API calls populate different image attribute nodes in their respective responses. This method
101
+ # The search and find API calls populate different image attribute nodes in their respective jsons. This method
102
102
  # determines which one has been populated and returns a populated node for the images collection method to use. This
103
103
  # allows the developer using this API to only use one method to access images.
104
104
  def images_node
105
- response["images"] || response["smallImageUrls"].collect { |url| {"hostedSmallUrl" => url} }
105
+ json["images"] || json["smallImageUrls"].collect { |url| {"hostedSmallUrl" => url} }
106
106
  end
107
107
 
108
108
  end
@@ -7,10 +7,10 @@ module Yummly
7
7
 
8
8
  include Enumerable
9
9
 
10
- attr_accessor :response, :params, :max_result, :start
10
+ attr_accessor :json, :params, :max_result, :start
11
11
 
12
- def initialize(response)
13
- @response = response
12
+ def initialize(json)
13
+ @json = json
14
14
  end
15
15
 
16
16
  def each(&block)
@@ -22,20 +22,20 @@ module Yummly
22
22
  end
23
23
 
24
24
  def matches
25
- response["matches"] || []
25
+ json["matches"] || []
26
26
  end
27
27
 
28
28
  def total_match_count
29
- response["totalMatchCount"]
29
+ json["totalMatchCount"]
30
30
  end
31
31
  alias_method :total, :total_match_count
32
32
 
33
33
  def attribution
34
- Yummly::Attribution.new(response["attribution"])
34
+ Yummly::Attribution.new(json["attribution"])
35
35
  end
36
36
 
37
37
  def criteria
38
- response["criteria"]
38
+ json["criteria"]
39
39
  end
40
40
 
41
41
  end
@@ -1,3 +1,3 @@
1
1
  module Yummly
2
- VERSION = "0.0.12"
2
+ VERSION = "0.0.13"
3
3
  end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ describe Yummly::Api do
4
+
5
+ before do
6
+ Yummly.configure do |config|
7
+ config.app_id = "12345"
8
+ config.app_key = "XEARSGSTH12345789"
9
+ config.http_adapter = MockHttpAdapter
10
+ end
11
+ end
12
+
13
+ subject { }
14
+
15
+ describe "#find" do
16
+ let(:result) { Yummly::Api.find('French-Onion-Soup-The-Pioneer-Woman-Cooks-_-Ree-Drummond-41364') }
17
+
18
+ specify { result.should be_a(Yummly::Recipe) }
19
+
20
+ it "populates the recipe object with the json response" do
21
+ result.json.should == read_json_file('get_recipe.json')
22
+ end
23
+
24
+ context "no recipe found" do
25
+ let(:result) { Yummly::Api.find('missing-recipe-1234') }
26
+ specify { result.should be_nil }
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+ def read_json_file(name)
33
+ path = File.expand_path("spec/fixtures/#{name}")
34
+ JSON.parse(File.open(path, 'rb').read)
35
+ end
@@ -7,6 +7,7 @@ Gem::Specification.new do |gem|
7
7
  gem.name = "yummly"
8
8
  gem.version = Yummly::VERSION
9
9
  gem.authors = ["Theo Mills"]
10
+ gem.license = 'MIT'
10
11
  gem.email = ["twmills@twmills.com"]
11
12
  gem.description = %q{Ruby wrapper to the Yummly API}
12
13
  gem.summary = "This is the unofficial ruby wrapper to the Yummly API, \"the world's largest and most powerful recipe search site\""
@@ -17,7 +18,8 @@ Gem::Specification.new do |gem|
17
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
19
  gem.require_paths = ["lib"]
19
20
  gem.add_dependency('faraday', '>= 0.8.7')
20
- gem.add_dependency('rack', "~> 1.4.5")
21
+ gem.add_dependency('rack', ">= 1.4.5")
21
22
  gem.add_dependency('json', "~> 1.8.0")
22
23
  gem.add_development_dependency "rspec"
24
+ gem.add_development_dependency "rake"
23
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yummly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Theo Mills
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-10 00:00:00.000000000 Z
11
+ date: 2013-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -28,14 +28,14 @@ dependencies:
28
28
  name: rack
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.4.5
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.4.5
41
41
  - !ruby/object:Gem::Dependency
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: Ruby wrapper to the Yummly API
70
84
  email:
71
85
  - twmills@twmills.com
@@ -75,6 +89,7 @@ extra_rdoc_files: []
75
89
  files:
76
90
  - .gitignore
77
91
  - .rspec
92
+ - .travis.yml
78
93
  - Gemfile
79
94
  - LICENSE.txt
80
95
  - README.md
@@ -94,6 +109,7 @@ files:
94
109
  - lib/yummly/unit.rb
95
110
  - lib/yummly/url_builder.rb
96
111
  - lib/yummly/version.rb
112
+ - spec/api_spec.rb
97
113
  - spec/configuration_spec.rb
98
114
  - spec/connection_spec.rb
99
115
  - spec/fixtures/get_recipe.json
@@ -104,7 +120,8 @@ files:
104
120
  - spec/yummly_spec.rb
105
121
  - yummly.gemspec
106
122
  homepage: https://github.com/twmills/yummly
107
- licenses: []
123
+ licenses:
124
+ - MIT
108
125
  metadata: {}
109
126
  post_install_message:
110
127
  rdoc_options: []
@@ -122,12 +139,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
139
  version: '0'
123
140
  requirements: []
124
141
  rubyforge_project:
125
- rubygems_version: 2.0.3
142
+ rubygems_version: 2.1.11
126
143
  signing_key:
127
144
  specification_version: 4
128
145
  summary: This is the unofficial ruby wrapper to the Yummly API, "the world's largest
129
146
  and most powerful recipe search site"
130
147
  test_files:
148
+ - spec/api_spec.rb
131
149
  - spec/configuration_spec.rb
132
150
  - spec/connection_spec.rb
133
151
  - spec/fixtures/get_recipe.json
@@ -136,4 +154,3 @@ test_files:
136
154
  - spec/support/mock_http_adapter.rb
137
155
  - spec/url_builder_spec.rb
138
156
  - spec/yummly_spec.rb
139
- has_rdoc: