kicker 2.1.0 → 2.2.0
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/.gitignore +10 -0
- data/.kick +37 -0
- data/README.rdoc +24 -21
- data/Rakefile +0 -1
- data/TODO.rdoc +4 -34
- data/VERSION +1 -0
- data/html/images/kikker.jpg +0 -0
- data/kicker.gemspec +106 -0
- data/lib/kicker.rb +46 -60
- data/lib/kicker/callback_chain.rb +4 -4
- data/lib/kicker/core_ext.rb +9 -1
- data/lib/kicker/growl.rb +54 -19
- data/lib/kicker/log_status_helper.rb +38 -0
- data/lib/kicker/options.rb +59 -34
- data/lib/kicker/recipes.rb +58 -0
- data/lib/kicker/recipes/could_not_handle_file.rb +5 -3
- data/lib/kicker/recipes/dot_kick.rb +17 -5
- data/lib/kicker/recipes/execute_cli_command.rb +1 -1
- data/lib/kicker/recipes/ignore.rb +8 -6
- data/lib/kicker/recipes/jstest.rb +7 -5
- data/lib/kicker/recipes/rails.rb +108 -43
- data/lib/kicker/recipes/ruby.rb +155 -0
- data/lib/kicker/utils.rb +36 -32
- data/test/callback_chain_test.rb +1 -1
- data/test/core_ext_test.rb +15 -5
- data/test/filesystem_change_test.rb +1 -1
- data/test/growl_test.rb +85 -0
- data/test/initialization_test.rb +25 -56
- data/test/log_status_helper_test.rb +56 -0
- data/test/options_test.rb +50 -12
- data/test/recipes/could_not_handle_file_test.rb +10 -0
- data/test/recipes/dot_kick_test.rb +1 -5
- data/test/recipes/execute_cli_command_test.rb +3 -3
- data/test/recipes/ignore_test.rb +1 -1
- data/test/recipes/jstest_test.rb +1 -1
- data/test/recipes/rails_test.rb +118 -18
- data/test/recipes/ruby_test.rb +154 -0
- data/test/recipes_test.rb +39 -0
- data/test/test_helper.rb +1 -1
- data/test/utils_test.rb +103 -48
- metadata +19 -6
- data/VERSION.yml +0 -4
- data/lib/kicker/validate.rb +0 -24
data/.gitignore
ADDED
data/.kick
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
recipe :ignore
|
2
|
+
recipe :ruby
|
3
|
+
|
4
|
+
process do |files|
|
5
|
+
test_files = files.take_and_map do |file|
|
6
|
+
case file
|
7
|
+
when %r{^lib/kicker(\.rb|/validate\.rb|/growl\.rb)$}
|
8
|
+
["test/initialization_test.rb", ("test/filesystem_change_test.rb" if $1 == '.rb')]
|
9
|
+
when %r{^lib/kicker/(.+)\.rb$}
|
10
|
+
"test/#{$1}_test.rb"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Ruby.run_tests test_files
|
15
|
+
end
|
16
|
+
|
17
|
+
process do |files|
|
18
|
+
execute("rake docs:generate && open -a Safari html/index.html") if files.delete("README.rdoc")
|
19
|
+
end
|
20
|
+
|
21
|
+
startup do
|
22
|
+
log "Good choice mate!"
|
23
|
+
end
|
24
|
+
|
25
|
+
# process do
|
26
|
+
# execute "ls -l" do |status|
|
27
|
+
# if status.before?
|
28
|
+
# status.stdout? ? "Here we go!: #{status.command}" : "Here we go! GROWL"
|
29
|
+
# elsif status.after?
|
30
|
+
# if status.success?
|
31
|
+
# status.stdout? ? "Nice!\n\n#{status.output}" : "Nice!"
|
32
|
+
# else
|
33
|
+
# status.stdout? ? "Damn brow!\n\n#{status.output}" : "Damn bro!"
|
34
|
+
# end
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
# end
|
data/README.rdoc
CHANGED
@@ -11,21 +11,22 @@ feel offended; live with it.</i>
|
|
11
11
|
|
12
12
|
== Installation
|
13
13
|
|
14
|
-
$
|
14
|
+
$ gem install kicker -s http://gemcutter.org
|
15
15
|
|
16
16
|
== The short version
|
17
17
|
|
18
|
-
Usage: kicker [options] [paths to watch]
|
19
|
-
|
18
|
+
Usage: ./bin/kicker [options] [paths to watch]
|
19
|
+
|
20
|
+
Available recipes: active_record, ignore, jstest, rails, ruby.
|
21
|
+
|
22
|
+
-s, --silent Keep output to a minimum.
|
20
23
|
--[no-]growl Whether or not to use Growl. Default is to use growl.
|
21
24
|
--growl-command [COMMAND] The command to execute when the Growl succeeded message is clicked.
|
22
|
-
-l, --latency [FLOAT] The time to collect file change events before acting on them. Defaults to 1
|
25
|
+
-l, --latency [FLOAT] The time to collect file change events before acting on them. Defaults to 1 second.
|
23
26
|
-r, --recipe [NAME] A named recipe to load.
|
27
|
+
-e, --execute [COMMAND] The command to execute.
|
28
|
+
-b, --ruby [PATH] Use an alternate Ruby binary for spawned test runners. (Default is `ruby')
|
24
29
|
|
25
|
-
Available recipes:
|
26
|
-
- ignore
|
27
|
-
- jstest
|
28
|
-
- rails
|
29
30
|
|
30
31
|
== The long version
|
31
32
|
|
@@ -55,9 +56,10 @@ the <tt>rails</tt> recipe will map models, concerns, controllers, helpers, and
|
|
55
56
|
views to their respective test files. These will then all be ran with Ruby.
|
56
57
|
|
57
58
|
A few recipes come shipped with Kicker:
|
59
|
+
* Typical Ruby library.
|
58
60
|
* Ruby on Rails, as aforementioned.
|
59
|
-
* JavaScript tests, needs
|
60
|
-
HeadlessSquirrel[http://github.com/Fingertips/Headless-squirrel]
|
61
|
+
* JavaScript tests, to run it needs
|
62
|
+
HeadlessSquirrel[http://github.com/Fingertips/Headless-squirrel].
|
61
63
|
* Ignore, ignores logs, tmp, and svn and git files.
|
62
64
|
|
63
65
|
Add your own shared recipes to <tt>~/.kick</tt>.
|
@@ -111,7 +113,7 @@ be added:
|
|
111
113
|
end
|
112
114
|
end
|
113
115
|
|
114
|
-
|
116
|
+
Ruby.run_tests test_files
|
115
117
|
end
|
116
118
|
|
117
119
|
The files list is iterated over with the Array#take_and_map method, which both
|
@@ -119,23 +121,24 @@ removes and maps the results. This is an easy way to do a common thing in
|
|
119
121
|
recipes. See Kicker::ArrayExt for details.
|
120
122
|
|
121
123
|
The handler then checks if the file is a mailer view and if so runs the
|
122
|
-
mailers test case.
|
124
|
+
mailers test case. Ruby.run_tests runs them with something like the following
|
123
125
|
command:
|
124
126
|
|
125
127
|
execute "ruby -r #{test_files.join(' -r ')} -e ''" unless test_files.empty?
|
126
128
|
|
127
129
|
See Kernel for more info on the utility methods.
|
128
130
|
|
129
|
-
|
131
|
+
To load recipes from your <tt>~/.kick</tt> file:
|
130
132
|
|
131
|
-
|
132
|
-
added to the load path, so any recipes can be required. Once they’re required
|
133
|
-
they are added to the callback chains.
|
134
|
-
|
135
|
-
As an example, say you might want to ignore files in <tt>./data</tt>:
|
136
|
-
|
137
|
-
require 'ignore'
|
133
|
+
recipe :ignore
|
138
134
|
ignore(/^data\//)
|
139
135
|
|
140
136
|
That’s basically it, just remember that the order of specifying handlers _can_
|
141
|
-
be important in your decision on where to specify handlers.
|
137
|
+
be important in your decision on where to specify handlers.
|
138
|
+
|
139
|
+
== Contributors
|
140
|
+
|
141
|
+
* Manfred Stienstra (@manfred)
|
142
|
+
* Cristi Balan (@evilchelu)
|
143
|
+
* Damir Zekic (@sidonath)
|
144
|
+
* Adam Keys (@therealadam)
|
data/Rakefile
CHANGED
@@ -11,7 +11,6 @@ begin
|
|
11
11
|
gem.email = "eloy.de.enige@gmail.com"
|
12
12
|
gem.homepage = "http://github.com/alloy/kicker"
|
13
13
|
gem.authors = ["Eloy Duran"]
|
14
|
-
gem.executables << 'kicker'
|
15
14
|
gem.files.concat FileList['vendor/**/*']
|
16
15
|
gem.require_paths = ["lib", "vendor"]
|
17
16
|
gem.has_rdoc = true
|
data/TODO.rdoc
CHANGED
@@ -1,35 +1,5 @@
|
|
1
|
+
* Move larger parts of README to the GitHub wiki so the README is to the point.
|
1
2
|
* Add a recipe which implements the basic autotest mapping API.
|
2
|
-
*
|
3
|
-
|
4
|
-
|
5
|
-
[Thu Oct 01 17:21:04 +0200 2009]
|
6
|
-
[Thu Oct 01 17:21:05 +0200 2009]
|
7
|
-
[Thu Oct 01 17:21:05 +0200 2009] Could not handle: tmp/_variants, tmp/_variants/review_photos, tmp/_variants/review_photos/kh, tmp/_variants/review_photos/kh/57, tmp/_variants/review_photos/kh/57/ll, tmp/_variants/review_photos/kh/57/ll/40
|
8
|
-
[Thu Oct 01 17:21:05 +0200 2009]
|
9
|
-
[Thu Oct 01 17:21:15 +0200 2009]
|
10
|
-
[Thu Oct 01 17:21:15 +0200 2009] Could not handle: tmp/_variants, tmp/_variants/flyers, tmp/_variants/flyers/rx, tmp/_variants/flyers/rx/84, tmp/_variants/flyers/rx/84/mc, tmp/_variants/flyers/rx/84/mc/22
|
11
|
-
[Thu Oct 01 17:21:15 +0200 2009]
|
12
|
-
[Thu Oct 01 17:21:16 +0200 2009]
|
13
|
-
[Thu Oct 01 17:21:16 +0200 2009] Could not handle: tmp/_variants, tmp/_variants/images, tmp/_variants/images/mr, tmp/_variants/images/mr/36, tmp/_variants/images/mr/36/as, tmp/_variants/images/mr/36/as/85
|
14
|
-
[Thu Oct 01 17:21:16 +0200 2009]
|
15
|
-
[Thu Oct 01 17:21:17 +0200 2009]
|
16
|
-
[Thu Oct 01 17:21:17 +0200 2009] Could not handle: tmp/_variants/images/zm/86/ez/68
|
17
|
-
[Thu Oct 01 17:21:17 +0200 2009]
|
18
|
-
[Thu Oct 01 17:21:19 +0200 2009]
|
19
|
-
[Thu Oct 01 17:21:19 +0200 2009] Could not handle: tmp/_variants, tmp/_variants/review_photos, tmp/_variants/review_photos/xd, tmp/_variants/review_photos/xd/81, tmp/_variants/review_photos/xd/81/wd, tmp/_variants/review_photos/xd/81/wd/97
|
20
|
-
[Thu Oct 01 17:21:19 +0200 2009]
|
21
|
-
/Library/Ruby/Gems/1.8/gems/kicker-2.0.2/lib/kicker.rb:115:in `files_in_directory': undefined method `map' for nil:NilClass (NoMethodError)
|
22
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/lib/kicker.rb:110:in `changed_files'
|
23
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/lib/kicker.rb:109:in `map'
|
24
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/lib/kicker.rb:109:in `changed_files'
|
25
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/lib/kicker.rb:102:in `process'
|
26
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/lib/kicker.rb:88:in `run_watch_dog!'
|
27
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/vendor/rucola/fsevents.rb:112:in `call'
|
28
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/vendor/rucola/fsevents.rb:112:in `initialize'
|
29
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/lib/kicker.rb:81:in `call'
|
30
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/lib/kicker.rb:81:in `CFRunLoopRun'
|
31
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/lib/kicker.rb:81:in `start'
|
32
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/lib/kicker.rb:35:in `run'
|
33
|
-
from /Library/Ruby/Gems/1.8/gems/kicker-2.0.2/bin/kicker:5
|
34
|
-
from /usr/bin/kicker:19:in `load'
|
35
|
-
from /usr/bin/kicker:19
|
3
|
+
* Make the loggers, stdout and growl, work in a chain so one can add others.
|
4
|
+
This should improve portability as well, as people can easily insert growl
|
5
|
+
alternatives for their platform.
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.2.0
|
Binary file
|
data/kicker.gemspec
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{kicker}
|
8
|
+
s.version = "2.2.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Eloy Duran"]
|
12
|
+
s.date = %q{2009-11-29}
|
13
|
+
s.default_executable = %q{kicker}
|
14
|
+
s.email = %q{eloy.de.enige@gmail.com}
|
15
|
+
s.executables = ["kicker"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"LICENSE",
|
18
|
+
"README.rdoc"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".gitignore",
|
22
|
+
".kick",
|
23
|
+
"LICENSE",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"TODO.rdoc",
|
27
|
+
"VERSION",
|
28
|
+
"bin/kicker",
|
29
|
+
"html/images/kikker.jpg",
|
30
|
+
"kicker.gemspec",
|
31
|
+
"lib/kicker.rb",
|
32
|
+
"lib/kicker/callback_chain.rb",
|
33
|
+
"lib/kicker/core_ext.rb",
|
34
|
+
"lib/kicker/growl.rb",
|
35
|
+
"lib/kicker/log_status_helper.rb",
|
36
|
+
"lib/kicker/options.rb",
|
37
|
+
"lib/kicker/recipes.rb",
|
38
|
+
"lib/kicker/recipes/could_not_handle_file.rb",
|
39
|
+
"lib/kicker/recipes/dot_kick.rb",
|
40
|
+
"lib/kicker/recipes/execute_cli_command.rb",
|
41
|
+
"lib/kicker/recipes/ignore.rb",
|
42
|
+
"lib/kicker/recipes/jstest.rb",
|
43
|
+
"lib/kicker/recipes/rails.rb",
|
44
|
+
"lib/kicker/recipes/ruby.rb",
|
45
|
+
"lib/kicker/utils.rb",
|
46
|
+
"test/callback_chain_test.rb",
|
47
|
+
"test/core_ext_test.rb",
|
48
|
+
"test/filesystem_change_test.rb",
|
49
|
+
"test/fixtures/a_file_thats_reloaded.rb",
|
50
|
+
"test/growl_test.rb",
|
51
|
+
"test/initialization_test.rb",
|
52
|
+
"test/log_status_helper_test.rb",
|
53
|
+
"test/options_test.rb",
|
54
|
+
"test/recipes/could_not_handle_file_test.rb",
|
55
|
+
"test/recipes/dot_kick_test.rb",
|
56
|
+
"test/recipes/execute_cli_command_test.rb",
|
57
|
+
"test/recipes/ignore_test.rb",
|
58
|
+
"test/recipes/jstest_test.rb",
|
59
|
+
"test/recipes/rails_test.rb",
|
60
|
+
"test/recipes/ruby_test.rb",
|
61
|
+
"test/recipes_test.rb",
|
62
|
+
"test/test_helper.rb",
|
63
|
+
"test/utils_test.rb",
|
64
|
+
"vendor/growlnotifier/growl.rb",
|
65
|
+
"vendor/growlnotifier/growl.rb",
|
66
|
+
"vendor/growlnotifier/growl_helpers.rb",
|
67
|
+
"vendor/growlnotifier/growl_helpers.rb",
|
68
|
+
"vendor/rucola/fsevents.rb",
|
69
|
+
"vendor/rucola/fsevents.rb"
|
70
|
+
]
|
71
|
+
s.homepage = %q{http://github.com/alloy/kicker}
|
72
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
73
|
+
s.require_paths = ["lib", "vendor"]
|
74
|
+
s.rubygems_version = %q{1.3.5}
|
75
|
+
s.summary = %q{A lean, agnostic, flexible file-change watcher, using OS X FSEvents.}
|
76
|
+
s.test_files = [
|
77
|
+
"test/callback_chain_test.rb",
|
78
|
+
"test/core_ext_test.rb",
|
79
|
+
"test/filesystem_change_test.rb",
|
80
|
+
"test/fixtures/a_file_thats_reloaded.rb",
|
81
|
+
"test/growl_test.rb",
|
82
|
+
"test/initialization_test.rb",
|
83
|
+
"test/log_status_helper_test.rb",
|
84
|
+
"test/options_test.rb",
|
85
|
+
"test/recipes/could_not_handle_file_test.rb",
|
86
|
+
"test/recipes/dot_kick_test.rb",
|
87
|
+
"test/recipes/execute_cli_command_test.rb",
|
88
|
+
"test/recipes/ignore_test.rb",
|
89
|
+
"test/recipes/jstest_test.rb",
|
90
|
+
"test/recipes/rails_test.rb",
|
91
|
+
"test/recipes/ruby_test.rb",
|
92
|
+
"test/recipes_test.rb",
|
93
|
+
"test/test_helper.rb",
|
94
|
+
"test/utils_test.rb"
|
95
|
+
]
|
96
|
+
|
97
|
+
if s.respond_to? :specification_version then
|
98
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
99
|
+
s.specification_version = 3
|
100
|
+
|
101
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
102
|
+
else
|
103
|
+
end
|
104
|
+
else
|
105
|
+
end
|
106
|
+
end
|
data/lib/kicker.rb
CHANGED
@@ -4,89 +4,67 @@ require 'rucola/fsevents'
|
|
4
4
|
require 'kicker/callback_chain'
|
5
5
|
require 'kicker/core_ext'
|
6
6
|
require 'kicker/growl'
|
7
|
+
require 'kicker/log_status_helper'
|
7
8
|
require 'kicker/options'
|
8
9
|
require 'kicker/utils'
|
9
|
-
require 'kicker/validate'
|
10
|
-
|
11
|
-
RECIPES_DIR = File.expand_path('../kicker/recipes', __FILE__)
|
12
|
-
$:.unshift RECIPES_DIR
|
13
|
-
require 'could_not_handle_file'
|
14
|
-
require 'execute_cli_command'
|
15
|
-
|
16
|
-
USER_RECIPES_DIR = File.expand_path('~/.kick')
|
17
|
-
$:.unshift USER_RECIPES_DIR if File.exist?(USER_RECIPES_DIR)
|
18
10
|
|
19
11
|
class Kicker #:nodoc:
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
def latency
|
24
|
-
@latency ||= 1
|
25
|
-
end
|
26
|
-
|
27
|
-
def paths
|
28
|
-
@paths ||= %w{ . }
|
29
|
-
end
|
30
|
-
|
31
|
-
def run(argv = ARGV)
|
32
|
-
options = parse_options(argv)
|
33
|
-
load_recipes(options[:recipes]) if options[:recipes]
|
34
|
-
load_dot_kick
|
35
|
-
new(options).start
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def load_dot_kick
|
41
|
-
if File.exist?('.kick')
|
42
|
-
require 'dot_kick'
|
43
|
-
ReloadDotKick.save_state
|
44
|
-
load '.kick'
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def load_recipes(recipes)
|
49
|
-
recipes.each do |recipe|
|
50
|
-
raise "Recipe `#{recipe}' does not exist." unless recipe_exists?(recipe)
|
51
|
-
require recipe
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def recipe_exists?(recipe)
|
56
|
-
File.exist?("#{RECIPES_DIR}/#{recipe}.rb") || File.exist?("#{USER_RECIPES_DIR}/#{recipe}.rb")
|
57
|
-
end
|
12
|
+
def self.run(argv = ARGV)
|
13
|
+
Kicker::Options.parse(argv)
|
14
|
+
new.start
|
58
15
|
end
|
59
16
|
|
60
|
-
attr_reader :
|
17
|
+
attr_reader :last_event_processed_at
|
61
18
|
|
62
|
-
def initialize
|
63
|
-
@paths = (options[:paths] ? options[:paths] : Kicker.paths).map { |path| File.expand_path(path) }
|
64
|
-
@latency = options[:latency] || self.class.latency
|
65
|
-
|
66
|
-
self.class.use_growl = options[:growl]
|
67
|
-
self.class.growl_command = options[:growl_command]
|
68
|
-
|
19
|
+
def initialize
|
69
20
|
finished_processing!
|
70
21
|
end
|
71
22
|
|
23
|
+
def paths
|
24
|
+
@paths ||= Kicker.paths.map { |path| File.expand_path(path) }
|
25
|
+
end
|
26
|
+
|
72
27
|
def start
|
73
28
|
validate_options!
|
74
29
|
|
75
|
-
log "Watching for changes on: #{
|
30
|
+
log "Watching for changes on: #{paths.join(', ')}"
|
76
31
|
log ''
|
77
32
|
|
78
33
|
run_watch_dog!
|
79
|
-
|
80
|
-
|
34
|
+
Kicker::Growl.start! if Kicker::Growl.use?
|
35
|
+
run_startup_chain
|
81
36
|
|
82
37
|
OSX.CFRunLoopRun
|
83
38
|
end
|
84
39
|
|
85
40
|
private
|
86
41
|
|
42
|
+
def validate_options!
|
43
|
+
validate_paths_and_command!
|
44
|
+
validate_paths_exist!
|
45
|
+
end
|
46
|
+
|
47
|
+
def validate_paths_and_command!
|
48
|
+
if startup_chain.empty?
|
49
|
+
puts Kicker::Options.parser.help
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def validate_paths_exist!
|
55
|
+
paths.each do |path|
|
56
|
+
unless File.exist?(path)
|
57
|
+
puts "The given path `#{path}' does not exist"
|
58
|
+
exit 1
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
87
63
|
def run_watch_dog!
|
88
64
|
dirs = @paths.map { |path| File.directory?(path) ? path : File.dirname(path) }
|
89
|
-
watch_dog = Rucola::FSEvents.start_watching(dirs, :latency =>
|
65
|
+
watch_dog = Rucola::FSEvents.start_watching(dirs, :latency => self.class.latency) do |events|
|
66
|
+
process events
|
67
|
+
end
|
90
68
|
|
91
69
|
trap('INT') do
|
92
70
|
log "Exiting…"
|
@@ -95,6 +73,10 @@ class Kicker #:nodoc:
|
|
95
73
|
end
|
96
74
|
end
|
97
75
|
|
76
|
+
def run_startup_chain
|
77
|
+
startup_chain.call([], false)
|
78
|
+
end
|
79
|
+
|
98
80
|
def finished_processing!
|
99
81
|
@last_event_processed_at = Time.now
|
100
82
|
end
|
@@ -135,4 +117,8 @@ class Kicker #:nodoc:
|
|
135
117
|
end
|
136
118
|
end
|
137
119
|
end
|
138
|
-
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# Load this as last, because it actually loads all recipes, so everything has
|
123
|
+
# to be defined before that.
|
124
|
+
require 'kicker/recipes'
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class Kicker
|
2
|
-
class CallbackChain < Array
|
2
|
+
class CallbackChain < Array #:nodoc:
|
3
3
|
alias_method :append_callback, :push
|
4
4
|
alias_method :prepend_callback, :unshift
|
5
5
|
|
@@ -60,9 +60,9 @@ class Kicker
|
|
60
60
|
end
|
61
61
|
|
62
62
|
module Kernel
|
63
|
-
# Adds a handler to the startup chain. This chain is ran
|
64
|
-
#
|
65
|
-
# callback.
|
63
|
+
# Adds a handler to the startup chain. This chain is ran once Kicker is done
|
64
|
+
# loading _before_ starting the normal operations. Note that an empty files
|
65
|
+
# array is given to the callback.
|
66
66
|
#
|
67
67
|
# Takes a +callback+ object that responds to <tt>#call</tt>, or a block.
|
68
68
|
def startup(callback = nil, &block)
|