sears-api 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ Jeweler::Tasks.new do |gem|
18
18
  gem.homepage = "http://github.com/rjspotter/sears-api"
19
19
  gem.license = "MIT"
20
20
  gem.summary = %Q{gem for the sears developer api}
21
- gem.description = %Q{just your basic wrapper}
21
+ gem.description = %Q{just your basic wrapper'}
22
22
  gem.email = "rjspotter@gmail.com"
23
23
  gem.authors = ["rjspotter"]
24
24
  # dependencies defined in Gemfile
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
data/lib/sears-api.rb CHANGED
@@ -26,6 +26,10 @@ module SearsApi
26
26
  Response.new(get(path, opt))
27
27
  end
28
28
 
29
+ def store_locator(zip, opt = {})
30
+ kget('/StoreLocator', :query => {:zipCode => '94132'}.merge(opt))
31
+ end
32
+
29
33
  def product_details(part_number, opt = {})
30
34
  kget('/productdetails', :query => {:partNumber => part_number}.merge(opt))
31
35
  end
@@ -36,10 +40,16 @@ module SearsApi
36
40
  merge(opt))
37
41
  end
38
42
 
43
+ def current_promotions(opt = {})
44
+ def_opts = {:storeName => 'Sears'}
45
+ def_opts[:storeName] = opt[:store] if opt[:store]
46
+ kget('/CurrentPromotions', :query => def_opts.merge(opt))
47
+ end
48
+
39
49
  # for each foo in the first array create methods prefixed with
40
50
  # the store names like kmart_foo, mygofer_foo, sears_foo
41
51
  # although sears_foo == foo
42
- [:product_search_by_keyword, :product_details].each do |meth|
52
+ [:product_search_by_keyword, :product_details, :current_promotions, :store_locator].each do |meth|
43
53
  %w[kmart mygofer sears].each do |store_name|
44
54
  define_method("#{store_name}_#{meth.to_s}".to_sym) do |keyword|
45
55
  send(meth.to_sym, keyword, :store => store_name.capitalize)
@@ -69,24 +79,38 @@ module SearsApi
69
79
 
70
80
  def initialize(resp)
71
81
  @resp = resp
72
- self.extend Search if Ick::Try.instance.invoke(resp) {|x| x.first.first} == "MercadoResult"
73
- self.extend ProductDetails if Ick::Try.instance.invoke(resp) {|x| x.first.first} == "ProductDetail"
82
+
83
+ %w[MercadoResult ProductDetail PromotionDetails showStoreLocator].each do |y|
84
+ self.extend eval(ActiveSupport::Inflector.camelize(y)) if Ick::Try.instance.invoke(resp) {|x| x.first.first} == y
85
+ end
74
86
  end
75
87
 
76
88
  end
77
89
 
78
- module Search
90
+ module MercadoResult
79
91
  def deligate
80
92
  resp.first[1]['Products']['Product'].map {|x| Record.new(OpenStruct.new(x))}
81
93
  end
82
94
  end
83
95
 
84
- module ProductDetails
96
+ module ProductDetail
85
97
  def deligate
86
98
  Record.new(OpenStruct.new(resp.first[1]['SoftHardProductDetails']))
87
99
  end
88
100
  end
89
101
 
102
+ module PromotionDetails
103
+ def deligate
104
+ resp.first[1]['PromotionDetail'].map {|x| Record.new(OpenStruct.new(x))}
105
+ end
106
+ end
107
+
108
+ module ShowStoreLocator
109
+ def deligate
110
+ resp.first[1]['getStoreLocator']['StoreLocations'].map {|x| Record.new(OpenStruct.new(x))}
111
+ end
112
+ end
113
+
90
114
  Record = Struct.new(:deligate) do
91
115
  include MethodMissingDeligation
92
116
  end
data/sears-api.gemspec CHANGED
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "sears-api"
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["rjspotter"]
12
- s.date = "2012-01-24"
13
- s.description = "just your basic wrapper"
12
+ s.date = "2012-01-27"
13
+ s.description = "just your basic wrapper'"
14
14
  s.email = "rjspotter@gmail.com"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE.txt",
@@ -57,6 +57,20 @@ describe "SearsApi" do
57
57
 
58
58
  end
59
59
 
60
+ context "store locator" do
61
+ it "takes a zipcode" do
62
+ subject.should_receive(:kget).
63
+ with('/StoreLocator', :query => {:zipCode => '94132'})
64
+ subject.store_locator('94132')
65
+ end
66
+
67
+ it "takes an override" do
68
+ subject.should_receive(:kget).
69
+ with('/StoreLocator', :query => {:zipCode => '94132', :stateCode => 'CA'})
70
+ subject.store_locator('94132', {:stateCode => 'CA'})
71
+ end
72
+ end
73
+
60
74
  context "product details" do
61
75
  it "searches by partnumber" do
62
76
  subject.should_receive(:kget).
@@ -104,6 +118,24 @@ describe "SearsApi" do
104
118
 
105
119
  end
106
120
 
121
+ context "current promotions" do
122
+ it "calls kget to CurrentPromotions" do
123
+ subject.should_receive(:kget).
124
+ with('/CurrentPromotions', :query => {:storeName => 'Sears'})
125
+ subject.current_promotions
126
+ end
127
+ it "takes an opt hash" do
128
+ subject.should_receive(:kget).
129
+ with('/CurrentPromotions', :query => {:sortFlag => true, :storeName => 'Sears'})
130
+ subject.current_promotions(:sortFlag => true)
131
+ end
132
+ it "hides the api inconsistancy" do
133
+ subject.should_receive(:kget).
134
+ with('/CurrentPromotions', :query => {:sortFlag => true, :storeName => 'Kmart', :store => 'Kmart'})
135
+ subject.current_promotions(:sortFlag => true, :store => 'Kmart')
136
+ end
137
+ end
138
+
107
139
  end
108
140
 
109
141
  describe "Response" do
@@ -116,16 +148,22 @@ describe "SearsApi" do
116
148
  subject.new(@resp).resp.should == @resp
117
149
  end
118
150
 
119
- it "is extended with Search if needed" do
151
+ it "is extended with MercadoResult if needed" do
120
152
  @resp.stub_chain(:first,:first).and_return("MercadoResult")
121
153
  subject.new(@resp).singleton_class.included_modules.
122
- should include(SearsApi::Search)
154
+ should include(SearsApi::MercadoResult)
123
155
  end
124
156
 
125
- it "is extended with Search if needed" do
157
+ it "is extended with ProductDetail if needed" do
126
158
  @resp.stub_chain(:first,:first).and_return("ProductDetail")
127
159
  subject.new(@resp).singleton_class.included_modules.
128
- should include(SearsApi::ProductDetails)
160
+ should include(SearsApi::ProductDetail)
161
+ end
162
+
163
+ it "is extended with showStoreLocator if needed" do
164
+ @resp.stub_chain(:first,:first).and_return("showStoreLocator")
165
+ subject.new(@resp).singleton_class.included_modules.
166
+ should include(SearsApi::ShowStoreLocator)
129
167
  end
130
168
 
131
169
  describe "instance" do
@@ -154,11 +192,11 @@ describe "SearsApi" do
154
192
 
155
193
  end
156
194
 
157
- describe "Search Results Mixin" do
195
+ describe "MercadoResult Results Mixin" do
158
196
 
159
197
  subject do
160
198
  s = OpenStruct.new(:resp => stub)
161
- s.extend(SearsApi::Search)
199
+ s.extend(SearsApi::MercadoResult)
162
200
  s
163
201
  end
164
202
 
@@ -175,7 +213,7 @@ describe "SearsApi" do
175
213
 
176
214
  subject do
177
215
  s = OpenStruct.new(:resp => stub)
178
- s.extend(SearsApi::ProductDetails)
216
+ s.extend(SearsApi::ProductDetail)
179
217
  s
180
218
  end
181
219
 
@@ -188,4 +226,35 @@ describe "SearsApi" do
188
226
 
189
227
  end
190
228
 
229
+ describe "PromotionDetails Mixin" do
230
+ subject do
231
+ s = OpenStruct.new(:resp => stub)
232
+ s.extend(SearsApi::PromotionDetails)
233
+ s
234
+ end
235
+
236
+ it "creates a deligate" do
237
+ ex = {:foo => 'bar'}
238
+ subject.resp.stub_chain(:first,:[],:[]).and_return([ex])
239
+ OpenStruct.should_receive(:new).with(ex)
240
+ subject.deligate
241
+ end
242
+ end
243
+
244
+ describe "ShowStoreLocator Mixin" do
245
+
246
+ subject do
247
+ s = OpenStruct.new(:resp => stub)
248
+ s.extend(SearsApi::ShowStoreLocator)
249
+ s
250
+ end
251
+
252
+ it "creates a deligate" do
253
+ ex = {:foo => 'bar'}
254
+ subject.resp.stub_chain(:first,:[],:[],:[]).and_return([ex])
255
+ OpenStruct.should_receive(:new).with(ex)
256
+ subject.deligate
257
+ end
258
+
259
+ end
191
260
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sears-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-24 00:00:00.000000000 Z
12
+ date: 2012-01-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
16
- requirement: &82478760 !ruby/object:Gem::Requirement
16
+ requirement: &72838970 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *82478760
24
+ version_requirements: *72838970
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: ick
27
- requirement: &82477480 !ruby/object:Gem::Requirement
27
+ requirement: &72857400 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *82477480
35
+ version_requirements: *72857400
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: active_support
38
- requirement: &82476360 !ruby/object:Gem::Requirement
38
+ requirement: &72861410 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *82476360
46
+ version_requirements: *72861410
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &82495120 !ruby/object:Gem::Requirement
49
+ requirement: &72869590 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *82495120
57
+ version_requirements: *72869590
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: yard
60
- requirement: &82494010 !ruby/object:Gem::Requirement
60
+ requirement: &72868240 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *82494010
68
+ version_requirements: *72868240
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
- requirement: &82493470 !ruby/object:Gem::Requirement
71
+ requirement: &72882920 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *82493470
79
+ version_requirements: *72882920
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: jeweler
82
- requirement: &82492970 !ruby/object:Gem::Requirement
82
+ requirement: &72882060 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *82492970
90
+ version_requirements: *72882060
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rcov
93
- requirement: &82492280 !ruby/object:Gem::Requirement
93
+ requirement: &72880460 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *82492280
101
+ version_requirements: *72880460
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: reek
104
- requirement: &82491670 !ruby/object:Gem::Requirement
104
+ requirement: &72879640 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *82491670
112
+ version_requirements: *72879640
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: roodi
115
- requirement: &82490530 !ruby/object:Gem::Requirement
115
+ requirement: &72879250 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *82490530
123
+ version_requirements: *72879250
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: guard
126
- requirement: &82489760 !ruby/object:Gem::Requirement
126
+ requirement: &72878830 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *82489760
134
+ version_requirements: *72878830
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: rb-inotify
137
- requirement: &82489350 !ruby/object:Gem::Requirement
137
+ requirement: &72878260 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '0'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *82489350
145
+ version_requirements: *72878260
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: rb-fsevent
148
- requirement: &82488720 !ruby/object:Gem::Requirement
148
+ requirement: &72900360 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: '0'
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *82488720
156
+ version_requirements: *72900360
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: rb-fchange
159
- requirement: &82488220 !ruby/object:Gem::Requirement
159
+ requirement: &72898460 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ! '>='
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: '0'
165
165
  type: :development
166
166
  prerelease: false
167
- version_requirements: *82488220
167
+ version_requirements: *72898460
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: libnotify
170
- requirement: &82504560 !ruby/object:Gem::Requirement
170
+ requirement: &72897460 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ! '>='
@@ -175,10 +175,10 @@ dependencies:
175
175
  version: '0'
176
176
  type: :development
177
177
  prerelease: false
178
- version_requirements: *82504560
178
+ version_requirements: *72897460
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: guard-bundler
181
- requirement: &82503760 !ruby/object:Gem::Requirement
181
+ requirement: &72896580 !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
184
184
  - - ! '>='
@@ -186,10 +186,10 @@ dependencies:
186
186
  version: '0'
187
187
  type: :development
188
188
  prerelease: false
189
- version_requirements: *82503760
189
+ version_requirements: *72896580
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: guard-rspec
192
- requirement: &82503230 !ruby/object:Gem::Requirement
192
+ requirement: &72895640 !ruby/object:Gem::Requirement
193
193
  none: false
194
194
  requirements:
195
195
  - - ! '>='
@@ -197,10 +197,10 @@ dependencies:
197
197
  version: '0'
198
198
  type: :development
199
199
  prerelease: false
200
- version_requirements: *82503230
200
+ version_requirements: *72895640
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: simplecov
203
- requirement: &82502320 !ruby/object:Gem::Requirement
203
+ requirement: &72894600 !ruby/object:Gem::Requirement
204
204
  none: false
205
205
  requirements:
206
206
  - - ! '>='
@@ -208,10 +208,10 @@ dependencies:
208
208
  version: '0'
209
209
  type: :development
210
210
  prerelease: false
211
- version_requirements: *82502320
211
+ version_requirements: *72894600
212
212
  - !ruby/object:Gem::Dependency
213
213
  name: flay
214
- requirement: &82543280 !ruby/object:Gem::Requirement
214
+ requirement: &72893760 !ruby/object:Gem::Requirement
215
215
  none: false
216
216
  requirements:
217
217
  - - ! '>='
@@ -219,10 +219,10 @@ dependencies:
219
219
  version: '0'
220
220
  type: :development
221
221
  prerelease: false
222
- version_requirements: *82543280
222
+ version_requirements: *72893760
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: flog
225
- requirement: &82542800 !ruby/object:Gem::Requirement
225
+ requirement: &72892860 !ruby/object:Gem::Requirement
226
226
  none: false
227
227
  requirements:
228
228
  - - ! '>='
@@ -230,8 +230,8 @@ dependencies:
230
230
  version: '0'
231
231
  type: :development
232
232
  prerelease: false
233
- version_requirements: *82542800
234
- description: just your basic wrapper
233
+ version_requirements: *72892860
234
+ description: just your basic wrapper'
235
235
  email: rjspotter@gmail.com
236
236
  executables: []
237
237
  extensions: []
@@ -267,7 +267,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
267
267
  version: '0'
268
268
  segments:
269
269
  - 0
270
- hash: 948318095
270
+ hash: 995301999
271
271
  required_rubygems_version: !ruby/object:Gem::Requirement
272
272
  none: false
273
273
  requirements: