cavalcade 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -3
- data/Gemfile.lock +2 -6
- data/README.md +5 -1
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/bin/cavalcade +64 -0
- data/cavalcade.gemspec +7 -13
- data/spec/bin/cavalcade_spec.rb +36 -0
- metadata +21 -43
- data/lib/cavalcade/tasks/jobs.rake +0 -19
- data/lib/cavalcade/tasks.rb +0 -1
- data/spec/lib/cavalcade/tasks/jobs_spec.rb +0 -18
data/Gemfile
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
gem "activesupport", ">= 2.3.2"
|
4
|
-
gem "i18n" # ActiveSupport screws up its dependencies, so adding this manually (version-agnostic) so that bad versions of activesupport will still work.
|
5
|
-
gem "rake", ">= 0.9"
|
6
3
|
gem "resque", "~> 1.19"
|
4
|
+
gem "trollop", "~> 1.16"
|
7
5
|
|
8
6
|
group :development do
|
9
7
|
gem "rspec", "~> 2.6"
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
activesupport (3.1.1)
|
5
|
-
multi_json (~> 1.0)
|
6
4
|
diff-lcs (1.1.3)
|
7
5
|
git (1.2.5)
|
8
|
-
i18n (0.6.0)
|
9
6
|
jeweler (1.6.4)
|
10
7
|
bundler (~> 1.0)
|
11
8
|
git (>= 1.2.5)
|
@@ -36,6 +33,7 @@ GEM
|
|
36
33
|
rack-protection (~> 1.1, >= 1.1.2)
|
37
34
|
tilt (~> 1.3, >= 1.3.3)
|
38
35
|
tilt (1.3.3)
|
36
|
+
trollop (1.16.2)
|
39
37
|
vegas (0.1.8)
|
40
38
|
rack (>= 1.0.0)
|
41
39
|
|
@@ -43,10 +41,8 @@ PLATFORMS
|
|
43
41
|
ruby
|
44
42
|
|
45
43
|
DEPENDENCIES
|
46
|
-
activesupport (>= 2.3.2)
|
47
44
|
bundler (~> 1.0.0)
|
48
|
-
i18n
|
49
45
|
jeweler (~> 1.6.4)
|
50
|
-
rake (>= 0.9)
|
51
46
|
resque (~> 1.19)
|
52
47
|
rspec (~> 2.6)
|
48
|
+
trollop (~> 1.16)
|
data/README.md
CHANGED
@@ -8,7 +8,11 @@ Github built Resque to perform background jobs for the github web app. It has ga
|
|
8
8
|
|
9
9
|
But Resque can be very useful outside of a web app, too. What if you want to write jobs in Ruby and just enqueue them from your console? Or from a Java application? Or in cron jobs? Cavalcade to the Resque!
|
10
10
|
|
11
|
-
Cavalcade creates a Resque-based, stand-alone job queue, and provides
|
11
|
+
Cavalcade creates a Resque-based, stand-alone job queue, and provides an executable to manage and enqueue all of your jobs.
|
12
|
+
|
13
|
+
## Philosophy
|
14
|
+
|
15
|
+
Cavalcade is *not* a wrapper around Resque. In fact, it makes a point of *not* obfuscating or overriing any of Resque's native functionality. Any job that you write for Cavalcade can be used interchangeably with any app that uses Resque. Think of Cavalcade as minimalist piping that lets you get started writing jobs quickly.
|
12
16
|
|
13
17
|
## Contributing to Cavalcade
|
14
18
|
|
data/Rakefile
CHANGED
@@ -21,6 +21,7 @@ Jeweler::Tasks.new do |gem|
|
|
21
21
|
gem.description = %Q{Resque can be very useful outside of a web app, too. What if you want to write jobs in Ruby and just enqueue them from your console? Or from a Java application? Or in cron jobs? Cavalcade to the resque! Cavalcade creates a resque-based, stand-alone job queue, and provides rake tasks to enqueue all of your jobs.}
|
22
22
|
gem.email = "robby@freerobby.com"
|
23
23
|
gem.authors = ["Robby Grossman"]
|
24
|
+
gem.executables = ["cavalcade"]
|
24
25
|
# dependencies defined in Gemfile
|
25
26
|
end
|
26
27
|
Jeweler::RubygemsDotOrgTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/bin/cavalcade
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require "cavalcade"
|
5
|
+
require "resque"
|
6
|
+
require "trollop"
|
7
|
+
|
8
|
+
SUBCOMMANDS = %w(enqueue list-jobs)
|
9
|
+
|
10
|
+
global_opts = Trollop::options do
|
11
|
+
banner "Usage: cavalcade SUBCOMMAND [options]"
|
12
|
+
banner "Available subcommands: #{SUBCOMMANDS.join(", ")}"
|
13
|
+
stop_on SUBCOMMANDS
|
14
|
+
end
|
15
|
+
|
16
|
+
subcommand = ARGV.shift
|
17
|
+
subcommand_opts = case subcommand
|
18
|
+
when nil
|
19
|
+
Trollop::die "No subcommand specified."
|
20
|
+
when "enqueue"
|
21
|
+
Trollop::options do
|
22
|
+
banner "Usage: cavalcade enqueue [options]"
|
23
|
+
opt :environment, "Ruby file that loads your environment", :type => String, :default => "environment.rb"
|
24
|
+
opt :job, "Class name of the job to enqueue", :type => String
|
25
|
+
opt :params, "Ruby parameters to pass to job", :type => String
|
26
|
+
end
|
27
|
+
when "list-jobs"
|
28
|
+
Trollop::options do
|
29
|
+
banner "Usage: cavalcade list-jobs [options]"
|
30
|
+
opt :environment, "Ruby file that loads your environment", :type => String, :default => "environment.rb"
|
31
|
+
end
|
32
|
+
else
|
33
|
+
Trollop::die "Unknown subcommand: #{subcommand.inspect}"
|
34
|
+
end
|
35
|
+
|
36
|
+
class Helpers
|
37
|
+
def self.load_environment(file_path)
|
38
|
+
begin
|
39
|
+
require file_path
|
40
|
+
rescue LoadError => e
|
41
|
+
if e.message.include?(file_path)
|
42
|
+
Trollop::die "Unable to load #{file_path}"
|
43
|
+
else
|
44
|
+
raise e
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
case subcommand
|
51
|
+
when "enqueue"
|
52
|
+
Helpers.load_environment(subcommand_opts[:environment])
|
53
|
+
# Use string comparison instead of class comparison so we don't have to handle exceptions if a bad class is supplied
|
54
|
+
if Cavalcade::JobsFinder.defined_jobs.map{|j| j.to_s}.include?(subcommand_opts[:job])
|
55
|
+
eval("Resque.enqueue(#{subcommand_opts[:job]}, #{subcommand_opts[:params]})")
|
56
|
+
$stderr.puts "Enqueued job: #{subcommand_opts[:job]}.perform(#{subcommand_opts[:params]})"
|
57
|
+
else
|
58
|
+
Trollop::die "Job not found: #{subcommand_opts[:job]}. Verify you are using the correct environment file, and use list-jobs to verify your job is available."
|
59
|
+
end
|
60
|
+
when "list-jobs"
|
61
|
+
Helpers.load_environment(subcommand_opts[:environment])
|
62
|
+
$stderr.puts "Available jobs: #{Cavalcade::JobsFinder.defined_jobs.sort.join(", ")}"
|
63
|
+
$stderr.puts "Missing jobs? Be sure they are in your environment.rb."
|
64
|
+
end
|
data/cavalcade.gemspec
CHANGED
@@ -5,13 +5,14 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "cavalcade"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Robby Grossman"]
|
12
12
|
s.date = "2011-11-15"
|
13
13
|
s.description = "Resque can be very useful outside of a web app, too. What if you want to write jobs in Ruby and just enqueue them from your console? Or from a Java application? Or in cron jobs? Cavalcade to the resque! Cavalcade creates a resque-based, stand-alone job queue, and provides rake tasks to enqueue all of your jobs."
|
14
14
|
s.email = "robby@freerobby.com"
|
15
|
+
s.executables = ["cavalcade"]
|
15
16
|
s.extra_rdoc_files = [
|
16
17
|
"LICENSE.txt",
|
17
18
|
"README.md"
|
@@ -26,15 +27,14 @@ Gem::Specification.new do |s|
|
|
26
27
|
"README.md",
|
27
28
|
"Rakefile",
|
28
29
|
"VERSION",
|
30
|
+
"bin/cavalcade",
|
29
31
|
"cavalcade.gemspec",
|
30
32
|
"lib/cavalcade.rb",
|
31
33
|
"lib/cavalcade/job.rb",
|
32
34
|
"lib/cavalcade/jobs_finder.rb",
|
33
|
-
"
|
34
|
-
"lib/cavalcade/tasks/jobs.rake",
|
35
|
+
"spec/bin/cavalcade_spec.rb",
|
35
36
|
"spec/lib/cavalcade/job_spec.rb",
|
36
37
|
"spec/lib/cavalcade/jobs_finder_spec.rb",
|
37
|
-
"spec/lib/cavalcade/tasks/jobs_spec.rb",
|
38
38
|
"spec/spec_helper.rb"
|
39
39
|
]
|
40
40
|
s.homepage = "http://github.com/freerobby/cavalcade"
|
@@ -47,27 +47,21 @@ Gem::Specification.new do |s|
|
|
47
47
|
s.specification_version = 3
|
48
48
|
|
49
49
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
50
|
-
s.add_runtime_dependency(%q<activesupport>, [">= 2.3.2"])
|
51
|
-
s.add_runtime_dependency(%q<i18n>, [">= 0"])
|
52
|
-
s.add_runtime_dependency(%q<rake>, [">= 0.9"])
|
53
50
|
s.add_runtime_dependency(%q<resque>, ["~> 1.19"])
|
51
|
+
s.add_runtime_dependency(%q<trollop>, ["~> 1.16"])
|
54
52
|
s.add_development_dependency(%q<rspec>, ["~> 2.6"])
|
55
53
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
56
54
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
57
55
|
else
|
58
|
-
s.add_dependency(%q<activesupport>, [">= 2.3.2"])
|
59
|
-
s.add_dependency(%q<i18n>, [">= 0"])
|
60
|
-
s.add_dependency(%q<rake>, [">= 0.9"])
|
61
56
|
s.add_dependency(%q<resque>, ["~> 1.19"])
|
57
|
+
s.add_dependency(%q<trollop>, ["~> 1.16"])
|
62
58
|
s.add_dependency(%q<rspec>, ["~> 2.6"])
|
63
59
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
64
60
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
65
61
|
end
|
66
62
|
else
|
67
|
-
s.add_dependency(%q<activesupport>, [">= 2.3.2"])
|
68
|
-
s.add_dependency(%q<i18n>, [">= 0"])
|
69
|
-
s.add_dependency(%q<rake>, [">= 0.9"])
|
70
63
|
s.add_dependency(%q<resque>, ["~> 1.19"])
|
64
|
+
s.add_dependency(%q<trollop>, ["~> 1.16"])
|
71
65
|
s.add_dependency(%q<rspec>, ["~> 2.6"])
|
72
66
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
73
67
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../spec_helper"
|
2
|
+
|
3
|
+
describe "bin/cavalcade" do
|
4
|
+
def execute_with_args(args_str = "")
|
5
|
+
return `#{File.dirname(__FILE__)}/../../bin/cavalcade #{args_str} 2>&1`
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "without subcommand" do
|
9
|
+
it "reports error" do
|
10
|
+
execute_with_args().should =~ /no subcommand/i
|
11
|
+
end
|
12
|
+
end
|
13
|
+
describe "with bad subcommand" do
|
14
|
+
it "reports error" do
|
15
|
+
execute_with_args("asdf").should =~ /unknown/i
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "bad environment" do
|
20
|
+
%w(enqueue list-jobs).each do |subcommand|
|
21
|
+
describe "passed to #{subcommand}" do
|
22
|
+
it "reports error" do
|
23
|
+
execute_with_args("#{subcommand} -e /bad/path/to/env.rb").should =~ /unable to load/i
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "bad job" do
|
30
|
+
describe "passed to enqueue" do
|
31
|
+
it "reports error" do
|
32
|
+
execute_with_args("enqueue -e #{File.dirname(__FILE__)}/../../lib/cavalcade.rb -j FakeJob").should =~ /not found/i
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cavalcade
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,52 +12,30 @@ cert_chain: []
|
|
12
12
|
date: 2011-11-15 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement: &
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 2.3.2
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: *70124168375860
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: i18n
|
27
|
-
requirement: &70124168375360 !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: *70124168375360
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: rake
|
38
|
-
requirement: &70124168374860 !ruby/object:Gem::Requirement
|
15
|
+
name: resque
|
16
|
+
requirement: &70306831114740 !ruby/object:Gem::Requirement
|
39
17
|
none: false
|
40
18
|
requirements:
|
41
|
-
- -
|
19
|
+
- - ~>
|
42
20
|
- !ruby/object:Gem::Version
|
43
|
-
version: '
|
21
|
+
version: '1.19'
|
44
22
|
type: :runtime
|
45
23
|
prerelease: false
|
46
|
-
version_requirements: *
|
24
|
+
version_requirements: *70306831114740
|
47
25
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement: &
|
26
|
+
name: trollop
|
27
|
+
requirement: &70306831114220 !ruby/object:Gem::Requirement
|
50
28
|
none: false
|
51
29
|
requirements:
|
52
30
|
- - ~>
|
53
31
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1.
|
32
|
+
version: '1.16'
|
55
33
|
type: :runtime
|
56
34
|
prerelease: false
|
57
|
-
version_requirements: *
|
35
|
+
version_requirements: *70306831114220
|
58
36
|
- !ruby/object:Gem::Dependency
|
59
37
|
name: rspec
|
60
|
-
requirement: &
|
38
|
+
requirement: &70306831113680 !ruby/object:Gem::Requirement
|
61
39
|
none: false
|
62
40
|
requirements:
|
63
41
|
- - ~>
|
@@ -65,10 +43,10 @@ dependencies:
|
|
65
43
|
version: '2.6'
|
66
44
|
type: :development
|
67
45
|
prerelease: false
|
68
|
-
version_requirements: *
|
46
|
+
version_requirements: *70306831113680
|
69
47
|
- !ruby/object:Gem::Dependency
|
70
48
|
name: bundler
|
71
|
-
requirement: &
|
49
|
+
requirement: &70306831113180 !ruby/object:Gem::Requirement
|
72
50
|
none: false
|
73
51
|
requirements:
|
74
52
|
- - ~>
|
@@ -76,10 +54,10 @@ dependencies:
|
|
76
54
|
version: 1.0.0
|
77
55
|
type: :development
|
78
56
|
prerelease: false
|
79
|
-
version_requirements: *
|
57
|
+
version_requirements: *70306831113180
|
80
58
|
- !ruby/object:Gem::Dependency
|
81
59
|
name: jeweler
|
82
|
-
requirement: &
|
60
|
+
requirement: &70306831112700 !ruby/object:Gem::Requirement
|
83
61
|
none: false
|
84
62
|
requirements:
|
85
63
|
- - ~>
|
@@ -87,13 +65,14 @@ dependencies:
|
|
87
65
|
version: 1.6.4
|
88
66
|
type: :development
|
89
67
|
prerelease: false
|
90
|
-
version_requirements: *
|
68
|
+
version_requirements: *70306831112700
|
91
69
|
description: Resque can be very useful outside of a web app, too. What if you want
|
92
70
|
to write jobs in Ruby and just enqueue them from your console? Or from a Java application?
|
93
71
|
Or in cron jobs? Cavalcade to the resque! Cavalcade creates a resque-based, stand-alone
|
94
72
|
job queue, and provides rake tasks to enqueue all of your jobs.
|
95
73
|
email: robby@freerobby.com
|
96
|
-
executables:
|
74
|
+
executables:
|
75
|
+
- cavalcade
|
97
76
|
extensions: []
|
98
77
|
extra_rdoc_files:
|
99
78
|
- LICENSE.txt
|
@@ -108,15 +87,14 @@ files:
|
|
108
87
|
- README.md
|
109
88
|
- Rakefile
|
110
89
|
- VERSION
|
90
|
+
- bin/cavalcade
|
111
91
|
- cavalcade.gemspec
|
112
92
|
- lib/cavalcade.rb
|
113
93
|
- lib/cavalcade/job.rb
|
114
94
|
- lib/cavalcade/jobs_finder.rb
|
115
|
-
-
|
116
|
-
- lib/cavalcade/tasks/jobs.rake
|
95
|
+
- spec/bin/cavalcade_spec.rb
|
117
96
|
- spec/lib/cavalcade/job_spec.rb
|
118
97
|
- spec/lib/cavalcade/jobs_finder_spec.rb
|
119
|
-
- spec/lib/cavalcade/tasks/jobs_spec.rb
|
120
98
|
- spec/spec_helper.rb
|
121
99
|
homepage: http://github.com/freerobby/cavalcade
|
122
100
|
licenses:
|
@@ -133,7 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
133
111
|
version: '0'
|
134
112
|
segments:
|
135
113
|
- 0
|
136
|
-
hash: -
|
114
|
+
hash: -1807534318334742658
|
137
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
116
|
none: false
|
139
117
|
requirements:
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require "resque/tasks"
|
2
|
-
require "active_support/inflector" # #underscore used to convert ClassName to class_name
|
3
|
-
|
4
|
-
require "cavalcade"
|
5
|
-
|
6
|
-
namespace :cavalcade do
|
7
|
-
namespace :jobs do
|
8
|
-
Cavalcade::JobsFinder.defined_jobs.each do |klass|
|
9
|
-
classname = klass.to_s
|
10
|
-
namespace classname.underscore do
|
11
|
-
desc "Create new #{classname} job; set params with RUBY_PARAMS_STR= (default is nil)."
|
12
|
-
task :enqueue do
|
13
|
-
PARAMS = ENV["RUBY_PARAMS_STR"] || nil
|
14
|
-
eval("Resque.enqueue(#{classname}, #{PARAMS})")
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
data/lib/cavalcade/tasks.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
load File.join(File.dirname(__FILE__), 'tasks', 'jobs.rake')
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/../../../spec_helper"
|
2
|
-
|
3
|
-
require "rake"
|
4
|
-
|
5
|
-
describe "jobs.rake" do
|
6
|
-
it "creates an enqueue task in own namespace for each Job" do
|
7
|
-
class File1 < Cavalcade::Job; end
|
8
|
-
class SomeClass < Cavalcade::Job; end
|
9
|
-
class SomeLongClassName < Cavalcade::Job; end
|
10
|
-
Cavalcade::JobsFinder.stub!(:defined_jobs).and_return([File1, SomeClass, SomeLongClassName])
|
11
|
-
Rake.application = Rake::Application.new
|
12
|
-
require "cavalcade/tasks"
|
13
|
-
tasks = Rake.application.tasks.map{|t| t.name}
|
14
|
-
tasks.should include("cavalcade:jobs:file1:enqueue")
|
15
|
-
tasks.should include("cavalcade:jobs:some_class:enqueue")
|
16
|
-
tasks.should include("cavalcade:jobs:some_long_class_name:enqueue")
|
17
|
-
end
|
18
|
-
end
|