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 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 rake tasks to enqueue all of your jobs.
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
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.1.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
- "lib/cavalcade/tasks.rb",
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.1.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: activesupport
16
- requirement: &70124168375860 !ruby/object:Gem::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: '0.9'
21
+ version: '1.19'
44
22
  type: :runtime
45
23
  prerelease: false
46
- version_requirements: *70124168374860
24
+ version_requirements: *70306831114740
47
25
  - !ruby/object:Gem::Dependency
48
- name: resque
49
- requirement: &70124168374340 !ruby/object:Gem::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.19'
32
+ version: '1.16'
55
33
  type: :runtime
56
34
  prerelease: false
57
- version_requirements: *70124168374340
35
+ version_requirements: *70306831114220
58
36
  - !ruby/object:Gem::Dependency
59
37
  name: rspec
60
- requirement: &70124168373840 !ruby/object:Gem::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: *70124168373840
46
+ version_requirements: *70306831113680
69
47
  - !ruby/object:Gem::Dependency
70
48
  name: bundler
71
- requirement: &70124168373320 !ruby/object:Gem::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: *70124168373320
57
+ version_requirements: *70306831113180
80
58
  - !ruby/object:Gem::Dependency
81
59
  name: jeweler
82
- requirement: &70124168372820 !ruby/object:Gem::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: *70124168372820
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
- - lib/cavalcade/tasks.rb
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: -590044956478310162
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
@@ -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