hyper-spec 0.1.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.
@@ -0,0 +1,190 @@
1
+ if RUBY_ENGINE == 'opal'
2
+ require 'lolex'
3
+ require 'time'
4
+
5
+ # Wrap the Lolex js package
6
+ class Lolex
7
+ class << self
8
+ def stack
9
+ @stack ||= []
10
+ end
11
+
12
+ def push(time, scale = 1, resolution = 10)
13
+ puts "Lolex.push(#{time}, #{scale}, #{resolution})"
14
+ time = Time.parse(time) if time.is_a? String
15
+ stack << [Time.now, @scale, @resolution]
16
+ update_lolex(time, scale, resolution)
17
+ end
18
+
19
+ def pop
20
+ update_lolex(*stack.pop) unless stack.empty?
21
+ end
22
+
23
+ def unmock(time, resolution)
24
+ push(time, 1, resolution)
25
+ @backup_stack = stack
26
+ @stack = []
27
+ end
28
+
29
+ def restore
30
+ @stack = @backup_stack
31
+ pop
32
+ end
33
+
34
+ def tick
35
+ real_clock = `(new #{@lolex}['_Date']).getTime()`
36
+ mock_clock = Time.now.to_f * 1000
37
+ real_elapsed_time = real_clock - @real_start_time
38
+ mock_elapsed_time = mock_clock - @mock_start_time
39
+
40
+ ticks = real_elapsed_time * @scale - mock_elapsed_time
41
+
42
+ `#{@lolex}.tick(#{ticks.to_i})`
43
+ nil
44
+ end
45
+
46
+ def create_ticker
47
+ return unless @scale && @scale > 0
48
+ ticker = %x{
49
+ #{@lolex}['_setInterval'].call(
50
+ window,
51
+ function() { #{tick} },
52
+ #{@resolution}
53
+ )
54
+ }
55
+ ticker
56
+ end
57
+
58
+ def update_lolex(time, scale, resolution)
59
+ `#{@lolex}.uninstall()` && return if scale.nil?
60
+ @mock_start_time = time.to_f * 1000
61
+
62
+ if @lolex
63
+ `#{@lolex}['_clearInterval'].call(window, #{@ticker})` if @ticker
64
+ @real_start_time = `(new #{@lolex}['_Date']).getTime()`
65
+ `#{@lolex}.tick(#{@mock_start_time - Time.now.to_f * 1000})`
66
+ else
67
+ @real_start_time = Time.now.to_f * 1000
68
+ @lolex = `lolex.install(window, #{@mock_start_time})`
69
+ end
70
+
71
+ @scale = scale
72
+ @resolution = resolution
73
+ @ticker = create_ticker
74
+ nil # must return nil otherwise we try to return a timer to server!
75
+ end
76
+ end
77
+ end
78
+
79
+ else
80
+ require 'timecop'
81
+
82
+ # Interface to the Lolex package running on the client side
83
+ # Below we will monkey patch Timecop to call these methods
84
+ class Lolex
85
+ class << self
86
+ def init(page, client_time_zone, resolution)
87
+ @capybara_page = page
88
+ @resolution = resolution || 10
89
+ @client_time_zone = client_time_zone
90
+ run_pending_evaluations
91
+ @initialized = true
92
+ end
93
+
94
+ def initialized?
95
+ @initialized
96
+ end
97
+
98
+ def push(mock_type, *args)
99
+ scale = if mock_type == :freeze
100
+ 0
101
+ elsif mock_type == :scale
102
+ args[0]
103
+ else
104
+ 1
105
+ end
106
+ evaluate_ruby do
107
+ "Lolex.push('#{time_string_in_zone}', #{scale}, #{@resolution})"
108
+ end
109
+ end
110
+
111
+ def pop
112
+ evaluate_ruby { 'Lolex.pop' }
113
+ end
114
+
115
+ def unmock
116
+ evaluate_ruby { "Lolex.unmock('#{time_string_in_zone}', #{@resolution})" }
117
+ end
118
+
119
+ def restore
120
+ evaluate_ruby { 'Lolex.restore' }
121
+ end
122
+
123
+ private
124
+
125
+ def time_string_in_zone
126
+ Time.now.in_time_zone(@client_time_zone).strftime('%Y/%m/%d %H:%M:%S %z')
127
+ end
128
+
129
+ def pending_evaluations
130
+ @pending_evaluations ||= []
131
+ end
132
+
133
+ def evaluate_ruby(&block)
134
+ if @capybara_page
135
+ @capybara_page.evaluate_ruby(yield)
136
+ else
137
+ pending_evaluations << block
138
+ end
139
+ end
140
+
141
+ def run_pending_evaluations
142
+ return if pending_evaluations.empty?
143
+ @capybara_page.evaluate_ruby(pending_evaluations.collect(&:call).join("\n"))
144
+ @pending_evaluations ||= []
145
+ end
146
+ end
147
+ end
148
+
149
+ # Monkey patches to call our Lolex interface
150
+ class Timecop
151
+ private
152
+
153
+ def travel(mock_type, *args, &block)
154
+ raise SafeModeException if Timecop.safe_mode? && !block_given?
155
+
156
+ stack_item = TimeStackItem.new(mock_type, *args)
157
+
158
+ stack_backup = @_stack.dup
159
+ @_stack << stack_item
160
+
161
+ Lolex.push(mock_type, *args)
162
+
163
+ if block_given?
164
+ begin
165
+ yield stack_item.time
166
+ ensure
167
+ Lolex.pop
168
+ @_stack.replace stack_backup
169
+ end
170
+ end
171
+ end
172
+
173
+ def return(&block)
174
+ current_stack = @_stack
175
+ current_baseline = @baseline
176
+ unmock!
177
+ yield
178
+ ensure
179
+ Lolex.restore
180
+ @_stack = current_stack
181
+ @baseline = current_baseline
182
+ end
183
+
184
+ def unmock! #:nodoc:
185
+ @baseline = nil
186
+ @_stack = []
187
+ Lolex.unmock
188
+ end
189
+ end
190
+ end
metadata ADDED
@@ -0,0 +1,478 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hyper-spec
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - catmando
8
+ - adamcreekroad
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2017-02-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.12'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.12'
28
+ - !ruby/object:Gem::Dependency
29
+ name: hyper-react
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 0.10.0
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 0.10.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: rails
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 5.0.0
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 5.0.0
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '10.0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '10.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: react-rails
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "<"
75
+ - !ruby/object:Gem::Version
76
+ version: 1.10.0
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "<"
82
+ - !ruby/object:Gem::Version
83
+ version: 1.10.0
84
+ - !ruby/object:Gem::Dependency
85
+ name: rubocop
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: therubyracer
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - '='
103
+ - !ruby/object:Gem::Version
104
+ version: 0.12.2
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - '='
110
+ - !ruby/object:Gem::Version
111
+ version: 0.12.2
112
+ - !ruby/object:Gem::Dependency
113
+ name: capybara
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: opal
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: parser
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :runtime
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: poltergeist
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :runtime
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: pry
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :runtime
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ - !ruby/object:Gem::Dependency
183
+ name: rspec-rails
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ type: :runtime
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ - !ruby/object:Gem::Dependency
197
+ name: selenium-webdriver
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - '='
201
+ - !ruby/object:Gem::Version
202
+ version: 2.53.4
203
+ type: :runtime
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - '='
208
+ - !ruby/object:Gem::Version
209
+ version: 2.53.4
210
+ - !ruby/object:Gem::Dependency
211
+ name: timecop
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ type: :runtime
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
224
+ - !ruby/object:Gem::Dependency
225
+ name: unparser
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - '='
229
+ - !ruby/object:Gem::Version
230
+ version: 0.2.5
231
+ type: :runtime
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - '='
236
+ - !ruby/object:Gem::Version
237
+ version: 0.2.5
238
+ - !ruby/object:Gem::Dependency
239
+ name: chromedriver-helper
240
+ requirement: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: '0'
245
+ type: :development
246
+ prerelease: false
247
+ version_requirements: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - ">="
250
+ - !ruby/object:Gem::Version
251
+ version: '0'
252
+ - !ruby/object:Gem::Dependency
253
+ name: method_source
254
+ requirement: !ruby/object:Gem::Requirement
255
+ requirements:
256
+ - - ">="
257
+ - !ruby/object:Gem::Version
258
+ version: '0'
259
+ type: :development
260
+ prerelease: false
261
+ version_requirements: !ruby/object:Gem::Requirement
262
+ requirements:
263
+ - - ">="
264
+ - !ruby/object:Gem::Version
265
+ version: '0'
266
+ - !ruby/object:Gem::Dependency
267
+ name: opal-browser
268
+ requirement: !ruby/object:Gem::Requirement
269
+ requirements:
270
+ - - ">="
271
+ - !ruby/object:Gem::Version
272
+ version: '0'
273
+ type: :development
274
+ prerelease: false
275
+ version_requirements: !ruby/object:Gem::Requirement
276
+ requirements:
277
+ - - ">="
278
+ - !ruby/object:Gem::Version
279
+ version: '0'
280
+ - !ruby/object:Gem::Dependency
281
+ name: opal-rails
282
+ requirement: !ruby/object:Gem::Requirement
283
+ requirements:
284
+ - - ">="
285
+ - !ruby/object:Gem::Version
286
+ version: '0'
287
+ type: :development
288
+ prerelease: false
289
+ version_requirements: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ - !ruby/object:Gem::Dependency
295
+ name: puma
296
+ requirement: !ruby/object:Gem::Requirement
297
+ requirements:
298
+ - - ">="
299
+ - !ruby/object:Gem::Version
300
+ version: '0'
301
+ type: :development
302
+ prerelease: false
303
+ version_requirements: !ruby/object:Gem::Requirement
304
+ requirements:
305
+ - - ">="
306
+ - !ruby/object:Gem::Version
307
+ version: '0'
308
+ - !ruby/object:Gem::Dependency
309
+ name: rspec-collection_matchers
310
+ requirement: !ruby/object:Gem::Requirement
311
+ requirements:
312
+ - - ">="
313
+ - !ruby/object:Gem::Version
314
+ version: '0'
315
+ type: :development
316
+ prerelease: false
317
+ version_requirements: !ruby/object:Gem::Requirement
318
+ requirements:
319
+ - - ">="
320
+ - !ruby/object:Gem::Version
321
+ version: '0'
322
+ - !ruby/object:Gem::Dependency
323
+ name: rspec-expectations
324
+ requirement: !ruby/object:Gem::Requirement
325
+ requirements:
326
+ - - ">="
327
+ - !ruby/object:Gem::Version
328
+ version: '0'
329
+ type: :development
330
+ prerelease: false
331
+ version_requirements: !ruby/object:Gem::Requirement
332
+ requirements:
333
+ - - ">="
334
+ - !ruby/object:Gem::Version
335
+ version: '0'
336
+ - !ruby/object:Gem::Dependency
337
+ name: rspec-its
338
+ requirement: !ruby/object:Gem::Requirement
339
+ requirements:
340
+ - - ">="
341
+ - !ruby/object:Gem::Version
342
+ version: '0'
343
+ type: :development
344
+ prerelease: false
345
+ version_requirements: !ruby/object:Gem::Requirement
346
+ requirements:
347
+ - - ">="
348
+ - !ruby/object:Gem::Version
349
+ version: '0'
350
+ - !ruby/object:Gem::Dependency
351
+ name: rspec-mocks
352
+ requirement: !ruby/object:Gem::Requirement
353
+ requirements:
354
+ - - ">="
355
+ - !ruby/object:Gem::Version
356
+ version: '0'
357
+ type: :development
358
+ prerelease: false
359
+ version_requirements: !ruby/object:Gem::Requirement
360
+ requirements:
361
+ - - ">="
362
+ - !ruby/object:Gem::Version
363
+ version: '0'
364
+ - !ruby/object:Gem::Dependency
365
+ name: rspec-steps
366
+ requirement: !ruby/object:Gem::Requirement
367
+ requirements:
368
+ - - ">="
369
+ - !ruby/object:Gem::Version
370
+ version: '0'
371
+ type: :development
372
+ prerelease: false
373
+ version_requirements: !ruby/object:Gem::Requirement
374
+ requirements:
375
+ - - ">="
376
+ - !ruby/object:Gem::Version
377
+ version: '0'
378
+ - !ruby/object:Gem::Dependency
379
+ name: shoulda
380
+ requirement: !ruby/object:Gem::Requirement
381
+ requirements:
382
+ - - ">="
383
+ - !ruby/object:Gem::Version
384
+ version: '0'
385
+ type: :development
386
+ prerelease: false
387
+ version_requirements: !ruby/object:Gem::Requirement
388
+ requirements:
389
+ - - ">="
390
+ - !ruby/object:Gem::Version
391
+ version: '0'
392
+ - !ruby/object:Gem::Dependency
393
+ name: shoulda-matchers
394
+ requirement: !ruby/object:Gem::Requirement
395
+ requirements:
396
+ - - ">="
397
+ - !ruby/object:Gem::Version
398
+ version: '0'
399
+ type: :development
400
+ prerelease: false
401
+ version_requirements: !ruby/object:Gem::Requirement
402
+ requirements:
403
+ - - ">="
404
+ - !ruby/object:Gem::Version
405
+ version: '0'
406
+ - !ruby/object:Gem::Dependency
407
+ name: spring-commands-rspec
408
+ requirement: !ruby/object:Gem::Requirement
409
+ requirements:
410
+ - - ">="
411
+ - !ruby/object:Gem::Version
412
+ version: '0'
413
+ type: :development
414
+ prerelease: false
415
+ version_requirements: !ruby/object:Gem::Requirement
416
+ requirements:
417
+ - - ">="
418
+ - !ruby/object:Gem::Version
419
+ version: '0'
420
+ description: A Hyperloop application consists of isomorphic React Components, Active
421
+ Record Models, Stores, Operations and Policiespec. Test them all from Rspec, regardless
422
+ if the code runs on the client or server.
423
+ email:
424
+ - mitch@catprint.com
425
+ executables: []
426
+ extensions: []
427
+ extra_rdoc_files: []
428
+ files:
429
+ - ".gitignore"
430
+ - ".rubocop.yml"
431
+ - CODE_OF_CONDUCT.md
432
+ - Gemfile
433
+ - Gemfile.lock
434
+ - LICENSE.txt
435
+ - README.md
436
+ - Rakefile
437
+ - bin/console
438
+ - bin/setup
439
+ - hyper-spec.gemspec
440
+ - lib/bin/firebug-2.0.13-fx.xpi
441
+ - lib/hyper-spec.rb
442
+ - lib/hyper-spec/component_test_helpers.rb
443
+ - lib/hyper-spec/lolex.rb
444
+ - lib/hyper-spec/rails/engine.rb
445
+ - lib/hyper-spec/time_cop.rb
446
+ - lib/hyper-spec/version.rb
447
+ - lib/hyper-spec/wait_for_ajax.rb
448
+ - lib/react/isomorphic_helpers.rb
449
+ - lib/react/top_level_rails_component.rb
450
+ - lib/selenium/web_driver/firefox/profile.rb
451
+ - vendor/assets/javascripts/lolex.js
452
+ - vendor/assets/javascripts/time_cop.rb
453
+ homepage: https://github.com/ruby-hyperloop/hyper-spec
454
+ licenses:
455
+ - MIT
456
+ metadata:
457
+ allowed_push_host: https://rubygems.org
458
+ post_install_message:
459
+ rdoc_options: []
460
+ require_paths:
461
+ - lib
462
+ required_ruby_version: !ruby/object:Gem::Requirement
463
+ requirements:
464
+ - - ">="
465
+ - !ruby/object:Gem::Version
466
+ version: '0'
467
+ required_rubygems_version: !ruby/object:Gem::Requirement
468
+ requirements:
469
+ - - ">="
470
+ - !ruby/object:Gem::Version
471
+ version: '0'
472
+ requirements: []
473
+ rubyforge_project:
474
+ rubygems_version: 2.5.1
475
+ signing_key:
476
+ specification_version: 4
477
+ summary: Drive your Hyperloop client and server specs from RSpec and Capybara
478
+ test_files: []