jspec 2.11.13 → 3.0.0
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.
- data/History.md +714 -0
- data/Manifest +51 -36
- data/README.md +968 -0
- data/Rakefile +4 -53
- data/bin/jspec +93 -224
- data/jspec.gemspec +5 -5
- data/lib/images/sprites.png +0 -0
- data/lib/jspec.css +2 -2
- data/lib/jspec.growl.js +115 -0
- data/lib/jspec.jquery.js +1 -1
- data/lib/jspec.js +98 -101
- data/lib/jspec.shell.js +5 -2
- data/lib/jspec.timers.js +1 -1
- data/lib/jspec.xhr.js +12 -2
- data/spec/commands/example_command.rb +19 -0
- data/spec/dom.html +33 -0
- data/spec/node.js +32 -0
- data/spec/rhino.js +24 -0
- data/spec/ruby/bin/init_spec.rb +101 -0
- data/spec/ruby/bin/install_spec.rb +141 -0
- data/spec/ruby/bin/run_spec.rb +0 -0
- data/spec/ruby/bin/shell_spec.rb +13 -0
- data/spec/ruby/bin/spec_helper.rb +25 -0
- data/spec/ruby/bin/update_spec.rb +72 -0
- data/spec/server.html +29 -0
- data/spec/server.rb +1 -1
- data/spec/{env.js → support/env.js} +554 -664
- data/spec/support/jquery.js +4376 -0
- data/spec/{helpers.js → unit/helpers.js} +2 -0
- data/spec/{spec.fixtures.js → unit/spec.fixtures.js} +0 -1
- data/spec/{spec.grammar-less.js → unit/spec.grammar-less.js} +0 -0
- data/spec/{spec.grammar.js → unit/spec.grammar.js} +1 -11
- data/spec/{spec.jquery.js → unit/spec.jquery.js} +0 -17
- data/spec/{spec.jquery.xhr.js → unit/spec.jquery.xhr.js} +13 -2
- data/spec/unit/spec.js +187 -0
- data/spec/{spec.matchers.js → unit/spec.matchers.js} +141 -66
- data/spec/{spec.modules.js → unit/spec.modules.js} +0 -0
- data/spec/{spec.shared-behaviors.js → unit/spec.shared-behaviors.js} +0 -0
- data/spec/{spec.utils.js → unit/spec.utils.js} +123 -22
- data/spec/{spec.xhr.js → unit/spec.xhr.js} +11 -10
- data/{server → src}/browsers.rb +23 -0
- data/{server → src}/helpers.rb +2 -17
- data/src/installables.rb +229 -0
- data/src/project.rb +340 -0
- data/{server → src}/routes.rb +1 -1
- data/{server → src}/server.rb +0 -0
- data/support/js.jar +0 -0
- data/templates/default/History.md +5 -0
- data/templates/default/{README.rdoc → Readme.md} +3 -3
- data/templates/default/lib/{yourlib.core.js → yourlib.js} +0 -0
- data/templates/default/spec/commands/example_command.rb +19 -0
- data/templates/default/spec/{spec.dom.html → dom.html} +5 -3
- data/templates/default/spec/rhino.js +10 -0
- data/templates/default/spec/server.html +18 -0
- data/templates/default/spec/unit/spec.helper.js +0 -0
- data/templates/default/spec/{spec.core.js → unit/spec.js} +0 -0
- data/templates/rails/commands/example_commands.rb +19 -0
- data/templates/rails/{spec.dom.html → dom.html} +4 -2
- data/templates/rails/rhino.js +10 -0
- data/templates/rails/server.html +18 -0
- data/templates/rails/unit/spec.helper.js +0 -0
- data/templates/rails/{spec.application.js → unit/spec.js} +0 -0
- metadata +56 -41
- data/History.rdoc +0 -590
- data/README.rdoc +0 -842
- data/spec/async +0 -1
- data/spec/jquery.js +0 -19
- data/spec/spec.dom.html +0 -34
- data/spec/spec.js +0 -166
- data/spec/spec.node.js +0 -46
- data/spec/spec.rhino.js +0 -23
- data/spec/spec.server.html +0 -29
- data/templates/default/History.rdoc +0 -4
- data/templates/default/spec/spec.rhino.js +0 -8
- data/templates/default/spec/spec.server.html +0 -16
- data/templates/rails/spec.rhino.js +0 -8
- data/templates/rails/spec.server.html +0 -16
File without changes
|
File without changes
|
@@ -153,14 +153,6 @@ describe 'Utility'
|
|
153
153
|
})
|
154
154
|
result.should.eql [1,2,3]
|
155
155
|
end
|
156
|
-
|
157
|
-
it 'should iterate words in a string'
|
158
|
-
result = []
|
159
|
-
each('some foo bar', function(value){
|
160
|
-
result.push(value)
|
161
|
-
})
|
162
|
-
result.should.eql ['some', 'foo', 'bar']
|
163
|
-
end
|
164
156
|
end
|
165
157
|
|
166
158
|
describe 'map()'
|
@@ -170,13 +162,6 @@ describe 'Utility'
|
|
170
162
|
})
|
171
163
|
result.should.eql [2,4,6]
|
172
164
|
end
|
173
|
-
|
174
|
-
it 'should inherit the ability to iterate words in a string'
|
175
|
-
result = map('some foo bar', function(i, value){
|
176
|
-
return i + '-' + value
|
177
|
-
})
|
178
|
-
result.should.eql ['0-some', '1-foo', '2-bar']
|
179
|
-
end
|
180
165
|
end
|
181
166
|
|
182
167
|
describe 'inject()'
|
@@ -204,7 +189,7 @@ describe 'Utility'
|
|
204
189
|
end
|
205
190
|
|
206
191
|
it 'should return the value of the first matching expression'
|
207
|
-
result = any('foo some bar', function(value){
|
192
|
+
result = any(['foo', 'some', 'bar'], function(value){
|
208
193
|
return value.length > 3
|
209
194
|
})
|
210
195
|
result.should.eql 'some'
|
@@ -221,7 +206,7 @@ describe 'Utility'
|
|
221
206
|
|
222
207
|
describe 'select()'
|
223
208
|
it 'should return an array of values when the callback evaluates to true'
|
224
|
-
result = select('some foo bar baz stuff', function(value){
|
209
|
+
result = select(['some', 'foo', 'bar', 'baz', 'stuff'], function(value){
|
225
210
|
return value.length > 3
|
226
211
|
})
|
227
212
|
result.should.eql ['some', 'stuff']
|
@@ -234,14 +219,14 @@ describe 'Utility'
|
|
234
219
|
end
|
235
220
|
end
|
236
221
|
|
237
|
-
describe '
|
238
|
-
it 'should
|
239
|
-
func = function(){ return
|
222
|
+
describe 'toArray()'
|
223
|
+
it 'should convert an arraylike object to an array'
|
224
|
+
func = function(){ return toArray(arguments) }
|
240
225
|
func('foo', 'bar').should.eql ['foo', 'bar']
|
241
226
|
end
|
242
227
|
|
243
|
-
it 'should
|
244
|
-
func = function(){ return
|
228
|
+
it 'should allow a slice offset'
|
229
|
+
func = function(){ return toArray(arguments, 2) }
|
245
230
|
func('foo', 'bar', 'baz').should.eql ['baz']
|
246
231
|
end
|
247
232
|
end
|
@@ -259,4 +244,120 @@ describe 'Utility'
|
|
259
244
|
end
|
260
245
|
end
|
261
246
|
|
247
|
+
describe 'puts()'
|
248
|
+
describe 'with primitive scalar values'
|
249
|
+
it 'should output true'
|
250
|
+
puts(true).should.eql 'true'
|
251
|
+
end
|
252
|
+
|
253
|
+
it 'should output false'
|
254
|
+
puts(false).should.eql 'false'
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'should output null'
|
258
|
+
puts(null).should.eql 'null'
|
259
|
+
end
|
260
|
+
|
261
|
+
it 'should output undefined'
|
262
|
+
puts().should.eql 'undefined'
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
describe 'with strings'
|
267
|
+
it 'should output within double quotes'
|
268
|
+
puts("string").should.eql '"string"'
|
269
|
+
end
|
270
|
+
|
271
|
+
it 'should escape double quotes'
|
272
|
+
puts('he said "hey"').should.eql '"he said \\"hey\\""'
|
273
|
+
end
|
274
|
+
|
275
|
+
it 'should output non-printables as \n \t etc'
|
276
|
+
puts("\n\t\n\t").should.eql '"\\n\\t\\n\\t"'
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
describe 'with arrays'
|
281
|
+
it 'should output an array literal'
|
282
|
+
puts([1, 2, 3]).should.eql '[ 1, 2, 3 ]'
|
283
|
+
end
|
284
|
+
|
285
|
+
it 'should output nested arrays'
|
286
|
+
puts([1, 2, [ 1, 2 ]]).should.eql '[ 1, 2, [ 1, 2 ] ]'
|
287
|
+
end
|
288
|
+
|
289
|
+
it 'should output empty arrays'
|
290
|
+
puts([]).should.eql '[ ]'
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
describe 'with integers'
|
295
|
+
it 'should output an integer literal'
|
296
|
+
puts(1).should.eql '1'
|
297
|
+
puts(10).should.eql '10'
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
describe 'with floats'
|
302
|
+
it 'should output a float literal'
|
303
|
+
puts(1.5).should.eql '1.5'
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
describe 'with regular expressions'
|
308
|
+
it 'should output a regexp literal'
|
309
|
+
puts(/test/).should.eql '/test/'
|
310
|
+
end
|
311
|
+
|
312
|
+
it 'should output flags as well'
|
313
|
+
puts(/test/gm).should.eql '/test/gm'
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
describe 'with hashes'
|
318
|
+
it 'should output an object literal'
|
319
|
+
puts({ foo: 'bar' }).should.eql '{ foo: "bar" }'
|
320
|
+
end
|
321
|
+
|
322
|
+
it 'should output nested objects'
|
323
|
+
puts({ foo: { bar: 'baz' }}).should.eql '{ foo: { bar: "baz" } }'
|
324
|
+
end
|
325
|
+
|
326
|
+
it 'should output empty objects'
|
327
|
+
puts({}).should.eql '{ }'
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
describe 'with an_instance_of'
|
332
|
+
it 'should output an instance of Constructor'
|
333
|
+
object = { an_instance_of: Array }
|
334
|
+
puts(object).should.eql 'an instance of Array'
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
describe 'with jQuery'
|
339
|
+
it 'should output selector when present'
|
340
|
+
object = { jquery: '1.3.2', selector: '.foo bar' }
|
341
|
+
puts(object).should.eql 'selector ".foo bar"'
|
342
|
+
end
|
343
|
+
|
344
|
+
it 'should output outerHTML otherwise'
|
345
|
+
puts($('<p>Foo</p>')).should.match(/<p>Foo<\/p>/i)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
describe 'with elements'
|
350
|
+
it 'should output the outerHTML'
|
351
|
+
puts($('<p>Foo</p>').get(0)).should.match(/<p>Foo<\/p>/i)
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
describe 'circular references'
|
356
|
+
it 'should output <circular reference> with objects'
|
357
|
+
object = { a: 1 }
|
358
|
+
object.b = object
|
359
|
+
puts(object).should.eql '{ a: 1, b: <circular reference> }'
|
360
|
+
end
|
361
|
+
end
|
362
|
+
end
|
262
363
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
describe 'JSpec'
|
3
|
-
describe 'Mock
|
3
|
+
describe 'Mock XMLHttpRequest'
|
4
4
|
before
|
5
5
|
responseFrom = function(path) {
|
6
6
|
request = new XMLHttpRequest
|
@@ -27,7 +27,16 @@ describe 'JSpec'
|
|
27
27
|
XMLHttpRequest.should.not.eql JSpec.XMLHttpRequest
|
28
28
|
end
|
29
29
|
|
30
|
-
describe '
|
30
|
+
describe 'last_request()'
|
31
|
+
it 'should provide access to the previous request'
|
32
|
+
mock_request().and_return('foo')
|
33
|
+
responseFrom('async')
|
34
|
+
last_request().url.should.eql 'async'
|
35
|
+
last_request().status.should.eql 200
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'mock_request()'
|
31
40
|
before_each
|
32
41
|
mockRequest().and_return('bar', 'text/plain', 200, { 'x-foo' : 'bar' })
|
33
42
|
request = new XMLHttpRequest
|
@@ -99,7 +108,6 @@ describe 'JSpec'
|
|
99
108
|
|
100
109
|
it 'should not interrupt JSpec request related functionality'
|
101
110
|
mockRequest().and_return('fail')
|
102
|
-
(JSpec.tryLoading('async') || JSpec.tryLoading('spec/async')).should.eql 'cookies!'
|
103
111
|
fixture('test').should.eql '<p>test</p>'
|
104
112
|
fixture('test.json').should.include '{ user'
|
105
113
|
end
|
@@ -144,13 +152,6 @@ describe 'JSpec'
|
|
144
152
|
request.responseText.should.be_null
|
145
153
|
end
|
146
154
|
end
|
147
|
-
|
148
|
-
describe 'with uri'
|
149
|
-
it 'should mock only the uri specified'
|
150
|
-
mockRequest('ilike').and_return('cookies')
|
151
|
-
responseFrom('async').should.eql 'cookies'
|
152
|
-
end
|
153
|
-
end
|
154
155
|
end
|
155
156
|
end
|
156
157
|
end
|
data/{server → src}/browsers.rb
RENAMED
@@ -82,6 +82,29 @@ class Browser
|
|
82
82
|
system "osascript -e '#{code}' 2>&1 >/dev/null"
|
83
83
|
end
|
84
84
|
|
85
|
+
#--
|
86
|
+
# Default
|
87
|
+
#++
|
88
|
+
|
89
|
+
class Default < self
|
90
|
+
def self.matches_name? string
|
91
|
+
string =~ /default/i
|
92
|
+
end
|
93
|
+
|
94
|
+
def visit uri
|
95
|
+
system 'open', uri if macos?
|
96
|
+
system 'start', uri if windows?
|
97
|
+
end
|
98
|
+
|
99
|
+
def supported?
|
100
|
+
macos?
|
101
|
+
end
|
102
|
+
|
103
|
+
def to_s
|
104
|
+
'Default'
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
85
108
|
#--
|
86
109
|
# Firefox
|
87
110
|
#++
|
data/{server → src}/helpers.rb
RENAMED
@@ -14,24 +14,9 @@ helpers do
|
|
14
14
|
##
|
15
15
|
# Override Sinatra's #send_file to prevent caching.
|
16
16
|
|
17
|
-
def send_file
|
18
|
-
stat = File.stat(path)
|
17
|
+
def send_file *args
|
19
18
|
response['Cache-Control'] = 'no-cache'
|
20
|
-
|
21
|
-
media_type(File.extname(path)) ||
|
22
|
-
response['Content-Type'] ||
|
23
|
-
'application/octet-stream'
|
24
|
-
response['Content-Length'] ||= (opts[:length] || stat.size).to_s
|
25
|
-
|
26
|
-
if opts[:disposition] == 'attachment' || opts[:filename]
|
27
|
-
attachment opts[:filename] || path
|
28
|
-
elsif opts[:disposition] == 'inline'
|
29
|
-
response['Content-Disposition'] = 'inline'
|
30
|
-
end
|
31
|
-
|
32
|
-
halt ::Sinatra::Application::StaticFile.open(path, 'rb')
|
33
|
-
rescue Errno::ENOENT
|
34
|
-
not_found
|
19
|
+
super
|
35
20
|
end
|
36
21
|
|
37
22
|
##
|
data/src/installables.rb
ADDED
@@ -0,0 +1,229 @@
|
|
1
|
+
|
2
|
+
require 'open-uri'
|
3
|
+
|
4
|
+
module JSpec
|
5
|
+
class Installable
|
6
|
+
|
7
|
+
##
|
8
|
+
# Options array
|
9
|
+
|
10
|
+
attr_reader :options
|
11
|
+
|
12
|
+
##
|
13
|
+
# Initialize with _options_
|
14
|
+
|
15
|
+
def initialize options = {}
|
16
|
+
@options = options
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# Called before installing.
|
21
|
+
|
22
|
+
def before; end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Called after installing.
|
26
|
+
|
27
|
+
def after; end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Message to display after installation.
|
31
|
+
|
32
|
+
def install_message; end
|
33
|
+
|
34
|
+
##
|
35
|
+
# Weither or not to use the progress bar.
|
36
|
+
|
37
|
+
def use_progress_bar?; true end
|
38
|
+
|
39
|
+
#--
|
40
|
+
# URI based installations
|
41
|
+
#++
|
42
|
+
|
43
|
+
class URI < self
|
44
|
+
|
45
|
+
##
|
46
|
+
# Release specified or the current release.
|
47
|
+
|
48
|
+
def release
|
49
|
+
options[:release] || self.class.current
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# Installation path.
|
54
|
+
|
55
|
+
def path
|
56
|
+
options[:to] + "/#{self.class.name.downcase.tr(' ', '.')}.js"
|
57
|
+
end
|
58
|
+
|
59
|
+
##
|
60
|
+
# Installation uri.
|
61
|
+
|
62
|
+
def uri
|
63
|
+
self.class.uri.sub 'RELEASE', release
|
64
|
+
end
|
65
|
+
|
66
|
+
##
|
67
|
+
# Install.
|
68
|
+
|
69
|
+
def install
|
70
|
+
File.open(path, 'w+') do |file|
|
71
|
+
file.write open(uri).read
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
##
|
76
|
+
# Installation message.
|
77
|
+
|
78
|
+
def install_message
|
79
|
+
"#{self.class.name} #{release} installed to #{path}"
|
80
|
+
end
|
81
|
+
|
82
|
+
#--
|
83
|
+
# DSL
|
84
|
+
#++
|
85
|
+
|
86
|
+
class << self
|
87
|
+
|
88
|
+
##
|
89
|
+
# Human readable name.
|
90
|
+
|
91
|
+
def name string = nil
|
92
|
+
string ? @name = string : @name
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
# Current release _string_.
|
97
|
+
|
98
|
+
def current string = nil
|
99
|
+
string ? @current = string : @current
|
100
|
+
end
|
101
|
+
|
102
|
+
##
|
103
|
+
# Installable uri _string_. use RELEASE as the release placeholder.
|
104
|
+
|
105
|
+
def uri string = nil
|
106
|
+
string ? @uri = string : @uri
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
#--
|
113
|
+
# Rhino
|
114
|
+
#++
|
115
|
+
|
116
|
+
class Rhino < URI
|
117
|
+
name 'Rhino'
|
118
|
+
uri 'ftp://ftp.mozilla.org/pub/mozilla.org/js/RELEASE.zip'
|
119
|
+
|
120
|
+
##
|
121
|
+
# No thanks!
|
122
|
+
|
123
|
+
def use_progress_bar?
|
124
|
+
false
|
125
|
+
end
|
126
|
+
|
127
|
+
##
|
128
|
+
# Extension destination.
|
129
|
+
|
130
|
+
def path
|
131
|
+
options[:to] + '/js.jar'
|
132
|
+
end
|
133
|
+
|
134
|
+
##
|
135
|
+
# Warn that --release is not yet supported.
|
136
|
+
|
137
|
+
def release
|
138
|
+
warn 'Rhino does not yet support --release' if options[:release]
|
139
|
+
'rhino1_7R2'
|
140
|
+
end
|
141
|
+
|
142
|
+
##
|
143
|
+
# Install
|
144
|
+
|
145
|
+
def install
|
146
|
+
say "... fetching #{uri}"; `curl #{uri} -o /tmp/rhino.zip 2> /dev/null`
|
147
|
+
say "... decompressing"; `unzip /tmp/rhino.zip -d /tmp`
|
148
|
+
say "... installing to #{path}"; `mv /tmp/rhino1_7R2/js.jar #{path}`
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
#--
|
154
|
+
# Envjs
|
155
|
+
#++
|
156
|
+
|
157
|
+
class Envjs < URI
|
158
|
+
name 'Env.js'
|
159
|
+
uri 'http://github.com/thatcher/env-js/raw/master/dist/env.rhino.js'
|
160
|
+
|
161
|
+
##
|
162
|
+
# Warn that --release is not yet supported.
|
163
|
+
|
164
|
+
def release
|
165
|
+
warn 'Envjs does not yet support --release' if options[:release]
|
166
|
+
'edge'
|
167
|
+
end
|
168
|
+
|
169
|
+
##
|
170
|
+
# Installation path.
|
171
|
+
|
172
|
+
def path
|
173
|
+
options[:to] + '/env.js'
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
#--
|
179
|
+
# jQuery
|
180
|
+
#++
|
181
|
+
|
182
|
+
class Jquery < URI
|
183
|
+
name 'jQuery'
|
184
|
+
current '1.3.2'
|
185
|
+
uri 'http://ajax.googleapis.com/ajax/libs/jquery/RELEASE/jquery.js'
|
186
|
+
end
|
187
|
+
|
188
|
+
#--
|
189
|
+
# jQuery UI.
|
190
|
+
#++
|
191
|
+
|
192
|
+
class Jqueryui < URI
|
193
|
+
name 'jQuery UI'
|
194
|
+
current '1.7.2'
|
195
|
+
uri 'http://ajax.googleapis.com/ajax/libs/jqueryui/RELEASE/jquery-ui.js'
|
196
|
+
end
|
197
|
+
|
198
|
+
#--
|
199
|
+
# Prototype
|
200
|
+
#++
|
201
|
+
|
202
|
+
class Prototype < URI
|
203
|
+
name 'Prototype'
|
204
|
+
current '1.6.1.0'
|
205
|
+
uri 'http://ajax.googleapis.com/ajax/libs/prototype/RELEASE/prototype.js'
|
206
|
+
end
|
207
|
+
|
208
|
+
#--
|
209
|
+
# MooTools
|
210
|
+
#++
|
211
|
+
|
212
|
+
class Mootools < URI
|
213
|
+
name 'MooTools'
|
214
|
+
current '1.2.3'
|
215
|
+
uri 'http://ajax.googleapis.com/ajax/libs/mootools/RELEASE/mootools.js'
|
216
|
+
end
|
217
|
+
|
218
|
+
#--
|
219
|
+
# Dojo
|
220
|
+
#++
|
221
|
+
|
222
|
+
class Dojo < URI
|
223
|
+
name 'Dojo'
|
224
|
+
current '1.3.2'
|
225
|
+
uri 'http://ajax.googleapis.com/ajax/libs/dojo/RELEASE/dojo/dojo.xd.js.uncompressed.js'
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|
229
|
+
end
|