xcpretty 0.1.7 → 0.1.8

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.
@@ -114,6 +114,11 @@ Feature: Showing build output in simple format
114
114
  When I pipe to xcpretty with "--simple"
115
115
  Then I should see the name of a pending test
116
116
 
117
+ Scenario: Showing measuring test output
118
+ Given I have a measuring test in my suite
119
+ When I pipe to xcpretty with "--simple"
120
+ Then I should see the name of a measuring test
121
+
117
122
  Scenario: Showing failed test output with color
118
123
  Given I have a failing test in my suite
119
124
  And the test suite has finished
@@ -170,3 +175,8 @@ Feature: Showing build output in simple format
170
175
  Then I should see the undefined symbold message
171
176
  And I should see the symbol and reference that caused failure
172
177
 
178
+ Scenario: There are build warnings
179
+ Given there were warnings in the code
180
+ When I pipe to xcpretty with "--simple --color"
181
+ Then I should see a yellow warning message
182
+
@@ -76,6 +76,10 @@ Given(/^there was a syntax error$/) do
76
76
  add_run_input SAMPLE_COMPILE_ERROR
77
77
  end
78
78
 
79
+ Given(/^there were warnings in the code$/) do
80
+ add_run_input SAMPLE_FORMAT_WARNING
81
+ end
82
+
79
83
  Given(/^the linker has failed with undefined symbols$/) do
80
84
  add_run_input SAMPLE_UNDEFINED_SYMBOLS
81
85
  end
@@ -84,6 +88,10 @@ Given(/^I have a pending test in my suite$/) do
84
88
  add_run_input SAMPLE_PENDING_KIWI_TEST
85
89
  end
86
90
 
91
+ Given(/^I have a measuring test in my suite$/) do
92
+ add_run_input SAMPLE_MEASURING_TEST
93
+ end
94
+
87
95
  Given(/^I have a tiff file to validate$/) do
88
96
  add_run_input SAMPLE_TIFFUTIL
89
97
  end
@@ -181,6 +189,14 @@ Then(/^I should see a yellow pending test icon$/) do
181
189
  run_output.should start_with(yellow("P"))
182
190
  end
183
191
 
192
+ Then(/^I should see a measuring test icon in ASCII$/) do
193
+ run_output.should start_with('T')
194
+ end
195
+
196
+ Then(/^I should see a yellow measuring test icon$/) do
197
+ run_output.should start_with(yellow('T'))
198
+ end
199
+
184
200
  Then(/^the final execution message should be (red|green)$/) do |color|
185
201
  last_line = run_output.lines.to_a.last
186
202
  last_line.should be_colored(color.to_sym)
@@ -235,7 +251,12 @@ Then(/^I should not see the name of the test group$/) do
235
251
  end
236
252
 
237
253
  Then(/^I should see a red error message$/) do
238
- run_output.should include(red("⌦ " + SAMPLE_PODS_ERROR.gsub('error: ', '')))
254
+ run_output.should include(red("⌦ " + SAMPLE_PODS_ERROR.gsub('error: ', '')))
255
+ end
256
+
257
+ Then(/^I should see a yellow warning message$/) do
258
+ run_output.should include("#{yellow('⚠️ ')}/Users/supermarin/code/oss/ObjectiveSugar/Example/ObjectiveSugar/AppDelegate.m:19:31:")
259
+ run_output.should include(yellow("format specifies type 'id' but the argument has type 'int' [-Wformat]"))
239
260
  end
240
261
 
241
262
  Then(/^I should see a red compilation error$/) do
@@ -251,7 +272,7 @@ Then(/^I should see a cyan cursor$/) do
251
272
  end
252
273
 
253
274
  Then(/^I should see the undefined symbold message$/) do
254
- run_output.should include(red("⌦ Undefined symbols for architecture x86_64"))
275
+ run_output.should include(red("⌦ Undefined symbols for architecture x86_64"))
255
276
  end
256
277
 
257
278
  Then(/^I should see the symbol and reference that caused failure$/) do
@@ -263,6 +284,10 @@ Then(/^I should see the name of a pending test$/) do
263
284
  run_output.should =~ PENDING_TEST_NAME_MATCHER
264
285
  end
265
286
 
287
+ Then(/^I should see the name of a measuring test$/) do
288
+ run_output.should =~ MEASURING_TEST_NAME_MATCHER
289
+ end
290
+
266
291
  Then(/^I should see the test time in yellow$/) do
267
292
  run_output.should include("#{yellow("0.026")}")
268
293
  end
@@ -18,17 +18,16 @@ end
18
18
 
19
19
  Then(/^the JSON compilation database should contain an entry with a command$/) do
20
20
  json_db.length.should == 1
21
-
22
- json_db[0]["command"].should start_with("/Applications/Xcode.app/Contents/Developer")
23
- json_db[0]["command"].should end_with(".o")
21
+ json_db[0]['command'].should start_with('/Applications/Xcode.app/Contents/Developer')
22
+ json_db[0]['command'].should end_with('.o')
24
23
  end
25
24
 
26
25
  Then(/^the JSON compilation database should contain an entry with a file$/) do
27
- json_db[0]["file"].should == "NSMutableArray+ObjectiveSugar.m"
26
+ json_db[0]['file'].should == '/Users/musalj/code/OSS/ObjectiveSugar/Classes/NSMutableArray+ObjectiveSugar.m'
28
27
  end
29
28
 
30
29
  Then(/^the JSON compilation database should contain an entry with a directory$/) do
31
- json_db[0]["directory"].should == "/Users/musalj/code/OSS/ObjectiveSugar/Classes"
30
+ json_db[0]['directory'].should == '/'
32
31
  end
33
32
 
34
33
  Then(/^the JSON compilation database should be complete$/) do
@@ -27,6 +27,7 @@ TEST_PATH_MATCHER = %r{[\w/\-\s]+:\d+}
27
27
  PASSING_TEST_NAME_MATCHER = %r{\w+\s\(\d+\.\d+\sseconds\)}
28
28
  PENDING_TEST_NAME_MATCHER = %r{\w+\s\[PENDING\]}
29
29
  FAILING_TEST_NAME_MATCHER = %r{\w+, expected:}
30
+ MEASURING_TEST_NAME_MATCHER = %r{\w+\smeasured\s\(\d+\.\d+\sseconds\)}
30
31
 
31
32
  JSON_DB_FIXTURE_COMMAND_COUNT = 557
32
33
 
@@ -110,6 +111,6 @@ After do
110
111
  @json = nil
111
112
  FileUtils.rm_rf(XCPretty::JUnit::FILEPATH)
112
113
  FileUtils.rm_rf(XCPretty::HTML::FILEPATH)
113
- FileUtils.rm_rf(XCPretty::JSONCompilationDatabase::FILEPATH)
114
+ FileUtils.rm_rf(XCPretty::JSONCompilationDatabase::FILE_PATH)
114
115
  File.delete(@screenshot_file_path) if @screenshot_file_path
115
116
  end
@@ -15,6 +15,11 @@ Feature: Showing RSpec-style test output
15
15
  When I pipe to xcpretty with "--test"
16
16
  Then I should see a pending test icon in ASCII
17
17
 
18
+ Scenario: Showing measuring tests
19
+ Given I have a measuring test in my suite
20
+ When I pipe to xcpretty with "--test"
21
+ Then I should see a measuring test icon in ASCII
22
+
18
23
  Scenario: Showing some tests failed with color
19
24
  Given I have a failing test in my suite
20
25
  And the test suite has finished
@@ -33,6 +38,11 @@ Feature: Showing RSpec-style test output
33
38
  When I pipe to xcpretty with "--test --color"
34
39
  Then I should see a yellow pending test icon
35
40
 
41
+ Scenario: Showing measuring tests with color
42
+ Given I have a measuring test in my suite
43
+ When I pipe to xcpretty with "--test --color"
44
+ Then I should see a yellow measuring test icon
45
+
36
46
  Scenario: Showing that all tests passed with color
37
47
  Given all of my tests will pass in my suite
38
48
  When I pipe to xcpretty with "--test --color"
@@ -16,8 +16,10 @@ module XCPretty
16
16
  def format_clean_target(target, project, configuration); EMPTY; end
17
17
  def format_clean_remove; EMPTY; end
18
18
  def format_compile(file_name, file_path); EMPTY; end
19
- def format_compile_command(compiler_command); EMPTY; end
19
+ def format_compile_command(compiler_command, file_path); EMPTY; end
20
20
  def format_compile_xib(file_name, file_path); EMPTY; end
21
+ def format_copy_header_file(source, target); EMPTY; end
22
+ def format_copy_plist_file(source, target); EMPTY; end
21
23
  def format_copy_strings_file(file_name); EMPTY; end
22
24
  def format_cpresource(file); EMPTY; end
23
25
  def format_generate_dsym(dsym); EMPTY; end
@@ -25,26 +27,37 @@ module XCPretty
25
27
  def format_libtool(library); EMPTY; end
26
28
  def format_passing_test(suite, test, time); EMPTY; end
27
29
  def format_pending_test(suite, test); EMPTY; end
30
+ def format_measuring_test(suite, test, time); EMPTY; end
28
31
  def format_failing_test(suite, test, time, file_path); EMPTY; end
29
32
  def format_process_pch(file); EMPTY; end
33
+ def format_process_pch_command(file_path); EMPTY; end
30
34
  def format_phase_script_execution(script_name); EMPTY; end
31
35
  def format_process_info_plist(file_name, file_path); EMPTY; end
32
36
  def format_codesign(file); EMPTY; end
33
37
  def format_preprocess(file); EMPTY; end
34
38
  def format_pbxcp(file); EMPTY; end
39
+ def format_shell_command(command, arguments); EMPTY; end
35
40
  def format_test_run_started(name); EMPTY; end
36
41
  def format_test_run_finished(name, time); EMPTY; end
37
42
  def format_test_suite_started(name); EMPTY; end
38
43
  def format_test_summary(message, failures_per_suite); EMPTY; end
39
44
  def format_touch(file_path, file_name); EMPTY; end
40
45
  def format_tiffutil(file); EMPTY; end
46
+ def format_write_file(file); EMPTY; end
47
+ def format_write_auxiliary_files; EMPTY; end
41
48
 
42
- # COMPILER / LINKER ERRORS
49
+ # COMPILER / LINKER ERRORS AND WARNINGS
43
50
  def format_compile_error(file_name, file_path, reason,
44
51
  line, cursor); EMPTY; end
45
52
  def format_error(message); EMPTY; end
46
53
  def format_undefined_symbols(message, symbol, reference); EMPTY; end
47
54
  def format_duplicate_symbols(message, file_paths); EMPTY; end
55
+ def format_warning(message); message; end
56
+
57
+ # TODO: see how we can unify format_error and format_compile_error,
58
+ # the same for warnings
59
+ def format_compile_warning(file_name, file_path, reason,
60
+ line, cursor); EMPTY; end
48
61
  end
49
62
 
50
63
  class Formatter
@@ -83,8 +96,11 @@ module XCPretty
83
96
  "\n\n#{text}"
84
97
  end
85
98
 
86
- ERROR = ""
87
- ASCII_ERROR = "[!]"
99
+ ERROR = ' '
100
+ ASCII_ERROR = '[x]'
101
+
102
+ WARNING = '⚠️ '
103
+ ASCII_WARNING = '[!]'
88
104
 
89
105
  def format_error(message)
90
106
  "\n#{red(error_symbol + " " + message)}\n\n"
@@ -92,18 +108,23 @@ module XCPretty
92
108
 
93
109
  def format_compile_error(file, file_path, reason, line, cursor)
94
110
  "\n#{red(error_symbol + " ")}#{file_path}: #{red(reason)}\n\n" +
95
- "#{line}\n#{cyan(cursor)}\n\n"
111
+ "#{line}\n#{cyan(cursor)}\n\n"
112
+ end
113
+
114
+ def format_compile_warning(file, file_path, reason, line, cursor)
115
+ "\n#{yellow(warning_symbol + ' ')}#{file_path}: #{yellow(reason)}\n\n" +
116
+ "#{line}\n#{cyan(cursor)}\n\n"
96
117
  end
97
118
 
98
119
  def format_undefined_symbols(message, symbol, reference)
99
120
  "\n#{red(error_symbol + " " + message)}\n" +
100
- "> Symbol: #{symbol}\n" +
101
- "> Referenced from: #{reference}\n\n"
121
+ "> Symbol: #{symbol}\n" +
122
+ "> Referenced from: #{reference}\n\n"
102
123
  end
103
124
 
104
125
  def format_duplicate_symbols(message, file_paths)
105
126
  "\n#{red(error_symbol + " " + message)}\n" +
106
- "> #{file_paths.map { |path| path.split('/').last }.join("\n> ")}\n"
127
+ "> #{file_paths.map { |path| path.split('/').last }.join("\n> ")}\n"
107
128
  end
108
129
 
109
130
 
@@ -130,5 +151,9 @@ module XCPretty
130
151
  use_unicode? ? ERROR : ASCII_ERROR
131
152
  end
132
153
 
154
+ def warning_symbol
155
+ use_unicode? ? WARNING : ASCII_WARNING
156
+ end
157
+
133
158
  end
134
159
  end
@@ -5,6 +5,7 @@ module XCPretty
5
5
  FAIL = "F"
6
6
  PASS = "."
7
7
  PENDING = "P"
8
+ MEASURING = 'T'
8
9
 
9
10
  def optional_newline
10
11
  ''
@@ -22,6 +23,10 @@ module XCPretty
22
23
  yellow(PENDING)
23
24
  end
24
25
 
26
+ def format_measuring_test(suite, test_case, time)
27
+ yellow(MEASURING)
28
+ end
29
+
25
30
  end
26
31
 
27
32
  end
@@ -8,12 +8,14 @@ module XCPretty
8
8
  PASS = "✓"
9
9
  FAIL = "✗"
10
10
  PENDING = "⧖"
11
+ MEASURE = '◷'
11
12
 
12
13
  ASCII_PASS = "."
13
14
  ASCII_FAIL = "x"
14
15
  COMPLETION = "▸"
15
16
  ASCII_PENDING = "P"
16
17
  ASCII_COMPLETION = ">"
18
+ ASCII_MEASURE = 'T'
17
19
 
18
20
  INDENT = " "
19
21
 
@@ -37,6 +39,14 @@ module XCPretty
37
39
  format("Compiling", file_name)
38
40
  end
39
41
 
42
+ def format_copy_header_file(source, target)
43
+ format("Copying", File.basename(source))
44
+ end
45
+
46
+ def format_copy_plist_file(source, target)
47
+ format("Copying", File.basename(source))
48
+ end
49
+
40
50
  def format_copy_strings_file(file)
41
51
  format("Copying", file)
42
52
  end
@@ -69,6 +79,12 @@ module XCPretty
69
79
  INDENT + format_test("#{test_case} [PENDING]", :pending)
70
80
  end
71
81
 
82
+ def format_measuring_test(suite, test_case, time)
83
+ INDENT + format_test(
84
+ "#{test_case} measured (#{colored_time(time)} seconds)", :measure
85
+ )
86
+ end
87
+
72
88
  def format_phase_script_execution(script_name)
73
89
  format("Running script", "'#{script_name}'")
74
90
  end
@@ -109,6 +125,10 @@ module XCPretty
109
125
  format("Validating", file_name)
110
126
  end
111
127
 
128
+ def format_warning(message)
129
+ INDENT + yellow(message)
130
+ end
131
+
112
132
  private
113
133
 
114
134
  def heading(prefix, text, description)
@@ -135,6 +155,8 @@ module XCPretty
135
155
  red(use_unicode? ? ERROR : ASCII_ERROR)
136
156
  when :completion
137
157
  yellow(use_unicode? ? COMPLETION : ASCII_COMPLETION)
158
+ when :measure
159
+ yellow(use_unicode? ? MEASURE : ASCII_MEASURE)
138
160
  else
139
161
  ""
140
162
  end
@@ -16,6 +16,11 @@ module XCPretty
16
16
  # @regex Nothing returned here for now
17
17
  CHECK_DEPENDENCIES_MATCHER = /^Check dependencies/
18
18
 
19
+ # @regex Captured groups
20
+ # $1 command path
21
+ # $2 arguments
22
+ SHELL_COMMAND_MATCHER = /^\s{4}(cd|setenv|(?:[\w\/:\\\s\-.]+?\/)?[\w\-]+)\s(.*)$/
23
+
19
24
  # @regex Nothing returned here for now
20
25
  CLEAN_REMOVE_MATCHER = /^Clean.Remove/
21
26
 
@@ -36,11 +41,12 @@ module XCPretty
36
41
  # @regex Captured groups
37
42
  # $1 file_path
38
43
  # $2 file_name (e.g. KWNull.m)
39
- COMPILE_MATCHER = /^CompileC\s.*\s(.*\/(.*\.(?:m|mm|c|cc|cpp|cxx)))\s.*/
44
+ COMPILE_MATCHER = /^CompileC\s.+?\s((?:\\.|[^ ])+\/((?:\\.|[^ ])+\.(?:m|mm|c|cc|cpp|cxx)))\s.*/
40
45
 
41
46
  # @regex Captured groups
42
47
  # $1 compiler_command
43
- COMPILE_COMMAND_MATCHER = /^\s*(.*\/usr\/bin\/clang\s.*\.o)$/
48
+ # $2 file_path
49
+ COMPILE_COMMAND_MATCHER = /^\s*(.*\/usr\/bin\/clang\s.*\s\-c\s(.*\.(?:m|mm|c|cc|cpp|cxx))\s.*\.o)$/
44
50
 
45
51
  # @regex Captured groups
46
52
  # $1 file_path
@@ -48,6 +54,15 @@ module XCPretty
48
54
  COMPILE_XIB_MATCHER = /^CompileXIB\s(.*\/(.*\.xib))/
49
55
 
50
56
  # @regex Captured groups
57
+ # $1 source file
58
+ # $2 target file
59
+ COPY_HEADER_MATCHER = /^CpHeader\s(.*\.h)\s(.*\.h)/
60
+
61
+ # @regex Captured groups
62
+ # $1 source file
63
+ # $2 target file
64
+ COPY_PLIST_MATCHER = /^CopyPlistFile\s(.*\.plist)\s(.*\.plist)/
65
+
51
66
  # $1 file
52
67
  COPY_STRINGS_MATCHER = /^CopyStringsFile.*\/(.*.strings)/
53
68
 
@@ -91,6 +106,12 @@ module XCPretty
91
106
  # $2 = test_case
92
107
  PENDING_TEST_MATCHER = /^Test Case\s'-\[(.*)\s(.*)PENDING\]'\spassed/
93
108
 
109
+ # @regex Captured groups
110
+ # $1 = suite
111
+ # $2 = test_case
112
+ # $3 = time
113
+ MEASURING_TEST_MATCHER = /^[^:]*:[^:]*:\sTest Case\s'-\[(.*)\s(.*)\]'\smeasured\s\[Time,\sseconds\]\saverage:\s(\d*\.\d{3}),/
114
+
94
115
  # @regex Captured groups
95
116
  # $1 = script_name
96
117
  PHASE_SCRIPT_EXECUTION_MATCHER = /^PhaseScriptExecution\s(.*)\s\//
@@ -99,6 +120,10 @@ module XCPretty
99
120
  # $1 = file
100
121
  PROCESS_PCH_MATCHER = /^ProcessPCH\s.*\s(.*.pch)/
101
122
 
123
+ # @regex Captured groups
124
+ # $1 file_path
125
+ PROCESS_PCH_COMMAND_MATCHER = /^\s*.*\/usr\/bin\/clang\s.*\s\-c\s(.*)\s\-o\s.*/
126
+
102
127
  # @regex Captured groups
103
128
  # $1 = file
104
129
  PREPROCESS_MATCHER = /^Preprocess\s(?:(?:\\ |[^ ])*)\s((?:\\ |[^ ])*)$/
@@ -134,6 +159,24 @@ module XCPretty
134
159
  # $2 file_name
135
160
  TOUCH_MATCHER = /^Touch\s(.*\/([\w+\.]+))/
136
161
 
162
+ # @regex Captured groups
163
+ # $1 file_path
164
+ WRITE_FILE_MATCHER = /^write-file\s(.*)/
165
+
166
+ # @regex Captured groups
167
+ WRITE_AUXILIARY_FILES = /^Write auxiliary files/
168
+
169
+ module Warnings
170
+ # $1 = file_path
171
+ # $2 = file_name
172
+ # $3 = reason
173
+ COMPILE_WARNING_MATCHER = /^(\/.+\/(.*):.*:.*):\swarning:\s(.*)$/
174
+
175
+ # @regex Captured groups
176
+ # $1 = whole warning
177
+ GENERIC_WARNING_MATCHER = /^warning:\s(.*)$/
178
+ end
179
+
137
180
  module Errors
138
181
  # @regex Captured groups
139
182
  # $1 = whole error
@@ -147,7 +190,7 @@ module XCPretty
147
190
  # $1 = file_path
148
191
  # $2 = file_name
149
192
  # $3 = reason
150
- COMPILE_ERROR_MATCHER = /^(\/.+\/(.*):.*:.*):(?:\sfatal)?\serror:\s(.*)$/
193
+ COMPILE_ERROR_MATCHER = /^(\/.+\/(.*):.*:.*):\s(?:fatal\s)?error:\s(.*)$/
151
194
 
152
195
  # @regex Captured groups
153
196
  # $1 cursor (with whitespaces and tildes)
@@ -158,7 +201,6 @@ module XCPretty
158
201
  # it varies a lot, not sure if it makes sense to catch everything separately
159
202
  FATAL_ERROR_MATCHER = /^(fatal error:.*)$/
160
203
 
161
- # @regex Captured groups
162
204
  # $1 = whole error
163
205
  LD_ERROR_MATCHER = /^(ld:.*not found for.*)/
164
206
 
@@ -191,6 +233,7 @@ module XCPretty
191
233
 
192
234
  include Matchers
193
235
  include Matchers::Errors
236
+ include Matchers::Warnings
194
237
 
195
238
  attr_reader :formatter
196
239
 
@@ -204,6 +247,7 @@ module XCPretty
204
247
  update_linker_failure_state(text)
205
248
 
206
249
  return format_compile_error if should_format_error?
250
+ return format_compile_warning if should_format_warning?
207
251
  return format_undefined_symbols if should_format_undefined_symbols?
208
252
  return format_duplicate_symbols if should_format_duplicate_symbols?
209
253
 
@@ -231,9 +275,13 @@ module XCPretty
231
275
  when COMPILE_MATCHER
232
276
  formatter.format_compile($2, $1)
233
277
  when COMPILE_COMMAND_MATCHER
234
- formatter.format_compile_command($1)
278
+ formatter.format_compile_command($1, $2)
235
279
  when COMPILE_XIB_MATCHER
236
280
  formatter.format_compile_xib($2, $1)
281
+ when COPY_HEADER_MATCHER
282
+ formatter.format_copy_header_file($1, $2)
283
+ when COPY_PLIST_MATCHER
284
+ formatter.format_copy_plist_file($1, $2)
237
285
  when CPRESOURCE_MATCHER
238
286
  formatter.format_cpresource($1)
239
287
  when EXECUTED_MATCHER
@@ -250,6 +298,8 @@ module XCPretty
250
298
  formatter.format_libtool($1)
251
299
  when LINKING_MATCHER
252
300
  formatter.format_linking($1, $2, $3)
301
+ when MEASURING_TEST_MATCHER
302
+ formatter.format_measuring_test($1, $2, $3)
253
303
  when PENDING_TEST_MATCHER
254
304
  formatter.format_pending_test($1, $2)
255
305
  when PASSING_TEST_MATCHER
@@ -262,6 +312,8 @@ module XCPretty
262
312
  formatter.format_phase_script_execution(*unescaped($1))
263
313
  when PROCESS_PCH_MATCHER
264
314
  formatter.format_process_pch($1)
315
+ when PROCESS_PCH_COMMAND_MATCHER
316
+ formatter.format_process_pch_command($1)
265
317
  when PREPROCESS_MATCHER
266
318
  formatter.format_preprocess($1)
267
319
  when PBXCP_MATCHER
@@ -276,6 +328,14 @@ module XCPretty
276
328
  formatter.format_tiffutil($1)
277
329
  when TOUCH_MATCHER
278
330
  formatter.format_touch($1, $2)
331
+ when WRITE_FILE_MATCHER
332
+ formatter.format_write_file($1)
333
+ when WRITE_AUXILIARY_FILES
334
+ formatter.format_write_auxiliary_files
335
+ when SHELL_COMMAND_MATCHER
336
+ formatter.format_shell_command($1, $2)
337
+ when GENERIC_WARNING_MATCHER
338
+ formatter.format_warning($1)
279
339
  else
280
340
  ""
281
341
  end
@@ -298,16 +358,21 @@ module XCPretty
298
358
 
299
359
  # @ return Hash { :file_name, :file_path, :reason, :line }
300
360
  def update_error_state(text)
361
+ update_error = lambda {
362
+ current_issue[:reason] = $3
363
+ current_issue[:file_path] = $1
364
+ current_issue[:file_name] = $2
365
+ }
301
366
  if text =~ COMPILE_ERROR_MATCHER
302
367
  @formatting_error = true
303
- current_error[:reason] = $3
304
- current_error[:file_path] = $1
305
- current_error[:file_name] = $2
368
+ update_error.call
369
+ elsif text =~ COMPILE_WARNING_MATCHER
370
+ @formatting_warning = true
371
+ update_error.call
306
372
  elsif text =~ CURSOR_MATCHER
307
- @formatting_error = false
308
- current_error[:cursor] = $1.chomp
309
- elsif @formatting_error
310
- current_error[:line] = text.chomp
373
+ current_issue[:cursor] = $1.chomp
374
+ elsif @formatting_error || @formatting_warning
375
+ current_issue[:line] = text.chomp
311
376
  end
312
377
  end
313
378
 
@@ -332,7 +397,15 @@ module XCPretty
332
397
 
333
398
  # TODO: clean up the mess around all this
334
399
  def should_format_error?
335
- current_error[:reason] && current_error[:cursor] && current_error[:line]
400
+ @formatting_error && error_or_warning_is_present
401
+ end
402
+
403
+ def should_format_warning?
404
+ @formatting_warning && error_or_warning_is_present
405
+ end
406
+
407
+ def error_or_warning_is_present
408
+ current_issue[:reason] && current_issue[:cursor] && current_issue[:line]
336
409
  end
337
410
 
338
411
  def should_format_undefined_symbols?
@@ -346,8 +419,8 @@ module XCPretty
346
419
  current_linker_failure[:files].count > 1
347
420
  end
348
421
 
349
- def current_error
350
- @current_error ||= {}
422
+ def current_issue
423
+ @current_issue ||= {}
351
424
  end
352
425
 
353
426
  def current_linker_failure
@@ -355,8 +428,9 @@ module XCPretty
355
428
  end
356
429
 
357
430
  def format_compile_error
358
- error = current_error.dup
359
- @current_error = {}
431
+ error = current_issue.dup
432
+ @current_issue = {}
433
+ @formatting_error = false
360
434
  formatter.format_compile_error(error[:file_name],
361
435
  error[:file_path],
362
436
  error[:reason],
@@ -364,6 +438,17 @@ module XCPretty
364
438
  error[:cursor])
365
439
  end
366
440
 
441
+ def format_compile_warning
442
+ warning = current_issue.dup
443
+ @current_issue = {}
444
+ @formatting_warning = false
445
+ formatter.format_compile_warning(warning[:file_name],
446
+ warning[:file_path],
447
+ warning[:reason],
448
+ warning[:line],
449
+ warning[:cursor])
450
+ end
451
+
367
452
  def format_undefined_symbols
368
453
  result = formatter.format_undefined_symbols(
369
454
  current_linker_failure[:message],
@@ -418,4 +503,3 @@ module XCPretty
418
503
 
419
504
  end
420
505
  end
421
-