acts_as_owner 1.2.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.
- data.tar.gz.sig +0 -0
- data/MIT-LICENSE +20 -0
- data/Manifest +7 -0
- data/README.rdoc +36 -0
- data/Rakefile +12 -0
- data/VERSION.yml +4 -0
- data/acts_as_owner.gemspec +32 -0
- data/init.rb +1 -0
- data/lib/acts_as_owner.rb +74 -0
- metadata +97 -0
- metadata.gz.sig +0 -0
data.tar.gz.sig
ADDED
Binary file
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Cyril Wack
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Manifest
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
= Acts as owner
|
2
|
+
|
3
|
+
Provides to a user the ability to self-query about the possession of a given resource or a given account.
|
4
|
+
|
5
|
+
Any resources belonging to an other resource which is owned by the user are considered such as owned by this user too.
|
6
|
+
|
7
|
+
== Install
|
8
|
+
|
9
|
+
Install the gem (recommended):
|
10
|
+
|
11
|
+
sudo gem install acts_as_owner
|
12
|
+
|
13
|
+
Or you can install this as a plugin:
|
14
|
+
|
15
|
+
script/plugin install git://github.com/cyril/acts_as_owner.git
|
16
|
+
|
17
|
+
== Example
|
18
|
+
|
19
|
+
class User < ActiveRecord::Base
|
20
|
+
acts_as_owner :categories, :articles, :comments
|
21
|
+
end
|
22
|
+
|
23
|
+
# Considering this article:
|
24
|
+
article = current_user.articles.first
|
25
|
+
|
26
|
+
# We can see that:
|
27
|
+
current_user.owns? article # => true
|
28
|
+
current_user.owns? article.user # => true
|
29
|
+
|
30
|
+
# Now, check if its first comment is ours:
|
31
|
+
current_user.owns? article.comments.first.user # => false
|
32
|
+
|
33
|
+
# But even if it is not, this comment is a child of our article, so:
|
34
|
+
current_user.owns? article.comments.first # => true
|
35
|
+
|
36
|
+
Copyright (c) 2009 Cyril Wack, released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('acts_as_owner', '1.2.0') do |p|
|
6
|
+
p.description = "Simple Rails plugin that allows to operate freely on objects which belong to us."
|
7
|
+
p.url = "http://github.com/cyril/acts_as_owner"
|
8
|
+
p.author = "Cyril Wack"
|
9
|
+
p.email = "cyril.wack@gmail.com"
|
10
|
+
p.ignore_pattern = ["tmp/*", "script/*"]
|
11
|
+
p.development_dependencies = []
|
12
|
+
end
|
data/VERSION.yml
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{acts_as_owner}
|
5
|
+
s.version = "1.2.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Cyril Wack"]
|
9
|
+
s.cert_chain = ["/Users/cyril/gem-public_cert.pem"]
|
10
|
+
s.date = %q{2010-04-12}
|
11
|
+
s.description = %q{Simple Rails plugin that allows to operate freely on objects which belong to us.}
|
12
|
+
s.email = %q{cyril.wack@gmail.com}
|
13
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/acts_as_owner.rb"]
|
14
|
+
s.files = ["MIT-LICENSE", "README.rdoc", "Rakefile", "VERSION.yml", "init.rb", "lib/acts_as_owner.rb", "Manifest", "acts_as_owner.gemspec"]
|
15
|
+
s.homepage = %q{http://github.com/cyril/acts_as_owner}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Acts_as_owner", "--main", "README.rdoc"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{acts_as_owner}
|
19
|
+
s.rubygems_version = %q{1.3.6}
|
20
|
+
s.signing_key = %q{/Users/cyril/gem-private_key.pem}
|
21
|
+
s.summary = %q{Simple Rails plugin that allows to operate freely on objects which belong to us.}
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
else
|
29
|
+
end
|
30
|
+
else
|
31
|
+
end
|
32
|
+
end
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'acts_as_owner'
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'active_record/base'
|
2
|
+
|
3
|
+
module ActsAsOwner
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
# Configuration resources are: all resources belonging to the current model.
|
10
|
+
def acts_as_owner(*resources)
|
11
|
+
resources.each { |resource| has_many resource.to_s.tableize.to_sym, :dependent => :destroy }
|
12
|
+
|
13
|
+
class_eval <<-EOV
|
14
|
+
include ActsAsOwner::InstanceMethods
|
15
|
+
|
16
|
+
def self.owns_many
|
17
|
+
reflections.select { |name, reflection| reflection.macro == :has_many }.collect { |table| table[0].to_s.singularize }
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.owns_one
|
21
|
+
reflections.select { |name, reflection| reflection.macro == :has_one }.collect { |table| table[0].to_s.singularize }
|
22
|
+
end
|
23
|
+
EOV
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module InstanceMethods
|
28
|
+
# Returns true if the user owns the object which can be a account or a resource. Otherwise returns false.
|
29
|
+
def owns?(object = nil)
|
30
|
+
return false if object.nil?
|
31
|
+
object.is_a?(self.class) ? self.owns_this_account?(object) : self.owns_this_resource?(object)
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
# Returns true if the user owns the account, otherwise returns false.
|
37
|
+
def owns_this_account?(account)
|
38
|
+
self.id == account.id
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns true if the user owns the resource, otherwise returns false.
|
42
|
+
def owns_this_resource?(resource)
|
43
|
+
(has_many?(resource) || has_one?(resource)) ||
|
44
|
+
parents_of(resource).collect { |parent| owns_this_resource?(parent) }.select { |result| result == true }.uniq.pop == true
|
45
|
+
end
|
46
|
+
|
47
|
+
# Has many association
|
48
|
+
def has_many?(resource)
|
49
|
+
self.respond_to?(resource.class.name.tableize) && self.send(resource.class.name.tableize).include?(resource)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Has one association
|
53
|
+
def has_one?(resource)
|
54
|
+
self.respond_to?(resource.class.name.tableize.singularize) && self.send(resource.class.name.tableize.singularize) == resource
|
55
|
+
end
|
56
|
+
|
57
|
+
# Returns an array of resources that are:
|
58
|
+
# * directly superior to the resource passed as parameter, according the hierarchical tree structure;
|
59
|
+
# * potentially owned by the current user, through the hierarchical relationship.
|
60
|
+
def parents_of(resource)
|
61
|
+
potential_owners_of(resource).collect { |method| resource.send(method) }
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns an array containing symbols common to children
|
65
|
+
# which belongs to the current user and to parents which has many or has one given resource.
|
66
|
+
def potential_owners_of(resource)
|
67
|
+
(self.class.owns_many | self.class.owns_one) & resource.class.reflections.select do |name, reflection|
|
68
|
+
reflection.macro == :belongs_to
|
69
|
+
end.collect { |table| table[0].to_s }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
ActiveRecord::Base.class_eval { include ActsAsOwner }
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: acts_as_owner
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 1.2.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Cyril Wack
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain:
|
16
|
+
- |
|
17
|
+
-----BEGIN CERTIFICATE-----
|
18
|
+
MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMRMwEQYDVQQDDApjeXJp
|
19
|
+
bC53YWNrMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNj
|
20
|
+
b20wHhcNMTAwNDExMjI1OTI4WhcNMTEwNDExMjI1OTI4WjBBMRMwEQYDVQQDDApj
|
21
|
+
eXJpbC53YWNrMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
|
22
|
+
FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGJFqPSXGYdS6t
|
23
|
+
t+kXyFuLg7uIbQHToLhdbfpu5j7dl65EWAspRI37ZE/FIFosmwQ0DAGiJ35gVX7K
|
24
|
+
5/rj745EUW9vijemlNHZjTY40AQAP2avlcMd6DnA7pl/x8dxC9G2dW/IS0nmjH0E
|
25
|
+
+X7X0BZ8WIY7PBvLsq5ptpGaoaxpmqRjJDANolnODwyBjFWtUqpvOGeUWL24orZ3
|
26
|
+
xwcW6d1vl8hraZ3UUJtIVXFg85lHclyrP33DYxj5sstgRwovaCPrvUQ6ZZ+hX/iJ
|
27
|
+
MYaEFZsw74WVD4RLHl1bEz2RQGDgSwfFnOnrQ1gi2SaeqUN7uFThAEbbyiJK+rNL
|
28
|
+
xapWOFs9AgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
29
|
+
BBSsO/YPzLP2/ZtBKQfWveZNRK3uKDANBgkqhkiG9w0BAQUFAAOCAQEAGaGpPlEc
|
30
|
+
Z8A7Jtfws1tpdLOlQrQQXfIgBrPvfjO18MxT2BVgnusYcMuJgrY1skbH6RDxhdia
|
31
|
+
EetICD0kvyGnbK+dHdhRwvmmiqc7ZOaiFb3RNLcW6jduxafH4zgKUeg23KpfJYy3
|
32
|
+
MOqVgHckM1hMZTWz7nmrXJBAjj/48jFOPrwtTed8kd6KpIjUz4e2oTwT+JIVnryF
|
33
|
+
sYFesvR4DywbXL88T29gq5biCHsAgbK89DW5DNx1Yg1HNLxCdJurJFrcQQS3XQco
|
34
|
+
h2svBTlG7Yg1wLZAGkVx4RSkrFujrxpgLsz5bfmdnbiEgKcF9njIOdVO4P4vwyoS
|
35
|
+
G4VzQZjAGxprTw==
|
36
|
+
-----END CERTIFICATE-----
|
37
|
+
|
38
|
+
date: 2010-04-12 00:00:00 +02:00
|
39
|
+
default_executable:
|
40
|
+
dependencies: []
|
41
|
+
|
42
|
+
description: Simple Rails plugin that allows to operate freely on objects which belong to us.
|
43
|
+
email: cyril.wack@gmail.com
|
44
|
+
executables: []
|
45
|
+
|
46
|
+
extensions: []
|
47
|
+
|
48
|
+
extra_rdoc_files:
|
49
|
+
- README.rdoc
|
50
|
+
- lib/acts_as_owner.rb
|
51
|
+
files:
|
52
|
+
- MIT-LICENSE
|
53
|
+
- README.rdoc
|
54
|
+
- Rakefile
|
55
|
+
- VERSION.yml
|
56
|
+
- init.rb
|
57
|
+
- lib/acts_as_owner.rb
|
58
|
+
- Manifest
|
59
|
+
- acts_as_owner.gemspec
|
60
|
+
has_rdoc: true
|
61
|
+
homepage: http://github.com/cyril/acts_as_owner
|
62
|
+
licenses: []
|
63
|
+
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options:
|
66
|
+
- --line-numbers
|
67
|
+
- --inline-source
|
68
|
+
- --title
|
69
|
+
- Acts_as_owner
|
70
|
+
- --main
|
71
|
+
- README.rdoc
|
72
|
+
require_paths:
|
73
|
+
- lib
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
segments:
|
86
|
+
- 1
|
87
|
+
- 2
|
88
|
+
version: "1.2"
|
89
|
+
requirements: []
|
90
|
+
|
91
|
+
rubyforge_project: acts_as_owner
|
92
|
+
rubygems_version: 1.3.6
|
93
|
+
signing_key:
|
94
|
+
specification_version: 3
|
95
|
+
summary: Simple Rails plugin that allows to operate freely on objects which belong to us.
|
96
|
+
test_files: []
|
97
|
+
|
metadata.gz.sig
ADDED
Binary file
|