volt 0.8.22.beta2 → 0.8.22
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 +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +3 -0
- data/VERSION +1 -1
- data/app/volt/views/notices/index.html +1 -1
- data/lib/volt.rb +0 -51
- data/lib/volt/controllers/model_controller.rb +1 -1
- data/lib/volt/models/buffer.rb +75 -0
- data/lib/volt/models/model.rb +3 -87
- data/lib/volt/models/model_hash_behaviour.rb +6 -0
- data/lib/volt/page/bindings/each_binding.rb +2 -2
- data/lib/volt/page/bindings/template_binding.rb +4 -1
- data/lib/volt/page/channel.rb +25 -12
- data/lib/volt/spec/capybara.rb +45 -0
- data/lib/volt/spec/sauce_labs.rb +33 -0
- data/lib/volt/spec/setup.rb +10 -79
- data/lib/volt/volt/users.rb +72 -10
- data/volt.gemspec +3 -3
- metadata +13 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e6ab3bfaaaef61c6d01c04750b95167dcd80515c
|
4
|
+
data.tar.gz: 8ade7dbaa63ee162ee463880a559736e004ddeed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 937470848e406afe613e695d35f07b6c9a46bd4ddbd3e946c5b11327a1ea2a0d823bc111e4a40413db7c41681c1b31d61a235ff1e0862436386fe573a13aa206
|
7
|
+
data.tar.gz: f462b993fdc5a4f1a301131aaeae7767bd175e19478081417682542547d55c4109984f14b0426601fb21f03508fa578b3743bd15d845751c6a7e4e757d6ebae9
|
data/.travis.yml
CHANGED
@@ -10,7 +10,7 @@ env:
|
|
10
10
|
- secure: X95q9DUVJRLIoxd116xEbi/3xL85XiGbWdz0p5z/UawShQalMHxLfPNdU9u5gyw99LrgxTdPsJOTps8hB3vhzp8qIegrM8i2AICcicXC1QDOWi7McXSH9SBmE1AjhlyE/PLLHwLDeqfvwNMPAOrDH1GOisQp505D7SSXUZ9m0GI=
|
11
11
|
matrix:
|
12
12
|
- NO_BROWSER=true
|
13
|
-
- BROWSER=sauce OS="Windows 8" USE_BROWSER="Firefox" VERSION="33"
|
13
|
+
# - BROWSER=sauce OS="Windows 8" USE_BROWSER="Firefox" VERSION="33"
|
14
14
|
script: bundle exec rake
|
15
15
|
notifications:
|
16
16
|
webhooks:
|
data/CHANGELOG.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.8.22
|
1
|
+
0.8.22
|
@@ -5,7 +5,7 @@
|
|
5
5
|
{{ if channel.status == :reconnecting }}
|
6
6
|
<div class="notices alert alert-info">
|
7
7
|
Connection Lost... {{ channel.error }}...
|
8
|
-
{{ if channel.reconnect_interval }} Reconnecting in {{ (channel.
|
8
|
+
{{ if channel.reconnect_interval }} Reconnecting in {{ (channel.reconnect_in / 1000.0).round }} sec{{ end }}
|
9
9
|
</div>
|
10
10
|
{{ end }}
|
11
11
|
{{ if page._reconnected }}
|
data/lib/volt.rb
CHANGED
@@ -48,57 +48,6 @@ module Volt
|
|
48
48
|
def in_browser?
|
49
49
|
@in_browser
|
50
50
|
end
|
51
|
-
|
52
|
-
# Get the user_id from the cookie
|
53
|
-
def user_id
|
54
|
-
if Volt.client?
|
55
|
-
user_id_signature = $page.cookies._user_id
|
56
|
-
else
|
57
|
-
# Check meta for the user id and validate it
|
58
|
-
meta_data = Thread.current['meta']
|
59
|
-
if meta_data
|
60
|
-
user_id_signature = meta_data['user_id']
|
61
|
-
else
|
62
|
-
user_id_signature = nil
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
if user_id_signature.nil?
|
67
|
-
return nil
|
68
|
-
else
|
69
|
-
index = user_id_signature.index(':')
|
70
|
-
user_id = user_id_signature[0...index]
|
71
|
-
|
72
|
-
if RUBY_PLATFORM != 'opal'
|
73
|
-
hash = user_id_signature[(index+1)..-1]
|
74
|
-
|
75
|
-
# Make sure the user hash matches
|
76
|
-
if BCrypt::Password.new(hash) != "#{Volt.config.app_secret}::#{user._id}"
|
77
|
-
# user id has been tampered with, reject
|
78
|
-
raise "user id or hash has been tampered with"
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
return user_id
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
# True if the user is logged in and the user is loaded
|
88
|
-
def user?
|
89
|
-
!!user
|
90
|
-
end
|
91
|
-
|
92
|
-
# Return the current user.
|
93
|
-
def user
|
94
|
-
user_id = self.user_id
|
95
|
-
if user_id
|
96
|
-
return $page.store._users.find_one(_id: user_id)
|
97
|
-
else
|
98
|
-
return nil
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
51
|
end
|
103
52
|
end
|
104
53
|
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Volt
|
2
|
+
module Buffer
|
3
|
+
|
4
|
+
def save!
|
5
|
+
# Compute the erros once
|
6
|
+
errors = self.errors
|
7
|
+
|
8
|
+
if errors.size == 0
|
9
|
+
save_to = options[:save_to]
|
10
|
+
if save_to
|
11
|
+
if save_to.is_a?(ArrayModel)
|
12
|
+
# Add to the collection
|
13
|
+
promise = save_to.append(attributes)
|
14
|
+
else
|
15
|
+
# We have a saved model
|
16
|
+
promise = save_to.assign_attributes(attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
return promise.then do |new_model|
|
20
|
+
if new_model
|
21
|
+
# Set the buffer's id to track the main model's id
|
22
|
+
attributes[:_id] = new_model._id
|
23
|
+
options[:save_to] = new_model
|
24
|
+
end
|
25
|
+
|
26
|
+
nil
|
27
|
+
end.fail do |errors|
|
28
|
+
if errors.is_a?(Hash)
|
29
|
+
server_errors.replace(errors)
|
30
|
+
end
|
31
|
+
|
32
|
+
promise_for_errors(errors)
|
33
|
+
end
|
34
|
+
else
|
35
|
+
fail 'Model is not a buffer, can not be saved, modifications should be persisted as they are made.'
|
36
|
+
end
|
37
|
+
else
|
38
|
+
# Some errors, mark all fields
|
39
|
+
promise_for_errors(errors)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# When errors come in, we mark all fields and return a rejected promise.
|
44
|
+
def promise_for_errors(errors)
|
45
|
+
mark_all_fields!
|
46
|
+
|
47
|
+
Promise.new.reject(errors)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns a buffered version of the model
|
51
|
+
def buffer
|
52
|
+
model_path = options[:path]
|
53
|
+
|
54
|
+
# When we grab a buffer off of a plual class (subcollection), we get it as a model.
|
55
|
+
if model_path.last.plural? && model_path[-1] != :[]
|
56
|
+
model_klass = class_at_path(model_path + [:[]])
|
57
|
+
else
|
58
|
+
model_klass = class_at_path(model_path)
|
59
|
+
end
|
60
|
+
|
61
|
+
new_options = options.merge(path: model_path, save_to: self).reject { |k, _| k.to_sym == :persistor }
|
62
|
+
model = model_klass.new({}, new_options, :loading)
|
63
|
+
|
64
|
+
if state == :loaded
|
65
|
+
setup_buffer(model)
|
66
|
+
else
|
67
|
+
parent.then do
|
68
|
+
setup_buffer(model)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
model
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/volt/models/model.rb
CHANGED
@@ -4,6 +4,7 @@ require 'volt/models/model_helpers'
|
|
4
4
|
require 'volt/models/model_hash_behaviour'
|
5
5
|
require 'volt/models/validations'
|
6
6
|
require 'volt/models/model_state'
|
7
|
+
require 'volt/models/buffer'
|
7
8
|
require 'volt/reactive/reactive_hash'
|
8
9
|
|
9
10
|
module Volt
|
@@ -16,6 +17,7 @@ module Volt
|
|
16
17
|
include ModelHashBehaviour
|
17
18
|
include Validations
|
18
19
|
include ModelState
|
20
|
+
include Buffer
|
19
21
|
|
20
22
|
attr_reader :attributes
|
21
23
|
attr_reader :parent, :path, :persistor, :options
|
@@ -155,7 +157,6 @@ module Volt
|
|
155
157
|
# (maybe move it to persistor, though thats weird since buffers don't have a persistor)
|
156
158
|
clear_server_errors(attribute_name) if @server_errors
|
157
159
|
|
158
|
-
|
159
160
|
# Don't save right now if we're in a nosave block
|
160
161
|
if !defined?(Thread) || !Thread.current['nosave']
|
161
162
|
# Let the persistor know something changed
|
@@ -217,18 +218,6 @@ module Volt
|
|
217
218
|
end
|
218
219
|
end
|
219
220
|
|
220
|
-
def return_undefined_method(method_name)
|
221
|
-
# Methods called on nil capture an error so the user can know where
|
222
|
-
# their nil calls are. This error can be re-raised at a later point.
|
223
|
-
fail NilMethodCall.new("undefined method `#{method_name}' for #{self}")
|
224
|
-
rescue => e
|
225
|
-
result = e
|
226
|
-
|
227
|
-
# Cleanup backtrace
|
228
|
-
# TODO: this could be better
|
229
|
-
result.backtrace.reject! { |line| line['lib/models/model.rb'] || line['lib/models/live_value.rb'] }
|
230
|
-
end
|
231
|
-
|
232
221
|
def new_model(attributes, options)
|
233
222
|
class_at_path(options[:path]).new(attributes, options)
|
234
223
|
end
|
@@ -279,80 +268,7 @@ module Volt
|
|
279
268
|
end
|
280
269
|
|
281
270
|
def inspect
|
282
|
-
|
283
|
-
"<#{self.class}:#{object_id} #{attributes.inspect}>"
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
def save!
|
288
|
-
# Compute the erros once
|
289
|
-
errors = self.errors
|
290
|
-
|
291
|
-
if errors.size == 0
|
292
|
-
save_to = options[:save_to]
|
293
|
-
if save_to
|
294
|
-
if save_to.is_a?(ArrayModel)
|
295
|
-
# Add to the collection
|
296
|
-
promise = save_to.append(attributes)
|
297
|
-
else
|
298
|
-
# We have a saved model
|
299
|
-
promise = save_to.assign_attributes(attributes)
|
300
|
-
end
|
301
|
-
|
302
|
-
return promise.then do |new_model|
|
303
|
-
if new_model
|
304
|
-
# Set the buffer's id to track the main model's id
|
305
|
-
attributes[:_id] = new_model._id
|
306
|
-
options[:save_to] = new_model
|
307
|
-
end
|
308
|
-
|
309
|
-
nil
|
310
|
-
end.fail do |errors|
|
311
|
-
if errors.is_a?(Hash)
|
312
|
-
server_errors.replace(errors)
|
313
|
-
end
|
314
|
-
|
315
|
-
promise_for_errors(errors)
|
316
|
-
end
|
317
|
-
else
|
318
|
-
fail 'Model is not a buffer, can not be saved, modifications should be persisted as they are made.'
|
319
|
-
end
|
320
|
-
else
|
321
|
-
# Some errors, mark all fields
|
322
|
-
promise_for_errors(errors)
|
323
|
-
end
|
324
|
-
end
|
325
|
-
|
326
|
-
# When errors come in, we mark all fields and return a rejected promise.
|
327
|
-
def promise_for_errors(errors)
|
328
|
-
mark_all_fields!
|
329
|
-
|
330
|
-
Promise.new.reject(errors)
|
331
|
-
end
|
332
|
-
|
333
|
-
# Returns a buffered version of the model
|
334
|
-
def buffer
|
335
|
-
model_path = options[:path]
|
336
|
-
|
337
|
-
# When we grab a buffer off of a plual class (subcollection), we get it as a model.
|
338
|
-
if model_path.last.plural? && model_path[-1] != :[]
|
339
|
-
model_klass = class_at_path(model_path + [:[]])
|
340
|
-
else
|
341
|
-
model_klass = class_at_path(model_path)
|
342
|
-
end
|
343
|
-
|
344
|
-
new_options = options.merge(path: model_path, save_to: self).reject { |k, _| k.to_sym == :persistor }
|
345
|
-
model = model_klass.new({}, new_options, :loading)
|
346
|
-
|
347
|
-
if state == :loaded
|
348
|
-
setup_buffer(model)
|
349
|
-
else
|
350
|
-
parent.then do
|
351
|
-
setup_buffer(model)
|
352
|
-
end
|
353
|
-
end
|
354
|
-
|
355
|
-
model
|
271
|
+
"<#{self.class}:#{object_id} #{attributes.inspect}>"
|
356
272
|
end
|
357
273
|
|
358
274
|
# Takes a block that when run, changes to models will not save inside of
|
@@ -68,6 +68,12 @@ module Volt
|
|
68
68
|
(@attributes || {}).each_with_object(*args, &block)
|
69
69
|
end
|
70
70
|
|
71
|
+
def each(&block)
|
72
|
+
# TODO: We shouldn't need to check the size for this to work
|
73
|
+
size
|
74
|
+
@array.each(&block)
|
75
|
+
end
|
76
|
+
|
71
77
|
def each_pair
|
72
78
|
@attributes.each_pair do |k,v|
|
73
79
|
yield(k,v) unless v.is_a?(Model) && v.nil?
|
@@ -81,7 +81,7 @@ module Volt
|
|
81
81
|
|
82
82
|
# TODORW: :parent => @value may change
|
83
83
|
item_context = SubContext.new({ _index_value: position, parent: @value }, @context)
|
84
|
-
item_context.locals[@item_name.to_sym] = proc { @value[item_context.locals[:_index_value]]
|
84
|
+
item_context.locals[@item_name.to_sym] = proc { @value[item_context.locals[:_index_value]]}
|
85
85
|
|
86
86
|
position_dependency = Dependency.new
|
87
87
|
item_context.locals[:index_dependency] = position_dependency
|
@@ -127,7 +127,7 @@ module Volt
|
|
127
127
|
@computation = nil
|
128
128
|
|
129
129
|
# Clear value
|
130
|
-
@value =
|
130
|
+
@value = []
|
131
131
|
|
132
132
|
if @added_listener
|
133
133
|
@added_listener.remove
|
@@ -103,7 +103,10 @@ module Volt
|
|
103
103
|
Computation.run_without_tracking do
|
104
104
|
# Remove existing template and call _removed
|
105
105
|
controller_send(:"#{@action}_removed") if @action && @controller
|
106
|
-
|
106
|
+
if @current_template
|
107
|
+
@current_template.remove
|
108
|
+
@current_template = nil
|
109
|
+
end
|
107
110
|
|
108
111
|
@options = options
|
109
112
|
|
data/lib/volt/page/channel.rb
CHANGED
@@ -9,7 +9,7 @@ module Volt
|
|
9
9
|
include ReactiveAccessors
|
10
10
|
include Eventable
|
11
11
|
|
12
|
-
reactive_accessor :connected, :status, :error, :reconnect_interval, :retry_count
|
12
|
+
reactive_accessor :connected, :status, :error, :reconnect_interval, :retry_count, :reconnect_in
|
13
13
|
|
14
14
|
def initialize
|
15
15
|
@socket = nil
|
@@ -45,11 +45,10 @@ module Volt
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def opened
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
@retry_count = 0
|
48
|
+
self.status = :open
|
49
|
+
self.connected = true
|
50
|
+
self.reconnect_interval = nil
|
51
|
+
self.retry_count = 0
|
53
52
|
@queue.each do |message|
|
54
53
|
send_message(message)
|
55
54
|
end
|
@@ -66,16 +65,14 @@ module Volt
|
|
66
65
|
def reconnect!
|
67
66
|
self.status = :reconnecting
|
68
67
|
self.reconnect_interval ||= 0
|
69
|
-
self.reconnect_interval += (
|
68
|
+
self.reconnect_interval += (1000 + rand(5000))
|
70
69
|
self.retry_count += 1
|
71
70
|
|
72
71
|
interval = self.reconnect_interval
|
73
72
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
}, interval);
|
78
|
-
`
|
73
|
+
self.reconnect_in = interval
|
74
|
+
|
75
|
+
reconnect_tick
|
79
76
|
end
|
80
77
|
|
81
78
|
def message_received(message)
|
@@ -102,5 +99,21 @@ module Volt
|
|
102
99
|
this.socket.close();
|
103
100
|
`
|
104
101
|
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def reconnect_tick
|
106
|
+
if reconnect_in >= 1000
|
107
|
+
self.reconnect_in -= 1000
|
108
|
+
`
|
109
|
+
setTimeout(function() {
|
110
|
+
self['$reconnect_tick']();
|
111
|
+
}, 1000);
|
112
|
+
`
|
113
|
+
else
|
114
|
+
connect!
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
105
118
|
end
|
106
119
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'volt/spec/sauce_labs'
|
2
|
+
|
3
|
+
module Volt
|
4
|
+
class << self
|
5
|
+
def setup_capybara(app_path)
|
6
|
+
browser = ENV['BROWSER']
|
7
|
+
|
8
|
+
if browser
|
9
|
+
setup_capybara_app(app_path)
|
10
|
+
|
11
|
+
case browser
|
12
|
+
when 'phantom'
|
13
|
+
Capybara.default_driver = :poltergeist
|
14
|
+
when 'chrome', 'safari'
|
15
|
+
# Use the browser name, note that safari requires an extension to run
|
16
|
+
browser = browser.to_sym
|
17
|
+
Capybara.register_driver(browser) do |app|
|
18
|
+
Capybara::Selenium::Driver.new(app, browser: browser)
|
19
|
+
end
|
20
|
+
|
21
|
+
Capybara.default_driver = browser
|
22
|
+
when 'firefox'
|
23
|
+
Capybara.default_driver = :selenium
|
24
|
+
when 'sauce'
|
25
|
+
setup_sauce_labs
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def setup_capybara_app(app_path)
|
31
|
+
require 'capybara'
|
32
|
+
require 'capybara/dsl'
|
33
|
+
require 'capybara/rspec'
|
34
|
+
require 'capybara/poltergeist'
|
35
|
+
require 'volt/server'
|
36
|
+
|
37
|
+
Capybara.server do |app, port|
|
38
|
+
require 'rack/handler/thin'
|
39
|
+
Rack::Handler::Thin.run(app, Port: port)
|
40
|
+
end
|
41
|
+
|
42
|
+
Capybara.app = Server.new(app_path).app
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Volt
|
2
|
+
class << self
|
3
|
+
def setup_sauce_labs
|
4
|
+
require "sauce"
|
5
|
+
require "sauce/capybara"
|
6
|
+
|
7
|
+
Sauce.config do |c|
|
8
|
+
if ENV['OS']
|
9
|
+
# Use a specifc OS, BROWSER, VERSION combo (for travis)
|
10
|
+
c[:browsers] = [
|
11
|
+
[ENV['OS'], ENV['USE_BROWSER'], ENV['VERSION']]
|
12
|
+
]
|
13
|
+
else
|
14
|
+
# Run all
|
15
|
+
c[:browsers] = [
|
16
|
+
# ["Windows 7", "Chrome", "30"],
|
17
|
+
# ["Windows 8", "Firefox", "28"],
|
18
|
+
["Windows 8.1", "Internet Explorer", "11"],
|
19
|
+
["Windows 8.0", "Internet Explorer", "10"],
|
20
|
+
["Windows 7.0", "Internet Explorer", "9"],
|
21
|
+
# ["OSX 10.9", "iPhone", "8.1"],
|
22
|
+
# ["OSX 10.8", "Safari", "6"],
|
23
|
+
# ["Linux", "Chrome", "26"]
|
24
|
+
]
|
25
|
+
end
|
26
|
+
c[:start_local_application] = false
|
27
|
+
end
|
28
|
+
|
29
|
+
Capybara.default_driver = :sauce
|
30
|
+
Capybara.javascript_driver = :sauce
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/volt/spec/setup.rb
CHANGED
@@ -1,88 +1,19 @@
|
|
1
1
|
module Volt
|
2
|
-
|
3
|
-
|
2
|
+
class << self
|
3
|
+
def spec_setup(app_path = '.')
|
4
4
|
require 'volt'
|
5
|
-
|
6
|
-
|
7
|
-
ENV['VOLT_ENV'] = 'test'
|
5
|
+
unless RUBY_PLATFORM == 'opal'
|
6
|
+
require 'volt/spec/capybara'
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
require 'capybara/dsl'
|
12
|
-
require 'capybara/rspec'
|
13
|
-
require 'capybara/poltergeist'
|
14
|
-
end
|
15
|
-
|
16
|
-
require 'volt'
|
17
|
-
require 'volt/boot'
|
18
|
-
|
19
|
-
# Require in app
|
20
|
-
Volt.boot(app_path)
|
21
|
-
|
22
|
-
if ENV['BROWSER']
|
23
|
-
require 'volt/server'
|
24
|
-
|
25
|
-
Capybara.server do |app, port|
|
26
|
-
require 'rack/handler/thin'
|
27
|
-
Rack::Handler::Thin.run(app, Port: port)
|
28
|
-
end
|
29
|
-
|
30
|
-
Capybara.app = Server.new(app_path).app
|
31
|
-
|
32
|
-
if ENV['BROWSER'] == 'phantom'
|
33
|
-
Capybara.default_driver = :poltergeist
|
34
|
-
elsif ENV['BROWSER'] == 'chrome'
|
35
|
-
Capybara.register_driver :chrome do |app|
|
36
|
-
Capybara::Selenium::Driver.new(app, browser: :chrome)
|
37
|
-
end
|
38
|
-
|
39
|
-
Capybara.default_driver = :chrome
|
40
|
-
elsif ENV['BROWSER'] == 'firefox'
|
41
|
-
|
42
|
-
# require 'selenium/webdriver'
|
43
|
-
# # require 'selenium/client'
|
44
|
-
#
|
45
|
-
Capybara.default_driver = :selenium
|
8
|
+
ENV['SERVER'] = 'true'
|
9
|
+
ENV['VOLT_ENV'] = 'test'
|
46
10
|
|
47
|
-
|
48
|
-
# Capybara::Selenium::Driver.new(app, :browser => :firefox)
|
49
|
-
# end
|
50
|
-
# Capybara.current_driver = :selenium_firefox
|
51
|
-
elsif ENV['BROWSER'] == 'safari'
|
52
|
-
# Needs extension
|
53
|
-
Capybara.register_driver :safari do |app|
|
54
|
-
Capybara::Selenium::Driver.new(app, browser: :safari)
|
55
|
-
end
|
56
|
-
Capybara.default_driver = :safari
|
57
|
-
elsif ENV['BROWSER'] == 'sauce'
|
58
|
-
require "sauce"
|
59
|
-
require "sauce/capybara"
|
11
|
+
require 'volt/boot'
|
60
12
|
|
61
|
-
|
62
|
-
|
63
|
-
# Use a specifc OS, BROWSER, VERSION combo (for travis)
|
64
|
-
c[:browsers] = [
|
65
|
-
[ENV['OS'], ENV['USE_BROWSER'], ENV['VERSION']]
|
66
|
-
]
|
67
|
-
else
|
68
|
-
# Run all
|
69
|
-
c[:browsers] = [
|
70
|
-
# ["Windows 7", "Chrome", "30"],
|
71
|
-
# ["Windows 8", "Firefox", "28"],
|
72
|
-
["Windows 8.1", "Internet Explorer", "11"],
|
73
|
-
["Windows 8.0", "Internet Explorer", "10"],
|
74
|
-
["Windows 7.0", "Internet Explorer", "9"],
|
75
|
-
# ["OSX 10.9", "iPhone", "8.1"],
|
76
|
-
# ["OSX 10.8", "Safari", "6"],
|
77
|
-
# ["Linux", "Chrome", "26"]
|
78
|
-
]
|
79
|
-
end
|
80
|
-
c[:start_local_application] = false
|
81
|
-
end
|
13
|
+
# Require in app
|
14
|
+
Volt.boot(app_path)
|
82
15
|
|
83
|
-
|
84
|
-
Capybara.javascript_driver = :sauce
|
85
|
-
end
|
16
|
+
setup_capybara(app_path)
|
86
17
|
end
|
87
18
|
end
|
88
19
|
end
|
data/lib/volt/volt/users.rb
CHANGED
@@ -1,18 +1,80 @@
|
|
1
1
|
module Volt
|
2
|
+
class << self
|
3
|
+
# Get the user_id from the cookie
|
4
|
+
def user_id
|
5
|
+
user_id_signature = self.user_id_signature
|
2
6
|
|
3
|
-
|
4
|
-
|
5
|
-
|
7
|
+
if user_id_signature.nil?
|
8
|
+
return nil
|
9
|
+
else
|
10
|
+
index = user_id_signature.index(':')
|
11
|
+
user_id = user_id_signature[0...index]
|
6
12
|
|
7
|
-
|
8
|
-
|
13
|
+
if RUBY_PLATFORM != 'opal'
|
14
|
+
hash = user_id_signature[(index+1)..-1]
|
9
15
|
|
10
|
-
|
11
|
-
|
16
|
+
# Make sure the user hash matches
|
17
|
+
if BCrypt::Password.new(hash) != "#{Volt.config.app_secret}::#{user._id}"
|
18
|
+
# user id has been tampered with, reject
|
19
|
+
raise "user id or hash has been tampered with"
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
return user_id
|
25
|
+
end
|
12
26
|
end
|
13
|
-
end
|
14
27
|
|
15
|
-
|
16
|
-
|
28
|
+
# True if the user is logged in and the user is loaded
|
29
|
+
def user?
|
30
|
+
!!user
|
31
|
+
end
|
32
|
+
|
33
|
+
# Return the current user.
|
34
|
+
def user
|
35
|
+
user_id = self.user_id
|
36
|
+
if user_id
|
37
|
+
return $page.store._users.find_one(_id: user_id)
|
38
|
+
else
|
39
|
+
return nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Login the user, return a promise for success
|
44
|
+
def login(username, password)
|
45
|
+
UserTasks.login(username, password).then do |result|
|
46
|
+
|
47
|
+
# Assign the user_id cookie for the user
|
48
|
+
$page.cookies._user_id = result
|
49
|
+
|
50
|
+
# Pass nil back
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def logout
|
56
|
+
$page.cookies.delete(:user_id)
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
# Fetches the user_id+signature from the correct spot depending on client
|
63
|
+
# or server, does not verify it.
|
64
|
+
def user_id_signature
|
65
|
+
if Volt.client?
|
66
|
+
user_id_signature = $page.cookies._user_id
|
67
|
+
else
|
68
|
+
# Check meta for the user id and validate it
|
69
|
+
meta_data = Thread.current['meta']
|
70
|
+
if meta_data
|
71
|
+
user_id_signature = meta_data['user_id']
|
72
|
+
else
|
73
|
+
user_id_signature = nil
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
user_id_signature
|
78
|
+
end
|
17
79
|
end
|
18
80
|
end
|
data/volt.gemspec
CHANGED
@@ -26,10 +26,10 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_dependency 'sass', '~> 3.2.5'
|
27
27
|
spec.add_dependency 'mongo', '~> 1.9.0'
|
28
28
|
spec.add_dependency 'rake', '~> 10.0.4'
|
29
|
-
spec.add_dependency 'listen', '~> 2.
|
30
|
-
spec.add_dependency 'uglifier', '
|
29
|
+
spec.add_dependency 'listen', '~> 2.8.0'
|
30
|
+
spec.add_dependency 'uglifier', '>= 2.4.0'
|
31
31
|
spec.add_dependency "configurations", "~> 2.0.0.pre"
|
32
|
-
spec.add_dependency 'yui-compressor', '
|
32
|
+
spec.add_dependency 'yui-compressor', '>= 0.12.0'
|
33
33
|
spec.add_dependency 'opal', '~> 0.6.0'
|
34
34
|
spec.add_dependency 'opal-jquery', '~> 0.2.0'
|
35
35
|
spec.add_dependency 'rspec-core', '~> 3.1.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: volt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.22
|
4
|
+
version: 0.8.22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Stout
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -114,26 +114,26 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 2.
|
117
|
+
version: 2.8.0
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 2.
|
124
|
+
version: 2.8.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: uglifier
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- - "
|
129
|
+
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
131
|
version: 2.4.0
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- - "
|
136
|
+
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: 2.4.0
|
139
139
|
- !ruby/object:Gem::Dependency
|
@@ -154,14 +154,14 @@ dependencies:
|
|
154
154
|
name: yui-compressor
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
|
-
- - "
|
157
|
+
- - ">="
|
158
158
|
- !ruby/object:Gem::Version
|
159
159
|
version: 0.12.0
|
160
160
|
type: :runtime
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
|
-
- - "
|
164
|
+
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: 0.12.0
|
167
167
|
- !ruby/object:Gem::Dependency
|
@@ -473,6 +473,7 @@ files:
|
|
473
473
|
- lib/volt/extra_core/true_false.rb
|
474
474
|
- lib/volt/models.rb
|
475
475
|
- lib/volt/models/array_model.rb
|
476
|
+
- lib/volt/models/buffer.rb
|
476
477
|
- lib/volt/models/cursor.rb
|
477
478
|
- lib/volt/models/model.rb
|
478
479
|
- lib/volt/models/model_hash_behaviour.rb
|
@@ -556,6 +557,8 @@ files:
|
|
556
557
|
- lib/volt/server/rack/source_map_server.rb
|
557
558
|
- lib/volt/server/socket_connection_handler.rb
|
558
559
|
- lib/volt/server/socket_connection_handler_stub.rb
|
560
|
+
- lib/volt/spec/capybara.rb
|
561
|
+
- lib/volt/spec/sauce_labs.rb
|
559
562
|
- lib/volt/spec/setup.rb
|
560
563
|
- lib/volt/store/mongo.rb
|
561
564
|
- lib/volt/tasks/dispatcher.rb
|
@@ -700,9 +703,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
700
703
|
version: '0'
|
701
704
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
702
705
|
requirements:
|
703
|
-
- - "
|
706
|
+
- - ">="
|
704
707
|
- !ruby/object:Gem::Version
|
705
|
-
version:
|
708
|
+
version: '0'
|
706
709
|
requirements: []
|
707
710
|
rubyforge_project:
|
708
711
|
rubygems_version: 2.2.2
|