sears-api 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: