xcpretty 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b7c9801687114be36489ddcba6e176642eb3a38f
4
- data.tar.gz: cab297275520b02d5294a38f5e30927e0806b05a
3
+ metadata.gz: 9b2c23619219f7da6d12fbe9603ba2deece7157d
4
+ data.tar.gz: de800a6d3e0ca7806915e708e7b1483a708c0140
5
5
  SHA512:
6
- metadata.gz: af7004081d8117b52afabd4f50ec08deca5d2071673dafdb7f9d6f6f2e4f947d35aea06f97185c00de9203264cf98354621ea98703806d71061c891bd8d6789c
7
- data.tar.gz: 423abc308e613fb7317f901ce0cf4e5a5a96476ea8b1da41664f8d4ae564170bf1d05b99dddac4df4c4137993008c9c4c6b2dc6d5c643ad465095948546cee43
6
+ metadata.gz: 1eac17f808e34f54236c1b003ea467e6575fdd8b16a5dddf8e3a2baa98ce8fa5ec57b0a0ef2af1236f226c8c49ab788ad4f0a0cd688d2ed1ecec70a902874f49
7
+ data.tar.gz: 281d4d622def4747891d9e30878111e15ea8ca8d81de96fb3d69a0069c79f0242bfa3a6bd8623b195597696108ca424c894da59f135071e676b58974dd634bc2
data/CHANGELOG.md CHANGED
@@ -1,10 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.0
4
+
5
+ ###### Enhancements
6
+
7
+ * Color semi-slow tests in yellow, slow tests in red |
8
+ [#46](https://github.com/mneorr/xcpretty/pull/46)
9
+ * Add option to specify a custom location for report generation |
10
+ [#43](https://github.com/mneorr/XCPretty/pull/43)
11
+
12
+
13
+ ## 0.0.9
14
+
15
+ ###### Enhancements
16
+
17
+ * major performance fix, it's faster than `cat` by 2-3 times on big inputs.
18
+ Thanks [@kviksilver](https://github.com/kviksilver) for providing debug log and helping to reproduce
19
+
20
+
3
21
  ## 0.0.8
4
22
 
5
23
  ###### Bug Fixes
6
24
 
7
- * show version if not piped [#39](https://github.com/mneorr/XCPretty/issues/39)
25
+ * show version if not piped |
26
+ [#39](https://github.com/mneorr/XCPretty/issues/39)
8
27
 
9
28
  ###### Enhancements
10
29
 
@@ -45,7 +64,7 @@
45
64
 
46
65
  ###### Enhancements
47
66
 
48
- * Prettier `--simple` output
67
+ * Prettier `--simple` output |
49
68
  [Preview](https://travis-ci.org/allending/Kiwi/builds/15190533)
50
69
  * Removed Paint dependency
51
70
  * Better test failure formatting (added indentation, grouped by suite)
data/bin/xcpretty CHANGED
@@ -10,68 +10,57 @@ end
10
10
  require 'xcpretty'
11
11
  require 'optparse'
12
12
 
13
- def class_from_path(path)
14
- source = File.read(path)
15
- klass = eval(source, nil, path)
16
- raise unless klass.is_a?(Class)
17
- klass
18
- end
19
-
20
- def load_custom_formatter(path)
21
- begin
22
- $:.unshift File.dirname(path)
23
- class_from_path(path)
24
- rescue SyntaxError => e
25
- $stderr.puts "[!] Expected formatter source file to return a class. #{e}"
26
- exit 1
27
- end
28
- end
29
-
13
+ report_options = []
14
+ report_classes = []
30
15
  report_formats = {
31
16
  "junit" => XCPretty::JUnit
32
17
  }
33
18
 
34
- constructor = {
19
+ printer_opts = {
35
20
  :unicode => true,
36
21
  :colorize => false,
37
22
  :formatter => XCPretty::Simple
38
23
  }
39
24
 
40
- reporter_classes = []
41
-
42
25
  OptionParser.new do |opts|
43
26
  opts.banner = "Usage: xcodebuild [options] | xcpretty"
44
27
  opts.on('-t', '--test', 'Use RSpec style output') do
45
- constructor[:formatter] = XCPretty::RSpec
28
+ printer_opts[:formatter] = XCPretty::RSpec
46
29
  end
47
30
  opts.on('-s', '--simple', 'Use simple output (default)') do
48
- constructor[:formatter] = XCPretty::Simple
31
+ printer_opts[:formatter] = XCPretty::Simple
49
32
  end
50
33
  opts.on('-f', '--formatter PATH', 'Use formatter returned from evaluating the specified Ruby file') do |path|
51
- constructor[:formatter] = load_custom_formatter(path)
34
+ printer_opts[:formatter] = XCPretty.load_custom_formatter(path)
52
35
  end
53
36
  opts.on('-c', '--color', 'Use colorized output') do
54
- constructor[:colorize] = true
37
+ printer_opts[:colorize] = true
55
38
  end
56
39
  opts.on('--no-utf', 'Disable unicode characters in output') do
57
- constructor[:unicode] = false
40
+ printer_opts[:unicode] = false
58
41
  end
59
42
  opts.on("-r", "--report FORMAT", "Run FORMAT reporter",
60
43
  " Choices: #{report_formats.keys.join(', ')}") do |format|
61
- reporter_classes << report_formats[format]
44
+ report_classes << report_formats[format]
45
+ report_options << {}
46
+ end
47
+ opts.on('-o', '--output PATH', 'Write report output to PATH') do |path|
48
+ unless opts = report_options.last
49
+ XCPretty.exit_with_error('Expected report format to be speficied before before output path')
50
+ end
51
+ opts[:path] = path
62
52
  end
63
53
  opts.on_tail('-h', '--help', 'Show this message') { puts opts; exit }
64
54
  opts.on_tail("-v", "--version", "Show version") { puts XCPretty::VERSION; exit }
65
55
  opts.parse!
66
56
 
67
57
  if STDIN.tty?
68
- $stderr.puts opts.help
69
- exit 1
58
+ XCPretty.exit_with_error(opts.help)
70
59
  end
71
60
  end
72
61
 
73
- printer = XCPretty::Printer.new(constructor)
74
- reporters = reporter_classes.compact.map(&:new)
62
+ printer = XCPretty::Printer.new(printer_opts)
63
+ reporters = report_classes.compact.each_with_index.map {|k,i| k.new(report_options[i])}
75
64
 
76
65
  ARGF.each_line do |line|
77
66
  XCPretty::ExitStatus.handle(line)
@@ -81,3 +70,4 @@ end
81
70
 
82
71
  reporters.each(&:finish)
83
72
  exit(XCPretty::ExitStatus.code)
73
+
@@ -30,3 +30,10 @@ Feature: Creating a JUnit test report
30
30
  When I pipe to xcpretty with "--report junit"
31
31
  Then I should see 2 test suites
32
32
 
33
+ Scenario: Writing to a custom file path
34
+ When I pipe to xcpretty with "--report junit" and specify a custom path
35
+ Then I should have a test report in a custom path
36
+
37
+ Scenario: Writing to multiple custom file paths
38
+ When I pipe to xcpretty with two custom report paths
39
+ Then I should have test reports in two custom paths
@@ -40,6 +40,16 @@ Feature: Showing build output in simple format
40
40
  When I pipe to xcpretty with "--simple"
41
41
  Then I should see a successful analyze message
42
42
 
43
+ Scenario: Showing tiff file validation
44
+ Given I have a tiff file to validate
45
+ When I pipe to xcpretty with "--simple"
46
+ Then I should see a successful tiff validation message
47
+
48
+ Scenario: Showing touch file
49
+ Given I have a file to touch
50
+ When I pipe to xcpretty with "--simple"
51
+ Then I should see a successful touch message
52
+
43
53
  Scenario: Showing analyze with color
44
54
  Given I have a file to analyze
45
55
  When I pipe to xcpretty with "--simple --color"
@@ -50,6 +60,16 @@ Feature: Showing build output in simple format
50
60
  When I pipe to xcpretty with "--simple --color"
51
61
  Then I should see a yellow completion icon
52
62
 
63
+ Scenario: Showing tiff file validation with color
64
+ Given I have a tiff file to validate
65
+ When I pipe to xcpretty with "--simple --color"
66
+ Then I should see a yellow completion icon
67
+
68
+ Scenario: Showing touch file with color
69
+ Given I have a file to touch
70
+ When I pipe to xcpretty with "--simple --color"
71
+ Then I should see a yellow completion icon
72
+
53
73
  Scenario: Showing the start of a test run
54
74
  Given the tests have started running
55
75
  When I pipe to xcpretty with "--simple"
@@ -79,6 +99,21 @@ Feature: Showing build output in simple format
79
99
  And I should not see the name of the test group
80
100
  And I should not see the path of a passing test
81
101
 
102
+ Scenario: Colorizing slow-ish tests in yellow
103
+ Given I have a slow-ish test in my suite
104
+ When I pipe to xcpretty with "--simple --color"
105
+ Then I should see the test time in yellow
106
+
107
+ Scenario: Colorizing slow tests in red
108
+ Given I have a slow test in my suite
109
+ When I pipe to xcpretty with "--simple --color"
110
+ Then I should see the test time in red
111
+
112
+ Scenario: Showing pending test output
113
+ Given I have a pending test in my suite
114
+ When I pipe to xcpretty with "--simple"
115
+ Then I should see the name of a pending test
116
+
82
117
  Scenario: Showing failed test output with color
83
118
  Given I have a failing test in my suite
84
119
  And the test suite has finished
@@ -31,6 +31,14 @@ Given(/^I have a passing test in my suite$/) do
31
31
  add_run_input SAMPLE_OCUNIT_TEST
32
32
  end
33
33
 
34
+ Given(/^I have a slow\-ish test in my suite$/) do
35
+ add_run_input SAMPLE_SLOWISH_TEST
36
+ end
37
+
38
+ Given(/^I have a slow test in my suite$/) do
39
+ add_run_input SAMPLE_SLOW_TEST
40
+ end
41
+
34
42
  Given(/^the tests have started running$/) do
35
43
  add_run_input SAMPLE_OCUNIT_TEST_RUN_BEGINNING
36
44
  end
@@ -72,6 +80,26 @@ Given(/^the linker has failed with undefined symbols$/) do
72
80
  add_run_input SAMPLE_UNDEFINED_SYMBOLS
73
81
  end
74
82
 
83
+ Given(/^I have a pending test in my suite$/) do
84
+ add_run_input SAMPLE_PENDING_KIWI_TEST
85
+ end
86
+
87
+ Given(/^I have a tiff file to validate$/) do
88
+ add_run_input SAMPLE_TIFFUTIL
89
+ end
90
+
91
+ Given(/^I have a file to touch$/) do
92
+ add_run_input SAMPLE_TOUCH
93
+ end
94
+
95
+ Then(/^I should see a successful tiff validation message$/) do
96
+ run_output.should start_with("▸ Validating")
97
+ end
98
+
99
+ Then(/^I should see a successful touch message$/) do
100
+ run_output.should start_with("▸ Touching")
101
+ end
102
+
75
103
  When(/^I pipe to xcpretty with "(.*?)"$/) do |flags|
76
104
  run_xcpretty(flags)
77
105
  end
@@ -129,6 +157,14 @@ Then(/^I should see a red failed test icon$/) do
129
157
  run_output.should include(red("F"))
130
158
  end
131
159
 
160
+ Then(/^I should see a pending test icon in ASCII$/) do
161
+ run_output.should start_with("P")
162
+ end
163
+
164
+ Then(/^I should see a yellow pending test icon$/) do
165
+ run_output.should start_with(yellow("P"))
166
+ end
167
+
132
168
  Then(/^the final execution message should be (red|green)$/) do |color|
133
169
  last_line = run_output.lines.to_a.last
134
170
  last_line.should be_colored(color.to_sym)
@@ -207,3 +243,14 @@ Then(/^I should see the symbol and reference that caused failure$/) do
207
243
  run_output.should include("objc-class-ref in ATZRadialProgressControl.o")
208
244
  end
209
245
 
246
+ Then(/^I should see the name of a pending test$/) do
247
+ run_output.should =~ PENDING_TEST_NAME_MATCHER
248
+ end
249
+
250
+ Then(/^I should see the test time in yellow$/) do
251
+ run_output.should include("#{yellow("0.026")}")
252
+ end
253
+
254
+ Then(/^I should see the test time in red$/) do
255
+ run_output.should include("#{red("0.101")}") end
256
+
@@ -3,6 +3,28 @@ Given(/^I have tests in my suite from 2 classes$/) do
3
3
  add_run_input SAMPLE_KIWI_TEST
4
4
  end
5
5
 
6
+ When(/^I pipe to xcpretty with "(.*?)" and specify a custom path$/) do |args|
7
+ step("I pipe to xcpretty with \"#{args} --output #{custom_report_path}\"")
8
+ end
9
+
10
+ When(/^I pipe to xcpretty with two custom report paths$/) do
11
+ step("I pipe to xcpretty with \"--report junit --output #{custom_report_path} --report junit --output #{other_custom_report_path}\"")
12
+ end
13
+
14
+ Then(/^I should have test reports in two custom paths$/) do
15
+ step("I should have a test report at \"#{custom_report_path}\"")
16
+ step("I should have a test report at \"#{other_custom_report_path}\"")
17
+ end
18
+
19
+ Then(/^I should have a test report in a custom path$/) do
20
+ step("I should have a test report at \"#{custom_report_path}\"")
21
+ end
22
+
23
+ Then(/^I should have a test report at "(.*?)"$/) do |path|
24
+ doc = REXML::Document.new(File.open(path, 'r').read)
25
+ doc.root.should_not be_nil
26
+ end
27
+
6
28
  Then(/^I should see a failed test node in my report$/) do
7
29
  junit_report_root.elements.to_a.detect do |node|
8
30
  element = node.elements.to_a.first
@@ -17,6 +17,7 @@ TEST_SUITE_COMPLETION_MATCHER = /Executed \d+ tests, with \d+ failures \(\d+ une
17
17
  TEST_SUITE_START_MATCHER = /[\w]*(Spec|Tests)$/
18
18
  TEST_PATH_MATCHER = %r{[\w/\-\s]+:\d+}
19
19
  PASSING_TEST_NAME_MATCHER = %r{\w+\s\(\d+\.\d+\sseconds\)}
20
+ PENDING_TEST_NAME_MATCHER = %r{\w+\s\[PENDING\]}
20
21
  FAILING_TEST_NAME_MATCHER = %r{\w+, expected:}
21
22
 
22
23
  def run_xcpretty(flags)
@@ -48,6 +49,20 @@ def junit_report_root
48
49
  junit_report.root.elements.to_a.first
49
50
  end
50
51
 
52
+ def custom_report_path
53
+ @custom_report_path ||= begin
54
+ @custom_report_file1 = Tempfile.new('custom_report_path')
55
+ @custom_report_file1.path
56
+ end
57
+ end
58
+
59
+ def other_custom_report_path
60
+ @custom_report_path2 ||= begin
61
+ @custom_report_file2 = Tempfile.new('custom_report_path')
62
+ @custom_report_file2.path
63
+ end
64
+ end
65
+
51
66
  Before do
52
67
  self.colorize = true
53
68
  end
@@ -55,5 +70,7 @@ end
55
70
  After do
56
71
  @input = ""
57
72
  @output = ""
73
+ @custom_report_file1.unlink if @custom_report_file1
74
+ @custom_report_file2.unlink if @custom_report_file2
58
75
  FileUtils.rm_rf(XCPretty::JUnit::FILEPATH)
59
76
  end
@@ -10,6 +10,11 @@ Feature: Showing RSpec-style test output
10
10
  When I pipe to xcpretty with "--test"
11
11
  Then I should see a passing test icon in ASCII
12
12
 
13
+ Scenario: Showing pending tests
14
+ Given I have a pending test in my suite
15
+ When I pipe to xcpretty with "--test"
16
+ Then I should see a pending test icon in ASCII
17
+
13
18
  Scenario: Showing some tests failed with color
14
19
  Given I have a failing test in my suite
15
20
  And the test suite has finished
@@ -18,11 +23,16 @@ Feature: Showing RSpec-style test output
18
23
  And I should see the path of a failed test
19
24
  And the final execution message should be red
20
25
 
21
- Scenario: Showing passing tests with colorization
26
+ Scenario: Showing passing tests with color
22
27
  Given I have a passing test in my suite
23
28
  When I pipe to xcpretty with "--test --color"
24
29
  Then I should see a green passing test icon
25
30
 
31
+ Scenario: Showing pending tests with color
32
+ Given I have a pending test in my suite
33
+ When I pipe to xcpretty with "--test --color"
34
+ Then I should see a yellow pending test icon
35
+
26
36
  Scenario: Showing that all tests passed with color
27
37
  Given all of my tests will pass in my suite
28
38
  When I pipe to xcpretty with "--test --color"
@@ -23,6 +23,7 @@ module XCPretty
23
23
  def format_linking(file, build_variant, arch); EMPTY; end
24
24
  def format_libtool(library); EMPTY; end
25
25
  def format_passing_test(suite, test, time); EMPTY; end
26
+ def format_pending_test(suite, test); EMPTY; end
26
27
  def format_failing_test(suite, test, time, file_path); EMPTY; end
27
28
  def format_process_pch(file); EMPTY; end
28
29
  def format_phase_script_execution(script_name); EMPTY; end
@@ -34,6 +35,8 @@ module XCPretty
34
35
  def format_test_run_finished(name, time); EMPTY; end
35
36
  def format_test_suite_started(name); EMPTY; end
36
37
  def format_test_summary(message, failures_per_suite); EMPTY; end
38
+ def format_touch(file_path, file_name); EMPTY; end
39
+ def format_tiffutil(file); EMPTY; end
37
40
 
38
41
  # COMPILER / LINKER ERRORS
39
42
  def format_compile_error(file_name, file_path, reason,
@@ -4,6 +4,7 @@ module XCPretty
4
4
 
5
5
  FAIL = "F"
6
6
  PASS = "."
7
+ PENDING = "P"
7
8
 
8
9
  def optional_newline
9
10
  ''
@@ -17,6 +18,10 @@ module XCPretty
17
18
  red(FAIL)
18
19
  end
19
20
 
21
+ def format_pending_test(suite, test_case)
22
+ yellow(PENDING)
23
+ end
24
+
20
25
  end
21
26
 
22
27
  end
@@ -7,10 +7,12 @@ module XCPretty
7
7
 
8
8
  PASS = "✓"
9
9
  FAIL = "✗"
10
+ PENDING = "⧖"
10
11
 
11
12
  ASCII_PASS = "."
12
13
  ASCII_FAIL = "x"
13
14
  COMPLETION = "▸"
15
+ ASCII_PENDING = "P"
14
16
  ASCII_COMPLETION = ">"
15
17
 
16
18
  def format_analyze(file_name, file_path)
@@ -54,11 +56,15 @@ module XCPretty
54
56
  end
55
57
 
56
58
  def format_failing_test(suite, test_case, reason, file)
57
- format_test("#{test_case}, #{reason}", false)
59
+ format_test("#{test_case}, #{reason}", :fail)
58
60
  end
59
61
 
60
62
  def format_passing_test(suite, test_case, time)
61
- format_test("#{test_case} (#{time} seconds)")
63
+ format_test("#{test_case} (#{colored_time(time)} seconds)", :pass)
64
+ end
65
+
66
+ def format_pending_test(suite, test_case)
67
+ format_test("#{test_case} [PENDING]", :pending)
62
68
  end
63
69
 
64
70
  def format_phase_script_execution(script_name)
@@ -93,6 +99,13 @@ module XCPretty
93
99
  heading("", name, "")
94
100
  end
95
101
 
102
+ def format_touch(file_path, file_name)
103
+ format("Touching", file_name)
104
+ end
105
+
106
+ def format_tiffutil(file_name)
107
+ format("Validating", file_name)
108
+ end
96
109
 
97
110
  private
98
111
 
@@ -104,8 +117,8 @@ module XCPretty
104
117
  [status_symbol(success ? :completion : :fail), white(command), argument_text].join(" ").strip
105
118
  end
106
119
 
107
- def format_test(test_case, success=true)
108
- [status_symbol(success ? :pass : :fail), test_case].join(" ").strip
120
+ def format_test(test_case, status)
121
+ [status_symbol(status), test_case].join(" ").strip
109
122
  end
110
123
 
111
124
  def status_symbol(status)
@@ -114,6 +127,8 @@ module XCPretty
114
127
  green(use_unicode? ? PASS : ASCII_PASS)
115
128
  when :fail
116
129
  red(use_unicode? ? FAIL : ASCII_FAIL)
130
+ when :pending
131
+ yellow(use_unicode? ? PENDING : ASCII_PENDING)
117
132
  when :error
118
133
  red(use_unicode? ? ERROR : ASCII_ERROR)
119
134
  when :completion
@@ -123,5 +138,16 @@ module XCPretty
123
138
  end
124
139
  end
125
140
 
141
+ def colored_time(time)
142
+ case time.to_f
143
+ when 0..0.025
144
+ time
145
+ when 0.026..0.100
146
+ yellow(time)
147
+ else
148
+ red(time)
149
+ end
150
+ end
151
+
126
152
  end
127
153
  end
@@ -96,6 +96,11 @@ module XCPretty
96
96
  # $3 = time
97
97
  PASSING_TEST_MATCHER = /^Test Case\s'-\[(.*)\s(.*)\]'\spassed\s\((\d*\.\d{3})\sseconds\)/
98
98
 
99
+ # @regex Captured groups
100
+ # $1 = suite
101
+ # $2 = test_case
102
+ PENDING_TEST_MATCHER = /^Test Case\s'-\[(.*)\s(.*)PENDING\]'\spassed/
103
+
99
104
  # @regex Captured groups
100
105
  # $1 = script_name
101
106
  PHASE_SCRIPT_EXECUTION_MATCHER = /^PhaseScriptExecution\s(.*)\s\//
@@ -136,6 +141,15 @@ module XCPretty
136
141
  # @regex Captured groups
137
142
  # $1 test suite name
138
143
  TEST_SUITE_START_MATCHER = /Test Suite '(.*)' started at/
144
+
145
+ # @regex Captured groups
146
+ # $1 file_name
147
+ TIFFUTIL_MATCHER = /^TiffUtil\s(.*)/
148
+
149
+ # @regex Captured groups
150
+ # $1 file_path
151
+ # $2 file_name
152
+ TOUCH_MATCHER = /^Touch\s(.*\/([\w+\.]+))/
139
153
  end
140
154
 
141
155
  class Parser
@@ -184,6 +198,8 @@ module XCPretty
184
198
  formatter.format_libtool($1)
185
199
  when LINKING_MATCHER
186
200
  formatter.format_linking($1, $2, $3)
201
+ when PENDING_TEST_MATCHER
202
+ formatter.format_pending_test($1, $2)
187
203
  when PASSING_TEST_MATCHER
188
204
  formatter.format_passing_test($1, $2, $3)
189
205
  when PODS_ERROR_MATCHER
@@ -208,6 +224,10 @@ module XCPretty
208
224
  formatter.format_test_run_started($1)
209
225
  when TEST_SUITE_START_MATCHER
210
226
  formatter.format_test_suite_started($1)
227
+ when TIFFUTIL_MATCHER
228
+ formatter.format_tiffutil($1)
229
+ when TOUCH_MATCHER
230
+ formatter.format_touch($1, $2)
211
231
  else
212
232
  ""
213
233
  end
@@ -14,8 +14,9 @@ module XCPretty
14
14
  end
15
15
  end
16
16
 
17
- def initialize
17
+ def initialize(options)
18
18
  load_dependencies
19
+ @filepath = options[:path] || FILEPATH
19
20
  @directory = `pwd`.strip
20
21
  @document = REXML::Document.new
21
22
  @document << REXML::XMLDecl.new('1.0','UTF-8')
@@ -58,10 +59,10 @@ module XCPretty
58
59
  private
59
60
 
60
61
  def write_report_file
61
- FileUtils.mkdir_p(File.dirname(FILEPATH))
62
+ FileUtils.mkdir_p(File.dirname(@filepath))
62
63
  formatter = REXML::Formatters::Pretty.new(2)
63
64
  formatter.compact = true
64
- formatter.write(@document, File.open(FILEPATH, 'w+'))
65
+ formatter.write(@document, File.open(@filepath, 'w+'))
65
66
  end
66
67
 
67
68
  def suite(classname)
@@ -1,3 +1,3 @@
1
1
  module XCPretty
2
- VERSION = "0.0.9"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/xcpretty.rb CHANGED
@@ -7,7 +7,7 @@ require "xcpretty/formatters/rspec"
7
7
  require "xcpretty/reporters/junit"
8
8
 
9
9
  module XCPretty
10
- class ExitStatus
10
+ module ExitStatus
11
11
 
12
12
  include XCPretty::Matchers
13
13
 
@@ -27,5 +27,27 @@ module XCPretty
27
27
  end
28
28
 
29
29
  end
30
+
31
+ def self.class_from_path(path)
32
+ source = File.read(path)
33
+ klass = eval(source, nil, path)
34
+ raise unless klass.is_a?(Class)
35
+ klass
36
+ end
37
+
38
+ def self.load_custom_formatter(path)
39
+ begin
40
+ $:.unshift File.dirname(path)
41
+ class_from_path(path)
42
+ rescue SyntaxError => e
43
+ exit_with_error("Expected formatter source file to return a class. #{e}")
44
+ end
45
+ end
46
+
47
+ def self.exit_with_error(message)
48
+ $stderr.puts "[!] #{message}"
49
+ exit 1
50
+ end
51
+
30
52
  end
31
53
 
@@ -23,7 +23,10 @@ Clean.Remove clean /Users/musalj/Library/Developer/Xcode/DerivedData/ObjectiveSu
23
23
  )
24
24
  SAMPLE_EXECUTED_TESTS = "Executed 4 tests, with 0 failures (0 unexpected) in 0.003 (0.004) seconds"
25
25
  SAMPLE_OCUNIT_TEST = "Test Case '-[RACCommandSpec enabled_signal_should_send_YES_while_executing_is_YES_and_allowsConcurrentExecution_is_YES]' passed (0.001 seconds)."
26
+ SAMPLE_SLOWISH_TEST = "Test Case '-[RACCommandSpec enabled_signal_should_send_YES_while_executing_is_YES_and_allowsConcurrentExecution_is_YES]' passed (0.026 seconds)."
27
+ SAMPLE_SLOW_TEST = "Test Case '-[RACCommandSpec enabled_signal_should_send_YES_while_executing_is_YES_and_allowsConcurrentExecution_is_YES]' passed (0.101 seconds)."
26
28
  SAMPLE_KIWI_TEST = "Test Case '-[MappingsTests Mappings_SupportsCreatingAParentObjectUsingJustIDFromTheServer]' passed (0.004 seconds)."
29
+ SAMPLE_PENDING_KIWI_TEST = "Test Case '-[TAPIConversationSpec TAPIConversation_createConversation_SendsAPOSTRequestToTheConversationsEndpointPENDING]' passed (0.001 seconds)."
27
30
  SAMPLE_COMPILE = %Q(
28
31
  CompileC /Users/musalj/Library/Developer/Xcode/DerivedData/ObjectiveSugar-ayzdhqmmwtqgysdpznmovjlupqjy/Build/Intermediates/Pods.build/Debug-iphonesimulator/Pods-ObjectiveSugar.build/Objects-normal/i386/NSMutableArray+ObjectiveSugar.o /Users/musalj/code/OSS/ObjectiveSugar/Classes/NSMutableArray+ObjectiveSugar.m normal i386 objective-c com.apple.compilers.llvm.clang.1_0.compiler
29
32
  cd /Users/musalj/code/OSS/ObjectiveSugar/Example/Pods
@@ -82,6 +85,16 @@ GenerateDSYMFile /Users/musalj/Library/Developer/Xcode/DerivedData/ObjectiveSuga
82
85
  setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Users/musalj/code/go/bin:/Users/musalj/.rbenv/shims:/Users/musalj/.rbenv/bin:/usr/local/share/npm/bin:/usr/local/bin:/Library/Python/2.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
83
86
  /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil /Users/musalj/Library/Developer/Xcode/DerivedData/ObjectiveSugar-ayzdhqmmwtqgysdpznmovjlupqjy/Build/Products/Debug-iphonesimulator/ObjectiveSugarTests.octest/ObjectiveSugarTests -o /Users/musalj/Library/Developer/Xcode/DerivedData/ObjectiveSugar-ayzdhqmmwtqgysdpznmovjlupqjy/Build/Products/Debug-iphonesimulator/ObjectiveSugarTests.octest.dSYM
84
87
  )
88
+ SAMPLE_TOUCH = %Q(
89
+ Touch /Users/musalj/Library/Developer/Xcode/DerivedData/Alcatraz-aobuxcinaqyzjugrnxjjhfzgwaou/Build/Products/Debug/AlcatrazTests.octest
90
+ cd /Users/musalj/code/OSS/Alcatraz
91
+ /usr/bin/touch -c /Users/musalj/Library/Developer/Xcode/DerivedData/Alcatraz-aobuxcinaqyzjugrnxjjhfzgwaou/Build/Products/Debug/AlcatrazTests.octest
92
+ )
93
+ SAMPLE_TIFFUTIL = %Q(
94
+ TiffUtil eye_icon.tiff
95
+ cd /Users/musalj/code/OSS/Alcatraz
96
+ /usr/bin/tiffutil -cathidpicheck /Users/musalj/code/OSS/Alcatraz/Alcatraz/eye_icon@2x.png /Users/musalj/code/OSS/Alcatraz/Alcatraz/eye_icon.png -out /Users/musalj/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin/Contents/Resources/eye_icon.tiff
97
+ )
85
98
  SAMPLE_RUN_SCRIPT = %Q(
86
99
  PhaseScriptExecution Check\\ Pods\\ Manifest.lock /Users/musalj/Library/Developer/Xcode/DerivedData/ObjectiveSugar-ayzdhqmmwtqgysdpznmovjlupqjy/Build/Intermediates/ObjectiveSugar.build/Debug-iphonesimulator/ObjectiveSugar.build/Script-468DABF301EC4EC1A00CC4C2.sh
87
100
  cd /Users/musalj/code/OSS/ObjectiveSugar/Example
@@ -16,10 +16,14 @@ module XCPretty
16
16
 
17
17
  context "without colors" do
18
18
 
19
- it "prints green dots for passing tests" do
19
+ it "prints dots for passing tests" do
20
20
  @formatter.format_passing_test("sweez testz", "sample spec", "0.002").should == "."
21
21
  end
22
22
 
23
+ it "prints P for pending tests" do
24
+ @formatter.format_pending_test("sweez testz", "sample spec").should == "P"
25
+ end
26
+
23
27
  it "prints F for failing tests" do
24
28
  @formatter.format_failing_test(
25
29
  "///file", "NSNumber Specs", "adding numbers", "should add 2 numbers"
@@ -36,6 +40,11 @@ module XCPretty
36
40
  ).should be_colored :green
37
41
  end
38
42
 
43
+ it "prints yellow for pending tests" do
44
+ @formatter.format_pending_test("sweez testz", "sample spec"
45
+ ).should be_colored :yellow
46
+ end
47
+
39
48
  it "prints red for failing tests" do
40
49
  @formatter.format_failing_test(
41
50
  "///file", "NSNumber Specs", "adding numbers", "should add 2 numbers"
@@ -75,6 +75,11 @@ module XCPretty
75
75
  ". _tupleByAddingObject__should_add_a_non_nil_object (0.001 seconds)"
76
76
  end
77
77
 
78
+ it "formats pending tests" do
79
+ @formatter.format_pending_test("RACCommandSpec", "_tupleByAddingObject__should_add_a_non_nil_object").should ==
80
+ "P _tupleByAddingObject__should_add_a_non_nil_object [PENDING]"
81
+ end
82
+
78
83
  it "formats Phase Script Execution" do
79
84
  @formatter.format_phase_script_execution("Check Pods Manifest.lock").should ==
80
85
  "> Running script 'Check Pods Manifest.lock'"
@@ -110,5 +115,15 @@ module XCPretty
110
115
  "RACKVOWrapperSpec"
111
116
  end
112
117
 
118
+ it "formats Touch" do
119
+ @formatter.format_touch("/path/to/SomeFile.txt","SomeFile.txt").should ==
120
+ "> Touching SomeFile.txt"
121
+ end
122
+
123
+ it "formats TiffUtil" do
124
+ @formatter.format_tiffutil("unbelievable.tiff").should ==
125
+ "> Validating unbelievable.tiff"
126
+ end
127
+
113
128
  end
114
129
  end
@@ -117,6 +117,12 @@ module XCPretty
117
117
  @parser.parse(SAMPLE_OCUNIT_TEST)
118
118
  end
119
119
 
120
+ it "parses pending tests" do
121
+ @formatter.should receive(:format_pending_test).with('TAPIConversationSpec',
122
+ 'TAPIConversation_createConversation_SendsAPOSTRequestToTheConversationsEndpoint')
123
+ @parser.parse(SAMPLE_PENDING_KIWI_TEST)
124
+ end
125
+
120
126
  it "parses PhaseScriptExecution" do
121
127
  @formatter.should receive(:format_phase_script_execution).with('Check Pods Manifest.lock')
122
128
  @parser.parse(SAMPLE_RUN_SCRIPT)
@@ -137,6 +143,18 @@ module XCPretty
137
143
  @parser.parse(SAMPLE_PBXCP)
138
144
  end
139
145
 
146
+ it "parses Touch" do
147
+ @formatter.should receive(:format_touch).with(
148
+ '/Users/musalj/Library/Developer/Xcode/DerivedData/Alcatraz-aobuxcinaqyzjugrnxjjhfzgwaou/Build/Products/Debug/AlcatrazTests.octest',
149
+ 'AlcatrazTests.octest')
150
+ @parser.parse(SAMPLE_TOUCH)
151
+ end
152
+
153
+ it "parses TiffUtil" do
154
+ @formatter.should receive(:format_tiffutil).with('eye_icon.tiff')
155
+ @parser.parse(SAMPLE_TIFFUTIL)
156
+ end
157
+
140
158
  it "parses undefined symbols" do
141
159
  @formatter.should receive(:format_linker_failure).with("Undefined symbols for architecture x86_64",
142
160
  '_OBJC_CLASS_$_CABasicAnimation',
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcpretty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marin Usalj
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-31 00:00:00.000000000 Z
12
+ date: 2014-01-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler