canable 0.1 → 0.1.1
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/Rakefile +3 -4
- data/lib/canable.rb +10 -3
- data/test/helper.rb +17 -21
- data/test/test_canable.rb +5 -0
- data/test/test_enforcers.rb +15 -0
- metadata +47 -28
data/Rakefile
CHANGED
@@ -13,11 +13,10 @@ begin
|
|
13
13
|
gem.homepage = "http://github.com/jnunemaker/canable"
|
14
14
|
gem.authors = ["John Nunemaker"]
|
15
15
|
gem.version = Canable::Version
|
16
|
-
gem.add_development_dependency "shoulda", "2.10.2"
|
17
|
-
gem.add_development_dependency "
|
18
|
-
gem.add_development_dependency "
|
16
|
+
gem.add_development_dependency "shoulda", "~> 2.10.2"
|
17
|
+
gem.add_development_dependency "mocha", "~> 0.9.8"
|
18
|
+
gem.add_development_dependency "mongo_mapper"
|
19
19
|
gem.add_development_dependency "yard", ">= 0"
|
20
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
21
20
|
end
|
22
21
|
Jeweler::GemcutterTasks.new
|
23
22
|
rescue LoadError
|
data/lib/canable.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Canable
|
2
|
-
Version = '0.1'
|
2
|
+
Version = '0.1.1'
|
3
3
|
|
4
4
|
# Module that holds all the can_action? methods.
|
5
5
|
module Cans; end
|
@@ -11,8 +11,7 @@ module Canable
|
|
11
11
|
module Enforcers
|
12
12
|
def self.included(controller)
|
13
13
|
controller.class_eval do
|
14
|
-
Canable.
|
15
|
-
delegate "can_#{can}?", :to => :current_user
|
14
|
+
Canable.cans.each do |can|
|
16
15
|
helper_method "can_#{can}?" if controller.respond_to?(:helper_method)
|
17
16
|
hide_action "can_#{can}?" if controller.respond_to?(:hide_action)
|
18
17
|
end
|
@@ -32,6 +31,10 @@ module Canable
|
|
32
31
|
@actions
|
33
32
|
end
|
34
33
|
|
34
|
+
def self.cans
|
35
|
+
actions.keys
|
36
|
+
end
|
37
|
+
|
35
38
|
# Adds an action to actions and the correct methods to can and able modules.
|
36
39
|
#
|
37
40
|
# @param [Symbol] can_method The name of the can_[action]? method.
|
@@ -63,6 +66,10 @@ module Canable
|
|
63
66
|
|
64
67
|
def self.add_enforcer_method(can)
|
65
68
|
Enforcers.module_eval <<-EOM
|
69
|
+
def can_#{can}?(resource)
|
70
|
+
current_user.can_#{can}?(resource)
|
71
|
+
end
|
72
|
+
|
66
73
|
def enforce_#{can}_permission(resource)
|
67
74
|
raise Canable::Transgression unless can_#{can}?(resource)
|
68
75
|
end
|
data/test/helper.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
|
3
|
-
gem 'mocha', '0.9.8'
|
4
|
-
gem 'shoulda', '2.10.2'
|
5
|
-
gem 'mongo_mapper'
|
3
|
+
gem 'mocha', '~> 0.9.8'
|
4
|
+
gem 'shoulda', '~> 2.10.2'
|
5
|
+
gem 'mongo_mapper'
|
6
6
|
|
7
7
|
require 'mocha'
|
8
8
|
require 'shoulda'
|
@@ -13,26 +13,22 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
13
13
|
require 'canable'
|
14
14
|
|
15
15
|
class Test::Unit::TestCase
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
class_eval "def self.to_s; '#{name}' end"
|
16
|
+
def Doc(name=nil, &block)
|
17
|
+
klass = Class.new do
|
18
|
+
include MongoMapper::Document
|
19
|
+
set_collection_name "test#{rand(20)}"
|
20
|
+
|
21
|
+
if name
|
22
|
+
class_eval "def self.name; '#{name}' end"
|
23
|
+
class_eval "def self.to_s; '#{name}' end"
|
24
|
+
end
|
26
25
|
end
|
27
|
-
end
|
28
26
|
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
klass.class_eval(&block) if block_given?
|
28
|
+
klass.collection.remove
|
29
|
+
klass
|
30
|
+
end
|
32
31
|
end
|
33
32
|
|
34
|
-
|
35
|
-
FileUtils.mkdir_p(test_dir) unless File.exist?(test_dir)
|
36
|
-
|
37
|
-
MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017, {:logger => Logger.new(test_dir + '/test.log')})
|
33
|
+
MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017)
|
38
34
|
MongoMapper.database = 'test'
|
data/test/test_canable.rb
CHANGED
@@ -22,5 +22,10 @@ class TestCanable < Test::Unit::TestCase
|
|
22
22
|
Canable.add(:publish, :publishable)
|
23
23
|
assert_equal :publishable, Canable.actions[:publish]
|
24
24
|
end
|
25
|
+
|
26
|
+
should "know cans" do
|
27
|
+
assert_equal %w(create destroy publish update view),
|
28
|
+
Canable.cans.map(&:to_s).sort
|
29
|
+
end
|
25
30
|
end
|
26
31
|
end
|
data/test/test_enforcers.rb
CHANGED
@@ -7,9 +7,19 @@ class EnforcersTest < Test::Unit::TestCase
|
|
7
7
|
include Canable::Enforcers
|
8
8
|
attr_accessor :current_user, :article
|
9
9
|
|
10
|
+
# Overriding example
|
11
|
+
def can_update?(resource)
|
12
|
+
return false if current_user.nil?
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
10
16
|
def show
|
11
17
|
enforce_view_permission(article)
|
12
18
|
end
|
19
|
+
|
20
|
+
def update
|
21
|
+
enforce_update_permission(article)
|
22
|
+
end
|
13
23
|
end
|
14
24
|
|
15
25
|
@article = mock('article')
|
@@ -28,5 +38,10 @@ class EnforcersTest < Test::Unit::TestCase
|
|
28
38
|
@user.expects(:can_view?).with(@article).returns(false)
|
29
39
|
assert_raises(Canable::Transgression) { @controller.show }
|
30
40
|
end
|
41
|
+
|
42
|
+
should "be able to override can_xx? method" do
|
43
|
+
@controller.current_user = nil
|
44
|
+
assert_raises(Canable::Transgression) { @controller.update }
|
45
|
+
end
|
31
46
|
end
|
32
47
|
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: canable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- John Nunemaker
|
@@ -9,49 +14,61 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-06-23 00:00:00 -04:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: shoulda
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
|
-
- -
|
25
|
+
- - ~>
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 2
|
29
|
+
- 10
|
30
|
+
- 2
|
23
31
|
version: 2.10.2
|
24
|
-
version:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: mongo_mapper
|
27
32
|
type: :development
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: "0.7"
|
34
|
-
version:
|
33
|
+
version_requirements: *id001
|
35
34
|
- !ruby/object:Gem::Dependency
|
36
35
|
name: mocha
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
38
|
requirements:
|
41
|
-
- -
|
39
|
+
- - ~>
|
42
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 9
|
44
|
+
- 8
|
43
45
|
version: 0.9.8
|
44
|
-
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
45
48
|
- !ruby/object:Gem::Dependency
|
46
|
-
name:
|
49
|
+
name: mongo_mapper
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
version: "0"
|
47
58
|
type: :development
|
48
|
-
|
49
|
-
|
59
|
+
version_requirements: *id003
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: yard
|
62
|
+
prerelease: false
|
63
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
64
|
requirements:
|
51
65
|
- - ">="
|
52
66
|
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
53
69
|
version: "0"
|
54
|
-
|
70
|
+
type: :development
|
71
|
+
version_requirements: *id004
|
55
72
|
description: Simple permissions that I have used on my last several projects so I figured it was time to abstract and wrap up into something more easily reusable.
|
56
73
|
email: nunemaker@gmail.com
|
57
74
|
executables: []
|
@@ -87,18 +104,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
87
104
|
requirements:
|
88
105
|
- - ">="
|
89
106
|
- !ruby/object:Gem::Version
|
107
|
+
segments:
|
108
|
+
- 0
|
90
109
|
version: "0"
|
91
|
-
version:
|
92
110
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
111
|
requirements:
|
94
112
|
- - ">="
|
95
113
|
- !ruby/object:Gem::Version
|
114
|
+
segments:
|
115
|
+
- 0
|
96
116
|
version: "0"
|
97
|
-
version:
|
98
117
|
requirements: []
|
99
118
|
|
100
119
|
rubyforge_project:
|
101
|
-
rubygems_version: 1.3.
|
120
|
+
rubygems_version: 1.3.6
|
102
121
|
signing_key:
|
103
122
|
specification_version: 3
|
104
123
|
summary: Simple permissions that I have used on my last several projects so I figured it was time to abstract and wrap up into something more easily reusable.
|