guard-jasmine 1.19.2 → 2.0.0beta1

Sign up to get free protection for your applications and to get access to all the features.
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