yummly 0.0.10 → 0.0.11

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: 2ab5e084a8a21890f80631110a6dae76b3b181d4
4
- data.tar.gz: 2c1aaa4ffac1ca5944c2d9d926c7eedcb1d6c3fb
3
+ metadata.gz: c539e8304b8fe711901718d2b642daa7656371b4
4
+ data.tar.gz: 40c0a00eab72d42cbf1810d5968de82fb8e4199a
5
5
  SHA512:
6
- metadata.gz: 70474e03659e2dca715213fa5781e5f8b1dc289d74e318a8e4c270dad85b7c15e676dda51e8cb154a1194d5ec6ea3b3d7b7c903ccee5c3f23fb6dc3793be646c
7
- data.tar.gz: d00a4777f6350e080311928d0d11b3fcd10642a0277a390bc09c6d0b0ce1e06911a1c362ef1896d0d65622dda9bb923129eafdfcbca181e7daacad43e635172d
6
+ metadata.gz: ed5afcf72c428be79cf1c8fa3d455114f2e8325d5ae2a73fe661139680da7ba0c361933791f2c9976a83b95e3038e9250fa105f42b6f03477c7e3bd782f0f698
7
+ data.tar.gz: 492406d015d80b610487cfd4cf160a54e4aa388822d114ed3e21f8a35093304d9fc5b03c40409e9a88777a569e73175d1f7da8f01e1f980ec69249690dac0d19
data/README.md CHANGED
@@ -38,10 +38,12 @@ Once configured, you have access to two API calls:
38
38
 
39
39
  #### Search
40
40
 
41
- The search command returns a Yummly::SearchResult object, which is a customer Enumerable collection of Recipe objects:
41
+ The search command returns a Yummly::SearchResult object, which is a custom Enumerable collection of Recipe objects:
42
42
 
43
43
  result = Yummly.search('Onion soup')
44
- result.total # returns 10
44
+ result.total # returns 43350
45
+ result.size # returns 10
46
+ result.collect { |recipe| recipe.name }
45
47
 
46
48
  #### Find
47
49
 
@@ -19,12 +19,12 @@ module Yummly
19
19
  attr_accessor :app_key,
20
20
  :app_id,
21
21
  :use_ssl,
22
- :test
22
+ :http_adapter
23
23
 
24
24
  # Creates a configuration object, defaulting use_ssl to false.
25
25
  def initialize
26
26
  @use_ssl = false
27
- @test = false
27
+ @http_adapter = Yummly::FaradayAdapter
28
28
  end
29
29
 
30
30
  # Returns true if API calls to Yummly should use SSL.
@@ -16,7 +16,7 @@ module Yummly
16
16
  end
17
17
 
18
18
  def adapter
19
- @adapter || Yummly::FaradayAdapter
19
+ Yummly.configuration.http_adapter
20
20
  end
21
21
 
22
22
  def parse_response(response)
@@ -29,6 +29,8 @@ module Yummly
29
29
  JSON.parse(response.body)
30
30
  when 501 then
31
31
  raise Yummly::NotImplementedError, response.body
32
+ when 500 then
33
+ raise Yummly::InternalServerError, "An internal error on the Yummly servers was encountered: #{response.body}"
32
34
  end
33
35
  end
34
36
 
@@ -1,3 +1,3 @@
1
1
  module Yummly
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
data/lib/yummly.rb CHANGED
@@ -43,4 +43,5 @@ module Yummly
43
43
  class NotFoundError < Error; end
44
44
  class PermissionError < Error; end
45
45
  class NotImplementedError < Error; end
46
+ class InternalServerError < Error; end
46
47
  end
@@ -6,6 +6,14 @@ describe Yummly::Configuration do
6
6
  specify { subject.should respond_to(:app_key) }
7
7
  specify { subject.should respond_to(:app_id) }
8
8
 
9
+ describe "http_adapter" do
10
+ specify { subject.http_adapter.should == Yummly::FaradayAdapter }
11
+ context "when set" do
12
+ before { subject.http_adapter = String }
13
+ specify {subject.http_adapter.should == String}
14
+ end
15
+ end
16
+
9
17
  describe "#use_ssl?" do
10
18
  specify { subject.use_ssl?.should be_false }
11
19
 
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+
3
+ describe Yummly::Connection do
4
+
5
+ let(:app_id) { "123456" }
6
+ let(:app_key) { "ABCDEFG123456" }
7
+
8
+ before do
9
+ Yummly.configure do |config|
10
+ config.app_id = app_id
11
+ config.app_key = app_key
12
+ config.http_adapter = MockHttpAdapter
13
+ end
14
+ end
15
+
16
+ describe "get" do
17
+ it "parses a successful response" do
18
+ response = Yummly::Connection.get("recipe/French-Onion-Soup-The-Pioneer-Woman-Cooks-_-Ree-Drummond-41364")
19
+ response.should be_a(Hash)
20
+ end
21
+
22
+ it "returns nil when a 404 is encountered" do
23
+ response = Yummly::Connection.get("recipe/missing-recipe-1234")
24
+ response.should be_nil
25
+ end
26
+
27
+ it "raises a permission exception when access is denied" do
28
+ expect { Yummly::Connection.get("recipe/permission-denied") }.to raise_error(Yummly::PermissionError)
29
+ end
30
+
31
+ it "raises an exception when an internal error occurs" do
32
+ expect { Yummly::Connection.get("recipe/internal-error") }.to raise_error(Yummly::InternalServerError)
33
+ end
34
+ end
35
+
36
+
37
+ end
@@ -0,0 +1,211 @@
1
+ {
2
+ "attribution": {
3
+ "html": "<a href='http://www.yummly.com/recipe/Hot-Turkey-Salad-Sandwiches-Allrecipes'>Hot Turkey Salad Sandwiches recipe</a> information powered by <img src='http://static.yummly.com/api-logo.png'/>",
4
+ "url": "http://www.yummly.com/recipe/Hot-Turkey-Salad-Sandwiches-Allrecipes",
5
+ "text": "Hot Turkey Salad Sandwiches recipes: information powered by Yummly",
6
+ "logo": "http://static.yummly.com/api-logo.png"
7
+ },
8
+ "ingredientLines": [
9
+ "2 cups diced cooked turkey",
10
+ "2 celery ribs, diced",
11
+ "1 small onion, diced",
12
+ "2 hard-cooked eggs, chopped",
13
+ "3/4 cup mayonnaise",
14
+ "1/2 teaspoon salt",
15
+ "1/4 teaspoon pepper",
16
+ "6 hamburger buns, split"
17
+ ],
18
+ "flavors": {
19
+ "Salty": 0.004261637106537819,
20
+ "Meaty": 0.0019220244139432907,
21
+ "Piquant": 0,
22
+ "Bitter": 0.006931612268090248,
23
+ "Sour": 0.009972159750759602,
24
+ "Sweet": 0.0032512755133211613
25
+ },
26
+ "nutritionEstimates": [
27
+ {
28
+ "attribute": "ENERC_KCAL",
29
+ "description": "Energy",
30
+ "value": 317.4,
31
+ "unit": {
32
+ "name": "calorie",
33
+ "abbreviation": "kcal",
34
+ "plural": "calories",
35
+ "pluralAbbreviation": "kcal"
36
+ }
37
+ },
38
+ {
39
+ "attribute": "FAT",
40
+ "description": "Total lipid (fat)",
41
+ "value": 13.97,
42
+ "unit": {
43
+ "name": "gram",
44
+ "abbreviation": "g",
45
+ "plural": "grams",
46
+ "pluralAbbreviation": "grams"
47
+ }
48
+ },
49
+ {
50
+ "attribute": "FASAT",
51
+ "description": "Fatty acids, total saturated",
52
+ "value": 2.7,
53
+ "unit": {
54
+ "name": "gram",
55
+ "abbreviation": "g",
56
+ "plural": "grams",
57
+ "pluralAbbreviation": "grams"
58
+ }
59
+ },
60
+ {
61
+ "attribute": "CHOLE",
62
+ "description": "Cholesterol",
63
+ "value": 0.11,
64
+ "unit": {
65
+ "name": "gram",
66
+ "abbreviation": "g",
67
+ "plural": "grams",
68
+ "pluralAbbreviation": "grams"
69
+ }
70
+ },
71
+ {
72
+ "attribute": "NA",
73
+ "description": "Sodium, Na",
74
+ "value": 0.66,
75
+ "unit": {
76
+ "name": "gram",
77
+ "abbreviation": "g",
78
+ "plural": "grams",
79
+ "pluralAbbreviation": "grams"
80
+ }
81
+ },
82
+ {
83
+ "attribute": "K",
84
+ "description": "Potassium, K",
85
+ "value": 0.2,
86
+ "unit": {
87
+ "name": "gram",
88
+ "abbreviation": "g",
89
+ "plural": "grams",
90
+ "pluralAbbreviation": "grams"
91
+ }
92
+ },
93
+ {
94
+ "attribute": "CHOCDF",
95
+ "description": "Carbohydrate, by difference",
96
+ "value": 29.92,
97
+ "unit": {
98
+ "name": "gram",
99
+ "abbreviation": "g",
100
+ "plural": "grams",
101
+ "pluralAbbreviation": "grams"
102
+ }
103
+ },
104
+ {
105
+ "attribute": "FIBTG",
106
+ "description": "Fiber, total dietary",
107
+ "value": 1.3,
108
+ "unit": {
109
+ "name": "gram",
110
+ "abbreviation": "g",
111
+ "plural": "grams",
112
+ "pluralAbbreviation": "grams"
113
+ }
114
+ },
115
+ {
116
+ "attribute": "SUGAR",
117
+ "description": "Sugars, total",
118
+ "value": 5.25,
119
+ "unit": {
120
+ "name": "gram",
121
+ "abbreviation": "g",
122
+ "plural": "grams",
123
+ "pluralAbbreviation": "grams"
124
+ }
125
+ },
126
+ {
127
+ "attribute": "PROCNT",
128
+ "description": "Protein",
129
+ "value": 17.6,
130
+ "unit": {
131
+ "name": "gram",
132
+ "abbreviation": "g",
133
+ "plural": "grams",
134
+ "pluralAbbreviation": "grams"
135
+ }
136
+ },
137
+ {
138
+ "attribute": "VITA_IU",
139
+ "description": "Vitamin A, IU",
140
+ "value": 159.13,
141
+ "unit": {
142
+ "name": "IU",
143
+ "abbreviation": "IU",
144
+ "plural": "IU",
145
+ "pluralAbbreviation": "IU"
146
+ }
147
+ },
148
+ {
149
+ "attribute": "VITC",
150
+ "description": "Vitamin C, total ascorbic acid",
151
+ "value": 0,
152
+ "unit": {
153
+ "name": "gram",
154
+ "abbreviation": "g",
155
+ "plural": "grams",
156
+ "pluralAbbreviation": "grams"
157
+ }
158
+ },
159
+ {
160
+ "attribute": "CA",
161
+ "description": "Calcium, Ca",
162
+ "value": 0.08,
163
+ "unit": {
164
+ "name": "gram",
165
+ "abbreviation": "g",
166
+ "plural": "grams",
167
+ "pluralAbbreviation": "grams"
168
+ }
169
+ },
170
+ {
171
+ "attribute": "FE",
172
+ "description": "Iron, Fe",
173
+ "value": 0,
174
+ "unit": {
175
+ "name": "gram",
176
+ "abbreviation": "g",
177
+ "plural": "grams",
178
+ "pluralAbbreviation": "grams"
179
+ }
180
+ }
181
+ ],
182
+ "images": [
183
+ {
184
+ "hostedLargeUrl": "http://i2.yummly.com/Hot-Turkey-Salad-Sandwiches-Allrecipes.l.png",
185
+ "hostedSmallUrl": "http://i2.yummly.com/Hot-Turkey-Salad-Sandwiches-Allrecipes.s.png"
186
+ }
187
+ ],
188
+ "name": "Hot Turkey Salad Sandwiches",
189
+ "yield": "6 servings",
190
+ "totalTime": "30 Min",
191
+ "attributes": {
192
+ "holiday": [
193
+ "Christmas",
194
+ "Thanksgiving"
195
+ ],
196
+ "cuisine": [
197
+ "Italian",
198
+ "Soul food",
199
+ "American"
200
+ ]
201
+ },
202
+ "totalTimeInSeconds": 1800,
203
+ "rating": 4.44,
204
+ "numberOfServings": 6,
205
+ "source": {
206
+ "sourceRecipeUrl": "http://allrecipes.com/Recipe/hot-turkey-salad-sandwiches/detail.aspx",
207
+ "sourceSiteUrl": "http://www.allrecipes.com",
208
+ "sourceDisplayName": "AllRecipes"
209
+ },
210
+ "id": "Hot-Turkey-Salad-Sandwiches-Allrecipes"
211
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "attribution": {
3
- "html": "&lt;a href='http://www.yummly.com/recipes/soup'&gt;soup recipes&lt;/a&gt; search powered by &lt;img src=''/&gt;",
3
+ "html": "<a href='http://www.yummly.com/recipes/soup'>soup recipes</a> search powered by <img src=''/>",
4
4
  "url": "http://www.yummly.com/recipes/soup",
5
5
  "text": "soup recipes: search powered by Yummly",
6
6
  "logo": ""
@@ -1183,7 +1183,7 @@
1183
1183
  "salt",
1184
1184
  "coriander root"
1185
1185
  ],
1186
- "recipeName": "Hot &amp; Sour Tom Yum Soup"
1186
+ "recipeName": "Hot & Sour Tom Yum Soup"
1187
1187
  },
1188
1188
  {
1189
1189
  "attributes": {
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'bundler/setup'
2
- require 'webmock/rspec'
3
- require "url_mocks"
4
2
  require 'yummly'
3
+ require 'support/mock_http_adapter'
5
4
 
6
5
  # This file was generated by the `rspec --init` command. Conventionally, all
7
6
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
@@ -0,0 +1,27 @@
1
+ class MockHttpAdapter
2
+
3
+ def self.connection(url = nil)
4
+ Faraday.new(:url => url) do |faraday|
5
+ faraday.adapter :test, self.stubs
6
+ end
7
+ end
8
+
9
+ def self.stubs
10
+ Faraday::Adapter::Test::Stubs.new do |stub|
11
+ stub.get(uri('recipe/French-Onion-Soup-The-Pioneer-Woman-Cooks-_-Ree-Drummond-41364')) {[ 200, {}, response("get_recipe.json") ]}
12
+ stub.get(uri('recipe/missing-recipe-1234')) {[ 404, {}, nil ]}
13
+ stub.get(uri('recipe/permission-denied')) {[ 409, {}, "Permission denied. Please check your app id and app key and try again later." ]}
14
+ stub.get(uri('recipe/internal-error')) {[ 500, {}, "BOOM!" ]}
15
+ end
16
+ end
17
+
18
+ def self.uri(path_fragment)
19
+ "/#{Yummly::API_VERSION}/api/#{path_fragment}?_app_id=#{Yummly.configuration.app_id}&_app_key=#{Yummly.configuration.app_key}"
20
+ end
21
+
22
+ def self.response(name)
23
+ path = File.expand_path("spec/fixtures/#{name}")
24
+ File.open(path, 'rb').read
25
+ end
26
+
27
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ describe Yummly::UrlBuilder do
4
+
5
+ let(:ssl) { false }
6
+ let(:app_id) { "123456" }
7
+ let(:app_key) { "ABCDEFG123456" }
8
+
9
+ before do
10
+ Yummly.configure do |config|
11
+ config.use_ssl = ssl
12
+ config.app_id = app_id
13
+ config.app_key = app_key
14
+ end
15
+ end
16
+
17
+ describe ".domain" do
18
+ context "when ssl is not enabled" do
19
+ specify { Yummly::UrlBuilder.domain.should == "http://api.yummly.com" }
20
+ end
21
+
22
+ context "when ssl is enabled" do
23
+ let(:ssl) { true }
24
+ specify { Yummly::UrlBuilder.domain.should == "https://api.yummly.com" }
25
+ end
26
+ end
27
+
28
+ describe ".protocol" do
29
+ context "when ssl is not enabled" do
30
+ specify { Yummly::UrlBuilder.protocol.should == "http" }
31
+ end
32
+
33
+ context "when ssl is enabled" do
34
+ let(:ssl) { true }
35
+ specify { Yummly::UrlBuilder.protocol.should == "https" }
36
+ end
37
+ end
38
+
39
+ describe ".build_params_query_string" do
40
+ let(:query_string) { Yummly::UrlBuilder.build_params_query_string(:name => 'test') }
41
+ it "contains the app key" do
42
+ query_string.should match /_app_key=#{app_key}/
43
+ end
44
+ it "contains the app id" do
45
+ query_string.should match /_app_id=#{app_id}/
46
+ end
47
+ it "contains the name parameter" do
48
+ query_string.should match /name=test/
49
+ end
50
+ end
51
+
52
+ describe ".uri" do
53
+ let(:uri) { Yummly::UrlBuilder.uri(:search, :name => 'test') }
54
+ specify { uri.should == "/#{Yummly::API_VERSION}/api/search?name=test&_app_id=123456&_app_key=ABCDEFG123456"}
55
+ end
56
+
57
+ end
data/spec/yummly_spec.rb CHANGED
@@ -1,11 +1,10 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Yummly do
4
- subject { Yummly::Configuration.new }
5
4
 
6
5
  describe ".configure" do
7
- let(:app_id) { ENV['YUMMLY_APP_ID'] || "12345" }
8
- let(:app_key) { ENV['YUMMLY_APP_KEY'] || "XEARSGSTH12345789" }
6
+ let(:app_id) { "12345" }
7
+ let(:app_key) { "XEARSGSTH12345789" }
9
8
 
10
9
  before do
11
10
  Yummly.configure do |config|
@@ -13,14 +12,11 @@ describe Yummly do
13
12
  config.app_id = app_id
14
13
  config.app_key = app_key
15
14
  end
16
-
17
- UrlMocks.register_api_url_stubs
18
15
  end
19
16
 
20
17
  specify { Yummly.configuration.use_ssl?.should be_true }
21
18
  specify { Yummly.configuration.app_id.should == app_id }
22
19
  specify { Yummly.configuration.app_key.should == app_key }
23
- specify { Yummly.search("soup recipes").should be_an_instance_of(Array)}
24
20
  end
25
21
 
26
22
  end
data/yummly.gemspec CHANGED
@@ -20,5 +20,4 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency('rack', "~> 1.5.2")
21
21
  gem.add_dependency('json', "~> 1.8.0")
22
22
  gem.add_development_dependency "rspec"
23
- gem.add_development_dependency "webmock"
24
23
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yummly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Theo Mills
@@ -66,20 +66,6 @@ dependencies:
66
66
  - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: webmock
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'
83
69
  description: Ruby wrapper to the Yummly API
84
70
  email:
85
71
  - twmills@twmills.com
@@ -109,9 +95,12 @@ files:
109
95
  - lib/yummly/url_builder.rb
110
96
  - lib/yummly/version.rb
111
97
  - spec/configuration_spec.rb
112
- - spec/fixtures/search_response.txt
98
+ - spec/connection_spec.rb
99
+ - spec/fixtures/get_recipe.json
100
+ - spec/fixtures/search_response.json
113
101
  - spec/spec_helper.rb
114
- - spec/url_mocks.rb
102
+ - spec/support/mock_http_adapter.rb
103
+ - spec/url_builder_spec.rb
115
104
  - spec/yummly_spec.rb
116
105
  - yummly.gemspec
117
106
  homepage: https://github.com/twmills/yummly
@@ -139,8 +128,11 @@ specification_version: 4
139
128
  summary: Ruby wrapper to the Yummly API
140
129
  test_files:
141
130
  - spec/configuration_spec.rb
142
- - spec/fixtures/search_response.txt
131
+ - spec/connection_spec.rb
132
+ - spec/fixtures/get_recipe.json
133
+ - spec/fixtures/search_response.json
143
134
  - spec/spec_helper.rb
144
- - spec/url_mocks.rb
135
+ - spec/support/mock_http_adapter.rb
136
+ - spec/url_builder_spec.rb
145
137
  - spec/yummly_spec.rb
146
138
  has_rdoc:
data/spec/url_mocks.rb DELETED
@@ -1,8 +0,0 @@
1
- module UrlMocks
2
- def self.register_api_url_stubs
3
- File.open(File.join(File.dirname(__FILE__), "fixtures", "search_response.txt")) do |file|
4
- WebMock::API.stub_request(:get, Regexp.new(Yummly::Connection.domain + "/v1/api/recipes?" + ".*")).to_return(status: 200, body: file)
5
- end
6
- #stub_request(:any, Regexp.new(Yummly::Connection.domain + ".*")).to_return(:body => "Catch all error until urls are defined.", :status => 501 )
7
- end
8
- end