Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Jérome Perrin
gitlab-ce
Commits
e515aa54
Commit
e515aa54
authored
Jul 17, 2017
by
http://jneen.net/
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
cache DeclarativePolicy.class_for at the class level
parent
9c70d98e
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
35 additions
and
5 deletions
+35
-5
lib/declarative_policy.rb
lib/declarative_policy.rb
+35
-5
No files found.
lib/declarative_policy.rb
View file @
e515aa54
...
...
@@ -8,7 +8,12 @@ require_dependency 'declarative_policy/step'
require_dependency
'declarative_policy/base'
require
'thread'
module
DeclarativePolicy
CLASS_CACHE_MUTEX
=
Mutex
.
new
CLASS_CACHE_IVAR
=
:@__DeclarativePolicy_CLASS_CACHE
class
<<
self
def
policy_for
(
user
,
subject
,
opts
=
{})
cache
=
opts
[
:cache
]
||
{}
...
...
@@ -23,7 +28,36 @@ module DeclarativePolicy
subject
=
find_delegate
(
subject
)
subject
.
class
.
ancestors
.
each
do
|
klass
|
class_for_class
(
subject
.
class
)
end
private
# This method is heavily cached because there are a lot of anonymous
# modules in play in a typical rails app, and #name performs quite
# slowly for anonymous classes and modules.
#
# See https://bugs.ruby-lang.org/issues/11119
#
# if the above bug is resolved, this caching could likely be removed.
def
class_for_class
(
subject_class
)
unless
subject_class
.
instance_variable_defined?
(
CLASS_CACHE_IVAR
)
CLASS_CACHE_MUTEX
.
synchronize
do
# re-check in case of a race
break
if
subject_class
.
instance_variable_defined?
(
CLASS_CACHE_IVAR
)
policy_class
=
compute_class_for_class
(
subject_class
)
subject_class
.
instance_variable_set
(
CLASS_CACHE_IVAR
,
policy_class
)
end
end
policy_class
=
subject_class
.
instance_variable_get
(
CLASS_CACHE_IVAR
)
raise
"no policy for
#{
subject
.
class
.
name
}
"
if
policy_class
.
nil?
policy_class
end
def
compute_class_for_class
(
subject_class
)
subject_class
.
ancestors
.
each
do
|
klass
|
next
unless
klass
.
name
begin
...
...
@@ -37,12 +71,8 @@ module DeclarativePolicy
nil
end
end
raise
"no policy for
#{
subject
.
class
.
name
}
"
end
private
def
find_delegate
(
subject
)
seen
=
Set
.
new
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment