spree_api 2.0.8 → 2.0.9

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.
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