taskmaster 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -1
- data/README.rdoc +1 -1
- data/VERSION +1 -1
- data/lib/taskmaster.rb +38 -3
- data/lib/taskmaster/henchman.rb +4 -0
- data/lib/tasks/taskmaster.rake +15 -3
- data/taskmaster.gemspec +8 -5
- data/test/helper.rb +1 -0
- data/test/test_taskmaster.rb +80 -5
- metadata +27 -16
data/Gemfile
CHANGED
@@ -9,8 +9,9 @@ gem 'activesupport'
|
|
9
9
|
# Add dependencies to develop your gem here.
|
10
10
|
# Include everything needed to run rake, tests, features, etc.
|
11
11
|
group :development do
|
12
|
-
gem "bundler", "~> 1
|
12
|
+
gem "bundler", "~> 1"
|
13
13
|
gem "jeweler", "~> 1.6.2"
|
14
14
|
gem "rcov", ">= 0"
|
15
15
|
gem "rake", "0.8.7"
|
16
|
+
gem "mocha", "~> 0.9"
|
16
17
|
end
|
data/README.rdoc
CHANGED
@@ -33,7 +33,7 @@ Check the documentation on `Taskmaster::Henchman.every` for details on all the a
|
|
33
33
|
|
34
34
|
== TODO
|
35
35
|
|
36
|
-
* add a
|
36
|
+
* add a binary script to fall back to whenever (for writing/updating crontab)
|
37
37
|
|
38
38
|
== Contributing to taskmaster
|
39
39
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/taskmaster.rb
CHANGED
@@ -4,12 +4,47 @@ require 'taskmaster/henchman'
|
|
4
4
|
require 'taskmaster/railtie'
|
5
5
|
|
6
6
|
module Taskmaster
|
7
|
+
def self.aggregate
|
8
|
+
load_rails_models
|
9
|
+
hash = Henchman.included_in.inject({}) do |hash, klass|
|
10
|
+
hash[klass.name] = klass.cron_output.strip
|
11
|
+
hash
|
12
|
+
end
|
13
|
+
hash
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.aggregate_whenever
|
17
|
+
load_rails_models
|
18
|
+
array = Henchman.included_in.inject([]) do |arr, klass|
|
19
|
+
arr << klass.scheduled_jobs
|
20
|
+
arr
|
21
|
+
end
|
22
|
+
array.flatten.join("\n")
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.section(key, cron)
|
26
|
+
buffer = []
|
27
|
+
buffer << "#-- begin Taskmaster cron for #{application} - #{key}"
|
28
|
+
buffer << cron
|
29
|
+
buffer << "#-- end Taskmaster cron for #{application} - #{key}\n"
|
30
|
+
buffer
|
31
|
+
end
|
32
|
+
|
7
33
|
def self.cron_output
|
8
|
-
|
34
|
+
raw_output = aggregate
|
35
|
+
raw_output.keys.map { |key| section(key, raw_output[key]) }.join("\n")
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.application
|
39
|
+
Rails.root.basename.to_s
|
40
|
+
rescue
|
41
|
+
"application"
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
def self.load_rails_models
|
9
46
|
if defined?(Rails)
|
10
47
|
Dir[Rails.root.join('app', 'models', '**', '*.rb')].each { |file| require file }
|
11
48
|
end
|
12
|
-
|
13
|
-
Henchman.included_in.map { |klass| klass.cron_output.strip }.join("\n")
|
14
49
|
end
|
15
50
|
end
|
data/lib/taskmaster/henchman.rb
CHANGED
data/lib/tasks/taskmaster.rake
CHANGED
@@ -1,8 +1,20 @@
|
|
1
|
-
|
1
|
+
require 'fileutils'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
namespace :taskmaster do
|
4
|
+
desc "Preview the generated crontab"
|
5
|
+
task :preview do
|
5
6
|
output = Taskmaster.cron_output
|
6
7
|
puts output
|
7
8
|
end
|
9
|
+
|
10
|
+
desc "Write the generated crontab to config/schedule.rb -- suitable for whenever to write it to the system"
|
11
|
+
task :write do
|
12
|
+
output = Taskmaster.aggregate_whenever
|
13
|
+
FileUtils.mkdir_p 'config'
|
14
|
+
FileUtils.touch 'config/schedule.rb'
|
15
|
+
File.open('config/schedule.rb', File::WRONLY) do |file|
|
16
|
+
file << output
|
17
|
+
end
|
18
|
+
puts "Your crontab has been written to config/schedule.rb. Please use the whenever script to write it to your system crontab."
|
19
|
+
end
|
8
20
|
end
|
data/taskmaster.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{taskmaster}
|
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 = ["Ben Scofield"]
|
@@ -37,7 +37,7 @@ Gem::Specification.new do |s|
|
|
37
37
|
s.homepage = %q{http://github.com/bscofield/taskmaster}
|
38
38
|
s.licenses = ["MIT"]
|
39
39
|
s.require_paths = ["lib"]
|
40
|
-
s.rubygems_version = %q{1.
|
40
|
+
s.rubygems_version = %q{1.3.9.2}
|
41
41
|
s.summary = %q{Make your Ruby classes cron-aware}
|
42
42
|
|
43
43
|
if s.respond_to? :specification_version then
|
@@ -46,25 +46,28 @@ Gem::Specification.new do |s|
|
|
46
46
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
47
47
|
s.add_runtime_dependency(%q<whenever>, [">= 0"])
|
48
48
|
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
49
|
-
s.add_development_dependency(%q<bundler>, ["~> 1
|
49
|
+
s.add_development_dependency(%q<bundler>, ["~> 1"])
|
50
50
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
|
51
51
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
52
52
|
s.add_development_dependency(%q<rake>, ["= 0.8.7"])
|
53
|
+
s.add_development_dependency(%q<mocha>, ["~> 0.9"])
|
53
54
|
else
|
54
55
|
s.add_dependency(%q<whenever>, [">= 0"])
|
55
56
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
56
|
-
s.add_dependency(%q<bundler>, ["~> 1
|
57
|
+
s.add_dependency(%q<bundler>, ["~> 1"])
|
57
58
|
s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
|
58
59
|
s.add_dependency(%q<rcov>, [">= 0"])
|
59
60
|
s.add_dependency(%q<rake>, ["= 0.8.7"])
|
61
|
+
s.add_dependency(%q<mocha>, ["~> 0.9"])
|
60
62
|
end
|
61
63
|
else
|
62
64
|
s.add_dependency(%q<whenever>, [">= 0"])
|
63
65
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
64
|
-
s.add_dependency(%q<bundler>, ["~> 1
|
66
|
+
s.add_dependency(%q<bundler>, ["~> 1"])
|
65
67
|
s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
|
66
68
|
s.add_dependency(%q<rcov>, [">= 0"])
|
67
69
|
s.add_dependency(%q<rake>, ["= 0.8.7"])
|
70
|
+
s.add_dependency(%q<mocha>, ["~> 0.9"])
|
68
71
|
end
|
69
72
|
end
|
70
73
|
|
data/test/helper.rb
CHANGED
data/test/test_taskmaster.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
+
module Rails
|
4
|
+
def self.root
|
5
|
+
Pathname.new('/root/hydra')
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
3
9
|
class TestTaskmaster < Test::Unit::TestCase
|
4
10
|
def test_constants_should_exist
|
5
11
|
assert_nothing_raised do
|
@@ -8,11 +14,80 @@ class TestTaskmaster < Test::Unit::TestCase
|
|
8
14
|
end
|
9
15
|
end
|
10
16
|
|
17
|
+
def test_taskmaster_should_know_generated_whenever_syntax
|
18
|
+
expected = <<-WHENEVERSYNTAX
|
19
|
+
every 600, {} do
|
20
|
+
runner 'FootSoldier.run'
|
21
|
+
end
|
22
|
+
every 3600, {} do
|
23
|
+
runner 'SpecialSoldier.specialty'
|
24
|
+
end
|
25
|
+
every 60, {} do
|
26
|
+
runner 'MultiSoldier.run'
|
27
|
+
end
|
28
|
+
every 3600, {} do
|
29
|
+
runner 'MultiSoldier.specialty'
|
30
|
+
end
|
31
|
+
every 3600, {:at=>20} do
|
32
|
+
runner 'SpecificSoldier.run'
|
33
|
+
end
|
34
|
+
every 3600, {} do
|
35
|
+
command 'CommandSoldier.run'
|
36
|
+
end
|
37
|
+
every 3600, {} do
|
38
|
+
command 'FrequencySoldier.run'
|
39
|
+
end
|
40
|
+
WHENEVERSYNTAX
|
41
|
+
assert_equal expected.strip, Taskmaster.aggregate_whenever.strip
|
42
|
+
end
|
43
|
+
|
11
44
|
def test_taskmaster_should_know_all_output
|
12
|
-
output = Taskmaster.
|
13
|
-
|
14
|
-
assert_equal "0 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''
|
15
|
-
assert_equal "
|
16
|
-
assert_equal "
|
45
|
+
output = Taskmaster.aggregate
|
46
|
+
|
47
|
+
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['FootSoldier']
|
48
|
+
assert_equal "0 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''SpecialSoldier.specialty'\\'''", output['SpecialSoldier']
|
49
|
+
assert_equal "* * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''MultiSoldier.run'\\'''", output['MultiSoldier'].split(/\n+/)[0]
|
50
|
+
assert_equal "0 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''MultiSoldier.specialty'\\'''", output['MultiSoldier'].split(/\n+/)[1]
|
17
51
|
end
|
52
|
+
|
53
|
+
def test_taskmaster_should_not_know_an_app_name_when_not_in_rails
|
54
|
+
Rails.expects(:root).raises(StandardError)
|
55
|
+
assert_equal "application", Taskmaster.application
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_taskmaster_should_know_a_rails_app_name
|
59
|
+
assert_equal "hydra", Taskmaster.application
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_taskmaster_should_generate_sectioned_crontab_format
|
63
|
+
expected = <<-OUTOUTDAMNEDSPOT
|
64
|
+
#-- begin Taskmaster cron for hydra - FootSoldier
|
65
|
+
0,10,20,30,40,50 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''FootSoldier.run'\\'''
|
66
|
+
#-- end Taskmaster cron for hydra - FootSoldier
|
67
|
+
|
68
|
+
#-- begin Taskmaster cron for hydra - SpecialSoldier
|
69
|
+
0 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''SpecialSoldier.specialty'\\'''
|
70
|
+
#-- end Taskmaster cron for hydra - SpecialSoldier
|
71
|
+
|
72
|
+
#-- begin Taskmaster cron for hydra - MultiSoldier
|
73
|
+
* * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''MultiSoldier.run'\\'''
|
74
|
+
|
75
|
+
0 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''MultiSoldier.specialty'\\'''
|
76
|
+
#-- end Taskmaster cron for hydra - MultiSoldier
|
77
|
+
|
78
|
+
#-- begin Taskmaster cron for hydra - SpecificSoldier
|
79
|
+
20 * * * * /bin/bash -l -c 'cd /Users/benscofield/personal/util/taskmaster && script/runner -e production '\\''SpecificSoldier.run'\\'''
|
80
|
+
#-- end Taskmaster cron for hydra - SpecificSoldier
|
81
|
+
|
82
|
+
#-- begin Taskmaster cron for hydra - CommandSoldier
|
83
|
+
0 * * * * /bin/bash -l -c 'CommandSoldier.run'
|
84
|
+
#-- end Taskmaster cron for hydra - CommandSoldier
|
85
|
+
|
86
|
+
#-- begin Taskmaster cron for hydra - FrequencySoldier
|
87
|
+
0 * * * * /bin/bash -l -c 'FrequencySoldier.run'
|
88
|
+
#-- end Taskmaster cron for hydra - FrequencySoldier
|
89
|
+
OUTOUTDAMNEDSPOT
|
90
|
+
|
91
|
+
assert_equal expected, Taskmaster.cron_output
|
92
|
+
end
|
18
93
|
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.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -14,7 +14,7 @@ default_executable:
|
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: whenever
|
17
|
-
requirement: &
|
17
|
+
requirement: &2152243520 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2152243520
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: activesupport
|
28
|
-
requirement: &
|
28
|
+
requirement: &2152243040 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,21 +33,21 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2152243040
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: bundler
|
39
|
-
requirement: &
|
39
|
+
requirement: &2152242560 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
43
43
|
- !ruby/object:Gem::Version
|
44
|
-
version: 1
|
44
|
+
version: '1'
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2152242560
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: jeweler
|
50
|
-
requirement: &
|
50
|
+
requirement: &2152242080 !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: *
|
58
|
+
version_requirements: *2152242080
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: rcov
|
61
|
-
requirement: &
|
61
|
+
requirement: &2152241600 !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: *
|
69
|
+
version_requirements: *2152241600
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rake
|
72
|
-
requirement: &
|
72
|
+
requirement: &2152241120 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - =
|
@@ -77,7 +77,18 @@ dependencies:
|
|
77
77
|
version: 0.8.7
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *2152241120
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: mocha
|
83
|
+
requirement: &2152240640 !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ~>
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0.9'
|
89
|
+
type: :development
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: *2152240640
|
81
92
|
description: Taskmaster allows you to easily make your Ruby classes aware of cron.
|
82
93
|
email: git@turrean.com
|
83
94
|
executables: []
|
@@ -118,7 +129,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
118
129
|
version: '0'
|
119
130
|
segments:
|
120
131
|
- 0
|
121
|
-
hash:
|
132
|
+
hash: 3484259382040423965
|
122
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
134
|
none: false
|
124
135
|
requirements:
|
@@ -127,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
138
|
version: '0'
|
128
139
|
requirements: []
|
129
140
|
rubyforge_project:
|
130
|
-
rubygems_version: 1.
|
141
|
+
rubygems_version: 1.3.9.2
|
131
142
|
signing_key:
|
132
143
|
specification_version: 3
|
133
144
|
summary: Make your Ruby classes cron-aware
|