spree_devices 1.2.0

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.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +1 -0
  4. data/.rubocop +2 -0
  5. data/.rubocop.yml +37 -0
  6. data/.ruby-gemset +1 -0
  7. data/.ruby-version +1 -0
  8. data/Gemfile +17 -0
  9. data/Gemfile.lock +402 -0
  10. data/Jenkinsfile +68 -0
  11. data/LICENSE +26 -0
  12. data/README.md +33 -0
  13. data/Rakefile +21 -0
  14. data/app/assets/javascripts/spree/backend/spree_devices.js +2 -0
  15. data/app/assets/javascripts/spree/frontend/spree_devices.js +2 -0
  16. data/app/assets/stylesheets/spree/backend/spree_devices.css +4 -0
  17. data/app/assets/stylesheets/spree/frontend/spree_devices.css +4 -0
  18. data/app/controllers/spree/api/base_controller_decorator.rb +24 -0
  19. data/app/controllers/spree/api/v1/devices_controller.rb +24 -0
  20. data/app/controllers/spree/devices_controller.rb +22 -0
  21. data/app/models/spree/device.rb +6 -0
  22. data/app/models/spree/user_decorator.rb +4 -0
  23. data/app/models/spree/user_device.rb +17 -0
  24. data/app/overrides/spree/users/show/add_devices_to_account_my_orders.html.erb.deface +2 -0
  25. data/app/services/spree/device_service.rb +36 -0
  26. data/app/views/spree/api/v1/devices/index.v1.rabl +2 -0
  27. data/app/views/spree/api/v1/devices/show.v1.rabl +2 -0
  28. data/app/views/spree/api/v1/shared/error.v1.rabl +5 -0
  29. data/app/views/spree/devices/index.html.erb +20 -0
  30. data/bin/rails +7 -0
  31. data/config/locales/ar.yml +3 -0
  32. data/config/locales/en.yml +6 -0
  33. data/config/routes.rb +11 -0
  34. data/db/migrate/20160317153123_create_devices.rb +9 -0
  35. data/db/migrate/20160317154122_create_user_devices.rb +9 -0
  36. data/db/migrate/20160321135103_rename_device_code_to_device_uid.rb +5 -0
  37. data/db/migrate/20160511093138_rename_devices_tables.rb +6 -0
  38. data/lib/generators/spree_devices/install/install_generator.rb +33 -0
  39. data/lib/spree_devices.rb +5 -0
  40. data/lib/spree_devices/engine.rb +31 -0
  41. data/lib/spree_devices/engine_factories/device_factory.rb +6 -0
  42. data/lib/spree_devices/engine_factories/user_device_factory.rb +6 -0
  43. data/lib/spree_devices/factories.rb +5 -0
  44. data/spec/api/v1/devices_spec.rb +96 -0
  45. data/spec/api/v1/products_spec.rb +33 -0
  46. data/spec/controllers/devices_controller_spec.rb +50 -0
  47. data/spec/spec_helper.rb +97 -0
  48. data/spec/support/devices_api.rb +22 -0
  49. data/spec/utils/rubocop_spec.rb +8 -0
  50. data/spree_devices.gemspec +26 -0
  51. metadata +215 -0
@@ -0,0 +1,5 @@
1
+ ## REQUIRE DEPENDENCIES
2
+ require 'spree_core'
3
+
4
+ ## REQUIRE GEM FILES
5
+ require 'spree_devices/engine'
@@ -0,0 +1,31 @@
1
+ module SpreeDevices
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'spree_devices'
6
+
7
+ # use rspec for tests
8
+ config.generators do |g|
9
+ g.test_framework :rspec
10
+ end
11
+
12
+ def self.activate
13
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
14
+ Rails.configuration.cache_classes ? require(c) : load(c)
15
+ end
16
+ end
17
+
18
+ config.to_prepare(&method(:activate).to_proc)
19
+ end
20
+
21
+ def self.setup(&block)
22
+ @config ||= SpreeDevices::Engine::Configuration.new
23
+ yield @config if block
24
+
25
+ @config
26
+ end
27
+
28
+ def self.config
29
+ Rails.application.config
30
+ end
31
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :device, class: Spree::Device do
3
+ name 'device_name'
4
+ uid { FFaker::Guid.unique.guid }
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :user_device, class: Spree::UserDevice do
3
+ user
4
+ device
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ require 'factory_bot'
2
+
3
+ Dir["#{File.dirname(__FILE__)}/engine_factories/**"].each do |f|
4
+ load File.expand_path(f)
5
+ end
@@ -0,0 +1,96 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'API', type: :request do
4
+ include DevicesAPISupport
5
+
6
+ describe 'POST /api/v1/devices' do
7
+ before :each do
8
+ @user = create(:user, email: FFaker::Internet.email, password: FFaker::Internet.password)
9
+ @headers = request_headers(@user)
10
+ end
11
+
12
+ it 'registers new user device' do
13
+ device_name = 'iPhone 6'
14
+ uid = FFaker::Guid.guid
15
+
16
+ post '/api/v1/devices', params: { name: device_name, uid: uid }.to_json, headers: @headers
17
+
18
+ expect(status).to eq 200
19
+ device = Spree::Device.where(name: device_name, uid: uid).first
20
+ expect(device).not_to be_nil
21
+ expect(Spree::UserDevice.where(device: device, user: @user).first).not_to be_nil
22
+ end
23
+
24
+ it 'registers existing user device' do
25
+ max_number_of_devices = SpreeDevices.config.try(:max_number_of_devices) || 3
26
+
27
+ device = nil
28
+ max_number_of_devices.times do
29
+ device = create(:device)
30
+ create(:user_device, user: @user, device: device)
31
+ end
32
+
33
+ post '/api/v1/devices', params: { name: device.name, uid: device.uid }.to_json, headers: @headers
34
+
35
+ expect(status).to eq 200
36
+ expect(Spree::Device.count).to eq max_number_of_devices
37
+ expect(Spree::UserDevice.where(user: @user).count).to eq max_number_of_devices
38
+ end
39
+
40
+ context 'when device limit is reached' do
41
+ it 'blocks registering the device' do
42
+ device_name = 'iPhone 6'
43
+ uid = FFaker::Guid.guid
44
+ max_number_of_devices = SpreeDevices.config.try(:max_number_of_devices) || 3
45
+
46
+ max_number_of_devices.times do
47
+ create(:user_device, user: @user, device: create(:device))
48
+ end
49
+
50
+ post '/api/v1/devices', params: { name: device_name, uid: uid }.to_json, headers: @headers
51
+
52
+ expect(status).to eq 422
53
+ parsed_response = JSON.parse(response.body)
54
+ expect(parsed_response['error']).not_to be_nil
55
+ expect(parsed_response['errors']['device']).not_to be_nil
56
+ expect(Spree::Device.count).to eq max_number_of_devices
57
+ expect(Spree::UserDevice.where(user: @user).count).to eq max_number_of_devices
58
+ end
59
+ end
60
+
61
+ context 'when device is missing parameters' do
62
+ it 'blocks registering the device' do
63
+ device = create(:device)
64
+ create(:user_device, user: @user, device: device)
65
+
66
+ post '/api/v1/devices', params: { name: nil, uid: nil }.to_json, headers: @headers
67
+
68
+ expect(status).to eq 422
69
+ parsed_response = JSON.parse(response.body)
70
+ expect(parsed_response['error']).not_to be_nil
71
+ expect(parsed_response['errors']['device']).not_to be_nil
72
+ expect(Spree::Device.count).to eq 1
73
+ expect(Spree::UserDevice.where(user: @user).count).to eq 1
74
+ end
75
+ end
76
+
77
+ context 'when multiple users has the same device' do
78
+ it 'registers same user device' do
79
+ user1 = create(:user, email: FFaker::Internet.email, password: FFaker::Internet.password)
80
+ user2 = create(:user, email: FFaker::Internet.email, password: FFaker::Internet.password)
81
+ user3 = create(:user, email: FFaker::Internet.email, password: FFaker::Internet.password)
82
+ device = create(:device)
83
+
84
+ create(:user_device, user: user1, device: device)
85
+ create(:user_device, user: user2, device: device)
86
+ create(:user_device, user: user3, device: device)
87
+
88
+ post '/api/v1/devices', params: { name: device.name, uid: device.uid }.to_json, headers: @headers
89
+
90
+ expect(status).to eq 200
91
+ expect(Spree::Device.count).to eq 1
92
+ expect(Spree::UserDevice.count).to eq 4
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'API', type: :request do
4
+ include DevicesAPISupport
5
+
6
+ describe 'GET /api/v1/products' do
7
+ before :each do
8
+ @user = create(:user, email: 'test@ingemark.com', password: 'password')
9
+ @user.generate_spree_api_key!
10
+ @device = create(:device)
11
+ create(:user_device, user: @user, device: @device)
12
+ end
13
+
14
+ context 'when valid device name and uid headers are provided' do
15
+ it 'lists protected resource' do
16
+ headers = request_headers_with_device(@user, @device)
17
+
18
+ get '/api/v1/products', params: {}, headers: headers
19
+ expect(status).to eq 200
20
+ end
21
+ end
22
+
23
+ context 'when invalid device name and uid headers are provided' do
24
+ it 'does not list protected resource' do
25
+ unused_device = create(:device)
26
+ headers = request_headers_with_device(@user, unused_device)
27
+
28
+ get '/api/v1/products', params: {}, headers: headers
29
+ expect(status).to eq 401
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Spree::DevicesController, type: :controller do
4
+ context 'when there are 3 user devices' do
5
+ before :each do
6
+ user = create(:user, email: FFaker::Internet.email, password: FFaker::Internet.password)
7
+ allow(controller).to receive(:spree_current_user).and_return(user)
8
+ device1 = create(:device)
9
+ device2 = create(:device)
10
+ device3 = create(:device)
11
+ @user_device1 = create(:user_device, user: user, device: device1)
12
+ @user_device2 = create(:user_device, user: user, device: device2)
13
+ @user_device3 = create(:user_device, user: user, device: device3)
14
+ end
15
+
16
+ it 'lists user devices' do
17
+ get :index
18
+
19
+ expect(response.status).to eq 200
20
+ expect(response).to render_template('index')
21
+ end
22
+
23
+ it 'deletes user device' do
24
+ delete :destroy, params: { id: @user_device3.device.id }
25
+
26
+ expect(response.status).to eq 302
27
+ expect(response).to redirect_to(devices_url)
28
+ expect(Spree::Device.count).to eq 2
29
+ expect(Spree::UserDevice.count).to eq 2
30
+ end
31
+ end
32
+
33
+ context 'when there are two users on the same device' do
34
+ it 'deletes user device' do
35
+ user1 = create(:user, email: FFaker::Internet.email, password: FFaker::Internet.password)
36
+ user2 = create(:user, email: FFaker::Internet.email, password: FFaker::Internet.password)
37
+ allow(controller).to receive(:spree_current_user).and_return(user1)
38
+ device = create(:device)
39
+ user_device1 = create(:user_device, user: user1, device: device)
40
+ create(:user_device, user: user2, device: device)
41
+
42
+ delete :destroy, params: { id: user_device1.device.id }
43
+
44
+ expect(response.status).to eq 302
45
+ expect(response).to redirect_to(devices_url)
46
+ expect(Spree::Device.count).to eq 1
47
+ expect(Spree::UserDevice.count).to eq 1
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,97 @@
1
+ # Run Coverage report
2
+ require 'simplecov'
3
+
4
+ SimpleCov.start do
5
+ add_filter 'spec/dummy'
6
+ add_group 'Controllers', 'app/controllers'
7
+ add_group 'Helpers', 'app/helpers'
8
+ add_group 'Mailers', 'app/mailers'
9
+ add_group 'Models', 'app/models'
10
+ add_group 'Views', 'app/views'
11
+ add_group 'Libraries', 'lib'
12
+ end
13
+
14
+ # Configure Rails Environment
15
+ ENV['RAILS_ENV'] = 'test'
16
+
17
+ require File.expand_path('dummy/config/environment.rb', __dir__)
18
+
19
+ require 'rspec/rails'
20
+ require 'database_cleaner'
21
+ require 'ffaker'
22
+
23
+ # Requires supporting ruby files with custom matchers and macros, etc,
24
+ # in spec/support/ and its subdirectories.
25
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
26
+
27
+ # Requires factories and other useful helpers defined in spree_core.
28
+ require 'spree/testing_support/authorization_helpers'
29
+ require 'spree/testing_support/capybara_ext'
30
+ require 'spree/testing_support/controller_requests'
31
+ require 'spree/testing_support/factories'
32
+ require 'spree/testing_support/url_helpers'
33
+
34
+ # Requires factories defined in lib/spree_devices/factories.rb
35
+ require 'spree_devices/factories'
36
+
37
+ RSpec.configure do |config|
38
+ config.include FactoryBot::Syntax::Methods
39
+
40
+ # Infer an example group's spec type from the file location.
41
+ config.infer_spec_type_from_file_location!
42
+
43
+ # == URL Helpers
44
+ #
45
+ # Allows access to Spree's routes in specs:
46
+ #
47
+ # visit spree.admin_path
48
+ # current_path.should eql(spree.products_path)
49
+ config.include Spree::TestingSupport::UrlHelpers
50
+
51
+ # == Requests support
52
+ #
53
+ # Adds convenient methods to request Spree's controllers
54
+ # spree_get :index
55
+ config.include Spree::TestingSupport::ControllerRequests, type: :controller
56
+
57
+ # == Mock Framework
58
+ #
59
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
60
+ #
61
+ # config.mock_with :mocha
62
+ # config.mock_with :flexmock
63
+ # config.mock_with :rr
64
+ config.mock_with :rspec
65
+ config.color = true
66
+
67
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
68
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
69
+
70
+ # Capybara javascript drivers require transactional fixtures set to false, and we use DatabaseCleaner
71
+ # to cleanup after each test instead. Without transactional fixtures set to false the records created
72
+ # to setup a test will be unavailable to the browser, which runs under a separate server instance.
73
+ config.use_transactional_fixtures = false
74
+
75
+ # Ensure Suite is set to use transactions for speed.
76
+ config.before :suite do
77
+ DatabaseCleaner.strategy = :transaction
78
+ DatabaseCleaner.clean_with :truncation
79
+ end
80
+
81
+ # Before each spec check if it is a Javascript test and switch between using
82
+ # database transactions or not where necessary.
83
+ config.before :each do
84
+ DatabaseCleaner.strategy = RSpec.current_example.metadata[:js] ? :truncation : :transaction
85
+ DatabaseCleaner.start
86
+ end
87
+
88
+ # After each spec clean the database.
89
+ config.after :each do
90
+ DatabaseCleaner.clean
91
+ end
92
+
93
+ config.fail_fast = ENV['FAIL_FAST'] || false
94
+ config.order = 'random'
95
+
96
+ config.include Warden::Test::Helpers
97
+ end
@@ -0,0 +1,22 @@
1
+ module DevicesAPISupport
2
+ def request_headers(user)
3
+ user.generate_spree_api_key!
4
+ {
5
+ 'X-Spree-Token' => user.spree_api_key,
6
+ 'Content-Type' => 'application/json',
7
+ 'Accept' => 'application/json'
8
+ }
9
+ end
10
+
11
+ def request_headers_with_device(user, device)
12
+ user.generate_spree_api_key!
13
+ {
14
+ 'X-Spree-Token' => user.spree_api_key,
15
+ 'Content-Type' => 'application/json',
16
+ 'Accept' => 'application/json',
17
+ 'Device-Name' => device.name,
18
+ 'Device-Uid' => device.uid,
19
+ 'X-OS' => 'iOS'
20
+ }
21
+ end
22
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+ require 'rubocop'
3
+
4
+ describe 'Rubocop', level: 'technical' do
5
+ it 'should pass' do
6
+ expect(RuboCop::CLI.new.run([])).to eq(0)
7
+ end
8
+ end
@@ -0,0 +1,26 @@
1
+ # require_relative 'core/lib/spree/core/version.rb'
2
+ Gem::Specification.new do |s|
3
+ s.platform = Gem::Platform::RUBY
4
+ s.name = 'spree_devices'
5
+ s.version = '1.2.0'
6
+ s.summary = ''
7
+ s.description = ''
8
+ s.required_ruby_version = '>= 2.4.1'
9
+
10
+ s.author = 'Matej Minažek'
11
+ s.email = 'matej.minazek@ingemark.com'
12
+ s.homepage = 'http://ingemark.com'
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.require_path = 'lib'
16
+
17
+ s.add_runtime_dependency 'spree_api', ['>= 3.1.0', '<4.0']
18
+ s.add_runtime_dependency 'spree_core', ['>= 3.1.0', '<4.0']
19
+
20
+ s.add_development_dependency 'coffee-rails'
21
+ s.add_development_dependency 'database_cleaner'
22
+ s.add_development_dependency 'ffaker'
23
+ s.add_development_dependency 'poltergeist'
24
+ s.add_development_dependency 'sass-rails'
25
+ s.add_development_dependency 'sqlite3'
26
+ end
metadata ADDED
@@ -0,0 +1,215 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spree_devices
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Matej Minažek
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: spree_api
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '4.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 3.1.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '4.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: spree_core
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 3.1.0
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '4.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 3.1.0
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '4.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: coffee-rails
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: database_cleaner
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: ffaker
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: poltergeist
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: sass-rails
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ - !ruby/object:Gem::Dependency
124
+ name: sqlite3
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ description: ''
138
+ email: matej.minazek@ingemark.com
139
+ executables: []
140
+ extensions: []
141
+ extra_rdoc_files: []
142
+ files:
143
+ - ".gitignore"
144
+ - ".rspec"
145
+ - ".rubocop"
146
+ - ".rubocop.yml"
147
+ - ".ruby-gemset"
148
+ - ".ruby-version"
149
+ - Gemfile
150
+ - Gemfile.lock
151
+ - Jenkinsfile
152
+ - LICENSE
153
+ - README.md
154
+ - Rakefile
155
+ - app/assets/javascripts/spree/backend/spree_devices.js
156
+ - app/assets/javascripts/spree/frontend/spree_devices.js
157
+ - app/assets/stylesheets/spree/backend/spree_devices.css
158
+ - app/assets/stylesheets/spree/frontend/spree_devices.css
159
+ - app/controllers/spree/api/base_controller_decorator.rb
160
+ - app/controllers/spree/api/v1/devices_controller.rb
161
+ - app/controllers/spree/devices_controller.rb
162
+ - app/models/spree/device.rb
163
+ - app/models/spree/user_decorator.rb
164
+ - app/models/spree/user_device.rb
165
+ - app/overrides/spree/users/show/add_devices_to_account_my_orders.html.erb.deface
166
+ - app/services/spree/device_service.rb
167
+ - app/views/spree/api/v1/devices/index.v1.rabl
168
+ - app/views/spree/api/v1/devices/show.v1.rabl
169
+ - app/views/spree/api/v1/shared/error.v1.rabl
170
+ - app/views/spree/devices/index.html.erb
171
+ - bin/rails
172
+ - config/locales/ar.yml
173
+ - config/locales/en.yml
174
+ - config/routes.rb
175
+ - db/migrate/20160317153123_create_devices.rb
176
+ - db/migrate/20160317154122_create_user_devices.rb
177
+ - db/migrate/20160321135103_rename_device_code_to_device_uid.rb
178
+ - db/migrate/20160511093138_rename_devices_tables.rb
179
+ - lib/generators/spree_devices/install/install_generator.rb
180
+ - lib/spree_devices.rb
181
+ - lib/spree_devices/engine.rb
182
+ - lib/spree_devices/engine_factories/device_factory.rb
183
+ - lib/spree_devices/engine_factories/user_device_factory.rb
184
+ - lib/spree_devices/factories.rb
185
+ - spec/api/v1/devices_spec.rb
186
+ - spec/api/v1/products_spec.rb
187
+ - spec/controllers/devices_controller_spec.rb
188
+ - spec/spec_helper.rb
189
+ - spec/support/devices_api.rb
190
+ - spec/utils/rubocop_spec.rb
191
+ - spree_devices.gemspec
192
+ homepage: http://ingemark.com
193
+ licenses: []
194
+ metadata: {}
195
+ post_install_message:
196
+ rdoc_options: []
197
+ require_paths:
198
+ - lib
199
+ required_ruby_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: 2.4.1
204
+ required_rubygems_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ requirements: []
210
+ rubyforge_project:
211
+ rubygems_version: 2.6.13
212
+ signing_key:
213
+ specification_version: 4
214
+ summary: ''
215
+ test_files: []