simon_says 0.0.27b6 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
![Build Status](https://travis-ci.org/SimplyBuilt/SimonSays.svg)
|
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)
|