can_self_do_it 0.0.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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.rdoc +203 -0
- data/Rakefile +12 -0
- data/can_self_do_it.gemspec +25 -0
- data/lib/can_self_do_it/auto.rb +39 -0
- data/lib/can_self_do_it/base.rb +40 -0
- data/lib/can_self_do_it/helper.rb +27 -0
- data/lib/can_self_do_it/known.rb +44 -0
- data/lib/can_self_do_it/unknown.rb +18 -0
- data/lib/can_self_do_it/version.rb +3 -0
- data/lib/can_self_do_it.rb +22 -0
- data/spec/admin_spec.rb +55 -0
- data/spec/auto_admin_spec.rb +66 -0
- data/spec/auto_guest_spec.rb +74 -0
- data/spec/auto_spec.rb +57 -0
- data/spec/auto_user_spec.rb +97 -0
- data/spec/base_spec.rb +67 -0
- data/spec/guest_spec.rb +66 -0
- data/spec/known_spec.rb +31 -0
- data/spec/spec_helper.rb +77 -0
- data/spec/unknown_spec.rb +24 -0
- data/spec/user_spec.rb +88 -0
- metadata +90 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,203 @@
|
|
1
|
+
= can_self_do_it
|
2
|
+
|
3
|
+
* http://github.com/mbuceta/can_self_o_it
|
4
|
+
|
5
|
+
== Description:
|
6
|
+
|
7
|
+
Generate a simple interface to works with users CRUD rights.
|
8
|
+
|
9
|
+
|
10
|
+
== Features:
|
11
|
+
|
12
|
+
* Allows check permissions for CRUD actions can_create?, can_see?, can_edit? and can_delete?
|
13
|
+
* Allows check permissions for general actions responding to can_.+? regular expresion
|
14
|
+
* Add an interface for known users with a default implementation of the CRUD action permissions.
|
15
|
+
* Add an interface for unknown users with a default implementation of the CRUD action permissions.
|
16
|
+
* Allows add custom behaviors for especific objects instead of the default implementation
|
17
|
+
|
18
|
+
== Synopsis:
|
19
|
+
|
20
|
+
Despite the fact that this gems hasn't any dependency with others gems, it arises from the double
|
21
|
+
permission checking in rails. We have to check action rights in controllers, and in the other hand
|
22
|
+
we have to check rights to show actions in views.
|
23
|
+
|
24
|
+
This gem allows you to add the permission logic in one place and use it in both, views and controllers.
|
25
|
+
Also, this gem add default behaviors for common cases. And overwrite the default behavior using custom
|
26
|
+
implementations.
|
27
|
+
|
28
|
+
== Basic usage in a Rails app:
|
29
|
+
|
30
|
+
=== Model:
|
31
|
+
|
32
|
+
class Post
|
33
|
+
...
|
34
|
+
end
|
35
|
+
|
36
|
+
# Represent an identified user of the application
|
37
|
+
class User
|
38
|
+
acts_as_can_self_do_it(:as => CanSelfDoIt::Known)
|
39
|
+
...
|
40
|
+
end
|
41
|
+
|
42
|
+
=== View:
|
43
|
+
|
44
|
+
link_to('edit', @post) if session_user.user.can_edit?(@post)
|
45
|
+
link_to('delete', @post) if session_user.user.can_delete?(@post)
|
46
|
+
|
47
|
+
=== Controller:
|
48
|
+
|
49
|
+
before_filter :check_post_edition_rights, :only => :edit
|
50
|
+
....
|
51
|
+
private
|
52
|
+
|
53
|
+
def check_post_edition_rights
|
54
|
+
render(:status => :unauthorized) unless session_user.can_edit?(@post)
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
== Complete usage example:
|
59
|
+
|
60
|
+
=== Application permissions management
|
61
|
+
|
62
|
+
Module for custom permissions for Guest (unknown user)
|
63
|
+
|
64
|
+
module GuestCustomPermissions
|
65
|
+
# Ovewrite default CanSelfDoIt::Unknown implementation.
|
66
|
+
# Guest only can see admin comments.
|
67
|
+
# This method overrides
|
68
|
+
# can_see? method for objects of Comment class.
|
69
|
+
# i.e. this method is called when can_see?(comment) is
|
70
|
+
# called and comment is a Comment
|
71
|
+
def can_see_comment?(comment); comment.user.admin?; end
|
72
|
+
end
|
73
|
+
|
74
|
+
Module for custom permissions for User (known user)
|
75
|
+
|
76
|
+
module UserCustomPermissions
|
77
|
+
# CanSelfDoIt::Known check this method for default implementation.
|
78
|
+
def admin?; false;end
|
79
|
+
|
80
|
+
# Ovewrite default CanSelfDoIt::Known implementation
|
81
|
+
# Users can comment any post
|
82
|
+
# This method overrides
|
83
|
+
# can_create? method for objects of Comment class.
|
84
|
+
# i.e. this method is called when can_create?(Comment, post)
|
85
|
+
# The post param is the post in which the comment will be written
|
86
|
+
def can_create_comment?(post); true; end
|
87
|
+
end
|
88
|
+
|
89
|
+
Module for custom permissions for Admin (admin like user)
|
90
|
+
|
91
|
+
module AdminCustomPermissions
|
92
|
+
# CanSelfDoIt::Known check this method for default implementation.
|
93
|
+
def admin?; true;end
|
94
|
+
end
|
95
|
+
|
96
|
+
=== Application classes
|
97
|
+
|
98
|
+
# Represent an unidentified user of the application
|
99
|
+
class Guest
|
100
|
+
acts_as_can_self_do_it(:as => [CanSelfDoIt::Unknown, GuestCustomPermissions])
|
101
|
+
...
|
102
|
+
end
|
103
|
+
|
104
|
+
# Represent an identified user of the application
|
105
|
+
class User
|
106
|
+
acts_as_can_self_do_it(:as => [CanSelfDoIt::Known, UserCustomPermissions])
|
107
|
+
attr_accessor :blogs
|
108
|
+
...
|
109
|
+
end
|
110
|
+
|
111
|
+
# Represent the application admin
|
112
|
+
class Admin
|
113
|
+
acts_as_can_self_do_it(:as => [CanSelfDoIt::Known, AdminCustomPermissions])
|
114
|
+
attr_accessor :blogs
|
115
|
+
...
|
116
|
+
end
|
117
|
+
|
118
|
+
# A simple Blog + Post + Comment app
|
119
|
+
class Blog
|
120
|
+
attr_accessor :user, :posts
|
121
|
+
...
|
122
|
+
end
|
123
|
+
|
124
|
+
class Post
|
125
|
+
attr_accessor :blog, :comments, :user
|
126
|
+
...
|
127
|
+
end
|
128
|
+
|
129
|
+
class Comment
|
130
|
+
attr_accessor :post, :user
|
131
|
+
...
|
132
|
+
end
|
133
|
+
|
134
|
+
=== CanSelfDoIt working
|
135
|
+
|
136
|
+
|
137
|
+
Working for an instance of Admin
|
138
|
+
|
139
|
+
an_admin.can_see?(admin_blog).should_be true
|
140
|
+
an_admin.can_see?(other_user_blog).should_be true
|
141
|
+
an_admin.can_edit?(admin_blog).should_be true
|
142
|
+
an_admin.can_edit?(other_user_blog).should_be true
|
143
|
+
an_admin.can_create?(Post, admin_blog).should_be true
|
144
|
+
an_admin.can_create?(Post, other_user_blog).should_be true
|
145
|
+
|
146
|
+
Working for an instance of User
|
147
|
+
|
148
|
+
an_user.can_see?(user_blog).should_be true
|
149
|
+
an_user.can_see?(other_user_blog).should_be true
|
150
|
+
an_user.can_edit?(user_blog).should_be true
|
151
|
+
an_user.can_edit?(other_user_blog).should_be false
|
152
|
+
an_user.can_create?(Post, user_blog).should_be true
|
153
|
+
an_user.can_create?(Post, other_user_blog).should_be false
|
154
|
+
# Custom
|
155
|
+
an_user.can_create?(Comment, user_post).should_be true
|
156
|
+
an_user.can_create?(Comment, other_user_post).should_be true
|
157
|
+
|
158
|
+
Working for an instance of Guest
|
159
|
+
a_guest.can_see?(user_blog).should_be true
|
160
|
+
a_guest.can_see?(user_post).should_be true
|
161
|
+
a_guest.can_edit?(user_blog).should_be false
|
162
|
+
a_guest.can_edit?(user_post).should_be false
|
163
|
+
a_guest.can_create?(Post, user_blog).should_be false
|
164
|
+
a_guest.can_create?(Comment, user_post).should_be false
|
165
|
+
# Custom
|
166
|
+
a_guest.can_see?(user_comment).should_be false
|
167
|
+
a_guest.can_see?(admin_comment).should_be true
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
== Requirements:
|
172
|
+
|
173
|
+
This gems hasn't dependencies
|
174
|
+
|
175
|
+
|
176
|
+
== Install:
|
177
|
+
|
178
|
+
sudo gem install can_self_do_it
|
179
|
+
|
180
|
+
== License:
|
181
|
+
|
182
|
+
(The MIT License)
|
183
|
+
|
184
|
+
Copyright (c) 2013 Juan Martin Buceta
|
185
|
+
|
186
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
187
|
+
a copy of this software and associated documentation files (the
|
188
|
+
'Software'), to deal in the Software without restriction, including
|
189
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
190
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
191
|
+
permit persons to whom the Software is furnished to do so, subject to
|
192
|
+
the following conditions:
|
193
|
+
|
194
|
+
The above copyright notice and this permission notice shall be
|
195
|
+
included in all copies or substantial portions of the Software.
|
196
|
+
|
197
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
198
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
199
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
200
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
201
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
202
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
203
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
|
4
|
+
RSpec::Core::RakeTask.new
|
5
|
+
|
6
|
+
desc "Open an irb session preloaded with this library"
|
7
|
+
task :console do
|
8
|
+
sh "irb -rubygems -I lib -r can_do_it.rb"
|
9
|
+
end
|
10
|
+
|
11
|
+
task :default => :spec
|
12
|
+
task :test => :spec
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "can_self_do_it/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "can_self_do_it"
|
7
|
+
s.version = CanSelfDoIt::VERSION
|
8
|
+
s.authors = ["Juan Martín Buceta"]
|
9
|
+
s.email = ["mbuceta@grantaire.com.ar"]
|
10
|
+
s.homepage = "http://martinbuceta.com.ar"
|
11
|
+
s.summary = %q{Simple can_*? like method to manage permissions}
|
12
|
+
s.description = %q{Provide modules to work with sereveral permission policies}
|
13
|
+
|
14
|
+
s.rubyforge_project = "can_self_do_it"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
s.add_development_dependency "rake"
|
23
|
+
s.add_development_dependency "rspec"
|
24
|
+
# s.add_runtime_dependency "rest-client"
|
25
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'can_self_do_it/helper'
|
2
|
+
module CanSelfDoIt
|
3
|
+
module Auto
|
4
|
+
|
5
|
+
# Automatic method generation.
|
6
|
+
# Everything defined as /can_.+\?/ that does not exists get name from param type
|
7
|
+
# i.e methods like can_do_something?(project) => can_do_something_project
|
8
|
+
def method_missing(symbol, *args, &block)
|
9
|
+
if symbol.to_s == 'can_modify_default?'
|
10
|
+
raise NotImplementedError.new("You must implement can_modify_default?.")
|
11
|
+
elsif can_self_do_it_method?(symbol)
|
12
|
+
raise ArgumentError, "wrong number of arguments(#{args.size}1 for 1)" unless args.size == 1
|
13
|
+
obj = args[0]
|
14
|
+
new_symbol = "#{symbol.to_s[0..-2]}_#{CanSelfDoIt::Helper.class_2_method_sub_str(obj.class)}?"
|
15
|
+
respond_to_without_can_self_do_it_method?(new_symbol) ? send(new_symbol, obj) : can_modify_default?(obj)
|
16
|
+
else
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def respond_to_with_can_self_do_it_method?(*args)
|
23
|
+
can_self_do_it_method?(*args) || respond_to_without_can_self_do_it_method?(*args)
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :respond_to?, :respond_to_with_can_self_do_it_method?
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def can_modify_default?(obj); raise NotImplementedError.new("You must implement can_modify_default?.") ; end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def can_self_do_it_method?(symbol)
|
35
|
+
!!(symbol.to_s =~ /^can_.+\?/ )
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'can_self_do_it/helper'
|
2
|
+
module CanSelfDoIt
|
3
|
+
module Base
|
4
|
+
|
5
|
+
def can_see?(obj)
|
6
|
+
method = "can_see_#{CanSelfDoIt::Helper.class_2_method_sub_str(obj.class)}?"
|
7
|
+
respond_to_without_can_self_do_it_method?(method) ? self.send(method,obj) : can_see_default?(obj)
|
8
|
+
end
|
9
|
+
|
10
|
+
def can_edit?(obj)
|
11
|
+
method = "can_edit_#{CanSelfDoIt::Helper.class_2_method_sub_str(obj.class)}?"
|
12
|
+
respond_to_without_can_self_do_it_method?(method) ? send(method,obj) : can_edit_default?(obj)
|
13
|
+
end
|
14
|
+
|
15
|
+
# parent: parent of the object created
|
16
|
+
# Examples:
|
17
|
+
# - session_user.can_create?(Proposal, project)
|
18
|
+
# - session_user.can_create?(Project)
|
19
|
+
def can_create?(obj_class, parent = self)
|
20
|
+
method = "can_create_#{CanSelfDoIt::Helper.class_2_method_sub_str(obj_class)}?"
|
21
|
+
respond_to_without_can_self_do_it_method?(method) ? send(method,parent) : can_create_default?(parent)
|
22
|
+
end
|
23
|
+
|
24
|
+
def can_delete?(obj)
|
25
|
+
method = "can_delete_#{CanSelfDoIt::Helper.class_2_method_sub_str(obj.class)}?"
|
26
|
+
respond_to_without_can_self_do_it_method?(method) ? send(method,obj) : can_delete_default?(obj)
|
27
|
+
end
|
28
|
+
|
29
|
+
alias_method :respond_to_without_can_self_do_it_method?, :respond_to?
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def can_see_default?(obj); raise NotImplementedError.new("You must implement can_see_default?.") ; end
|
34
|
+
def can_edit_default?(obj); raise NotImplementedError.new("You must implement can_edit_default?.") ; end
|
35
|
+
def can_create_default?(parent); raise NotImplementedError.new("You must implement can_create_default?.") ; end
|
36
|
+
def can_delete_default?(obj); raise NotImplementedError.new("You must implement can_delete_default?.") ; end
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module CanSelfDoIt
|
2
|
+
module Helper
|
3
|
+
|
4
|
+
def self.class_2_method_sub_str(a_class)
|
5
|
+
str = a_class.to_s
|
6
|
+
str.respond_to?(:underscore) ? str.underscore.sub('/','__') : self.underscore(str).sub('/','__')
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.underscore(camel_cased_word)
|
10
|
+
word = camel_cased_word.to_s.dup
|
11
|
+
word.gsub!(/::/, '/')
|
12
|
+
word.gsub!(/(?:([A-Za-z\d])|^)(#{/(?=a)b/})(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" }
|
13
|
+
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
14
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
15
|
+
word.tr!("-", "_")
|
16
|
+
word.downcase!
|
17
|
+
word
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.camelize(string)
|
21
|
+
string.sub(/^[a-z\d]*/){$&.capitalize}.gsub(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}"}.gsub('/', '::')
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module CanSelfDoIt
|
2
|
+
module Known
|
3
|
+
|
4
|
+
protected
|
5
|
+
|
6
|
+
def can_see_default?(obj); true; end
|
7
|
+
|
8
|
+
# Check for can_modify_default
|
9
|
+
def can_edit_default?(obj); can_modify_default?(obj); end
|
10
|
+
|
11
|
+
# Check the parent owner of the object to create
|
12
|
+
def can_create_default?(parent); can_modify_default?(parent); end
|
13
|
+
|
14
|
+
# Check for can_modify_default
|
15
|
+
def can_delete_default?(obj); can_modify_default?(obj); end
|
16
|
+
|
17
|
+
# Check if self is the administration or the obj owner
|
18
|
+
def can_modify_default?(obj); administrator_or_object_owner?(obj); end
|
19
|
+
|
20
|
+
|
21
|
+
def owner_method_names
|
22
|
+
[:owner, :author, :user]
|
23
|
+
end
|
24
|
+
|
25
|
+
def admin_method_name
|
26
|
+
:admin?
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def administrator_or_object_owner?(obj)
|
33
|
+
!! (
|
34
|
+
(self.admin_method_name && self.respond_to?(admin_method_name) && self.send(admin_method_name)) || #Administrator
|
35
|
+
self == owner_for(obj))
|
36
|
+
end
|
37
|
+
|
38
|
+
#we are finding object owner
|
39
|
+
def owner_for(obj)
|
40
|
+
(obj.is_a?(self.class) && obj) || (owner_method = owner_method_names.detect{|n| obj.respond_to?(n)}) && obj.send(owner_method)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module CanSelfDoIt
|
2
|
+
module Unknown
|
3
|
+
|
4
|
+
protected
|
5
|
+
|
6
|
+
def can_see_default?(obj); true; end
|
7
|
+
|
8
|
+
def can_edit_default?(obj); can_modify_default?(obj); end
|
9
|
+
|
10
|
+
def can_create_default?(parent); can_modify_default?(parent); end
|
11
|
+
|
12
|
+
def can_delete_default?(obj); can_modify_default?(obj); end
|
13
|
+
|
14
|
+
def can_modify_default?(obj); false; end
|
15
|
+
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require "can_self_do_it/version"
|
5
|
+
require "can_self_do_it/base"
|
6
|
+
require "can_self_do_it/auto"
|
7
|
+
require "can_self_do_it/known"
|
8
|
+
require "can_self_do_it/unknown"
|
9
|
+
|
10
|
+
module CanSelfDoIt
|
11
|
+
# Your code goes here...
|
12
|
+
end
|
13
|
+
|
14
|
+
Module.class_eval do
|
15
|
+
def acts_as_can_self_do_it(options={})
|
16
|
+
self.send(:include, CanSelfDoIt::Base)
|
17
|
+
self.send(:include, CanSelfDoIt::Auto) if options[:auto]
|
18
|
+
as = options[:as] || []
|
19
|
+
as = [as] unless as.respond_to?(:each)
|
20
|
+
as.each{|m| self.send(:include, m)}
|
21
|
+
end
|
22
|
+
end
|
data/spec/admin_spec.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe Admin do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
# Admin Blogs and Posts
|
7
|
+
class AdminActsAsCanSelfDoIt < Admin
|
8
|
+
acts_as_can_self_do_it(:as => CanSelfDoIt::Known, :auto => false)
|
9
|
+
end
|
10
|
+
@admin = AdminActsAsCanSelfDoIt.new
|
11
|
+
@blog_admin = Blog.new(@admin)
|
12
|
+
@post_admin = Post.new(@blog_admin)
|
13
|
+
# User Blogs and Posts
|
14
|
+
@user = User.new
|
15
|
+
@blog_user = Blog.new(@user)
|
16
|
+
@post_user = Post.new(@blog_user)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "can see any Blog" do
|
20
|
+
@admin.can_see?(@blog_admin).should == true
|
21
|
+
@admin.can_see?(@blog_user).should == true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "can see any Post" do
|
25
|
+
@admin.can_see?(@post_admin).should == true
|
26
|
+
@admin.can_see?(@post_user).should == true
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
it "can edit any Blog" do
|
31
|
+
@admin.can_edit?(@blog_admin).should == true
|
32
|
+
@admin.can_edit?(@blog_user).should == true
|
33
|
+
end
|
34
|
+
|
35
|
+
it "can edit any Post" do
|
36
|
+
@admin.can_edit?(@post_admin).should == true
|
37
|
+
@admin.can_edit?(@post_user).should == true
|
38
|
+
end
|
39
|
+
|
40
|
+
it "can comment any Post" do
|
41
|
+
@admin.can_create?(Comment, @post_admin).should == true
|
42
|
+
@admin.can_create?(Comment, @post_user).should == true
|
43
|
+
end
|
44
|
+
|
45
|
+
it "can delete any Blog" do
|
46
|
+
@admin.can_delete?(@blog_admin).should == true
|
47
|
+
@admin.can_delete?(@blog_user).should == true
|
48
|
+
end
|
49
|
+
|
50
|
+
it "can delete any Post" do
|
51
|
+
@admin.can_delete?(@post_admin).should == true
|
52
|
+
@admin.can_delete?(@post_user).should == true
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe Admin do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
# Admin Blogs and Posts
|
7
|
+
class AutoAdminActsAsCanSelfDoIt < Admin
|
8
|
+
acts_as_can_self_do_it(:as => CanSelfDoIt::Known, :auto => true)
|
9
|
+
end
|
10
|
+
|
11
|
+
@admin = AutoAdminActsAsCanSelfDoIt.new
|
12
|
+
@blog_admin = Blog.new(@admin)
|
13
|
+
@post_admin = Post.new(@blog_admin)
|
14
|
+
# User Blogs and Posts
|
15
|
+
@user = User.new
|
16
|
+
@blog_user = Blog.new(@user)
|
17
|
+
@post_user = Post.new(@blog_user)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "can see any Blog" do
|
21
|
+
@admin.can_see?(@blog_admin).should == true
|
22
|
+
@admin.can_see?(@blog_user).should == true
|
23
|
+
end
|
24
|
+
|
25
|
+
it "can see any Post" do
|
26
|
+
@admin.can_see?(@post_admin).should == true
|
27
|
+
@admin.can_see?(@post_user).should == true
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
it "can edit any Blog" do
|
32
|
+
@admin.can_edit?(@blog_admin).should == true
|
33
|
+
@admin.can_edit?(@blog_user).should == true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "can edit any Post" do
|
37
|
+
@admin.can_edit?(@post_admin).should == true
|
38
|
+
@admin.can_edit?(@post_user).should == true
|
39
|
+
end
|
40
|
+
|
41
|
+
it "can comment any Post" do
|
42
|
+
@admin.can_create?(Comment, @post_admin).should == true
|
43
|
+
@admin.can_create?(Comment, @post_user).should == true
|
44
|
+
end
|
45
|
+
|
46
|
+
it "can delete any Blog" do
|
47
|
+
@admin.can_delete?(@blog_admin).should == true
|
48
|
+
@admin.can_delete?(@blog_user).should == true
|
49
|
+
end
|
50
|
+
|
51
|
+
it "can delete any Post" do
|
52
|
+
@admin.can_delete?(@post_admin).should == true
|
53
|
+
@admin.can_delete?(@post_user).should == true
|
54
|
+
end
|
55
|
+
|
56
|
+
it "can share any Blog" do
|
57
|
+
@admin.can_share?(@blog_admin).should == true
|
58
|
+
@admin.can_share?(@blog_user).should == true
|
59
|
+
end
|
60
|
+
|
61
|
+
it "can join any Post" do
|
62
|
+
@admin.can_share?(@post_admin).should == true
|
63
|
+
@admin.can_share?(@post_user).should == true
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe Guest do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
|
7
|
+
class GuestActsAsCanSelfDoIt < Guest
|
8
|
+
acts_as_can_self_do_it(:as => CanSelfDoIt::Unknown, :auto => true)
|
9
|
+
end
|
10
|
+
|
11
|
+
@guest = GuestActsAsCanSelfDoIt.instance
|
12
|
+
|
13
|
+
# Admin Blogs and Posts
|
14
|
+
@admin = Admin.new
|
15
|
+
@blog_admin = Blog.new(@admin)
|
16
|
+
@post_admin = Post.new(@blog_admin)
|
17
|
+
# User Blogs and Posts
|
18
|
+
@user = User.new
|
19
|
+
@blog_user = Blog.new(@user)
|
20
|
+
@post_user = Post.new(@blog_user)
|
21
|
+
|
22
|
+
@comment_user = Comment.new(@post_admin, @user)
|
23
|
+
@comment_admin = Comment.new(@post_user, @admin)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "can see any Blog" do
|
27
|
+
@guest.can_see?(@blog_admin).should == true
|
28
|
+
@guest.can_see?(@blog_user).should == true
|
29
|
+
end
|
30
|
+
|
31
|
+
it "can see any Post" do
|
32
|
+
@guest.can_see?(@post_admin).should == true
|
33
|
+
@guest.can_see?(@post_user).should == true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "can't edit Blogs" do
|
37
|
+
@guest.can_edit?(@blog_admin).should == false
|
38
|
+
@guest.can_edit?(@blog_user).should == false
|
39
|
+
end
|
40
|
+
|
41
|
+
it "can't edit Posts" do
|
42
|
+
@guest.can_edit?(@post_admin).should == false
|
43
|
+
@guest.can_edit?(@post_user).should == false
|
44
|
+
end
|
45
|
+
|
46
|
+
it "can't delete Blogs" do
|
47
|
+
@guest.can_delete?(@blog_admin).should == false
|
48
|
+
@guest.can_delete?(@blog_user).should == false
|
49
|
+
end
|
50
|
+
|
51
|
+
it "can't delete Posts" do
|
52
|
+
@guest.can_delete?(@post_admin).should == false
|
53
|
+
@guest.can_delete?(@post_user).should == false
|
54
|
+
end
|
55
|
+
|
56
|
+
it "can't see user comments" do
|
57
|
+
@guest.can_see?(@comment_user).should == false
|
58
|
+
end
|
59
|
+
|
60
|
+
it "can see admin comments" do
|
61
|
+
@guest.can_see?(@comment_admin).should == true
|
62
|
+
end
|
63
|
+
|
64
|
+
it "can't share Posts" do
|
65
|
+
@guest.can_share?(@post_admin).should == false
|
66
|
+
@guest.can_share?(@post_user).should == false
|
67
|
+
end
|
68
|
+
|
69
|
+
it "can't join to Blogs" do
|
70
|
+
@guest.can_join?(@blog_admin).should == false
|
71
|
+
@guest.can_join?(@blog_user).should == false
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
data/spec/auto_spec.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
describe CanSelfDoIt::Auto do
|
2
|
+
|
3
|
+
before(:all) do
|
4
|
+
class CanSelfDoItImpWithAuto; acts_as_can_self_do_it(:auto => true); end
|
5
|
+
end
|
6
|
+
|
7
|
+
it "must respond to can_see?" do
|
8
|
+
can_self_do_it_impl = CanSelfDoItImpWithAuto.new
|
9
|
+
can_self_do_it_impl.respond_to?(:can_see?).should == true
|
10
|
+
end
|
11
|
+
|
12
|
+
it "must raise NotImplementedError when call can_see?" do
|
13
|
+
can_self_do_it_impl = CanSelfDoItImpWithAuto.new
|
14
|
+
expect{can_self_do_it_impl.can_see?(nil)}.to raise_error(NotImplementedError)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "must respond to can_view?" do
|
18
|
+
can_self_do_it_impl = CanSelfDoItImpWithAuto.new
|
19
|
+
can_self_do_it_impl.respond_to?(:can_view?).should == true
|
20
|
+
end
|
21
|
+
|
22
|
+
it "must raise NotImplementedError when call can_view?" do
|
23
|
+
can_self_do_it_impl = CanSelfDoItImpWithAuto.new
|
24
|
+
expect{can_self_do_it_impl.can_view?(nil)}.to raise_error(NotImplementedError)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "must respond to can_eliminate?" do
|
28
|
+
can_self_do_it_impl = CanSelfDoItImpWithAuto.new
|
29
|
+
can_self_do_it_impl.respond_to?(:can_eliminate?).should == true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "must raise NotImplementedError when call can_eliminate?" do
|
33
|
+
can_self_do_it_impl = CanSelfDoItImpWithAuto.new
|
34
|
+
expect{can_self_do_it_impl.can_eliminate?(nil)}.to raise_error(NotImplementedError)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "mustn't respond to eliminate?" do
|
38
|
+
can_self_do_it_impl = CanSelfDoItImpWithAuto.new
|
39
|
+
can_self_do_it_impl.respond_to?(:eliminate?).should == false
|
40
|
+
end
|
41
|
+
|
42
|
+
it "must raise NoMethodError when call eliminate?" do
|
43
|
+
can_self_do_it_impl = CanSelfDoItImpWithAuto.new
|
44
|
+
expect{can_self_do_it_impl.eliminate?(nil)}.to raise_error(NoMethodError)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "mustn't respond to can_eliminate" do
|
48
|
+
can_self_do_it_impl = CanSelfDoItImpWithAuto.new
|
49
|
+
can_self_do_it_impl.respond_to?(:can_eliminate).should == false
|
50
|
+
end
|
51
|
+
|
52
|
+
it "must raise NoMethodError when call can_eliminate" do
|
53
|
+
can_self_do_it_impl = CanSelfDoItImpWithAuto.new
|
54
|
+
expect{can_self_do_it_impl.can_eliminate(nil)}.to raise_error(NoMethodError)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe User do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
# User
|
7
|
+
class AutoUserActsAsCanSelfDoIt < User
|
8
|
+
acts_as_can_self_do_it(:as => CanSelfDoIt::Known, :auto => true)
|
9
|
+
end
|
10
|
+
|
11
|
+
@user = AutoUserActsAsCanSelfDoIt.new
|
12
|
+
|
13
|
+
# User Blogs and Posts
|
14
|
+
@blog_user = Blog.new(@user)
|
15
|
+
@post_user = Post.new(@blog_user)
|
16
|
+
|
17
|
+
# Other User Blogs and Posts
|
18
|
+
@blog_other_user = Blog.new(User.new)
|
19
|
+
@post_other_user = Post.new(@blog_other_user)
|
20
|
+
|
21
|
+
# Admin Blogs and Posts
|
22
|
+
@blog_admin = Blog.new(Admin.new)
|
23
|
+
@post_admin = Post.new(@blog_admin)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "can see any Blog" do
|
27
|
+
@user.can_see?(@blog_admin).should == true
|
28
|
+
@user.can_see?(@blog_user).should == true
|
29
|
+
@user.can_see?(@blog_other_user).should == true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can see any Post" do
|
33
|
+
@user.can_see?(@post_admin).should == true
|
34
|
+
@user.can_see?(@post_user).should == true
|
35
|
+
@user.can_see?(@post_other_user).should == true
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
it "can edit his Blogs" do
|
40
|
+
@user.can_edit?(@blog_user).should == true
|
41
|
+
end
|
42
|
+
|
43
|
+
it "can edit his Posts" do
|
44
|
+
@user.can_edit?(@post_user).should == true
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
it "can't edit other's Blogs" do
|
49
|
+
@user.can_edit?(@blog_admin).should == false
|
50
|
+
@user.can_edit?(@blog_other_user).should == false
|
51
|
+
end
|
52
|
+
|
53
|
+
it "can't edit other's Posts" do
|
54
|
+
@user.can_edit?(@post_admin).should == false
|
55
|
+
@user.can_edit?(@post_other_user).should == false
|
56
|
+
end
|
57
|
+
|
58
|
+
it "can comment his own posts" do
|
59
|
+
@user.can_create?(Comment, @user_post).should == true
|
60
|
+
end
|
61
|
+
|
62
|
+
it "can comment other user posts" do
|
63
|
+
@user.can_create?(Comment, @other_user_post).should == true
|
64
|
+
end
|
65
|
+
|
66
|
+
it "can comment admin posts" do
|
67
|
+
@user.can_create?(Comment, @other_user_post).should == true
|
68
|
+
end
|
69
|
+
|
70
|
+
it "can delete his Blogs" do
|
71
|
+
@user.can_delete?(@blog_user).should == true
|
72
|
+
end
|
73
|
+
|
74
|
+
it "can delete his Posts" do
|
75
|
+
@user.can_delete?(@post_user).should == true
|
76
|
+
end
|
77
|
+
|
78
|
+
it "can't delete other's Blogs" do
|
79
|
+
@user.can_delete?(@blog_admin).should == false
|
80
|
+
@user.can_delete?(@blog_other_user).should == false
|
81
|
+
end
|
82
|
+
|
83
|
+
it "can't delete other's Posts" do
|
84
|
+
@user.can_delete?(@post_admin).should == false
|
85
|
+
@user.can_delete?(@post_other_user).should == false
|
86
|
+
end
|
87
|
+
|
88
|
+
it "can share his Posts" do
|
89
|
+
@user.can_share?(@post_user).should == true
|
90
|
+
end
|
91
|
+
|
92
|
+
it "can't share other's Blogs" do
|
93
|
+
@user.can_share?(@blog_admin).should == false
|
94
|
+
@user.can_share?(@blog_other_user).should == false
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
data/spec/base_spec.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
describe CanSelfDoIt::Base do
|
2
|
+
|
3
|
+
before(:all) do
|
4
|
+
class CanSelfDoItImp; acts_as_can_self_do_it; end
|
5
|
+
end
|
6
|
+
|
7
|
+
it "must respond to can_see?" do
|
8
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
9
|
+
can_self_do_it_impl.respond_to?(:can_see?).should == true
|
10
|
+
end
|
11
|
+
|
12
|
+
it "must respond to can_edit?" do
|
13
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
14
|
+
can_self_do_it_impl.respond_to?(:can_edit?).should == true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "must respond to can_delete?" do
|
18
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
19
|
+
can_self_do_it_impl.respond_to?(:can_delete?).should == true
|
20
|
+
end
|
21
|
+
|
22
|
+
it "must respond to can_create?" do
|
23
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
24
|
+
can_self_do_it_impl.respond_to?(:can_create?).should == true
|
25
|
+
end
|
26
|
+
|
27
|
+
it "must raise NotImplementedError when call can_see?" do
|
28
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
29
|
+
expect{can_self_do_it_impl.can_see?(nil)}.to raise_error(NotImplementedError)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "must raise NotImplementedError when call can_edit?" do
|
33
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
34
|
+
expect{can_self_do_it_impl.can_edit?(nil)}.to raise_error(NotImplementedError)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "must raise NotImplementedError when call can_delete?" do
|
38
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
39
|
+
expect{can_self_do_it_impl.can_delete?(nil)}.to raise_error(NotImplementedError)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "must raise NotImplementedError when call can_create?" do
|
43
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
44
|
+
expect{can_self_do_it_impl.can_create?(nil,nil)}.to raise_error(NotImplementedError)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "mustn't respond to can_view?" do
|
48
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
49
|
+
can_self_do_it_impl.respond_to?(:can_view?).should == false
|
50
|
+
end
|
51
|
+
|
52
|
+
it "must raise NoMethodError when call can_view?" do
|
53
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
54
|
+
expect{can_self_do_it_impl.can_view?(nil)}.to raise_error(NoMethodError)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "mustn't respond to can_eliminate?" do
|
58
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
59
|
+
can_self_do_it_impl.respond_to?(:can_eliminate?).should == false
|
60
|
+
end
|
61
|
+
|
62
|
+
it "must raise NoMethodError when call can_eliminate?" do
|
63
|
+
can_self_do_it_impl = CanSelfDoItImp.new
|
64
|
+
expect{can_self_do_it_impl.can_eliminate?(nil)}.to raise_error(NoMethodError)
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
data/spec/guest_spec.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe Guest do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
|
7
|
+
class GuestActsAsCanSelfDoIt < Guest
|
8
|
+
acts_as_can_self_do_it(:as => CanSelfDoIt::Unknown, :auto => false)
|
9
|
+
end
|
10
|
+
|
11
|
+
@guest = GuestActsAsCanSelfDoIt.instance
|
12
|
+
|
13
|
+
# Admin Blogs and Posts
|
14
|
+
@admin = Admin.new
|
15
|
+
@blog_admin = Blog.new(@admin)
|
16
|
+
@post_admin = Post.new(@blog_admin)
|
17
|
+
# User Blogs and Posts
|
18
|
+
@user = User.new
|
19
|
+
@blog_user = Blog.new(@user)
|
20
|
+
@post_user = Post.new(@blog_user)
|
21
|
+
|
22
|
+
@comment_user = Comment.new(@post_admin, @user)
|
23
|
+
@comment_admin = Comment.new(@post_user, @admin)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "can see any Blog" do
|
27
|
+
@guest.can_see?(@blog_admin).should == true
|
28
|
+
@guest.can_see?(@blog_user).should == true
|
29
|
+
end
|
30
|
+
|
31
|
+
it "can see any Post" do
|
32
|
+
@guest.can_see?(@post_admin).should == true
|
33
|
+
@guest.can_see?(@post_user).should == true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "can't edit Blogs" do
|
37
|
+
@guest.can_edit?(@blog_admin).should == false
|
38
|
+
@guest.can_edit?(@blog_user).should == false
|
39
|
+
end
|
40
|
+
|
41
|
+
it "can't edit Posts" do
|
42
|
+
@guest.can_edit?(@post_admin).should == false
|
43
|
+
@guest.can_edit?(@post_user).should == false
|
44
|
+
end
|
45
|
+
|
46
|
+
it "can't delete Blogs" do
|
47
|
+
@guest.can_delete?(@blog_admin).should == false
|
48
|
+
@guest.can_delete?(@blog_user).should == false
|
49
|
+
end
|
50
|
+
|
51
|
+
it "can't delete Posts" do
|
52
|
+
@guest.can_delete?(@post_admin).should == false
|
53
|
+
@guest.can_delete?(@post_user).should == false
|
54
|
+
end
|
55
|
+
|
56
|
+
it "can't see user comments" do
|
57
|
+
@guest.can_see?(@comment_user).should == false
|
58
|
+
end
|
59
|
+
|
60
|
+
it "can see admin comments" do
|
61
|
+
@guest.can_see?(@comment_admin).should == true
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
end
|
data/spec/known_spec.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
describe CanSelfDoIt::Known do
|
2
|
+
|
3
|
+
it "must implement can_see_default?" do
|
4
|
+
CanSelfDoIt::Known.protected_method_defined?(:can_see_default?).should == true
|
5
|
+
end
|
6
|
+
|
7
|
+
it "must implement can_edit_default?" do
|
8
|
+
CanSelfDoIt::Known.protected_method_defined?(:can_edit_default?).should == true
|
9
|
+
end
|
10
|
+
|
11
|
+
it "must implement can_create_default?" do
|
12
|
+
CanSelfDoIt::Known.protected_method_defined?(:can_create_default?).should == true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "must implement can_delete_default?" do
|
16
|
+
CanSelfDoIt::Known.protected_method_defined?(:can_delete_default?).should == true
|
17
|
+
end
|
18
|
+
|
19
|
+
it "must implement can_modify_default?" do
|
20
|
+
CanSelfDoIt::Known.protected_method_defined?(:can_modify_default?).should == true
|
21
|
+
end
|
22
|
+
|
23
|
+
it "must implement owner_method_names" do
|
24
|
+
CanSelfDoIt::Known.protected_method_defined?(:owner_method_names).should == true
|
25
|
+
end
|
26
|
+
|
27
|
+
it "must implement admin_method_name" do
|
28
|
+
CanSelfDoIt::Known.protected_method_defined?(:admin_method_name).should == true
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'singleton'
|
3
|
+
require 'rspec'
|
4
|
+
require 'can_self_do_it'
|
5
|
+
$LOAD_PATH.unshift File.expand_path("../lib", File.dirname(__FILE__))
|
6
|
+
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.before :all do
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Guest
|
13
|
+
include Singleton
|
14
|
+
# Custom
|
15
|
+
# Guest only can see admin comments
|
16
|
+
def can_see_comment?(comment); comment.user.admin?; end
|
17
|
+
end
|
18
|
+
|
19
|
+
class User
|
20
|
+
attr_accessor :blogs
|
21
|
+
def admin?; false;end
|
22
|
+
def initialize
|
23
|
+
@blogs = []
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
# Custom
|
28
|
+
# Users can comment any post
|
29
|
+
def can_create_comment?(post); true; end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
class Admin
|
34
|
+
attr_accessor :blogs
|
35
|
+
def admin?; true;end
|
36
|
+
def initialize
|
37
|
+
@blogs = []
|
38
|
+
self
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
class Blog
|
44
|
+
attr_accessor :user, :posts
|
45
|
+
def initialize(user)
|
46
|
+
@user = user
|
47
|
+
@posts = []
|
48
|
+
@user.blogs << self
|
49
|
+
self
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class Post
|
54
|
+
attr_accessor :blog, :comments
|
55
|
+
|
56
|
+
def owner
|
57
|
+
@blog.user
|
58
|
+
end
|
59
|
+
|
60
|
+
def initialize(blog)
|
61
|
+
@comments = []
|
62
|
+
@blog = blog
|
63
|
+
@blog.posts << self
|
64
|
+
self
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class Comment
|
69
|
+
attr_accessor :post, :user
|
70
|
+
|
71
|
+
def initialize(post, user)
|
72
|
+
@post = post
|
73
|
+
@user = user
|
74
|
+
@post.comments << self
|
75
|
+
self
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
describe CanSelfDoIt::Unknown do
|
2
|
+
|
3
|
+
it "must implement can_see_default?" do
|
4
|
+
CanSelfDoIt::Unknown.protected_method_defined?(:can_see_default?).should == true
|
5
|
+
end
|
6
|
+
|
7
|
+
it "must implement can_edit_default?" do
|
8
|
+
CanSelfDoIt::Unknown.protected_method_defined?(:can_edit_default?).should == true
|
9
|
+
end
|
10
|
+
|
11
|
+
it "must implement can_create_default?" do
|
12
|
+
CanSelfDoIt::Unknown.protected_method_defined?(:can_create_default?).should == true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "must implement can_delete_default?" do
|
16
|
+
CanSelfDoIt::Unknown.protected_method_defined?(:can_delete_default?).should == true
|
17
|
+
end
|
18
|
+
|
19
|
+
it "must implement can_modify_default?" do
|
20
|
+
CanSelfDoIt::Unknown.protected_method_defined?(:can_modify_default?).should == true
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
end
|
data/spec/user_spec.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe User do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
# User
|
7
|
+
class UserActsAsCanSelfDoIt < User
|
8
|
+
acts_as_can_self_do_it(:as => CanSelfDoIt::Known, :auto => false)
|
9
|
+
end
|
10
|
+
|
11
|
+
@user = UserActsAsCanSelfDoIt.new
|
12
|
+
|
13
|
+
# User Blogs and Posts
|
14
|
+
@blog_user = Blog.new(@user)
|
15
|
+
@post_user = Post.new(@blog_user)
|
16
|
+
|
17
|
+
# Other User Blogs and Posts
|
18
|
+
@blog_other_user = Blog.new(User.new)
|
19
|
+
@post_other_user = Post.new(@blog_other_user)
|
20
|
+
|
21
|
+
# Admin Blogs and Posts
|
22
|
+
@blog_admin = Blog.new(Admin.new)
|
23
|
+
@post_admin = Post.new(@blog_admin)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "can see any Blog" do
|
27
|
+
@user.can_see?(@blog_admin).should == true
|
28
|
+
@user.can_see?(@blog_user).should == true
|
29
|
+
@user.can_see?(@blog_other_user).should == true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can see any Post" do
|
33
|
+
@user.can_see?(@post_admin).should == true
|
34
|
+
@user.can_see?(@post_user).should == true
|
35
|
+
@user.can_see?(@post_other_user).should == true
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
it "can edit his Blogs" do
|
40
|
+
@user.can_edit?(@blog_user).should == true
|
41
|
+
end
|
42
|
+
|
43
|
+
it "can edit his Posts" do
|
44
|
+
@user.can_edit?(@post_user).should == true
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
it "can't edit other's Blogs" do
|
49
|
+
@user.can_edit?(@blog_admin).should == false
|
50
|
+
@user.can_edit?(@blog_other_user).should == false
|
51
|
+
end
|
52
|
+
|
53
|
+
it "can't edit other's Posts" do
|
54
|
+
@user.can_edit?(@post_admin).should == false
|
55
|
+
@user.can_edit?(@post_other_user).should == false
|
56
|
+
end
|
57
|
+
|
58
|
+
it "can comment his own posts" do
|
59
|
+
@user.can_create?(Comment, @user_post).should == true
|
60
|
+
end
|
61
|
+
|
62
|
+
it "can comment other user posts" do
|
63
|
+
@user.can_create?(Comment, @other_user_post).should == true
|
64
|
+
end
|
65
|
+
|
66
|
+
it "can comment admin posts" do
|
67
|
+
@user.can_create?(Comment, @other_user_post).should == true
|
68
|
+
end
|
69
|
+
|
70
|
+
it "can delete his Blogs" do
|
71
|
+
@user.can_delete?(@blog_user).should == true
|
72
|
+
end
|
73
|
+
|
74
|
+
it "can delete his Posts" do
|
75
|
+
@user.can_delete?(@post_user).should == true
|
76
|
+
end
|
77
|
+
|
78
|
+
it "can't delete other's Blogs" do
|
79
|
+
@user.can_delete?(@blog_admin).should == false
|
80
|
+
@user.can_delete?(@blog_other_user).should == false
|
81
|
+
end
|
82
|
+
|
83
|
+
it "can't delete other's Posts" do
|
84
|
+
@user.can_delete?(@post_admin).should == false
|
85
|
+
@user.can_delete?(@post_other_user).should == false
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: can_self_do_it
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Juan Martín Buceta
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-12-02 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: &8556920 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *8556920
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &8556500 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *8556500
|
36
|
+
description: Provide modules to work with sereveral permission policies
|
37
|
+
email:
|
38
|
+
- mbuceta@grantaire.com.ar
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- Gemfile
|
45
|
+
- README.rdoc
|
46
|
+
- Rakefile
|
47
|
+
- can_self_do_it.gemspec
|
48
|
+
- lib/can_self_do_it.rb
|
49
|
+
- lib/can_self_do_it/auto.rb
|
50
|
+
- lib/can_self_do_it/base.rb
|
51
|
+
- lib/can_self_do_it/helper.rb
|
52
|
+
- lib/can_self_do_it/known.rb
|
53
|
+
- lib/can_self_do_it/unknown.rb
|
54
|
+
- lib/can_self_do_it/version.rb
|
55
|
+
- spec/admin_spec.rb
|
56
|
+
- spec/auto_admin_spec.rb
|
57
|
+
- spec/auto_guest_spec.rb
|
58
|
+
- spec/auto_spec.rb
|
59
|
+
- spec/auto_user_spec.rb
|
60
|
+
- spec/base_spec.rb
|
61
|
+
- spec/guest_spec.rb
|
62
|
+
- spec/known_spec.rb
|
63
|
+
- spec/spec_helper.rb
|
64
|
+
- spec/unknown_spec.rb
|
65
|
+
- spec/user_spec.rb
|
66
|
+
homepage: http://martinbuceta.com.ar
|
67
|
+
licenses: []
|
68
|
+
post_install_message:
|
69
|
+
rdoc_options: []
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
requirements: []
|
85
|
+
rubyforge_project: can_self_do_it
|
86
|
+
rubygems_version: 1.8.11
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: Simple can_*? like method to manage permissions
|
90
|
+
test_files: []
|