resque-history 1.5.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,2 @@
1
+ rvm ruby-1.9.3
2
+ rvm gemset use resque-history --create
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - jruby-18mode # JRuby in 1.8 mode
7
+ - jruby-19mode # JRuby in 1.9 mode
8
+ - rbx-18mode
9
+ - rbx-19mode
data/Changelog.md ADDED
@@ -0,0 +1,26 @@
1
+ Changelog
2
+ =========
3
+
4
+ ### 0.0.4
5
+
6
+ * improvement on job reserve to prevent fork worker when queue is paused
7
+ * bug fix for the gem work with resque-restriction gem, and other which re-implements job reserve method
8
+ * changing the require for load resque-web integration to
9
+
10
+ ```ruby
11
+ require 'resque-pause/server'
12
+ ```
13
+
14
+ ### 0.0.3
15
+
16
+ * bug fix on re-enqueue the job
17
+ * improvement on resque-web integration urls
18
+
19
+ ### 0.0.2
20
+
21
+ * updating documentation
22
+ * generating a good package for rubygems
23
+
24
+ ### 0.0.1
25
+
26
+ * version was removed from rubygems, bad package
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in resque-history.gemspec
4
+ gemspec
5
+
6
+ gem "rake"
7
+ gem "resque"
8
+
9
+ group :test, :development do
10
+ gem "bundler"
11
+ gem "jeweler", "~> 1.6.4"
12
+ gem "rspec-rails"
13
+ gem "timecop"
14
+ end
15
+
data/Gemfile.lock ADDED
@@ -0,0 +1,105 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ resque-history (1.1.0)
5
+ rake
6
+ resque
7
+ resque-history
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ actionpack (3.2.3)
13
+ activemodel (= 3.2.3)
14
+ activesupport (= 3.2.3)
15
+ builder (~> 3.0.0)
16
+ erubis (~> 2.7.0)
17
+ journey (~> 1.0.1)
18
+ rack (~> 1.4.0)
19
+ rack-cache (~> 1.2)
20
+ rack-test (~> 0.6.1)
21
+ sprockets (~> 2.1.2)
22
+ activemodel (3.2.3)
23
+ activesupport (= 3.2.3)
24
+ builder (~> 3.0.0)
25
+ activesupport (3.2.3)
26
+ i18n (~> 0.6)
27
+ multi_json (~> 1.0)
28
+ builder (3.0.0)
29
+ diff-lcs (1.1.3)
30
+ erubis (2.7.0)
31
+ git (1.2.5)
32
+ hike (1.2.1)
33
+ i18n (0.6.0)
34
+ jeweler (1.6.4)
35
+ bundler (~> 1.0)
36
+ git (>= 1.2.5)
37
+ rake
38
+ journey (1.0.3)
39
+ json (1.6.6)
40
+ multi_json (1.2.0)
41
+ rack (1.4.1)
42
+ rack-cache (1.2)
43
+ rack (>= 0.4)
44
+ rack-protection (1.2.0)
45
+ rack
46
+ rack-ssl (1.3.2)
47
+ rack
48
+ rack-test (0.6.1)
49
+ rack (>= 1.0)
50
+ railties (3.2.3)
51
+ actionpack (= 3.2.3)
52
+ activesupport (= 3.2.3)
53
+ rack-ssl (~> 1.3.2)
54
+ rake (>= 0.8.7)
55
+ rdoc (~> 3.4)
56
+ thor (~> 0.14.6)
57
+ rake (0.9.2.2)
58
+ rdoc (3.12)
59
+ json (~> 1.4)
60
+ redis (2.2.2)
61
+ redis-namespace (1.0.3)
62
+ redis (< 3.0.0)
63
+ resque (1.20.0)
64
+ multi_json (~> 1.0)
65
+ redis-namespace (~> 1.0.2)
66
+ sinatra (>= 0.9.2)
67
+ vegas (~> 0.1.2)
68
+ rspec (2.9.0)
69
+ rspec-core (~> 2.9.0)
70
+ rspec-expectations (~> 2.9.0)
71
+ rspec-mocks (~> 2.9.0)
72
+ rspec-core (2.9.0)
73
+ rspec-expectations (2.9.0)
74
+ diff-lcs (~> 1.1.3)
75
+ rspec-mocks (2.9.0)
76
+ rspec-rails (2.9.0)
77
+ actionpack (>= 3.0)
78
+ activesupport (>= 3.0)
79
+ railties (>= 3.0)
80
+ rspec (~> 2.9.0)
81
+ sinatra (1.3.2)
82
+ rack (~> 1.3, >= 1.3.6)
83
+ rack-protection (~> 1.2)
84
+ tilt (~> 1.3, >= 1.3.3)
85
+ sprockets (2.1.2)
86
+ hike (~> 1.2)
87
+ rack (~> 1.0)
88
+ tilt (~> 1.1, != 1.3.0)
89
+ thor (0.14.6)
90
+ tilt (1.3.3)
91
+ timecop (0.3.5)
92
+ vegas (0.1.11)
93
+ rack (>= 1.0.0)
94
+
95
+ PLATFORMS
96
+ ruby
97
+
98
+ DEPENDENCIES
99
+ bundler
100
+ jeweler (~> 1.6.4)
101
+ rake
102
+ resque
103
+ resque-history!
104
+ rspec-rails
105
+ timecop
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) Wandenberg Peixoto (wandenberg@gmail.com)
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/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Ilya Katz
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.md ADDED
@@ -0,0 +1,47 @@
1
+ # Resque Pause [![alt build status][1]][2]
2
+
3
+ [1]: https://secure.travis-ci.org/ilyakatz/resque-history.png?branch=master
4
+ [2]: http://travis-ci.org/#!/ilyakatz/resque-history
5
+
6
+
7
+ A [Resque][rq] plugin. Requires Resque
8
+
9
+ resque-history adds functionality record recently history of job executions
10
+
11
+ Usage / Examples
12
+ ----------------
13
+
14
+ ### Single Job Instance
15
+
16
+ ```ruby
17
+ require 'resque-history'
18
+
19
+ class UpdateNetworkGraph
20
+ extend Resque::Plugins::History
21
+ @queue = :network_graph
22
+
23
+ def self.perform(some_id)
24
+ do_stuff(some_id)
25
+ end
26
+ end
27
+ ```
28
+
29
+ Resque-Web integration
30
+ ----------------------
31
+
32
+ You have to load ResquePause to enable the Pause tab.
33
+
34
+ ```ruby
35
+ require 'resque-pause/server'
36
+ ```
37
+
38
+ Install
39
+ =======
40
+
41
+ $ gem install resque-pause
42
+
43
+ Add to routes.rb file
44
+
45
+ require 'resque-history/server'
46
+
47
+ [rq]: http://github.com/defunkt/resque
data/README.rdoc ADDED
@@ -0,0 +1,19 @@
1
+ = resque-history
2
+
3
+ Description goes here.
4
+
5
+ == Contributing to resque-history
6
+
7
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
+ * Fork the project
10
+ * Start a feature/bugfix branch
11
+ * Commit and push until you are happy with your contribution
12
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
+ * 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.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2012 Ilya Katz. See LICENSE.txt for
18
+ further details.
19
+
data/Rakefile ADDED
@@ -0,0 +1,25 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require "rspec/core/rake_task"
5
+
6
+ desc "Run all examples"
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ task :default => :spec
10
+
11
+
12
+ begin
13
+ require 'jeweler'
14
+ Jeweler::Tasks.new do |gem|
15
+ gem.name = "resque-history"
16
+ gem.summary = %Q{Show history of recently executed jobs}
17
+ gem.description = %Q{Show history of recently executed jobs}
18
+ gem.email = "ilyakatz@gmail.com"
19
+ gem.homepage = "https://github.com/ilyakatz/resque-history"
20
+ gem.authors = ["Katzmopolitan"]
21
+ end
22
+ Jeweler::GemcutterTasks.new
23
+ rescue LoadError
24
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
25
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.5.0
@@ -0,0 +1,2 @@
1
+ require 'resque'
2
+ require File.expand_path(File.join('resque-history', 'plugins', 'history'), File.dirname(__FILE__))
@@ -0,0 +1,26 @@
1
+ module Resque
2
+ module Plugins
3
+ module History
4
+
5
+ MAX_HISTORY_SIZE = 500
6
+ HISTORY_SET_NAME = "resque_history"
7
+
8
+ def maximum_history_size
9
+ @max_hisory ||=MAX_HISTORY_SIZE
10
+ end
11
+
12
+ def after_perform_history(*args)
13
+ Resque.redis.rpush(HISTORY_SET_NAME, {"class"=>"#{self}",
14
+ "args"=>args,
15
+ "time"=>Time.now.strftime("%Y-%m-%d %H:%M")
16
+ }.to_json)
17
+
18
+ if Resque.redis.llen(HISTORY_SET_NAME) > maximum_history_size
19
+ Resque.redis.lpop(HISTORY_SET_NAME)
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,36 @@
1
+ require 'resque'
2
+ require 'resque/server'
3
+
4
+ # Extends Resque Web Based UI.
5
+ # Structure has been borrowed from ResqueScheduler.
6
+ module ResqueHistory
7
+ module Server
8
+ include Resque::Helpers
9
+
10
+ def self.erb_path(filename)
11
+ File.join(File.dirname(__FILE__), 'server', 'views', filename)
12
+ end
13
+
14
+ def self.public_path(filename)
15
+ File.join(File.dirname(__FILE__), 'server', 'public', filename)
16
+ end
17
+
18
+ def self.included(base)
19
+
20
+ base.class_eval do
21
+
22
+ get '/history' do
23
+ erb File.read(ResqueHistory::Server.erb_path('history.erb'))
24
+ end
25
+
26
+ end
27
+ end
28
+
29
+ Resque::Server.tabs << 'History'
30
+ end
31
+ end
32
+
33
+ Resque.extend ResqueHistory
34
+ Resque::Server.class_eval do
35
+ include ResqueHistory::Server
36
+ end
@@ -0,0 +1,17 @@
1
+ <h1 class='wi'>Job history</h1>
2
+ <p class='intro'>Below is a list of recently executed jobs</p>
3
+ <table class='queues1'>
4
+ <tr>
5
+ <th>Job</th>
6
+ <th>Arguments</th>
7
+ <th>Time</th>
8
+ </tr>
9
+ <% Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1).each do |history| %>
10
+ <% j = JSON.parse(history) %>
11
+ <tr>
12
+ <td class='queue'><%= j["class"] %></td>
13
+ <td class='args'><%= j["args"] %></td>
14
+ <td class='args'><%= j["time"] %></td>
15
+ </tr>
16
+ <% end %>
17
+ </table>
data/lib/version.rb ADDED
@@ -0,0 +1,7 @@
1
+ module Resque
2
+ module Plugins
3
+ module History
4
+ VERSION = "0.0.1"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,148 @@
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 = "resque-history"
8
+ s.version = "1.5.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Katzmopolitan"]
12
+ s.date = "2012-03-31"
13
+ s.description = "Show history of recently executed jobs"
14
+ s.email = "ilyakatz@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "LICENSE.txt",
18
+ "README.md",
19
+ "README.rdoc"
20
+ ]
21
+ s.files = [
22
+ ".document",
23
+ ".rvmrc",
24
+ ".travis.yml",
25
+ "Changelog.md",
26
+ "Gemfile",
27
+ "Gemfile.lock",
28
+ "LICENSE",
29
+ "LICENSE.txt",
30
+ "README.md",
31
+ "README.rdoc",
32
+ "Rakefile",
33
+ "VERSION",
34
+ "lib/resque-history.rb",
35
+ "lib/resque-history/plugins/history.rb",
36
+ "lib/resque-history/server.rb",
37
+ "lib/resque-history/server/views/history.erb",
38
+ "lib/version.rb",
39
+ "resque-history.gemspec",
40
+ "spec/redis-test.conf",
41
+ "spec/resque-history/plugins/history_spec.rb",
42
+ "spec/resque-web_spec.rb",
43
+ "spec/spec_helper.rb",
44
+ "test/helper.rb",
45
+ "test/test_resque-history.rb"
46
+ ]
47
+ s.homepage = "https://github.com/ilyakatz/resque-history"
48
+ s.require_paths = ["lib"]
49
+ s.rubygems_version = "1.8.15"
50
+ s.summary = "Show history of recently executed jobs"
51
+
52
+ if s.respond_to? :specification_version then
53
+ s.specification_version = 3
54
+
55
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
56
+ s.add_runtime_dependency(%q<resque-history>, [">= 0"])
57
+ s.add_runtime_dependency(%q<rake>, [">= 0"])
58
+ s.add_runtime_dependency(%q<resque>, [">= 0"])
59
+ s.add_development_dependency(%q<bundler>, [">= 0"])
60
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
61
+ s.add_development_dependency(%q<rspec-rails>, [">= 0"])
62
+ s.add_development_dependency(%q<bundler>, [">= 0"])
63
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
64
+ s.add_development_dependency(%q<rspec-rails>, [">= 0"])
65
+ s.add_development_dependency(%q<bundler>, [">= 0"])
66
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
67
+ s.add_development_dependency(%q<rspec-rails>, [">= 0"])
68
+ s.add_development_dependency(%q<timecop>, [">= 0"])
69
+ s.add_development_dependency(%q<bundler>, [">= 0"])
70
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
71
+ s.add_development_dependency(%q<rspec-rails>, [">= 0"])
72
+ s.add_development_dependency(%q<timecop>, [">= 0"])
73
+ s.add_development_dependency(%q<bundler>, [">= 0"])
74
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
75
+ s.add_development_dependency(%q<rspec-rails>, [">= 0"])
76
+ s.add_development_dependency(%q<timecop>, [">= 0"])
77
+ s.add_development_dependency(%q<bundler>, [">= 0"])
78
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
79
+ s.add_development_dependency(%q<rspec-rails>, [">= 0"])
80
+ s.add_development_dependency(%q<timecop>, [">= 0"])
81
+ s.add_development_dependency(%q<bundler>, [">= 0"])
82
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
83
+ s.add_development_dependency(%q<rspec-rails>, [">= 0"])
84
+ s.add_development_dependency(%q<timecop>, [">= 0"])
85
+ else
86
+ s.add_dependency(%q<resque-history>, [">= 0"])
87
+ s.add_dependency(%q<rake>, [">= 0"])
88
+ s.add_dependency(%q<resque>, [">= 0"])
89
+ s.add_dependency(%q<bundler>, [">= 0"])
90
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
91
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
92
+ s.add_dependency(%q<bundler>, [">= 0"])
93
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
94
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
95
+ s.add_dependency(%q<bundler>, [">= 0"])
96
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
97
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
98
+ s.add_dependency(%q<timecop>, [">= 0"])
99
+ s.add_dependency(%q<bundler>, [">= 0"])
100
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
101
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
102
+ s.add_dependency(%q<timecop>, [">= 0"])
103
+ s.add_dependency(%q<bundler>, [">= 0"])
104
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
105
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
106
+ s.add_dependency(%q<timecop>, [">= 0"])
107
+ s.add_dependency(%q<bundler>, [">= 0"])
108
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
109
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
110
+ s.add_dependency(%q<timecop>, [">= 0"])
111
+ s.add_dependency(%q<bundler>, [">= 0"])
112
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
113
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
114
+ s.add_dependency(%q<timecop>, [">= 0"])
115
+ end
116
+ else
117
+ s.add_dependency(%q<resque-history>, [">= 0"])
118
+ s.add_dependency(%q<rake>, [">= 0"])
119
+ s.add_dependency(%q<resque>, [">= 0"])
120
+ s.add_dependency(%q<bundler>, [">= 0"])
121
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
122
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
123
+ s.add_dependency(%q<bundler>, [">= 0"])
124
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
125
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
126
+ s.add_dependency(%q<bundler>, [">= 0"])
127
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
128
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
129
+ s.add_dependency(%q<timecop>, [">= 0"])
130
+ s.add_dependency(%q<bundler>, [">= 0"])
131
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
132
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
133
+ s.add_dependency(%q<timecop>, [">= 0"])
134
+ s.add_dependency(%q<bundler>, [">= 0"])
135
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
136
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
137
+ s.add_dependency(%q<timecop>, [">= 0"])
138
+ s.add_dependency(%q<bundler>, [">= 0"])
139
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
140
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
141
+ s.add_dependency(%q<timecop>, [">= 0"])
142
+ s.add_dependency(%q<bundler>, [">= 0"])
143
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
144
+ s.add_dependency(%q<rspec-rails>, [">= 0"])
145
+ s.add_dependency(%q<timecop>, [">= 0"])
146
+ end
147
+ end
148
+
@@ -0,0 +1,115 @@
1
+ # Redis configuration file example
2
+
3
+ # By default Redis does not run as a daemon. Use 'yes' if you need it.
4
+ # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
5
+ daemonize yes
6
+
7
+ # When run as a daemon, Redis write a pid file in /var/run/redis.pid by default.
8
+ # You can specify a custom pid file location here.
9
+ pidfile ./spec/redis-test.pid
10
+
11
+ # Accept connections on the specified port, default is 6379
12
+ port 9736
13
+
14
+ # If you want you can bind a single interface, if the bind option is not
15
+ # specified all the interfaces will listen for connections.
16
+ #
17
+ # bind 127.0.0.1
18
+
19
+ # Close the connection after a client is idle for N seconds (0 to disable)
20
+ timeout 300
21
+
22
+ # Save the DB on disk:
23
+ #
24
+ # save <seconds> <changes>
25
+ #
26
+ # Will save the DB if both the given number of seconds and the given
27
+ # number of write operations against the DB occurred.
28
+ #
29
+ # In the example below the behaviour will be to save:
30
+ # after 900 sec (15 min) if at least 1 key changed
31
+ # after 300 sec (5 min) if at least 10 keys changed
32
+ # after 60 sec if at least 10000 keys changed
33
+ save 900 1
34
+ save 300 10
35
+ save 60 10000
36
+
37
+ # The filename where to dump the DB
38
+ dbfilename dump.rdb
39
+
40
+ # For default save/load DB in/from the working directory
41
+ # Note that you must specify a directory not a file name.
42
+ dir ./spec/
43
+
44
+ # Set server verbosity to 'debug'
45
+ # it can be one of:
46
+ # debug (a lot of information, useful for development/testing)
47
+ # notice (moderately verbose, what you want in production probably)
48
+ # warning (only very important / critical messages are logged)
49
+ loglevel debug
50
+
51
+ # Specify the log file name. Also 'stdout' can be used to force
52
+ # the demon to log on the standard output. Note that if you use standard
53
+ # output for logging but daemonize, logs will be sent to /dev/null
54
+ logfile stdout
55
+
56
+ # Set the number of databases. The default database is DB 0, you can select
57
+ # a different one on a per-connection basis using SELECT <dbid> where
58
+ # dbid is a number between 0 and 'databases'-1
59
+ databases 16
60
+
61
+ ################################# REPLICATION #################################
62
+
63
+ # Master-Slave replication. Use slaveof to make a Redis instance a copy of
64
+ # another Redis server. Note that the configuration is local to the slave
65
+ # so for example it is possible to configure the slave to save the DB with a
66
+ # different interval, or to listen to another port, and so on.
67
+
68
+ # slaveof <masterip> <masterport>
69
+
70
+ ################################## SECURITY ###################################
71
+
72
+ # Require clients to issue AUTH <PASSWORD> before processing any other
73
+ # commands. This might be useful in environments in which you do not trust
74
+ # others with access to the host running redis-server.
75
+ #
76
+ # This should stay commented out for backward compatibility and because most
77
+ # people do not need auth (e.g. they run their own servers).
78
+
79
+ # requirepass foobared
80
+
81
+ ################################### LIMITS ####################################
82
+
83
+ # Set the max number of connected clients at the same time. By default there
84
+ # is no limit, and it's up to the number of file descriptors the Redis process
85
+ # is able to open. The special value '0' means no limts.
86
+ # Once the limit is reached Redis will close all the new connections sending
87
+ # an error 'max number of clients reached'.
88
+
89
+ # maxclients 128
90
+
91
+ # Don't use more memory than the specified amount of bytes.
92
+ # When the memory limit is reached Redis will try to remove keys with an
93
+ # EXPIRE set. It will try to start freeing keys that are going to expire
94
+ # in little time and preserve keys with a longer time to live.
95
+ # Redis will also try to remove objects from free lists if possible.
96
+ #
97
+ # If all this fails, Redis will start to reply with errors to commands
98
+ # that will use more memory, like SET, LPUSH, and so on, and will continue
99
+ # to reply to most read-only commands like GET.
100
+ #
101
+ # WARNING: maxmemory can be a good idea mainly if you want to use Redis as a
102
+ # 'state' server or cache, not as a real DB. When Redis is used as a real
103
+ # database the memory usage will grow over the weeks, it will be obvious if
104
+ # it is going to use too much memory in the long run, and you'll have the time
105
+ # to upgrade. With maxmemory after the limit is reached you'll start to get
106
+ # errors for write operations, and this may even lead to DB inconsistency.
107
+
108
+ # maxmemory <bytes>
109
+
110
+ ############################### ADVANCED CONFIG ###############################
111
+
112
+ # Glue small output buffers together in order to send small replies in a
113
+ # single TCP packet. Uses a bit more CPU but most of the times it is a win
114
+ # in terms of number of queries per second. Use 'yes' if unsure.
115
+ glueoutputbuf yes
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+ require 'timecop'
3
+
4
+ class HistoryJob
5
+ extend Resque::Plugins::History
6
+ @queue = :test
7
+
8
+ def self.perform(*args)
9
+ end
10
+ end
11
+
12
+ describe Resque::Plugins::History do
13
+ it "should be compliance with Resqu::Plugin document" do
14
+ expect { Resque::Plugin.lint(Resque::Plugins::History) }.to_not raise_error
15
+ end
16
+
17
+ it "should store history of the job" do
18
+ Timecop.freeze(Time.local(2000, 9, 1, 12, 0, 0)) do
19
+ Resque.enqueue(HistoryJob, 12)
20
+
21
+ job = Resque.reserve('test')
22
+ job.perform
23
+
24
+ arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1)
25
+
26
+ arr.count.should == 1
27
+ JSON.parse(arr.first).should == {"class"=>"HistoryJob", "args"=>[12], "time"=>"2000-09-01 12:00"}
28
+ end
29
+ end
30
+
31
+ it "should set the default size of the history list to be 500" do
32
+ HistoryJob.maximum_history_size.should == 500
33
+ end
34
+
35
+ it "should truncate the maximum" do
36
+
37
+ HistoryJob.stub(:maximum_history_size).and_return { 3 }
38
+
39
+ Resque.enqueue(HistoryJob, 15)
40
+ Resque.enqueue(HistoryJob, 13)
41
+ Resque.enqueue(HistoryJob, 12)
42
+ Resque.enqueue(HistoryJob, 11)
43
+
44
+ Timecop.freeze(Time.local(2000, 9, 1, 12, 0, 0)) do
45
+ job = Resque.reserve('test')
46
+ job.perform
47
+ job = Resque.reserve('test')
48
+ job.perform
49
+ job = Resque.reserve('test')
50
+ job.perform
51
+ job = Resque.reserve('test')
52
+ job.perform
53
+
54
+ arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1)
55
+
56
+ arr.count.should == 3
57
+ arr.should == [
58
+ {"class"=>"HistoryJob", "args"=>[13], "time"=>"2000-09-01 12:00"},
59
+ {"class"=>"HistoryJob", "args"=>[12], "time"=>"2000-09-01 12:00"},
60
+ {"class"=>"HistoryJob", "args"=>[11], "time"=>"2000-09-01 12:00"}
61
+ ].collect(&:to_json)
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe ResqueHistory::Server do
4
+ include Rack::Test::Methods
5
+ def app
6
+ @app ||= Resque::Server.new
7
+ end
8
+
9
+ let :queues do
10
+ Resque.redis.sadd(:queues, "queue1")
11
+ Resque.redis.sadd(:queues, "queue2")
12
+ Resque.redis.sadd(:queues, "queue3")
13
+ end
14
+
15
+ before do
16
+ queues
17
+ end
18
+
19
+ it "should respond to /history" do
20
+ get '/history'
21
+ last_response.should be_ok
22
+ end
23
+
24
+ end
@@ -0,0 +1,65 @@
1
+ require 'rack/test'
2
+
3
+ if !system("which redis-server")
4
+ puts '', "** can't find `redis-server` in your path"
5
+ abort ''
6
+ end
7
+
8
+ #begin
9
+ # require 'simplecov'
10
+ # SimpleCov.start do
11
+ # add_filter '/spec/'
12
+ # end
13
+ # SimpleCov.coverage_dir 'coverage'
14
+ #rescue LoadError
15
+ # ignore simplecov in ruby < 1.9
16
+ #end
17
+
18
+ #begin
19
+ # require 'bundler'
20
+ # Bundler.setup
21
+ # Bundler.require(:default, :development)
22
+ #rescue LoadError
23
+ # puts 'Bundler is not installed, you need to gem install it in order to run the specs.'
24
+ # exit 1
25
+ #end
26
+
27
+ # Requires supporting files with custom matchers and macros, etc,
28
+ # in ./support/ and its subdirectories.
29
+ Dir[File.expand_path('support/**/*.rb', File.dirname(__FILE__))].each { |f| require f }
30
+
31
+ # Requires lib.
32
+ Dir[File.expand_path('../lib/**/*.rb', File.dirname(__FILE__))].each { |f| require f }
33
+
34
+ RSpec.configure do |config|
35
+ # == Mock Framework
36
+ #
37
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
38
+ #
39
+ # config.mock_with :mocha
40
+ # config.mock_with :flexmock
41
+ # config.mock_with :rr
42
+ config.mock_with :rspec
43
+
44
+ config.before(:suite) do
45
+ puts "Starting redis for testing at localhost:9736..."
46
+ `redis-server #{File.dirname(File.expand_path(__FILE__))}/redis-test.conf`
47
+ pid = ''
48
+ while pid.empty? do
49
+ pid = `ps -e -o pid,command | grep [r]edis-test`.split(" ")[0]
50
+ end
51
+ Resque.redis = '127.0.0.1:9736'
52
+ end
53
+
54
+ config.before(:each) do
55
+ Resque.redis.flushall
56
+ Kernel.stub!(:sleep)
57
+ end
58
+
59
+ config.after(:suite) do
60
+ pid = `ps -e -o pid,command | grep [r]edis-test`.split(" ")[0]
61
+ puts '', "Killing test redis server..."
62
+ Process.kill("KILL", pid.to_i)
63
+ `rm -f #{File.dirname(File.expand_path(__FILE__))}/dump.rdb`
64
+ end
65
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
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 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'resque-history'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestResqueHistory < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,391 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: resque-history
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.5.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Katzmopolitan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-31 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: resque-history
16
+ requirement: &2154223820 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2154223820
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &2154223340 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2154223340
36
+ - !ruby/object:Gem::Dependency
37
+ name: resque
38
+ requirement: &2154222720 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2154222720
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: &2154222100 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2154222100
58
+ - !ruby/object:Gem::Dependency
59
+ name: jeweler
60
+ requirement: &2154221620 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 1.6.4
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2154221620
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-rails
71
+ requirement: &2154221140 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *2154221140
80
+ - !ruby/object:Gem::Dependency
81
+ name: bundler
82
+ requirement: &2154236880 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *2154236880
91
+ - !ruby/object:Gem::Dependency
92
+ name: jeweler
93
+ requirement: &2154236280 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: 1.6.4
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *2154236280
102
+ - !ruby/object:Gem::Dependency
103
+ name: rspec-rails
104
+ requirement: &2154235800 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *2154235800
113
+ - !ruby/object:Gem::Dependency
114
+ name: bundler
115
+ requirement: &2154235320 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *2154235320
124
+ - !ruby/object:Gem::Dependency
125
+ name: jeweler
126
+ requirement: &2154234660 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: 1.6.4
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: *2154234660
135
+ - !ruby/object:Gem::Dependency
136
+ name: rspec-rails
137
+ requirement: &2154234180 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: *2154234180
146
+ - !ruby/object:Gem::Dependency
147
+ name: timecop
148
+ requirement: &2154233700 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :development
155
+ prerelease: false
156
+ version_requirements: *2154233700
157
+ - !ruby/object:Gem::Dependency
158
+ name: bundler
159
+ requirement: &2154233180 !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: *2154233180
168
+ - !ruby/object:Gem::Dependency
169
+ name: jeweler
170
+ requirement: &2154232560 !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ~>
174
+ - !ruby/object:Gem::Version
175
+ version: 1.6.4
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: *2154232560
179
+ - !ruby/object:Gem::Dependency
180
+ name: rspec-rails
181
+ requirement: &2154232080 !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: *2154232080
190
+ - !ruby/object:Gem::Dependency
191
+ name: timecop
192
+ requirement: &2154231600 !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: *2154231600
201
+ - !ruby/object:Gem::Dependency
202
+ name: bundler
203
+ requirement: &2154231100 !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ type: :development
210
+ prerelease: false
211
+ version_requirements: *2154231100
212
+ - !ruby/object:Gem::Dependency
213
+ name: jeweler
214
+ requirement: &2154230460 !ruby/object:Gem::Requirement
215
+ none: false
216
+ requirements:
217
+ - - ~>
218
+ - !ruby/object:Gem::Version
219
+ version: 1.6.4
220
+ type: :development
221
+ prerelease: false
222
+ version_requirements: *2154230460
223
+ - !ruby/object:Gem::Dependency
224
+ name: rspec-rails
225
+ requirement: &2154229980 !ruby/object:Gem::Requirement
226
+ none: false
227
+ requirements:
228
+ - - ! '>='
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: *2154229980
234
+ - !ruby/object:Gem::Dependency
235
+ name: timecop
236
+ requirement: &2154229500 !ruby/object:Gem::Requirement
237
+ none: false
238
+ requirements:
239
+ - - ! '>='
240
+ - !ruby/object:Gem::Version
241
+ version: '0'
242
+ type: :development
243
+ prerelease: false
244
+ version_requirements: *2154229500
245
+ - !ruby/object:Gem::Dependency
246
+ name: bundler
247
+ requirement: &2154229020 !ruby/object:Gem::Requirement
248
+ none: false
249
+ requirements:
250
+ - - ! '>='
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ type: :development
254
+ prerelease: false
255
+ version_requirements: *2154229020
256
+ - !ruby/object:Gem::Dependency
257
+ name: jeweler
258
+ requirement: &2154244840 !ruby/object:Gem::Requirement
259
+ none: false
260
+ requirements:
261
+ - - ~>
262
+ - !ruby/object:Gem::Version
263
+ version: 1.6.4
264
+ type: :development
265
+ prerelease: false
266
+ version_requirements: *2154244840
267
+ - !ruby/object:Gem::Dependency
268
+ name: rspec-rails
269
+ requirement: &2154244360 !ruby/object:Gem::Requirement
270
+ none: false
271
+ requirements:
272
+ - - ! '>='
273
+ - !ruby/object:Gem::Version
274
+ version: '0'
275
+ type: :development
276
+ prerelease: false
277
+ version_requirements: *2154244360
278
+ - !ruby/object:Gem::Dependency
279
+ name: timecop
280
+ requirement: &2154243880 !ruby/object:Gem::Requirement
281
+ none: false
282
+ requirements:
283
+ - - ! '>='
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: *2154243880
289
+ - !ruby/object:Gem::Dependency
290
+ name: bundler
291
+ requirement: &2154243220 !ruby/object:Gem::Requirement
292
+ none: false
293
+ requirements:
294
+ - - ! '>='
295
+ - !ruby/object:Gem::Version
296
+ version: '0'
297
+ type: :development
298
+ prerelease: false
299
+ version_requirements: *2154243220
300
+ - !ruby/object:Gem::Dependency
301
+ name: jeweler
302
+ requirement: &2154242740 !ruby/object:Gem::Requirement
303
+ none: false
304
+ requirements:
305
+ - - ~>
306
+ - !ruby/object:Gem::Version
307
+ version: 1.6.4
308
+ type: :development
309
+ prerelease: false
310
+ version_requirements: *2154242740
311
+ - !ruby/object:Gem::Dependency
312
+ name: rspec-rails
313
+ requirement: &2154242260 !ruby/object:Gem::Requirement
314
+ none: false
315
+ requirements:
316
+ - - ! '>='
317
+ - !ruby/object:Gem::Version
318
+ version: '0'
319
+ type: :development
320
+ prerelease: false
321
+ version_requirements: *2154242260
322
+ - !ruby/object:Gem::Dependency
323
+ name: timecop
324
+ requirement: &2154241780 !ruby/object:Gem::Requirement
325
+ none: false
326
+ requirements:
327
+ - - ! '>='
328
+ - !ruby/object:Gem::Version
329
+ version: '0'
330
+ type: :development
331
+ prerelease: false
332
+ version_requirements: *2154241780
333
+ description: Show history of recently executed jobs
334
+ email: ilyakatz@gmail.com
335
+ executables: []
336
+ extensions: []
337
+ extra_rdoc_files:
338
+ - LICENSE
339
+ - LICENSE.txt
340
+ - README.md
341
+ - README.rdoc
342
+ files:
343
+ - .document
344
+ - .rvmrc
345
+ - .travis.yml
346
+ - Changelog.md
347
+ - Gemfile
348
+ - Gemfile.lock
349
+ - LICENSE
350
+ - LICENSE.txt
351
+ - README.md
352
+ - README.rdoc
353
+ - Rakefile
354
+ - VERSION
355
+ - lib/resque-history.rb
356
+ - lib/resque-history/plugins/history.rb
357
+ - lib/resque-history/server.rb
358
+ - lib/resque-history/server/views/history.erb
359
+ - lib/version.rb
360
+ - resque-history.gemspec
361
+ - spec/redis-test.conf
362
+ - spec/resque-history/plugins/history_spec.rb
363
+ - spec/resque-web_spec.rb
364
+ - spec/spec_helper.rb
365
+ - test/helper.rb
366
+ - test/test_resque-history.rb
367
+ homepage: https://github.com/ilyakatz/resque-history
368
+ licenses: []
369
+ post_install_message:
370
+ rdoc_options: []
371
+ require_paths:
372
+ - lib
373
+ required_ruby_version: !ruby/object:Gem::Requirement
374
+ none: false
375
+ requirements:
376
+ - - ! '>='
377
+ - !ruby/object:Gem::Version
378
+ version: '0'
379
+ required_rubygems_version: !ruby/object:Gem::Requirement
380
+ none: false
381
+ requirements:
382
+ - - ! '>='
383
+ - !ruby/object:Gem::Version
384
+ version: '0'
385
+ requirements: []
386
+ rubyforge_project:
387
+ rubygems_version: 1.8.15
388
+ signing_key:
389
+ specification_version: 3
390
+ summary: Show history of recently executed jobs
391
+ test_files: []