gusto 1.0.0.beta14 → 1.0.0.beta15

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aca9cea8b1abeda163c9bf46333ccb2ae2a3bd4c
4
- data.tar.gz: 31e50947ce1983c5dcb37355c1fddf4245a7b39f
3
+ metadata.gz: 4e0f50ae2b7995069000f268d76a88a666b404f1
4
+ data.tar.gz: b31c91120be48f1ab3e772fae7509bb5eb85b032
5
5
  SHA512:
6
- metadata.gz: 5e8e7fe4ee8f830f4922d3f086a6bbc1cec598ee771078d095c4aee1134dae6a8589484d3df9b47d96dd82fc284ca94820a7386f4673b5c04f2de54c73b08c10
7
- data.tar.gz: 60f8921a10e52f2e2e1d3bb7d7abea11139ec1dc3dcab2f402c0459a51d6919d9c72c1fbbe29fe961702a4ca6ba05c5ed874f46197079b53873b43fcf6eaf1de
6
+ metadata.gz: 7844eb2a0330065e0b8046625aa7dbb533e1475537f6fd2201104d158100f39fd6aa5ab8d3fb2d4d09171ff912087935e4b915f92bd04700460599079df73867
7
+ data.tar.gz: d0566ae83ccd4f9ea6a41d0184ebba8382459c518140062c794c712b5038f98dc6d944f5dd80868820a66ceb0a575b5f640ddd8730a1cf5a94d2843bc5004ec5
@@ -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
 
@@ -41,16 +41,27 @@ class window.HtmlReport
41
41
  html + '</ul>'
42
42
 
43
43
  testResultsReport: (report) ->
44
- "
45
- <li class=\"test-results--test test-results--test--#{@testResultsStatusClass report.status}\">
46
- <div class=\"test-results--title\">#{report.title}</div>
47
- #{if report.error then @testResultsErrorReport(report) else ''}
48
- #{if report.subreports.length then @testResultsReports(report.subreports) else ''}
49
- </li>
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
@@ -16,7 +16,6 @@
16
16
  window.Spec ||= {}
17
17
 
18
18
  class window.Spec.ExpectationError extends Error
19
- constructor: (@message) ->
20
19
 
21
20
  class window.Spec.PendingError extends Error
22
21
  constructor: (@message) ->
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
- throw new Spec.ExpectationError("expected #{match.description()}") unless match.result
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
- throw new Spec.ExpectationError("expected not #{match.description()}") if match.result
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
@@ -4,8 +4,9 @@ window.Spec.Matchers =
4
4
  # Tests if matched value === expected value
5
5
  be: (expected) ->
6
6
  (value) ->
7
- result: value is expected
8
- description: -> "be #{Spec.Util.inspect expected}, actual #{Spec.Util.inspect value}"
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: String(value) == String(expected)
24
- description: -> "equal “#{String expected}”, actual “#{String value}” – #{$.trim diffString(String(value), String(expected))}"
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: match
34
- description: -> "include #{Spec.Util.inspect expected}, actual #{Spec.Util.inspect value}"
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: match
45
- description: -> "include #{Spec.Util.inspect expected}, actual #{Spec.Util.inspect value}, missing #{Spec.Util.inspect missing}"
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: thrown == message
59
- description: -> "throw an error with message “#{String thrown}”, actual message “#{String message}” – #{$.trim diffString(String(thrown), String(message))}"
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: false
62
- description: -> "throw an error with message “#{message}”, no error thrown"
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: typeof value is type
71
- description: -> "to have type “#{type}”, actual “#{typeof value}”"
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: value instanceof klass
77
- description: -> "#{value} to be an instance of “#{klass.name || klass}”, actually “#{Spec.Util.inspectClass value}"
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.location = error.fileName + ':' + error.lineNumber
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 Spec.Util.escape(key) + ': ' + Spec.Util.inspect(value)
67
+ properties.push key + ': ' + Spec.Util.inspect(value)
68
68
  "{#{properties.join ', '}}"
69
69
  else
70
- "“#{Spec.Util.escape(object)}”"
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
- spawn_server
32
+ server_spawner.spawn
36
33
  Process.waitall
37
34
  end
38
35
 
39
36
  def cli
40
- trap_sigint
41
- spawn_server(quiet: true)
42
- result = run_suite?
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
- spawn_server
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 spawn_server(options={})
55
- @server = Process.fork do
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
- Process.kill 'TERM', @server if @server
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
@@ -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 => Configuration.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
@@ -1,3 +1,3 @@
1
1
  module Gusto
2
- VERSION = "1.0.0.beta14"
2
+ VERSION = "1.0.0.beta15"
3
3
  end
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.beta14
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: 2013-12-31 00:00:00.000000000 Z
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.0
200
+ rubygems_version: 2.2.2
186
201
  signing_key:
187
202
  specification_version: 4
188
203
  summary: Coffeescript testing framework