allowance 0.0.2 → 0.0.3

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.
@@ -1,17 +1,16 @@
1
1
  module Allowance
2
2
  class Permissions
3
- def initialize(context = nil, &blk)
3
+ def initialize
4
4
  @permissions = {}
5
- @context = context
6
- instance_exec(context, &blk)
5
+ yield(self) if block_given?
7
6
  end
8
7
 
9
- def can?(verb, object = nil)
8
+ def allowed?(verb, object = nil)
10
9
  return true if @permissions[[verb, object]]
11
10
 
12
11
  # If object is a resource instance, try its class
13
12
  if object.class.respond_to?(:find)
14
- if can?(verb, object.class)
13
+ if allowed?(verb, object.class)
15
14
  # See if the object is part of the defined scope
16
15
  return !scoped_model(verb, object.class).
17
16
  find(:first, :conditions => { :id => object.id }).nil?
@@ -21,7 +20,7 @@ module Allowance
21
20
  false
22
21
  end
23
22
 
24
- def can(verbs, objects = nil, scope = true, &blk)
23
+ def allow!(verbs, objects = nil, scope = true, &blk)
25
24
  expand_permissions(verbs).each do |verb|
26
25
  [objects].flatten.each do |object|
27
26
  @permissions[[verb, object]] = scope # TODO: add blk, too
@@ -29,6 +28,16 @@ module Allowance
29
28
  end
30
29
  end
31
30
 
31
+ def method_missing(name, *args, &blk)
32
+ if name.to_s =~ /(.+)!$/
33
+ allow!($1.to_sym, *args, &blk)
34
+ elsif name.to_s =~ /(.+)\?$/
35
+ allowed?($1.to_sym, *args, &blk)
36
+ else
37
+ super
38
+ end
39
+ end
40
+
32
41
  def scoped_model(verb, model)
33
42
  if p = @permissions[[verb, model]]
34
43
  if p.is_a?(Hash)
@@ -1,3 +1,3 @@
1
1
  module Allowance
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -6,42 +6,35 @@ module Allowance
6
6
  SomeOtherClass = Class.new
7
7
 
8
8
  it "should allow simple permissions to be specified" do
9
- p = Permissions.new do
10
- can :moo
11
- end
9
+ subject.moo!
12
10
 
13
- insist p.can?(:moo)
14
- refuse p.can?(:quack)
11
+ insist subject.moo?
12
+ refuse subject.quack?
15
13
  end
16
14
 
17
- it "should allow verbs and objects" do
18
- p = Permissions.new do
19
- can :update, SomeClass
15
+ it "should support a block-style initialization" do
16
+ p = Permissions.new do |can|
17
+ can.sing!
20
18
  end
21
19
 
22
- insist p.can?(:update, SomeClass)
23
- refuse p.can?(:destroy, SomeClass)
24
- refuse p.can?(:update, SomeOtherClass)
20
+ insist p.allowed? :sing
21
+ insist p.sing?
25
22
  end
26
23
 
27
- it "should run the permission definition block against the provided context" do
28
- skills = mock(:singing => :good)
29
-
30
- p = Permissions.new(skills) do |skills|
31
- can :sing if skills.singing == :good
32
- end
24
+ it "should allow verbs and objects" do
25
+ subject.update! SomeClass
33
26
 
34
- insist p.can? :sing
27
+ insist subject.update? SomeClass
28
+ refuse subject.destroy? SomeClass
29
+ refuse subject.update? SomeOtherClass
35
30
  end
36
31
 
37
32
  it "should expand :view to include :index and :show" do
38
- p = Permissions.new do
39
- can :view, SomeClass
40
- end
33
+ subject.view! SomeClass
41
34
 
42
- insist p.can?(:view, SomeClass)
43
- insist p.can?(:index, SomeClass)
44
- insist p.can?(:show, SomeClass)
35
+ insist subject.view? SomeClass
36
+ insist subject.index? SomeClass
37
+ insist subject.show? SomeClass
45
38
  end
46
39
 
47
40
  it "should verify permissions against model instances" do
@@ -53,11 +46,9 @@ module Allowance
53
46
 
54
47
  model_class.should_receive(:find).and_return(model_instance)
55
48
 
56
- p = Permissions.new do
57
- can :view, model_class, lambda { some_scope }
58
- end
49
+ subject.view! model_class, lambda { some_scope }
59
50
 
60
- insist p.can?(:view, model_instance)
51
+ insist subject.view? model_instance
61
52
  end
62
53
 
63
54
  describe "#scoped_model" do
@@ -65,22 +56,17 @@ module Allowance
65
56
  model = mock
66
57
  model.should_receive(:some_scope).and_return(scoped_model = mock)
67
58
 
68
- p = Permissions.new do
69
- can :view, model, lambda { some_scope }
70
- end
71
-
72
- p.scoped_model(:view, model).should == scoped_model
59
+ subject.view! model, lambda { some_scope }
60
+ subject.scoped_model(:view, model).should == scoped_model
73
61
  end
74
62
 
75
63
  it "should allow scopes to be defined through where conditions" do
76
64
  model = mock
77
65
  model.should_receive(:where).with(:awesome => true).and_return(scoped_model = mock)
78
66
 
79
- p = Permissions.new do
80
- can :view, model, :awesome => true
81
- end
67
+ subject.view! model, :awesome => true
82
68
 
83
- p.scoped_model(:view, model).should == scoped_model
69
+ subject.scoped_model(:view, model).should == scoped_model
84
70
  end
85
71
  end
86
72
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: allowance
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-05-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70146150823900 !ruby/object:Gem::Requirement
16
+ requirement: &70251993567840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70146150823900
24
+ version_requirements: *70251993567840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70146150819460 !ruby/object:Gem::Requirement
27
+ requirement: &70251993566520 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70146150819460
35
+ version_requirements: *70251993566520
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: watchr
38
- requirement: &70146150838720 !ruby/object:Gem::Requirement
38
+ requirement: &70251993563400 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70146150838720
46
+ version_requirements: *70251993563400
47
47
  description: A generic, but decidedly awesome authorization control layer.
48
48
  email:
49
49
  - hendrik@mans.de