jspec-steventux 3.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/History.md +763 -0
  2. data/Manifest +73 -0
  3. data/README.md +974 -0
  4. data/Rakefile +44 -0
  5. data/bin/jspec +178 -0
  6. data/jspec-steventux.gemspec +44 -0
  7. data/lib/images/bg.png +0 -0
  8. data/lib/images/hr.png +0 -0
  9. data/lib/images/loading.gif +0 -0
  10. data/lib/images/sprites.bg.png +0 -0
  11. data/lib/images/sprites.png +0 -0
  12. data/lib/images/vr.png +0 -0
  13. data/lib/jspec.css +149 -0
  14. data/lib/jspec.growl.js +115 -0
  15. data/lib/jspec.jquery.js +72 -0
  16. data/lib/jspec.js +1756 -0
  17. data/lib/jspec.shell.js +39 -0
  18. data/lib/jspec.timers.js +90 -0
  19. data/lib/jspec.xhr.js +195 -0
  20. data/spec/commands/example_command.rb +19 -0
  21. data/spec/dom.html +33 -0
  22. data/spec/fixtures/test.html +1 -0
  23. data/spec/fixtures/test.json +1 -0
  24. data/spec/fixtures/test.xml +5 -0
  25. data/spec/node.js +17 -0
  26. data/spec/rhino.js +23 -0
  27. data/spec/ruby/bin/init_spec.rb +101 -0
  28. data/spec/ruby/bin/install_spec.rb +142 -0
  29. data/spec/ruby/bin/run_spec.rb +0 -0
  30. data/spec/ruby/bin/shell_spec.rb +13 -0
  31. data/spec/ruby/bin/spec_helper.rb +8 -0
  32. data/spec/ruby/bin/update_spec.rb +72 -0
  33. data/spec/server.html +29 -0
  34. data/spec/server.rb +2 -0
  35. data/spec/support/env.js +10118 -0
  36. data/spec/support/jquery.js +4376 -0
  37. data/spec/unit/helpers.js +64 -0
  38. data/spec/unit/spec.fixtures.js +17 -0
  39. data/spec/unit/spec.grammar-less.js +34 -0
  40. data/spec/unit/spec.grammar.js +241 -0
  41. data/spec/unit/spec.jquery.js +178 -0
  42. data/spec/unit/spec.jquery.xhr.js +84 -0
  43. data/spec/unit/spec.js +187 -0
  44. data/spec/unit/spec.matchers.js +577 -0
  45. data/spec/unit/spec.modules.js +51 -0
  46. data/spec/unit/spec.shared-behaviors.js +80 -0
  47. data/spec/unit/spec.utils.js +346 -0
  48. data/spec/unit/spec.xhr.js +157 -0
  49. data/src/browsers.rb +294 -0
  50. data/src/helpers.rb +67 -0
  51. data/src/installables.rb +229 -0
  52. data/src/project.rb +341 -0
  53. data/src/routes.rb +57 -0
  54. data/src/server.rb +99 -0
  55. data/support/js.jar +0 -0
  56. data/templates/default/History.md +5 -0
  57. data/templates/default/Readme.md +29 -0
  58. data/templates/default/lib/yourlib.js +2 -0
  59. data/templates/default/spec/commands/example_command.rb +19 -0
  60. data/templates/default/spec/dom.html +22 -0
  61. data/templates/default/spec/node.js +10 -0
  62. data/templates/default/spec/rhino.js +10 -0
  63. data/templates/default/spec/server.html +18 -0
  64. data/templates/default/spec/server.rb +4 -0
  65. data/templates/default/spec/unit/spec.helper.js +0 -0
  66. data/templates/default/spec/unit/spec.js +8 -0
  67. data/templates/rails/commands/example_commands.rb +19 -0
  68. data/templates/rails/dom.html +22 -0
  69. data/templates/rails/rhino.js +10 -0
  70. data/templates/rails/server.html +18 -0
  71. data/templates/rails/server.rb +4 -0
  72. data/templates/rails/unit/spec.helper.js +0 -0
  73. data/templates/rails/unit/spec.js +8 -0
  74. metadata +185 -0
@@ -0,0 +1,67 @@
1
+
2
+ helpers do
3
+
4
+ ##
5
+ # Return dotted assertion graph for _assertions_.
6
+
7
+ def assertion_graph_for assertions
8
+ return if assertions.empty?
9
+ assertions.map do |assertion|
10
+ assertion['passed'] ? green('.') : red('.')
11
+ end.join
12
+ end
13
+
14
+ ##
15
+ # Override Sinatra's #send_file to prevent caching.
16
+
17
+ def send_file *args
18
+ response['Cache-Control'] = 'no-cache'
19
+ super
20
+ end
21
+
22
+ ##
23
+ # Find the browser name for the current user agent.
24
+
25
+ def browser_name
26
+ Browser.subclasses.find do |browser|
27
+ browser.matches_agent? env['HTTP_USER_AGENT']
28
+ end.new
29
+ rescue
30
+ 'Unknown'
31
+ end
32
+
33
+ ##
34
+ # Wrap _string_ with ansi escape sequence using _code_.
35
+
36
+ def color string, code
37
+ "\e[#{code}m#{string}\e[0m"
38
+ end
39
+
40
+ ##
41
+ # Bold _string_.
42
+
43
+ def bold string
44
+ color string, 1
45
+ end
46
+
47
+ ##
48
+ # Color _string_ red.
49
+
50
+ def red string
51
+ color string, 31
52
+ end
53
+
54
+ ##
55
+ # Color _string_ green.
56
+
57
+ def green string
58
+ color string, 32
59
+ end
60
+
61
+ ##
62
+ # Color _string_ blue.
63
+
64
+ def blue string
65
+ color string, 34
66
+ end
67
+ end
@@ -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
@@ -0,0 +1,341 @@
1
+
2
+ module JSpec
3
+
4
+ #--
5
+ # Base project
6
+ #++
7
+
8
+ class Project
9
+
10
+ #--
11
+ # Constants
12
+ #++
13
+
14
+ BIND_PATHS = 'lib/**/*.js', 'spec/**/*.js'
15
+ RHINO = JSPEC_ROOT + '/support/js.jar'
16
+
17
+ ##
18
+ # Destination directory.
19
+
20
+ attr_reader :dest
21
+
22
+ ##
23
+ # Initialize project with _dest_.
24
+
25
+ def initialize dest
26
+ @dest = dest || '.'
27
+ end
28
+
29
+ ##
30
+ # Execute _file_ with Node.js
31
+
32
+ def node file
33
+ system "node #{file}"
34
+ end
35
+
36
+ ##
37
+ # Execute _file_ with Rhino.
38
+
39
+ def rhino file
40
+ system "java -jar #{rhino_jar} #{file}"
41
+ end
42
+
43
+ ##
44
+ # Locate Rhino jar.
45
+ #
46
+ # * checks spec/support/js.jar
47
+ # * defaults to JSpec's support/js.jar
48
+ #
49
+
50
+ def rhino_jar
51
+ if File.exists? normalize('support/js.jar')
52
+ normalize 'support/js.jar'
53
+ else
54
+ RHINO
55
+ end
56
+ end
57
+
58
+ ##
59
+ # Install project _name_ with _options_.
60
+
61
+ def install name, options = {}
62
+ raise ArgumentError, ':to option required' unless options.include? :to
63
+ project = JSpec::Installable.const_get(name.downcase.capitalize).new options
64
+ if project.use_progress_bar?
65
+ progress [:before, :install, :after],
66
+ :complete_message => project.install_message,
67
+ :format => "Installing #{name} (:progress_bar) %:percent_complete" do |method|
68
+ project.send method
69
+ end
70
+ else
71
+ project.before
72
+ project.install
73
+ project.after
74
+ say project.install_message
75
+ end
76
+ end
77
+
78
+ ##
79
+ # Initialize the project with _options_
80
+
81
+ def init! options = {}
82
+ verify_empty!
83
+ copy_template :default
84
+ vendorize_with_symlink if options.include? :symlink
85
+ vendorize_with_copy if options.include? :freeze
86
+ replace_root
87
+ end
88
+
89
+ ##
90
+ # Vendorize JSpec with symlink.
91
+
92
+ def vendorize_with_symlink
93
+ FileUtils.symlink "#{JSPEC_ROOT}/lib", normalize('lib'), :force => true
94
+ end
95
+
96
+ ##
97
+ # Vendorize JSpec with copy.
98
+
99
+ def vendorize_with_copy
100
+ FileUtils.cp_r "#{JSPEC_ROOT}/lib", normalize('lib')
101
+ end
102
+
103
+ ##
104
+ # Copy template _name_ to the destination.
105
+
106
+ def copy_template name, options = {}
107
+ FileUtils.mkdir_p dest
108
+ FileUtils.cp_r path_to_template(name), options[:to] ?
109
+ "#{dest}/#{options[:to]}" :
110
+ dest
111
+ end
112
+
113
+ ##
114
+ # Normalize _path_.
115
+
116
+ def normalize path
117
+ "#{dest}/spec/#{path}"
118
+ end
119
+
120
+ ##
121
+ # Check if we are working with vendorized JSpec.
122
+
123
+ def vendorized?
124
+ File.directory?(normalize(:lib)) && normalize(:lib)
125
+ end
126
+
127
+ ##
128
+ # Replace absolute JSPEC_ROOT paths.
129
+
130
+ def replace_root
131
+ replace_root_in 'dom.html', 'rhino.js', 'node.js'
132
+ end
133
+
134
+ ##
135
+ # Root JSpec directory.
136
+
137
+ def root
138
+ vendorized? ? './spec' : JSPEC_ROOT
139
+ end
140
+
141
+ ##
142
+ # Replace absolute JSPEC_ROOT _paths_.
143
+
144
+ def replace_root_in *paths
145
+ paths.each do |path|
146
+ next unless File.exists? normalize(path)
147
+ jspec_root = root
148
+ jspec_root = '.' if vendorized? and path.include? '.html'
149
+ contents = File.read(normalize(path)).gsub 'JSPEC_ROOT', jspec_root
150
+ File.open(normalize(path), 'w') { |file| file.write contents }
151
+ end
152
+ end
153
+
154
+ ##
155
+ # Path to template _name_.
156
+
157
+ def path_to_template name
158
+ "#{JSPEC_ROOT}/templates/#{name}/."
159
+ end
160
+
161
+ ##
162
+ # Verify that the current directory is empty, otherwise
163
+ # prompt for continuation.
164
+
165
+ def verify_empty!
166
+ unless Dir[dest + '/*'].empty?
167
+ abort unless agree "`#{dest}' is not empty; continue? "
168
+ end
169
+ end
170
+
171
+ ##
172
+ # Update absolute paths and/or vendorized libraries.
173
+
174
+ def update!
175
+ if path = vendorized?
176
+ type = File.symlink?(path) ? :symlink : :copy
177
+ FileUtils.rm_rf normalize(:lib)
178
+ send "vendorize_with_#{type}"
179
+ say "updated #{type} #{path} -> #{program(:version)}"
180
+ else
181
+ ['dom.html', 'rhino.js', 'node.js'].each do |path|
182
+ path = normalize path
183
+ next unless File.exists? path
184
+ contents = File.read(path).gsub /jspec-(\d+\.\d+\.\d+)/, "jspec-#{program(:version)}"
185
+ if program(:version) == $1
186
+ say "skipping #{path}; already #{$1}"
187
+ next
188
+ end
189
+ File.open(path, 'r+'){ |file| file.write contents }
190
+ say "updated #{path}; #{$1} -> #{program(:version)}"
191
+ end
192
+ end
193
+ end
194
+
195
+ ##
196
+ # Start server with _path_ html and _options_.
197
+
198
+ def start_server path, options = {}
199
+ options[:port] ||= 4444
200
+ set :port, options[:port]
201
+ set :server, 'Mongrel'
202
+ enable :sessions
203
+ disable :logging
204
+ hook = File.expand_path normalize('server.rb')
205
+ load hook if File.exists? hook
206
+ browsers = browsers_for(options[:browsers]) if options.include? :browsers
207
+ JSpec::Server.new(path, options[:port]).start(browsers)
208
+ end
209
+
210
+ ##
211
+ # Return array of browser instances for the given _names_.
212
+
213
+ def browsers_for names
214
+ names.map do |name|
215
+ begin
216
+ Browser.subclasses.find do |browser|
217
+ browser.matches_name? name
218
+ end.new
219
+ rescue
220
+ raise "Unsupported browser `#{name}'"
221
+ end
222
+ end
223
+ end
224
+
225
+ ##
226
+ # Run _path_ with _options_.
227
+
228
+ def run! path = nil, options = {}
229
+ paths = options[:paths] || self.class::BIND_PATHS
230
+
231
+ # Action
232
+
233
+ case
234
+ when options.include?(:node)
235
+ path ||= normalize('node.js')
236
+ action = lambda { node(path) }
237
+ when options.include?(:rhino)
238
+ path ||= normalize('rhino.js')
239
+ action = lambda { rhino(path) }
240
+ when options.include?(:server)
241
+ raise 'Cannot use --bind with --server' if options.include? :bind
242
+ path ||= normalize('server.html')
243
+ action = lambda { start_server path, options }
244
+ else
245
+ path ||= normalize('dom.html')
246
+ browsers = browsers_for options[:browsers] || ['default']
247
+ action = lambda do
248
+ browsers.each do |browser|
249
+ browser.visit File.expand_path(path)
250
+ end
251
+ end
252
+ end
253
+
254
+ # Bind action
255
+
256
+ if options.include? :bind
257
+ Bind::Listener.new(
258
+ :paths => paths,
259
+ :interval => 1,
260
+ :actions => [action],
261
+ :debug => $stdout).run!
262
+ else
263
+ exit !! action.call
264
+ end
265
+ end
266
+
267
+ ##
268
+ # Return the Project instance which should be used for _dest_.
269
+
270
+ def self.for dest
271
+ (File.directory?("#{dest}/vendor") ?
272
+ JSpec::Project::Rails :
273
+ JSpec::Project).new(dest)
274
+ end
275
+
276
+ ##
277
+ # Load all commands at the given _dir_.
278
+
279
+ def self.load_commands_at dir
280
+ Dir["#{dir}/**/*_command.rb"].each { |file| load file }
281
+ end
282
+
283
+ #--
284
+ # Rails project
285
+ #++
286
+
287
+ class Rails < self
288
+
289
+ #--
290
+ # Constants
291
+ #++
292
+
293
+ BIND_PATHS = 'public/javascripts/**/*.js', 'jspec/**/*.js'
294
+
295
+ ##
296
+ # Initialize the project with _options_
297
+
298
+ def init! options = {}
299
+ verify_rails!
300
+ copy_template :rails, :to => :jspec
301
+ vendorize_with_symlink if options.include? :symlink
302
+ vendorize_with_copy if options.include? :freeze
303
+ replace_root
304
+ end
305
+
306
+ ##
307
+ # Root JSpec directory.
308
+
309
+ def root
310
+ vendorized? ? './jspec' : JSPEC_ROOT
311
+ end
312
+
313
+ ##
314
+ # Normalize _path_.
315
+
316
+ def normalize path
317
+ "#{dest}/jspec/#{path}"
318
+ end
319
+
320
+ ##
321
+ # Verify that the current directory is rails, otherwise
322
+ # prompt for continuation.
323
+
324
+ def verify_rails!
325
+ unless rails?
326
+ abort unless agree "`#{dest}' does not appear to be a rails app; continue? "
327
+ end
328
+ end
329
+
330
+ ##
331
+ # Check if the destination is the root of
332
+ # a rails application.
333
+
334
+ def rails?
335
+ File.directory? dest + '/vendor'
336
+ end
337
+
338
+ end
339
+
340
+ end
341
+ end