ocrunner 0.2.5 → 0.3.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/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
|