spree_api 2.0.8 → 2.0.9

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: f6416ddb13bbe8f04930a3af747fecd032eb9bfa
4
- data.tar.gz: fda21f8c9d73dc334d9826e01d6e362da9dc3526
3
+ metadata.gz: b4f74781ea0934c3fecc2b6bfabf934360efce72
4
+ data.tar.gz: fa04ae4fd788014ba5a0f23abf4ab5120fb04e68
5
5
  SHA512:
6
- metadata.gz: a17ad20ff0392f2ae1ce3cf51baf5b7d224d6890e0d279d9dc77b46070b415ba71f40d04ec55352069c616c270eb2b99787685cc32cfea5f0e2d51f12e5b31e5
7
- data.tar.gz: 132136db66a648b0457fe9c2063586c126f28654327441457da85b800cac154b2a694a622a15cb892450a7efb244534172f55d3aab85521c625bef696bebc1bf
6
+ metadata.gz: 016441c31d86a96ebc8a362c8c254bcf682aa164a1fb418d961884ad7e92351ae863deca84299ba88b52c5c78f08aad9bfdb66d8b92bb58da82168ad1296c6c3
7
+ data.tar.gz: 0f3762b3c07a6089b7055a68d2114234724ab2c0ab450702e40d0a77d66e953ac1596143b02e8d3bd7cd0c5619815df4d8c4b7f7e43af7140dc1ee7deda40a08
data/CHANGELOG.md CHANGED
@@ -1,14 +1 @@
1
- ## Spree 2.0.8 (unreleased) ##
2
-
3
- * When line items are added after the delivery state, the shipments are now recreated. #3914
4
-
5
- Washington Luiz
6
-
7
- * State names are now persisted on addresses when using `ensure_state_from_api`, even if the state does not exist as a `Spree::State`. e976a3bbd603ea981499f440fa69f2e6d0d930d7
8
-
9
- Washington Luiz
10
-
11
- * Times are now returned with millisecond precision. (Note: this patch is not in the 2-1-stable or master branches because Rails 4 does this by default.)
12
-
13
- Washington Luiz
14
-
1
+ ## Spree 2.0.9 (unreleased) ##
@@ -28,7 +28,7 @@ module Spree
28
28
 
29
29
  def set_jsonp_format
30
30
  if params[:callback] && request.get?
31
- self.response_body = "#{params[:callback]}(#{self.response_body})"
31
+ self.response_body = "#{params[:callback]}(#{response.body})"
32
32
  headers["Content-Type"] = 'application/javascript'
33
33
  end
34
34
  end
@@ -1,8 +1,6 @@
1
1
  module Spree
2
2
  module Api
3
3
  class CheckoutsController < Spree::Api::BaseController
4
-
5
- before_filter :load_order, only: [:show, :update, :next, :advance]
6
4
  before_filter :associate_user, only: :update
7
5
 
8
6
  include Spree::Core::ControllerHelpers::Auth
@@ -18,6 +16,7 @@ module Spree
18
16
  end
19
17
 
20
18
  def next
19
+ load_order(true)
21
20
  authorize! :update, @order, params[:order_token]
22
21
  @order.next!
23
22
  respond_with(@order, default_template: 'spree/api/orders/show', status: 200)
@@ -26,16 +25,19 @@ module Spree
26
25
  end
27
26
 
28
27
  def advance
28
+ load_order(true)
29
29
  authorize! :update, @order, params[:order_token]
30
30
  while @order.next; end
31
31
  respond_with(@order, default_template: 'spree/api/orders/show', status: 200)
32
32
  end
33
33
 
34
34
  def show
35
+ load_order
35
36
  respond_with(@order, default_template: 'spree/api/orders/show', status: 200)
36
37
  end
37
38
 
38
39
  def update
40
+ load_order(true)
39
41
  authorize! :update, @order, params[:order_token]
40
42
  order_params = object_params
41
43
  user_id = order_params.delete(:user_id)
@@ -53,14 +55,6 @@ module Spree
53
55
  end
54
56
  end
55
57
 
56
- def next
57
- @order.next!
58
- authorize! :update, @order, params[:order_token]
59
- respond_with(@order, :default_template => 'spree/api/orders/show', :status => 200)
60
- rescue StateMachine::InvalidTransition
61
- respond_with(@order, :default_template => 'spree/api/orders/could_not_transition', :status => 422)
62
- end
63
-
64
58
  private
65
59
 
66
60
  def object_params
@@ -88,9 +82,8 @@ module Spree
88
82
  false
89
83
  end
90
84
 
91
- def load_order
92
- @order = Spree::Order.find_by_number!(params[:id])
93
- authorize! :read, @order, params[:order_token]
85
+ def load_order(lock = false)
86
+ @order = Spree::Order.lock(lock).find_by_number!(params[:id])
94
87
  raise_insufficient_quantity and return if @order.insufficient_stock_lines.present?
95
88
  @order.state = params[:state] if params[:state]
96
89
  state_callback(:before)
@@ -3,7 +3,7 @@ module Spree
3
3
  class OrdersController < Spree::Api::BaseController
4
4
  respond_to :json
5
5
 
6
- before_filter :authorize_read!, :except => [:index, :search, :create]
6
+ before_filter :find_and_authorize!, :except => [:index, :search, :create]
7
7
 
8
8
  def index
9
9
  # should probably look at turning this into a CanCan step
@@ -19,33 +19,32 @@ module Spree
19
19
  def create
20
20
  nested_params[:line_items_attributes] = sanitize_line_items(nested_params[:line_items_attributes])
21
21
  @order = Order.build_from_api(current_api_user, nested_params)
22
- respond_with(order, :default_template => :show, :status => 201)
22
+ respond_with(@order, :default_template => :show, :status => 201)
23
23
  end
24
24
 
25
25
  def update
26
- authorize! :update, Order
27
26
  # Parsing line items through as an update_attributes call in the API will result in
28
27
  # many line items for the same variant_id being created. We must be smarter about this,
29
28
  # hence the use of the update_line_items method, defined within order_decorator.rb.
30
29
  line_items_params = sanitize_line_items(nested_params.delete("line_items_attributes"))
31
- if order.update_attributes(nested_params)
32
- order.update_line_items(line_items_params)
33
- order.line_items.reload
34
- order.update!
35
- respond_with(order, :default_template => :show)
30
+ if @order.update_attributes(nested_params)
31
+ @order.update_line_items(line_items_params)
32
+ @order.line_items.reload
33
+ @order.update!
34
+ respond_with(@order, :default_template => :show)
36
35
  else
37
- invalid_resource!(order)
36
+ invalid_resource!(@order)
38
37
  end
39
38
  end
40
39
 
41
40
  def cancel
42
- order.cancel!
41
+ @order.cancel!
43
42
  render :show
44
43
  end
45
44
 
46
45
  def empty
47
- order.empty!
48
- order.update!
46
+ @order.empty!
47
+ @order.update!
49
48
  render :text => nil, :status => 200
50
49
  end
51
50
 
@@ -70,8 +69,9 @@ module Spree
70
69
  line_item_attributes = Hash[line_item_attributes].delete_if { |k,v| v.empty? }
71
70
  end
72
71
 
73
- def order
74
- @order ||= Order.find_by_number!(params[:id])
72
+ def find_order(lock = false)
73
+ @order = Spree::Order.lock(lock).find_by_number!(params[:id])
74
+ authorize! :update, @order, params[:order_token]
75
75
  end
76
76
 
77
77
  def next!(options={})
@@ -82,8 +82,9 @@ module Spree
82
82
  end
83
83
  end
84
84
 
85
- def authorize_read!
86
- authorize! :read, order
85
+ def find_and_authorize!
86
+ find_order(true)
87
+ authorize! :read, @order
87
88
  end
88
89
  end
89
90
  end
@@ -60,8 +60,32 @@ module Spree
60
60
 
61
61
  def update
62
62
  authorize! :update, Product
63
+
64
+ variants_attributes = params[:product].delete(:variants_attributes) || []
65
+ option_type_attributes = params[:product].delete(:option_types) || []
66
+ set_up_shipping_category
67
+
63
68
  @product = find_product(params[:id])
64
69
  if @product.update_attributes(params[:product])
70
+ variants_attributes.each do |variant_attribute|
71
+ # update the variant if the id is present in the payload
72
+ if variant_attribute['id'].present?
73
+ @product.variants.find(variant_attribute['id'].to_i).update_attributes(variant_attribute)
74
+ else
75
+ variant = @product.variants.new
76
+ variant.update_attributes(variant_attribute)
77
+ end
78
+ end
79
+
80
+ option_type_attributes.each do |name|
81
+ option_type = OptionType.where(name: name).first_or_initialize do |option_type|
82
+ option_type.presentation = name
83
+ option_type.save!
84
+ end
85
+
86
+ @product.option_types << option_type unless @product.option_types.include?(option_type)
87
+ end
88
+
65
89
  respond_with(@product, :status => 200, :default_template => :show)
66
90
  else
67
91
  invalid_resource!(@product)
@@ -67,7 +67,7 @@ Spree::Order.class_eval do
67
67
  shipment.shipping_rates.create!(:shipping_method => shipping_method,
68
68
  :cost => s[:cost])
69
69
  rescue Exception => e
70
- raise "#{e.message} #{s}"
70
+ raise "Order import shipments: #{e.message} #{s}"
71
71
  end
72
72
  end
73
73
  end
@@ -81,7 +81,7 @@ Spree::Order.class_eval do
81
81
  payment.payment_method = Spree::PaymentMethod.find_by_name!(p[:payment_method])
82
82
  payment.save!
83
83
  rescue Exception => e
84
- raise "#{e.message} #{p}"
84
+ raise "Order import payments: #{e.message} #{p}"
85
85
  end
86
86
  end
87
87
  end
@@ -96,7 +96,7 @@ Spree::Order.class_eval do
96
96
  line_item = self.contents.add(Spree::Variant.find(line_item[:variant_id]), line_item[:quantity])
97
97
  line_item.update_attributes(extra_params, as: :api) unless extra_params.empty?
98
98
  rescue Exception => e
99
- raise "#{e.message} #{line_item}"
99
+ raise "Order import line items: #{e.message} #{line_item}"
100
100
  end
101
101
  end
102
102
  end
@@ -109,7 +109,7 @@ Spree::Order.class_eval do
109
109
  adjustment.save!
110
110
  adjustment.finalize!
111
111
  rescue Exception => e
112
- raise "#{e.message} #{a}"
112
+ raise "Order import adjustments: #{e.message} #{a}"
113
113
  end
114
114
  end
115
115
  end
@@ -121,7 +121,7 @@ Spree::Order.class_eval do
121
121
  hash.delete(:sku)
122
122
  end
123
123
  rescue Exception => e
124
- raise "#{e.message} #{hash}"
124
+ raise "Ensure order import variant: #{e.message} #{hash}"
125
125
  end
126
126
  end
127
127
 
@@ -144,7 +144,7 @@ Spree::Order.class_eval do
144
144
  address[:country_id] = Spree::Country.where(search).first!.id
145
145
 
146
146
  rescue Exception => e
147
- raise "#{e.message} #{search}"
147
+ raise "Ensure order import address country: #{e.message} #{search}"
148
148
  end
149
149
  end
150
150
 
@@ -168,7 +168,7 @@ Spree::Order.class_eval do
168
168
  address[:state_name] = search[:name] || search[:abbr]
169
169
  end
170
170
  rescue Exception => e
171
- raise "#{e.message} #{search}"
171
+ raise "Ensure order import address state: #{e.message} #{search}"
172
172
  end
173
173
  end
174
174
 
@@ -2,3 +2,6 @@ object @image
2
2
  attributes *image_attributes
3
3
  attributes :viewable_type, :viewable_id
4
4
  node(:attachment_url) { |i| i.attachment.to_s }
5
+ Spree::Image.attachment_definitions[:attachment][:styles].each do |k,v|
6
+ node("#{k}_url") { |i| i.attachment.url(k) }
7
+ end
@@ -4,6 +4,6 @@ node(:total_count) { @products.total_count }
4
4
  node(:current_page) { params[:page] ? params[:page].to_i : 1 }
5
5
  node(:pages) { @products.num_pages }
6
6
  node(:per_page) { params[:per_page] || Kaminari.config.default_per_page }
7
- child(@products) do
7
+ child(@products => :products) do
8
8
  extends "spree/api/products/show"
9
9
  end
@@ -14,7 +14,7 @@ child(@variants => :variants) do
14
14
  end
15
15
  end
16
16
 
17
- child(:stock_items) do
17
+ child(:stock_items => :stock_items) do
18
18
  attributes :id, :count_on_hand, :stock_location_id, :backorderable
19
19
  attribute :available? => :available
20
20
 
data/config/routes.rb CHANGED
@@ -22,7 +22,7 @@ Spree::Core::Engine.routes.draw do
22
22
  end
23
23
  end
24
24
 
25
- resources :variants, :only => [:index]
25
+ resources :variants, :only => [:index, :show]
26
26
 
27
27
  resources :option_types do
28
28
  resources :option_values
@@ -296,10 +296,13 @@ module Spree
296
296
  end
297
297
 
298
298
  it "responds with orders updated_at with miliseconds precision" do
299
+ if ActiveRecord::Base.connection.adapter_name == "Mysql2"
300
+ pending "MySQL does not support millisecond timestamps."
301
+ end
302
+
299
303
  api_get :index
300
304
  milisecond = order.updated_at.strftime("%L")
301
305
  updated_at = json_response["orders"].first["updated_at"]
302
-
303
306
  expect(updated_at.split("T").last).to have_content(milisecond)
304
307
  end
305
308
 
@@ -13,6 +13,16 @@ module Spree
13
13
  :price => 19.99,
14
14
  :shipping_category_id => create(:shipping_category).id }
15
15
  end
16
+ let(:attributes_for_variant) do
17
+ h = attributes_for(:variant).except(:is_master, :product)
18
+ h.delete(:option_values)
19
+ h.merge({
20
+ options: [
21
+ { name: "size", value: "small" },
22
+ { name: "color", value: "black" }
23
+ ]
24
+ })
25
+ end
16
26
 
17
27
  before do
18
28
  stub_authentication!
@@ -82,6 +92,13 @@ module Spree
82
92
  response.body.should =~ /^callback\(.*\)$/
83
93
  response.header['Content-Type'].should include('application/javascript')
84
94
  end
95
+
96
+ # Regression test for #4332
97
+ it "does not escape quotes" do
98
+ api_get :index, {:callback => 'callback'}
99
+ response.body.should =~ /^callback\({"count":1,"total_count":1/
100
+ response.header['Content-Type'].should include('application/javascript')
101
+ end
85
102
  end
86
103
 
87
104
  it "can search for products" do
@@ -192,97 +209,6 @@ module Spree
192
209
 
193
210
  describe "creating products with" do
194
211
  it "embedded variants" do
195
- def attributes_for_variant
196
- h = attributes_for(:variant).except(:is_master, :product)
197
- h.delete(:option_values)
198
- h.merge({
199
- options: [
200
- { name: "size", value: "small" },
201
- { name: "color", value: "black" }
202
- ]
203
- })
204
- end
205
-
206
- attributes = product_hash
207
-
208
- attributes.merge!({
209
- shipping_category_id: 1,
210
-
211
- option_types: ['size', 'color'],
212
-
213
- variants_attributes: [
214
- attributes_for_variant,
215
- attributes_for_variant
216
- ]
217
- })
218
-
219
- api_post :create, :product => attributes
220
-
221
- expect(json_response['variants'].count).to eq(3) # 1 master + 2 variants
222
- expect(json_response['variants'][1]['option_values'][0]['name']).to eq('small')
223
- expect(json_response['variants'][1]['option_values'][0]['option_type_name']).to eq('size')
224
-
225
- expect(json_response['option_types'].count).to eq(2) # size, color
226
- end
227
-
228
- it "embedded product_properties" do
229
- attributes = product_hash
230
-
231
- attributes.merge!({
232
- shipping_category_id: 1,
233
-
234
- product_properties_attributes: [{
235
- property_name: "fabric",
236
- value: "cotton"
237
- }]
238
- })
239
-
240
- api_post :create, :product => attributes
241
-
242
- expect(json_response['product_properties'][0]['property_name']).to eq('fabric')
243
- expect(json_response['product_properties'][0]['value']).to eq('cotton')
244
- end
245
-
246
- it "option_types even if without variants" do
247
- attributes = product_hash
248
-
249
- attributes.merge!({
250
- shipping_category_id: 1,
251
-
252
- option_types: ['size', 'color']
253
- })
254
-
255
- api_post :create, :product => attributes
256
-
257
- expect(json_response['option_types'].count).to eq(2)
258
- end
259
-
260
- it "creates with shipping categories" do
261
- hash = { :name => "The Other Product",
262
- :price => 19.99,
263
- :shipping_category => "Free Ships" }
264
-
265
- api_post :create, :product => hash
266
- expect(response.status).to eq 201
267
-
268
- shipping_id = ShippingCategory.find_by_name("Free Ships").id
269
- expect(json_response['shipping_category_id']).to eq shipping_id
270
- end
271
- end
272
-
273
- describe "creating products with" do
274
- it "embedded variants" do
275
- def attributes_for_variant
276
- h = attributes_for(:variant).except(:is_master, :product)
277
- h.delete(:option_values)
278
- h.merge({
279
- options: [
280
- { name: "size", value: "small" },
281
- { name: "color", value: "black" }
282
- ]
283
- })
284
- end
285
-
286
212
  product_hash.merge!({
287
213
  variants_attributes: [
288
214
  attributes_for_variant,
@@ -292,7 +218,6 @@ module Spree
292
218
 
293
219
  api_post :create, :product => product_hash
294
220
  expect(response.status).to eq 201
295
- expect(json_response['variants'].count).to eq(3) # 1 master + 2 variants
296
221
 
297
222
  variants = json_response['variants'].select { |v| !v['is_master'] }
298
223
  expect(variants.first['option_values'][0]['name']).to eq('small')
@@ -376,6 +301,13 @@ module Spree
376
301
  response.status.should == 200
377
302
  end
378
303
 
304
+ it "updates shipping category properly if provided" do
305
+ api_put :update, :id => product.to_param, :product => { :shipping_category => "New Ships" }
306
+ expect(response.status).to eq 200
307
+ shipping_id = ShippingCategory.find_by_name("New Ships").id
308
+ expect(json_response['shipping_category_id']).to eq shipping_id
309
+ end
310
+
379
311
  it "cannot update a product with an invalid attribute" do
380
312
  api_put :update, :id => product.to_param, :product => { :name => "" }
381
313
  response.status.should == 422
@@ -389,6 +321,41 @@ module Spree
389
321
  response.status.should == 204
390
322
  product.reload.deleted_at.should_not be_nil
391
323
  end
324
+
325
+ describe "updating products with" do
326
+ it "embedded option types" do
327
+ api_put :update, :id => product.to_param, :product => { :option_types => ['shape', 'color'] }
328
+ json_response['option_types'].count.should eq(2)
329
+ end
330
+
331
+ it "new variants" do
332
+ api_put :update, :id => product.to_param, :product => { :variants_attributes => [attributes_for_variant, attributes_for_variant] }
333
+ response.status.should == 200
334
+ json_response['variants'].count.should == 3 # 1 master + 2 variants
335
+
336
+ variants = json_response['variants'].select { |v| !v['is_master'] }
337
+ variants.last['option_values'][0]['name'].should == 'small'
338
+ variants.last['option_values'][0]['option_type_name'].should == 'size'
339
+
340
+ json_response['option_types'].count.should == 2 # size, color
341
+ end
342
+
343
+ it "updating an existing variant" do
344
+ variant_hash = {
345
+ :sku => '123', :price => 19.99, :options => [{:name => "size", :value => "small"}]
346
+ }
347
+ variant = product.variants.new
348
+ variant.update_attributes(variant_hash)
349
+
350
+ api_put :update, :id => product.to_param, :product => { :variants_attributes => [variant_hash.merge(:id => variant.id.to_s, :sku => '456', :options => [{:name => "size", :value => "large" }])] }
351
+
352
+ json_response['variants'].count.should == 2 # 1 master + 2 variants
353
+ variants = json_response['variants'].select { |v| !v['is_master'] }
354
+ variants.last['option_values'][0]['name'].should == 'large'
355
+ variants.last['sku'].should == '456'
356
+ variants.count.should == 1
357
+ end
358
+ end
392
359
  end
393
360
  end
394
361
  end
@@ -133,7 +133,7 @@ module Spree
133
133
  end
134
134
 
135
135
  it "can mark a return authorization as received on the order with an inventory unit" do
136
- FactoryGirl.create(:new_return_authorization, :order => order)
136
+ FactoryGirl.create(:new_return_authorization, :order => order, :stock_location_id => order.shipments.first.stock_location.id)
137
137
  return_authorization = order.return_authorizations.first
138
138
  return_authorization.state.should == "authorized"
139
139
 
@@ -87,27 +87,42 @@ module Spree
87
87
  end
88
88
  end
89
89
 
90
- it "can see a single variant" do
91
- api_get :show, :id => variant.to_param
92
- json_response.should have_attributes(attributes)
93
- option_values = json_response["option_values"]
94
- option_values.first.should have_attributes([:name,
95
- :presentation,
96
- :option_type_name,
97
- :option_type_id])
98
- end
90
+ context "single variant" do
99
91
 
100
- it "can see a single variant with images" do
101
- variant.images.create!(:attachment => image("thinking-cat.jpg"))
92
+ it "can see a single variant" do
93
+ api_get :show, :id => variant.to_param
94
+ json_response.should have_attributes(attributes)
95
+ option_values = json_response["option_values"]
96
+ option_values.first.should have_attributes([:name,
97
+ :presentation,
98
+ :option_type_name,
99
+ :option_type_id])
100
+ end
102
101
 
103
- api_get :show, :id => variant.to_param
102
+ it "can see a single variant with images" do
103
+ variant.images.create!(:attachment => image("thinking-cat.jpg"))
104
+
105
+ api_get :show, :id => variant.to_param
106
+
107
+ json_response.should have_attributes(attributes + [:images])
108
+ option_values = json_response["option_values"]
109
+ option_values.first.should have_attributes([:name,
110
+ :presentation,
111
+ :option_type_name,
112
+ :option_type_id])
113
+ end
114
+
115
+ it 'shows variant image urls' do
116
+ variant.images.create!(:attachment => image("thinking-cat.jpg"))
117
+
118
+ api_get :show, :id => variant.to_param
119
+
120
+ images = json_response["images"]
121
+ image = images.first
122
+
123
+ expect(image).to have_attributes [:mini_url, :small_url, :product_url, :large_url]
124
+ end
104
125
 
105
- json_response.should have_attributes(attributes + [:images])
106
- option_values = json_response["option_values"]
107
- option_values.first.should have_attributes([:name,
108
- :presentation,
109
- :option_type_name,
110
- :option_type_id])
111
126
  end
112
127
 
113
128
  it "can learn how to create a new variant" do
data/spree_api.gemspec CHANGED
@@ -16,6 +16,6 @@ Gem::Specification.new do |gem|
16
16
  gem.version = version
17
17
 
18
18
  gem.add_dependency 'spree_core', version
19
- gem.add_dependency 'rabl', '0.8.4'
20
- gem.add_dependency 'versioncake', '1.0.0'
19
+ gem.add_dependency 'rabl', '0.9.3'
20
+ gem.add_dependency 'versioncake', '~> 1.2.0'
21
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.8
4
+ version: 2.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Bigg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-22 00:00:00.000000000 Z
11
+ date: 2014-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree_core
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 2.0.8
19
+ version: 2.0.9
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 2.0.8
26
+ version: 2.0.9
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rabl
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.8.4
33
+ version: 0.9.3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.8.4
40
+ version: 0.9.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: versioncake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '='
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.0.0
47
+ version: 1.2.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '='
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.0.0
54
+ version: 1.2.0
55
55
  description: Spree's API
56
56
  email:
57
57
  - ryan@spreecommerce.com