spree_api 1.0.7 → 1.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +6 -0
  3. data/LICENSE +19 -23
  4. data/README.md +22 -10
  5. data/Rakefile +30 -0
  6. data/app/controllers/spree/api/v1/base_controller.rb +71 -0
  7. data/app/controllers/spree/api/v1/images_controller.rb +46 -0
  8. data/app/controllers/spree/api/v1/line_items_controller.rb +40 -0
  9. data/app/controllers/spree/api/v1/orders_controller.rb +53 -0
  10. data/app/controllers/spree/api/v1/products_controller.rb +46 -0
  11. data/app/controllers/spree/api/v1/variants_controller.rb +56 -0
  12. data/app/helpers/spree/api/api_helpers.rb +44 -0
  13. data/app/models/spree/line_item_decorator.rb +3 -0
  14. data/app/models/spree/option_value_decorator.rb +5 -0
  15. data/app/models/spree/order_decorator.rb +12 -0
  16. data/app/models/spree/user_decorator.rb +11 -0
  17. data/app/views/spree/api/v1/errors/invalid_api_key.rabl +2 -0
  18. data/app/views/spree/api/v1/errors/invalid_resource.rabl +3 -0
  19. data/app/views/spree/api/v1/errors/must_specify_api_key.rabl +2 -0
  20. data/app/views/spree/api/v1/errors/not_found.rabl +2 -0
  21. data/app/views/spree/api/v1/errors/unauthorized.rabl +2 -0
  22. data/app/views/spree/api/v1/images/show.rabl +2 -0
  23. data/app/views/spree/api/v1/line_items/new.rabl +3 -0
  24. data/app/views/spree/api/v1/line_items/show.rabl +5 -0
  25. data/app/views/spree/api/v1/orders/address.rabl +0 -0
  26. data/app/views/spree/api/v1/orders/cart.rabl +0 -0
  27. data/app/views/spree/api/v1/orders/complete.rabl +0 -0
  28. data/app/views/spree/api/v1/orders/could_not_transition.rabl +3 -0
  29. data/app/views/spree/api/v1/orders/delivery.rabl +3 -0
  30. data/app/views/spree/api/v1/orders/index.rabl +7 -0
  31. data/app/views/spree/api/v1/orders/invalid_shipping_method.rabl +2 -0
  32. data/app/views/spree/api/v1/orders/payment.rabl +0 -0
  33. data/app/views/spree/api/v1/orders/show.rabl +3 -0
  34. data/app/views/spree/api/v1/products/index.rabl +8 -0
  35. data/app/views/spree/api/v1/products/new.rabl +3 -0
  36. data/app/views/spree/api/v1/products/product.rabl +1 -0
  37. data/app/views/spree/api/v1/products/show.rabl +21 -0
  38. data/app/views/spree/api/v1/variants/index.rabl +3 -0
  39. data/app/views/spree/api/v1/variants/new.rabl +2 -0
  40. data/app/views/spree/api/v1/variants/show.rabl +3 -0
  41. data/app/views/spree/api/v1/variants/variant.rabl +1 -0
  42. data/config/locales/en.yml +11 -15
  43. data/config/routes.rb +14 -28
  44. data/db/migrate/{20100107141738_add_api_key_to_users.rb → 20100107141738_add_api_key_to_spree_users.rb} +1 -1
  45. data/lib/spree/api.rb +7 -4
  46. data/lib/spree/api/controller_setup.rb +27 -0
  47. data/lib/spree/api/engine.rb +3 -13
  48. data/lib/spree/api/version.rb +5 -0
  49. data/lib/spree_api.rb +0 -2
  50. data/script/rails +5 -0
  51. data/spec/controllers/spree/api/v1/base_controller_spec.rb +29 -0
  52. data/spec/controllers/spree/api/v1/images_controller_spec.rb +50 -0
  53. data/spec/controllers/spree/api/v1/line_items_controller_spec.rb +77 -0
  54. data/spec/controllers/spree/api/v1/orders_controller_spec.rb +148 -0
  55. data/spec/controllers/spree/api/v1/products_controller_spec.rb +159 -0
  56. data/spec/controllers/spree/api/v1/variants_controller_spec.rb +90 -0
  57. data/spec/fixtures/thinking-cat.jpg +0 -0
  58. data/spec/models/spree/order_spec.rb +18 -0
  59. data/spec/models/spree/user_spec.rb +19 -0
  60. data/spec/spec_helper.rb +28 -0
  61. data/spec/support/api_helpers.rb +68 -0
  62. data/spec/support/controller_hacks.rb +27 -0
  63. data/spree_api.gemspec +24 -0
  64. metadata +123 -56
  65. data/app/assets/javascripts/admin/spree.js +0 -4
  66. data/app/assets/javascripts/admin/spree_api.js +0 -2
  67. data/app/assets/javascripts/store/spree.js +0 -4
  68. data/app/assets/javascripts/store/spree_api.js +0 -2
  69. data/app/assets/stylesheets/admin/spree.css +0 -6
  70. data/app/assets/stylesheets/admin/spree_api.css +0 -4
  71. data/app/assets/stylesheets/store/spree.css +0 -6
  72. data/app/assets/stylesheets/store/spree_api.css +0 -4
  73. data/app/controllers/spree/admin/users_controller_decorator.rb +0 -17
  74. data/app/controllers/spree/api/base_controller.rb +0 -172
  75. data/app/controllers/spree/api/countries_controller.rb +0 -3
  76. data/app/controllers/spree/api/inventory_units_controller.rb +0 -18
  77. data/app/controllers/spree/api/line_items_controller.rb +0 -20
  78. data/app/controllers/spree/api/orders_controller.rb +0 -19
  79. data/app/controllers/spree/api/products_controller.rb +0 -14
  80. data/app/controllers/spree/api/shipments_controller.rb +0 -35
  81. data/app/controllers/spree/api/states_controller.rb +0 -8
  82. data/app/models/line_item_decorator.rb +0 -7
  83. data/app/models/order_decorator.rb +0 -9
  84. data/app/models/shipment_decorator.rb +0 -9
  85. data/app/models/user_decorator.rb +0 -19
  86. data/app/overrides/api_admin_user_edit_form.rb +0 -6
  87. data/app/views/spree/admin/users/_api_fields.html.erb +0 -16
Binary file
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Order do
5
+ let(:user) { stub_model(User) }
6
+
7
+ it 'can build an order from API parameters' do
8
+
9
+ Spree::Variant.should_receive(:find).and_return(stub_model(Variant, :id => 1))
10
+ order = Order.build_from_api(user, { :line_items => { 1 => 5 }})
11
+
12
+ order.user.should == user
13
+ line_item = order.line_items.first
14
+ line_item.quantity.should == 5
15
+ line_item.variant_id.should == 1
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe User do
5
+ let(:user) { User.new }
6
+
7
+ it "can generate an API key" do
8
+ user.should_receive(:save!)
9
+ user.generate_api_key!
10
+ user.api_key.should_not be_blank
11
+ end
12
+
13
+ it "can clear an API key" do
14
+ user.should_receive(:save!)
15
+ user.clear_api_key!
16
+ user.api_key.should be_blank
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV["RAILS_ENV"] ||= 'test'
3
+ require File.expand_path("../dummy/config/environment", __FILE__)
4
+ require 'rspec/rails'
5
+ require 'rspec/autorun'
6
+
7
+ # Requires supporting ruby files with custom matchers and macros, etc,
8
+ # in spec/support/ and its subdirectories.
9
+ Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
10
+
11
+ require 'spree/core/testing_support/factories'
12
+
13
+ RSpec.configure do |config|
14
+ config.backtrace_clean_patterns = [/gems\/activesupport/, /gems\/actionpack/, /gems\/rspec/]
15
+
16
+ config.before(:suite) do
17
+ DatabaseCleaner.strategy = :transaction
18
+ DatabaseCleaner.clean_with(:truncation)
19
+ end
20
+
21
+ config.before(:each) do
22
+ DatabaseCleaner.start
23
+ end
24
+
25
+ config.after(:each) do
26
+ DatabaseCleaner.clean
27
+ end
28
+ end
@@ -0,0 +1,68 @@
1
+ module ApiHelpers
2
+ def json_response
3
+ JSON.parse(response.body)
4
+ end
5
+
6
+ def assert_unauthorized!
7
+ json_response.should == { "error" => "You are not authorized to perform that action." }
8
+ response.status.should == 401
9
+ end
10
+
11
+ def stub_authentication!
12
+ controller.stub :check_for_api_key
13
+ Spree::User.stub :find_by_api_key => current_api_user
14
+ end
15
+
16
+ # This method can be overriden (with a let block) inside a context
17
+ # For instance, if you wanted to have an admin user instead.
18
+ def current_api_user
19
+ @current_api_user ||= stub_model(Spree::User, :email => "spree@example.com")
20
+ end
21
+
22
+ def image(filename)
23
+ path = Pathname.new(__FILE__) + "../../../spec/fixtures" + filename
24
+ File.open(path)
25
+ end
26
+
27
+ def upload_image(filename)
28
+ fixture_file_upload(image(filename).path)
29
+ end
30
+ end
31
+
32
+ module ApiTestSetup
33
+ def sign_in_as_admin!
34
+ let!(:current_api_user) do
35
+ user = stub_model(Spree::User)
36
+ user.should_receive(:has_role?).any_number_of_times.with("admin").and_return(true)
37
+ user
38
+ end
39
+ end
40
+
41
+ # Default kaminari's pagination to a certain range
42
+ # Means that you don't need to create 25 objects to test pagination
43
+ def default_per_page(count)
44
+ before do
45
+ @current_default_per_page = Kaminari.config.default_per_page
46
+ Kaminari.config.default_per_page = 1
47
+ end
48
+
49
+ after do
50
+ Kaminari.config.default_per_page = @current_default_per_page
51
+ end
52
+ end
53
+ end
54
+
55
+ RSpec.configure do |config|
56
+ config.include ApiHelpers, :type => :controller
57
+ config.extend ApiTestSetup, :type => :controller
58
+ end
59
+
60
+ RSpec::Matchers.define :have_attributes do |expected_attributes|
61
+ match do |actual|
62
+ # actual is a Hash object representing an object, like this:
63
+ # { "product" => { "name" => "Product #1" } }
64
+ actual_attributes = actual.values.first.keys.map(&:to_sym)
65
+ expected_attributes.map(&:to_sym).all? { |attr| actual_attributes.include?(attr) }
66
+ end
67
+ end
68
+
@@ -0,0 +1,27 @@
1
+ require 'active_support/all'
2
+ module ControllerHacks
3
+ def api_get(action, params={}, session=nil, flash=nil)
4
+ api_process(action, params, session, flash, "GET")
5
+ end
6
+
7
+ def api_post(action, params={}, session=nil, flash=nil)
8
+ api_process(action, params, session, flash, "POST")
9
+ end
10
+
11
+ def api_put(action, params={}, session=nil, flash=nil)
12
+ api_process(action, params, session, flash, "PUT")
13
+ end
14
+
15
+ def api_delete(action, params={}, session=nil, flash=nil)
16
+ api_process(action, params, session, flash, "DELETE")
17
+ end
18
+
19
+ def api_process(action, params={}, session=nil, flash=nil, method="get")
20
+ scoping = respond_to?(:resource_scoping) ? resource_scoping : {}
21
+ process(action, params.merge(scoping).reverse_merge!(:use_route => :spree, :format => :json), session, { :foo => "bar" }, method)
22
+ end
23
+ end
24
+
25
+ RSpec.configure do |config|
26
+ config.include ControllerHacks, :type => :controller
27
+ end
data/spree_api.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ version = File.read(File.expand_path("../../SPREE_VERSION", __FILE__)).strip
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Ryan Bigg"]
6
+ gem.email = ["ryan@spreecommerce.com"]
7
+ gem.description = %q{Spree's API}
8
+ gem.summary = %q{Spree's API}
9
+ gem.homepage = ""
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "spree_api"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = version
17
+
18
+ gem.add_dependency 'spree_core', version
19
+ gem.add_dependency 'spree_auth', version
20
+ gem.add_dependency 'rabl', '0.6.5'
21
+
22
+ gem.add_development_dependency 'rspec-rails', '2.9.0'
23
+ gem.add_development_dependency 'database_cleaner'
24
+ end
metadata CHANGED
@@ -1,86 +1,142 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
5
- prerelease:
4
+ version: 1.1.0.rc1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
- - David North
8
+ - Ryan Bigg
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-04 00:00:00.000000000 Z
12
+ date: 2012-04-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: spree_core
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &70247364495880 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - '='
19
+ - - =
20
20
  - !ruby/object:Gem::Version
21
- version: 1.0.7
21
+ version: 1.1.0.rc1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
24
+ version_requirements: *70247364495880
25
+ - !ruby/object:Gem::Dependency
26
+ name: spree_auth
27
+ requirement: &70247364495000 !ruby/object:Gem::Requirement
25
28
  none: false
26
29
  requirements:
27
- - - '='
30
+ - - =
28
31
  - !ruby/object:Gem::Version
29
- version: 1.0.7
32
+ version: 1.1.0.rc1
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70247364495000
30
36
  - !ruby/object:Gem::Dependency
31
- name: spree_auth
32
- requirement: !ruby/object:Gem::Requirement
37
+ name: rabl
38
+ requirement: &70247364494060 !ruby/object:Gem::Requirement
33
39
  none: false
34
40
  requirements:
35
- - - '='
41
+ - - =
36
42
  - !ruby/object:Gem::Version
37
- version: 1.0.7
43
+ version: 0.6.5
38
44
  type: :runtime
39
45
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
46
+ version_requirements: *70247364494060
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec-rails
49
+ requirement: &70247364509720 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - =
53
+ - !ruby/object:Gem::Version
54
+ version: 2.9.0
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70247364509720
58
+ - !ruby/object:Gem::Dependency
59
+ name: database_cleaner
60
+ requirement: &70247364509000 !ruby/object:Gem::Requirement
41
61
  none: false
42
62
  requirements:
43
- - - '='
63
+ - - ! '>='
44
64
  - !ruby/object:Gem::Version
45
- version: 1.0.7
46
- description: Required dependency for Spree
47
- email: david@spreecommerce.com
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70247364509000
69
+ description: Spree's API
70
+ email:
71
+ - ryan@spreecommerce.com
48
72
  executables: []
49
73
  extensions: []
50
74
  extra_rdoc_files: []
51
75
  files:
76
+ - .gitignore
77
+ - Gemfile
52
78
  - LICENSE
53
79
  - README.md
54
- - app/assets/javascripts/admin/spree.js
55
- - app/assets/javascripts/admin/spree_api.js
56
- - app/assets/javascripts/store/spree.js
57
- - app/assets/javascripts/store/spree_api.js
58
- - app/assets/stylesheets/admin/spree.css
59
- - app/assets/stylesheets/admin/spree_api.css
60
- - app/assets/stylesheets/store/spree.css
61
- - app/assets/stylesheets/store/spree_api.css
62
- - app/controllers/spree/admin/users_controller_decorator.rb
63
- - app/controllers/spree/api/base_controller.rb
64
- - app/controllers/spree/api/countries_controller.rb
65
- - app/controllers/spree/api/inventory_units_controller.rb
66
- - app/controllers/spree/api/line_items_controller.rb
67
- - app/controllers/spree/api/orders_controller.rb
68
- - app/controllers/spree/api/products_controller.rb
69
- - app/controllers/spree/api/shipments_controller.rb
70
- - app/controllers/spree/api/states_controller.rb
71
- - app/models/line_item_decorator.rb
72
- - app/models/order_decorator.rb
73
- - app/models/shipment_decorator.rb
74
- - app/models/user_decorator.rb
75
- - app/overrides/api_admin_user_edit_form.rb
76
- - app/views/spree/admin/users/_api_fields.html.erb
80
+ - Rakefile
81
+ - app/controllers/spree/api/v1/base_controller.rb
82
+ - app/controllers/spree/api/v1/images_controller.rb
83
+ - app/controllers/spree/api/v1/line_items_controller.rb
84
+ - app/controllers/spree/api/v1/orders_controller.rb
85
+ - app/controllers/spree/api/v1/products_controller.rb
86
+ - app/controllers/spree/api/v1/variants_controller.rb
87
+ - app/helpers/spree/api/api_helpers.rb
88
+ - app/models/spree/line_item_decorator.rb
89
+ - app/models/spree/option_value_decorator.rb
90
+ - app/models/spree/order_decorator.rb
91
+ - app/models/spree/user_decorator.rb
92
+ - app/views/spree/api/v1/errors/invalid_api_key.rabl
93
+ - app/views/spree/api/v1/errors/invalid_resource.rabl
94
+ - app/views/spree/api/v1/errors/must_specify_api_key.rabl
95
+ - app/views/spree/api/v1/errors/not_found.rabl
96
+ - app/views/spree/api/v1/errors/unauthorized.rabl
97
+ - app/views/spree/api/v1/images/show.rabl
98
+ - app/views/spree/api/v1/line_items/new.rabl
99
+ - app/views/spree/api/v1/line_items/show.rabl
100
+ - app/views/spree/api/v1/orders/address.rabl
101
+ - app/views/spree/api/v1/orders/cart.rabl
102
+ - app/views/spree/api/v1/orders/complete.rabl
103
+ - app/views/spree/api/v1/orders/could_not_transition.rabl
104
+ - app/views/spree/api/v1/orders/delivery.rabl
105
+ - app/views/spree/api/v1/orders/index.rabl
106
+ - app/views/spree/api/v1/orders/invalid_shipping_method.rabl
107
+ - app/views/spree/api/v1/orders/payment.rabl
108
+ - app/views/spree/api/v1/orders/show.rabl
109
+ - app/views/spree/api/v1/products/index.rabl
110
+ - app/views/spree/api/v1/products/new.rabl
111
+ - app/views/spree/api/v1/products/product.rabl
112
+ - app/views/spree/api/v1/products/show.rabl
113
+ - app/views/spree/api/v1/variants/index.rabl
114
+ - app/views/spree/api/v1/variants/new.rabl
115
+ - app/views/spree/api/v1/variants/show.rabl
116
+ - app/views/spree/api/v1/variants/variant.rabl
77
117
  - config/locales/en.yml
78
118
  - config/routes.rb
79
- - lib/spree/api/engine.rb
119
+ - db/migrate/20100107141738_add_api_key_to_spree_users.rb
80
120
  - lib/spree/api.rb
121
+ - lib/spree/api/controller_setup.rb
122
+ - lib/spree/api/engine.rb
123
+ - lib/spree/api/version.rb
81
124
  - lib/spree_api.rb
82
- - db/migrate/20100107141738_add_api_key_to_users.rb
83
- homepage: http://spreecommerce.com
125
+ - script/rails
126
+ - spec/controllers/spree/api/v1/base_controller_spec.rb
127
+ - spec/controllers/spree/api/v1/images_controller_spec.rb
128
+ - spec/controllers/spree/api/v1/line_items_controller_spec.rb
129
+ - spec/controllers/spree/api/v1/orders_controller_spec.rb
130
+ - spec/controllers/spree/api/v1/products_controller_spec.rb
131
+ - spec/controllers/spree/api/v1/variants_controller_spec.rb
132
+ - spec/fixtures/thinking-cat.jpg
133
+ - spec/models/spree/order_spec.rb
134
+ - spec/models/spree/user_spec.rb
135
+ - spec/spec_helper.rb
136
+ - spec/support/api_helpers.rb
137
+ - spec/support/controller_hacks.rb
138
+ - spree_api.gemspec
139
+ homepage: ''
84
140
  licenses: []
85
141
  post_install_message:
86
142
  rdoc_options: []
@@ -91,21 +147,32 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
147
  requirements:
92
148
  - - ! '>='
93
149
  - !ruby/object:Gem::Version
94
- version: 1.8.7
150
+ version: '0'
151
+ segments:
152
+ - 0
153
+ hash: -3641673168610111779
95
154
  required_rubygems_version: !ruby/object:Gem::Requirement
96
155
  none: false
97
156
  requirements:
98
- - - ! '>='
157
+ - - ! '>'
99
158
  - !ruby/object:Gem::Version
100
- version: '0'
101
- segments:
102
- - 0
103
- hash: 343655292556891042
104
- requirements:
105
- - none
159
+ version: 1.3.1
160
+ requirements: []
106
161
  rubyforge_project:
107
- rubygems_version: 1.8.23
162
+ rubygems_version: 1.8.10
108
163
  signing_key:
109
164
  specification_version: 3
110
- summary: Provides RESTful access for Spree.
111
- test_files: []
165
+ summary: Spree's API
166
+ test_files:
167
+ - spec/controllers/spree/api/v1/base_controller_spec.rb
168
+ - spec/controllers/spree/api/v1/images_controller_spec.rb
169
+ - spec/controllers/spree/api/v1/line_items_controller_spec.rb
170
+ - spec/controllers/spree/api/v1/orders_controller_spec.rb
171
+ - spec/controllers/spree/api/v1/products_controller_spec.rb
172
+ - spec/controllers/spree/api/v1/variants_controller_spec.rb
173
+ - spec/fixtures/thinking-cat.jpg
174
+ - spec/models/spree/order_spec.rb
175
+ - spec/models/spree/user_spec.rb
176
+ - spec/spec_helper.rb
177
+ - spec/support/api_helpers.rb
178
+ - spec/support/controller_hacks.rb
@@ -1,4 +0,0 @@
1
- //= require admin/spree_core
2
- //= require admin/spree_auth
3
- //= require admin/spree_api
4
- //= require admin/spree_promo
@@ -1,2 +0,0 @@
1
- //= require admin/spree_core
2
- //= require admin/spree_auth
@@ -1,4 +0,0 @@
1
- //= require store/spree_core
2
- //= require store/spree_auth
3
- //= require store/spree_api
4
- //= require store/spree_promo
@@ -1,2 +0,0 @@
1
- //= require store/spree_core
2
- //= require store/spree_auth