jbarnette-lather 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -37,33 +37,34 @@ If you want to mess with the polling interval:
37
37
 
38
38
  require "rake/lathertask"
39
39
 
40
- Rake::LatherTask.new "lib/**/*.rb" do |task|
41
- task.target = :test # default
42
- task.globs << "test/**/*_test.rb"
40
+ Rake::LatherTask.new "lib/**/*.rb" do |l|
41
+ l.target = :something
42
+ l.globs << "ext/**/*.{c,h}"
43
43
  end
44
44
 
45
45
  This creates a `lather` task, which will call the `target` task any
46
- time the `globs` change. The block is optional.
46
+ time the `globs` change. The block is optional: `target` defaults to
47
+ `:test`.
47
48
 
48
- You can also use Lather's replacement for Rake's `TestTask` for even
49
- nicer integration:
49
+ If `target` is set to an **instance** of `Rake::TestTask`, some
50
+ special behavior is enabled: Lather will add the test task's file list
51
+ to `globs`, and will set the `TEST` environment variable to the list
52
+ of tests that need to be run.
50
53
 
51
- require "rake/lathertesttask"
52
-
53
- Rake::LatherTestTask.new do |test|
54
-
55
- # These are the defaults, you don't need to specify 'em.
54
+ require "rake/testtask"
55
+ require "rake/lathertask"
56
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
57
+ test = Rake::TestTask.new do |t|
58
+ t.libs << "test"
59
+ t.test_files = "test/**/*_test.rb"
63
60
  end
64
61
 
65
- This creates `test` and `test:lather` tasks. The block is
66
- optional. See Lather's `Rakefile` for a working example.
62
+ Rake::LatherTask.new "lib/**/*.rb", :target => test
63
+
64
+ The heuristic is really simple: If `lib/foo.rb` changes, any test
65
+ whose path contains `foo` will be run. There's no tracking of failures
66
+ or single test runs. If you want more than this, you should be using
67
+ Autotest.
67
68
 
68
69
  ## Installing
69
70
 
@@ -71,28 +72,24 @@ optional. See Lather's `Rakefile` for a working example.
71
72
 
72
73
  ## Hacking
73
74
 
74
- `rake test:lather` will watch `lib` and `test` and re-run the tests when
75
- something changes. If you're looking for something to work on, chew on
76
- these:
75
+ If you're looking for something to work on, chew on these:
77
76
 
78
- * A way to get at the list of changed files in a `-r` command and
79
- the Rake tasks.
77
+ * A way to get at the list of changed files in a `-r` command.
80
78
 
81
79
  * Some default exclude (like backup/editor files, `.svn`, `.git`)
82
80
  patterns, and an easy way to add new ones.
83
81
 
84
- * A `--sleep <secs>` switch for the command-line tool and the Rake
85
- task.
82
+ * A `--sleep <secs>` switch for the command-line tool.
86
83
 
87
84
  ## Thanks
88
85
 
89
86
  Lather owes a huge debt to Ryan Davis' ZenTest library, specifically
90
- `autotest`. Use it. It'll change your life. See also Mike Clark and
91
- Geoffrey Grosenbach's `rstakeout`.
87
+ `autotest`. Use it. See also Mike Clark and Geoffrey Grosenbach's
88
+ `rstakeout`.
92
89
 
93
90
  ## License
94
91
 
95
- Copyright 2009 John Barnette [jbarnette@gmail.com]
92
+ Copyright 2009 John Barnette, Seattle.rb.
96
93
 
97
94
  Permission is hereby granted, free of charge, to any person obtaining
98
95
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -2,7 +2,12 @@ require "rubygems/specification"
2
2
  require "rake/testtask"
3
3
 
4
4
  require "./lib/lather"
5
- require "./lib/rake/lathertesttask"
5
+ require "./lib/rake/lathertask"
6
+
7
+ desc "Straighten up"
8
+ task :clean do
9
+ rm_rf "*.gem"
10
+ end
6
11
 
7
12
  namespace :gem do
8
13
  LATHER = Gem::Specification.new do |s|
@@ -33,13 +38,16 @@ namespace :gem do
33
38
  end
34
39
 
35
40
  desc "Build and install the gem"
36
- task :install => gemfile do
41
+ task :install => [gemfile, :clean] do
37
42
  sh "sudo gem install #{LATHER.name}-#{LATHER.version}.gem"
38
43
  end
39
44
  end
40
45
 
41
- Rake::LatherTestTask.new do |test|
42
- test.flags << "-rhelper"
46
+ test = Rake::TestTask.new do |t|
47
+ t.libs << "test"
48
+ t.ruby_opts << "-rhelper"
49
+ t.test_files = "test/**/*_test.rb"
43
50
  end
44
51
 
45
52
  task :default => :test
53
+ Rake::LatherTask.new "lib/**/*.rb", :target => test
@@ -1,3 +1,3 @@
1
1
  module Lather
2
- VERSION = "1.2.1"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -13,32 +13,91 @@ module Rake
13
13
 
14
14
  attr_accessor :globs
15
15
 
16
- # The task to run when things change. Default is <tt>:test</tt>.
16
+ # A hash of options, most of which are passed on to
17
+ # <tt>Lather::Watcher</tt>.
18
+
19
+ attr_accessor :options
20
+
21
+ # The task to run when things change. Default is
22
+ # <tt>:test</tt>. If this is an instance of
23
+ # <tt>Rake::TestTask</tt>, the task's <tt>pattern</tt> will be
24
+ # added to <tt>globs</tt>, and the <tt>TEST</tt> environment
25
+ # variable will be set to a glob of changed tests before each
26
+ # invocation.
17
27
 
18
28
  attr_accessor :target
19
29
 
20
30
  def initialize *globs, &block
21
- @target = :test
22
- @globs = globs
31
+ @options = Hash === globs.last ? globs.pop : {}
32
+ @globs = globs
33
+ @target = @options.delete(:target) || :test
34
+
35
+ @changed = case @target
36
+ when Rake::TestTask then handle_rake_test_task
37
+ else lambda {}
38
+ end
23
39
 
24
40
  yield self if block_given?
25
41
 
26
- desc "Rinse and repeat"
27
- Rake::Task.define_task :lather do
28
- watcher = Lather::Watcher.new @globs do
29
- target = Rake::Task[@target]
42
+ @target = Rake::Task[@target]
30
43
 
44
+ desc "Rinse and repeat"
45
+ task :lather do
46
+ watcher = Lather::Watcher.new @globs, @options do |changed|
31
47
  begin
32
- target.invoke
48
+ @changed[changed]
49
+ @target.invoke
33
50
  rescue StandardError => e
34
51
  raise e unless e.to_s =~ /^Command failed/
35
52
  ensure
36
- target.reenable
53
+ reenable @target
37
54
  end
38
55
  end
39
56
 
40
57
  watcher.go!
41
58
  end
42
59
  end
60
+
61
+ # Get and set the block called each time a file matching one of
62
+ # the <tt>globs</tt> changes. Default is <tt>lambda {}</tt>.
63
+
64
+ def changed &block
65
+ return @changed unless block_given?
66
+ @changed = block
67
+ end
68
+
69
+ private
70
+
71
+ def reenable target
72
+ target.reenable
73
+ target.prerequisites.each { |p| reenable Rake::Task[p] }
74
+ end
75
+
76
+ # Special setup when <tt>target</tt> is a <tt>Rake::TestTask</tt>.
77
+
78
+ def handle_rake_test_task
79
+ test_task = @target
80
+ all_tests = test_task.file_list
81
+
82
+ @target = test_task.name
83
+ @globs << test_task.file_list
84
+ @options[:force] = true
85
+
86
+ @changed = lambda do |changed|
87
+ tests = all_tests & changed
88
+
89
+ basenames = (changed - tests).collect do |f|
90
+ File.basename(f).split(".").first
91
+ end
92
+
93
+ tests.concat all_tests.
94
+ select { |t| basenames.any? { |b| t =~ /#{b}/ } }
95
+
96
+ tests = all_tests.dup if tests.empty?
97
+
98
+ # Nice API, Rake::TestTask.
99
+ ENV["TEST"] = "{#{tests.uniq.join(',')}}"
100
+ end
101
+ end
43
102
  end
44
103
  end
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.2.1
4
+ version: 1.3.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-06 00:00:00 -08:00
12
+ date: 2009-02-08 00:00:00 -08:00
13
13
  default_executable: lather
14
14
  dependencies: []
15
15
 
@@ -32,7 +32,6 @@ files:
32
32
  - lib/lather.rb
33
33
  - lib/rake
34
34
  - lib/rake/lathertask.rb
35
- - lib/rake/lathertesttask.rb
36
35
  - test/helper.rb
37
36
  - test/lather
38
37
  - test/lather/cli_test.rb
@@ -1,118 +0,0 @@
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, [:tests] do |task, args|
67
-
68
- tests = if args.tests.nil? || args.tests.empty?
69
- FileList[@tests]
70
- else
71
- args.tests
72
- end
73
-
74
- cmd = @flags.dup
75
- cmd << "-I#{@libs.join(':')}"
76
- cmd << "-e 'ARGV.each { |f| load f }'"
77
-
78
- cmd.concat tests.collect { |f| "'#{f}'" }.sort_by { rand }
79
- cmd.concat @extras
80
-
81
- RakeFileUtils.verbose(@verbose) { ruby cmd.join(" ") }
82
- end
83
-
84
- namespace :test do
85
- desc "Test, rinse, repeat"
86
- task :lather do
87
- watcher = Lather::Watcher.new @files, @tests, @options do |changed|
88
- all_tests = FileList[@tests]
89
- tests = all_tests & changed
90
-
91
- basenames = (changed - tests).collect do |f|
92
- File.basename(f).split(".").first
93
- end
94
-
95
- tests.concat all_tests.
96
- select { |t| basenames.any? { |b| t =~ /#{b}/ } }
97
-
98
- task = Rake::Task[:test]
99
-
100
- begin
101
- task.invoke tests.uniq
102
- rescue StandardError => e
103
- raise e unless e.to_s =~ /^Command failed/
104
- ensure
105
-
106
- # FIXME: walk the whole tree
107
-
108
- task.reenable
109
- task.prerequisites.each { |p| Rake::Task[p].reenable }
110
- end
111
- end
112
-
113
- watcher.go!
114
- end
115
- end
116
- end
117
- end
118
- end