Skip to content

Commit 62ca48d

Browse files
committed
Memoize hook names in plugins.
We don't want to call #methods a zillion times. That's bad. Fixes resque#508.
1 parent 0f97f33 commit 62ca48d

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

lib/resque.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,11 @@ def clear_hooks(name)
431431
@hooks && @hooks[name] = []
432432
end
433433

434+
# Retrieve all hooks
435+
def hooks
436+
@hooks || {}
437+
end
438+
434439
# Retrieve all hooks of a given name.
435440
def hooks(name)
436441
(@hooks && @hooks[name]) || []

lib/resque/plugin.rb

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,56 +11,68 @@ def lint(plugin)
1111
hooks = before_hooks(plugin) + around_hooks(plugin) + after_hooks(plugin)
1212

1313
hooks.each do |hook|
14-
if hook =~ /perform$/
14+
if hook.to_s.end_with?("perform")
1515
raise LintError, "#{plugin}.#{hook} is not namespaced"
1616
end
1717
end
1818

1919
failure_hooks(plugin).each do |hook|
20-
if hook =~ /failure$/
20+
if hook.to_s.end_with?("failure")
2121
raise LintError, "#{plugin}.#{hook} is not namespaced"
2222
end
2323
end
2424
end
2525

26+
@job_methods = {}
27+
def job_methods(job)
28+
@job_methods[job] ||= job.methods.collect{|m| m.to_s}
29+
end
30+
31+
# Given an object, and a method prefix, returns a list of methods prefixed
32+
# with that name (hook names).
33+
def get_hook_names(job, hook_method_prefix)
34+
methods = (job.respond_to?(:hooks) && job.hooks.keys) || job_methods(job)
35+
methods.select{|m| m.start_with?(hook_method_prefix)}.sort
36+
end
37+
2638
# Given an object, returns a list `before_perform` hook names.
2739
def before_hooks(job)
28-
job.methods.grep(/^before_perform/).sort
40+
get_hook_names(job, 'before_perform')
2941
end
3042

3143
# Given an object, returns a list `around_perform` hook names.
3244
def around_hooks(job)
33-
job.methods.grep(/^around_perform/).sort
45+
get_hook_names(job, 'around_perform')
3446
end
3547

3648
# Given an object, returns a list `after_perform` hook names.
3749
def after_hooks(job)
38-
job.methods.grep(/^after_perform/).sort
50+
get_hook_names(job, 'after_perform')
3951
end
4052

4153
# Given an object, returns a list `on_failure` hook names.
4254
def failure_hooks(job)
43-
job.methods.grep(/^on_failure/).sort
55+
get_hook_names(job, 'on_failure')
4456
end
4557

4658
# Given an object, returns a list `after_enqueue` hook names.
4759
def after_enqueue_hooks(job)
48-
job.methods.grep(/^after_enqueue/).sort
60+
get_hook_names(job, 'after_enqueue')
4961
end
5062

5163
# Given an object, returns a list `before_enqueue` hook names.
5264
def before_enqueue_hooks(job)
53-
job.methods.grep(/^before_enqueue/).sort
65+
get_hook_names(job, 'before_enqueue')
5466
end
5567

5668
# Given an object, returns a list `after_dequeue` hook names.
5769
def after_dequeue_hooks(job)
58-
job.methods.grep(/^after_dequeue/).sort
70+
get_hook_names(job, 'after_dequeue')
5971
end
6072

6173
# Given an object, returns a list `before_dequeue` hook names.
6274
def before_dequeue_hooks(job)
63-
job.methods.grep(/^before_dequeue/).sort
75+
get_hook_names(job, 'before_dequeue')
6476
end
6577
end
6678
end

0 commit comments

Comments
 (0)