guard-jasmine 1.19.2 → 2.0.0beta1

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.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +31 -234
  3. data/lib/generators/guard_jasmine/install_generator.rb +17 -0
  4. data/lib/generators/guard_jasmine/templates/Guardfile +9 -0
  5. data/lib/guard/jasmine.rb +18 -15
  6. data/lib/guard/jasmine/cli.rb +5 -5
  7. data/lib/guard/jasmine/formatter.rb +10 -0
  8. data/lib/guard/jasmine/inspector.rb +1 -2
  9. data/lib/guard/jasmine/phantomjs/guard-jasmine.js +54 -180
  10. data/lib/guard/jasmine/phantomjs/guard-reporter.js +187 -0
  11. data/lib/guard/jasmine/phantomjs/src/guard-jasmine.coffee +101 -0
  12. data/lib/guard/jasmine/phantomjs/src/guard-reporter.coffee +109 -0
  13. data/lib/guard/jasmine/phantomjs/test/guard-reporter_spec.coffee +41 -0
  14. data/lib/guard/jasmine/runner.rb +178 -268
  15. data/lib/guard/jasmine/server.rb +17 -3
  16. data/lib/guard/jasmine/util.rb +1 -7
  17. data/lib/guard/jasmine/version.rb +1 -1
  18. metadata +135 -26
  19. data/lib/guard/jasmine/phantomjs/guard-jasmine.coffee +0 -193
  20. data/lib/guard/jasmine/phantomjs/lib/console.js +0 -188
  21. data/lib/guard/jasmine/phantomjs/lib/junit_reporter.js +0 -224
  22. data/lib/guard/jasmine/phantomjs/lib/reporter.js +0 -144
  23. data/lib/guard/jasmine/phantomjs/lib/result.js +0 -155
  24. data/lib/guard/jasmine/phantomjs/src/console.coffee +0 -149
  25. data/lib/guard/jasmine/phantomjs/src/reporter.coffee +0 -139
  26. data/lib/guard/jasmine/phantomjs/src/result.coffee +0 -95
  27. data/lib/guard/jasmine/phantomjs/test/console_spec.coffee +0 -125
  28. data/lib/guard/jasmine/phantomjs/test/reporter_spec.coffee +0 -0
  29. data/lib/guard/jasmine/phantomjs/test/result_spec.coffee +0 -311
@@ -3,6 +3,7 @@
3
3
  require 'socket'
4
4
  require 'timeout'
5
5
  require 'childprocess'
6
+ require 'jasmine'
6
7
 
7
8
  module Guard
8
9
  class Jasmine
@@ -53,13 +54,27 @@ module Guard
53
54
  end
54
55
  end
55
56
 
57
+ # A port was not specified, therefore we attempt to detect the best port to use
58
+ # @param [Hash] options the server options
59
+ # @option options [Symbol] server the rack server to use
60
+ # @return [Integer] port number
61
+ def choose_server_port(options)
62
+ if options[:server] == :jasmine_gem
63
+ ::Jasmine.config.port(:server)
64
+ else
65
+ ::Guard::Jasmine.find_free_server_port
66
+ end
67
+ end
68
+
56
69
  # Detect the server to use
57
70
  #
58
71
  # @param [String] spec_dir the spec directory
59
72
  # @return [Symbol] the server strategy
60
73
  #
61
74
  def detect_server(spec_dir)
62
- if File.exists?('config.ru')
75
+ if spec_dir && File.exists?(File.join(spec_dir, 'support','jasmine.yml'))
76
+ :jasmine_gem
77
+ elsif File.exists?('config.ru')
63
78
  %w(unicorn thin mongrel puma).each do |server|
64
79
  begin
65
80
  require server
@@ -69,8 +84,6 @@ module Guard
69
84
  end
70
85
  end
71
86
  :webrick
72
- elsif spec_dir && File.exists?(File.join(spec_dir, 'support', 'jasmine.yml'))
73
- :jasmine_gem
74
87
  else
75
88
  :none
76
89
  end
@@ -136,6 +149,7 @@ module Guard
136
149
  # @option options [Symbol] server the rack server to use
137
150
  #
138
151
  def start_rake_server(port, task, options)
152
+
139
153
  ::Guard::UI.info "Guard::Jasmine starts Jasmine Gem test server on port #{ port }."
140
154
 
141
155
  self.process = ChildProcess.build('ruby', '-S', 'rake', task, "JASMINE_PORT=#{ port }")
@@ -86,13 +86,7 @@ module Guard
86
86
  # @return [Integer] a free server port
87
87
  #
88
88
  def find_free_server_port
89
- server = TCPServer.new('127.0.0.1', 0)
90
- port = server.addr[1]
91
- server.close
92
-
93
- port
94
- rescue Errno::EADDRINUSE
95
- retry
89
+ ::Jasmine.find_unused_port
96
90
  end
97
91
 
98
92
  # Cross-platform way of finding an executable in the $PATH.
@@ -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 = '1.19.2'
4
+ VERSION = '2.0.0beta1'
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,37 +1,108 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: guard-jasmine
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.19.2
4
+ version: 2.0.0beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Kessler
8
+ - Nathan Stitt
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-04-02 00:00:00.000000000 Z
12
+ date: 2014-11-24 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: guard
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
- - - ">="
18
+ - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: 2.0.0
20
+ version: '2.8'
20
21
  type: :runtime
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
- - - ">="
25
+ - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: 2.0.0
27
+ version: '2.8'
28
+ - !ruby/object:Gem::Dependency
29
+ name: jasmine
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '2.1'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '2.1'
27
42
  - !ruby/object:Gem::Dependency
28
43
  name: multi_json
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.10'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.10'
56
+ - !ruby/object:Gem::Dependency
57
+ name: childprocess
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '0.5'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '0.5'
70
+ - !ruby/object:Gem::Dependency
71
+ name: thor
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '0.19'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '0.19'
84
+ - !ruby/object:Gem::Dependency
85
+ name: tilt
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '2.0'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '2.0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: bundler
29
100
  requirement: !ruby/object:Gem::Requirement
30
101
  requirements:
31
102
  - - ">="
32
103
  - !ruby/object:Gem::Version
33
104
  version: '0'
34
- type: :runtime
105
+ type: :development
35
106
  prerelease: false
36
107
  version_requirements: !ruby/object:Gem::Requirement
37
108
  requirements:
@@ -39,13 +110,13 @@ dependencies:
39
110
  - !ruby/object:Gem::Version
40
111
  version: '0'
41
112
  - !ruby/object:Gem::Dependency
42
- name: childprocess
113
+ name: rake
43
114
  requirement: !ruby/object:Gem::Requirement
44
115
  requirements:
45
116
  - - ">="
46
117
  - !ruby/object:Gem::Version
47
118
  version: '0'
48
- type: :runtime
119
+ type: :development
49
120
  prerelease: false
50
121
  version_requirements: !ruby/object:Gem::Requirement
51
122
  requirements:
@@ -53,13 +124,13 @@ dependencies:
53
124
  - !ruby/object:Gem::Version
54
125
  version: '0'
55
126
  - !ruby/object:Gem::Dependency
56
- name: thor
127
+ name: rack
57
128
  requirement: !ruby/object:Gem::Requirement
58
129
  requirements:
59
130
  - - ">="
60
131
  - !ruby/object:Gem::Version
61
132
  version: '0'
62
- type: :runtime
133
+ type: :development
63
134
  prerelease: false
64
135
  version_requirements: !ruby/object:Gem::Requirement
65
136
  requirements:
@@ -67,13 +138,13 @@ dependencies:
67
138
  - !ruby/object:Gem::Version
68
139
  version: '0'
69
140
  - !ruby/object:Gem::Dependency
70
- name: tilt
141
+ name: guard-coffeescript
71
142
  requirement: !ruby/object:Gem::Requirement
72
143
  requirements:
73
144
  - - ">="
74
145
  - !ruby/object:Gem::Version
75
146
  version: '0'
76
- type: :runtime
147
+ type: :development
77
148
  prerelease: false
78
149
  version_requirements: !ruby/object:Gem::Requirement
79
150
  requirements:
@@ -81,7 +152,49 @@ dependencies:
81
152
  - !ruby/object:Gem::Version
82
153
  version: '0'
83
154
  - !ruby/object:Gem::Dependency
84
- name: bundler
155
+ name: guard-shell
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: guard-rspec
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ - !ruby/object:Gem::Dependency
183
+ name: rspec
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - "~>"
187
+ - !ruby/object:Gem::Version
188
+ version: '3'
189
+ type: :development
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - "~>"
194
+ - !ruby/object:Gem::Version
195
+ version: '3'
196
+ - !ruby/object:Gem::Dependency
197
+ name: yard
85
198
  requirement: !ruby/object:Gem::Requirement
86
199
  requirements:
87
200
  - - ">="
@@ -97,6 +210,7 @@ dependencies:
97
210
  description: Guard::Jasmine automatically tests your Jasmine specs on PhantomJS
98
211
  email:
99
212
  - michi@flinkfinger.com
213
+ - nathan@stitt.org
100
214
  executables:
101
215
  - guard-jasmine
102
216
  - guard-jasmine-debug
@@ -107,23 +221,18 @@ files:
107
221
  - README.md
108
222
  - bin/guard-jasmine
109
223
  - bin/guard-jasmine-debug
224
+ - lib/generators/guard_jasmine/install_generator.rb
225
+ - lib/generators/guard_jasmine/templates/Guardfile
110
226
  - lib/guard/jasmine.rb
111
227
  - lib/guard/jasmine/cli.rb
112
228
  - lib/guard/jasmine/coverage.rb
113
229
  - lib/guard/jasmine/formatter.rb
114
230
  - lib/guard/jasmine/inspector.rb
115
- - lib/guard/jasmine/phantomjs/guard-jasmine.coffee
116
231
  - lib/guard/jasmine/phantomjs/guard-jasmine.js
117
- - lib/guard/jasmine/phantomjs/lib/console.js
118
- - lib/guard/jasmine/phantomjs/lib/junit_reporter.js
119
- - lib/guard/jasmine/phantomjs/lib/reporter.js
120
- - lib/guard/jasmine/phantomjs/lib/result.js
121
- - lib/guard/jasmine/phantomjs/src/console.coffee
122
- - lib/guard/jasmine/phantomjs/src/reporter.coffee
123
- - lib/guard/jasmine/phantomjs/src/result.coffee
124
- - lib/guard/jasmine/phantomjs/test/console_spec.coffee
125
- - lib/guard/jasmine/phantomjs/test/reporter_spec.coffee
126
- - lib/guard/jasmine/phantomjs/test/result_spec.coffee
232
+ - lib/guard/jasmine/phantomjs/guard-reporter.js
233
+ - lib/guard/jasmine/phantomjs/src/guard-jasmine.coffee
234
+ - lib/guard/jasmine/phantomjs/src/guard-reporter.coffee
235
+ - lib/guard/jasmine/phantomjs/test/guard-reporter_spec.coffee
127
236
  - lib/guard/jasmine/runner.rb
128
237
  - lib/guard/jasmine/server.rb
129
238
  - lib/guard/jasmine/task.rb
@@ -150,7 +259,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
259
  version: 1.3.6
151
260
  requirements: []
152
261
  rubyforge_project: guard-jasmine
153
- rubygems_version: 2.2.2
262
+ rubygems_version: 2.4.3
154
263
  signing_key:
155
264
  specification_version: 4
156
265
  summary: Guard gem for headless testing with Jasmine
@@ -1,193 +0,0 @@
1
- # This file is the script that runs within PhantomJS, requests the Jasmine specs
2
- # and waits until they are ready.
3
- phantom.injectJs 'lib/result.js'
4
-
5
- # Set default values
6
- options =
7
- url: phantom.args[0] || 'http://127.0.0.1:3000/jasmine'
8
- timeout: parseInt(phantom.args[1] || 10000)
9
- specdoc: phantom.args[2] || 'failure'
10
- focus: /true/i.test phantom.args[3]
11
- console: phantom.args[4] || 'failure'
12
- errors: phantom.args[5] || 'failure'
13
- junit: /true/i.test phantom.args[6]
14
- junit_consolidate: /true/i.test phantom.args[7]
15
- junit_save_path: phantom.args[8] || ''
16
-
17
- # Create the web page.
18
- #
19
- page = require('webpage').create()
20
-
21
- # Used to collect log messages for later assignment to the spec
22
- #
23
- currentSpecId = -1
24
- logs = {}
25
- errors = {}
26
- resultsKey = "__jr" + Math.ceil(Math.random() * 1000000)
27
- fs = require("fs")
28
-
29
- # Catch JavaScript errors
30
- #
31
- page.onError = (msg, trace) ->
32
- if currentSpecId
33
- errors[currentSpecId] ||= []
34
- errors[currentSpecId].push({ msg: msg, trace: trace })
35
-
36
- # Capture console.log output to add it to
37
- # the result when specs have finished.
38
- #
39
- page.onConsoleMessage = (msg, line, source) ->
40
- if /^RUNNER_END$/.test(msg)
41
- result = page.evaluate -> window.reporter.runnerResult
42
- console.log JSON.stringify(new Result(result, logs, errors, options).process())
43
- page.evaluate -> window.resultReceived = true
44
-
45
- else if /^SPEC_START: (\d+)$/.test(msg)
46
- currentSpecId = Number(RegExp.$1)
47
-
48
- else
49
- logs[currentSpecId] ||= []
50
- logs[currentSpecId].push(msg)
51
-
52
- # Initialize the page before the JavaScript is run.
53
- #
54
- page.onInitialized = ->
55
- overloadPageEvaluate(page)
56
- setupWriteFileFunction(page, resultsKey, fs.separator)
57
-
58
- page.injectJs 'lib/console.js'
59
- page.injectJs 'lib/reporter.js'
60
- page.injectJs 'lib/junit_reporter.js'
61
-
62
- setupReporters = ->
63
- # Attach the console reporter when the document is ready.
64
- window.onload = ->
65
- window.onload = null
66
- window.resultReceived = false
67
- window.reporter = new ConsoleReporter()
68
- if window.jasmine
69
- jasmine.getEnv().addReporter(new JUnitXmlReporter("%save_path%", "%consolidate%"))
70
- jasmine.getEnv().addReporter(window.reporter)
71
-
72
- page.evaluate(setupReporters, {save_path: options.junit_save_path, consolidate: options.junit_consolidate})
73
-
74
-
75
- getXmlResults = (page, key) ->
76
- getWindowObj = ->
77
- window["%resultsObj%"] || {}
78
- page.evaluate getWindowObj, {resultsObj: key}
79
-
80
- replaceFunctionPlaceholders= (fn, replacements) ->
81
- if replacements && typeof replacements == 'object'
82
- fn = fn.toString()
83
- for p of replacements
84
- if replacements.hasOwnProperty(p)
85
- match = new RegExp("%" + p + "%", "g")
86
- loop
87
- fn = fn.replace(match, replacements[p])
88
- break unless fn.indexOf(match) != -1
89
- fn
90
-
91
- overloadPageEvaluate = (page) ->
92
- page._evaluate = page.evaluate
93
- page.evaluate = (fn, replacements) ->
94
- page._evaluate(replaceFunctionPlaceholders(fn, replacements))
95
- page
96
-
97
- setupWriteFileFunction= (page,key, path_separator) ->
98
- saveData = () ->
99
- window["%resultsObj%"] = {}
100
- window.fs_path_separator = "%fs_path_separator%"
101
- window.__phantom_writeFile = (filename, text) ->
102
- window["%resultsObj%"][filename] = text;
103
-
104
- page.evaluate saveData, {resultsObj: key, fs_path_separator: path_separator}
105
-
106
- # Open web page and run the Jasmine test runner
107
- #
108
- page.open options.url, (status) ->
109
- # Avoid that a failed iframe load breaks the runner, see https://github.com/netzpirat/guard-jasmine/pull/19
110
- page.onLoadFinished = ->
111
- if status isnt 'success'
112
- console.log JSON.stringify({ error: "Unable to access Jasmine specs at #{ options.url }" })
113
- phantom.exit()
114
- else
115
- waitFor jasmineReady, jasmineAvailable, options.timeout, jasmineMissing
116
-
117
- # Test if the jasmine has been loaded
118
- #
119
- jasmineReady = ->
120
- page.evaluate -> window.jasmine
121
-
122
- # Start specs after they are have been loaded
123
- #
124
- jasmineAvailable = ->
125
- waitFor specsReady, specsDone, options.timeout, specsTimedout
126
-
127
- # Error message for when jasmine never loaded asynchronously
128
- #
129
- jasmineMissing = ->
130
- text = page.evaluate -> document.getElementsByTagName('body')[0]?.innerText
131
-
132
- if text
133
- error = """
134
- The Jasmine reporter is not available!
135
-
136
- #{ text }
137
- """
138
- console.log JSON.stringify({ error: error })
139
- else
140
- console.log JSON.stringify({ error: 'The Jasmine reporter is not available!' })
141
-
142
- # Test if the specs have finished.
143
- #
144
- specsReady = ->
145
- page.evaluate -> window.resultReceived
146
-
147
- # Error message for when specs time out
148
- #
149
- specsTimedout = ->
150
- text = page.evaluate -> document.getElementsByTagName('body')[0]?.innerText
151
- if text
152
- error = """
153
- Timeout waiting for the Jasmine test results!
154
-
155
- #{ text }
156
- """
157
- console.log JSON.stringify({ error: error })
158
- else
159
- console.log JSON.stringify({ error: 'Timeout for the Jasmine test results!' })
160
-
161
- specsDone = ->
162
- if options.junit == true
163
- xml_results = getXmlResults(page, resultsKey)
164
- for filename of xml_results
165
- if xml_results.hasOwnProperty(filename) && (output = xml_results[filename]) && typeof(output) == 'string'
166
- fs.write(filename, output, 'w')
167
-
168
- phantom.exit()
169
-
170
- # Wait until the test condition is true or a timeout occurs.
171
- #
172
- # @param [Function] test the test that returns true if condition is met
173
- # @param [Function] ready the action when the condition is fulfilled
174
- # @param [Number] timeout the max amount of time to wait in milliseconds
175
- #
176
- waitFor = (test, ready, timeout = 10000, timeoutFunction) ->
177
- start = Date.now()
178
- condition = false
179
- interval = undefined
180
-
181
- wait = ->
182
- if (Date.now() - start < timeout) and not condition
183
- condition = test()
184
- else
185
- clearInterval interval
186
-
187
- if condition
188
- ready()
189
- else
190
- timeoutFunction()
191
- phantom.exit(1)
192
-
193
- interval = setInterval wait, 250