action-guard 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,11 @@
1
+ Autotest.add_hook(:initialize) do |at|
2
+ at.clear_mappings
3
+ at.add_mapping(%r{^lib/.*\.rb$}) { |f, _|
4
+ at.files_matching %r%^spec/.*_spec\.rb$%
5
+ }
6
+ at.add_mapping(%r{^spec/.*_spec\.rb$}) { |f, _|
7
+ f
8
+ }
9
+ end
10
+
11
+
data/.gitignore CHANGED
@@ -14,6 +14,7 @@ doc
14
14
  # jeweler generated
15
15
  pkg
16
16
 
17
+ tags
17
18
  # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
18
19
  #
19
20
  # * Create a file at ~/.gitignore
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.1.0
@@ -4,18 +4,19 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{action-guard}
8
- s.version = "0.0.2"
7
+ s.name = "action-guard"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Rob Westgeest"]
12
- s.date = %q{2011-06-27}
13
- s.description = %q{authorisation module of actions based on url-paths for usage in Rails and possibly other ruby based web frameworks}
14
- s.email = %q{rob.westgeest@qwan.it}
12
+ s.date = "2012-03-01"
13
+ s.description = "authorisation module of actions based on url-paths for usage in Rails and possibly other ruby based web frameworks"
14
+ s.email = "rob.westgeest@qwan.it"
15
15
  s.extra_rdoc_files = [
16
16
  "README.md"
17
17
  ]
18
18
  s.files = [
19
+ ".autotest",
19
20
  ".document",
20
21
  ".gitignore",
21
22
  ".rspec",
@@ -37,15 +38,14 @@ Gem::Specification.new do |s|
37
38
  "spec/action-guard_spec.rb",
38
39
  "spec/spec_helper.rb"
39
40
  ]
40
- s.homepage = %q{http://github.com/rwestgeest/action-guard}
41
+ s.homepage = "http://github.com/rwestgeest/action-guard"
41
42
  s.licenses = ["MIT"]
42
43
  s.rdoc_options = ["--charset=UTF-8"]
43
44
  s.require_paths = ["lib"]
44
- s.rubygems_version = %q{1.3.7}
45
- s.summary = %q{Action guard-0.0.2}
45
+ s.rubygems_version = "1.8.10"
46
+ s.summary = "Action guard-0.1.0"
46
47
 
47
48
  if s.respond_to? :specification_version then
48
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
49
49
  s.specification_version = 3
50
50
 
51
51
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
@@ -27,9 +27,10 @@ module ActionGuard
27
27
  @roles.keys.map { |r| r.to_s }
28
28
  end
29
29
 
30
- def leveled_rule(path_matcher, role_value, &block)
31
- raise Error.new("undefined role '#{role_value}'") unless valid_role?(role_value)
32
- rules[path_matcher] = LevelRule.new(role_value, self, &block)
30
+ def leveled_rule(path_matcher, from_role_value, to_role_value = nil, &block)
31
+ raise Error.new("undefined role '#{from_role_value}'") unless valid_role?(from_role_value)
32
+ raise Error.new("undefined role '#{to_role_value}'") if to_role_value && !valid_role?(to_role_value)
33
+ rules[path_matcher] = LevelRule.new(from_role_value, to_role_value, self, &block)
33
34
  end
34
35
 
35
36
  def allow_rule(path_matcher)
@@ -10,6 +10,10 @@ module ActionGuard
10
10
  level <= other.level
11
11
  end
12
12
 
13
+ def < (other)
14
+ level > other.level
15
+ end
16
+
13
17
  def to_s
14
18
  "Role(:#{@value})"
15
19
  end
@@ -10,15 +10,17 @@ module ActionGuard
10
10
  end
11
11
 
12
12
  class LevelRule
13
- def initialize(allowed_level, role_leveler, &proc)
13
+ def initialize(allowed_level, to_allowed_level, role_leveler, &proc)
14
14
  @role_leveler = role_leveler
15
15
  @allowed_level = allowed_level
16
+ @to_allowed_level = to_allowed_level
16
17
  @additional_rule = proc
17
18
  end
18
19
 
19
20
  def allows?(person)
20
21
  return false unless person
21
22
  return false unless @role_leveler.role(person.role) >= @role_leveler.role(@allowed_level)
23
+ return false if @to_allowed_level && @role_leveler.role(@to_allowed_level) < @role_leveler.role(person.role)
22
24
  return true unless @additional_rule
23
25
  return @additional_rule.call(person)
24
26
  end
@@ -8,7 +8,7 @@ module ActionGuard
8
8
  end
9
9
  def allow(path, options={}, &block)
10
10
  if options.has_key? :at_least
11
- @guard.leveled_rule(path, options[:at_least], &block)
11
+ @guard.leveled_rule(path, options[:at_least], options[:at_most], &block)
12
12
  elsif options.has_key? :only_by
13
13
  @guard.exact_role_rule(path, options[:only_by])
14
14
  else
@@ -37,11 +37,12 @@ describe ActionGuard do
37
37
  end
38
38
 
39
39
  describe "role" do
40
+ before do
41
+ guard.define_role :god, 0
42
+ guard.define_role :admin, 1
43
+ end
44
+
40
45
  describe ">=" do
41
- before do
42
- guard.define_role :god, 0
43
- guard.define_role :admin, 1
44
- end
45
46
  it "should be true when role level is lower" do
46
47
  guard.role(:god).should >= guard.role(:admin)
47
48
  end
@@ -52,6 +53,17 @@ describe ActionGuard do
52
53
  guard.role(:admin).should_not >= guard.role(:god)
53
54
  end
54
55
  end
56
+ describe "<" do
57
+ it "should be true when role level is higher" do
58
+ guard.role(:admin).should < guard.role(:god)
59
+ end
60
+ it "should be true when role level is equal" do
61
+ guard.role(:admin).should_not < guard.role(:admin)
62
+ end
63
+ it "should be false when role level is lower" do
64
+ guard.role(:god).should_not < guard.role(:admin)
65
+ end
66
+ end
55
67
  end
56
68
 
57
69
  describe "defining a rule" do
@@ -60,6 +72,14 @@ describe ActionGuard do
60
72
  guard.leveled_rule '/some_controller/some_action', :biker
61
73
  }.should raise_error ActionGuard::Error
62
74
  end
75
+
76
+ it "fails when role not defined" do
77
+ guard.define_role(:god, 0)
78
+ lambda {
79
+ guard.leveled_rule '/some_controller/some_action', :god, :biker
80
+ }.should raise_error ActionGuard::Error
81
+ end
82
+
63
83
  it "passes when role defined" do
64
84
  lambda {
65
85
  guard.define_role :biker, 0
@@ -78,8 +98,10 @@ describe ActionGuard do
78
98
 
79
99
  describe "authorization" do
80
100
  before do
81
- guard.define_role :admin, 0
82
- guard.define_role :worker, 1
101
+ guard.define_role :god, 0
102
+ guard.define_role :king, 1
103
+ guard.define_role :admin, 2
104
+ guard.define_role :worker, 3
83
105
  end
84
106
 
85
107
  describe "on an allowance rule" do
@@ -116,17 +138,27 @@ describe ActionGuard do
116
138
  describe "on a leveled action rule" do
117
139
  before do
118
140
  guard.leveled_rule '/some_controller/some_action', :admin
141
+ guard.leveled_rule '/some_controller/some_other_action', :admin, :king
119
142
  end
120
143
 
121
144
  it "disallows action when no account available" do
122
145
  guard.should_not authorize(nil).to_perform_action('/some_controller/some_action')
146
+ guard.should_not authorize(nil).to_perform_action('/some_controller/some_other')
123
147
  end
124
148
 
125
149
  it "allows action for that level and higher" do
150
+ guard.should authorize(account_with_role(:god)).to_perform_action('/some_controller/some_action')
126
151
  guard.should authorize(account_with_role(:admin)).to_perform_action('/some_controller/some_action')
127
152
  guard.should_not authorize(account_with_role(:worker)).to_perform_action('/some_controller/some_action')
128
153
  end
129
154
 
155
+ it "allows action for that level and higher until second level" do
156
+ guard.should authorize(account_with_role(:king)).to_perform_action('/some_controller/some_other_action')
157
+ guard.should authorize(account_with_role(:admin)).to_perform_action('/some_controller/some_other_action')
158
+ guard.should_not authorize(account_with_role(:god)).to_perform_action('/some_controller/some_other_action')
159
+ guard.should_not authorize(account_with_role(:worker)).to_perform_action('/some_controller/some_other_action')
160
+ end
161
+
130
162
  it "does not allow the action for a account with an illegal role value" do
131
163
  guard.should_not authorize(account_with_role(:biker)).to_perform_action('/some_controller/some_action')
132
164
  end
@@ -200,6 +232,7 @@ describe ActionGuard do
200
232
  allow '/some_controller', :at_least => :worker
201
233
  allow '/some_controller/some_action', :at_least => :admin
202
234
  allow '/some_controller/when_role_matches_exact', :only_by => :worker
235
+ allow '/some_controller/when_matches_exact_by_implication', :at_least => :worker, :at_most => :worker
203
236
  allow '/'
204
237
  }
205
238
  guard.should authorize(account_with_role(:admin)).to_perform_action('/some_controller/some_action')
@@ -208,6 +241,8 @@ describe ActionGuard do
208
241
  guard.should authorize(account_with_role(:worker)).to_perform_action('/some_other_controller/some_other_action')
209
242
  guard.should authorize(nil).to_perform_action('/some_other_controller/some_other_action')
210
243
  guard.should_not authorize(account_with_role(:admin)).to_perform_action('/some_controller/when_role_matches_exact')
244
+ guard.should authorize(account_with_role(:worker)).to_perform_action('/some_controller/when_matches_exact_by_implication')
245
+ guard.should_not authorize(account_with_role(:admin)).to_perform_action('/some_controller/when_matches_exact_by_implication')
211
246
  end
212
247
  end
213
248
  end
metadata CHANGED
@@ -2,12 +2,12 @@
2
2
  name: action-guard
3
3
  version: !ruby/object:Gem::Version
4
4
  hash: 27
5
- prerelease: false
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 2
10
- version: 0.0.2
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Rob Westgeest
@@ -15,14 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-27 00:00:00 +02:00
19
- default_executable:
18
+ date: 2012-03-01 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
- type: :development
23
- prerelease: false
24
- name: rspec
25
- version_requirements: &id001 !ruby/object:Gem::Requirement
21
+ requirement: &id001 !ruby/object:Gem::Requirement
26
22
  none: false
27
23
  requirements:
28
24
  - - ~>
@@ -33,12 +29,12 @@ dependencies:
33
29
  - 5
34
30
  - 0
35
31
  version: 2.5.0
36
- requirement: *id001
37
- - !ruby/object:Gem::Dependency
38
- type: :development
32
+ version_requirements: *id001
33
+ name: rspec
39
34
  prerelease: false
40
- name: bundler
41
- version_requirements: &id002 !ruby/object:Gem::Requirement
35
+ type: :development
36
+ - !ruby/object:Gem::Dependency
37
+ requirement: &id002 !ruby/object:Gem::Requirement
42
38
  none: false
43
39
  requirements:
44
40
  - - ~>
@@ -49,12 +45,12 @@ dependencies:
49
45
  - 0
50
46
  - 0
51
47
  version: 1.0.0
52
- requirement: *id002
53
- - !ruby/object:Gem::Dependency
54
- type: :development
48
+ version_requirements: *id002
49
+ name: bundler
55
50
  prerelease: false
56
- name: jeweler
57
- version_requirements: &id003 !ruby/object:Gem::Requirement
51
+ type: :development
52
+ - !ruby/object:Gem::Dependency
53
+ requirement: &id003 !ruby/object:Gem::Requirement
58
54
  none: false
59
55
  requirements:
60
56
  - - ~>
@@ -65,12 +61,12 @@ dependencies:
65
61
  - 5
66
62
  - 2
67
63
  version: 1.5.2
68
- requirement: *id003
69
- - !ruby/object:Gem::Dependency
70
- type: :development
64
+ version_requirements: *id003
65
+ name: jeweler
71
66
  prerelease: false
72
- name: rcov
73
- version_requirements: &id004 !ruby/object:Gem::Requirement
67
+ type: :development
68
+ - !ruby/object:Gem::Dependency
69
+ requirement: &id004 !ruby/object:Gem::Requirement
74
70
  none: false
75
71
  requirements:
76
72
  - - ">="
@@ -79,12 +75,12 @@ dependencies:
79
75
  segments:
80
76
  - 0
81
77
  version: "0"
82
- requirement: *id004
83
- - !ruby/object:Gem::Dependency
84
- type: :development
78
+ version_requirements: *id004
79
+ name: rcov
85
80
  prerelease: false
86
- name: ZenTest
87
- version_requirements: &id005 !ruby/object:Gem::Requirement
81
+ type: :development
82
+ - !ruby/object:Gem::Dependency
83
+ requirement: &id005 !ruby/object:Gem::Requirement
88
84
  none: false
89
85
  requirements:
90
86
  - - ">="
@@ -95,12 +91,12 @@ dependencies:
95
91
  - 2
96
92
  - 0
97
93
  version: 4.2.0
98
- requirement: *id005
99
- - !ruby/object:Gem::Dependency
100
- type: :development
94
+ version_requirements: *id005
95
+ name: ZenTest
101
96
  prerelease: false
102
- name: rspec
103
- version_requirements: &id006 !ruby/object:Gem::Requirement
97
+ type: :development
98
+ - !ruby/object:Gem::Dependency
99
+ requirement: &id006 !ruby/object:Gem::Requirement
104
100
  none: false
105
101
  requirements:
106
102
  - - ">"
@@ -111,7 +107,10 @@ dependencies:
111
107
  - 5
112
108
  - 0
113
109
  version: 2.5.0
114
- requirement: *id006
110
+ version_requirements: *id006
111
+ name: rspec
112
+ prerelease: false
113
+ type: :development
115
114
  description: authorisation module of actions based on url-paths for usage in Rails and possibly other ruby based web frameworks
116
115
  email: rob.westgeest@qwan.it
117
116
  executables: []
@@ -121,6 +120,7 @@ extensions: []
121
120
  extra_rdoc_files:
122
121
  - README.md
123
122
  files:
123
+ - .autotest
124
124
  - .document
125
125
  - .gitignore
126
126
  - .rspec
@@ -141,7 +141,6 @@ files:
141
141
  - script/console
142
142
  - spec/action-guard_spec.rb
143
143
  - spec/spec_helper.rb
144
- has_rdoc: true
145
144
  homepage: http://github.com/rwestgeest/action-guard
146
145
  licenses:
147
146
  - MIT
@@ -171,9 +170,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
171
170
  requirements: []
172
171
 
173
172
  rubyforge_project:
174
- rubygems_version: 1.3.7
173
+ rubygems_version: 1.8.10
175
174
  signing_key:
176
175
  specification_version: 3
177
- summary: Action guard-0.0.2
176
+ summary: Action guard-0.1.0
178
177
  test_files: []
179
178