rend-acl 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rend-acl.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 1999 - 2013, Daniel Doezema All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without modification,
4
+ are permitted provided that the following conditions are met:
5
+
6
+ * Redistributions of source code must retain the above copyright notice, this
7
+ list of conditions and the following disclaimer.
8
+
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+
13
+ * The names of the contributors and/or copyright holder may not be used to
14
+ endorse or promote products derived from this software without specific
15
+ prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND
18
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
+ DISCLAIMED. IN NO EVENT SHALL DANIEL DOEZEMA BE LIABLE FOR ANY DIRECT, INDIRECT,
21
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # Rend Acl
2
+
3
+ Rend-Acl is a port of [Zend_Acl](http://framework.zend.com/manual/1.12/en/zend.acl.html) with modifications made to bring the api more inline with Ruby conventions.
4
+
5
+ ## Installation
6
+
7
+ gem install rend-acl
8
+
9
+ ## Contributing
10
+
11
+ 1. Fork it
12
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
13
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
14
+ 4. Push to the branch (`git push origin my-new-feature`)
15
+ 5. Create new Pull Request
16
+
17
+ ## Licensing
18
+
19
+ * All ported Ruby code and assoicated 'Rend' gems are under a simple [New-BSD License](http://dan.doezema.com/licenses/new-bsd).
20
+ * Original PHP code is licensed under [Zend's New-BSD License](http://framework.zend.com/license/).
21
+ * This license can be found in `./ZEND_FRAMEWORK_LICENSE.txt`
22
+
23
+ ## Acknowledgements
24
+ * This project is **not** associated with, or endorsed by, Zend Technologies USA, Inc., nor any of its contributors.
25
+ * Rend's modular design was heavily influced by [RSpec](https://github.com/rspec/rspec) approach.
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'test'
6
+ end
7
+
8
+ desc "Run tests"
9
+ task :default => :test
@@ -0,0 +1,27 @@
1
+ New BSD License
2
+ Copyright (c) 2005-2013, Zend Technologies USA, Inc. All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+
10
+ * Redistributions in binary form must reproduce the above copyright notice, this
11
+ list of conditions and the following disclaimer in the documentation and/or
12
+ other materials provided with the distribution.
13
+
14
+ * Neither the name of Zend Technologies USA, Inc. nor the names of its
15
+ contributors may be used to endorse or promote products derived from this
16
+ software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
22
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
25
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,6 @@
1
+ module Rend
2
+ class Acl
3
+ class Exception < Rend::Core::Exception
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ module Rend
2
+ class Acl
3
+ class Resource
4
+
5
+ # Unique id of Resource
6
+ attr_reader :id # @var string
7
+
8
+ def initialize(id)
9
+ @id = id.to_s
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module Rend
2
+ class Acl
3
+ class Role
4
+ class Registry
5
+ class Exception < Rend::Acl::Exception
6
+ end
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,168 @@
1
+ require 'rend/acl/role/registry/exception'
2
+ module Rend
3
+ class Acl
4
+ class Role
5
+ class Registry
6
+ include Rend::Core::Helpers::Php
7
+
8
+ # Internal Role registry data storage
9
+ # @var hash
10
+ attr_accessor :roles
11
+
12
+ def initialize
13
+ self.roles = {}
14
+ end
15
+
16
+ # Adds a Role having an identifier unique to the registry
17
+ #
18
+ # The parents parameter may be a reference to, or the string identifier for,
19
+ # a Role existing in the registry, or parents may be passed as an array of
20
+ # these - mixing string identifiers and objects is ok - to indicate the Roles
21
+ # from which the newly added Role will directly inherit.
22
+ #
23
+ # In order to resolve potential ambiguities with conflicting rules inherited
24
+ # from different parents, the most recently added parent takes precedence over
25
+ # parents that were previously added. In other words, the first parent added
26
+ # will have the least priority, and the last parent added will have the
27
+ # highest priority.
28
+ #
29
+ # @param Rend::Acl::Role role
30
+ # @param Rend::Acl::Role|string|array parents
31
+ # @throws Rend::Acl::Role::Registry::Exception
32
+ # @return Rend::Acl::Role::Registry Provides a fluent interface
33
+ def add!(role, parents = nil)
34
+ type_hint! Rend::Acl::Role, role, :is_required => true
35
+
36
+ role_id = role.id
37
+ raise Exception, "Role id 'role_id' already exists in the registry" if has?(role_id)
38
+
39
+ role_parents = {}
40
+
41
+ if parents
42
+ Array(parents).each do |parent|
43
+ begin
44
+ role_parent_id = (parent.class <= Rend::Acl::Role) ? parent.id : parent
45
+ role_parent = get!(role_parent_id)
46
+ rescue Exception
47
+ raise Exception, "Parent Role id 'role_parent_id' does not exist"
48
+ end
49
+ role_parents[role_parent_id] = role_parent
50
+ roles[role_parent_id][:children][role_id] = role
51
+ # roles[role_parent_id][:instance].children[role_id] = role # future
52
+ end
53
+ end
54
+
55
+ # role.parents = role_parents -- future
56
+
57
+ roles[role_id] = {
58
+ :instance => role,
59
+ :parents => role_parents,
60
+ :children => {}
61
+ }
62
+
63
+ self
64
+ end
65
+
66
+
67
+ # Returns the identified Role
68
+ #
69
+ # The role parameter can either be a Role or a Role identifier.
70
+ #
71
+ # @param Rend::Acl::Role|string role
72
+ # @throws Rend::Acl::Role::Registry::Exception
73
+ # @return Rend::Acl::Role
74
+ def get!(role)
75
+ raise Exception, "Role 'role_id' not found" unless has?(role)
76
+ role_id = (role.class <= Rend::Acl::Role) ? role.id : role.to_s
77
+ roles[role_id][:instance]
78
+ end
79
+
80
+
81
+ # Returns true if and only if the Role exists in the registry
82
+ #
83
+ # The role parameter can either be a Role or a Role identifier.
84
+ #
85
+ # @param Rend::Acl::Role|string role
86
+ # @return boolean
87
+ def has?(role)
88
+ role_id = (role.class <= Rend::Acl::Role) ? role.id : role.to_s
89
+ roles.has_key?(role_id)
90
+ end
91
+
92
+
93
+ # Returns an array of an existing Role's parents
94
+ #
95
+ # The array keys are the identifiers of the parent Roles, and the values are
96
+ # the parent Role instances. The parent Roles are ordered in this array by
97
+ # ascending priority. The highest priority parent Role, last in the array,
98
+ # corresponds with the parent Role most recently added.
99
+ #
100
+ # If the Role does not have any parents, then an empty array is returned.
101
+ #
102
+ # @param Rend::Acl::Role|string role
103
+ # @uses Rend::Acl::Role::Registry::get!
104
+ # @return array
105
+ def parents(role)
106
+ roles[get!(role).id][:parents]
107
+ end
108
+
109
+
110
+ # Returns true if and only if role inherits from inherit
111
+ #
112
+ # Both parameters may be either a Role or a Role identifier. If
113
+ # only_parents is true, then role must inherit directly from
114
+ # inherit in order to return true. By default, this method looks
115
+ # through the entire inheritance DAG to determine whether role
116
+ # inherits from inherit through its ancestor Roles.
117
+ #
118
+ # @param Rend::Acl::Role|string role
119
+ # @param Rend::Acl::Role|string inherit
120
+ # @param boolean only_parents
121
+ # @throws Rend::Acl::Role::Registry::Exception
122
+ # @return boolean
123
+ def inherits?(role, inherit, only_parents = false)
124
+ role_id = get!(role).id
125
+ inherit_id = get!(inherit).id
126
+ inherits = roles[role_id][:parents].has_key?(inherit_id)
127
+
128
+ return inherits if inherits || only_parents
129
+
130
+ roles[role_id][:parents].each do |parent_id, parent|
131
+ return true if inherits?(parent_id, inherit_id)
132
+ end
133
+ false
134
+ end
135
+
136
+
137
+ # Removes the Role from the registry
138
+ #
139
+ # The role parameter can either be a Role or a Role identifier.
140
+ #
141
+ # @param Rend::Acl::Role|string role
142
+ # @throws Rend::Acl::Role::Registry::Exception
143
+ # @return Rend::Acl::Role::Registry Provides a fluent interface
144
+ def remove!(role)
145
+ role_id = get!(role).id
146
+
147
+ roles[role_id][:children].each do |child_id, child|
148
+ roles[child_id][:parents].delete(role_id)
149
+ end
150
+
151
+ roles[role_id][:parents].each do |parent_id, parent|
152
+ roles[parent_id][:children][role_id]
153
+ end
154
+
155
+ roles.delete(role_id)
156
+
157
+ self
158
+ end
159
+
160
+ def remove_all!
161
+ roles.replace({})
162
+ self
163
+ end
164
+
165
+ end
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,19 @@
1
+ require 'rend/acl/role/registry'
2
+ module Rend
3
+ class Acl
4
+ class Role
5
+
6
+ # Unique id of Role
7
+ attr_reader :id # @var string
8
+ # attr_accessor :parents -- future
9
+ # attr_accessor :children -- future
10
+
11
+ def initialize(id)
12
+ @id = id.to_s
13
+ # @parents = {} -- future
14
+ # @children = {} -- future
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ module Rend
2
+ class Acl
3
+ module Version
4
+ STRING = "0.0.1"
5
+ end
6
+ end
7
+ end