ocrunner 0.2.5 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +30 -10
- data/VERSION +1 -1
- data/lib/ocrunner.rb +1 -1
- data/lib/ocrunner/cli.rb +18 -0
- data/lib/ocrunner/console.rb +12 -2
- data/lib/ocrunner/test_runner.rb +58 -18
- data/lib/ocrunner/test_suite.rb +8 -0
- data/ocrunner.gemspec +2 -2
- metadata +4 -4
data/README.rdoc
CHANGED
@@ -13,20 +13,40 @@ To run tests as files are changed (autotest-style), use:
|
|
13
13
|
|
14
14
|
ocrunner --auto
|
15
15
|
|
16
|
+
|
17
|
+
== Signals
|
18
|
+
|
19
|
+
Control-c: kill ocrunner
|
20
|
+
Control-\: toggle verbosity and rerun tests. This is nice for when the pretty filtered output doesn't show quite enough information to you.
|
21
|
+
|
22
|
+
|
23
|
+
== Pretty debug logging with PRPLog()
|
24
|
+
|
25
|
+
This is a little crazy, but ocrunner has support for displaying debug log messaged from your Objective-C code through the use of a custom logging macro. The messages are colored purple in order to make them easier to see in the verbose output. To use this feature, add the following macro to a header or prefix file in your Xcode project:
|
26
|
+
|
27
|
+
#define PRPLog(format, ...) NSLog([NSString stringWithFormat: @"%s:%d:%s:\033[35m%@\033[0m", __PRETTY_FUNCTION__, __LINE__, __FILE__, format] ## __VA_ARGS__)
|
28
|
+
|
29
|
+
ocrunner will display the latest version of this macro when run with --prplog-help.
|
30
|
+
|
31
|
+
|
16
32
|
== I don't like your defaults
|
17
33
|
|
18
34
|
Don't worry, you can specify the target/configuration/sdk options passed to xcodebuild. You can see all the available options by running ocrunner -h:
|
35
|
+
|
36
|
+
--sdk, -s <s>: SDK to build against (default: iphonesimulator3.1.3)
|
37
|
+
--target, -t <s>: Target to build (default: Test)
|
38
|
+
--config, -c <s>: Configuration to use (default: Debug)
|
39
|
+
--parallel, -p: Use multiple processors to build multiple targets (parallelizeTargets) (default: true)
|
40
|
+
--auto, -a: Watch filesystem for changes and run tests when they occur
|
41
|
+
--growl, -g: Report results using Growl
|
42
|
+
--debug-command, -d: Print xcodebuild command and exit
|
43
|
+
--verbose, -v: Display all xcodebuild output after summary
|
44
|
+
--loud-compilation, -l: Always show verbose output when a compilation or linking error occurs (default: true)
|
45
|
+
--prplog, -r: Display PRPLog log messages (default: true)
|
46
|
+
--prplog-help, -o: Print PRPLog code example and exit
|
47
|
+
--version, -e: Print version and exit
|
48
|
+
--help, -h: Show this message
|
19
49
|
|
20
|
-
--sdk, -s <s>: SDK to build against (default: iphonesimulator3.1.3)
|
21
|
-
--target, -t <s>: Target to build (default: Test)
|
22
|
-
--config, -c <s>: Configuration to use (default: Debug)
|
23
|
-
--parallel, -p: Use multiple processors to build multiple targets (parallelizeTargets) (default: true)
|
24
|
-
--auto, -a: Watch filesystem for changes and run tests when they occur
|
25
|
-
--growl, -g: Report results using Growl
|
26
|
-
--debug-command, -d: Print xcodebuild command and exit
|
27
|
-
--verbose, -v: Display all xcodebuild output after summary
|
28
|
-
--version, -e: Print version and exit
|
29
|
-
--help, -h: Show this message
|
30
50
|
|
31
51
|
== Note on Patches/Pull Requests
|
32
52
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/ocrunner.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/ocrunner/cli'
|
2
1
|
require File.dirname(__FILE__) + '/ocrunner/console'
|
2
|
+
require File.dirname(__FILE__) + '/ocrunner/cli'
|
3
3
|
require File.dirname(__FILE__) + '/ocrunner/test_case'
|
4
4
|
require File.dirname(__FILE__) + '/ocrunner/test_error'
|
5
5
|
require File.dirname(__FILE__) + '/ocrunner/test_suite'
|
data/lib/ocrunner/cli.rb
CHANGED
@@ -3,6 +3,11 @@ require 'fssm'
|
|
3
3
|
|
4
4
|
module OCRunner
|
5
5
|
module CLI
|
6
|
+
|
7
|
+
class << self
|
8
|
+
include OCRunner::Console
|
9
|
+
end
|
10
|
+
|
6
11
|
def self.run
|
7
12
|
|
8
13
|
Kernel.trap('INT') { puts; exit }
|
@@ -26,9 +31,22 @@ module OCRunner
|
|
26
31
|
opt :debug_command, "Print xcodebuild command and exit", :type => :boolean, :default => false
|
27
32
|
opt :verbose, "Display all xcodebuild output after summary", :type => :boolean, :default => false
|
28
33
|
opt :loud_compilation, "Always show verbose output when a compilation or linking error occurs", :type => :boolean, :default => true
|
34
|
+
opt :prplog, "Display PRPLog log messages", :type => :boolean, :default => true
|
35
|
+
opt :prplog_help, "Print PRPLog code example and exit", :type => :boolean, :default => false
|
36
|
+
end
|
37
|
+
|
38
|
+
if opts[:prplog_help]
|
39
|
+
present do
|
40
|
+
puts indent blue "Add this to a header or prefix file in your Xcode project:"
|
41
|
+
puts indent '#define PRPLog(format, ...) NSLog([NSString stringWithFormat: @"%s:%d:%s:\033[35m%@\033[0m", __PRETTY_FUNCTION__, __LINE__, __FILE__, format] ## __VA_ARGS__)'
|
42
|
+
end
|
43
|
+
exit
|
29
44
|
end
|
30
45
|
|
31
46
|
execute = Proc.new{ OCRunner::TestRunner.new(opts) }
|
47
|
+
|
48
|
+
Kernel.trap('QUIT') { opts[:verbose] = !opts[:verbose]; execute.call}
|
49
|
+
|
32
50
|
execute.call
|
33
51
|
|
34
52
|
if opts[:auto]
|
data/lib/ocrunner/console.rb
CHANGED
@@ -1,12 +1,22 @@
|
|
1
|
-
# color helpers courtesy of RSpec http://github.com/dchelimsky/rspec
|
1
|
+
# color helpers originally courtesy of RSpec http://github.com/dchelimsky/rspec
|
2
2
|
|
3
3
|
module OCRunner
|
4
4
|
module Console
|
5
5
|
def colorize(text, color_code)
|
6
|
-
"#{color_code}#{text}\033[0m"
|
6
|
+
"#{color_code}#{text.to_s}\033[0m"
|
7
7
|
end
|
8
8
|
|
9
9
|
def red(text); colorize(text, "\033[31m"); end
|
10
10
|
def green(text); colorize(text, "\033[32m"); end
|
11
|
+
def blue(text); colorize(text, "\033[34m"); end
|
12
|
+
|
13
|
+
def indent(text='')
|
14
|
+
" " + text.to_s
|
15
|
+
end
|
16
|
+
def present(&block)
|
17
|
+
puts
|
18
|
+
yield
|
19
|
+
puts
|
20
|
+
end
|
11
21
|
end
|
12
22
|
end
|
data/lib/ocrunner/test_runner.rb
CHANGED
@@ -15,8 +15,8 @@ module OCRunner
|
|
15
15
|
@compilation_error_occurred = false
|
16
16
|
@output = []
|
17
17
|
|
18
|
-
setup
|
19
18
|
build_command
|
19
|
+
setup
|
20
20
|
run_tests
|
21
21
|
summarize
|
22
22
|
display_results
|
@@ -31,37 +31,39 @@ module OCRunner
|
|
31
31
|
@command = "xcodebuild -target #{@options[:target]} -configuration #{@options[:config]} " +
|
32
32
|
"-sdk #{@options[:sdk]} #{@options[:parallel] ? '-parallelizeTargets' : ''} build"
|
33
33
|
if @options[:debug_command]
|
34
|
-
|
34
|
+
present do
|
35
|
+
puts indent @command
|
36
|
+
end
|
35
37
|
exit
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
39
41
|
def run_tests
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
|
43
|
+
puts "ocrunner started. control-c to exit, control-\\ to toggle verbosity\n\n"
|
44
|
+
|
45
|
+
execute @command do |line|
|
46
|
+
@log << line
|
47
|
+
process_console_output(line)
|
48
|
+
$stdout.flush
|
46
49
|
end
|
47
50
|
end
|
48
51
|
|
49
52
|
def summarize
|
50
53
|
|
51
54
|
@suites.each do |suite|
|
52
|
-
suite.
|
53
|
-
out
|
55
|
+
suite.failed_cases.each do |kase|
|
54
56
|
out ' ' + red("[#{suite.name} #{kase.name}] FAIL")
|
55
57
|
kase.errors.each do |error|
|
56
58
|
out ' ' + red(error.message) + " line #{error.line} of #{clean_path(error.path)}"
|
57
59
|
end
|
58
60
|
end
|
59
|
-
out
|
61
|
+
out if suite.failures?
|
60
62
|
end
|
61
63
|
|
62
64
|
@suites.each do |suite|
|
63
|
-
|
64
|
-
out "Suite '#{suite.name}': #{suite.cases.size -
|
65
|
+
number = suite.failed_cases.size
|
66
|
+
out "Suite '#{suite.name}': #{suite.cases.size - number} passes and #{number} failures in #{suite.time} seconds."
|
65
67
|
end
|
66
68
|
|
67
69
|
out
|
@@ -74,7 +76,6 @@ module OCRunner
|
|
74
76
|
end
|
75
77
|
|
76
78
|
def display_results
|
77
|
-
puts
|
78
79
|
puts @log if @options[:verbose] || (compilation_error_occurred && @options[:loud_compilation])
|
79
80
|
puts @output.join("\n")
|
80
81
|
puts
|
@@ -96,6 +97,28 @@ module OCRunner
|
|
96
97
|
end
|
97
98
|
|
98
99
|
def process_console_output(line)
|
100
|
+
|
101
|
+
if @options[:prplog]
|
102
|
+
if line.include?("\033\[35m")
|
103
|
+
line =~ /-(\[.+\]):(\d+):(.+):/
|
104
|
+
out blue("#{$1} on line #{$2} of #{clean_path($3)}:")
|
105
|
+
out line.slice(line.index("\033\[35m")..-1)
|
106
|
+
@debug_output = true
|
107
|
+
return
|
108
|
+
end
|
109
|
+
|
110
|
+
if line.include?("\033[0m")
|
111
|
+
@debug_output = false
|
112
|
+
out line
|
113
|
+
out
|
114
|
+
return
|
115
|
+
end
|
116
|
+
|
117
|
+
if @debug_output
|
118
|
+
out line
|
119
|
+
return
|
120
|
+
end
|
121
|
+
end
|
99
122
|
|
100
123
|
# test case started
|
101
124
|
if line =~ /Test Case '-\[.+ (.+)\]' started/
|
@@ -134,9 +157,9 @@ module OCRunner
|
|
134
157
|
if line =~ /The executable for the test bundle at (.+\.octest) could not be found/
|
135
158
|
build_error("Test executable #{clean_path($1)} could not be found")
|
136
159
|
end
|
137
|
-
|
160
|
+
|
138
161
|
# compilation errors
|
139
|
-
if line =~ /(.+\.m):(\d+): error: (.*)/
|
162
|
+
if !@current_case && line =~ /(.+\.m):(\d+): error: (.*)/
|
140
163
|
compilation_error_occurred!
|
141
164
|
build_error($&)
|
142
165
|
end
|
@@ -153,6 +176,11 @@ module OCRunner
|
|
153
176
|
build_error($&)
|
154
177
|
end
|
155
178
|
|
179
|
+
# bus error
|
180
|
+
if line =~ /Bus error/
|
181
|
+
build_error('Bus error while running tests.')
|
182
|
+
end
|
183
|
+
|
156
184
|
# segfault
|
157
185
|
if line =~ /Segmentation fault/
|
158
186
|
build_error('Segmentation fault while running tests.')
|
@@ -170,7 +198,7 @@ module OCRunner
|
|
170
198
|
end
|
171
199
|
|
172
200
|
def out(line = '')
|
173
|
-
@output << line
|
201
|
+
@output << line.rstrip
|
174
202
|
end
|
175
203
|
|
176
204
|
def clean_path(path)
|
@@ -179,7 +207,19 @@ module OCRunner
|
|
179
207
|
|
180
208
|
def growl(message)
|
181
209
|
if @options[:growl]
|
182
|
-
|
210
|
+
execute "growlnotify -i \"xcodeproj\" -m \"#{message}\"" do |error|
|
211
|
+
if error =~ /command not found/
|
212
|
+
out red('You must have growl and growl notify installed to enable growl support. See http://growl.info.')
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def execute(cmd, &block)
|
219
|
+
IO.popen("#{cmd} 2>&1") do |f|
|
220
|
+
while line = f.gets do
|
221
|
+
yield line
|
222
|
+
end
|
183
223
|
end
|
184
224
|
end
|
185
225
|
|
data/lib/ocrunner/test_suite.rb
CHANGED
data/ocrunner.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ocrunner}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jim Benton"]
|
12
|
-
s.date = %q{2010-04-
|
12
|
+
s.date = %q{2010-04-09}
|
13
13
|
s.default_executable = %q{ocrunner}
|
14
14
|
s.description = %q{Provides pretty console output for running OCUnit tests with xcodebuilder from the command line}
|
15
15
|
s.email = %q{jim@autonomousmachine.com}
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jim Benton
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-09 00:00:00 -05:00
|
18
18
|
default_executable: ocrunner
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|