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 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