cancannible 0.0.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.travis.yml +10 -0
- data/Appraisals +11 -0
- data/Gemfile +1 -3
- data/README.md +20 -2
- data/cancannible.gemspec +3 -3
- data/gemfiles/rails_3.gemfile +10 -0
- data/gemfiles/rails_3.gemfile.lock +98 -0
- data/gemfiles/rails_4.gemfile +10 -0
- data/gemfiles/rails_4.gemfile.lock +103 -0
- data/lib/cancannible/grantee.rb +8 -14
- data/lib/cancannible/version.rb +1 -1
- data/lib/generators/cancannible/templates/cancannible_initializer.rb +1 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/support/models.rb +1 -1
- data/spec/unit/grantee_spec.rb +5 -1
- metadata +20 -15
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZjFkNmJkNGYzODQ2NDRkZDJlODM0M2UyYjY2OTNlODJjMWIzNjU1Yw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YzhmMDIxNGY3Y2NkOThiMDEzYzI2ODU5NTA1ZDMyMDA3NWQ1YzdjYQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MTc3ZGNlOTU1NzliNGFlNjBjOTk0ZGVmZDMyNzg4ODBlYTkxNGM4Njg3Mjdi
|
10
|
+
NDlkYjc0ZDg3NDRkZDIzMjkzMjRhOGQxZTQ4N2JiZDI1MjAxMWE4NzQ3ZmY5
|
11
|
+
NGFjZTYxYWM4Yzg0NGNlMWM3NGMzZTgxNjIxZWE5OThjNTAyMGE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YzQzYzU4ZDEzZmRjZWZmNTZkYmVkNzExNzQxN2UyODNmNjc4ZWUzNTE2ZTZm
|
14
|
+
MzhmNDE2NjQwN2YyMzcwMDg5OTg5MGY1OGNiZjQyNDRmM2EyNjJmOGYxZGUw
|
15
|
+
ZjY1MjI2NmNhNTBkM2UyNjg4MTA1MGI3ZWIwNWFmYWE5MTY2NGM=
|
data/.travis.yml
CHANGED
data/Appraisals
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -7,16 +7,17 @@ Cancannible is a gem that extends CanCan with a range of capabilities:
|
|
7
7
|
* permissions inheritance (so that, for example, a User can inherit permissions from Roles and/or Groups)
|
8
8
|
* caching of abilities (so that they don't need to be recalculated on each web request)
|
9
9
|
* general-purpose access refinements (so that, for example, CanCan will automatically enforce multi-tenant or other security restrictions)
|
10
|
+
* battle-tested with Rails 3.2
|
11
|
+
* tested with Rails 4 (but limited experience in the field?)
|
10
12
|
|
11
13
|
## Limitations
|
12
|
-
Cancannible's origin was in a web application that's been in production for over
|
14
|
+
Cancannible's origin was in a web application that's been in production for over 4 years.
|
13
15
|
This gem is an initial refactoring as a separate component. It continues to be used in production, but
|
14
16
|
there are some limitations and constraints that will ideally be removed or changed over time:
|
15
17
|
|
16
18
|
* It only supports ActiveRecord for permissions storage (specifically, it has been tested with PostgreSQL and SQLite)
|
17
19
|
* It currently assumes permissions are stored in a Permission model with a specific structure
|
18
20
|
* It works with the [CanCan](https://github.com/ryanb/cancan) gem. It has not yet been tested with the new [CanCanCan](https://github.com/CanCanCommunity/cancancan) gem.
|
19
|
-
* It assumes and is only tested with Rails 3.2. Not yet with Rails 4.
|
20
21
|
* It assumes your CanCan rules are setup with the default `Ability` class
|
21
22
|
|
22
23
|
|
@@ -120,6 +121,23 @@ For example, this is a simple scheme using Redis:
|
|
120
121
|
end
|
121
122
|
|
122
123
|
|
124
|
+
## Testing the gem
|
125
|
+
|
126
|
+
The RSpec test suite runs as the default rake task:
|
127
|
+
|
128
|
+
rake
|
129
|
+
# same as:
|
130
|
+
rake spec
|
131
|
+
|
132
|
+
For convenience, guard is included in the development gem environment, so you can start automatic testing-on-change:
|
133
|
+
|
134
|
+
bundle exec guard
|
135
|
+
|
136
|
+
[Appraisal](https://github.com/thoughtbot/appraisal) is also included to run tests across Rails 3 and 4 environments:
|
137
|
+
|
138
|
+
appraisal rake spec
|
139
|
+
|
140
|
+
|
123
141
|
## Contributing
|
124
142
|
|
125
143
|
1. Fork it ( https://github.com/evendis/cancannible/fork )
|
data/cancannible.gemspec
CHANGED
@@ -18,11 +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_runtime_dependency "activesupport", "
|
22
|
-
spec.add_runtime_dependency "activemodel", "
|
21
|
+
spec.add_runtime_dependency "activesupport", ">= 3.2.1"
|
22
|
+
spec.add_runtime_dependency "activemodel", ">= 3.2.1"
|
23
23
|
spec.add_runtime_dependency "cancan", "~> 1.6"
|
24
24
|
|
25
|
-
spec.add_development_dependency "activerecord", "
|
25
|
+
spec.add_development_dependency "activerecord", ">= 3.2.1"
|
26
26
|
spec.add_development_dependency "sqlite3", "~> 1.3"
|
27
27
|
spec.add_development_dependency "bundler", "~> 1.6"
|
28
28
|
spec.add_development_dependency "rake", "~> 10.0"
|
@@ -0,0 +1,98 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../
|
3
|
+
specs:
|
4
|
+
cancannible (1.0.0)
|
5
|
+
activemodel (>= 3.2.1)
|
6
|
+
activesupport (>= 3.2.1)
|
7
|
+
cancan (~> 1.6)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
activemodel (3.2.19)
|
13
|
+
activesupport (= 3.2.19)
|
14
|
+
builder (~> 3.0.0)
|
15
|
+
activerecord (3.2.19)
|
16
|
+
activemodel (= 3.2.19)
|
17
|
+
activesupport (= 3.2.19)
|
18
|
+
arel (~> 3.0.2)
|
19
|
+
tzinfo (~> 0.3.29)
|
20
|
+
activesupport (3.2.19)
|
21
|
+
i18n (~> 0.6, >= 0.6.4)
|
22
|
+
multi_json (~> 1.0)
|
23
|
+
appraisal (1.0.2)
|
24
|
+
bundler
|
25
|
+
rake
|
26
|
+
thor (>= 0.14.0)
|
27
|
+
arel (3.0.3)
|
28
|
+
builder (3.0.4)
|
29
|
+
cancan (1.6.10)
|
30
|
+
celluloid (0.16.0)
|
31
|
+
timers (~> 4.0.0)
|
32
|
+
coderay (1.1.0)
|
33
|
+
diff-lcs (1.2.5)
|
34
|
+
ffi (1.9.6)
|
35
|
+
formatador (0.2.5)
|
36
|
+
guard (2.10.5)
|
37
|
+
formatador (>= 0.2.4)
|
38
|
+
listen (~> 2.7)
|
39
|
+
lumberjack (~> 1.0)
|
40
|
+
nenv (~> 0.1)
|
41
|
+
pry (>= 0.9.12)
|
42
|
+
thor (>= 0.18.1)
|
43
|
+
guard-compat (1.2.0)
|
44
|
+
guard-rspec (4.5.0)
|
45
|
+
guard (~> 2.1)
|
46
|
+
guard-compat (~> 1.1)
|
47
|
+
rspec (>= 2.99.0, < 4.0)
|
48
|
+
hitimes (1.2.2)
|
49
|
+
i18n (0.7.0)
|
50
|
+
listen (2.8.4)
|
51
|
+
celluloid (>= 0.15.2)
|
52
|
+
rb-fsevent (>= 0.9.3)
|
53
|
+
rb-inotify (>= 0.9)
|
54
|
+
lumberjack (1.0.9)
|
55
|
+
method_source (0.8.2)
|
56
|
+
multi_json (1.10.1)
|
57
|
+
nenv (0.1.1)
|
58
|
+
pry (0.10.1)
|
59
|
+
coderay (~> 1.1.0)
|
60
|
+
method_source (~> 0.8.1)
|
61
|
+
slop (~> 3.4)
|
62
|
+
rake (10.4.2)
|
63
|
+
rb-fsevent (0.9.4)
|
64
|
+
rb-inotify (0.9.5)
|
65
|
+
ffi (>= 0.5.0)
|
66
|
+
rspec (3.1.0)
|
67
|
+
rspec-core (~> 3.1.0)
|
68
|
+
rspec-expectations (~> 3.1.0)
|
69
|
+
rspec-mocks (~> 3.1.0)
|
70
|
+
rspec-core (3.1.7)
|
71
|
+
rspec-support (~> 3.1.0)
|
72
|
+
rspec-expectations (3.1.2)
|
73
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
74
|
+
rspec-support (~> 3.1.0)
|
75
|
+
rspec-mocks (3.1.3)
|
76
|
+
rspec-support (~> 3.1.0)
|
77
|
+
rspec-support (3.1.2)
|
78
|
+
slop (3.6.0)
|
79
|
+
sqlite3 (1.3.10)
|
80
|
+
thor (0.19.1)
|
81
|
+
timers (4.0.1)
|
82
|
+
hitimes
|
83
|
+
tzinfo (0.3.40)
|
84
|
+
|
85
|
+
PLATFORMS
|
86
|
+
ruby
|
87
|
+
|
88
|
+
DEPENDENCIES
|
89
|
+
activemodel (~> 3.2)
|
90
|
+
activerecord (~> 3.2)
|
91
|
+
activesupport (~> 3.2)
|
92
|
+
appraisal
|
93
|
+
bundler (~> 1.6)
|
94
|
+
cancannible!
|
95
|
+
guard-rspec (~> 4.0)
|
96
|
+
rake (~> 10.0)
|
97
|
+
rspec (~> 3.0)
|
98
|
+
sqlite3 (~> 1.3)
|
@@ -0,0 +1,103 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../
|
3
|
+
specs:
|
4
|
+
cancannible (1.0.0)
|
5
|
+
activemodel (>= 3.2.1)
|
6
|
+
activesupport (>= 3.2.1)
|
7
|
+
cancan (~> 1.6)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
activemodel (4.2.0)
|
13
|
+
activesupport (= 4.2.0)
|
14
|
+
builder (~> 3.1)
|
15
|
+
activerecord (4.2.0)
|
16
|
+
activemodel (= 4.2.0)
|
17
|
+
activesupport (= 4.2.0)
|
18
|
+
arel (~> 6.0)
|
19
|
+
activesupport (4.2.0)
|
20
|
+
i18n (~> 0.7)
|
21
|
+
json (~> 1.7, >= 1.7.7)
|
22
|
+
minitest (~> 5.1)
|
23
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
24
|
+
tzinfo (~> 1.1)
|
25
|
+
appraisal (1.0.2)
|
26
|
+
bundler
|
27
|
+
rake
|
28
|
+
thor (>= 0.14.0)
|
29
|
+
arel (6.0.0)
|
30
|
+
builder (3.2.2)
|
31
|
+
cancan (1.6.10)
|
32
|
+
celluloid (0.16.0)
|
33
|
+
timers (~> 4.0.0)
|
34
|
+
coderay (1.1.0)
|
35
|
+
diff-lcs (1.2.5)
|
36
|
+
ffi (1.9.6)
|
37
|
+
formatador (0.2.5)
|
38
|
+
guard (2.10.5)
|
39
|
+
formatador (>= 0.2.4)
|
40
|
+
listen (~> 2.7)
|
41
|
+
lumberjack (~> 1.0)
|
42
|
+
nenv (~> 0.1)
|
43
|
+
pry (>= 0.9.12)
|
44
|
+
thor (>= 0.18.1)
|
45
|
+
guard-compat (1.2.0)
|
46
|
+
guard-rspec (4.5.0)
|
47
|
+
guard (~> 2.1)
|
48
|
+
guard-compat (~> 1.1)
|
49
|
+
rspec (>= 2.99.0, < 4.0)
|
50
|
+
hitimes (1.2.2)
|
51
|
+
i18n (0.7.0)
|
52
|
+
json (1.8.1)
|
53
|
+
listen (2.8.4)
|
54
|
+
celluloid (>= 0.15.2)
|
55
|
+
rb-fsevent (>= 0.9.3)
|
56
|
+
rb-inotify (>= 0.9)
|
57
|
+
lumberjack (1.0.9)
|
58
|
+
method_source (0.8.2)
|
59
|
+
minitest (5.5.0)
|
60
|
+
nenv (0.1.1)
|
61
|
+
pry (0.10.1)
|
62
|
+
coderay (~> 1.1.0)
|
63
|
+
method_source (~> 0.8.1)
|
64
|
+
slop (~> 3.4)
|
65
|
+
rake (10.4.2)
|
66
|
+
rb-fsevent (0.9.4)
|
67
|
+
rb-inotify (0.9.5)
|
68
|
+
ffi (>= 0.5.0)
|
69
|
+
rspec (3.1.0)
|
70
|
+
rspec-core (~> 3.1.0)
|
71
|
+
rspec-expectations (~> 3.1.0)
|
72
|
+
rspec-mocks (~> 3.1.0)
|
73
|
+
rspec-core (3.1.7)
|
74
|
+
rspec-support (~> 3.1.0)
|
75
|
+
rspec-expectations (3.1.2)
|
76
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
77
|
+
rspec-support (~> 3.1.0)
|
78
|
+
rspec-mocks (3.1.3)
|
79
|
+
rspec-support (~> 3.1.0)
|
80
|
+
rspec-support (3.1.2)
|
81
|
+
slop (3.6.0)
|
82
|
+
sqlite3 (1.3.10)
|
83
|
+
thor (0.19.1)
|
84
|
+
thread_safe (0.3.4)
|
85
|
+
timers (4.0.1)
|
86
|
+
hitimes
|
87
|
+
tzinfo (1.2.2)
|
88
|
+
thread_safe (~> 0.1)
|
89
|
+
|
90
|
+
PLATFORMS
|
91
|
+
ruby
|
92
|
+
|
93
|
+
DEPENDENCIES
|
94
|
+
activemodel (> 4)
|
95
|
+
activerecord (> 4)
|
96
|
+
activesupport (> 4)
|
97
|
+
appraisal
|
98
|
+
bundler (~> 1.6)
|
99
|
+
cancannible!
|
100
|
+
guard-rspec (~> 4.0)
|
101
|
+
rake (~> 10.0)
|
102
|
+
rspec (~> 3.0)
|
103
|
+
sqlite3 (~> 1.3)
|
data/lib/cancannible/grantee.rb
CHANGED
@@ -23,21 +23,15 @@ module Cancannible::Grantee
|
|
23
23
|
resource_id = resource.try(:id)
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
26
|
+
# This looks ugly, but it avoid version-specific issues with find_by*/find_or_initialize_by* methods
|
27
|
+
permission = where(asserted: asserted, ability: ability, resource_id: resource_id, resource_type: resource_type).first
|
28
|
+
permission ||= where(asserted: !asserted, ability: ability, resource_id: resource_id, resource_type: resource_type).first
|
29
|
+
permission ||= new(asserted: asserted, ability: ability, resource_id: resource_id, resource_type: resource_type)
|
30
|
+
permission.asserted = asserted
|
31
|
+
permission.save!
|
32
|
+
|
33
|
+
proxy_association.owner.instance_variable_set :@abilities, nil # invalidate the owner's ability collection
|
34
34
|
|
35
|
-
# if Rails.version =~ /3\.0/ # the rails 3.0 way
|
36
|
-
# proxy_owner.instance_variable_set :@permissions, nil # invalidate the owner's permissions collection
|
37
|
-
# proxy_owner.instance_variable_set :@abilities, nil # invalidate the owner's ability collection
|
38
|
-
# else
|
39
|
-
proxy_association.owner.instance_variable_set :@abilities, nil # invalidate the owner's ability collection
|
40
|
-
# end
|
41
35
|
permission
|
42
36
|
end
|
43
37
|
end
|
data/lib/cancannible/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -6,7 +6,7 @@ require 'sqlite3'
|
|
6
6
|
|
7
7
|
# Requires supporting files with custom matchers and macros, etc,
|
8
8
|
# in ./support/ and its subdirectories.
|
9
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each {|f| require f}
|
10
10
|
|
11
11
|
RSpec.configure do |config|
|
12
12
|
config.before do
|
data/spec/support/models.rb
CHANGED
@@ -29,7 +29,7 @@ class RolesUsers < ActiveRecord::Base
|
|
29
29
|
end
|
30
30
|
|
31
31
|
class Role < ActiveRecord::Base
|
32
|
-
has_many :roles_users, :
|
32
|
+
has_many :roles_users, class_name: 'RolesUsers'
|
33
33
|
has_many :users, through: :roles_users
|
34
34
|
|
35
35
|
include Cancannible::Grantee
|
data/spec/unit/grantee_spec.rb
CHANGED
@@ -43,9 +43,13 @@ describe Cancannible::Grantee do
|
|
43
43
|
context "when permission is not asserted" do
|
44
44
|
it { should be_truthy }
|
45
45
|
end
|
46
|
-
context "when
|
46
|
+
context "when :can already asserted" do
|
47
47
|
before { grantee.can(:read, resource) }
|
48
48
|
it { should be_falsey }
|
49
|
+
context "and then reset as :cannot" do
|
50
|
+
before { grantee.cannot(:read, resource) }
|
51
|
+
it { should be_truthy }
|
52
|
+
end
|
49
53
|
end
|
50
54
|
context "when permission is asserted" do
|
51
55
|
before { grantee.cannot(:read, resource) }
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cancannible
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Gallagher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 3.2.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 3.2.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activemodel
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ! '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 3.2.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 3.2.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: cancan
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: activerecord
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 3.2.1
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ! '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 3.2.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: sqlite3
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -147,12 +147,17 @@ files:
|
|
147
147
|
- .gitignore
|
148
148
|
- .rspec
|
149
149
|
- .travis.yml
|
150
|
+
- Appraisals
|
150
151
|
- Gemfile
|
151
152
|
- Guardfile
|
152
153
|
- LICENSE.txt
|
153
154
|
- README.md
|
154
155
|
- Rakefile
|
155
156
|
- cancannible.gemspec
|
157
|
+
- gemfiles/rails_3.gemfile
|
158
|
+
- gemfiles/rails_3.gemfile.lock
|
159
|
+
- gemfiles/rails_4.gemfile
|
160
|
+
- gemfiles/rails_4.gemfile.lock
|
156
161
|
- lib/cancannible.rb
|
157
162
|
- lib/cancannible/config.rb
|
158
163
|
- lib/cancannible/grantee.rb
|
@@ -192,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
197
|
version: '0'
|
193
198
|
requirements: []
|
194
199
|
rubyforge_project:
|
195
|
-
rubygems_version: 2.
|
200
|
+
rubygems_version: 2.4.5
|
196
201
|
signing_key:
|
197
202
|
specification_version: 4
|
198
203
|
summary: Dynamic, configurable permissions for CanCan
|