http_resque 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.markdown CHANGED
@@ -1,3 +1,82 @@
1
- HTTP Resque
1
+ http_resque
2
2
  ===========
3
- Docs forthcoming.
3
+ http_resque helps you cleanly write integration tests for your Resque jobs. It's a thin HTTP API around the
4
+ Resque daemon. With it you can manipulate the contents of the Resque queues using HTTP requests.
5
+
6
+ This is a key ingredient for writing off-box integration tests for your background jobs. In addition to inspecting and clearing queues, you can run a Resque job _synchronously_. This allows you to test that your
7
+ background jobs are working by making HTTP requests, which is the same simple way you'd test a running webapp or a RESTful API server.
8
+
9
+ Making your background jobs easier to integration test is important -- background jobs are prone to failure
10
+ because they run in the background, and frequently have environment-related bugs in production. Unit tests
11
+ usually aren't good enough.
12
+
13
+ Installation & Usage
14
+ --------------------
15
+
16
+ gem install http_resque
17
+
18
+ QUEUE=* http_resque
19
+
20
+ or if you use Bundler:
21
+ QUEUE=* bundle exec http_resque
22
+
23
+ Optional command line arguments:
24
+
25
+ $ http_resque -h
26
+ -p: the port to listen on. Defaults to the $PORT environment variable, or 4568.
27
+ --rakefile: the location of your Rakefile. The default is "./Rakefile".
28
+
29
+ When run, http_resque starts a small web server and then invokes `rake resque:work` in a fork.
30
+
31
+ REST APIs for Resque
32
+ --------------------
33
+
34
+ Once the http_resque server is started, you can access these URLs to manipulate your background jobs:
35
+
36
+ ### GET /queues/:queue_name/jobs
37
+
38
+ Lists all jobs in the queue named "queue_name", oldest first.
39
+
40
+ $ curl localhost:4568/queues/my_test_queue/jobs
41
+
42
+ Response:
43
+ [
44
+ { "class" => "EmailComment", "args" => ["jack_sparrow@pirates.net"] },
45
+ ...
46
+ ]
47
+
48
+ ### DELETE /queues/:queue_name/jobs
49
+
50
+ Deletes all jobs in the given queue.
51
+
52
+ $ curl -X DELETE localhost:4568/queues/my_test_queue/jobs
53
+
54
+ ### POST /queues/:queue_name/jobs
55
+
56
+ Create a new background job. The body of the request should be in JSON and include "class" and "arguments".
57
+
58
+ $ curl -X POST localhost:4568/queues/my_test_queue/jobs \
59
+ -d '{ "class": "EmailComment", "arguments":["jack_sparrow@pirates.net"] }'
60
+
61
+ ### GET /queues/:queue_name/result_of_oldest_job
62
+
63
+ Runs the oldest job on the given queue, and does not return until it's finished. If there was a problem
64
+ running the job (like the job threw a Ruby exception), this will return a 500 status code with the exception
65
+ details.
66
+
67
+ $ curl localhost:4568/queues/my_test_queue/result_of_oldest_job
68
+
69
+ A response with a status of:
70
+ 200 if successful.
71
+ 404 if there are no jobs in this queue.
72
+ 500 if there was an error running the job.
73
+
74
+ For further details, look at the web server's code in [bin/http_resque](https://github.com/philc/http_resque/blob/master/bin/http_resque). The code is shorter than this README.
75
+
76
+ Contribute
77
+ ----------
78
+ http_resque is pretty small and limited as is. If you need more CLI options or a different set of REST APIs, file an issue or send a pull request.
79
+
80
+ Related
81
+ -------
82
+ [remote_http_testing](https://github.com/ooyala/remote_http_testing) - a small library for making remote HTTP requests and response assertions in tests.
data/bin/http_resque CHANGED
@@ -1,40 +1,54 @@
1
1
  #!/usr/bin/env ruby
2
-
2
+ #
3
3
  # This wraps the Resque process with a thin HTTP API which enables you to manipulate jobs using HTTP requests
4
- # and run jobs synchronously, off-box, for the purposes of integration testing background jobs. This is
5
- # necessary because background jobs fail notoriously often in production and so they need integration -- not
6
- # unit -- tests. This helps you to cleanly write those integration tests.
4
+ # and run jobs synchronously, for the purposes of integration testing background jobs. See the README for
5
+ # more details of why this is awesome.
7
6
  #
8
7
  # Usage:
9
- # QUEUE=* http_resque -p 8080
10
- # The server uses port 4567 by default. Use -p to specify an alternate port.
11
- # You'll note that the QUEUE environment variable is used just like it is when running `rake resque:work`.
12
-
8
+ # QUEUE=* http_resque
9
+ # Options:
10
+ # -p: the port to listen on. Defaults to the $PORT environment variable, or 4568.
11
+ # --rakefile: the location of your Rakefile. The default is "./Rakefile".
12
+ #
13
13
  # Once it's started, you can access these URLs to manipulate jobs:
14
- # GET /queues/:queue/jobs
15
- # DELETE /queues/:queue/jobs
16
- # POST /queues/:queue/jobs
17
- # GET /queues/:queue/result_of_oldest_job
14
+ # GET /queues/:queue_name/jobs
15
+ # DELETE /queues/:queue_name/jobs
16
+ # POST /queues/:queue_name/jobs
17
+ # GET /queues/:queue_name/result_of_oldest_job
18
18
 
19
19
  require "sinatra/base"
20
20
  require "thin"
21
21
  require "resque"
22
22
  require "rake"
23
23
  require "json"
24
+ require "trollop"
24
25
 
25
- # Load the Rakefile which should in turn require all of their Resque job classes.
26
- # TODO(philc): The path to this Rakefile should be an argument.
27
- load "./Rakefile"
26
+ class HttpResqueServer < Sinatra::Base
27
+ cli_options = Trollop::options do
28
+ opt :rakefile, "The location of your Rakefile which loads your Resque workers.", :default => "./Rakefile"
29
+ opt :port, "The port this server should listen on."
30
+ end
28
31
 
29
- class HttpResque < Sinatra::Base
30
- settings.server = "thin"
32
+ unless ENV["QUEUE"]
33
+ puts "You must set the QUEUE env var, just as you would when running `QUEUE=* rake resque:work`."
34
+ exit 1
35
+ end
31
36
 
32
37
  STDOUT.sync = STDERR.sync = true
33
38
 
39
+ begin
40
+ # Load their Rakefile, which should in turn require all of their Resque job classes.
41
+ load cli_options[:rakefile]
42
+ rescue LoadError
43
+ puts "Error loading Rakefile: #{cli_options[:rakefile]}. Give the path to your Rakefile using --rakefile."
44
+ exit 1
45
+ end
46
+
34
47
  # Run rake resque:work in a background process. It will exit when this process exits.
35
48
  fork { Rake::Task["resque:work"].invoke }
36
49
 
37
- settings.port = ARGV.include?("-p") ? ARGV[ARGV.index("-p") + 1] : ENV["PORT"]
50
+ settings.port = cli_options[:port] || ENV["PORT"] || 4568
51
+ settings.server = "thin"
38
52
 
39
53
  get "/" do
40
54
  "http_resque is here."
@@ -56,9 +70,8 @@ class HttpResque < Sinatra::Base
56
70
  # - arguments: optional; an array of arguments for the Resque job.
57
71
  post "/queues/:queue/jobs" do
58
72
  halt(400, "Provide a valid JSON body.") unless json_body
59
- klass = json_body["class"]
60
- halt(400, "Specify a class.") unless klass
61
- klass = Object.const_get(klass)
73
+ halt(400, "Specify a class.") unless json_body["class"]
74
+ klass = Object.const_get(json_body["class"])
62
75
  Resque.enqueue_to(params[:queue], klass, *json_body["arguments"])
63
76
  nil
64
77
  end
@@ -79,5 +92,5 @@ class HttpResque < Sinatra::Base
79
92
 
80
93
  def json_body() @json_body ||= JSON.parse(request.body.read) rescue nil end
81
94
 
82
- run! if app_file == $0
95
+ run! if File.basename(app_file) == File.basename($0)
83
96
  end
data/http_resque.gemspec CHANGED
@@ -8,7 +8,10 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["Phil Crosby"]
9
9
  s.email = ["phil.crosby@gmail.com"]
10
10
  s.homepage = "http://github.com/philc/http_resque"
11
- s.summary = "A small HTTP wrapper around Resque, so you can schedule and test jobs over HTTP."
11
+ s.summary = "Schedule and test Resque jobs using HTTP requests."
12
+ s.description = "http_resque helps you cleanly write integration tests for your Resque jobs. It's a thin " +
13
+ "HTTP API around the Resque daemon. With it you can manipulate the contents of the Resque queues " +
14
+ "using HTTP requests."
12
15
 
13
16
  s.rubyforge_project = "http_resque"
14
17
 
@@ -22,4 +25,5 @@ Gem::Specification.new do |s|
22
25
  s.add_runtime_dependency "rake"
23
26
  s.add_runtime_dependency "json"
24
27
  s.add_runtime_dependency "sinatra"
28
+ s.add_runtime_dependency "trollop"
25
29
  end
data/lib/http_resque.rb CHANGED
@@ -1 +1 @@
1
- require "howdy/version"
1
+ require "http_resque/version"
@@ -1,3 +1,3 @@
1
1
  module HttpResque
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http_resque
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Phil Crosby
@@ -88,7 +88,21 @@ dependencies:
88
88
  version: "0"
89
89
  type: :runtime
90
90
  version_requirements: *id005
91
- description:
91
+ - !ruby/object:Gem::Dependency
92
+ name: trollop
93
+ prerelease: false
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ type: :runtime
104
+ version_requirements: *id006
105
+ description: http_resque helps you cleanly write integration tests for your Resque jobs. It's a thin HTTP API around the Resque daemon. With it you can manipulate the contents of the Resque queues using HTTP requests.
92
106
  email:
93
107
  - phil.crosby@gmail.com
94
108
  executables:
@@ -139,6 +153,6 @@ rubyforge_project: http_resque
139
153
  rubygems_version: 1.6.2
140
154
  signing_key:
141
155
  specification_version: 3
142
- summary: A small HTTP wrapper around Resque, so you can schedule and test jobs over HTTP.
156
+ summary: Schedule and test Resque jobs using HTTP requests.
143
157
  test_files: []
144
158