sears-api 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,27 @@
1
+ source "http://gemcutter.org"
2
+
3
+ gem 'httparty'
4
+ gem 'ick'
5
+ gem 'active_support', :require => false
6
+
7
+ # Add dependencies to develop your gem here.
8
+ # Include everything needed to run rake, tests, features, etc.
9
+ group :development do
10
+ gem "rspec"
11
+ gem "yard"
12
+ gem "bundler"
13
+ gem "jeweler"
14
+ gem "rcov"
15
+ gem "reek"
16
+ gem "roodi"
17
+ gem "guard"
18
+ gem 'rb-inotify', :require => false
19
+ gem 'rb-fsevent', :require => false
20
+ gem 'rb-fchange', :require => false
21
+ gem 'libnotify'
22
+ gem 'guard-bundler'
23
+ gem 'guard-rspec'
24
+ gem 'simplecov', :require => false
25
+ gem 'flay'
26
+ gem 'flog'
27
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,93 @@
1
+ GEM
2
+ remote: http://gemcutter.org/
3
+ specs:
4
+ active_support (3.0.0)
5
+ activesupport (= 3.0.0)
6
+ activesupport (3.0.0)
7
+ diff-lcs (1.1.3)
8
+ ffi (1.0.11)
9
+ flay (1.4.3)
10
+ ruby_parser (~> 2.0)
11
+ sexp_processor (~> 3.0)
12
+ flog (2.5.3)
13
+ ruby_parser (~> 2.0)
14
+ sexp_processor (~> 3.0)
15
+ git (1.2.5)
16
+ guard (0.10.0)
17
+ ffi (>= 0.5.0)
18
+ thor (~> 0.14.6)
19
+ guard-bundler (0.1.3)
20
+ bundler (>= 1.0.0)
21
+ guard (>= 0.2.2)
22
+ guard-rspec (0.6.0)
23
+ guard (>= 0.10.0)
24
+ httparty (0.8.1)
25
+ multi_json
26
+ multi_xml
27
+ ick (0.3.0)
28
+ ruby2ruby (>= 1.1.8)
29
+ jeweler (1.6.4)
30
+ bundler (~> 1.0)
31
+ git (>= 1.2.5)
32
+ rake
33
+ libnotify (0.7.2)
34
+ multi_json (1.0.4)
35
+ multi_xml (0.4.1)
36
+ rake (0.9.2.2)
37
+ rb-fchange (0.0.5)
38
+ ffi
39
+ rb-fsevent (0.4.3.1)
40
+ rb-inotify (0.8.8)
41
+ ffi (>= 0.5.0)
42
+ rcov (0.9.11)
43
+ reek (1.2.8)
44
+ ruby2ruby (~> 1.2)
45
+ ruby_parser (~> 2.0)
46
+ sexp_processor (~> 3.0)
47
+ roodi (2.1.0)
48
+ ruby_parser
49
+ rspec (2.8.0)
50
+ rspec-core (~> 2.8.0)
51
+ rspec-expectations (~> 2.8.0)
52
+ rspec-mocks (~> 2.8.0)
53
+ rspec-core (2.8.0)
54
+ rspec-expectations (2.8.0)
55
+ diff-lcs (~> 1.1.2)
56
+ rspec-mocks (2.8.0)
57
+ ruby2ruby (1.3.1)
58
+ ruby_parser (~> 2.0)
59
+ sexp_processor (~> 3.0)
60
+ ruby_parser (2.3.1)
61
+ sexp_processor (~> 3.0)
62
+ sexp_processor (3.0.10)
63
+ simplecov (0.5.4)
64
+ multi_json (~> 1.0.3)
65
+ simplecov-html (~> 0.5.3)
66
+ simplecov-html (0.5.3)
67
+ thor (0.14.6)
68
+ yard (0.7.4)
69
+
70
+ PLATFORMS
71
+ ruby
72
+
73
+ DEPENDENCIES
74
+ active_support
75
+ bundler
76
+ flay
77
+ flog
78
+ guard
79
+ guard-bundler
80
+ guard-rspec
81
+ httparty
82
+ ick
83
+ jeweler
84
+ libnotify
85
+ rb-fchange
86
+ rb-fsevent
87
+ rb-inotify
88
+ rcov
89
+ reek
90
+ roodi
91
+ rspec
92
+ simplecov
93
+ yard
data/Guardfile ADDED
@@ -0,0 +1,15 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'bundler' do
5
+ watch('Gemfile')
6
+ # Uncomment next line if Gemfile contain `gemspec' command
7
+ # watch(/^.+\.gemspec/)
8
+ end
9
+
10
+ guard 'rspec', :version => 2 do
11
+ watch(%r{^spec/.+_spec\.rb$})
12
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
13
+ watch('spec/spec_helper.rb') { "spec" }
14
+ end
15
+
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 rjspotter
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,49 @@
1
+ = sears-api
2
+
3
+ A somewhat simple wrapper on the Sears Developer API http://developer.sears.com/apis
4
+
5
+ == Installation
6
+
7
+ gem install sears-api
8
+
9
+ == Usage
10
+
11
+ require 'sears-api'
12
+
13
+ SearsApi::Configuration.key = '<your-api-key>'
14
+
15
+ re0 = SearsApi::Client.product_search_by_keyword('craftsman')
16
+
17
+ re1 = SearsApi::Client.product_details(re0.first.part_number)
18
+
19
+ re1.main_image_url #=> "http://s.shld.net/is/image/Sears/00935255000
20
+ re1.description_name #=> "255 pc. Mechanics Tool Set with Lift Top Storage Chest
21
+ # etc.
22
+
23
+ === store methods
24
+
25
+ There are two ways to search a given store (The default is Sears).
26
+ * you can call with at store attribute e.g.
27
+ SearsApi::Client.product_search_by_keyword('craftsman', :store => 'Kmart')
28
+ * but there are convenience methods
29
+ SearsApi::Client.kmart_product_search_by_keyword('craftsman')
30
+
31
+ === Method Missing and Delegation
32
+
33
+ Should do the right thing &trade; in most cases. You should be able to use the underscored versions of method names correlate to the tags/nodes returned by the Sears API XML. Mostly I've chosen the delegate to be the node you likely want but if you want to you can access the HTTParty response directly with SearsApi::Response#resp
34
+
35
+ == Contributing to sears-api
36
+
37
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
38
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
39
+ * Fork the project
40
+ * Start a feature/bugfix branch
41
+ * Commit and push until you are happy with your contribution
42
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
43
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
44
+
45
+ == Copyright
46
+
47
+ Copyright (c) 2012 rjspotter. See LICENSE.txt for
48
+ further details.
49
+
data/Rakefile ADDED
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "sears-api"
18
+ gem.homepage = "http://github.com/rjspotter/sears-api"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{gem for the sears developer api}
21
+ gem.description = %Q{just your basic wrapper}
22
+ gem.email = "rjspotter@gmail.com"
23
+ gem.authors = ["rjspotter"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rspec/core'
29
+ require 'rspec/core/rake_task'
30
+ RSpec::Core::RakeTask.new(:spec) do |spec|
31
+ spec.pattern = FileList['spec/**/*_spec.rb']
32
+ end
33
+
34
+ namespace :metrics do
35
+ desc "shows flog complexity metric"
36
+ task :flog do
37
+ puts `find app lib -name \*.rb -printf "%p " | xargs flog -a`
38
+ end
39
+
40
+ desc "show flay duplication (copy/paste) metric"
41
+ task :flay do
42
+ puts "Flay " + `find app lib -name \*.rb -printf "%p " | xargs flay`
43
+ end
44
+
45
+ desc "run flay and flog"
46
+ task :all => [:flay, :flog]
47
+
48
+ end
49
+
50
+ task :default => :spec
51
+
52
+ require 'yard'
53
+ YARD::Rake::YardocTask.new
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/lib/sears-api.rb ADDED
@@ -0,0 +1,94 @@
1
+ require 'httparty'
2
+ require 'ick'
3
+ require 'active_support/inflector/methods'
4
+ require 'ostruct'
5
+
6
+ module SearsApi
7
+
8
+ class Configuration
9
+ class << self
10
+ attr_accessor :key
11
+ end
12
+
13
+ end
14
+
15
+
16
+ class Client
17
+ include HTTParty
18
+ base_uri 'http://api.developer.sears.com/v1/'
19
+
20
+ class << self
21
+
22
+ def kget(path,opt = {})
23
+ opt[:query] ||= {}
24
+ opt[:query].merge!({:apikey => SearsApi::Configuration.key,
25
+ :store => 'Sears'}) {|k,v1,v2| v1}
26
+ Response.new(get(path, opt))
27
+ end
28
+
29
+ def product_details(part_number, opt = {})
30
+ kget('/productdetails', :query => {:partNumber => part_number}.merge(opt))
31
+ end
32
+
33
+ def product_search_by_keyword(keyword, opt = {})
34
+ kget('/productsearch',
35
+ :query => {:keyword => keyword,:searchType => 'keyword'}.
36
+ merge(opt))
37
+ end
38
+
39
+ # for each foo in the first array create methods prefixed with
40
+ # the store names like kmart_foo, mygofer_foo, sears_foo
41
+ # although sears_foo == foo
42
+ [:product_search_by_keyword, :product_details].each do |meth|
43
+ %w[kmart mygofer sears].each do |store_name|
44
+ define_method("#{store_name}_#{meth.to_s}".to_sym) do |keyword|
45
+ send(meth.to_sym, keyword, :store => store_name.capitalize)
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ module MethodMissingDeligation
55
+
56
+ def method_missing(sym)
57
+ res = Ick::Try.instance.invoke (deligate) {|x| x.send(sym)}
58
+ res ||= Ick::Try.instance.invoke (deligate) {|x| x.send(ActiveSupport::Inflector.camelize(sym.to_s).to_sym) }
59
+ res ||= super
60
+ end
61
+
62
+ end
63
+
64
+ class Response
65
+
66
+ attr_accessor :resp, :deligate
67
+
68
+ include MethodMissingDeligation
69
+
70
+ def initialize(resp)
71
+ @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"
74
+ end
75
+
76
+ end
77
+
78
+ module Search
79
+ def deligate
80
+ resp.first[1]['Products']['Product'].map {|x| Record.new(OpenStruct.new(x))}
81
+ end
82
+ end
83
+
84
+ module ProductDetails
85
+ def deligate
86
+ Record.new(OpenStruct.new(resp.first[1]['SoftHardProductDetails']))
87
+ end
88
+ end
89
+
90
+ Record = Struct.new(:deligate) do
91
+ include MethodMissingDeligation
92
+ end
93
+
94
+ end
data/sears-api.gemspec ADDED
@@ -0,0 +1,109 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "sears-api"
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["rjspotter"]
12
+ s.date = "2012-01-24"
13
+ s.description = "just your basic wrapper"
14
+ s.email = "rjspotter@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "Guardfile",
25
+ "LICENSE.txt",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "lib/sears-api.rb",
30
+ "sears-api.gemspec",
31
+ "spec/sears-api_spec.rb",
32
+ "spec/spec_helper.rb"
33
+ ]
34
+ s.homepage = "http://github.com/rjspotter/sears-api"
35
+ s.licenses = ["MIT"]
36
+ s.require_paths = ["lib"]
37
+ s.rubygems_version = "1.8.11"
38
+ s.summary = "gem for the sears developer api"
39
+
40
+ if s.respond_to? :specification_version then
41
+ s.specification_version = 3
42
+
43
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
44
+ s.add_runtime_dependency(%q<httparty>, [">= 0"])
45
+ s.add_runtime_dependency(%q<ick>, [">= 0"])
46
+ s.add_runtime_dependency(%q<active_support>, [">= 0"])
47
+ s.add_development_dependency(%q<rspec>, [">= 0"])
48
+ s.add_development_dependency(%q<yard>, [">= 0"])
49
+ s.add_development_dependency(%q<bundler>, [">= 0"])
50
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
51
+ s.add_development_dependency(%q<rcov>, [">= 0"])
52
+ s.add_development_dependency(%q<reek>, [">= 0"])
53
+ s.add_development_dependency(%q<roodi>, [">= 0"])
54
+ s.add_development_dependency(%q<guard>, [">= 0"])
55
+ s.add_development_dependency(%q<rb-inotify>, [">= 0"])
56
+ s.add_development_dependency(%q<rb-fsevent>, [">= 0"])
57
+ s.add_development_dependency(%q<rb-fchange>, [">= 0"])
58
+ s.add_development_dependency(%q<libnotify>, [">= 0"])
59
+ s.add_development_dependency(%q<guard-bundler>, [">= 0"])
60
+ s.add_development_dependency(%q<guard-rspec>, [">= 0"])
61
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
62
+ s.add_development_dependency(%q<flay>, [">= 0"])
63
+ s.add_development_dependency(%q<flog>, [">= 0"])
64
+ else
65
+ s.add_dependency(%q<httparty>, [">= 0"])
66
+ s.add_dependency(%q<ick>, [">= 0"])
67
+ s.add_dependency(%q<active_support>, [">= 0"])
68
+ s.add_dependency(%q<rspec>, [">= 0"])
69
+ s.add_dependency(%q<yard>, [">= 0"])
70
+ s.add_dependency(%q<bundler>, [">= 0"])
71
+ s.add_dependency(%q<jeweler>, [">= 0"])
72
+ s.add_dependency(%q<rcov>, [">= 0"])
73
+ s.add_dependency(%q<reek>, [">= 0"])
74
+ s.add_dependency(%q<roodi>, [">= 0"])
75
+ s.add_dependency(%q<guard>, [">= 0"])
76
+ s.add_dependency(%q<rb-inotify>, [">= 0"])
77
+ s.add_dependency(%q<rb-fsevent>, [">= 0"])
78
+ s.add_dependency(%q<rb-fchange>, [">= 0"])
79
+ s.add_dependency(%q<libnotify>, [">= 0"])
80
+ s.add_dependency(%q<guard-bundler>, [">= 0"])
81
+ s.add_dependency(%q<guard-rspec>, [">= 0"])
82
+ s.add_dependency(%q<simplecov>, [">= 0"])
83
+ s.add_dependency(%q<flay>, [">= 0"])
84
+ s.add_dependency(%q<flog>, [">= 0"])
85
+ end
86
+ else
87
+ s.add_dependency(%q<httparty>, [">= 0"])
88
+ s.add_dependency(%q<ick>, [">= 0"])
89
+ s.add_dependency(%q<active_support>, [">= 0"])
90
+ s.add_dependency(%q<rspec>, [">= 0"])
91
+ s.add_dependency(%q<yard>, [">= 0"])
92
+ s.add_dependency(%q<bundler>, [">= 0"])
93
+ s.add_dependency(%q<jeweler>, [">= 0"])
94
+ s.add_dependency(%q<rcov>, [">= 0"])
95
+ s.add_dependency(%q<reek>, [">= 0"])
96
+ s.add_dependency(%q<roodi>, [">= 0"])
97
+ s.add_dependency(%q<guard>, [">= 0"])
98
+ s.add_dependency(%q<rb-inotify>, [">= 0"])
99
+ s.add_dependency(%q<rb-fsevent>, [">= 0"])
100
+ s.add_dependency(%q<rb-fchange>, [">= 0"])
101
+ s.add_dependency(%q<libnotify>, [">= 0"])
102
+ s.add_dependency(%q<guard-bundler>, [">= 0"])
103
+ s.add_dependency(%q<guard-rspec>, [">= 0"])
104
+ s.add_dependency(%q<simplecov>, [">= 0"])
105
+ s.add_dependency(%q<flay>, [">= 0"])
106
+ s.add_dependency(%q<flog>, [">= 0"])
107
+ end
108
+ end
109
+
@@ -0,0 +1,191 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require "ostruct"
3
+
4
+ describe "SearsApi" do
5
+
6
+ describe "Configuration" do
7
+ it "has a key" do
8
+ SearsApi::Configuration.key = "ooof"
9
+ SearsApi::Configuration.key.should == "ooof"
10
+ end
11
+ end
12
+
13
+ describe "Client" do
14
+
15
+ subject {SearsApi::Client}
16
+
17
+ it "includes HTTParty" do
18
+ subject.included_modules.should include(HTTParty)
19
+ end
20
+
21
+ it "has the correct base url" do
22
+ subject.base_uri.should == "http://api.developer.sears.com/v1"
23
+ end
24
+
25
+ it "returns a custom response object" do
26
+ subject.stub(:get) { [] }
27
+ subject.kget('/foo').class.should == SearsApi::Response
28
+ end
29
+
30
+ context "query defaults" do
31
+
32
+ before {SearsApi::Configuration.stub(:key) {'apikey'}}
33
+ let(:qr) {{
34
+ :apikey => 'apikey',
35
+ :store => 'Sears',
36
+ :partNumber => '0'}}
37
+
38
+ it "adds the key and store to the query" do
39
+ subject.should_receive(:get).with('/productdetails', :query => qr)
40
+ subject.kget('/productdetails', :query => {:partNumber => '0'})
41
+ end
42
+
43
+ it "adds the query to the opts if it doesn't exist" do
44
+ subject.should_receive(:get) {|p,o| o[:query].should_not be_nil}
45
+ subject.kget('/productdetails')
46
+ end
47
+
48
+ it "allows for overridding key and store" do
49
+ override_hsh = {
50
+ :apikey => 'key',
51
+ :store => 'Kmart',
52
+ :partNumber => '42'}
53
+ subject.should_receive(:get).with('/productdetails',
54
+ :query => override_hsh)
55
+ subject.kget('/productdetails', :query => override_hsh.clone)
56
+ end
57
+
58
+ end
59
+
60
+ context "product details" do
61
+ it "searches by partnumber" do
62
+ subject.should_receive(:kget).
63
+ with('/productdetails', :query => {:partNumber => 'asdf'})
64
+ subject.product_details('asdf')
65
+ end
66
+ it "has overrides by prefix" do
67
+ subject.should_receive(:kget).
68
+ with('/productdetails', :query => {:partNumber => 'asdf',
69
+ :store => 'Kmart'})
70
+ subject.kmart_product_details('asdf')
71
+ end
72
+ end
73
+
74
+ context "product search" do
75
+
76
+ it "searches by keyword" do
77
+ subject.should_receive(:kget).with('/productsearch',
78
+ :query => {
79
+ :searchType => 'keyword',
80
+ :keyword => 'asdf'})
81
+ subject.product_search_by_keyword('asdf')
82
+ end
83
+
84
+ it "allows overrides" do
85
+ subject.should_receive(:kget).with('/productsearch',
86
+ :query => {
87
+ :store => 'Kmart',
88
+ :searchType => 'keyword',
89
+ :keyword => 'asdf'})
90
+ subject.product_search_by_keyword('asdf', :store => 'Kmart')
91
+ end
92
+
93
+ it "takes the store prefix kmart" do
94
+ subject.should_receive(:product_search_by_keyword).
95
+ with('asdf', :store => 'Kmart')
96
+ subject.kmart_product_search_by_keyword('asdf')
97
+ end
98
+
99
+ it "takes the store prefix mygofer" do
100
+ subject.should_receive(:product_search_by_keyword).
101
+ with('asdf', :store => 'Mygofer')
102
+ subject.mygofer_product_search_by_keyword('asdf')
103
+ end
104
+
105
+ end
106
+
107
+ end
108
+
109
+ describe "Response" do
110
+
111
+ subject {SearsApi::Response}
112
+
113
+ before {@resp = stub.as_null_object}
114
+
115
+ it "takes a generic response and interns it" do
116
+ subject.new(@resp).resp.should == @resp
117
+ end
118
+
119
+ it "is extended with Search if needed" do
120
+ @resp.stub_chain(:first,:first).and_return("MercadoResult")
121
+ subject.new(@resp).singleton_class.included_modules.
122
+ should include(SearsApi::Search)
123
+ end
124
+
125
+ it "is extended with Search if needed" do
126
+ @resp.stub_chain(:first,:first).and_return("ProductDetail")
127
+ subject.new(@resp).singleton_class.included_modules.
128
+ should include(SearsApi::ProductDetails)
129
+ end
130
+
131
+ describe "instance" do
132
+
133
+ subject {SearsApi::Response.new(@resp)}
134
+
135
+ it "calls the delegate" do
136
+ subject.deligate = stub
137
+ subject.deligate.should_receive(:foo_bar_baz).and_return("foo")
138
+ subject.foo_bar_baz
139
+ end
140
+
141
+ it "calls the deligate with the camelized version" do
142
+ subject.deligate = stub
143
+ subject.deligate.stub(:foo_bar_baz) {nil}
144
+ subject.deligate.should_receive(:FooBarBaz).and_return('foo')
145
+ subject.foo_bar_baz
146
+ end
147
+
148
+ it "raises if it doesn't exist" do
149
+ subject.deligate = stub()
150
+ expect {subject.foo_bar}.to raise_error
151
+ end
152
+
153
+ end
154
+
155
+ end
156
+
157
+ describe "Search Results Mixin" do
158
+
159
+ subject do
160
+ s = OpenStruct.new(:resp => stub)
161
+ s.extend(SearsApi::Search)
162
+ s
163
+ end
164
+
165
+ it "creates a deligate" do
166
+ ex = {:foo => 'bar'}
167
+ subject.resp.stub_chain(:first,:[],:[],:[]).and_return([ex])
168
+ OpenStruct.should_receive(:new).with(ex)
169
+ subject.deligate
170
+ end
171
+
172
+ end
173
+
174
+ describe "Product Details Mixin" do
175
+
176
+ subject do
177
+ s = OpenStruct.new(:resp => stub)
178
+ s.extend(SearsApi::ProductDetails)
179
+ s
180
+ end
181
+
182
+ it "creates a deligate" do
183
+ ex = {:foo => 'bar'}
184
+ subject.resp.stub_chain(:first,:[],:[]).and_return(ex)
185
+ OpenStruct.should_receive(:new).with(ex)
186
+ subject.deligate
187
+ end
188
+
189
+ end
190
+
191
+ end
@@ -0,0 +1,15 @@
1
+ require 'simplecov'
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+ require 'rspec'
5
+ require 'rspec/autorun'
6
+ SimpleCov.start
7
+ require 'sears-api'
8
+
9
+ # Requires supporting files with custom matchers and macros, etc,
10
+ # in ./support/ and its subdirectories.
11
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
12
+
13
+ RSpec.configure do |config|
14
+
15
+ end
metadata ADDED
@@ -0,0 +1,283 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sears-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - rjspotter
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: httparty
16
+ requirement: &82478760 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *82478760
25
+ - !ruby/object:Gem::Dependency
26
+ name: ick
27
+ requirement: &82477480 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *82477480
36
+ - !ruby/object:Gem::Dependency
37
+ name: active_support
38
+ requirement: &82476360 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *82476360
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &82495120 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *82495120
58
+ - !ruby/object:Gem::Dependency
59
+ name: yard
60
+ requirement: &82494010 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *82494010
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: &82493470 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *82493470
80
+ - !ruby/object:Gem::Dependency
81
+ name: jeweler
82
+ requirement: &82492970 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *82492970
91
+ - !ruby/object:Gem::Dependency
92
+ name: rcov
93
+ requirement: &82492280 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *82492280
102
+ - !ruby/object:Gem::Dependency
103
+ name: reek
104
+ requirement: &82491670 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *82491670
113
+ - !ruby/object:Gem::Dependency
114
+ name: roodi
115
+ requirement: &82490530 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *82490530
124
+ - !ruby/object:Gem::Dependency
125
+ name: guard
126
+ requirement: &82489760 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: *82489760
135
+ - !ruby/object:Gem::Dependency
136
+ name: rb-inotify
137
+ requirement: &82489350 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: *82489350
146
+ - !ruby/object:Gem::Dependency
147
+ name: rb-fsevent
148
+ requirement: &82488720 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :development
155
+ prerelease: false
156
+ version_requirements: *82488720
157
+ - !ruby/object:Gem::Dependency
158
+ name: rb-fchange
159
+ requirement: &82488220 !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: *82488220
168
+ - !ruby/object:Gem::Dependency
169
+ name: libnotify
170
+ requirement: &82504560 !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: *82504560
179
+ - !ruby/object:Gem::Dependency
180
+ name: guard-bundler
181
+ requirement: &82503760 !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: *82503760
190
+ - !ruby/object:Gem::Dependency
191
+ name: guard-rspec
192
+ requirement: &82503230 !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: *82503230
201
+ - !ruby/object:Gem::Dependency
202
+ name: simplecov
203
+ requirement: &82502320 !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ type: :development
210
+ prerelease: false
211
+ version_requirements: *82502320
212
+ - !ruby/object:Gem::Dependency
213
+ name: flay
214
+ requirement: &82543280 !ruby/object:Gem::Requirement
215
+ none: false
216
+ requirements:
217
+ - - ! '>='
218
+ - !ruby/object:Gem::Version
219
+ version: '0'
220
+ type: :development
221
+ prerelease: false
222
+ version_requirements: *82543280
223
+ - !ruby/object:Gem::Dependency
224
+ name: flog
225
+ requirement: &82542800 !ruby/object:Gem::Requirement
226
+ none: false
227
+ requirements:
228
+ - - ! '>='
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: *82542800
234
+ description: just your basic wrapper
235
+ email: rjspotter@gmail.com
236
+ executables: []
237
+ extensions: []
238
+ extra_rdoc_files:
239
+ - LICENSE.txt
240
+ - README.rdoc
241
+ files:
242
+ - .document
243
+ - .rspec
244
+ - Gemfile
245
+ - Gemfile.lock
246
+ - Guardfile
247
+ - LICENSE.txt
248
+ - README.rdoc
249
+ - Rakefile
250
+ - VERSION
251
+ - lib/sears-api.rb
252
+ - sears-api.gemspec
253
+ - spec/sears-api_spec.rb
254
+ - spec/spec_helper.rb
255
+ homepage: http://github.com/rjspotter/sears-api
256
+ licenses:
257
+ - MIT
258
+ post_install_message:
259
+ rdoc_options: []
260
+ require_paths:
261
+ - lib
262
+ required_ruby_version: !ruby/object:Gem::Requirement
263
+ none: false
264
+ requirements:
265
+ - - ! '>='
266
+ - !ruby/object:Gem::Version
267
+ version: '0'
268
+ segments:
269
+ - 0
270
+ hash: 948318095
271
+ required_rubygems_version: !ruby/object:Gem::Requirement
272
+ none: false
273
+ requirements:
274
+ - - ! '>='
275
+ - !ruby/object:Gem::Version
276
+ version: '0'
277
+ requirements: []
278
+ rubyforge_project:
279
+ rubygems_version: 1.8.11
280
+ signing_key:
281
+ specification_version: 3
282
+ summary: gem for the sears developer api
283
+ test_files: []