taskmaster 0.0.1 → 0.1.1

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/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