cornerstore 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,8 @@
1
+ module Cornerstore
2
+ module Resource
3
+ require 'cornerstore/resource/base'
4
+ require 'cornerstore/resource/remote'
5
+ require 'cornerstore/resource/writable'
6
+ require 'cornerstore/resource/filter'
7
+ end
8
+ end
@@ -0,0 +1,83 @@
1
+ class Cornerstore::Resource::Base
2
+ include Enumerable
3
+ attr_accessor :parent
4
+
5
+ def initialize(parent = nil, ary = nil, name = nil)
6
+ @klass = Cornerstore.const_get(self.class.name.split('::')[-2])
7
+ @name = name
8
+ @parent = parent
9
+ @filters = Hash.new
10
+ @objects = Array.new
11
+ from_array(ary) if ary.is_a? Array
12
+ end
13
+
14
+ def from_array(ary)
15
+ @objects = ary.map{|h| @klass.new(h, @parent)}
16
+ @load = true
17
+ end
18
+
19
+ def find(*args)
20
+ ids = Array.new(args).flatten.compact.uniq
21
+ case ids.size
22
+ when 0
23
+ raise "Couldn't find #{@klass.name} without an ID"
24
+ when 1
25
+ find_by_id_or_param(ids.first)
26
+ else
27
+ find_by_ids(ids)
28
+ end
29
+ end
30
+
31
+ def find_by_id_or_param(id_or_param)
32
+ find_by_id id_or_param.to_s
33
+ end
34
+
35
+ def find_by_id(id)
36
+ @objects.find{|obj| obj._id == id}
37
+ end
38
+
39
+ def find_by_ids(*args)
40
+ ids = Array.new(args).flatten.compact.uniq
41
+ all.select{|item| ids.include? item._id }
42
+ end
43
+
44
+ def all
45
+ self.clone
46
+ end
47
+
48
+ def push(obj)
49
+ @objects << obj
50
+ obj.parent = @parent
51
+ self
52
+ end
53
+ alias_method :<<, :push
54
+
55
+ def to_a
56
+ @objects
57
+ end
58
+ alias_method :to_ary, :to_a
59
+
60
+ def each(&block)
61
+ to_a.each(&block)
62
+ end
63
+
64
+ def size
65
+ @objects.size
66
+ end
67
+ alias_method :count, :size
68
+ alias_method :length, :size
69
+
70
+ def empty?
71
+ @objects.empty?
72
+ end
73
+
74
+ alias blank? empty?
75
+
76
+ def method_missing(method, *args, &block)
77
+ if Cornerstore::Resource::Writable.method_defined?(method)
78
+ raise "Sorry, this part of the Cornerstore-API is currently read-only"
79
+ else
80
+ super
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,21 @@
1
+ module Cornerstore::Resource::Filter
2
+ def set_filter(key, value)
3
+ @filters[key] = value
4
+ self
5
+ end
6
+
7
+ def offset(offset)
8
+ self.clone.set_filter(:offset, offset.to_i.abs)
9
+ end
10
+
11
+ def limit(limit)
12
+ limit = limit.to_i.abs
13
+ raise "limit must be greater/equal to 1" unless limit > 1
14
+ self.clone.set_filter(:limit, limit)
15
+ end
16
+
17
+ def order(key)
18
+ self.clone.set_filter(:order, key)
19
+ end
20
+ alias order_by order
21
+ end
@@ -0,0 +1,27 @@
1
+ module Cornerstore::Resource::Remote
2
+ def url(id = nil, depth = 1)
3
+ root = (@parent && depth > 0) ? @parent.url(depth-1) : Cornerstore.root_url
4
+ "#{root}/#{@name or @klass.name.split('::').last.underscore.pluralize}/#{id}"
5
+ end
6
+
7
+ def find_by_id(id)
8
+ object = super
9
+ object or fetch(id)
10
+ end
11
+
12
+ def fetch(id)
13
+ response = RestClient.get(url(id), Cornerstore.headers)
14
+ hash = ActiveSupport::JSON.decode(response)
15
+ @klass.new(hash, @parent)
16
+ end
17
+
18
+ def fetch_all
19
+ response = RestClient.get(url, Cornerstore.headers)
20
+ from_array ActiveSupport::JSON.decode(response)
21
+ end
22
+
23
+ def to_a
24
+ fetch_all unless @load
25
+ super
26
+ end
27
+ end
@@ -0,0 +1,20 @@
1
+ module Cornerstore::Resource::Writable
2
+ def destroy_all
3
+ @objects.delete_if {|obj| obj.destroy}
4
+ self
5
+ end
6
+
7
+ def new(attributes={}, &block)
8
+ @klass.new(attributes, &block).tap{|obj| push obj}
9
+ end
10
+
11
+ def create(attributes={}, &block)
12
+ obj = @klass.new(attributes, @parent, &block)
13
+ if obj.save
14
+ push obj
15
+ obj
16
+ else
17
+ nil
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module Cornerstore
2
+ VERSION = '0.6.2'
3
+ end
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cornerstore::Order do
4
+ before(:all) do
5
+ json = '{"_id":"53448a01417175b106ec0000","_slugs":["14521135"],"billing_address":{"_id":"53448a05417175b1069e0300","addition":null,"company":null,"country":"United States","firstname":"Ellis","name":"Bailey","number":"441","state":"New Hampshire","street":"Karli View","town":"North Penelope","zip":"26662"},"canceled_email_callback_url":"http://burger-store.dev/mails/canceled_notification","cart_url":"http://burger-store.dev/cart","checkout_id":"13d583c4340d9bfe52aa1f7cb92735c5f5b748135f170b4d5cd752c9fd25f149","checkout_started_at":null,"created_at":"2014-04-08T09:24:57.556Z","customer_comment":null,"customer_id":"53448a05417175b1069f0300","delivery_note_pdf_callback_url":null,"invoice_number":null,"invoice_pdf_callback_url":"http://burger-store.dev/documents/invoice","invoiced_at":null,"line_items":[{"_id":"53448a01417175b106ed0000","created_at":"2014-04-08T23:45:05.575Z","description":"PepsiCo Welch\'s Grape Soda – Packungsgröße: 12er Pack","order_number":"SBS-0009B","price":{"gross":15.5,"currency":"EUR","net":13.03,"tax_rate":0.19,"tax":2.47},"product_id":"53448a00417175b106450000","qty":5,"requires_shipment":true,"total":{"gross":77.5,"currency":"EUR","net":65.13,"tax_rate":0.19,"tax":12.37},"total_weight":15.0,"unit":"Pack","updated_at":"2014-04-08T23:45:05.575Z","variant_id":"53448a00417175b106480000","weight":3.0},{"_id":"53448a01417175b106ee0000","created_at":"2014-04-08T23:45:05.576Z","description":"PepsiCo Welch\'s Grape Soda – Packungsgröße: 24er Pack","order_number":"SBS-0009C","price":{"gross":25.5,"currency":"EUR","net":21.43,"tax_rate":0.19,"tax":4.07},"product_id":"53448a00417175b106450000","qty":2,"requires_shipment":true,"total":{"gross":51.0,"currency":"EUR","net":42.86,"tax_rate":0.19,"tax":8.14},"total_weight":12.0,"unit":"Pack","updated_at":"2014-04-08T23:45:05.576Z","variant_id":"53448a00417175b1064a0000","weight":6.0},{"_id":"53448a01417175b106ef0000","created_at":"2014-04-08T23:45:05.576Z","description":"Branston Relish – Geschmack: Chili \u0026 Jalapeño","order_number":"SBS-0010B","price":{"gross":9.99,"currency":"EUR","net":8.39,"tax_rate":0.19,"tax":1.6},"product_id":"53448a00417175b1064c0000","qty":2,"requires_shipment":true,"total":{"gross":19.98,"currency":"EUR","net":16.79,"tax_rate":0.19,"tax":3.19},"total_weight":1.0,"unit":"Tube","updated_at":"2014-04-08T23:45:05.576Z","variant_id":"53448a00417175b1064f0000","weight":0.5},{"_id":"53448a01417175b106f00000","created_at":"2014-04-08T23:45:05.576Z","description":"PepsiCo Pepsi Cola – Packungsgröße: 6er Pack, Geschmack: Diet","order_number":"SBS-0007A","price":{"gross":5.99,"currency":"EUR","net":5.03,"tax_rate":0.19,"tax":0.96},"product_id":"53448a00417175b1062b0000","qty":1,"requires_shipment":true,"total":{"gross":5.99,"currency":"EUR","net":5.03,"tax_rate":0.19,"tax":0.96},"total_weight":1.75,"unit":"Pack","updated_at":"2014-04-08T23:45:05.576Z","variant_id":"53448a00417175b1062c0000","weight":1.75},{"_id":"53448a01417175b106f10000","created_at":"2014-04-08T23:45:05.577Z","description":"Heinz Tomato Ketchup – Größe: Groß (500g)","order_number":"SBS-0012B","price":{"gross":5.5,"currency":"EUR","net":4.62,"tax_rate":0.19,"tax":0.88},"product_id":"53448a00417175b106530000","qty":2,"requires_shipment":true,"total":{"gross":11.0,"currency":"EUR","net":9.24,"tax_rate":0.19,"tax":1.76},"total_weight":1.0,"unit":"Glas","updated_at":"2014-04-08T23:45:05.577Z","variant_id":"53448a00417175b106560000","weight":0.5},{"_id":"53448a01417175b106f20000","created_at":"2014-04-08T23:45:05.577Z","description":"PepsiCo Pepsi Cola – Packungsgröße: 24er Pack, Geschmack: Wild Cherry","order_number":"SBS-0007F","price":{"gross":15.99,"currency":"EUR","net":13.44,"tax_rate":0.19,"tax":2.55},"product_id":"53448a00417175b1062b0000","qty":2,"requires_shipment":true,"total":{"gross":31.98,"currency":"EUR","net":26.87,"tax_rate":0.19,"tax":5.11},"total_weight":12.0,"unit":"Pack","updated_at":"2014-04-08T23:45:05.577Z","variant_id":"53448a00417175b1063b0000","weight":6.0},{"_id":"53448a01417175b106f30000","created_at":"2014-04-08T23:45:05.577Z","description":"PepsiCo Mountain Dew – Packungsgröße: 12er Pack","order_number":"SBS-0008B","price":{"gross":15.5,"currency":"EUR","net":13.03,"tax_rate":0.19,"tax":2.47},"product_id":"53448a00417175b1063e0000","qty":5,"requires_shipment":true,"total":{"gross":77.5,"currency":"EUR","net":65.13,"tax_rate":0.19,"tax":12.37},"total_weight":null,"unit":"Pack","updated_at":"2014-04-08T23:45:05.577Z","variant_id":"53448a00417175b106410000","weight":null}],"merchant_id":"534489ff417175b106000000","number":"14521135","paid_email_callback_url":"http://burger-store.dev/mails/paid_notification","payment_costs":null,"payment_means":{"_id":"53448a07417175b1064a0400","created_at":"2014-04-08T23:45:11.731Z","kind":"Cash","paid_at":"2014-04-08T23:45:19+00:00","refunded_at":null,"updated_at":"2014-04-08T23:45:19.468Z"},"placed_at":"2014-04-08T09:34:57+00:00","placed_email_callback_url":"http://burger-store.dev/mails/placed_notification","reference":"13d583c4340d9bfe52aa1f7cb92735c5f5b748135f170b4d5cd752c9fd25f149","requested_carrier":{"name":"UPS","service":"Express","supports_cod":false},"sales_tax":null,"shipments":[{"_id":"53448a0c417175b106bc0400","carrier":{"name":"UPS","service":"Express","supports_cod":false},"created_at":"2014-04-08T23:45:16.196Z","shipped_items":["53448a01417175b106ed0000","53448a01417175b106ee0000","53448a01417175b106ef0000","53448a01417175b106f00000","53448a01417175b106f10000","53448a01417175b106f20000","53448a01417175b106f30000"],"tracking_number":"DXD993882F","updated_at":"2014-04-08T23:45:16.196Z"}],"shipped_email_callback_url":"http://burger-store.dev/mails/shipped_notification","shipping_address":{"_id":"53448a05417175b1069d0300","addition":null,"company":"Osinski-Bradtke","country":"United States","firstname":"Clara","name":"Volkman","number":"634","state":"Florida","street":"Lind Mount","town":"New Demario","zip":"95413"},"shipping_costs":{"gross":78.99,"currency":"EUR","net":66.38,"tax_rate":0.19,"tax":12.61},"subtotal":{"gross":274.95,"currency":"EUR","net":231.05,"tax_rate":0.19,"tax":43.9},"success_redirect_url":"http://burger-store.dev/carts/success","total":{"gross":353.94,"currency":"EUR","net":297.43,"tax_rate":0.19,"tax":56.51},"updated_at":"2014-04-08T23:45:13.562Z","weight":42.75,"customer":{"_id":"53448a05417175b1069f0300","allows_marketing":false,"created_at":"2014-04-08T23:45:09.148Z","email":"brycen_hauck@reynolds.name","flagged":false,"merchant_id":"534489ff417175b106000000","phone":null,"tax_number":null,"updated_at":"2014-04-08T23:45:09.148Z"}}'
6
+ @order = Cornerstore::Order.new(JSON.parse(json))
7
+ end
8
+
9
+ context 'regarding basic attributes' do
10
+ it 'should correctly return basic attributes' do
11
+ expect(@order.id).to eq('53448a01417175b106ec0000')
12
+ expect(@order.number).to eq('14521135')
13
+ expect(@order.reference).to eq('13d583c4340d9bfe52aa1f7cb92735c5f5b748135f170b4d5cd752c9fd25f149')
14
+ expect(@order.weight).to eq(42.75)
15
+ end
16
+
17
+ it 'should return the prices' do
18
+ expect(@order.subtotal.amount).to eq(274.95)
19
+ expect(@order.shipping_costs.amount).to eq(78.99)
20
+ expect(@order.payment_costs).to eq(nil)
21
+ expect(@order.sales_tax).to eq(nil)
22
+ expect(@order.total.amount).to eq(353.94)
23
+ end
24
+
25
+ it 'should return the requested carrier' do
26
+ expect(@order.requested_carrier.name).to eq('UPS')
27
+ expect(@order.requested_carrier.service).to eq('Express')
28
+ end
29
+ end
30
+
31
+ context 'regarding associated objects' do
32
+ it 'should return the customer' do
33
+ expect(@order.customer.class).to eq(Cornerstore::Customer)
34
+ expect(@order.customer.email).to eq('brycen_hauck@reynolds.name')
35
+ end
36
+
37
+ it 'should return a billing address' do
38
+ expect(@order.billing_address.class).to eq(Cornerstore::Address)
39
+ expect(@order.billing_address.name).to eq('Bailey')
40
+ expect(@order.billing_address.firstname).to eq('Ellis')
41
+ expect(@order.billing_address.number).to eq('441')
42
+ expect(@order.billing_address.street).to eq('Karli View')
43
+ expect(@order.billing_address.town).to eq('North Penelope')
44
+ expect(@order.billing_address.country).to eq('United States')
45
+ end
46
+
47
+ it 'should return a shipping address' do
48
+ expect(@order.billing_address.class).to eq(Cornerstore::Address)
49
+ end
50
+
51
+ it 'should return the line items' do
52
+ expect(@order.line_items.count).to eq(7)
53
+ expect(@order.line_items.first.description).to eq('PepsiCo Welch\'s Grape Soda – Packungsgröße: 12er Pack')
54
+ expect(@order.line_items.first.qty).to eq(5)
55
+ expect(@order.line_items.first.weight).to eq(3.0)
56
+ expect(@order.line_items.first.price.amount).to eq(15.50)
57
+ expect(@order.line_items.first.total.amount).to eq(15.50 * 5)
58
+ end
59
+
60
+ it 'should return shipments and shipped line items' do
61
+ expect(@order.completely_shipped?).to eq(true)
62
+ expect(@order.shipments.first.line_items.count).to eq(@order.line_items.count)
63
+ expect(@order.shipments.first.tracking_number).to eq('DXD993882F')
64
+ expect(@order.shipments.first.carrier.name).to eq('UPS')
65
+ expect(@order.shipments.first.carrier.service).to eq('Express')
66
+ end
67
+
68
+ it 'should return cancellations and canceled line items' do
69
+ expect(@order.completely_canceled?).to eq(false)
70
+ expect(@order.cancellations.first).to eq(nil)
71
+ end
72
+
73
+ it 'should return payment means' do
74
+ expect(@order.payment_means.class).to eq(Cornerstore::PaymentMeans)
75
+ expect(@order.payment_means.kind).to eq('Cash')
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cornerstore::Price do
4
+ context 'regarding basic attributes' do
5
+ it 'should correctly return amount and currency' do
6
+ p = Cornerstore::Price.new({'amount' => 29.00, 'currency' => 'USD'})
7
+
8
+ expect(p.amount).to eq(29.00)
9
+ expect(p.currency).to eq('USD')
10
+ expect(p.currency_symbol).to eq('$')
11
+ end
12
+
13
+ it 'should correctly return attributes for VAT prices' do
14
+ p = Cornerstore::Price.new({'gross' => 17.85, 'net' => 15.00, 'tax_rate' => 0.19, 'currency' => 'EUR'})
15
+
16
+ expect(p.amount).to eq(17.85)
17
+ expect(p.gross).to eq(17.85)
18
+ expect(p.net).to eq(15.00)
19
+ expect(p.tax_rate).to eq(0.19)
20
+ expect(p.currency).to eq('EUR')
21
+ expect(p.currency_symbol).to eq('€')
22
+ end
23
+ end
24
+
25
+ context 'regarding math operations' do
26
+ it 'should compare two prices' do
27
+ p1 = Cornerstore::Price.new({'amount' => 29.00, 'currency' => 'USD'})
28
+ p2 = Cornerstore::Price.new({'amount' => 35.00, 'currency' => 'USD'})
29
+
30
+ expect(p2 > 20).to eql(true)
31
+ expect(p2 > 40).to eql(false)
32
+ expect(p2 > p1).to eql(true)
33
+ end
34
+
35
+ it 'should sum two prices' do
36
+ p1 = Cornerstore::Price.new({'amount' => 29.00, 'currency' => 'USD'})
37
+ p2 = Cornerstore::Price.new({'amount' => 35.00, 'currency' => 'USD'})
38
+
39
+ p3 = p1 + p2
40
+ expect(p3.amount).to eql(64.00)
41
+
42
+ p1 = Cornerstore::Price.new({'gross' => 17.85, 'net' => 15.00, 'tax_rate' => 0.19, 'currency' => 'EUR'})
43
+ p2 = Cornerstore::Price.new({'gross' => 9.52, 'net' => 8.00, 'tax_rate' => 0.19, 'currency' => 'EUR'})
44
+
45
+ p3 = p1 + p2
46
+ expect(p3.gross).to eql(27.37)
47
+ expect(p3.net).to eql(23.00)
48
+ expect(p3.tax_rate).to eql(0.19)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,22 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'cornerstore'
5
+
6
+ # This file was generated by the `rspec --init` command. Conventionally, all
7
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
8
+ # Require this file using `require "spec_helper"` to ensure that it is only
9
+ # loaded once.
10
+ #
11
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
12
+ RSpec.configure do |config|
13
+ config.treat_symbols_as_metadata_keys_with_true_values = true
14
+ config.run_all_when_everything_filtered = true
15
+ config.filter_run :focus
16
+
17
+ # Run specs in random order to surface order dependencies. If you find an
18
+ # order dependency and want to debug it, you can fix the order by providing
19
+ # the seed, which is printed after each run.
20
+ # --seed 1234
21
+ config.order = 'random'
22
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cornerstore
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.2
5
+ platform: ruby
6
+ authors:
7
+ - Johannes Treitz
8
+ - Christian Weyer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-05-29 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rest-client
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: activemodel
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ description: This is a client for the Cornerstore e-commerce API
57
+ email:
58
+ - jt@crispymtn.com
59
+ - cw@crispymtn.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".gitignore"
65
+ - ".rspec"
66
+ - Gemfile
67
+ - README.md
68
+ - Rakefile
69
+ - cornerstore.gemspec
70
+ - examples/cornerstore.yml
71
+ - lib/cornerstore.rb
72
+ - lib/cornerstore/api.rb
73
+ - lib/cornerstore/api/address.rb
74
+ - lib/cornerstore/api/cancellation.rb
75
+ - lib/cornerstore/api/carrier.rb
76
+ - lib/cornerstore/api/cart.rb
77
+ - lib/cornerstore/api/collection.rb
78
+ - lib/cornerstore/api/customer.rb
79
+ - lib/cornerstore/api/differentiating_property.rb
80
+ - lib/cornerstore/api/image.rb
81
+ - lib/cornerstore/api/line_item.rb
82
+ - lib/cornerstore/api/order.rb
83
+ - lib/cornerstore/api/payment_means.rb
84
+ - lib/cornerstore/api/price.rb
85
+ - lib/cornerstore/api/product.rb
86
+ - lib/cornerstore/api/property.rb
87
+ - lib/cornerstore/api/search.rb
88
+ - lib/cornerstore/api/shipment.rb
89
+ - lib/cornerstore/api/variant.rb
90
+ - lib/cornerstore/model.rb
91
+ - lib/cornerstore/resource.rb
92
+ - lib/cornerstore/resource/base.rb
93
+ - lib/cornerstore/resource/filter.rb
94
+ - lib/cornerstore/resource/remote.rb
95
+ - lib/cornerstore/resource/writable.rb
96
+ - lib/cornerstore/version.rb
97
+ - spec/order_spec.rb
98
+ - spec/price_spec.rb
99
+ - spec/spec_helper.rb
100
+ homepage: https://www.github.com/crispymtn/cornerstore-gem
101
+ licenses: []
102
+ metadata: {}
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 2.0.3
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: This is a client for the Cornerstore e-commerce API
123
+ test_files:
124
+ - spec/order_spec.rb
125
+ - spec/price_spec.rb
126
+ - spec/spec_helper.rb