guard-jasmine 0.6.2 → 0.7.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.
File without changes
data/README.md CHANGED
@@ -154,10 +154,34 @@ be shown in the console:
154
154
  :specdoc => :always # Specdoc output options, either :always, :never or :failure
155
155
  # default: :failure
156
156
 
157
+ :focus => false # Specdoc focus to hide successful specs when at least one spec fails.
158
+ # default: true
159
+
160
+ :console => :always # Console.log output options, either :always, :never or :failure
161
+ # default: :failure
162
+
157
163
  With the option set to `:always`, the specdoc is shown with and without errors in your spec, whereas on with the option
158
164
  set to `:never`, there is no output at all, instead just a summary of the spec run is shown. The default option
159
165
  `:failure` shows the specdoc when at least one spec failed.
160
166
 
167
+ When `:focus` is enabled, only the failing specs are shown in the specdoc when at least one spec is failing.
168
+
169
+ The `:console` options adds captured console logs from the spec runner and adds them to the specdoc. Please note
170
+ that PhantomJS only support capturing of `console.log`, so the other log functions like `debug`, `warn`, `info` and
171
+ `error` are missing. Please vote on [Issue 232](http://code.google.com/p/phantomjs/issues/detail?id=232) if you like
172
+ to see support for more console methods coming to PhantomJS.
173
+
174
+ Another restriction on console logging is that currently only the first log parameter is passed. So instead of writing
175
+
176
+ console.log('Debug of %o with %s', object, string)
177
+
178
+ your should write
179
+
180
+ console.log('Debug of ' + object.toString() + ' width ' + string)
181
+
182
+ You can also give your vote on [Issue 36](http://code.google.com/p/phantomjs/issues/detail?id=36) to see support for
183
+ multiple console arguments.
184
+
161
185
  ### System notifications options
162
186
 
163
187
  These options affects what system notifications (growl, libnotify or notifu) are shown after a spec run:
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- url = ARGV[1] || 'http://127.0.0.1:3000/jasmine'
3
+ url = ARGV[0] || 'http://127.0.0.1:3000/jasmine'
4
4
  script = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'guard', 'jasmine', 'phantomjs', 'run-jasmine.coffee'))
5
5
 
6
6
  puts "Run Jasmine at #{ url }"
@@ -2,6 +2,7 @@ require 'guard'
2
2
  require 'guard/guard'
3
3
  require 'guard/watcher'
4
4
  require 'net/http'
5
+ require 'version'
5
6
 
6
7
  module Guard
7
8
 
@@ -25,7 +26,9 @@ module Guard
25
26
  :keep_failed => true,
26
27
  :all_after_pass => true,
27
28
  :max_error_notify => 3,
28
- :specdoc => :failure
29
+ :specdoc => :failure,
30
+ :console => :failure,
31
+ :focus => true
29
32
  }
30
33
 
31
34
  # Initialize Guard::Jasmine.
@@ -41,6 +44,8 @@ module Guard
41
44
  # @option options [Boolean] :keep_failed keep failed suites and add them to the next run again
42
45
  # @option options [Boolean] :all_after_pass run all suites after a suite has passed again after failing
43
46
  # @option options [Symbol] :specdoc options for the specdoc output, either :always, :never or :failure
47
+ # @option options [Symbol] :console options for the console.log output, either :always, :never or :failure
48
+ # @option options [Symbol] :focus options for focus on failures in the specdoc
44
49
  #
45
50
  def initialize(watchers = [], options = { })
46
51
  options = DEFAULT_OPTIONS.merge(options)
@@ -57,8 +62,12 @@ module Guard
57
62
  # @raise [:task_has_failed] when run_on_change has failed
58
63
  #
59
64
  def start
60
- if jasmine_runner_available?(options[:jasmine_url])
61
- run_all if options[:all_on_start]
65
+ if phantomjs_bin_valid?(options[:phantomjs_bin])
66
+ if jasmine_runner_available?(options[:jasmine_url])
67
+ run_all if options[:all_on_start]
68
+ end
69
+ else
70
+ throw :task_has_failed
62
71
  end
63
72
  end
64
73
 
@@ -126,30 +135,49 @@ module Guard
126
135
  if response.code.to_i == 200
127
136
  Formatter.info("Jasmine test runner is available at #{ url }")
128
137
  else
129
- notify_jasmine_runner_failure(url) if options[:notification]
138
+ notify_failure("Jasmine test runner isn't available", "Jasmine test runner isn't available at #{ url }")
130
139
  end
131
140
 
132
141
  response.code.to_i == 200
133
142
  end
134
143
 
135
144
  rescue Errno::ECONNREFUSED => e
136
- notify_jasmine_runner_failure(url)
145
+ notify_failure("Jasmine test runner isn't available", "Jasmine test runner isn't available at #{ url }")
137
146
 
138
147
  false
139
148
  end
140
149
  end
141
150
 
142
- # Notify that the Jasmine runner is not available.
151
+ # Verifies that the phantomjs bin is available and the
152
+ # right version is installed.
153
+ #
154
+ # @param [String] bin the location of the phantomjs bin
155
+ # @return [Boolean] when the runner is available
156
+ #
157
+ def phantomjs_bin_valid?(bin)
158
+ version = `#{ bin } --version`
159
+
160
+ if !version
161
+ notify_failure('PhantomJS binary missing', "PhantomJS binary doesn't exist at #{ bin }")
162
+ elsif version.to_version < '1.3.0'.to_version
163
+ notify_failure('Wrong PhantomJS version', "PhantomJS binary at #{ bin } must be at least version 1.3.0")
164
+ else
165
+ true
166
+ end
167
+ end
168
+
169
+ # Notify a failure.
143
170
  #
144
- # @param [String] url the url of the Jasmine runner
171
+ # @param title [String] the failure title
172
+ # @param message [String] the failure message
145
173
  #
146
- def notify_jasmine_runner_failure(url)
147
- message = "Jasmine test runner not available at #{ url }"
174
+ def notify_failure(title, message)
148
175
  Formatter.error(message)
149
176
  Formatter.notify(message,
150
- :title => 'Jasmine test runner not available',
177
+ :title => title,
151
178
  :image => :failed,
152
- :priority => 2)
179
+ :priority => 2) if options[:notification]
180
+ false
153
181
  end
154
182
 
155
183
  end
@@ -1,13 +1,5 @@
1
- # This file is the script that runs within PhantomJS and requests the Jasmine specs,
2
- # waits until they are ready, extracts the result form the dom and outputs a JSON
3
- # structure that is the parsed by Guard::Jasmine.
4
- #
5
- # This scripts needs the TrivialReporter to report the results.
6
- #
7
- # This file is inspired by the Jasmine runner that comes with the PhantomJS examples:
8
- # https://github.com/ariya/phantomjs/blob/master/examples/run-jasmine.coffee, by https://github.com/Roejames12
9
- #
10
- # This file is licensed under the BSD license.
1
+ # This file is the script that runs within PhantomJS, requests the Jasmine specs
2
+ # and waits until they are ready.
11
3
 
12
4
  # Wait until the test condition is true or a timeout occurs.
13
5
  #
@@ -15,11 +7,11 @@
15
7
  # @param [Function] ready the action when the condition is fulfilled
16
8
  # @param [Number] timeout the max amount of time to wait
17
9
  #
18
- waitFor = (condition, ready, timeout = 3000) ->
10
+ waitFor = (condition, ready, timeout = 5000) ->
19
11
  start = new Date().getTime()
20
12
  wait = ->
21
13
  if new Date().getTime() - start > timeout
22
- console.log JSON.stringify({ error: "Timeout requesting Jasmine test runner!" })
14
+ console.log JSON.stringify({ error: 'Timeout requesting Jasmine test runner!' })
23
15
  phantom.exit(1)
24
16
  else
25
17
  if condition()
@@ -33,71 +25,201 @@ waitFor = (condition, ready, timeout = 3000) ->
33
25
  specsReady = ->
34
26
  page.evaluate -> if document.body.querySelector('.finished-at') then true else false
35
27
 
36
- # Extract the data from a Jasmine TrivialReporter generated DOM
28
+ # Check arguments of the script.
29
+ #
30
+ if phantom.args.length isnt 1
31
+ console.log JSON.stringify({ error: 'Wrong usage of PhantomJS script!' })
32
+ phantom.exit()
33
+ else
34
+ url = phantom.args[0]
35
+
36
+ # Create the web page.
37
+ #
38
+ page = require('webpage').create()
39
+
40
+ # Used to collect log messages for later assignment to the spec
41
+ #
42
+ currentSpecId = 0
43
+ logs = {}
44
+
45
+ # Add logs to the given suite
37
46
  #
38
- extractResult = ->
47
+ # @param suite [Object} the suite result
48
+ #
49
+ page.addLogs = (suite) ->
50
+ for s in suite.suites
51
+ arguments.callee(s) if s
52
+
53
+ for spec in suite.specs
54
+ id = Number(spec['id'])
55
+ spec['logs'] = logs[id] if logs[id] && logs[id].length isnt 0
56
+ delete spec['id']
57
+
58
+ delete suite['id']
59
+ delete suite['parent']
60
+
61
+ # Capture console.log output to add it to
62
+ # the result when specs have finished.
63
+ #
64
+ page.onConsoleMessage = (msg, line, source) ->
65
+ if /^RUNNER_RESULT: ([\s\S]*)$/.test(msg)
66
+ result = JSON.parse(RegExp.$1)
67
+
68
+ for suite in result.suites
69
+ page.addLogs(suite)
70
+
71
+ console.log JSON.stringify(result, undefined, 2)
72
+
73
+ else if /^SPEC_START: (\d+)$/.test(msg)
74
+ currentSpecId = Number(RegExp.$1)
75
+ logs[currentSpecId] = []
76
+
77
+ else
78
+ logs[currentSpecId].push "#{ msg } in #{ source } (line #{ line })"
79
+
80
+ # Initialize the page before the JavaScript is run.
81
+ #
82
+ page.onInitialized = ->
39
83
  page.evaluate ->
40
- stats = /(\d+) specs?, (\d+) failures? in (\d+.\d+)s/.exec(document.body.querySelector('.description').innerText)
41
- specs = parseInt stats[1]
42
- failures = parseInt stats[2]
43
- time = parseFloat stats[3]
44
- passed = failures is 0
45
-
46
- result = {
47
- passed: passed
48
- stats: {
49
- specs: specs
50
- failures: failures
51
- time: time
52
- }
53
- suites: []
54
- }
55
-
56
- for suite in document.body.querySelectorAll('div.jasmine_reporter > div.suite')
57
- description = suite.querySelector('a.description')
58
- suite_ = {
59
- description: description.innerText
60
- specs: []
84
+
85
+ # Jasmine Reporter that logs reporter steps
86
+ # and results to the console.
87
+ #
88
+ class ConsoleReporter
89
+
90
+ runnerResult: {
91
+ passed: false
92
+ stats: {
93
+ specs: 0
94
+ failures: 0
95
+ time: 0.0
96
+ }
97
+ suites: []
61
98
  }
62
99
 
63
- for spec in suite.querySelectorAll('div.spec')
64
- status = spec.getAttribute('class').substring(5)
65
- if status isnt 'skipped'
66
- passed = status is 'passed'
67
- spec_ = {
68
- description: spec.querySelector('a.description').getAttribute 'title'
69
- passed: passed
100
+ currentSpecs: []
101
+ nestedSuiteResults: {}
102
+
103
+ # Report the start of a spec.
104
+ #
105
+ # @param spec [jasmine.Spec] the spec
106
+ #
107
+ reportSpecStarting: (spec) ->
108
+ console.log "SPEC_START: #{ spec.id }"
109
+
110
+ # Report results from a spec.
111
+ #
112
+ # @param spec [jasmine.Spec] the spec
113
+ #
114
+ reportSpecResults: (spec) ->
115
+ unless spec.results().skipped
116
+ specResult = {
117
+ id: spec.id
118
+ description: spec.description
119
+ passed: spec.results().failedCount is 0
70
120
  }
71
- spec_['error_message'] = spec.querySelector('div.resultMessage').innerText if not passed
72
- suite_['specs'].push spec_
73
121
 
74
- result['suites'].push suite_
122
+ if spec.results().failedCount isnt 0
123
+ messages = []
124
+ messages.push result.message for result in spec.results().getItems()
125
+ specResult['messages'] = messages if messages.length isnt 0
75
126
 
76
- console.log "JSON_RESULT: #{ JSON.stringify(result, undefined, 2) }"
127
+ @currentSpecs.push specResult
77
128
 
78
- phantom.exit()
129
+ # Report results from a suite.
130
+ #
131
+ # @param suite [jasmine.Suite] the suite
132
+ #
133
+ reportSuiteResults: (suite) ->
134
+ unless suite.results().skipped
135
+ suiteResult = {
136
+ id: suite.id
137
+ parent: suite.parentSuite?.id
138
+ description: suite.description
139
+ passed: suite.results().failedCount is 0
140
+ specs: @currentSpecs
141
+ suites: []
142
+ }
79
143
 
80
- # Check arguments of the script.
81
- #
82
- if phantom.args.length isnt 1
83
- console.log JSON.stringify({ error: "Wrong usage of PhantomJS script!" })
84
- phantom.exit()
85
- else
86
- url = phantom.args[0]
144
+ if suite.parentSuite?
145
+ parent = suite.parentSuite.id
146
+ @nestedSuiteResults[parent] = [] unless @nestedSuiteResults[parent]
147
+ @nestedSuiteResults[parent].push suiteResult
148
+ else
149
+ @addNestedSuites suiteResult
150
+ @removeEmptySuites suiteResult
87
151
 
88
- page = new WebPage()
152
+ if suiteResult.specs.length isnt 0 || suiteResult.suites.length isnt 0
153
+ @runnerResult.suites.push suiteResult
89
154
 
90
- # Output the Jasmine test runner result as JSON object.
91
- # Ignore all other calls to console.log that may come from the specs.
92
- #
93
- page.onConsoleMessage = (msg) ->
94
- console.log(RegExp.$1) if /^JSON_RESULT: ([\s\S]*)$/.test(msg)
155
+ @currentSpecs = []
156
+
157
+ # Report results from the runner.
158
+ #
159
+ # @param runner [jasmine.Runner] the runner
160
+ #
161
+ reportRunnerResults: (runner) ->
162
+ runtime = (new Date().getTime() - @startTime) / 1000
163
+
164
+ @runnerResult['passed'] = runner.results().failedCount is 0
165
+
166
+ @runnerResult['stats'] = {
167
+ specs: runner.results().totalCount
168
+ failures: runner.results().failedCount
169
+ time: runtime
170
+ }
171
+
172
+ console.log "RUNNER_RESULT: #{ JSON.stringify(@runnerResult) }"
173
+
174
+ # Report the start of the runner
175
+ #
176
+ # @param runner [jasmine.Runner] the runner
177
+ #
178
+ reportRunnerStarting: (runner) ->
179
+ @startTime = new Date().getTime()
180
+
181
+ # Add all nested suites that have previously
182
+ # been processed.
183
+ #
184
+ # @param suiteResult [Object] the suite result
185
+ #
186
+ addNestedSuites: (suiteResult) ->
187
+ if @nestedSuiteResults[suiteResult.id]
188
+ for suite in @nestedSuiteResults[suiteResult.id]
189
+ @addNestedSuites suite
190
+ suiteResult.suites.push suite
191
+
192
+ # Removes suites without child suites or specs.
193
+ #
194
+ # @param suiteResult [Object] the suite result
195
+ #
196
+ removeEmptySuites: (suiteResult) ->
197
+ suites = []
198
+
199
+ for suite in suiteResult.suites
200
+ @removeEmptySuites suite
201
+
202
+ suites.push suite if suite.suites.length isnt 0 || suite.specs.length isnt 0
203
+
204
+ suiteResult.suites = suites
205
+
206
+ # Log a message
207
+ #
208
+ # @param message [String] the log message
209
+ #
210
+ log: (message) ->
211
+
212
+ # Attach the console reporter when the document is ready.
213
+ #
214
+ window.onload = ->
215
+ jasmine.getEnv().addReporter(new ConsoleReporter())
95
216
 
96
217
  # Open web page and run the Jasmine test runner
97
218
  #
98
219
  page.open url, (status) ->
99
220
  if status isnt 'success'
100
- console.log "JSON_RESULT: #{ JSON.stringify({ error: "Unable to access Jasmine specs at #{ url }" }) }"
221
+ console.log JSON.stringify({ error: "Unable to access Jasmine specs at #{ url }" })
101
222
  phantom.exit()
102
223
  else
103
- waitFor specsReady, extractResult
224
+ waitFor specsReady, -> phantom.exit()
225
+
@@ -22,6 +22,7 @@ module Guard
22
22
  # @option options [Boolean] :hide_success hide success message notification
23
23
  # @option options [Integer] :max_error_notify maximum error notifications to show
24
24
  # @option options [Symbol] :specdoc options for the specdoc output, either :always, :never
25
+ # @option options [Symbol] :console options for the console.log output, either :always, :never or :failure
25
26
  # @return [Boolean, Array<String>] the status of the run and the failed files
26
27
  #
27
28
  def run(paths, options = { })
@@ -144,25 +145,26 @@ module Guard
144
145
  #
145
146
  def evaluate_response(output, file, options)
146
147
  json = output.read
148
+ result = {}
147
149
 
148
150
  begin
149
151
  result = MultiJson.decode(json)
150
- output.close
151
-
152
- if result['error']
153
- notify_runtime_error(result, options)
154
- else
155
- result['file'] = file
156
- notify_spec_result(result, options)
157
- end
158
-
159
- result
160
-
161
152
  rescue Exception => e
162
153
  Formatter.error("Cannot decode JSON from PhantomJS runner: #{ e.message }")
163
154
  Formatter.error('Please report an issue at: https://github.com/netzpirat/guard-jasmine/issues')
164
155
  Formatter.error(json)
156
+ ensure
157
+ output.close
165
158
  end
159
+
160
+ if result['error']
161
+ notify_runtime_error(result, options)
162
+ else
163
+ result['file'] = file
164
+ notify_spec_result(result, options)
165
+ end
166
+
167
+ result
166
168
  end
167
169
 
168
170
  # Notification when a system error happens that
@@ -193,58 +195,129 @@ module Guard
193
195
  plural = failures == 1 ? '' : 's'
194
196
 
195
197
  message = "#{ specs } specs, #{ failures } failure#{ plural }\nin #{ time } seconds"
198
+ passed = failures == 0
196
199
 
197
- if failures != 0
198
- show_specdoc(result) if options[:specdoc] != :never
200
+ if passed
201
+ report_specdoc(result, passed, options) if options[:specdoc] == :always
202
+ Formatter.success(message)
203
+ Formatter.notify(message, :title => 'Jasmine suite passed') if options[:notification] && !options[:hide_success]
204
+ else
205
+ report_specdoc(result, passed, options) if options[:specdoc] != :never
199
206
  Formatter.error(message)
200
207
  notify_errors(result, options)
201
208
  Formatter.notify(message, :title => 'Jasmine suite failed', :image => :failed, :priority => 2) if options[:notification]
202
- else
203
- show_specdoc(result) if options[:specdoc] == :always
204
- Formatter.success(message)
205
- Formatter.notify(message, :title => 'Jasmine suite passed') if options[:notification] && !options[:hide_success]
206
209
  end
207
210
  end
208
211
 
209
212
  # Specdoc like formatting of the result.
210
213
  #
211
214
  # @param [Hash] result the suite result
215
+ # @param [Boolean] passed status
216
+ # @param [Hash] options the options
217
+ # @option options [Symbol] :console options for the console.log output, either :always, :never or :failure
212
218
  #
213
- def show_specdoc(result)
219
+ def report_specdoc(result, passed, options)
214
220
  result['suites'].each do |suite|
215
- Formatter.suite_name("➥ #{ suite['description'] }")
216
-
217
- suite['specs'].each do |spec|
218
- if spec['passed']
219
- Formatter.success(" #{ spec['description'] }")
220
- else
221
- Formatter.spec_failed(" #{ spec['description'] }")
222
- Formatter.spec_failed(" ➤ #{ format_error_message(spec['error_message'], false) }")
221
+ report_specdoc_suite(suite, passed, options)
222
+ end
223
+ end
224
+
225
+ # Show the suite result.
226
+ #
227
+ # @param [Hash] suite the suite
228
+ # @param [Boolean] passed status
229
+ # @param [Hash] options the options
230
+ # @option options [Symbol] :console options for the console.log output, either :always, :never or :failure
231
+ # @option options [Symbol] :focus options for focus on failures in the specdoc
232
+ # @param [Number] level the indention level
233
+ #
234
+ def report_specdoc_suite(suite, passed, options, level = 0)
235
+ Formatter.suite_name((' ' * level) + suite['description']) if passed || options[:focus] && contains_failed_spec?(suite)
236
+
237
+ suite['specs'].each do |spec|
238
+ if spec['passed']
239
+ if passed || !options[:focus]
240
+ Formatter.success(indent(" ✔ #{ spec['description'] }", level))
241
+ report_specdoc_logs(spec, options, level)
242
+ end
243
+ else
244
+ Formatter.spec_failed(indent(" ✘ #{ spec['description'] }", level))
245
+ spec['messages'].each do |message|
246
+ Formatter.spec_failed(indent(" ➤ #{ format_message(message, false) }", level))
223
247
  end
248
+ report_specdoc_logs(spec, options, level)
224
249
  end
225
250
  end
251
+
252
+ suite['suites'].each { |suite| report_specdoc_suite(suite, passed, options, level + 2) } if suite['suites']
226
253
  end
227
254
 
228
- # Specdoc like formatting of the result.
255
+ # Shows the logs for a given spec.
256
+ #
257
+ # @param [Hash] spec the spec result
258
+ # @param [Hash] options the options
259
+ # @option options [Symbol] :console options for the console.log output, either :always, :never or :failure
260
+ # @param [Number] level the indention level
261
+ #
262
+ def report_specdoc_logs(spec, options, level)
263
+ if spec['logs'] && (options[:console] == :always || (options[:console] == :failure && !spec['passed']))
264
+ spec['logs'].each do |log|
265
+ Formatter.info(indent(" • #{ format_message(log, true) }", level))
266
+ end
267
+ end
268
+ end
269
+
270
+ # Indent a message.
271
+ #
272
+ # @param [String] message the message
273
+ # @param [Number] level the indention level
274
+ #
275
+ def indent(message, level)
276
+ (' ' * level) + message
277
+ end
278
+
279
+ # Show system notifications about the occurred errors.
229
280
  #
230
281
  # @param [Hash] result the suite result
282
+ # @param [Hash] options the options
231
283
  # @option options [Integer] :max_error_notify maximum error notifications to show
232
- # @option options [Boolean] :hide_success hide success message notification
284
+ # @option options [Boolean] :notification show notifications
233
285
  #
234
286
  def notify_errors(result, options)
235
- result['suites'].each do |suite|
236
- suite['specs'].each_with_index do |spec, index|
237
- if !spec['passed'] && options[:max_error_notify] > index
238
- Formatter.notify("#{ spec['description'] }: #{ format_error_message(spec['error_message'], true) }",
239
- :title => 'Jasmine spec failed',
240
- :image => :failed,
241
- :priority => 2) if options[:notification]
242
- end
287
+ collect_specs(result['suites']).each_with_index do |spec, index|
288
+ if !spec['passed'] && options[:max_error_notify] > index
289
+ msg = spec['messages'].map { |message| format_message(message, true) }.join(', ')
290
+ Formatter.notify("#{ spec['description'] }: #{ msg }",
291
+ :title => 'Jasmine spec failed',
292
+ :image => :failed,
293
+ :priority => 2) if options[:notification]
243
294
  end
244
295
  end
245
296
  end
246
297
 
247
- # Formats the error message.
298
+ # Tests if the given suite has a failing spec underneath.
299
+ #
300
+ # @param [Hash] suite the suite result
301
+ # @return [Boolean] the search result
302
+ #
303
+ def contains_failed_spec?(suite)
304
+ collect_specs([suite]).any? { |spec| !spec['passed'] }
305
+ end
306
+
307
+ # Get all specs from the suites and its nested suites.
308
+ #
309
+ # @param suites [Array<Hash>] the suites results
310
+ # @param [Array<Hash>] all specs
311
+ #
312
+ def collect_specs(suites)
313
+ suites.inject([]) do |specs, suite|
314
+ specs = (specs | suite['specs']) if suite['specs']
315
+ specs = (specs | collect_specs(suite['suites'])) if suite['suites']
316
+ specs
317
+ end
318
+ end
319
+
320
+ # Formats a message.
248
321
  #
249
322
  # Known message styles:
250
323
  #
@@ -254,7 +327,7 @@ module Guard
254
327
  # @param [Boolean] short show a short version of the message
255
328
  # @return [String] the cleaned error message
256
329
  #
257
- def format_error_message(message, short)
330
+ def format_message(message, short)
258
331
  if message =~ /(.*?) in http.+?assets\/(.*)\?body=\d+\s\((line\s\d+)/
259
332
  short ? $1 : "#{ $1 } in #{ $2 } on #{ $3 }"
260
333
  else
@@ -1,6 +1,6 @@
1
1
  module Guard
2
2
  module JasmineVersion
3
3
  # Guard::Jasmine version that is used for the Gem specification
4
- VERSION = '0.6.2'
4
+ VERSION = '0.7.0'
5
5
  end
6
6
  end
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 6
9
- - 2
10
- version: 0.6.2
8
+ - 7
9
+ - 0
10
+ version: 0.7.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Michael Kessler
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-01 00:00:00 Z
18
+ date: 2011-10-10 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: guard
@@ -50,9 +50,25 @@ dependencies:
50
50
  type: :runtime
51
51
  version_requirements: *id002
52
52
  - !ruby/object:Gem::Dependency
53
- name: bundler
53
+ name: version
54
54
  prerelease: false
55
55
  requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ hash: 23
61
+ segments:
62
+ - 1
63
+ - 0
64
+ - 0
65
+ version: 1.0.0
66
+ type: :runtime
67
+ version_requirements: *id003
68
+ - !ruby/object:Gem::Dependency
69
+ name: bundler
70
+ prerelease: false
71
+ requirement: &id004 !ruby/object:Gem::Requirement
56
72
  none: false
57
73
  requirements:
58
74
  - - ~>
@@ -63,11 +79,11 @@ dependencies:
63
79
  - 0
64
80
  version: "1.0"
65
81
  type: :development
66
- version_requirements: *id003
82
+ version_requirements: *id004
67
83
  - !ruby/object:Gem::Dependency
68
84
  name: guard-rspec
69
85
  prerelease: false
70
- requirement: &id004 !ruby/object:Gem::Requirement
86
+ requirement: &id005 !ruby/object:Gem::Requirement
71
87
  none: false
72
88
  requirements:
73
89
  - - ~>
@@ -78,11 +94,11 @@ dependencies:
78
94
  - 4
79
95
  version: "0.4"
80
96
  type: :development
81
- version_requirements: *id004
97
+ version_requirements: *id005
82
98
  - !ruby/object:Gem::Dependency
83
99
  name: rspec
84
100
  prerelease: false
85
- requirement: &id005 !ruby/object:Gem::Requirement
101
+ requirement: &id006 !ruby/object:Gem::Requirement
86
102
  none: false
87
103
  requirements:
88
104
  - - ~>
@@ -93,11 +109,11 @@ dependencies:
93
109
  - 6
94
110
  version: "2.6"
95
111
  type: :development
96
- version_requirements: *id005
112
+ version_requirements: *id006
97
113
  - !ruby/object:Gem::Dependency
98
114
  name: yard
99
115
  prerelease: false
100
- requirement: &id006 !ruby/object:Gem::Requirement
116
+ requirement: &id007 !ruby/object:Gem::Requirement
101
117
  none: false
102
118
  requirements:
103
119
  - - ~>
@@ -109,11 +125,11 @@ dependencies:
109
125
  - 2
110
126
  version: 0.7.2
111
127
  type: :development
112
- version_requirements: *id006
128
+ version_requirements: *id007
113
129
  - !ruby/object:Gem::Dependency
114
130
  name: kramdown
115
131
  prerelease: false
116
- requirement: &id007 !ruby/object:Gem::Requirement
132
+ requirement: &id008 !ruby/object:Gem::Requirement
117
133
  none: false
118
134
  requirements:
119
135
  - - ~>
@@ -125,7 +141,24 @@ dependencies:
125
141
  - 3
126
142
  version: 0.13.3
127
143
  type: :development
128
- version_requirements: *id007
144
+ version_requirements: *id008
145
+ - !ruby/object:Gem::Dependency
146
+ name: pry
147
+ prerelease: false
148
+ requirement: &id009 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ~>
152
+ - !ruby/object:Gem::Version
153
+ hash: 27
154
+ segments:
155
+ - 0
156
+ - 9
157
+ - 6
158
+ - 2
159
+ version: 0.9.6.2
160
+ type: :development
161
+ version_requirements: *id009
129
162
  description: Guard::Jasmine automatically tests your Jasmine specs on PhantomJS
130
163
  email:
131
164
  - michi@netzpiraten.ch
@@ -149,8 +182,7 @@ files:
149
182
  - lib/guard/jasmine/version.rbc
150
183
  - lib/guard/jasmine.rb
151
184
  - lib/guard/jasmine.rbc
152
- - LICENSE.MIT
153
- - LICENSE.BSD
185
+ - LICENSE
154
186
  - README.md
155
187
  homepage: http://github.com/netzpirat/guard-jasmine
156
188
  licenses: []
@@ -1,22 +0,0 @@
1
- Redistribution and use in source and binary forms, with or without
2
- modification, are permitted provided that the following conditions are met:
3
-
4
- * Redistributions of source code must retain the above copyright
5
- notice, this list of conditions and the following disclaimer.
6
- * Redistributions in binary form must reproduce the above copyright
7
- notice, this list of conditions and the following disclaimer in the
8
- documentation and/or other materials provided with the distribution.
9
- * Neither the name of the <organization> nor the
10
- names of its contributors may be used to endorse or promote products
11
- derived from this software without specific prior written permission.
12
-
13
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16
- ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
17
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.