gusto 1.0.0.beta14 → 1.0.0.beta15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/assets/test_results.sass +11 -0
- data/lib/HtmlReport.coffee +19 -8
- data/lib/Spec.coffee +0 -1
- data/lib/Spec/DSL.coffee +8 -2
- data/lib/Spec/Matchers.coffee +36 -16
- data/lib/Spec/Test.coffee +2 -1
- data/lib/Spec/Util.coffee +5 -2
- data/lib/gusto.rb +17 -33
- data/lib/gusto/cli_renderer.rb +20 -1
- data/lib/gusto/server.rb +2 -2
- data/lib/gusto/server_spawner.rb +68 -0
- data/lib/gusto/version.rb +1 -1
- metadata +36 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e0f50ae2b7995069000f268d76a88a666b404f1
|
4
|
+
data.tar.gz: b31c91120be48f1ab3e772fae7509bb5eb85b032
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7844eb2a0330065e0b8046625aa7dbb533e1475537f6fd2201104d158100f39fd6aa5ab8d3fb2d4d09171ff912087935e4b915f92bd04700460599079df73867
|
7
|
+
data.tar.gz: d0566ae83ccd4f9ea6a41d0184ebba8382459c518140062c794c712b5038f98dc6d944f5dd80868820a66ceb0a575b5f640ddd8730a1cf5a94d2843bc5004ec5
|
data/assets/test_results.sass
CHANGED
@@ -31,6 +31,17 @@
|
|
31
31
|
white-space: nowrap
|
32
32
|
text-overflow: ellipsis
|
33
33
|
|
34
|
+
.test-results--full-error-message
|
35
|
+
padding: 10px
|
36
|
+
background: lighten($red, 47.5%)
|
37
|
+
color: #900
|
38
|
+
|
39
|
+
.test-results--stack-trace
|
40
|
+
font: 13px/1.6em Consolas, monaco, monospace
|
41
|
+
background: lighten($red, 50%)
|
42
|
+
padding: 10px
|
43
|
+
margin: 0
|
44
|
+
|
34
45
|
.test-results--test--failed
|
35
46
|
background: lighten($red, 45%)
|
36
47
|
|
data/lib/HtmlReport.coffee
CHANGED
@@ -41,16 +41,27 @@ class window.HtmlReport
|
|
41
41
|
html + '</ul>'
|
42
42
|
|
43
43
|
testResultsReport: (report) ->
|
44
|
-
"
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
44
|
+
html = "<li class=\"test-results--test test-results--test--#{@testResultsStatusClass report.status}\">"
|
45
|
+
html += "<div class=\"test-results--title\">#{report.title}</div>"
|
46
|
+
if report.error
|
47
|
+
html += @testResultsErrorReport(report)
|
48
|
+
if report.status == Spec.Report.Failed
|
49
|
+
html += @testResultsErrorDetails(report)
|
50
|
+
if report.subreports.length
|
51
|
+
html += @testResultsReports(report.subreports)
|
52
|
+
html += "</li>"
|
53
|
+
html
|
51
54
|
|
52
55
|
testResultsErrorReport: (report) ->
|
53
|
-
"<div class=\"test-results--error-message\">#{report.error}</div>"
|
56
|
+
"<div class=\"test-results--error-message\">#{Spec.Util.escape report.error}</div>"
|
57
|
+
|
58
|
+
testResultsErrorDetails: (report) ->
|
59
|
+
details = "<div class=\"test-results--error-details\">"
|
60
|
+
details += "<div class=\"test-results--full-error-message\">#{report.htmlMessage || Spec.Util.escape(report.error)}</div>"
|
61
|
+
if report.stack
|
62
|
+
details += "<pre class=\"test-results--stack-trace\">#{Spec.Util.escape report.stack}</pre>"
|
63
|
+
details += "</div>"
|
64
|
+
details
|
54
65
|
|
55
66
|
testResultsStatusClass: (status) ->
|
56
67
|
switch status
|
data/lib/Spec.coffee
CHANGED
data/lib/Spec/DSL.coffee
CHANGED
@@ -20,12 +20,18 @@ window.Spec.DSL = DSL =
|
|
20
20
|
# matcher function
|
21
21
|
to: (matcher) ->
|
22
22
|
match = matcher(object)
|
23
|
-
|
23
|
+
unless match.result
|
24
|
+
error = new Spec.ExpectationError("expected to #{match.text()}")
|
25
|
+
error.htmlMessage = match.html() if match.html
|
26
|
+
throw error
|
24
27
|
|
25
28
|
# Specifies that the object should receive a negative response
|
26
29
|
notTo: (matcher) ->
|
27
30
|
match = matcher(object)
|
28
|
-
|
31
|
+
if match.result
|
32
|
+
error = new Spec.ExpectationError("expected not to #{match.text()}")
|
33
|
+
error.htmlMessage = match.html() if match.html
|
34
|
+
throw error
|
29
35
|
|
30
36
|
# Sets up a stub on the given method, with a delayed expectation that this
|
31
37
|
# stub method be called
|
data/lib/Spec/Matchers.coffee
CHANGED
@@ -4,8 +4,9 @@ window.Spec.Matchers =
|
|
4
4
|
# Tests if matched value === expected value
|
5
5
|
be: (expected) ->
|
6
6
|
(value) ->
|
7
|
-
result:
|
8
|
-
|
7
|
+
result: value is expected
|
8
|
+
text: ->
|
9
|
+
"be #{Spec.Util.inspect expected}, actual #{Spec.Util.inspect value}"
|
9
10
|
|
10
11
|
# Tests that value type matches specified class
|
11
12
|
beA: (klass) ->
|
@@ -20,8 +21,18 @@ window.Spec.Matchers =
|
|
20
21
|
# Tests if matched value == expected value
|
21
22
|
equal: (expected) ->
|
22
23
|
(value) ->
|
23
|
-
result:
|
24
|
-
|
24
|
+
result: String(value) == String(expected)
|
25
|
+
text: ->
|
26
|
+
"equal #{Spec.Util.inspect expected}, actual #{Spec.Util.inspect value}"
|
27
|
+
html: ->
|
28
|
+
"<dl>
|
29
|
+
<dt>expected:</dt>
|
30
|
+
<dd>#{Spec.Util.inspectAndEscape expected}</dd>
|
31
|
+
<dt>actual:</dt>
|
32
|
+
<dd>#{Spec.Util.inspectAndEscape value}</dd>
|
33
|
+
<dt>diff:</dt>
|
34
|
+
<dd>#{$.trim diffString(String(value), String(expected))}</dd>
|
35
|
+
</dl>"
|
25
36
|
|
26
37
|
# All-purpose inclusion matcher
|
27
38
|
include: (expected) ->
|
@@ -30,8 +41,9 @@ window.Spec.Matchers =
|
|
30
41
|
match = true
|
31
42
|
for test in expected
|
32
43
|
match = false unless (value.indexOf && value.indexOf(test) >= 0) || value[test]?
|
33
|
-
result:
|
34
|
-
|
44
|
+
result: match
|
45
|
+
text: ->
|
46
|
+
"include #{Spec.Util.inspect expected}, actual #{Spec.Util.inspect value}"
|
35
47
|
else if typeof expected == 'object'
|
36
48
|
(value) ->
|
37
49
|
missing = {}
|
@@ -41,8 +53,9 @@ window.Spec.Matchers =
|
|
41
53
|
unless value[test] isnt undefined && String(value[test]) == String(expected[test])
|
42
54
|
match = false
|
43
55
|
missing[test] = expected[test]
|
44
|
-
result:
|
45
|
-
|
56
|
+
result: match
|
57
|
+
text: ->
|
58
|
+
"include #{Spec.Util.inspect expected}, actual #{Spec.Util.inspect value}, missing #{Spec.Util.inspect missing}"
|
46
59
|
else
|
47
60
|
include([expected])
|
48
61
|
|
@@ -55,11 +68,15 @@ window.Spec.Matchers =
|
|
55
68
|
catch e
|
56
69
|
thrown = e.message
|
57
70
|
if thrown
|
58
|
-
result:
|
59
|
-
|
71
|
+
result: thrown == message
|
72
|
+
text: ->
|
73
|
+
"throw an error with message “#{String thrown}”, actual message “#{String message}”"
|
74
|
+
html: ->
|
75
|
+
"#{$.trim diffString(String(thrown), String(message))}"
|
60
76
|
else
|
61
|
-
result:
|
62
|
-
|
77
|
+
result: false
|
78
|
+
text: ->
|
79
|
+
"throw an error with message #{Spec.Util.inspect message}, no error thrown"
|
63
80
|
|
64
81
|
# Tests a value type using typeof, falling back to instanceof if type is an object
|
65
82
|
_haveType: (type, klass) ->
|
@@ -67,13 +84,16 @@ window.Spec.Matchers =
|
|
67
84
|
if typeof value is 'object'
|
68
85
|
@_beAnInstanceOf(klass)(value)
|
69
86
|
else
|
70
|
-
result:
|
71
|
-
|
87
|
+
result: typeof value is type
|
88
|
+
text: ->
|
89
|
+
"have type #{Spec.Util.inspect type}, actual #{Spec.Util.inspect(typeof value)}"
|
72
90
|
|
73
91
|
# Tests if matched value is an instance of class
|
74
92
|
_beAnInstanceOf: (klass) ->
|
75
93
|
(value) ->
|
76
|
-
result:
|
77
|
-
|
94
|
+
result: value instanceof klass
|
95
|
+
text: ->
|
96
|
+
"#{Spec.Util.inspect value} to be an instance of #{Spec.Util.inspect(klass.name || klass)}, actually #{Spec.Util.inspectClass value}"
|
78
97
|
|
98
|
+
window.Spec.Matchers.eq = window.Spec.Matchers.equal
|
79
99
|
window.Spec.Matchers.beAn = window.Spec.Matchers.beA
|
data/lib/Spec/Test.coffee
CHANGED
@@ -14,7 +14,8 @@ class window.Spec.Test
|
|
14
14
|
error.status || Spec.Report.Failed,
|
15
15
|
error.message
|
16
16
|
)
|
17
|
-
report.
|
17
|
+
report.stack = error.stack
|
18
|
+
report.htmlMessage = error.htmlMessage
|
18
19
|
finally
|
19
20
|
Spec.DelayedExpectation.reset()
|
20
21
|
Spec.MethodStub.reset()
|
data/lib/Spec/Util.coffee
CHANGED
@@ -64,10 +64,13 @@ window.Spec.Util =
|
|
64
64
|
# Access hasOwnProperty through Object.prototype to work around bug
|
65
65
|
# in IE6/7/8 when calling hasOwnProperty on a DOM element
|
66
66
|
if Object.prototype.hasOwnProperty.call(object, key)
|
67
|
-
properties.push
|
67
|
+
properties.push key + ': ' + Spec.Util.inspect(value)
|
68
68
|
"{#{properties.join ', '}}"
|
69
69
|
else
|
70
|
-
"“#{
|
70
|
+
"“#{object}”"
|
71
|
+
|
72
|
+
inspectAndEscape: (object) ->
|
73
|
+
@escape @inspect(object)
|
71
74
|
|
72
75
|
# Gets the class name of an object using JavaScript magic
|
73
76
|
inspectClass: (object) ->
|
data/lib/gusto.rb
CHANGED
@@ -11,6 +11,7 @@ require File.join(File.dirname(__FILE__), 'gusto', 'version')
|
|
11
11
|
module Gusto
|
12
12
|
autoload :Configuration, File.join(File.dirname(__FILE__), 'gusto', 'configuration')
|
13
13
|
autoload :Server, File.join(File.dirname(__FILE__), 'gusto', 'server')
|
14
|
+
autoload :ServerSpawner, File.join(File.dirname(__FILE__), 'gusto', 'server_spawner')
|
14
15
|
autoload :Sprockets, File.join(File.dirname(__FILE__), 'gusto', 'sprockets')
|
15
16
|
autoload :CliRenderer, File.join(File.dirname(__FILE__), 'gusto', 'cli_renderer')
|
16
17
|
|
@@ -26,48 +27,39 @@ module Gusto
|
|
26
27
|
File.expand_path "."
|
27
28
|
end
|
28
29
|
|
29
|
-
def root_url
|
30
|
-
"http://localhost:#{Configuration.port}/"
|
31
|
-
end
|
32
|
-
|
33
30
|
def server
|
34
31
|
trap_sigint
|
35
|
-
|
32
|
+
server_spawner.spawn
|
36
33
|
Process.waitall
|
37
34
|
end
|
38
35
|
|
39
36
|
def cli
|
40
|
-
|
41
|
-
|
42
|
-
|
37
|
+
server_spawner(quiet: true).spawn
|
38
|
+
result = run_suite?(server_spawner.port)
|
39
|
+
ensure
|
43
40
|
shut_down(result ? 0 : 1)
|
44
41
|
end
|
45
42
|
|
46
43
|
def autotest
|
47
44
|
trap_sigint
|
48
|
-
|
49
|
-
run_suite?
|
45
|
+
sever_spawner(quie: true).spawn
|
46
|
+
run_suite?(server_spawner.port)
|
50
47
|
watch_for_changes
|
51
48
|
Process.waitall
|
52
49
|
end
|
53
50
|
|
54
|
-
def
|
55
|
-
|
56
|
-
if options[:quiet]
|
57
|
-
$stdout.reopen "/dev/null", "w"
|
58
|
-
$stderr.reopen "/dev/null", "w"
|
59
|
-
end
|
60
|
-
$0 = 'gusto server'
|
61
|
-
Server.start
|
62
|
-
end
|
63
|
-
wait_for_server_at(root_url)
|
64
|
-
end
|
65
|
-
|
66
|
-
def run_suite?
|
67
|
-
json = `phantomjs #{Shellwords.escape HEADLESS_RUNNER_PATH} #{Configuration.port}`
|
51
|
+
def run_suite?(port)
|
52
|
+
json = `phantomjs #{Shellwords.escape HEADLESS_RUNNER_PATH} #{port}`
|
68
53
|
report = JSON.parse json
|
69
54
|
puts CliRenderer.new(report).render
|
70
55
|
report['status'] != 2
|
56
|
+
rescue => e
|
57
|
+
puts "Error running test suite: #{e.inspect}"
|
58
|
+
false
|
59
|
+
end
|
60
|
+
|
61
|
+
def server_spawner(quiet: false)
|
62
|
+
@server_spawner ||= ServerSpawner.new(port: Configuration.port, quiet: quiet)
|
71
63
|
end
|
72
64
|
|
73
65
|
def watch_for_changes
|
@@ -85,7 +77,7 @@ module Gusto
|
|
85
77
|
def shut_down(status=0)
|
86
78
|
@listener.stop if @listener
|
87
79
|
@browser.close if @browser
|
88
|
-
|
80
|
+
server_spawner.terminate
|
89
81
|
exit status
|
90
82
|
end
|
91
83
|
|
@@ -96,13 +88,5 @@ module Gusto
|
|
96
88
|
end
|
97
89
|
end
|
98
90
|
|
99
|
-
private
|
100
|
-
|
101
|
-
def wait_for_server_at(url)
|
102
|
-
Net::HTTP.get URI.parse(url)
|
103
|
-
rescue Errno::ECONNREFUSED
|
104
|
-
sleep 1
|
105
|
-
retry
|
106
|
-
end
|
107
91
|
end
|
108
92
|
end
|
data/lib/gusto/cli_renderer.rb
CHANGED
@@ -11,7 +11,7 @@ module Gusto
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def render
|
14
|
-
[body, footer].compact.reject(&:empty?).join("\n\n")
|
14
|
+
[body, stack_traces, footer].compact.reject(&:empty?).join("\n\n")
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
@@ -38,6 +38,25 @@ module Gusto
|
|
38
38
|
result_color report['status'], report['title']
|
39
39
|
end
|
40
40
|
|
41
|
+
def stack_traces
|
42
|
+
reports = failures_with_stack_traces(root_report['subreports'])
|
43
|
+
reports.each_with_index.map do |report, i|
|
44
|
+
result_color(report['status'], "#{i+1}. #{report['title']}") +
|
45
|
+
"\n\n" + report['stack']
|
46
|
+
end.join("\n\n")
|
47
|
+
end
|
48
|
+
|
49
|
+
def failures_with_stack_traces(reports)
|
50
|
+
collected = []
|
51
|
+
reports.each do |report|
|
52
|
+
collected << report if report['status'] == FAILED && report['stack']
|
53
|
+
if report['subreports']
|
54
|
+
collected += failures_with_stack_traces(report['subreports'])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
collected
|
58
|
+
end
|
59
|
+
|
41
60
|
def footer
|
42
61
|
result_color root_report['status'], "#{total} total, #{passed} passed, #{pending} pending, #{failed} failed"
|
43
62
|
end
|
data/lib/gusto/server.rb
CHANGED
@@ -10,8 +10,8 @@ require File.expand_path(File.dirname(__FILE__) + '/../gusto')
|
|
10
10
|
|
11
11
|
module Gusto
|
12
12
|
class Server < Sinatra::Application
|
13
|
-
def self.start
|
14
|
-
Rack::Handler.default.run rack_app, :Port =>
|
13
|
+
def self.start(host, port)
|
14
|
+
Rack::Handler.default.run rack_app, :Host => host, :Port => port
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.rack_app
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'timeout'
|
3
|
+
|
4
|
+
module Gusto
|
5
|
+
class ServerSpawner
|
6
|
+
attr :port, :quiet
|
7
|
+
|
8
|
+
def initialize(options={})
|
9
|
+
@port = options[:port]
|
10
|
+
@quiet = options.fetch(:quiet, false)
|
11
|
+
end
|
12
|
+
|
13
|
+
def host
|
14
|
+
'127.0.0.1'
|
15
|
+
end
|
16
|
+
|
17
|
+
def spawn
|
18
|
+
choose_open_port
|
19
|
+
@server = Process.fork do
|
20
|
+
close_std_io if quiet
|
21
|
+
self.process_name = "gusto server on #{host}:#{port}"
|
22
|
+
start_server
|
23
|
+
end
|
24
|
+
wait_for_server_at root_url
|
25
|
+
end
|
26
|
+
|
27
|
+
def terminate
|
28
|
+
Process.kill 'TERM', @server if @server
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def choose_open_port
|
34
|
+
until port_open?(port)
|
35
|
+
puts "Port #{port} is busy, trying #{port + 1} instead"
|
36
|
+
@port += 1
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def close_std_io
|
41
|
+
$stdout.reopen "/dev/null", "w"
|
42
|
+
$stderr.reopen "/dev/null", "w"
|
43
|
+
end
|
44
|
+
|
45
|
+
def process_name=(name)
|
46
|
+
$0 = name
|
47
|
+
end
|
48
|
+
|
49
|
+
def start_server
|
50
|
+
Server.start host, port
|
51
|
+
end
|
52
|
+
|
53
|
+
def root_url
|
54
|
+
"http://#{host}:#{port}/"
|
55
|
+
end
|
56
|
+
|
57
|
+
def wait_for_server_at(url)
|
58
|
+
Net::HTTP.get URI.parse(url)
|
59
|
+
rescue Errno::ECONNREFUSED
|
60
|
+
sleep 1
|
61
|
+
retry
|
62
|
+
end
|
63
|
+
|
64
|
+
def port_open?(port)
|
65
|
+
!system("lsof -i:#{port}", out: '/dev/null')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/gusto/version.rb
CHANGED
metadata
CHANGED
@@ -1,125 +1,139 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gusto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Cohen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-03-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coffee-script
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: json
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sprockets
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: sprockets-helpers
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: sinatra
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: sass
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: slim
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: listen
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: fosl
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
125
139
|
description: Gusto is Coffeescript behavioral testing framework, with a command line
|
@@ -154,6 +168,7 @@ files:
|
|
154
168
|
- lib/gusto/configuration.rb
|
155
169
|
- lib/gusto/runner.rb
|
156
170
|
- lib/gusto/server.rb
|
171
|
+
- lib/gusto/server_spawner.rb
|
157
172
|
- lib/gusto/sprockets.rb
|
158
173
|
- lib/gusto/version.rb
|
159
174
|
- phantom/headless_runner.js
|
@@ -172,17 +187,17 @@ require_paths:
|
|
172
187
|
- lib
|
173
188
|
required_ruby_version: !ruby/object:Gem::Requirement
|
174
189
|
requirements:
|
175
|
-
- -
|
190
|
+
- - ">="
|
176
191
|
- !ruby/object:Gem::Version
|
177
192
|
version: '0'
|
178
193
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
194
|
requirements:
|
180
|
-
- -
|
195
|
+
- - ">"
|
181
196
|
- !ruby/object:Gem::Version
|
182
197
|
version: 1.3.1
|
183
198
|
requirements: []
|
184
199
|
rubyforge_project:
|
185
|
-
rubygems_version: 2.2.
|
200
|
+
rubygems_version: 2.2.2
|
186
201
|
signing_key:
|
187
202
|
specification_version: 4
|
188
203
|
summary: Coffeescript testing framework
|