canard 0.3.4 → 0.3.5
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.
- data/README.rdoc +4 -1
- data/TODO +10 -6
- data/lib/ability.rb +1 -4
- data/lib/canard/find_abilities.rb +7 -3
- data/lib/canard/railtie.rb +8 -0
- data/lib/canard/user_model.rb +6 -2
- data/lib/canard/version.rb +1 -1
- data/test/user_model_test.rb +48 -28
- metadata +68 -105
data/README.rdoc
CHANGED
@@ -147,12 +147,15 @@ to accept pull requests for tested Rails 2.x updates if anybody is game.
|
|
147
147
|
|
148
148
|
== Contributors
|
149
149
|
|
150
|
+
git log | grep Author | sort | uniq
|
151
|
+
|
150
152
|
* James McCarthy
|
151
153
|
* Joey Geiger
|
154
|
+
* Morton Jonuschat
|
152
155
|
|
153
156
|
== Credits
|
154
157
|
|
155
|
-
Thanks to Ryan Bates for creating the awesome CanCan (http://wiki.github.com/ryanb/cancan
|
158
|
+
Thanks to Ryan Bates for creating the awesome CanCan (http://wiki.github.com/ryanb/cancan)
|
156
159
|
and Martin Rehfeld for implementing Role Based Authorization in the form of RoleModel (http://github.com/martinrehfeld/role_model).
|
157
160
|
|
158
161
|
== Copyright
|
data/TODO
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
+
0.4.0
|
2
|
+
* Make the roles_attribute_name configureable in UserModel.
|
3
|
+
* Make the Ability user referece configureable in Ability.
|
1
4
|
* Test the generators.
|
2
|
-
* Test the railtie
|
3
|
-
*
|
5
|
+
* Test the railtie (currently implicity tested in dummy app).
|
6
|
+
* Add upgrade generator to move the now deprecated definitions to the new syntax.
|
7
|
+
* Remove old definition syntax and therefore deprecations.
|
8
|
+
* Remove ActiveSupport runtime dependency (which is just used for deprecation warnings).
|
9
|
+
0.5.0
|
10
|
+
* Abstract out the ActiveRecord extensions into a model adapter to become framework independent.
|
11
|
+
* Expand the generated tests to produce all the standard abilities: index,show,read,new,create,edit,update,destroy.
|
4
12
|
* Add test unit generator.
|
5
13
|
* Add install generator to allow overriding of the default tests.
|
6
|
-
* Make the Ability user referece configureable in Ability.
|
7
|
-
* Abstract out the ActiveRecord extensions into a model adapter.
|
8
|
-
* Make the roles_attribute_name configureable in UserModel.
|
9
|
-
* Remove ActiveSupport runtime dependency.
|
data/lib/ability.rb
CHANGED
@@ -54,11 +54,8 @@ class Ability
|
|
54
54
|
|
55
55
|
private
|
56
56
|
|
57
|
-
def ability_definitions
|
58
|
-
Canard.ability_definitions
|
59
|
-
end
|
60
|
-
|
61
57
|
def append_abilities(role)
|
58
|
+
ability_definitions = Canard.ability_definitions
|
62
59
|
instance_eval(&ability_definitions[role]) if ability_definitions.has_key?(role)
|
63
60
|
end
|
64
61
|
|
@@ -21,6 +21,11 @@ module Canard
|
|
21
21
|
|
22
22
|
end
|
23
23
|
|
24
|
+
def self.load_paths
|
25
|
+
Abilities.definition_paths.map { |path| File.join(Rails.root, path) }
|
26
|
+
end
|
27
|
+
|
28
|
+
# TODO remove at version 0.4.0
|
24
29
|
def self.find_abilities #:nodoc:
|
25
30
|
absolute_abilities_path = File.expand_path(abilities_path)
|
26
31
|
|
@@ -30,13 +35,12 @@ module Canard
|
|
30
35
|
end
|
31
36
|
end
|
32
37
|
|
33
|
-
|
34
|
-
Dir[File.join(
|
38
|
+
load_paths.each do |path|
|
39
|
+
Dir[File.join(path, '**', '*.rb')].sort.each do |file|
|
35
40
|
load file
|
36
41
|
end
|
37
42
|
end
|
38
43
|
|
39
44
|
end
|
40
45
|
|
41
|
-
|
42
46
|
end
|
data/lib/canard/railtie.rb
CHANGED
@@ -4,6 +4,14 @@ require 'rails'
|
|
4
4
|
module Canard
|
5
5
|
class Railtie < Rails::Railtie
|
6
6
|
|
7
|
+
initializer "carard.no_eager_loading", :before => 'before_eager_loading' do |app|
|
8
|
+
ActiveSupport::Dependencies.autoload_paths.reject!{ |path| Canard.load_paths.include?(path) }
|
9
|
+
# Don't eagerload our configs, we'll deal with them ourselves
|
10
|
+
app.config.eager_load_paths = app.config.eager_load_paths.reject do |path|
|
11
|
+
Canard.load_paths.include?(path)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
7
15
|
initializer "canard.active_record" do |app|
|
8
16
|
ActiveSupport.on_load :active_record do
|
9
17
|
extend Canard::UserModel
|
data/lib/canard/user_model.rb
CHANGED
@@ -59,7 +59,7 @@ module Canard
|
|
59
59
|
|
60
60
|
roles options[:roles] if options.has_key?(:roles) && has_roles_mask_attribute? || has_roles_mask_accessors?
|
61
61
|
|
62
|
-
if
|
62
|
+
if active_record_table?
|
63
63
|
valid_roles.each do |role|
|
64
64
|
define_scopes_for_role role
|
65
65
|
end
|
@@ -76,6 +76,10 @@ module Canard
|
|
76
76
|
|
77
77
|
private
|
78
78
|
|
79
|
+
def active_record_table?
|
80
|
+
respond_to?(:table_exists?) && table_exists?
|
81
|
+
end
|
82
|
+
|
79
83
|
def has_roles_mask_accessors?
|
80
84
|
instance_method_names = instance_methods.map { |method_name| method_name.to_s }
|
81
85
|
[roles_attribute_name.to_s, "#{roles_attribute_name}="].all? do |accessor|
|
@@ -84,7 +88,7 @@ module Canard
|
|
84
88
|
end
|
85
89
|
|
86
90
|
def has_roles_mask_attribute?
|
87
|
-
|
91
|
+
active_record_table? && column_names.include?(roles_attribute_name.to_s)
|
88
92
|
end
|
89
93
|
|
90
94
|
def define_scopes_for_role(role)
|
data/lib/canard/version.rb
CHANGED
data/test/user_model_test.rb
CHANGED
@@ -19,40 +19,61 @@ describe Canard::UserModel do
|
|
19
19
|
|
20
20
|
describe 'acts_as_user' do
|
21
21
|
|
22
|
-
it '
|
22
|
+
it 'adds role_model to the class' do
|
23
23
|
User.included_modules.must_include RoleModel
|
24
24
|
User.must_respond_to :roles
|
25
25
|
end
|
26
26
|
|
27
|
-
describe
|
27
|
+
describe "on an ActiveRecord model" do
|
28
28
|
|
29
|
-
describe '
|
29
|
+
describe 'with a role_mask' do
|
30
30
|
|
31
|
-
|
32
|
-
|
31
|
+
describe 'and :roles => [] specified' do
|
32
|
+
|
33
|
+
it 'sets the valid_roles for the class' do
|
34
|
+
User.valid_roles.must_equal [:viewer, :author, :admin]
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'and no :roles => [] specified' do
|
40
|
+
|
41
|
+
it 'sets no roles' do
|
42
|
+
UserWithoutRole.valid_roles.must_equal []
|
43
|
+
end
|
33
44
|
end
|
34
45
|
|
35
46
|
end
|
36
47
|
|
37
|
-
describe 'with no
|
48
|
+
describe 'with no roles_mask' do
|
38
49
|
|
39
50
|
it 'sets no roles' do
|
40
51
|
UserWithoutRole.valid_roles.must_equal []
|
41
52
|
end
|
42
53
|
end
|
43
54
|
|
44
|
-
|
55
|
+
describe "with no table" do
|
56
|
+
|
57
|
+
subject { Class.new(ActiveRecord::Base) }
|
45
58
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
59
|
+
it "sets no roles" do
|
60
|
+
subject.class_eval { acts_as_user :roles => [:admin] }
|
61
|
+
subject.valid_roles.must_equal []
|
62
|
+
end
|
63
|
+
|
64
|
+
it "does not raise any errors" do
|
65
|
+
proc { subject.class_eval { acts_as_user :roles => [:admin] } }.must_be_silent
|
66
|
+
end
|
67
|
+
|
68
|
+
it "returns nil" do
|
69
|
+
subject.class_eval { acts_as_user :roles => [:admin] }.must_be_nil
|
70
|
+
end
|
50
71
|
end
|
51
72
|
end
|
73
|
+
|
74
|
+
describe "on a regular Ruby class" do
|
52
75
|
|
53
|
-
|
54
|
-
|
55
|
-
describe "with a roles_mask attribute" do
|
76
|
+
describe "with a roles_mask" do
|
56
77
|
|
57
78
|
it "assigns the roles" do
|
58
79
|
PlainRubyUser.valid_roles.must_equal [:viewer, :author, :admin]
|
@@ -65,26 +86,25 @@ describe Canard::UserModel do
|
|
65
86
|
PlainRubyNonUser.valid_roles.must_equal []
|
66
87
|
end
|
67
88
|
end
|
68
|
-
|
69
89
|
end
|
70
90
|
end
|
71
91
|
|
72
92
|
describe "scopes" do
|
73
93
|
|
74
|
-
|
75
|
-
@no_role = User.create
|
76
|
-
@admin_author_viewer = User.create(:roles => [:admin, :author, :viewer])
|
77
|
-
@author_viewer = User.create(:roles => [:author, :viewer])
|
78
|
-
@viewer = User.create(:roles => [:viewer])
|
79
|
-
@admin_only = User.create(:roles => [:admin])
|
80
|
-
@author_only = User.create(:roles => [:author])
|
81
|
-
end
|
94
|
+
describe "on an ActiveRecord model with roles" do
|
82
95
|
|
83
|
-
|
84
|
-
|
85
|
-
|
96
|
+
before do
|
97
|
+
@no_role = User.create
|
98
|
+
@admin_author_viewer = User.create(:roles => [:admin, :author, :viewer])
|
99
|
+
@author_viewer = User.create(:roles => [:author, :viewer])
|
100
|
+
@viewer = User.create(:roles => [:viewer])
|
101
|
+
@admin_only = User.create(:roles => [:admin])
|
102
|
+
@author_only = User.create(:roles => [:author])
|
103
|
+
end
|
86
104
|
|
87
|
-
|
105
|
+
after do
|
106
|
+
User.delete_all
|
107
|
+
end
|
88
108
|
|
89
109
|
subject { User }
|
90
110
|
|
@@ -442,7 +462,7 @@ describe Canard::UserModel do
|
|
442
462
|
|
443
463
|
end
|
444
464
|
|
445
|
-
describe "on a
|
465
|
+
describe "on a plain Ruby class" do
|
446
466
|
|
447
467
|
subject { PlainRubyUser }
|
448
468
|
|
metadata
CHANGED
@@ -1,118 +1,90 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: canard
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.5
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 3
|
9
|
-
- 4
|
10
|
-
version: 0.3.4
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- James McCarthy
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-05-25 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: minitest
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2152467160 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
18
|
+
requirements:
|
26
19
|
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 2
|
31
|
-
version: "2"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '2'
|
32
22
|
type: :development
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: sqlite3
|
36
23
|
prerelease: false
|
37
|
-
|
24
|
+
version_requirements: *2152467160
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: sqlite3
|
27
|
+
requirement: &2152466380 !ruby/object:Gem::Requirement
|
38
28
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
46
33
|
type: :development
|
47
|
-
version_requirements: *id002
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: rails
|
50
34
|
prerelease: false
|
51
|
-
|
35
|
+
version_requirements: *2152466380
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rails
|
38
|
+
requirement: &2152464940 !ruby/object:Gem::Requirement
|
52
39
|
none: false
|
53
|
-
requirements:
|
40
|
+
requirements:
|
54
41
|
- - ~>
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
hash: 9
|
57
|
-
segments:
|
58
|
-
- 3
|
59
|
-
- 2
|
60
|
-
- 3
|
42
|
+
- !ruby/object:Gem::Version
|
61
43
|
version: 3.2.3
|
62
44
|
type: :development
|
63
|
-
version_requirements: *id003
|
64
|
-
- !ruby/object:Gem::Dependency
|
65
|
-
name: activesupport
|
66
45
|
prerelease: false
|
67
|
-
|
46
|
+
version_requirements: *2152464940
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: activesupport
|
49
|
+
requirement: &2152463940 !ruby/object:Gem::Requirement
|
68
50
|
none: false
|
69
|
-
requirements:
|
70
|
-
- -
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
|
73
|
-
segments:
|
74
|
-
- 0
|
75
|
-
version: "0"
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
76
55
|
type: :runtime
|
77
|
-
version_requirements: *id004
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: cancan
|
80
56
|
prerelease: false
|
81
|
-
|
57
|
+
version_requirements: *2152463940
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: cancan
|
60
|
+
requirement: &2152463060 !ruby/object:Gem::Requirement
|
82
61
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
87
|
-
segments:
|
88
|
-
- 0
|
89
|
-
version: "0"
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
90
66
|
type: :runtime
|
91
|
-
version_requirements: *id005
|
92
|
-
- !ruby/object:Gem::Dependency
|
93
|
-
name: role_model
|
94
67
|
prerelease: false
|
95
|
-
|
68
|
+
version_requirements: *2152463060
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: role_model
|
71
|
+
requirement: &2152462240 !ruby/object:Gem::Requirement
|
96
72
|
none: false
|
97
|
-
requirements:
|
98
|
-
- -
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
|
101
|
-
segments:
|
102
|
-
- 0
|
103
|
-
version: "0"
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
104
77
|
type: :runtime
|
105
|
-
|
106
|
-
|
107
|
-
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *2152462240
|
80
|
+
description: Wraps CanCan and RoleModel up to make role based authorisation really
|
81
|
+
easy in Rails 3.x.
|
82
|
+
email:
|
108
83
|
- james2mccarthy@gmail.com
|
109
84
|
executables: []
|
110
|
-
|
111
85
|
extensions: []
|
112
|
-
|
113
86
|
extra_rdoc_files: []
|
114
|
-
|
115
|
-
files:
|
87
|
+
files:
|
116
88
|
- .gitignore
|
117
89
|
- Gemfile
|
118
90
|
- MIT-LICENSE
|
@@ -173,38 +145,29 @@ files:
|
|
173
145
|
- test/user_model_test.rb
|
174
146
|
homepage: https://github.com/james2m/canard
|
175
147
|
licenses: []
|
176
|
-
|
177
148
|
post_install_message:
|
178
149
|
rdoc_options: []
|
179
|
-
|
180
|
-
require_paths:
|
150
|
+
require_paths:
|
181
151
|
- lib
|
182
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
183
153
|
none: false
|
184
|
-
requirements:
|
185
|
-
- -
|
186
|
-
- !ruby/object:Gem::Version
|
187
|
-
|
188
|
-
|
189
|
-
- 0
|
190
|
-
version: "0"
|
191
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
159
|
none: false
|
193
|
-
requirements:
|
194
|
-
- -
|
195
|
-
- !ruby/object:Gem::Version
|
196
|
-
|
197
|
-
segments:
|
198
|
-
- 0
|
199
|
-
version: "0"
|
160
|
+
requirements:
|
161
|
+
- - ! '>='
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '0'
|
200
164
|
requirements: []
|
201
|
-
|
202
165
|
rubyforge_project: canard
|
203
|
-
rubygems_version: 1.8.
|
166
|
+
rubygems_version: 1.8.12
|
204
167
|
signing_key:
|
205
168
|
specification_version: 3
|
206
169
|
summary: Adds role based authorisation to Rails by combining RoleModel and CanCan.
|
207
|
-
test_files:
|
170
|
+
test_files:
|
208
171
|
- test/abilities/admins.rb
|
209
172
|
- test/abilities_test.rb
|
210
173
|
- test/ability_test.rb
|