action-guard 0.0.2 → 0.1.0

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.
@@ -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