taskmaster 0.0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ source "http://rubygems.org"
4
4
  # gem "activesupport", ">= 2.3.5"
5
5
 
6
6
  gem 'whenever'
7
- gem 'activesupport', '~> 2.3'
7
+ gem 'activesupport'
8
8
 
9
9
  # Add dependencies to develop your gem here.
10
10
  # Include everything needed to run rake, tests, features, etc.
data/README.rdoc CHANGED
@@ -5,6 +5,8 @@ Make your Ruby classes cron-aware!
5
5
 
6
6
  == Example
7
7
 
8
+ The base case is simple -- just include the `Taskmaster::Henchman` module, define a `run` class method, and use `whenever` syntax to specify when and how often the method should run:
9
+
8
10
  require 'taskmaster'
9
11
 
10
12
  class FootSoldier
@@ -19,9 +21,18 @@ Make your Ruby classes cron-aware!
19
21
 
20
22
  puts FootSoldier.cron_output # => "5,15,25,35,45,55 * * * * /bin/bash -l -c 'cd /... && script/runner -e production '\''BulkTask.run'\'''"
21
23
 
24
+ You can override various pieces of this, including the name of the class method to run:
25
+
26
+ every 10.minutes, :run => :special_method
27
+
28
+ def self.special_method
29
+ # I'm not the default!
30
+ end
31
+
32
+ Check the documentation on `Taskmaster::Henchman.every` for details on all the allowed options.
33
+
22
34
  == TODO
23
35
 
24
- * figure out different task types
25
36
  * add a Rake task to output and save crontab for all Taskmaster-including classes (fall back to whenever)
26
37
 
27
38
  == Contributing to taskmaster
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.1
data/lib/taskmaster.rb CHANGED
@@ -1,9 +1,15 @@
1
1
  require 'whenever'
2
2
 
3
- require './lib/taskmaster/henchman'
3
+ require 'taskmaster/henchman'
4
+ require 'taskmaster/railtie'
4
5
 
5
6
  module Taskmaster
6
7
  def self.cron_output
8
+ # make sure all the models that could include Henchman are loaded
9
+ if defined?(Rails)
10
+ Dir[Rails.root.join('app', 'models', '**', '*.rb')].each { |file| require file }
11
+ end
12
+
7
13
  Henchman.included_in.map { |klass| klass.cron_output.strip }.join("\n")
8
14
  end
9
15
  end
@@ -1,3 +1,5 @@
1
+ require 'taskmaster'
2
+
1
3
  module Taskmaster
2
4
  module Henchman
3
5
  def self.included(base)
@@ -13,8 +15,11 @@ module Taskmaster
13
15
 
14
16
  module ClassMethods
15
17
  def every(frequency, options = {})
16
- @schedule = "every #{frequency.to_s}, #{options.inspect} do
17
- runner \'#{self.name}.run\'
18
+ @scheduled_jobs ||= []
19
+ method = options.delete(:run) || :run
20
+ command = options.delete(:command) || :runner
21
+ @scheduled_jobs << "every #{frequency.to_s}, #{options.inspect} do
22
+ #{command.to_s} \'#{self.name}.#{method.to_s}\'
18
23
  end"
19
24
  end
20
25
 
@@ -23,7 +28,7 @@ end"
23
28
  end
24
29
 
25
30
  def cron_output
26
- Whenever::JobList.new(@schedule).generate_cron_output
31
+ Whenever::JobList.new(@scheduled_jobs.join("\n")).generate_cron_output
27
32
  end
28
33
  end
29
34
  end
@@ -0,0 +1,12 @@
1
+ require 'taskmaster'
2
+
3
+ module Taskmaster
4
+ if defined? Rails::Railtie
5
+ require 'rails'
6
+ class Railtie < Rails::Railtie
7
+ rake_tasks do
8
+ load "tasks/taskmaster.rake"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ namespace :taskmaster do
2
+
3
+ desc "Generate crontab"
4
+ task :generate do
5
+ output = Taskmaster.cron_output
6
+ puts output
7
+ end
8
+ end
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'taskmaster/railtie'
data/taskmaster.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{taskmaster}
8
- s.version = "0.0.1"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ben Scofield"]
12
- s.date = %q{2011-06-16}
12
+ s.date = %q{2011-06-17}
13
13
  s.description = %q{Taskmaster allows you to easily make your Ruby classes aware of cron.}
14
14
  s.email = %q{git@turrean.com}
15
15
  s.extra_rdoc_files = [
@@ -25,8 +25,11 @@ Gem::Specification.new do |s|
25
25
  "VERSION",
26
26
  "lib/taskmaster.rb",
27
27
  "lib/taskmaster/henchman.rb",
28
+ "lib/taskmaster/railtie.rb",
29
+ "lib/tasks/taskmaster.rake",
30
+ "rails/init.rb",
28
31
  "taskmaster.gemspec",
29
- "test/foot_soldier.rb",
32
+ "test/classes/foot_soldier.rb",
30
33
  "test/helper.rb",
31
34
  "test/test_henchman.rb",
32
35
  "test/test_taskmaster.rb"
@@ -42,14 +45,14 @@ Gem::Specification.new do |s|
42
45
 
43
46
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
44
47
  s.add_runtime_dependency(%q<whenever>, [">= 0"])
45
- s.add_runtime_dependency(%q<activesupport>, ["~> 2.3"])
48
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
46
49
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
47
50
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
48
51
  s.add_development_dependency(%q<rcov>, [">= 0"])
49
52
  s.add_development_dependency(%q<rake>, ["= 0.8.7"])
50
53
  else
51
54
  s.add_dependency(%q<whenever>, [">= 0"])
52
- s.add_dependency(%q<activesupport>, ["~> 2.3"])
55
+ s.add_dependency(%q<activesupport>, [">= 0"])
53
56
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
54
57
  s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
55
58
  s.add_dependency(%q<rcov>, [">= 0"])
@@ -57,7 +60,7 @@ Gem::Specification.new do |s|
57
60
  end
58
61
  else
59
62
  s.add_dependency(%q<whenever>, [">= 0"])
60
- s.add_dependency(%q<activesupport>, ["~> 2.3"])
63
+ s.add_dependency(%q<activesupport>, [">= 0"])
61
64
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
62
65
  s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
63
66
  s.add_dependency(%q<rcov>, [">= 0"])
@@ -0,0 +1,64 @@
1
+ class FootSoldier
2
+ include Taskmaster::Henchman
3
+
4
+ every 10.minutes
5
+
6
+ def self.run
7
+ # get beaten up by a superhero
8
+ end
9
+ end
10
+
11
+ class SpecialSoldier
12
+ include Taskmaster::Henchman
13
+
14
+ every 1.hour, :run => :specialty
15
+
16
+ def self.specialty
17
+ # run this one
18
+ end
19
+ end
20
+
21
+ class MultiSoldier
22
+ include Taskmaster::Henchman
23
+
24
+ every 1.minute
25
+ every 1.hour, :run => :specialty
26
+
27
+ def self.specialty
28
+ # run this one
29
+ end
30
+
31
+ def self.run
32
+ # do something cool
33
+ end
34
+ end
35
+
36
+ class SpecificSoldier
37
+ include Taskmaster::Henchman
38
+
39
+ every 1.hour, :at => 20
40
+
41
+ def self.run
42
+ # get beaten up by a superhero
43
+ end
44
+ end
45
+
46
+ class CommandSoldier
47
+ include Taskmaster::Henchman
48
+
49
+ every 1.hour, :command => :command
50
+
51
+ def self.run
52
+ # nothing to see here
53
+ end
54
+ end
55
+
56
+ class FrequencySoldier
57
+ include Taskmaster::Henchman
58
+
59
+ every 1.hour, :command => :command
60
+
61
+ def self.run
62
+ # nothing to see here
63
+ end
64
+ end
data/test/helper.rb CHANGED
@@ -13,7 +13,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
13
13
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
14
  require 'taskmaster'
15
15
 
16
- require './test/foot_soldier'
16
+ require 'classes/foot_soldier'
17
17
 
18
18
  class Test::Unit::TestCase
19
19
  end
@@ -1,13 +1,38 @@
1
1
  require 'helper'
2
2
 
3
- class TestTaskmaster < Test::Unit::TestCase
3
+ class TestHenchman < Test::Unit::TestCase
4
4
  def test_class_should_be_definable
5
5
  assert_nothing_raised do
6
6
  FootSoldier
7
+ SpecialSoldier
7
8
  end
8
9
  end
9
10
 
10
- def test_footsoldier_should_have_expected_cron_output
11
+ def test_the_base_case_should_work
11
12
  assert_equal "0,10,20,30,40,50 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''FootSoldier.run'\\'''", FootSoldier.cron_output.strip
12
13
  end
14
+
15
+ def test_scheduled_methods_should_be_overradble
16
+ assert_equal "0 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''SpecialSoldier.specialty'\\'''", SpecialSoldier.cron_output.strip
17
+ end
18
+
19
+ def test_multiple_tasks_can_live_in_a_class
20
+ output = MultiSoldier.cron_output.split(/\n+/)
21
+ assert_equal 2, output.size
22
+
23
+ assert_equal "* * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''MultiSoldier.run'\\'''", output[0]
24
+ assert_equal "0 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''MultiSoldier.specialty'\\'''", output[1]
25
+ end
26
+
27
+ def test_whenever_options_should_be_respected
28
+ assert_equal "20 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''SpecificSoldier.run'\\'''", SpecificSoldier.cron_output.strip
29
+ end
30
+
31
+ def test_different_whenever_commands_should_be_usable
32
+ assert_equal "0 * * * * /bin/bash -l -c 'CommandSoldier.run'", CommandSoldier.cron_output.strip
33
+ end
34
+
35
+ def test_whenever_alternative_names_should_be_usable
36
+ assert_equal "0 * * * * /bin/bash -l -c 'FrequencySoldier.run'", FrequencySoldier.cron_output.strip
37
+ end
13
38
  end
@@ -9,6 +9,10 @@ class TestTaskmaster < Test::Unit::TestCase
9
9
  end
10
10
 
11
11
  def test_taskmaster_should_know_all_output
12
- assert_equal "0,10,20,30,40,50 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''FootSoldier.run'\\'''", Taskmaster.cron_output.strip
12
+ output = Taskmaster.cron_output.split(/\n+/)
13
+ assert_equal "0,10,20,30,40,50 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''FootSoldier.run'\\'''", output[0]
14
+ assert_equal "0 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''SpecialSoldier.specialty'\\'''", output[1]
15
+ assert_equal "* * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''MultiSoldier.run'\\'''", output[2]
16
+ assert_equal "0 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''MultiSoldier.specialty'\\'''", output[3]
13
17
  end
14
18
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: taskmaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-06-16 00:00:00.000000000 -04:00
12
+ date: 2011-06-17 00:00:00.000000000 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: whenever
17
- requirement: &2160379820 !ruby/object:Gem::Requirement
17
+ requirement: &2152144960 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,21 +22,21 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2160379820
25
+ version_requirements: *2152144960
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activesupport
28
- requirement: &2160379120 !ruby/object:Gem::Requirement
28
+ requirement: &2152143680 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
- - - ~>
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
- version: '2.3'
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2160379120
36
+ version_requirements: *2152143680
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: bundler
39
- requirement: &2160377580 !ruby/object:Gem::Requirement
39
+ requirement: &2152142280 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 1.0.0
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2160377580
47
+ version_requirements: *2152142280
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: jeweler
50
- requirement: &2160376300 !ruby/object:Gem::Requirement
50
+ requirement: &2152140880 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ~>
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: 1.6.2
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2160376300
58
+ version_requirements: *2152140880
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: rcov
61
- requirement: &2160375040 !ruby/object:Gem::Requirement
61
+ requirement: &2152139660 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2160375040
69
+ version_requirements: *2152139660
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rake
72
- requirement: &2160373360 !ruby/object:Gem::Requirement
72
+ requirement: &2152138620 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - =
@@ -77,7 +77,7 @@ dependencies:
77
77
  version: 0.8.7
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *2160373360
80
+ version_requirements: *2152138620
81
81
  description: Taskmaster allows you to easily make your Ruby classes aware of cron.
82
82
  email: git@turrean.com
83
83
  executables: []
@@ -94,8 +94,11 @@ files:
94
94
  - VERSION
95
95
  - lib/taskmaster.rb
96
96
  - lib/taskmaster/henchman.rb
97
+ - lib/taskmaster/railtie.rb
98
+ - lib/tasks/taskmaster.rake
99
+ - rails/init.rb
97
100
  - taskmaster.gemspec
98
- - test/foot_soldier.rb
101
+ - test/classes/foot_soldier.rb
99
102
  - test/helper.rb
100
103
  - test/test_henchman.rb
101
104
  - test/test_taskmaster.rb
@@ -115,7 +118,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
118
  version: '0'
116
119
  segments:
117
120
  - 0
118
- hash: 2376148929927607973
121
+ hash: -4405291791740595885
119
122
  required_rubygems_version: !ruby/object:Gem::Requirement
120
123
  none: false
121
124
  requirements:
data/test/foot_soldier.rb DELETED
@@ -1,9 +0,0 @@
1
- class FootSoldier
2
- include Taskmaster::Henchman
3
-
4
- every 10.minutes
5
-
6
- def self.run
7
- # get beaten up by a superhero
8
- end
9
- end