resque-job-stats 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm 1.9.2@resque-job-stats
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'resque', '~> 1.17.0'
4
+
5
+ group :development do
6
+ gem "minitest", ">= 0"
7
+ gem "bundler", "~> 1.0.0"
8
+ gem "jeweler", "~> 1.6.4"
9
+ gem "rcov", ">= 0"
10
+ gem 'mynyml-redgreen', '~> 0.7.1'
11
+ gem 'ruby-debug19', :require => 'ruby-debug'
12
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,56 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ archive-tar-minitar (0.5.2)
5
+ columnize (0.3.4)
6
+ git (1.2.5)
7
+ jeweler (1.6.4)
8
+ bundler (~> 1.0)
9
+ git (>= 1.2.5)
10
+ rake
11
+ json (1.5.3)
12
+ linecache19 (0.5.12)
13
+ ruby_core_source (>= 0.1.4)
14
+ minitest (2.3.1)
15
+ mynyml-redgreen (0.7.1)
16
+ term-ansicolor (>= 1.0.4)
17
+ rack (1.3.0)
18
+ rake (0.9.2)
19
+ rcov (0.9.9)
20
+ redis (2.2.1)
21
+ redis-namespace (1.0.3)
22
+ redis (< 3.0.0)
23
+ resque (1.17.1)
24
+ json (>= 1.4.6, < 1.6)
25
+ redis-namespace (~> 1.0.2)
26
+ sinatra (>= 0.9.2)
27
+ vegas (~> 0.1.2)
28
+ ruby-debug-base19 (0.11.25)
29
+ columnize (>= 0.3.1)
30
+ linecache19 (>= 0.5.11)
31
+ ruby_core_source (>= 0.1.4)
32
+ ruby-debug19 (0.11.6)
33
+ columnize (>= 0.3.1)
34
+ linecache19 (>= 0.5.11)
35
+ ruby-debug-base19 (>= 0.11.19)
36
+ ruby_core_source (0.1.5)
37
+ archive-tar-minitar (>= 0.5.2)
38
+ sinatra (1.2.6)
39
+ rack (~> 1.1)
40
+ tilt (>= 1.2.2, < 2.0)
41
+ term-ansicolor (1.0.5)
42
+ tilt (1.3.2)
43
+ vegas (0.1.8)
44
+ rack (>= 1.0.0)
45
+
46
+ PLATFORMS
47
+ ruby
48
+
49
+ DEPENDENCIES
50
+ bundler (~> 1.0.0)
51
+ jeweler (~> 1.6.4)
52
+ minitest
53
+ mynyml-redgreen (~> 0.7.1)
54
+ rcov
55
+ resque (~> 1.17.0)
56
+ ruby-debug19
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Alan Peabody
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/README.rdoc ADDED
@@ -0,0 +1,70 @@
1
+ = resque-job-stats
2
+
3
+ Job centric stats for Resque.
4
+
5
+ Stats are tracked per Job type (class/module) in addition to the worker based stats Resque provides.
6
+
7
+ Stats tracked are:
8
+
9
+ * Jobs performed
10
+ * Jobs failed
11
+ * Duration of last x jobs completed
12
+ * Average job duration over last x jobs completed
13
+ * Longest job duration over last x jobs completed
14
+
15
+ This information can be used to help track performance and diagnose specific bottlenecks.
16
+
17
+ We are sending this information to Nagios for graphing and alerts (via a custom rake task).
18
+
19
+ == Installation
20
+
21
+ *Requires resque '~> 1.17.0'*
22
+
23
+ In your Gemfile add:
24
+
25
+ gem 'resque-job-stats'
26
+
27
+ == Usage
28
+
29
+ Simply extend your class
30
+
31
+ class MyJob
32
+ extend Resque::Plugins::JobStats
33
+
34
+ def self.perform(*payload)
35
+ # ..
36
+ end
37
+ end
38
+
39
+ And you will have a set of keys starting with 'stats:jobs:my_job' inside your Resque redis namespace.
40
+
41
+ Alternatively you can include just the metric you wish to record.
42
+
43
+ class MyVerbosJob
44
+ extend Resque::Plugins::JobStats::Performed
45
+ extend Resque::Plugins::JobStats::Failed
46
+ extend Resque::Plugins::JobStats::Duration
47
+ extend Resque::Plugins::JobStats::Duration::Maximum
48
+ extend Resque::Plugins::JobStats::Duration::Average
49
+
50
+ record_job_duration_of_last 100
51
+
52
+ def self.perform(*payload)
53
+ # ...
54
+ end
55
+ end
56
+
57
+ == Contributing to resque-job-stats
58
+
59
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
60
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
61
+ * Fork the project
62
+ * Start a feature/bugfix branch
63
+ * Commit and push until you are happy with your contribution
64
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
65
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
66
+
67
+ == Copyright
68
+
69
+ Copyright (c) 2011 Alan Peabody. See LICENSE.txt for further details.
70
+
data/Rakefile ADDED
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "resque-job-stats"
18
+ gem.homepage = "http://github.com/alanpeabody/resque-job-stats"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{Job-centric stats for Resque}
21
+ gem.email = "gapeabody@gmail.com"
22
+ gem.authors = ["alanpeabody"]
23
+ gem.description = %Q{Tracks jobs performed, failed, and the duration of the last 100 jobs for each job type.}
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+
35
+ require 'rcov/rcovtask'
36
+ Rcov::RcovTask.new do |test|
37
+ test.libs << 'test'
38
+ test.pattern = 'test/**/test_*.rb'
39
+ test.verbose = true
40
+ test.rcov_opts << '--exclude "gems/*"'
41
+ end
42
+
43
+ task :default => :test
44
+
45
+ require 'rake/rdoctask'
46
+ Rake::RDocTask.new do |rdoc|
47
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
+
49
+ rdoc.rdoc_dir = 'rdoc'
50
+ rdoc.title = "resque-job-stats #{version}"
51
+ rdoc.rdoc_files.include('README*')
52
+ rdoc.rdoc_files.include('lib/**/*.rb')
53
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1 @@
1
+ require 'resque/plugins/job_stats'
@@ -0,0 +1,14 @@
1
+ require 'resque'
2
+ require 'resque/plugins/job_stats/performed'
3
+ require 'resque/plugins/job_stats/failed'
4
+ require 'resque/plugins/job_stats/duration'
5
+
6
+ module Resque
7
+ module Plugins
8
+ module JobStats
9
+ include Resque::Plugins::JobStats::Performed
10
+ include Resque::Plugins::JobStats::Failed
11
+ include Resque::Plugins::JobStats::Duration
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,40 @@
1
+ module Resque
2
+ module Plugins
3
+ module JobStats
4
+ module Duration
5
+
6
+ # Resets all job durations
7
+ def reset_job_durations
8
+ Resque.redis.del(jobs_duration_key)
9
+ end
10
+
11
+ # Returns the number of jobs failed
12
+ def job_durations
13
+ Resque.redis.lrange(jobs_duration_key,0,job_durations_to_track).map(&:to_f)
14
+ end
15
+
16
+ # Returns the key used for tracking job durations
17
+ def jobs_duration_key
18
+ @jobs_failed_key ||= "stats:jobs:#{self.name}:duration"
19
+ end
20
+
21
+ # Increments the failed count when job is complete
22
+ def around_perform_job_stats_duration(*payload)
23
+ start = Time.now
24
+ yield
25
+ duration = Time.now - start
26
+
27
+ Resque.redis.multi do
28
+ Resque.redis.lpush(jobs_duration_key, duration)
29
+ Resque.redis.ltrim(jobs_duration_key, 0, job_durations_to_track)
30
+ end
31
+ end
32
+
33
+ def job_durations_to_track
34
+ 100
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,32 @@
1
+ module Resque
2
+ module Plugins
3
+ module JobStats
4
+
5
+ # Extend your job with this module to track how many
6
+ # jobs fail
7
+ module Failed
8
+
9
+ # Sets the number of jobs failed
10
+ def jobs_failed=(int)
11
+ Resque.redis.set(jobs_failed_key,int)
12
+ end
13
+
14
+ # Returns the number of jobs failed
15
+ def jobs_failed
16
+ Resque.redis.get(jobs_failed_key).to_i
17
+ end
18
+
19
+ # Returns the key used for tracking jobs failed
20
+ def jobs_failed_key
21
+ @jobs_failed_key ||= "stats:jobs:#{self.name}:failed"
22
+ end
23
+
24
+ # Increments the failed count when job is complete
25
+ def on_failure_job_stats_failed(e,*payload)
26
+ Resque.redis.incr(jobs_failed_key)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ module Resque
2
+ module Plugins
3
+ module JobStats
4
+
5
+ # Extend your job with this module to track how many
6
+ # jobs are performed successfully
7
+ module Performed
8
+
9
+ # Sets the number of jobs performed
10
+ def jobs_performed=(int)
11
+ Resque.redis.set(jobs_performed_key,int)
12
+ end
13
+
14
+ # Returns the number of jobs performed
15
+ def jobs_performed
16
+ Resque.redis.get(jobs_performed_key).to_i
17
+ end
18
+
19
+ # Returns the key used for tracking jobs performed
20
+ def jobs_performed_key
21
+ @jobs_performed_key ||= "stats:jobs:#{self.name}:performed"
22
+ end
23
+
24
+ # Increments the performed count when job is complete
25
+ def after_perform_job_stats_performed(*payload)
26
+ Resque.redis.incr(jobs_performed_key)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,73 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{resque-job-stats}
8
+ s.version = "0.0.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["alanpeabody"]
12
+ s.date = %q{2011-07-09}
13
+ s.description = %q{Tracks jobs performed, failed, and the duration of the last 100 jobs for each job type.}
14
+ s.email = %q{gapeabody@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rvmrc",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "README.rdoc",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "lib/resque-job-stats.rb",
29
+ "lib/resque/plugins/job_stats.rb",
30
+ "lib/resque/plugins/job_stats/duration.rb",
31
+ "lib/resque/plugins/job_stats/failed.rb",
32
+ "lib/resque/plugins/job_stats/performed.rb",
33
+ "resque-job-stats.gemspec",
34
+ "test/helper.rb",
35
+ "test/test_job_stats.rb"
36
+ ]
37
+ s.homepage = %q{http://github.com/alanpeabody/resque-job-stats}
38
+ s.licenses = ["MIT"]
39
+ s.require_paths = ["lib"]
40
+ s.rubygems_version = %q{1.6.2}
41
+ s.summary = %q{Job-centric stats for Resque}
42
+
43
+ if s.respond_to? :specification_version then
44
+ s.specification_version = 3
45
+
46
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
+ s.add_runtime_dependency(%q<resque>, ["~> 1.17.0"])
48
+ s.add_development_dependency(%q<minitest>, [">= 0"])
49
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
50
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
51
+ s.add_development_dependency(%q<rcov>, [">= 0"])
52
+ s.add_development_dependency(%q<mynyml-redgreen>, ["~> 0.7.1"])
53
+ s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
54
+ else
55
+ s.add_dependency(%q<resque>, ["~> 1.17.0"])
56
+ s.add_dependency(%q<minitest>, [">= 0"])
57
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
58
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
59
+ s.add_dependency(%q<rcov>, [">= 0"])
60
+ s.add_dependency(%q<mynyml-redgreen>, ["~> 0.7.1"])
61
+ s.add_dependency(%q<ruby-debug19>, [">= 0"])
62
+ end
63
+ else
64
+ s.add_dependency(%q<resque>, ["~> 1.17.0"])
65
+ s.add_dependency(%q<minitest>, [">= 0"])
66
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
67
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
68
+ s.add_dependency(%q<rcov>, [">= 0"])
69
+ s.add_dependency(%q<mynyml-redgreen>, ["~> 0.7.1"])
70
+ s.add_dependency(%q<ruby-debug19>, [">= 0"])
71
+ end
72
+ end
73
+
data/test/helper.rb ADDED
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'minitest/unit'
11
+ require 'redgreen'
12
+ require 'resque'
13
+
14
+ Resque.redis = 'localhost:6379'
15
+ Resque.redis.namespace = 'resque:job_stats'
16
+
17
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
18
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
19
+ require 'resque-job-stats'
20
+
21
+
22
+
23
+ class MiniTest::Unit::TestCase
24
+ end
25
+
26
+ MiniTest::Unit.autorun
@@ -0,0 +1,71 @@
1
+ require 'helper'
2
+
3
+ class BaseJob
4
+ @queue = :test
5
+
6
+ def self.perform(sleep_time=0.01)
7
+ sleep sleep_time
8
+ end
9
+ end
10
+
11
+ class SimpleJob < BaseJob
12
+ extend Resque::Plugins::JobStats
13
+ @queue = :test
14
+ end
15
+
16
+ class FailJob < BaseJob
17
+ extend Resque::Plugins::JobStats::Failed
18
+ @queue = :test
19
+
20
+ def self.perform(*payload)
21
+ raise 'fail'
22
+ end
23
+ end
24
+
25
+ class TestResqueJobStats < MiniTest::Unit::TestCase
26
+
27
+ def setup
28
+ @worker = Resque::Worker.new(:test)
29
+ end
30
+
31
+ def test_lint
32
+ Resque::Plugin.lint(Resque::Plugins::JobStats)
33
+ assert_equal true, true
34
+ rescue => e
35
+ assert_equal false, e
36
+ end
37
+
38
+ def test_jobs_performed
39
+ assert_equal 'stats:jobs:SimpleJob:performed', SimpleJob.jobs_performed_key
40
+ SimpleJob.jobs_performed = 0
41
+ 3.times do
42
+ Resque.enqueue(SimpleJob)
43
+ @worker.work(0)
44
+ end
45
+ assert_equal 3, SimpleJob.jobs_performed
46
+ end
47
+
48
+ def test_jobs_failed
49
+ assert_equal 'stats:jobs:FailJob:failed', FailJob.jobs_failed_key
50
+ FailJob.jobs_failed = 0
51
+ 3.times do
52
+ Resque.enqueue(FailJob)
53
+ @worker.work(0)
54
+ end
55
+ assert_equal 3, FailJob.jobs_failed
56
+ end
57
+
58
+ def test_duration
59
+ assert_equal 'stats:jobs:SimpleJob:duration', SimpleJob.jobs_duration_key
60
+ SimpleJob.reset_job_durations
61
+ 3.times do |i|
62
+ d = (i + 1)/10.0
63
+ Resque.enqueue(SimpleJob,d)
64
+ @worker.work(0)
65
+ end
66
+ assert_in_delta 0.3, SimpleJob.job_durations[0], 0.01
67
+ assert_in_delta 0.2, SimpleJob.job_durations[1], 0.01
68
+ assert_in_delta 0.1, SimpleJob.job_durations[2], 0.01
69
+ end
70
+
71
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: resque-job-stats
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - alanpeabody
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-07-09 00:00:00.000000000 -04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: resque
17
+ requirement: &11381140 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: 1.17.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *11381140
26
+ - !ruby/object:Gem::Dependency
27
+ name: minitest
28
+ requirement: &11380000 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *11380000
37
+ - !ruby/object:Gem::Dependency
38
+ name: bundler
39
+ requirement: &11378600 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: 1.0.0
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *11378600
48
+ - !ruby/object:Gem::Dependency
49
+ name: jeweler
50
+ requirement: &11377480 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: 1.6.4
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *11377480
59
+ - !ruby/object:Gem::Dependency
60
+ name: rcov
61
+ requirement: &11376400 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *11376400
70
+ - !ruby/object:Gem::Dependency
71
+ name: mynyml-redgreen
72
+ requirement: &11374840 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.7.1
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *11374840
81
+ - !ruby/object:Gem::Dependency
82
+ name: ruby-debug19
83
+ requirement: &11347340 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *11347340
92
+ description: Tracks jobs performed, failed, and the duration of the last 100 jobs
93
+ for each job type.
94
+ email: gapeabody@gmail.com
95
+ executables: []
96
+ extensions: []
97
+ extra_rdoc_files:
98
+ - LICENSE.txt
99
+ - README.rdoc
100
+ files:
101
+ - .document
102
+ - .rvmrc
103
+ - Gemfile
104
+ - Gemfile.lock
105
+ - LICENSE.txt
106
+ - README.rdoc
107
+ - Rakefile
108
+ - VERSION
109
+ - lib/resque-job-stats.rb
110
+ - lib/resque/plugins/job_stats.rb
111
+ - lib/resque/plugins/job_stats/duration.rb
112
+ - lib/resque/plugins/job_stats/failed.rb
113
+ - lib/resque/plugins/job_stats/performed.rb
114
+ - resque-job-stats.gemspec
115
+ - test/helper.rb
116
+ - test/test_job_stats.rb
117
+ has_rdoc: true
118
+ homepage: http://github.com/alanpeabody/resque-job-stats
119
+ licenses:
120
+ - MIT
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ segments:
132
+ - 0
133
+ hash: 3802864521302634812
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ none: false
136
+ requirements:
137
+ - - ! '>='
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 1.6.2
143
+ signing_key:
144
+ specification_version: 3
145
+ summary: Job-centric stats for Resque
146
+ test_files: []