acl9 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/.travis.yml +2 -1
- data/Appraisals +4 -0
- data/CONTRIBUTING.md +4 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +39 -27
- data/README.md +70 -1
- data/Rakefile +1 -0
- data/bin/appraisal +16 -0
- data/bin/bundler +16 -0
- data/bin/cc-tddium-post-worker +16 -0
- data/bin/erubis +16 -0
- data/bin/rackup +16 -0
- data/bin/rails +16 -0
- data/bin/rake +16 -0
- data/bin/sprockets +16 -0
- data/bin/tapout +16 -0
- data/bin/thor +16 -0
- data/bin/tilt +16 -0
- data/bin/yard +16 -0
- data/bin/yardoc +16 -0
- data/bin/yri +16 -0
- data/gemfiles/rails_4.0.gemfile +2 -0
- data/gemfiles/rails_4.1.gemfile +2 -0
- data/gemfiles/rails_4.2.gemfile +10 -0
- data/lib/acl9/model_extensions/for_subject.rb +5 -3
- data/lib/acl9/model_extensions.rb +3 -1
- data/lib/acl9/version.rb +1 -1
- data/test/controller_extensions/actions_test.rb +32 -0
- data/test/controllers/acl_query_mixin.rb +3 -3
- data/test/dummy/db/migrate/20141117132218_create_tables.rb +11 -14
- data/test/models/roles_test.rb +37 -2
- data/test/models/system_roles_test.rb +10 -4
- data/test/test_helper.rb +8 -0
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5811b1b61ac97d9081b9786e8dc361c93ff7b35
|
4
|
+
data.tar.gz: f1df54b8e0902d8b6d45928f2d6e2a2303bafae1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 275e6d8c27b7c520b52f943621f61f4507f88b55b2a75650583c6f1a572c8396d933fecb3e3eb7fdbfb32d8f9db22c3ddec06d084e752c66b776d9d8dd5595f9
|
7
|
+
data.tar.gz: 78de89953adc12b839df2791eae3d07d896d197f5df92ff8986dc4813a6484a3cd56ab5c00d58247ee1672afdd8e67e0b9ee0fccbf44685338fc379e7212649d
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.5
|
data/.travis.yml
CHANGED
data/Appraisals
CHANGED
data/CONTRIBUTING.md
CHANGED
@@ -26,6 +26,10 @@ and submit a pull request.
|
|
26
26
|
|
27
27
|
### Setup
|
28
28
|
|
29
|
+
We have a `.ruby-version` file, so if you use a ruby manager that
|
30
|
+
understands that then you might need to install that version of ruby, but you
|
31
|
+
should know how to do that yourself.
|
32
|
+
|
29
33
|
You should be able to just fork the repo and run `bundle && rake` to see the
|
30
34
|
tests running.
|
31
35
|
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,38 +1,39 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
acl9 (1.
|
4
|
+
acl9 (1.1.0)
|
5
5
|
rails (~> 4.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
|
-
actionmailer (4.1.
|
11
|
-
actionpack (= 4.1.
|
12
|
-
actionview (= 4.1.
|
10
|
+
actionmailer (4.1.8)
|
11
|
+
actionpack (= 4.1.8)
|
12
|
+
actionview (= 4.1.8)
|
13
13
|
mail (~> 2.5, >= 2.5.4)
|
14
|
-
actionpack (4.1.
|
15
|
-
actionview (= 4.1.
|
16
|
-
activesupport (= 4.1.
|
14
|
+
actionpack (4.1.8)
|
15
|
+
actionview (= 4.1.8)
|
16
|
+
activesupport (= 4.1.8)
|
17
17
|
rack (~> 1.5.2)
|
18
18
|
rack-test (~> 0.6.2)
|
19
|
-
actionview (4.1.
|
20
|
-
activesupport (= 4.1.
|
19
|
+
actionview (4.1.8)
|
20
|
+
activesupport (= 4.1.8)
|
21
21
|
builder (~> 3.1)
|
22
22
|
erubis (~> 2.7.0)
|
23
|
-
activemodel (4.1.
|
24
|
-
activesupport (= 4.1.
|
23
|
+
activemodel (4.1.8)
|
24
|
+
activesupport (= 4.1.8)
|
25
25
|
builder (~> 3.1)
|
26
|
-
activerecord (4.1.
|
27
|
-
activemodel (= 4.1.
|
28
|
-
activesupport (= 4.1.
|
26
|
+
activerecord (4.1.8)
|
27
|
+
activemodel (= 4.1.8)
|
28
|
+
activesupport (= 4.1.8)
|
29
29
|
arel (~> 5.0.0)
|
30
|
-
activesupport (4.1.
|
30
|
+
activesupport (4.1.8)
|
31
31
|
i18n (~> 0.6, >= 0.6.9)
|
32
32
|
json (~> 1.7, >= 1.7.7)
|
33
33
|
minitest (~> 5.1)
|
34
34
|
thread_safe (~> 0.1)
|
35
35
|
tzinfo (~> 1.1)
|
36
|
+
ansi (1.4.3)
|
36
37
|
appraisal (1.0.2)
|
37
38
|
bundler
|
38
39
|
rake
|
@@ -49,24 +50,30 @@ GEM
|
|
49
50
|
mail (2.6.3)
|
50
51
|
mime-types (>= 1.16, < 3)
|
51
52
|
mime-types (2.4.3)
|
53
|
+
minitap (0.5.3)
|
54
|
+
minitest (~> 5.0)
|
55
|
+
minitest-reporter-api (>= 0.0.2)
|
56
|
+
tapout (>= 0.3.0)
|
52
57
|
minitest (5.4.3)
|
58
|
+
minitest-reporter-api (0.0.5)
|
59
|
+
minitest (~> 5.0)
|
53
60
|
multi_json (1.10.1)
|
54
61
|
rack (1.5.2)
|
55
62
|
rack-test (0.6.2)
|
56
63
|
rack (>= 1.0)
|
57
|
-
rails (4.1.
|
58
|
-
actionmailer (= 4.1.
|
59
|
-
actionpack (= 4.1.
|
60
|
-
actionview (= 4.1.
|
61
|
-
activemodel (= 4.1.
|
62
|
-
activerecord (= 4.1.
|
63
|
-
activesupport (= 4.1.
|
64
|
+
rails (4.1.8)
|
65
|
+
actionmailer (= 4.1.8)
|
66
|
+
actionpack (= 4.1.8)
|
67
|
+
actionview (= 4.1.8)
|
68
|
+
activemodel (= 4.1.8)
|
69
|
+
activerecord (= 4.1.8)
|
70
|
+
activesupport (= 4.1.8)
|
64
71
|
bundler (>= 1.3.0, < 2.0)
|
65
|
-
railties (= 4.1.
|
72
|
+
railties (= 4.1.8)
|
66
73
|
sprockets-rails (~> 2.0)
|
67
|
-
railties (4.1.
|
68
|
-
actionpack (= 4.1.
|
69
|
-
activesupport (= 4.1.
|
74
|
+
railties (4.1.8)
|
75
|
+
actionpack (= 4.1.8)
|
76
|
+
activesupport (= 4.1.8)
|
70
77
|
rake (>= 0.8.7)
|
71
78
|
thor (>= 0.18.1, < 2.0)
|
72
79
|
rake (10.3.2)
|
@@ -80,11 +87,14 @@ GEM
|
|
80
87
|
multi_json (~> 1.0)
|
81
88
|
rack (~> 1.0)
|
82
89
|
tilt (~> 1.1, != 1.3.0)
|
83
|
-
sprockets-rails (2.2.
|
90
|
+
sprockets-rails (2.2.2)
|
84
91
|
actionpack (>= 3.0)
|
85
92
|
activesupport (>= 3.0)
|
86
93
|
sprockets (>= 2.8, < 4.0)
|
87
94
|
sqlite3 (1.3.10)
|
95
|
+
tapout (0.4.5)
|
96
|
+
ansi
|
97
|
+
json
|
88
98
|
thor (0.19.1)
|
89
99
|
thread_safe (0.3.4)
|
90
100
|
tilt (1.4.1)
|
@@ -99,5 +109,7 @@ DEPENDENCIES
|
|
99
109
|
acl9!
|
100
110
|
appraisal
|
101
111
|
codeclimate-test-reporter
|
112
|
+
minitap
|
102
113
|
sqlite3
|
114
|
+
tapout
|
103
115
|
yard
|
data/README.md
CHANGED
@@ -19,6 +19,8 @@ Acl9 is [Semantically Versioned](http://semver.org/), so just add this to your
|
|
19
19
|
gem 'acl9', '~> 1.0'
|
20
20
|
```
|
21
21
|
|
22
|
+
You will need Ruby 2.x
|
23
|
+
|
22
24
|
We dropped support for Rails < 4 in the 1.x releases, so if you're still using
|
23
25
|
Rails 2.x or 3.x then you'll want this:
|
24
26
|
|
@@ -38,7 +40,7 @@ obvious for any developer looking at the controller:
|
|
38
40
|
```ruby
|
39
41
|
class Admin::SchoolsController < ApplicationController
|
40
42
|
access_control do
|
41
|
-
allow :support, School
|
43
|
+
allow :support, :of => School
|
42
44
|
allow :admins, :managers, :teachers, :of => :school
|
43
45
|
deny :teachers, :to => :destroy
|
44
46
|
|
@@ -97,6 +99,73 @@ user.has_no_role! :support, School
|
|
97
99
|
You can see more about all this stuff in the wiki under [Role
|
98
100
|
Subsystem](//github.com/be9/acl9/wiki/Role-Subsystem)
|
99
101
|
|
102
|
+
## Configuration
|
103
|
+
|
104
|
+
There are five configurable settings. These all have sensible defaults which can
|
105
|
+
be easily overridden by merging into the `Acl9::config` hash. You can also
|
106
|
+
override each of the `:default_*` settings (dropping the "default_" prefix) in
|
107
|
+
your models/controllers - see below for more detail:
|
108
|
+
|
109
|
+
### :default_role_class_name
|
110
|
+
|
111
|
+
Set to `'Role'` and can be overridden in your "user" model, [see the wiki for more](//github.com/be9/acl9/wiki/Role-Subsystem#custom-class-names).
|
112
|
+
|
113
|
+
### :default_association_name
|
114
|
+
|
115
|
+
Set to `:role_objects` and can be overridden in
|
116
|
+
your "user" model, [see the wiki for more](//github.com/be9/acl9/wiki/Role-Subsystem#subject-model).
|
117
|
+
We chose a name for this association that was unlikely to conflict with
|
118
|
+
existing models but a lot of people override this to be just `:roles`
|
119
|
+
|
120
|
+
### :default_subject_class_name
|
121
|
+
|
122
|
+
Set to `'User'` and can be overridden in your
|
123
|
+
"role" model, [see the wiki for more](//github.com/be9/acl9/wiki/Role-Subsystem#custom-class-names).
|
124
|
+
|
125
|
+
### :default_subject_method
|
126
|
+
|
127
|
+
Set to `:current_user` and can be overridden in
|
128
|
+
your controllers, [see the wiki for more](//github.com/be9/acl9/wiki/Access-Control-Subsystem#subject_method).
|
129
|
+
|
130
|
+
### :protect_global_roles
|
131
|
+
|
132
|
+
Set to `true` (see "Upgrade Notes" below if you're upgrading) and can only be
|
133
|
+
changed by merging into `Acl9::config`. This setting changes how global roles
|
134
|
+
(ie. roles with no object) are treated.
|
135
|
+
|
136
|
+
Say we set a role like so:
|
137
|
+
|
138
|
+
```ruby
|
139
|
+
user.has_role! :admin, school
|
140
|
+
```
|
141
|
+
|
142
|
+
When `:protect_global_roles` is `true` (as is the default) then `user.has_role?
|
143
|
+
:admin` is `false`. Ie. changing the role on a specific instance doesn't impact
|
144
|
+
the global role (hence the name).
|
145
|
+
|
146
|
+
When `:protect_global_roles` is `false` then `user.has_role? :admin` is `true`.
|
147
|
+
Ie. setting a role on a specific instance makes that person a global one of
|
148
|
+
those roles.
|
149
|
+
|
150
|
+
Basically these are just two different ways of working with roles, if you're
|
151
|
+
protecting your global roles then you can use them as sort of a superuser
|
152
|
+
version of a given role. So you can have an admin of a school **and** a global
|
153
|
+
admin with different privileges.
|
154
|
+
|
155
|
+
If you don't protect your global roles then you can use them as a catch-all for
|
156
|
+
any specific roles, so then the admins of schools, classrooms and students can
|
157
|
+
all be granted a privilege by allowing the global `:admin` role.
|
158
|
+
|
159
|
+
### Example
|
160
|
+
|
161
|
+
```ruby
|
162
|
+
# config/initializers/acl9.rb
|
163
|
+
Acl9::config.merge! :default_association_name => :roles
|
164
|
+
|
165
|
+
# or...
|
166
|
+
Acl9::config[:default_association_name] = :roles
|
167
|
+
```
|
168
|
+
|
100
169
|
## Upgrade Notes
|
101
170
|
|
102
171
|
Please, PLEASE, **PLEASE** note. If you're upgrading from the `0.x` series of acl9
|
data/Rakefile
CHANGED
data/bin/appraisal
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'appraisal' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('appraisal', 'appraisal')
|
data/bin/bundler
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'bundler' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('bundler', 'bundler')
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'cc-tddium-post-worker' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('codeclimate-test-reporter', 'cc-tddium-post-worker')
|
data/bin/erubis
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'erubis' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('erubis', 'erubis')
|
data/bin/rackup
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rackup' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rack', 'rackup')
|
data/bin/rails
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rails' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('railties', 'rails')
|
data/bin/rake
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rake' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rake', 'rake')
|
data/bin/sprockets
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'sprockets' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('sprockets', 'sprockets')
|
data/bin/tapout
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'tapout' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('tapout', 'tapout')
|
data/bin/thor
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'thor' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('thor', 'thor')
|
data/bin/tilt
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'tilt' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('tilt', 'tilt')
|
data/bin/yard
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'yard' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('yard', 'yard')
|
data/bin/yardoc
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'yardoc' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('yard', 'yardoc')
|
data/bin/yri
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'yri' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('yard', 'yri')
|
data/gemfiles/rails_4.0.gemfile
CHANGED
data/gemfiles/rails_4.1.gemfile
CHANGED
@@ -164,10 +164,12 @@ module Acl9
|
|
164
164
|
|
165
165
|
def delete_role(role)
|
166
166
|
if role
|
167
|
-
self._role_objects.delete
|
168
|
-
|
169
|
-
|
167
|
+
if ret = self._role_objects.delete(role)
|
168
|
+
if role.send(self._auth_subject_class_name.demodulize.tableize).empty?
|
169
|
+
ret &&= role.destroy unless role.respond_to?(:system?) && role.system?
|
170
|
+
end
|
170
171
|
end
|
172
|
+
ret
|
171
173
|
end
|
172
174
|
end
|
173
175
|
|
@@ -24,7 +24,7 @@ module Acl9
|
|
24
24
|
# end
|
25
25
|
#
|
26
26
|
# user = User.new
|
27
|
-
# user.
|
27
|
+
# user.role_objects #=> returns Role objects, associated with the user
|
28
28
|
# user.has_role!(...)
|
29
29
|
# user.has_no_role!(...)
|
30
30
|
#
|
@@ -39,6 +39,8 @@ module Acl9
|
|
39
39
|
|
40
40
|
has_and_belongs_to_many assoc.to_sym, :class_name => role, :join_table => join_table
|
41
41
|
|
42
|
+
before_destroy :has_no_roles!
|
43
|
+
|
42
44
|
cattr_accessor :_auth_role_class_name, :_auth_subject_class_name,
|
43
45
|
:_auth_role_assoc_name
|
44
46
|
|
data/lib/acl9/version.rb
CHANGED
@@ -163,5 +163,37 @@ module ControllerExtensions
|
|
163
163
|
permit_some member, %w(index show)
|
164
164
|
permit_some nil, %w(index show)
|
165
165
|
end
|
166
|
+
|
167
|
+
test "multiple allows in an action" do
|
168
|
+
assert ( special = User.create ).has_role! :special
|
169
|
+
assert ( viewer = User.create ).has_role! :viewer
|
170
|
+
|
171
|
+
@tester.acl_block! do
|
172
|
+
action :show do
|
173
|
+
allow all
|
174
|
+
allow :viewer
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
assert set_all_actions
|
179
|
+
permit_some special, %w(show)
|
180
|
+
permit_some viewer, %w(show)
|
181
|
+
end
|
182
|
+
|
183
|
+
test "multiple allows with logged_in" do
|
184
|
+
assert ( normal = User.create )
|
185
|
+
assert ( viewer = User.create ).has_role! :viewer
|
186
|
+
|
187
|
+
@tester.acl_block! do
|
188
|
+
action :index do
|
189
|
+
allow logged_in
|
190
|
+
allow :viewer
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
assert set_all_actions
|
195
|
+
permit_some normal, %w(index)
|
196
|
+
permit_some viewer, %w(index)
|
197
|
+
end
|
166
198
|
end
|
167
199
|
end
|
@@ -4,9 +4,9 @@ module ACLQueryMixin
|
|
4
4
|
def self.included base
|
5
5
|
base.class_eval do
|
6
6
|
setup do
|
7
|
-
( @editor = User.create ).has_role! :editor
|
8
|
-
( @viewer = User.create ).has_role! :viewer
|
9
|
-
( @owneroffoo = User.create ).has_role! :owner, Foo.first_or_create
|
7
|
+
assert ( @editor = User.create ).has_role! :editor
|
8
|
+
assert ( @viewer = User.create ).has_role! :viewer
|
9
|
+
assert ( @owneroffoo = User.create ).has_role! :owner, Foo.first_or_create
|
10
10
|
end
|
11
11
|
|
12
12
|
%i[edit update destroy].each do |meth|
|
@@ -5,7 +5,7 @@ class CreateTables < ActiveRecord::Migration
|
|
5
5
|
t.boolean :system
|
6
6
|
t.string :authorizable_type, :limit => 40
|
7
7
|
t.integer :authorizable_id
|
8
|
-
t.timestamps
|
8
|
+
t.timestamps null: false
|
9
9
|
end
|
10
10
|
|
11
11
|
add_index :roles, [:authorizable_type, :authorizable_id]
|
@@ -13,7 +13,6 @@ class CreateTables < ActiveRecord::Migration
|
|
13
13
|
create_table :roles_users, id: false do |t|
|
14
14
|
t.references :user
|
15
15
|
t.references :role
|
16
|
-
t.timestamps
|
17
16
|
end
|
18
17
|
|
19
18
|
add_index :roles_users, :user_id
|
@@ -21,28 +20,28 @@ class CreateTables < ActiveRecord::Migration
|
|
21
20
|
|
22
21
|
create_table :users do |t|
|
23
22
|
t.string :name
|
24
|
-
t.timestamps
|
23
|
+
t.timestamps null: false
|
25
24
|
end
|
26
25
|
|
27
26
|
create_table :foos do |t|
|
28
27
|
t.string :name
|
29
|
-
t.timestamps
|
28
|
+
t.timestamps null: false
|
30
29
|
end
|
31
30
|
|
32
31
|
create_table :bars do |t|
|
33
32
|
t.string :name
|
34
|
-
t.timestamps
|
33
|
+
t.timestamps null: false
|
35
34
|
end
|
36
35
|
|
37
36
|
create_table :uuids, id: false do |t|
|
38
37
|
t.string :uuid, primary_key: true
|
39
38
|
t.string :name
|
40
|
-
t.timestamps
|
39
|
+
t.timestamps null: false
|
41
40
|
end
|
42
41
|
|
43
42
|
create_table :accounts do |t|
|
44
43
|
t.string :name
|
45
|
-
t.timestamps
|
44
|
+
t.timestamps null: false
|
46
45
|
end
|
47
46
|
|
48
47
|
create_table :accesses do |t|
|
@@ -50,7 +49,7 @@ class CreateTables < ActiveRecord::Migration
|
|
50
49
|
t.boolean :system
|
51
50
|
t.string :authorizable_type, :limit => 40
|
52
51
|
t.integer :authorizable_id
|
53
|
-
t.timestamps
|
52
|
+
t.timestamps null: false
|
54
53
|
end
|
55
54
|
|
56
55
|
add_index :accesses, [:authorizable_type, :authorizable_id]
|
@@ -58,7 +57,6 @@ class CreateTables < ActiveRecord::Migration
|
|
58
57
|
create_table :accesses_accounts, id: false do |t|
|
59
58
|
t.references :account
|
60
59
|
t.references :access
|
61
|
-
t.timestamps
|
62
60
|
end
|
63
61
|
|
64
62
|
add_index :accesses_accounts, :access_id
|
@@ -66,7 +64,7 @@ class CreateTables < ActiveRecord::Migration
|
|
66
64
|
|
67
65
|
create_table :foo_bars do |t|
|
68
66
|
t.string :name
|
69
|
-
t.timestamps
|
67
|
+
t.timestamps null: false
|
70
68
|
end
|
71
69
|
|
72
70
|
|
@@ -75,7 +73,7 @@ class CreateTables < ActiveRecord::Migration
|
|
75
73
|
t.boolean :system
|
76
74
|
t.string :authorizable_type, :limit => 40
|
77
75
|
t.integer :authorizable_id
|
78
|
-
t.timestamps
|
76
|
+
t.timestamps null: false
|
79
77
|
end
|
80
78
|
|
81
79
|
add_index :other_roles, [:authorizable_type, :authorizable_id]
|
@@ -83,7 +81,6 @@ class CreateTables < ActiveRecord::Migration
|
|
83
81
|
create_table :other_roles_users, id: false do |t|
|
84
82
|
t.references :user
|
85
83
|
t.references :role
|
86
|
-
t.timestamps
|
87
84
|
end
|
88
85
|
|
89
86
|
add_index :other_roles_users, :user_id
|
@@ -91,12 +88,12 @@ class CreateTables < ActiveRecord::Migration
|
|
91
88
|
|
92
89
|
create_table :other_users do |t|
|
93
90
|
t.string :name
|
94
|
-
t.timestamps
|
91
|
+
t.timestamps null: false
|
95
92
|
end
|
96
93
|
|
97
94
|
create_table :other_foos do |t|
|
98
95
|
t.string :name
|
99
|
-
t.timestamps
|
96
|
+
t.timestamps null: false
|
100
97
|
end
|
101
98
|
end
|
102
99
|
end
|
data/test/models/roles_test.rb
CHANGED
@@ -190,16 +190,23 @@ class RolesTest < ActiveSupport::TestCase
|
|
190
190
|
assert_equal 0, @user.role_objects.count
|
191
191
|
end
|
192
192
|
|
193
|
+
test "role setters true even with multiple roles" do
|
194
|
+
assert @user.has_role! :owner, @bar
|
195
|
+
assert @user2.has_role! :owner, @bar
|
196
|
+
|
197
|
+
assert @user.has_no_role! :owner, @bar
|
198
|
+
end
|
199
|
+
|
193
200
|
test "should delete unused roles from table" do
|
194
201
|
assert @user.has_role! :owner, @bar
|
195
202
|
assert @user2.has_role! :owner, @bar
|
196
203
|
|
197
204
|
assert_equal 1, Role.count
|
198
205
|
|
199
|
-
@bar.accepts_no_role! :owner, @user2
|
206
|
+
assert @bar.accepts_no_role! :owner, @user2
|
200
207
|
assert_equal 1, Role.count
|
201
208
|
|
202
|
-
@bar.accepts_no_role! :owner, @user
|
209
|
+
assert @bar.accepts_no_role! :owner, @user
|
203
210
|
|
204
211
|
assert_equal 0, Role.count
|
205
212
|
end
|
@@ -236,6 +243,34 @@ class RolesTest < ActiveSupport::TestCase
|
|
236
243
|
assert @user.has_role?(:manager, @foo)
|
237
244
|
end
|
238
245
|
|
246
|
+
test "remove access for destroyed object" do
|
247
|
+
assert_empty @user.role_objects
|
248
|
+
assert @user.has_role! :admin, @foo
|
249
|
+
refute_empty @user.role_objects
|
250
|
+
assert @user.has_role? :admin, @foo
|
251
|
+
|
252
|
+
assert @foo.destroy
|
253
|
+
refute @foo.accepts_role? :admin, @user
|
254
|
+
|
255
|
+
assert @user.reload
|
256
|
+
assert_empty @user.role_objects
|
257
|
+
refute @user.has_role? :admin, @foo
|
258
|
+
end
|
259
|
+
|
260
|
+
test "remove access for destroyed subject" do
|
261
|
+
assert_empty @foo.accepted_roles
|
262
|
+
assert @foo.accepts_role! :admin, @user
|
263
|
+
refute_empty @foo.accepted_roles
|
264
|
+
assert @foo.accepts_role? :admin, @user
|
265
|
+
|
266
|
+
assert @user.destroy
|
267
|
+
refute @user.has_role? :admin, @foo
|
268
|
+
|
269
|
+
assert @foo.reload
|
270
|
+
assert_empty @foo.accepted_roles
|
271
|
+
refute @foo.accepts_role? :admin, @user
|
272
|
+
end
|
273
|
+
|
239
274
|
private
|
240
275
|
|
241
276
|
def set_some_roles
|
@@ -7,10 +7,16 @@ class SystemRolesTest < ActiveSupport::TestCase
|
|
7
7
|
assert_equal 1, Role.count
|
8
8
|
|
9
9
|
assert user = User.create
|
10
|
-
|
11
|
-
|
10
|
+
assert_difference -> { Role.count }, 0 do
|
11
|
+
assert user.has_role! :admin
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
14
|
+
assert user.has_role? :admin
|
15
|
+
|
16
|
+
assert_difference -> { Role.count }, 0 do
|
17
|
+
assert user.has_no_role! :admin
|
18
|
+
end
|
19
|
+
|
20
|
+
refute user.has_role? :admin
|
15
21
|
end
|
16
22
|
end
|
data/test/test_helper.rb
CHANGED
@@ -4,12 +4,20 @@ CodeClimate::TestReporter.start
|
|
4
4
|
ENV["RAILS_ENV"] = "test"
|
5
5
|
|
6
6
|
require 'minitest/autorun'
|
7
|
+
require 'minitap'
|
8
|
+
|
9
|
+
if defined? Minitap
|
10
|
+
Minitest.reporter = Minitap::TapY
|
11
|
+
else
|
12
|
+
MiniTest::Unit.runner = MiniTest::TapY.new
|
13
|
+
end
|
7
14
|
|
8
15
|
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
9
16
|
require "rails/test_help"
|
10
17
|
|
11
18
|
Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"]
|
12
19
|
|
20
|
+
ActiveRecord::Migration.verbose = false
|
13
21
|
ActiveRecord::Migrator.migrate File.expand_path("../dummy/db/migrate/", __FILE__)
|
14
22
|
|
15
23
|
class ActionController::TestCase
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acl9
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- oleg dashevskii
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-12-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -79,6 +79,7 @@ extensions: []
|
|
79
79
|
extra_rdoc_files: []
|
80
80
|
files:
|
81
81
|
- ".gitignore"
|
82
|
+
- ".ruby-version"
|
82
83
|
- ".travis.yml"
|
83
84
|
- Appraisals
|
84
85
|
- CHANGELOG.textile
|
@@ -91,8 +92,23 @@ files:
|
|
91
92
|
- Rakefile
|
92
93
|
- TODO
|
93
94
|
- acl9.gemspec
|
95
|
+
- bin/appraisal
|
96
|
+
- bin/bundler
|
97
|
+
- bin/cc-tddium-post-worker
|
98
|
+
- bin/erubis
|
99
|
+
- bin/rackup
|
100
|
+
- bin/rails
|
101
|
+
- bin/rake
|
102
|
+
- bin/sprockets
|
103
|
+
- bin/tapout
|
104
|
+
- bin/thor
|
105
|
+
- bin/tilt
|
106
|
+
- bin/yard
|
107
|
+
- bin/yardoc
|
108
|
+
- bin/yri
|
94
109
|
- gemfiles/rails_4.0.gemfile
|
95
110
|
- gemfiles/rails_4.1.gemfile
|
111
|
+
- gemfiles/rails_4.2.gemfile
|
96
112
|
- lib/acl9.rb
|
97
113
|
- lib/acl9/controller_extensions.rb
|
98
114
|
- lib/acl9/controller_extensions/dsl_base.rb
|