simon_says 0.0.27b6 → 0.1.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.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.travis.yml +9 -1
- data/Gemfile +6 -1
- data/README.md +3 -145
- data/lib/simon_says/authorizer.rb +9 -8
- data/lib/simon_says/roleable.rb +3 -1
- data/lib/simon_says/version.rb +1 -1
- data/simon_says.gemspec +5 -4
- data/test/controllers/admin/reports_controller_test.rb +10 -14
- data/test/controllers/documents_controller_test.rb +9 -13
- data/test/rails_app/config/application.rb +1 -11
- data/test/rails_app/config/environments/test.rb +8 -2
- data/test/rails_app/db/schema.rb +7 -7
- data/test/rails_app/test/fixtures/admins.yml +1 -1
- data/test/rails_app/test/fixtures/memberships.yml +1 -1
- data/test/simon_says/roleable_test.rb +75 -121
- data/test/test_helper.rb +6 -1
- metadata +39 -19
- data/test/models/admin_test.rb +0 -7
- data/test/models/membership_test.rb +0 -7
- data/test/rails_app/Gemfile +0 -40
- data/test/rails_app/Gemfile.lock +0 -120
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 685f3f8f7cedb32fba2e7b051480920658a8da7e
|
4
|
+
data.tar.gz: a09f1909ec655d6653737c4bf1fd78a9e3c7d8d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4f436bc143a52f7ca03a90335fb227b1aa9794f1ed462c9c53cb5b26263538f603b23d37ec4cf4a5d7a7a8a192931d7b635d518bf5d28390b624cfca591ce08
|
7
|
+
data.tar.gz: 0f677b3f2830329eb4765e082321a787e5d2037bad8b72f79af7471bff238c8604b7fc1f0a0a0c631c15787f45fbcbfcffb76e28b18c88f4e8a98c920a1efc7b
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,3 +1,11 @@
|
|
1
1
|
language: ruby
|
2
|
+
cache: bundler
|
3
|
+
install: bundle install --jobs=3 --retry=3
|
2
4
|
rvm:
|
3
|
-
- 2.
|
5
|
+
- "2.2.2"
|
6
|
+
before_script:
|
7
|
+
- cd test/rails_app/
|
8
|
+
- RAILS_ENV=test bundle exec rake db:migrate db:fixtures:load
|
9
|
+
- cd ../..
|
10
|
+
script:
|
11
|
+
- bundle exec rake test
|
data/Gemfile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
|
+
ruby '2.2.3'
|
2
3
|
|
3
4
|
# Specify your gem's dependencies in auth_lib.gemspec
|
4
5
|
gemspec
|
@@ -9,5 +10,9 @@ group :development do
|
|
9
10
|
gem 'rdoc'
|
10
11
|
|
11
12
|
gem 'guard'
|
12
|
-
gem 'guard-minitest'
|
13
|
+
gem 'guard-minitest', "2.3.2"
|
14
|
+
end
|
15
|
+
|
16
|
+
group :test do
|
17
|
+
gem "codeclimate-test-reporter", require: false
|
13
18
|
end
|
data/README.md
CHANGED
@@ -4,152 +4,10 @@
|
|
4
4
|
Logo](https://raw.githubusercontent.com/SimplyBuilt/SimonSays/master/SimonSays.png)
|
5
5
|
|
6
6
|
This gem is a simple, declarative, role-based access control system for Rails that
|
7
|
-
works great with devise! Take a look at the
|
8
|
-
[docs](http://
|
7
|
+
works great with devise! Take a look at the [website](http://simonsays.onsimplybuilt.com) or
|
8
|
+
[docs](http://www.rubydoc.info/github/SimplyBuilt/SimonSays/) for more details!
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
Add this line to your application's Gemfile:
|
13
|
-
|
14
|
-
```ruby
|
15
|
-
gem 'simon_says'
|
16
|
-
```
|
17
|
-
|
18
|
-
And then execute:
|
19
|
-
|
20
|
-
$ bundle
|
21
|
-
|
22
|
-
Or install it yourself as:
|
23
|
-
|
24
|
-
$ gem install simon_says
|
25
|
-
|
26
|
-
## Usage
|
27
|
-
|
28
|
-
SimonSays consists of two parts. One is a model concern called
|
29
|
-
`Roleable`. The other is a controller concern called `Authorizer`. The
|
30
|
-
idea is that you give users some set of roles and find and authorize
|
31
|
-
against those roles on a controller (and action) basis.
|
32
|
-
|
33
|
-
### Roleable
|
34
|
-
|
35
|
-
First, we need to define roles. Generally speaking roles will exist on
|
36
|
-
either User models or on relationship models (like a through model linking a
|
37
|
-
User to another resource).
|
38
|
-
|
39
|
-
Here's a quick example:
|
40
|
-
|
41
|
-
class User < ActiveRecord::Base
|
42
|
-
include SimonSays::Roleable
|
43
|
-
|
44
|
-
has_roles :add, :edit, :delete
|
45
|
-
end
|
46
|
-
|
47
|
-
User can now have none or one more roles:
|
48
|
-
|
49
|
-
User.new.roles
|
50
|
-
=> []
|
51
|
-
|
52
|
-
User.new.tap { |u| u.roles = :add, :edit }.roles
|
53
|
-
=> [:add, :edit]
|
54
|
-
|
55
|
-
The roles are stored as an integer. When using `Roleable` you need add a
|
56
|
-
`roles_mask` column. Note that we do not have any generators for this yet.
|
57
|
-
Feel free to fork add them!
|
58
|
-
|
59
|
-
You can customize this attribute using the `:as` option. For example:
|
60
|
-
|
61
|
-
class Admin < ActiveRecord::Base
|
62
|
-
include SimonSays::Roleable
|
63
|
-
|
64
|
-
has_roles :design, :support, :moderator, as: :access
|
65
|
-
end
|
66
|
-
|
67
|
-
Admin.new.access
|
68
|
-
=> []
|
69
|
-
|
70
|
-
Admin.new(access: :support).access
|
71
|
-
=> [:support]
|
72
|
-
|
73
|
-
You can also use `Roleable` on through models. For example:
|
74
|
-
|
75
|
-
class Membership < ActiveRecord::Base
|
76
|
-
include SimonSays::Roleable
|
77
|
-
|
78
|
-
belongs_to :user
|
79
|
-
belongs_to :document
|
80
|
-
|
81
|
-
has_roles :download, :edit, :delete,
|
82
|
-
end
|
83
|
-
|
84
|
-
There will be several methods as well as a scope generated by
|
85
|
-
calling `has_roles`. See below for more details on the methods
|
86
|
-
generated by `Roleable`. Be sure to also checkout the
|
87
|
-
[docs](http://simplybuilt.github.io/SimonSays/SimonSays/Roleable/ClassMethods.html)
|
88
|
-
for more details!
|
89
|
-
|
90
|
-
### Authorizer
|
91
|
-
|
92
|
-
Next up is the `Authorizer`. This concern provides several methods that
|
93
|
-
can be used within your controllers to declaratively find resources and
|
94
|
-
ensuring certain role-based conditions are met.
|
95
|
-
|
96
|
-
*Please note*, certain assumptions are made with `Authorizer`. Building
|
97
|
-
upon the above `User` and `Admin` models, `Authorizer` would assume
|
98
|
-
there is a `current_user` and `current_admin`. If these models
|
99
|
-
correspond to devise scopes this would be the case by default.
|
100
|
-
Additionally there would need to a be an `authenticate_user!` and
|
101
|
-
`authenticate_admin!` method, which devise provides as well.
|
102
|
-
|
103
|
-
Eventually, we would like to see better customization around the
|
104
|
-
authentication aspects. This library is intended to solve the problem of
|
105
|
-
authorization and access control. It is not an authentication library.
|
106
|
-
|
107
|
-
The first step is to include the concern within the
|
108
|
-
`ApplicationController` and to configure the default authorization
|
109
|
-
method:
|
110
|
-
|
111
|
-
class ApplicationController < ActionController::Base
|
112
|
-
include SimonSays::Authorizer
|
113
|
-
end
|
114
|
-
|
115
|
-
Let's start with an example; here we'll create a reports resource that
|
116
|
-
only Admin's with support access to use. The roles are supplied within
|
117
|
-
the `authorize_resource` method. Note that, multiple roles can be
|
118
|
-
supplied; access is granted if one or more are met.
|
119
|
-
|
120
|
-
# routes.rb
|
121
|
-
# Reports resource for Admins
|
122
|
-
resources :reports
|
123
|
-
|
124
|
-
# app/controllers/reports_controller.rb
|
125
|
-
class ReportsController < ApplicationController
|
126
|
-
authorize_resource :admin, :support
|
127
|
-
find_resource :report, except: [:index, :new, :create]
|
128
|
-
end
|
129
|
-
|
130
|
-
Here's another example using the `Membership` through model.
|
131
|
-
|
132
|
-
# routes.rb
|
133
|
-
resources :documents
|
134
|
-
|
135
|
-
# app/controllers/documents_controller.rb
|
136
|
-
class DocumentsController < ApplicationController
|
137
|
-
authenticate :user
|
138
|
-
|
139
|
-
find_and_authorize :documents, :edit, through: :memberships, only: [:edit, :update]
|
140
|
-
find_and_authorize :documents, :delete, through: :memberships, only: :destroy
|
141
|
-
end
|
142
|
-
|
143
|
-
The document model will not be found if the membership relationship does
|
144
|
-
not exist and an `ActiveRecord::NotFound` exception will be raised.
|
145
|
-
|
146
|
-
If the membership record exists, but the role conditions are not met,
|
147
|
-
`Authorizer` will raise a `Denied` exception.
|
148
|
-
|
149
|
-
If the document is found and the user has the access to it. It will be
|
150
|
-
set as the `@document` instance variable. Make sure to checkout the
|
151
|
-
[docs](http://simplybuilt.github.io/SimonSays/SimonSays/Authorizer/ClassMethods.html)
|
152
|
-
for more details!
|
10
|
+

|
153
11
|
|
154
12
|
## Contributing
|
155
13
|
|
@@ -2,7 +2,7 @@ module SimonSays
|
|
2
2
|
module Authorizer
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
class Denied <
|
5
|
+
class Denied < StandardError
|
6
6
|
def initialize(as, required, actual)
|
7
7
|
# TODO i18n for err message (as should be singluarized with 1 flag)
|
8
8
|
super "Access denied; #{required * ', '} role is required. Current access is #{actual * ', '}"
|
@@ -17,7 +17,7 @@ module SimonSays
|
|
17
17
|
# available to your controllers.
|
18
18
|
module ClassMethods
|
19
19
|
# Authentication convenience method (to keep things declarative).
|
20
|
-
# This method just setups a +
|
20
|
+
# This method just setups a +before_action+
|
21
21
|
#
|
22
22
|
# * +scope+ is a symbol or string and should correspond to some sort
|
23
23
|
# of authentication scope (ie: +authenticate_user!+)
|
@@ -28,7 +28,7 @@ module SimonSays
|
|
28
28
|
# authenticate :user, expect: :index
|
29
29
|
#
|
30
30
|
def authenticate(scope, opts = {})
|
31
|
-
|
31
|
+
before_action :"authenticate_#{scope}!", filter_options(opts)
|
32
32
|
end
|
33
33
|
|
34
34
|
# Find and authorize a resource.
|
@@ -43,7 +43,7 @@ module SimonSays
|
|
43
43
|
def find_and_authorize(resource, *roles)
|
44
44
|
opts = roles.extract_options!
|
45
45
|
|
46
|
-
|
46
|
+
before_action(filter_options(opts)) do
|
47
47
|
find_resource resource, opts
|
48
48
|
|
49
49
|
authorize roles, opts unless roles.empty?
|
@@ -55,7 +55,7 @@ module SimonSays
|
|
55
55
|
# * +resource+ the name of the resource to find
|
56
56
|
# * +opts+ filter options
|
57
57
|
def find_resource(resource, opts = {})
|
58
|
-
|
58
|
+
before_action(filter_options(opts)) do
|
59
59
|
find_resource resource, opts
|
60
60
|
end
|
61
61
|
end
|
@@ -70,13 +70,13 @@ module SimonSays
|
|
70
70
|
# * +roles+ one or more role symbols
|
71
71
|
# * the last argument may also be a filter options hash
|
72
72
|
def authorize_resource(resource, *roles)
|
73
|
-
|
73
|
+
before_action(filter_options(roles.extract_options!)) do
|
74
74
|
authorize(roles, { resource: resource })
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
78
|
def filter_options(options) # :nodoc:
|
79
|
-
{ except: options.delete(:except), only: options.delete(:only) }
|
79
|
+
{ except: options.delete(:except), only: options.delete(:only), prepend: options.delete(:prepend) }
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
@@ -138,7 +138,8 @@ module SimonSays
|
|
138
138
|
scope = send(self.class.default_authorization_scope)
|
139
139
|
|
140
140
|
elsif options[:from]
|
141
|
-
scope = instance_variable_get("@#{options[:from]}")
|
141
|
+
scope = instance_variable_get("@#{options[:from]}") || send(options[:from])
|
142
|
+
|
142
143
|
else
|
143
144
|
klass = (options[:class_name] || resource).to_s
|
144
145
|
# TODO support array of namespaces?
|
data/lib/simon_says/roleable.rb
CHANGED
@@ -76,6 +76,8 @@ module SimonSays
|
|
76
76
|
|
77
77
|
def #{name}=(args)
|
78
78
|
args = [args] unless Array === args
|
79
|
+
|
80
|
+
args.compact!
|
79
81
|
args.map!(&:to_sym)
|
80
82
|
|
81
83
|
self[:#{name}_mask] = (args & #{const}).map { |i| 2 ** #{const}.index(i) }.sum
|
@@ -99,7 +101,7 @@ module SimonSays
|
|
99
101
|
# Declare a scope for finding records with a given role set
|
100
102
|
# TODO support an array roles (must match ALL)
|
101
103
|
scope "with_#{name}", ->(role) {
|
102
|
-
where("(#{name}_mask & ?) > 0", 2**roles.index(role))
|
104
|
+
where("(#{name}_mask & ?) > 0", 2**roles.index(role.to_sym))
|
103
105
|
}
|
104
106
|
end
|
105
107
|
end
|
data/lib/simon_says/version.rb
CHANGED
data/simon_says.gemspec
CHANGED
@@ -6,7 +6,7 @@ require 'simon_says/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "simon_says"
|
8
8
|
spec.version = SimonSays::VERSION
|
9
|
-
spec.authors = ["Michael Coyne"]
|
9
|
+
spec.authors = ["Michael Coyne", "Cameron Craig", "SimplyBuilt"]
|
10
10
|
spec.email = ["mikeycgto@gmail.com"]
|
11
11
|
spec.summary = %q{Light-weight, declarative authorization and access control for Rails}
|
12
12
|
spec.description = %q{This gem is a simple, easy-to-use declarative role-based access control system for Rails}
|
@@ -18,10 +18,11 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "activesupport", "
|
21
|
+
spec.add_dependency "activesupport", ">= 4.0", "< 5.1"
|
22
22
|
|
23
|
-
spec.add_development_dependency "bundler", "~> 1.
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.9"
|
24
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
-
spec.add_development_dependency "rails", "
|
25
|
+
spec.add_development_dependency "rails", ">= 4.0", "< 5.1"
|
26
|
+
spec.add_development_dependency "responders", "~> 2.0"
|
26
27
|
spec.add_development_dependency "mocha", "~> 1.1"
|
27
28
|
end
|
@@ -9,7 +9,7 @@ class Admin::ReportsControllerTest < ActionController::TestCase
|
|
9
9
|
test "index with access" do
|
10
10
|
@controller.current_admin = @support
|
11
11
|
|
12
|
-
get :index, format: :json
|
12
|
+
get :index, params: { format: :json }
|
13
13
|
|
14
14
|
assert_response :success
|
15
15
|
end
|
@@ -18,7 +18,7 @@ class Admin::ReportsControllerTest < ActionController::TestCase
|
|
18
18
|
@controller.current_admin = @marketing
|
19
19
|
|
20
20
|
assert_raises SimonSays::Authorizer::Denied do
|
21
|
-
get :index, format: :json
|
21
|
+
get :index, params: { format: :json }
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -26,7 +26,7 @@ class Admin::ReportsControllerTest < ActionController::TestCase
|
|
26
26
|
@controller.current_admin = @support
|
27
27
|
|
28
28
|
assert_difference 'Admin::Report.count' do
|
29
|
-
post :create, report: { title: 'Test' }, format: :json
|
29
|
+
post :create, params: { report: { title: 'Test' }, format: :json }
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -34,16 +34,15 @@ class Admin::ReportsControllerTest < ActionController::TestCase
|
|
34
34
|
@controller.current_admin = @marketing
|
35
35
|
|
36
36
|
assert_raises SimonSays::Authorizer::Denied do
|
37
|
-
post :create, report: { title: 'Test' }, format: :json
|
37
|
+
post :create, params: { report: { title: 'Test' }, format: :json }
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
test "show with access" do
|
42
42
|
@controller.current_admin = @support
|
43
43
|
|
44
|
-
get :show, id: admin_reports(:report_one), format: :json
|
44
|
+
get :show, params: { id: admin_reports(:report_one), format: :json }
|
45
45
|
|
46
|
-
refute_nil assigns(:report)
|
47
46
|
assert_response :success
|
48
47
|
end
|
49
48
|
|
@@ -51,16 +50,15 @@ class Admin::ReportsControllerTest < ActionController::TestCase
|
|
51
50
|
@controller.current_admin = @marketing
|
52
51
|
|
53
52
|
assert_raises SimonSays::Authorizer::Denied do
|
54
|
-
get :show, id: admin_reports(:report_one), format: :json
|
53
|
+
get :show, params: { id: admin_reports(:report_one), format: :json }
|
55
54
|
end
|
56
55
|
end
|
57
56
|
|
58
57
|
test "update with access" do
|
59
58
|
@controller.current_admin = @support
|
60
59
|
|
61
|
-
patch :show, id: admin_reports(:report_one), report: { title: 'Test' }, format: :json
|
60
|
+
patch :show, params: { id: admin_reports(:report_one), report: { title: 'Test' }, format: :json }
|
62
61
|
|
63
|
-
refute_nil assigns(:report)
|
64
62
|
assert_response :success
|
65
63
|
end
|
66
64
|
|
@@ -68,7 +66,7 @@ class Admin::ReportsControllerTest < ActionController::TestCase
|
|
68
66
|
@controller.current_admin = @marketing
|
69
67
|
|
70
68
|
assert_raises SimonSays::Authorizer::Denied do
|
71
|
-
patch :show, id: admin_reports(:report_one), report: { title: 'Test' }, format: :json
|
69
|
+
patch :show, params: { id: admin_reports(:report_one), report: { title: 'Test' }, format: :json }
|
72
70
|
end
|
73
71
|
end
|
74
72
|
|
@@ -76,17 +74,15 @@ class Admin::ReportsControllerTest < ActionController::TestCase
|
|
76
74
|
@controller.current_admin = @support
|
77
75
|
|
78
76
|
assert_difference 'Admin::Report.count', -1 do
|
79
|
-
delete :destroy, id: admin_reports(:report_one), format: :json
|
77
|
+
delete :destroy, params: { id: admin_reports(:report_one), format: :json }
|
80
78
|
end
|
81
|
-
|
82
|
-
refute_nil assigns(:report)
|
83
79
|
end
|
84
80
|
|
85
81
|
test "destroy without access" do
|
86
82
|
@controller.current_admin = @marketing
|
87
83
|
|
88
84
|
assert_raises SimonSays::Authorizer::Denied do
|
89
|
-
delete :destroy, id: admin_reports(:report_one), format: :json
|
85
|
+
delete :destroy, params: { id: admin_reports(:report_one), format: :json }
|
90
86
|
end
|
91
87
|
end
|
92
88
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
|
2
|
+
require 'pry'
|
3
3
|
class DocumentsControllerTest < ActionController::TestCase
|
4
4
|
setup do
|
5
5
|
@alpha = documents(:alpha)
|
@@ -20,9 +20,8 @@ class DocumentsControllerTest < ActionController::TestCase
|
|
20
20
|
test "show" do
|
21
21
|
as_bob!
|
22
22
|
|
23
|
-
get :show, id: @alpha.id, format:
|
23
|
+
get :show, params: { id: @alpha.id, format: "json" }
|
24
24
|
|
25
|
-
refute_nil assigns(:document)
|
26
25
|
assert_response :success
|
27
26
|
end
|
28
27
|
|
@@ -30,16 +29,15 @@ class DocumentsControllerTest < ActionController::TestCase
|
|
30
29
|
as_jim!
|
31
30
|
|
32
31
|
assert_raises ActiveRecord::RecordNotFound do
|
33
|
-
get :show, id: @alpha.id, format: :json
|
32
|
+
get :show, params: { id: @alpha.id, format: :json }
|
34
33
|
end
|
35
34
|
end
|
36
35
|
|
37
36
|
test "update with access" do
|
38
37
|
as_bob!
|
39
38
|
|
40
|
-
patch :update, id: @alpha.id, document: { title: 'Test' }, format: :json
|
39
|
+
patch :update, params: { id: @alpha.id, document: { title: 'Test' }, format: :json }
|
41
40
|
|
42
|
-
refute_nil assigns(:document)
|
43
41
|
assert_response :success
|
44
42
|
end
|
45
43
|
|
@@ -47,7 +45,7 @@ class DocumentsControllerTest < ActionController::TestCase
|
|
47
45
|
as_bob!
|
48
46
|
|
49
47
|
assert_raises SimonSays::Authorizer::Denied do
|
50
|
-
patch :update, id: @beta.id, document: { title: 'Test' }, format: :json
|
48
|
+
patch :update, params: { id: @beta.id, document: { title: 'Test' }, format: :json }
|
51
49
|
end
|
52
50
|
end
|
53
51
|
|
@@ -55,7 +53,7 @@ class DocumentsControllerTest < ActionController::TestCase
|
|
55
53
|
as_jim!
|
56
54
|
|
57
55
|
assert_raises ActiveRecord::RecordNotFound do
|
58
|
-
patch :update, id: @alpha.id, document: { title: 'Test' }, format: :json
|
56
|
+
patch :update, params: { id: @alpha.id, document: { title: 'Test' }, format: :json }
|
59
57
|
end
|
60
58
|
end
|
61
59
|
|
@@ -63,17 +61,15 @@ class DocumentsControllerTest < ActionController::TestCase
|
|
63
61
|
as_bob!
|
64
62
|
|
65
63
|
assert_difference 'Document.count', -1 do
|
66
|
-
delete :destroy, id: @alpha.id, format: :json
|
64
|
+
delete :destroy, params: { id: @alpha.id, format: :json }
|
67
65
|
end
|
68
|
-
|
69
|
-
refute_nil assigns(:document)
|
70
66
|
end
|
71
67
|
|
72
68
|
test "destroy without access" do
|
73
69
|
as_bob!
|
74
70
|
|
75
71
|
assert_raises SimonSays::Authorizer::Denied do
|
76
|
-
delete :destroy, id: @beta.id, format: :json
|
72
|
+
delete :destroy, params: { id: @beta.id, format: :json }
|
77
73
|
end
|
78
74
|
end
|
79
75
|
|
@@ -81,7 +77,7 @@ class DocumentsControllerTest < ActionController::TestCase
|
|
81
77
|
as_jim!
|
82
78
|
|
83
79
|
assert_raises ActiveRecord::RecordNotFound do
|
84
|
-
delete :destroy, id: @beta.id, format: :json
|
80
|
+
delete :destroy, params: { id: @beta.id, format: :json }
|
85
81
|
end
|
86
82
|
end
|
87
83
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require File.expand_path('../boot', __FILE__)
|
2
2
|
|
3
3
|
require 'rails/all'
|
4
|
+
require 'responders'
|
4
5
|
|
5
6
|
# Require the gems listed in Gemfile, including any gems
|
6
7
|
# you've limited to :test, :development, or :production.
|
@@ -8,17 +9,6 @@ Bundler.require(*Rails.groups)
|
|
8
9
|
|
9
10
|
module RailsApp
|
10
11
|
class Application < Rails::Application
|
11
|
-
# Settings in config/environments/* take precedence over those specified here.
|
12
|
-
# Application configuration should go into files in config/initializers
|
13
|
-
# -- all .rb files in that directory are automatically loaded.
|
14
|
-
|
15
|
-
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
16
|
-
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
17
|
-
# config.time_zone = 'Central Time (US & Canada)'
|
18
|
-
|
19
|
-
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
20
|
-
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
21
|
-
# config.i18n.default_locale = :de
|
22
12
|
end
|
23
13
|
end
|
24
14
|
|
@@ -13,8 +13,10 @@ Rails.application.configure do
|
|
13
13
|
config.eager_load = true
|
14
14
|
|
15
15
|
# Configure static asset server for tests with Cache-Control for performance.
|
16
|
-
config.
|
17
|
-
config.
|
16
|
+
config.public_file_server.enabled = true
|
17
|
+
config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }
|
18
|
+
|
19
|
+
config.active_support.test_order = :random
|
18
20
|
|
19
21
|
# Show full error reports and disable caching.
|
20
22
|
config.consider_all_requests_local = true
|
@@ -36,4 +38,8 @@ Rails.application.configure do
|
|
36
38
|
|
37
39
|
# Raises error for missing translations
|
38
40
|
# config.action_view.raise_on_missing_translations = true
|
41
|
+
|
42
|
+
# Use transactional fixtures
|
43
|
+
config.use_transactional_fixtures = true
|
44
|
+
|
39
45
|
end
|
data/test/rails_app/db/schema.rb
CHANGED
@@ -13,25 +13,25 @@
|
|
13
13
|
|
14
14
|
ActiveRecord::Schema.define(version: 20141017140833) do
|
15
15
|
|
16
|
-
create_table "admin_reports", force:
|
17
|
-
t.string "title"
|
16
|
+
create_table "admin_reports", force: :cascade do |t|
|
17
|
+
t.string "title", limit: 255
|
18
18
|
t.datetime "created_at"
|
19
19
|
t.datetime "updated_at"
|
20
20
|
end
|
21
21
|
|
22
|
-
create_table "admins", force:
|
22
|
+
create_table "admins", force: :cascade do |t|
|
23
23
|
t.integer "access_mask"
|
24
24
|
t.datetime "created_at"
|
25
25
|
t.datetime "updated_at"
|
26
26
|
end
|
27
27
|
|
28
|
-
create_table "documents", force:
|
29
|
-
t.string "title"
|
28
|
+
create_table "documents", force: :cascade do |t|
|
29
|
+
t.string "title", limit: 255
|
30
30
|
t.datetime "created_at"
|
31
31
|
t.datetime "updated_at"
|
32
32
|
end
|
33
33
|
|
34
|
-
create_table "memberships", force:
|
34
|
+
create_table "memberships", force: :cascade do |t|
|
35
35
|
t.integer "user_id"
|
36
36
|
t.integer "document_id"
|
37
37
|
t.integer "roles_mask", default: 0
|
@@ -39,7 +39,7 @@ ActiveRecord::Schema.define(version: 20141017140833) do
|
|
39
39
|
t.datetime "updated_at"
|
40
40
|
end
|
41
41
|
|
42
|
-
create_table "users", force:
|
42
|
+
create_table "users", force: :cascade do |t|
|
43
43
|
t.datetime "created_at"
|
44
44
|
t.datetime "updated_at"
|
45
45
|
end
|
@@ -1,197 +1,151 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class RoleableTest < ActiveSupport::TestCase
|
4
|
-
setup do
|
5
|
-
create_test_table :test_widgets do |t|
|
6
|
-
t.integer :roles_mask, default: 0
|
7
|
-
t.integer :access_mask, default: 0
|
8
|
-
end
|
9
|
-
|
10
|
-
@klass = Class.new(ActiveRecord::Base) do
|
11
|
-
self.table_name = 'test_widgets'
|
12
|
-
|
13
|
-
def self.name
|
14
|
-
'User'
|
15
|
-
end
|
16
|
-
|
17
|
-
include SimonSays::Roleable
|
18
|
-
|
19
|
-
has_roles :read, :write
|
20
|
-
end
|
21
|
-
|
22
|
-
@as_klass = Class.new(ActiveRecord::Base) do
|
23
|
-
self.table_name = 'test_widgets'
|
24
|
-
|
25
|
-
def self.name
|
26
|
-
'Admin'
|
27
|
-
end
|
28
|
-
|
29
|
-
include SimonSays::Roleable
|
30
|
-
|
31
|
-
has_roles :moderator, :support, :editor, as: :access
|
32
|
-
end
|
33
|
-
|
34
|
-
@instance = @klass.new
|
35
|
-
@as_instance = @as_klass.new
|
36
|
-
end
|
37
|
-
|
38
4
|
test "adds constant" do
|
39
|
-
assert_equal [:
|
5
|
+
assert_equal [:download, :fork, :edit, :delete], Membership::ROLES
|
40
6
|
end
|
41
7
|
|
42
8
|
test "adds constant with :as option" do
|
43
|
-
assert_equal [:
|
9
|
+
assert_equal [:support, :content, :marketing], Admin::ACCESS
|
44
10
|
end
|
45
11
|
|
46
12
|
test "adds roles method" do
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
test "adds roles= method" do
|
51
|
-
assert @instance.respond_to?(:roles=)
|
13
|
+
assert_equal Membership::ROLES, memberships(:mb1).roles
|
52
14
|
end
|
53
15
|
|
54
16
|
test "adds reader method with :as option" do
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
test "adds writer method with :as option" do
|
59
|
-
assert @as_instance.respond_to?(:access=)
|
60
|
-
end
|
61
|
-
|
62
|
-
test 'roles returns array of symbols' do
|
63
|
-
@instance.roles_mask = 3
|
64
|
-
|
65
|
-
assert_equal [:read, :write], @instance.roles
|
66
|
-
end
|
67
|
-
|
68
|
-
test 'roles returns array of symbols with :as option' do
|
69
|
-
@as_instance.access_mask = 6
|
70
|
-
|
71
|
-
assert_equal [:support, :editor], @as_instance.access
|
17
|
+
assert_equal Admin::ACCESS, admins(:all).access
|
72
18
|
end
|
73
19
|
|
74
|
-
test "set
|
75
|
-
|
20
|
+
test "set roles with multiple symbols" do
|
21
|
+
mbr = memberships(:mb2)
|
22
|
+
mbr.roles = :download, :fork
|
76
23
|
|
77
|
-
assert_equal
|
24
|
+
assert_equal [:download, :fork], mbr.roles
|
78
25
|
end
|
79
26
|
|
80
|
-
test "set
|
81
|
-
|
27
|
+
test "set roles with multiple symbols with :as option" do
|
28
|
+
adm = admins(:support)
|
29
|
+
adm.access = :support, :marketing
|
82
30
|
|
83
|
-
assert_equal
|
31
|
+
assert_equal [:support, :marketing], adm.access
|
84
32
|
end
|
85
33
|
|
86
|
-
test "set single
|
87
|
-
|
34
|
+
test "set roles with single symbol" do
|
35
|
+
mbr = memberships(:mb2)
|
36
|
+
mbr.roles = :download
|
88
37
|
|
89
|
-
assert_equal
|
38
|
+
assert_equal [:download], mbr.roles
|
90
39
|
end
|
91
40
|
|
92
|
-
test "set single
|
93
|
-
|
41
|
+
test "set roles with single symbol with :as option" do
|
42
|
+
adm = admins(:support)
|
43
|
+
adm.access = :marketing
|
94
44
|
|
95
|
-
assert_equal
|
45
|
+
assert_equal [:marketing], adm.access
|
96
46
|
end
|
97
47
|
|
98
|
-
test "set with
|
99
|
-
|
48
|
+
test "set roles with single string" do
|
49
|
+
mbr = memberships(:mb2)
|
50
|
+
mbr.roles = 'download'
|
100
51
|
|
101
|
-
assert_equal
|
52
|
+
assert_equal [:download], mbr.roles
|
102
53
|
end
|
103
54
|
|
104
|
-
test "set with
|
105
|
-
|
55
|
+
test "set roles with single string with :as option" do
|
56
|
+
adm = admins(:support)
|
57
|
+
adm.access = 'marketing'
|
106
58
|
|
107
|
-
assert_equal
|
59
|
+
assert_equal [:marketing], adm.access
|
108
60
|
end
|
109
61
|
|
110
|
-
test "set with
|
111
|
-
|
62
|
+
test "set roles with multiple strings" do
|
63
|
+
mbr = memberships(:mb2)
|
64
|
+
mbr.roles = 'download', 'fork'
|
112
65
|
|
113
|
-
assert_equal
|
66
|
+
assert_equal [:download, :fork], mbr.roles
|
114
67
|
end
|
115
68
|
|
116
|
-
test "set with
|
117
|
-
|
69
|
+
test "set roles with multiples strings with :as option" do
|
70
|
+
adm = admins(:support)
|
71
|
+
adm.access = 'marketing', 'content'
|
118
72
|
|
119
|
-
assert_equal
|
73
|
+
assert_equal [:content, :marketing], adm.access
|
120
74
|
end
|
121
75
|
|
122
|
-
test '
|
123
|
-
|
76
|
+
test 'ignores unknown roles' do
|
77
|
+
mbr = memberships(:mb2)
|
78
|
+
mbr.roles = :download, :unknown
|
124
79
|
|
125
|
-
assert_equal
|
80
|
+
assert_equal [:download], mbr.roles
|
126
81
|
end
|
127
82
|
|
128
|
-
test '
|
129
|
-
|
83
|
+
test 'handles out of order roles' do
|
84
|
+
mbr = memberships(:mb2)
|
85
|
+
mbr.roles = Membership::ROLES.reverse
|
130
86
|
|
131
|
-
assert_equal
|
132
|
-
end
|
133
|
-
|
134
|
-
test "set out order" do
|
135
|
-
@as_instance.access = :editor, :moderator, :support
|
136
|
-
|
137
|
-
assert_equal 7, @as_instance.access_mask
|
87
|
+
assert_equal Membership::ROLES, mbr.roles
|
138
88
|
end
|
139
89
|
|
140
90
|
test "has_roles? without any roles" do
|
141
|
-
|
91
|
+
mbr = memberships(:mb1)
|
92
|
+
mbr.roles = nil
|
93
|
+
|
94
|
+
assert_equal false, mbr.has_roles?(:download)
|
142
95
|
end
|
143
96
|
|
144
97
|
test "has_roles? with one role" do
|
145
|
-
|
98
|
+
mbr = memberships(:mb1)
|
99
|
+
mbr.roles = :download
|
146
100
|
|
147
|
-
assert_equal true,
|
101
|
+
assert_equal true, mbr.has_roles?(:download)
|
148
102
|
end
|
149
103
|
|
150
104
|
test "has_roles? with multiple role" do
|
151
|
-
|
105
|
+
mbr = memberships(:mb1)
|
106
|
+
mbr.roles = :download, :fork, :edit
|
152
107
|
|
153
|
-
assert_equal true,
|
108
|
+
assert_equal true, mbr.has_roles?(:download, :fork, :edit)
|
154
109
|
end
|
155
110
|
|
156
111
|
test "has_access? without any roles" do
|
157
|
-
|
112
|
+
adm = admins(:support)
|
113
|
+
adm.access = nil
|
114
|
+
|
115
|
+
assert_equal false, adm.has_access?(:support)
|
158
116
|
end
|
159
117
|
|
160
118
|
test "has_access? with one role" do
|
161
|
-
|
119
|
+
adm = admins(:support)
|
120
|
+
adm.access = :marketing
|
162
121
|
|
163
|
-
assert_equal true,
|
122
|
+
assert_equal true, adm.has_access?(:marketing)
|
164
123
|
end
|
165
124
|
|
166
125
|
test "has_access? with multiple role" do
|
167
|
-
|
126
|
+
adm = admins(:support)
|
127
|
+
adm.access = :support, :content, :marketing
|
168
128
|
|
169
|
-
assert_equal true,
|
129
|
+
assert_equal true, adm.has_access?(:support, :content, :marketing)
|
170
130
|
end
|
171
131
|
|
172
|
-
test "named scope" do
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
assert_equal [1, 1], [
|
177
|
-
@klass.with_roles(:read).count,
|
178
|
-
@klass.with_roles(:write).count
|
132
|
+
test "named scope with_roles" do
|
133
|
+
assert_equal [2, 1], [
|
134
|
+
Membership.with_roles(:download).count,
|
135
|
+
Membership.with_roles(:delete).count
|
179
136
|
]
|
180
137
|
end
|
181
138
|
|
182
|
-
test "named scope
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
@as_klass.with_access(:moderator).count,
|
188
|
-
@as_klass.with_access(:editor).count,
|
189
|
-
@as_klass.with_access(:support).count,
|
139
|
+
test "named scope with_access" do
|
140
|
+
assert_equal [2, 2, 2], [
|
141
|
+
Admin.with_access(:marketing).count,
|
142
|
+
Admin.with_access(:content).count,
|
143
|
+
Admin.with_access(:support).count
|
190
144
|
]
|
191
145
|
end
|
192
146
|
|
193
|
-
test "
|
194
|
-
assert_includes SimonSays::Roleable.registry, :
|
147
|
+
test "Membership is added to registry" do
|
148
|
+
assert_includes SimonSays::Roleable.registry, :membership
|
195
149
|
end
|
196
150
|
|
197
151
|
test "Admin is added to registry" do
|
data/test/test_helper.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
require "codeclimate-test-reporter"
|
2
|
+
CodeClimate::TestReporter.start
|
3
|
+
|
4
|
+
require 'mocha/mini_test'
|
5
|
+
|
1
6
|
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
7
|
require 'simon_says' # HELLO SIMON
|
3
8
|
|
@@ -26,7 +31,7 @@ ActiveRecord::Migrator.migrate(File.expand_path("../rails_app/db/migrate/", __FI
|
|
26
31
|
class ActiveSupport::TestCase
|
27
32
|
include ActiveRecord::TestFixtures
|
28
33
|
|
29
|
-
fixtures :
|
34
|
+
fixtures :all
|
30
35
|
|
31
36
|
def create_test_table(name, &block)
|
32
37
|
with_migration { |m| m.create_table name, &block }
|
metadata
CHANGED
@@ -1,43 +1,51 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simon_says
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Coyne
|
8
|
+
- Cameron Craig
|
9
|
+
- SimplyBuilt
|
8
10
|
autorequire:
|
9
11
|
bindir: bin
|
10
12
|
cert_chain: []
|
11
|
-
date:
|
13
|
+
date: 2016-07-21 00:00:00.000000000 Z
|
12
14
|
dependencies:
|
13
15
|
- !ruby/object:Gem::Dependency
|
14
16
|
name: activesupport
|
15
17
|
requirement: !ruby/object:Gem::Requirement
|
16
18
|
requirements:
|
17
|
-
- - "
|
19
|
+
- - ">="
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: '4.0'
|
22
|
+
- - "<"
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: '5.1'
|
20
25
|
type: :runtime
|
21
26
|
prerelease: false
|
22
27
|
version_requirements: !ruby/object:Gem::Requirement
|
23
28
|
requirements:
|
24
|
-
- - "
|
29
|
+
- - ">="
|
25
30
|
- !ruby/object:Gem::Version
|
26
31
|
version: '4.0'
|
32
|
+
- - "<"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '5.1'
|
27
35
|
- !ruby/object:Gem::Dependency
|
28
36
|
name: bundler
|
29
37
|
requirement: !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - "~>"
|
32
40
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
41
|
+
version: '1.9'
|
34
42
|
type: :development
|
35
43
|
prerelease: false
|
36
44
|
version_requirements: !ruby/object:Gem::Requirement
|
37
45
|
requirements:
|
38
46
|
- - "~>"
|
39
47
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
48
|
+
version: '1.9'
|
41
49
|
- !ruby/object:Gem::Dependency
|
42
50
|
name: rake
|
43
51
|
requirement: !ruby/object:Gem::Requirement
|
@@ -54,18 +62,38 @@ dependencies:
|
|
54
62
|
version: '10.0'
|
55
63
|
- !ruby/object:Gem::Dependency
|
56
64
|
name: rails
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '4.0'
|
70
|
+
- - "<"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '5.1'
|
73
|
+
type: :development
|
74
|
+
prerelease: false
|
75
|
+
version_requirements: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '4.0'
|
80
|
+
- - "<"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5.1'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: responders
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
87
|
- - "~>"
|
60
88
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
89
|
+
version: '2.0'
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
96
|
+
version: '2.0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: mocha
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -105,11 +133,7 @@ files:
|
|
105
133
|
- simon_says.gemspec
|
106
134
|
- test/controllers/admin/reports_controller_test.rb
|
107
135
|
- test/controllers/documents_controller_test.rb
|
108
|
-
- test/models/admin_test.rb
|
109
|
-
- test/models/membership_test.rb
|
110
136
|
- test/rails_app/.gitignore
|
111
|
-
- test/rails_app/Gemfile
|
112
|
-
- test/rails_app/Gemfile.lock
|
113
137
|
- test/rails_app/README.rdoc
|
114
138
|
- test/rails_app/Rakefile
|
115
139
|
- test/rails_app/app/assets/images/.keep
|
@@ -204,23 +228,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
204
228
|
version: '0'
|
205
229
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
206
230
|
requirements:
|
207
|
-
- - "
|
231
|
+
- - ">="
|
208
232
|
- !ruby/object:Gem::Version
|
209
|
-
version:
|
233
|
+
version: '0'
|
210
234
|
requirements: []
|
211
235
|
rubyforge_project:
|
212
|
-
rubygems_version: 2.4.
|
236
|
+
rubygems_version: 2.4.5.1
|
213
237
|
signing_key:
|
214
238
|
specification_version: 4
|
215
239
|
summary: Light-weight, declarative authorization and access control for Rails
|
216
240
|
test_files:
|
217
241
|
- test/controllers/admin/reports_controller_test.rb
|
218
242
|
- test/controllers/documents_controller_test.rb
|
219
|
-
- test/models/admin_test.rb
|
220
|
-
- test/models/membership_test.rb
|
221
243
|
- test/rails_app/.gitignore
|
222
|
-
- test/rails_app/Gemfile
|
223
|
-
- test/rails_app/Gemfile.lock
|
224
244
|
- test/rails_app/README.rdoc
|
225
245
|
- test/rails_app/Rakefile
|
226
246
|
- test/rails_app/app/assets/images/.keep
|
data/test/models/admin_test.rb
DELETED
data/test/rails_app/Gemfile
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
source 'https://rubygems.org'
|
2
|
-
|
3
|
-
|
4
|
-
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
|
5
|
-
gem 'rails', '4.1.6'
|
6
|
-
# Use sqlite3 as the database for Active Record
|
7
|
-
gem 'sqlite3'
|
8
|
-
# Use SCSS for stylesheets
|
9
|
-
gem 'sass-rails', '~> 4.0.3'
|
10
|
-
# Use Uglifier as compressor for JavaScript assets
|
11
|
-
gem 'uglifier', '>= 1.3.0'
|
12
|
-
# Use CoffeeScript for .js.coffee assets and views
|
13
|
-
gem 'coffee-rails', '~> 4.0.0'
|
14
|
-
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
|
15
|
-
# gem 'therubyracer', platforms: :ruby
|
16
|
-
|
17
|
-
# Use jquery as the JavaScript library
|
18
|
-
gem 'jquery-rails'
|
19
|
-
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
|
20
|
-
gem 'turbolinks'
|
21
|
-
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
|
22
|
-
gem 'jbuilder', '~> 2.0'
|
23
|
-
# bundle exec rake doc:rails generates the API under doc/api.
|
24
|
-
gem 'sdoc', '~> 0.4.0', group: :doc
|
25
|
-
|
26
|
-
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
|
27
|
-
gem 'spring', group: :development
|
28
|
-
|
29
|
-
# Use ActiveModel has_secure_password
|
30
|
-
# gem 'bcrypt', '~> 3.1.7'
|
31
|
-
|
32
|
-
# Use unicorn as the app server
|
33
|
-
# gem 'unicorn'
|
34
|
-
|
35
|
-
# Use Capistrano for deployment
|
36
|
-
# gem 'capistrano-rails', group: :development
|
37
|
-
|
38
|
-
# Use debugger
|
39
|
-
# gem 'debugger', group: [:development, :test]
|
40
|
-
|
data/test/rails_app/Gemfile.lock
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: https://rubygems.org/
|
3
|
-
specs:
|
4
|
-
actionmailer (4.1.6)
|
5
|
-
actionpack (= 4.1.6)
|
6
|
-
actionview (= 4.1.6)
|
7
|
-
mail (~> 2.5, >= 2.5.4)
|
8
|
-
actionpack (4.1.6)
|
9
|
-
actionview (= 4.1.6)
|
10
|
-
activesupport (= 4.1.6)
|
11
|
-
rack (~> 1.5.2)
|
12
|
-
rack-test (~> 0.6.2)
|
13
|
-
actionview (4.1.6)
|
14
|
-
activesupport (= 4.1.6)
|
15
|
-
builder (~> 3.1)
|
16
|
-
erubis (~> 2.7.0)
|
17
|
-
activemodel (4.1.6)
|
18
|
-
activesupport (= 4.1.6)
|
19
|
-
builder (~> 3.1)
|
20
|
-
activerecord (4.1.6)
|
21
|
-
activemodel (= 4.1.6)
|
22
|
-
activesupport (= 4.1.6)
|
23
|
-
arel (~> 5.0.0)
|
24
|
-
activesupport (4.1.6)
|
25
|
-
i18n (~> 0.6, >= 0.6.9)
|
26
|
-
json (~> 1.7, >= 1.7.7)
|
27
|
-
minitest (~> 5.1)
|
28
|
-
thread_safe (~> 0.1)
|
29
|
-
tzinfo (~> 1.1)
|
30
|
-
arel (5.0.1.20140414130214)
|
31
|
-
builder (3.2.2)
|
32
|
-
coffee-rails (4.0.1)
|
33
|
-
coffee-script (>= 2.2.0)
|
34
|
-
railties (>= 4.0.0, < 5.0)
|
35
|
-
coffee-script (2.3.0)
|
36
|
-
coffee-script-source
|
37
|
-
execjs
|
38
|
-
coffee-script-source (1.8.0)
|
39
|
-
erubis (2.7.0)
|
40
|
-
execjs (2.2.2)
|
41
|
-
hike (1.2.3)
|
42
|
-
i18n (0.6.11)
|
43
|
-
jbuilder (2.2.2)
|
44
|
-
activesupport (>= 3.0.0, < 5)
|
45
|
-
multi_json (~> 1.2)
|
46
|
-
jquery-rails (3.1.2)
|
47
|
-
railties (>= 3.0, < 5.0)
|
48
|
-
thor (>= 0.14, < 2.0)
|
49
|
-
json (1.8.1)
|
50
|
-
mail (2.6.1)
|
51
|
-
mime-types (>= 1.16, < 3)
|
52
|
-
mime-types (2.4.2)
|
53
|
-
minitest (5.4.2)
|
54
|
-
multi_json (1.10.1)
|
55
|
-
rack (1.5.2)
|
56
|
-
rack-test (0.6.2)
|
57
|
-
rack (>= 1.0)
|
58
|
-
rails (4.1.6)
|
59
|
-
actionmailer (= 4.1.6)
|
60
|
-
actionpack (= 4.1.6)
|
61
|
-
actionview (= 4.1.6)
|
62
|
-
activemodel (= 4.1.6)
|
63
|
-
activerecord (= 4.1.6)
|
64
|
-
activesupport (= 4.1.6)
|
65
|
-
bundler (>= 1.3.0, < 2.0)
|
66
|
-
railties (= 4.1.6)
|
67
|
-
sprockets-rails (~> 2.0)
|
68
|
-
railties (4.1.6)
|
69
|
-
actionpack (= 4.1.6)
|
70
|
-
activesupport (= 4.1.6)
|
71
|
-
rake (>= 0.8.7)
|
72
|
-
thor (>= 0.18.1, < 2.0)
|
73
|
-
rake (10.3.2)
|
74
|
-
rdoc (4.1.2)
|
75
|
-
json (~> 1.4)
|
76
|
-
sass (3.2.19)
|
77
|
-
sass-rails (4.0.3)
|
78
|
-
railties (>= 4.0.0, < 5.0)
|
79
|
-
sass (~> 3.2.0)
|
80
|
-
sprockets (~> 2.8, <= 2.11.0)
|
81
|
-
sprockets-rails (~> 2.0)
|
82
|
-
sdoc (0.4.1)
|
83
|
-
json (~> 1.7, >= 1.7.7)
|
84
|
-
rdoc (~> 4.0)
|
85
|
-
spring (1.1.3)
|
86
|
-
sprockets (2.11.0)
|
87
|
-
hike (~> 1.2)
|
88
|
-
multi_json (~> 1.0)
|
89
|
-
rack (~> 1.0)
|
90
|
-
tilt (~> 1.1, != 1.3.0)
|
91
|
-
sprockets-rails (2.2.0)
|
92
|
-
actionpack (>= 3.0)
|
93
|
-
activesupport (>= 3.0)
|
94
|
-
sprockets (>= 2.8, < 4.0)
|
95
|
-
sqlite3 (1.3.9)
|
96
|
-
thor (0.19.1)
|
97
|
-
thread_safe (0.3.4)
|
98
|
-
tilt (1.4.1)
|
99
|
-
turbolinks (2.4.0)
|
100
|
-
coffee-rails
|
101
|
-
tzinfo (1.2.2)
|
102
|
-
thread_safe (~> 0.1)
|
103
|
-
uglifier (2.5.3)
|
104
|
-
execjs (>= 0.3.0)
|
105
|
-
json (>= 1.8.0)
|
106
|
-
|
107
|
-
PLATFORMS
|
108
|
-
ruby
|
109
|
-
|
110
|
-
DEPENDENCIES
|
111
|
-
coffee-rails (~> 4.0.0)
|
112
|
-
jbuilder (~> 2.0)
|
113
|
-
jquery-rails
|
114
|
-
rails (= 4.1.6)
|
115
|
-
sass-rails (~> 4.0.3)
|
116
|
-
sdoc (~> 0.4.0)
|
117
|
-
spring
|
118
|
-
sqlite3
|
119
|
-
turbolinks
|
120
|
-
uglifier (>= 1.3.0)
|