tconsole 1.0.1pre5 → 1.1.0pre1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/tconsole.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "tconsole/version"
2
2
  require "tconsole/server"
3
+ require "tconsole/test_result"
3
4
 
4
5
  require "readline"
5
6
  require "benchmark"
@@ -36,7 +37,7 @@ module TConsole
36
37
 
37
38
  # A little welcome
38
39
  puts
39
- puts "Welcome to tconsole. Type 'help' for help or 'exit' to quit."
40
+ puts "Welcome to tconsole (v#{TConsole::VERSION}). Type 'help' for help or 'exit' to quit."
40
41
 
41
42
  # Set up our console input handling and history
42
43
  console = Console.new
@@ -133,6 +134,8 @@ module TConsole
133
134
  server.run_uncommitted(args[1])
134
135
  elsif args[0] == "all"
135
136
  server.run_tests(["test/unit/**/*_test.rb", "test/functional/**/*_test.rb", "test/integration/**/*_test.rb"], args[1])
137
+ elsif args[0] == "!failed"
138
+ server.run_failed
136
139
  elsif args[0] == "info"
137
140
  server.run_info
138
141
  else
@@ -154,11 +157,11 @@ module TConsole
154
157
  puts "integration [test_pattern] # Run integration tests"
155
158
  puts "recent [test_pattern] # Run tests for recently changed files"
156
159
  puts "uncommitted [test_pattern] # Run tests for uncommitted changes"
160
+ puts "!failed # Runs the last set of failing tests"
157
161
  puts "[filename] [test_pattern] # Run the tests contained in the given file"
158
162
  puts "reload # Reload your Rails environment"
159
163
  puts "exit # Exit the console"
160
164
  puts
161
- puts
162
165
  puts "Working with test patterns:"
163
166
  puts
164
167
  puts "All of the test execution commands include an optional test_pattern argument. A"
@@ -6,9 +6,21 @@ module TConsole
6
6
  args = ["--name", name_pattern]
7
7
  end
8
8
 
9
- MiniTest::Unit.new.run(args)
9
+ # Make sure we have a recent version of minitest, and use it
10
+ if ::MiniTest::Unit.respond_to?(:runner=)
11
+ ::MiniTest::Unit.runner = TConsole::MiniTestUnit.new
12
+ else
13
+ raise "MiniTest v#{MiniTest::Unit::VERSION} is not compatible with tconsole. Please load a more recent version of MiniTest"
14
+ end
15
+
16
+ # Run it
17
+ runner = MiniTest::Unit.runner
18
+ runner.run(args)
10
19
 
20
+ # Make sure that minitest doesn't run automatically when the process exits
11
21
  patch_minitest
22
+
23
+ runner.results
12
24
  end
13
25
 
14
26
  # We're basically breaking MiniTest autorun here, since we want to manually run our
@@ -18,7 +30,7 @@ module TConsole
18
30
  # rather than rebuilding all of the code in Rake just to get test prep happening
19
31
  # correctly.
20
32
  def self.patch_minitest
21
- MiniTest::Unit.class_eval do
33
+ ::MiniTest::Unit.class_eval do
22
34
  alias_method :old_run, :run
23
35
  def run(args = [])
24
36
  # do nothing
@@ -26,4 +38,40 @@ module TConsole
26
38
  end
27
39
  end
28
40
  end
41
+
42
+ # Custom minitest runner for tconsole
43
+ class MiniTestUnit < ::MiniTest::Unit
44
+ attr_accessor :results
45
+
46
+ def initialize
47
+ self.results = TConsole::TestResult.new
48
+
49
+ super
50
+ end
51
+
52
+ def puke(klass, meth, e)
53
+ e = case e
54
+ when MiniTest::Skip then
55
+ @skips += 1
56
+ results.skips += 1
57
+ return "S" unless @verbose
58
+ "Skipped:\n#{meth}(#{klass}) [#{location e}]:\n#{e.message}\n"
59
+ when MiniTest::Assertion then
60
+ @failures += 1
61
+ results.failures += 1
62
+ results.append_failure_details(klass, meth)
63
+ "Failure:\n#{meth}(#{klass}) [#{location e}]:\n#{e.message}\n"
64
+ else
65
+ @errors += 1
66
+ results.errors += 1
67
+ results.append_failure_details(klass, meth)
68
+ bt = MiniTest::filter_backtrace(e.backtrace).join "\n "
69
+ "Error:\n#{meth}(#{klass}):\n#{e.class}: #{e.message}\n #{bt}\n"
70
+ end
71
+ @report << e
72
+ e[0, 1]
73
+ end
74
+ end
29
75
  end
76
+
77
+
@@ -1,9 +1,10 @@
1
1
  module TConsole
2
2
  class Server
3
- attr_accessor :config
3
+ attr_accessor :config, :last_result
4
4
 
5
5
  def initialize(config)
6
6
  self.config = config
7
+ self.last_result = TConsole::TestResult.new
7
8
  end
8
9
 
9
10
  def stop
@@ -48,7 +49,11 @@ module TConsole
48
49
 
49
50
  def run_tests(globs, name_pattern, message = "Running tests...")
50
51
  time = Benchmark.realtime do
52
+ # Pipe for communicating with child so we can get its results back
53
+ read, write = IO.pipe
54
+
51
55
  fork do
56
+ read.close
52
57
 
53
58
  puts message
54
59
  puts
@@ -63,13 +68,17 @@ module TConsole
63
68
  end
64
69
 
65
70
  if defined? ::ActiveRecord
66
- ::ActiveRecord::Base.connection.reconnect!
71
+ ::ActiveRecord::Base.clear_active_connections!
72
+ ::ActiveRecord::Base.establish_connection
67
73
  end
68
74
 
69
75
  if defined?(::MiniTest)
70
76
  require File.join(File.dirname(__FILE__), "minitest_handler")
71
77
 
72
- MiniTestHandler.run(name_pattern)
78
+ result = MiniTestHandler.run(name_pattern)
79
+
80
+ write.puts([Marshal.dump(result)].pack("m"))
81
+
73
82
  elsif defined?(::Test::Unit)
74
83
  puts "Sorry, but tconsole doesn't support Test::Unit yet"
75
84
  return
@@ -79,6 +88,17 @@ module TConsole
79
88
  end
80
89
  end
81
90
 
91
+ write.close
92
+ response = read.read
93
+ begin
94
+ self.last_result = Marshal.load(response.unpack("m")[0])
95
+ rescue
96
+ # Just in case anything crazy goes down with marshalling
97
+ self.last_result = TConsole::TestResult.new
98
+ end
99
+
100
+ read.close
101
+
82
102
  Process.waitall
83
103
  end
84
104
 
@@ -97,6 +117,15 @@ module TConsole
97
117
  run_tests(files, test_pattern, message)
98
118
  end
99
119
 
120
+ def run_failed
121
+ # TODO: We probably shouldn't use built in Rails methods here if we can help it
122
+ file_names = last_result.failure_details.map { |detail| filenameify(detail[:class]) }
123
+ files_to_rerun = []
124
+
125
+ files_to_rerun << file_names.map {|file| (file.match(/controller/)) ? "test/functional/#{file}.rb" : "test/unit/#{file}.rb"}
126
+ run_tests(files_to_rerun, nil, "Running last failed tests: #{files_to_rerun.join(", ")}")
127
+ end
128
+
100
129
  def recent_files(touched_since, source_pattern, test_path)
101
130
  Dir.glob(source_pattern).map do |path|
102
131
  if File.mtime(path) > touched_since
@@ -149,5 +178,24 @@ module TConsole
149
178
  puts
150
179
  puts
151
180
  end
181
+
182
+ def filenameify(klass_name)
183
+ result = ""
184
+ first = true
185
+ klass_name.chars do |char|
186
+ new = char.downcase!
187
+ if new.nil?
188
+ result << char
189
+ elsif first
190
+ result << new
191
+ else
192
+ result << "_#{new}"
193
+ end
194
+
195
+ first = false
196
+ end
197
+
198
+ result
199
+ end
152
200
  end
153
201
  end
@@ -0,0 +1,27 @@
1
+ module TConsole
2
+ class TestResult
3
+ # The number of failed tests in the last run
4
+ attr_accessor :failures
5
+
6
+ # The number of errors that occurred in the last run
7
+ attr_accessor :errors
8
+
9
+ # The number of skipped tests
10
+ attr_accessor :skips
11
+
12
+ # Details about the failures in the last run
13
+ attr_accessor :failure_details
14
+
15
+ def initialize
16
+ self.failures = 0
17
+ self.errors = 0
18
+ self.skips = 0
19
+ self.failure_details = []
20
+ end
21
+
22
+ # Adds to the failure details that we know about
23
+ def append_failure_details(klass, meth)
24
+ failure_details << { :class => klass.to_s, :method => meth.to_s }
25
+ end
26
+ end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module TConsole
2
- VERSION = "1.0.1pre5"
2
+ VERSION = "1.1.0pre1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tconsole
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1pre5
4
+ version: 1.1.0pre1
5
5
  prerelease: 5
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-30 00:00:00.000000000 Z
12
+ date: 2012-02-10 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! " tconsole allows Rails developers to easily and quickly run their
15
15
  tests as a whole or in subsets. It forks the testing processes from\n a preloaded
@@ -31,6 +31,7 @@ files:
31
31
  - lib/tconsole.rb
32
32
  - lib/tconsole/minitest_handler.rb
33
33
  - lib/tconsole/server.rb
34
+ - lib/tconsole/test_result.rb
34
35
  - lib/tconsole/version.rb
35
36
  - tconsole.gemspec
36
37
  homepage: ''
@@ -45,9 +46,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
45
46
  - - ! '>='
46
47
  - !ruby/object:Gem::Version
47
48
  version: '0'
48
- segments:
49
- - 0
50
- hash: 3424980306917930953
51
49
  required_rubygems_version: !ruby/object:Gem::Requirement
52
50
  none: false
53
51
  requirements: