jbarnette-lather 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +26 -9
- data/Rakefile +3 -9
- data/lib/lather/version.rb +1 -1
- data/lib/lather/watcher.rb +4 -1
- data/lib/rake/lathertask.rb +12 -1
- data/lib/rake/lathertesttask.rb +108 -0
- data/test/lather/cli_test.rb +1 -1
- metadata +3 -2
data/README.markdown
CHANGED
@@ -20,7 +20,6 @@ You can also run a command every time something changes:
|
|
20
20
|
|
21
21
|
## From Code
|
22
22
|
|
23
|
-
require "rubygems"
|
24
23
|
require "lather"
|
25
24
|
|
26
25
|
watcher = Lather::Watcher.new "**/*.rb" do |changed|
|
@@ -39,12 +38,32 @@ If you want to mess with the polling interval:
|
|
39
38
|
require "rake/lathertask"
|
40
39
|
|
41
40
|
Rake::LatherTask.new "lib/**/*.rb" do |task|
|
42
|
-
task.target = :test #
|
41
|
+
task.target = :test # default
|
43
42
|
task.globs << "test/**/*_test.rb"
|
44
43
|
end
|
45
44
|
|
46
|
-
This
|
47
|
-
block is optional.
|
45
|
+
This creates a `lather` task, which will call the `target` task any
|
46
|
+
time the `globs` change. The block is optional.
|
47
|
+
|
48
|
+
You can also use Lather's replacement for Rake's `TestTask` for even
|
49
|
+
nicer integration:
|
50
|
+
|
51
|
+
require "rake/lathertesttask"
|
52
|
+
|
53
|
+
Rake::LatherTestTask.new do |test|
|
54
|
+
|
55
|
+
# These are the defaults, you don't need to specify 'em.
|
56
|
+
|
57
|
+
test.files = %w(lib/**/*.rb)
|
58
|
+
test.flags = %w(-w)
|
59
|
+
test.libs = %w(lib test)
|
60
|
+
test.options = { :force => true }
|
61
|
+
test.tests = %w(test/**/*_test.rb)
|
62
|
+
test.verbose = false
|
63
|
+
end
|
64
|
+
|
65
|
+
This creates `test` and `test:lather` tasks. The block is
|
66
|
+
optional. See Lather's `Rakefile` for a working example.
|
48
67
|
|
49
68
|
## Installing
|
50
69
|
|
@@ -56,10 +75,8 @@ block is optional.
|
|
56
75
|
something changes. If you're looking for something to work on, chew on
|
57
76
|
these:
|
58
77
|
|
59
|
-
* A
|
60
|
-
|
61
|
-
|
62
|
-
* A way to get at the list of changed files in a `-r` command.
|
78
|
+
* A way to get at the list of changed files in a `-r` command and
|
79
|
+
the Rake task.
|
63
80
|
|
64
81
|
* Some default exclude (like backup/editor files, `.svn`, `.git`)
|
65
82
|
patterns, and an easy way to add new ones.
|
@@ -71,7 +88,7 @@ these:
|
|
71
88
|
|
72
89
|
Lather owes a huge debt to Ryan Davis' ZenTest library, specifically
|
73
90
|
`autotest`. Use it. It'll change your life. See also Mike Clark and
|
74
|
-
|
91
|
+
Geoffrey Grosenbach's `rstakeout`.
|
75
92
|
|
76
93
|
## License
|
77
94
|
|
data/Rakefile
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
require "rubygems"
|
2
1
|
require "rubygems/specification"
|
3
2
|
require "rake/testtask"
|
4
3
|
|
5
4
|
require "./lib/lather"
|
6
|
-
require "./lib/rake/
|
5
|
+
require "./lib/rake/lathertesttask"
|
7
6
|
|
8
7
|
namespace :gem do
|
9
8
|
LATHER = Gem::Specification.new do |s|
|
@@ -39,13 +38,8 @@ namespace :gem do
|
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
42
|
-
Rake::
|
43
|
-
test.
|
44
|
-
test.ruby_opts << "-rhelper"
|
45
|
-
test.test_files = FileList["test/**/*_test.rb"]
|
46
|
-
test.verbose = false
|
41
|
+
Rake::LatherTestTask.new do |test|
|
42
|
+
test.flags << "-rhelper"
|
47
43
|
end
|
48
44
|
|
49
45
|
task :default => :test
|
50
|
-
|
51
|
-
Rake::LatherTask.new "{lib,test}/**/*.rb"
|
data/lib/lather/version.rb
CHANGED
data/lib/lather/watcher.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module Lather
|
2
2
|
class Watcher
|
3
3
|
attr_reader :files
|
4
|
+
attr_reader :options
|
4
5
|
|
5
6
|
def initialize *globs, &callback
|
6
7
|
raise ArgumentError, "need a callback" unless block_given?
|
7
8
|
@callback = callback
|
8
9
|
|
9
|
-
@options = { :sleep => 1 }
|
10
|
+
@options = { :force => false, :sleep => 1 }
|
10
11
|
@options.merge!(globs.pop) if globs.last.is_a? Hash
|
11
12
|
|
12
13
|
@globs = globs.flatten
|
@@ -16,6 +17,8 @@ module Lather
|
|
16
17
|
def go!
|
17
18
|
@timestamp = Time.now
|
18
19
|
|
20
|
+
@callback[@files.keys] if @options[:force]
|
21
|
+
|
19
22
|
loop do
|
20
23
|
unless (changed = update_files_and_timestamp).empty?
|
21
24
|
@callback[changed]
|
data/lib/rake/lathertask.rb
CHANGED
@@ -3,8 +3,19 @@ require "rake/tasklib"
|
|
3
3
|
require "lather/watcher"
|
4
4
|
|
5
5
|
module Rake
|
6
|
+
|
7
|
+
# Runs the <tt>target</tt> task any time a file matching one of the
|
8
|
+
# <tt>globs</tt> changes.
|
9
|
+
|
6
10
|
class LatherTask < TaskLib
|
7
|
-
|
11
|
+
|
12
|
+
# An array of globs to watch.
|
13
|
+
|
14
|
+
attr_accessor :globs
|
15
|
+
|
16
|
+
# The task to run when things change. Default is <tt>:test</tt>.
|
17
|
+
|
18
|
+
attr_accessor :target
|
8
19
|
|
9
20
|
def initialize *globs, &block
|
10
21
|
@target = :test
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require "rake"
|
2
|
+
require "rake/tasklib"
|
3
|
+
require "lather/watcher"
|
4
|
+
|
5
|
+
module Rake
|
6
|
+
|
7
|
+
# A simplified version of <tt>Rake::TestTask</tt> with support for
|
8
|
+
# Lather. It creates <tt>test</tt> and <tt>test:lather</tt>
|
9
|
+
# tasks. It's more opinionated and less configurable than
|
10
|
+
# <tt>Rake::TestTask</tt>: Test file load order is random.
|
11
|
+
#
|
12
|
+
# When lathering, a very stupid heuristic is used to decide which
|
13
|
+
# test files to run: Any test file whose path contains the basename
|
14
|
+
# (without extension) of the file that changed. If no test files
|
15
|
+
# match, everything gets run. No tracking of failures, no specific
|
16
|
+
# tests. If you want more than this, you should be using Autotest.
|
17
|
+
|
18
|
+
class LatherTestTask < TaskLib
|
19
|
+
|
20
|
+
# An optional array of stuff to tack on to the end of the Ruby
|
21
|
+
# command-line. Default is <tt>[]</tt>.
|
22
|
+
|
23
|
+
attr_accessor :extras
|
24
|
+
|
25
|
+
# An array of glob patterns to match implementation files. Default
|
26
|
+
# is <tt>%w(lib/**/*.rb)</tt>.
|
27
|
+
|
28
|
+
attr_accessor :files
|
29
|
+
|
30
|
+
# An array of command-line flags to pass on to Ruby. Default is
|
31
|
+
# <tt>%w(-w)</tt>.
|
32
|
+
|
33
|
+
attr_accessor :flags
|
34
|
+
|
35
|
+
# An array of directories to add to the load path. Default is
|
36
|
+
# <tt>%w(lib test)</tt>.
|
37
|
+
|
38
|
+
attr_accessor :libs
|
39
|
+
|
40
|
+
# A hash of options to pass on to <tt>Lather::Watcher.new</tt>.
|
41
|
+
# Default is <tt>{ :force => true }</tt>.
|
42
|
+
|
43
|
+
attr_accessor :options
|
44
|
+
|
45
|
+
# An array of glob patterns to match test files. Default is
|
46
|
+
# <tt>%w(test/**/*_test.rb)</tt>.
|
47
|
+
|
48
|
+
attr_accessor :tests
|
49
|
+
|
50
|
+
# Be chatty? Default is <tt>false</tt>.
|
51
|
+
|
52
|
+
attr_accessor :verbose
|
53
|
+
|
54
|
+
def initialize
|
55
|
+
@extras = []
|
56
|
+
@files = %w(lib/**/*.rb)
|
57
|
+
@flags = %w(-w)
|
58
|
+
@libs = %w(lib test)
|
59
|
+
@options = { :force => true }
|
60
|
+
@tests = %w(test/**/*_test.rb)
|
61
|
+
@verbose = false
|
62
|
+
|
63
|
+
yield self if block_given?
|
64
|
+
|
65
|
+
desc "Run the tests"
|
66
|
+
task(:test) { testify FileList[@tests] }
|
67
|
+
|
68
|
+
namespace :test do
|
69
|
+
|
70
|
+
desc "Test, rinse, repeat"
|
71
|
+
task :lather do
|
72
|
+
watcher = Lather::Watcher.new @files, @tests, @options do |changed|
|
73
|
+
all_tests = FileList[@tests]
|
74
|
+
tests = all_tests & changed
|
75
|
+
|
76
|
+
basenames = (changed - tests).collect do |f|
|
77
|
+
File.basename(f).split(".").first
|
78
|
+
end
|
79
|
+
|
80
|
+
tests.concat all_tests.
|
81
|
+
select { |t| basenames.any? { |b| t =~ /#{b}/ } }
|
82
|
+
|
83
|
+
begin
|
84
|
+
testify tests.empty? ? all_tests : tests.uniq
|
85
|
+
rescue StandardError => e
|
86
|
+
raise e unless e.to_s =~ /^Command failed/
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
watcher.go!
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def testify tests
|
98
|
+
cmd = @flags.dup
|
99
|
+
cmd << "-I#{@libs.join(':')}"
|
100
|
+
cmd << "-e 'ARGV.each { |f| load f }'"
|
101
|
+
|
102
|
+
cmd.concat tests.collect { |f| "'#{f}'" }.sort_by { rand }
|
103
|
+
cmd.concat @extras
|
104
|
+
|
105
|
+
RakeFileUtils.verbose(@verbose) { ruby cmd.join(" ") }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/test/lather/cli_test.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jbarnette-lather
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Barnette
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-02-
|
12
|
+
date: 2009-02-06 00:00:00 -08:00
|
13
13
|
default_executable: lather
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- lib/lather.rb
|
33
33
|
- lib/rake
|
34
34
|
- lib/rake/lathertask.rb
|
35
|
+
- lib/rake/lathertesttask.rb
|
35
36
|
- test/helper.rb
|
36
37
|
- test/lather
|
37
38
|
- test/lather/cli_test.rb
|