volt 0.9.1 → 0.9.2
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/.rubocop.yml +56 -0
- data/CHANGELOG.md +4 -0
- data/Rakefile +0 -1
- data/app/volt/models/user.rb +1 -3
- data/app/volt/tasks/live_query/live_query.rb +1 -1
- data/app/volt/tasks/store_tasks.rb +4 -5
- data/app/volt/tasks/user_tasks.rb +1 -1
- data/lib/volt.rb +2 -6
- data/lib/volt/boot.rb +0 -2
- data/lib/volt/cli.rb +0 -1
- data/lib/volt/cli/asset_compile.rb +0 -2
- data/lib/volt/cli/console.rb +3 -4
- data/lib/volt/cli/generate.rb +3 -4
- data/lib/volt/cli/new_gem.rb +1 -3
- data/lib/volt/controllers/actions.rb +6 -6
- data/lib/volt/controllers/model_controller.rb +4 -8
- data/lib/volt/data_stores/base.rb +1 -2
- data/lib/volt/data_stores/data_store.rb +2 -2
- data/lib/volt/data_stores/mongo_driver.rb +3 -3
- data/lib/volt/extra_core/hash.rb +1 -1
- data/lib/volt/extra_core/inflector/inflections.rb +10 -2
- data/lib/volt/extra_core/logger.rb +1 -4
- data/lib/volt/extra_core/object.rb +1 -1
- data/lib/volt/models.rb +2 -4
- data/lib/volt/models/array_model.rb +3 -7
- data/lib/volt/models/associations.rb +5 -4
- data/lib/volt/models/buffer.rb +1 -2
- data/lib/volt/models/dirty.rb +2 -2
- data/lib/volt/models/errors.rb +1 -1
- data/lib/volt/models/listener_tracker.rb +1 -3
- data/lib/volt/models/model.rb +16 -20
- data/lib/volt/models/permissions.rb +15 -18
- data/lib/volt/models/persistors/array_store.rb +5 -10
- data/lib/volt/models/persistors/cookies.rb +2 -2
- data/lib/volt/models/persistors/model_store.rb +3 -9
- data/lib/volt/models/persistors/params.rb +1 -3
- data/lib/volt/models/persistors/query/normalizer.rb +3 -3
- data/lib/volt/models/persistors/query/query_listener.rb +1 -1
- data/lib/volt/models/persistors/store.rb +2 -2
- data/lib/volt/models/state_helpers.rb +1 -1
- data/lib/volt/models/state_manager.rb +4 -4
- data/lib/volt/models/url.rb +2 -6
- data/lib/volt/models/validations.rb +8 -13
- data/lib/volt/models/validators/numericality_validator.rb +2 -6
- data/lib/volt/models/validators/unique_validator.rb +1 -1
- data/lib/volt/models/validators/user_validation.rb +0 -1
- data/lib/volt/page/bindings/attribute_binding.rb +9 -19
- data/lib/volt/page/bindings/content_binding.rb +1 -1
- data/lib/volt/page/bindings/each_binding.rb +3 -4
- data/lib/volt/page/bindings/if_binding.rb +1 -1
- data/lib/volt/page/bindings/view_binding.rb +15 -22
- data/lib/volt/page/bindings/view_binding/controller_handler.rb +5 -7
- data/lib/volt/page/bindings/view_binding/view_lookup_for_path.rb +1 -2
- data/lib/volt/page/bindings/yield_binding.rb +1 -2
- data/lib/volt/page/channel.rb +3 -3
- data/lib/volt/page/document_events.rb +1 -1
- data/lib/volt/page/page.rb +3 -6
- data/lib/volt/page/path_string_renderer.rb +7 -8
- data/lib/volt/page/sub_context.rb +1 -3
- data/lib/volt/page/targets/binding_document/component_node.rb +1 -3
- data/lib/volt/page/tasks.rb +3 -5
- data/lib/volt/reactive/class_eventable.rb +2 -2
- data/lib/volt/reactive/computation.rb +7 -7
- data/lib/volt/reactive/dependency.rb +1 -1
- data/lib/volt/reactive/eventable.rb +3 -4
- data/lib/volt/reactive/reactive_accessors.rb +0 -1
- data/lib/volt/reactive/reactive_array.rb +4 -12
- data/lib/volt/router/routes.rb +1 -3
- data/lib/volt/server.rb +6 -6
- data/lib/volt/server/component_handler.rb +1 -1
- data/lib/volt/server/component_templates.rb +2 -2
- data/lib/volt/server/forking_server.rb +6 -9
- data/lib/volt/server/html_parser/component_view_scope.rb +2 -2
- data/lib/volt/server/html_parser/each_scope.rb +1 -1
- data/lib/volt/server/html_parser/sandlebars_parser.rb +2 -6
- data/lib/volt/server/html_parser/view_handler.rb +1 -1
- data/lib/volt/server/html_parser/view_parser.rb +1 -1
- data/lib/volt/server/html_parser/view_scope.rb +2 -4
- data/lib/volt/server/rack/asset_files.rb +1 -3
- data/lib/volt/server/rack/component_paths.rb +1 -3
- data/lib/volt/server/rack/http_request.rb +1 -3
- data/lib/volt/server/rack/http_resource.rb +1 -3
- data/lib/volt/server/rack/http_response_renderer.rb +2 -2
- data/lib/volt/server/rack/index_files.rb +1 -1
- data/lib/volt/server/rack/opal_files.rb +1 -3
- data/lib/volt/server/socket_connection_handler.rb +1 -3
- data/lib/volt/server/websocket/rack_server_adaptor.rb +1 -1
- data/lib/volt/server/websocket/websocket_handler.rb +1 -2
- data/lib/volt/spec/capybara.rb +1 -1
- data/lib/volt/spec/setup.rb +18 -12
- data/lib/volt/tasks/dispatcher.rb +1 -2
- data/lib/volt/tasks/task_handler.rb +1 -3
- data/lib/volt/utils/boolean_patch.rb +1 -1
- data/lib/volt/utils/event_counter.rb +2 -2
- data/lib/volt/utils/generic_pool.rb +5 -9
- data/lib/volt/utils/logging/task_argument_filterer.rb +4 -4
- data/lib/volt/utils/logging/task_logger.rb +2 -2
- data/lib/volt/utils/modes.rb +2 -2
- data/lib/volt/utils/promise_patch.rb +1 -2
- data/lib/volt/utils/read_write_lock.rb +21 -23
- data/lib/volt/utils/tilt_patch.rb +1 -1
- data/lib/volt/utils/timers.rb +3 -7
- data/lib/volt/utils/volt_user_error.rb +1 -1
- data/lib/volt/version.rb +2 -2
- data/lib/volt/volt/app.rb +4 -6
- data/lib/volt/volt/users.rb +4 -3
- data/spec/apps/kitchen_sink/app/main/controllers/main_controller.rb +1 -1
- data/spec/apps/kitchen_sink/app/main/controllers/server/simple_http_controller.rb +1 -1
- data/spec/apps/kitchen_sink/app/main/controllers/todos_controller.rb +5 -5
- data/spec/apps/kitchen_sink/app/main/controllers/upload_controller.rb +1 -1
- data/spec/apps/kitchen_sink/app/main/controllers/yield_component_controller.rb +1 -1
- data/spec/controllers/actions_spec.rb +9 -10
- data/spec/controllers/model_controller_spec.rb +1 -1
- data/spec/extra_core/blank_spec.rb +2 -2
- data/spec/extra_core/logger_spec.rb +6 -8
- data/spec/extra_core/string_transformations_spec.rb +3 -3
- data/spec/integration/bindings_spec.rb +3 -9
- data/spec/integration/first_last_spec.rb +1 -1
- data/spec/integration/missing_spec.rb +1 -2
- data/spec/integration/raw_html_binding.rb +2 -2
- data/spec/integration/todos_spec.rb +22 -0
- data/spec/integration/yield_spec.rb +2 -2
- data/spec/models/associations_spec.rb +4 -4
- data/spec/models/buffer_spec.rb +2 -2
- data/spec/models/dirty_spec.rb +10 -11
- data/spec/models/model_spec.rb +19 -13
- data/spec/models/model_state_spec.rb +1 -1
- data/spec/models/permissions_spec.rb +8 -12
- data/spec/models/url_spec.rb +1 -1
- data/spec/models/user_spec.rb +17 -10
- data/spec/models/user_validation_spec.rb +2 -3
- data/spec/models/validations_spec.rb +7 -10
- data/spec/models/validators/email_validator_spec.rb +5 -7
- data/spec/models/validators/format_validator_spec.rb +21 -3
- data/spec/models/validators/length_validator_spec.rb +12 -22
- data/spec/models/validators/shared_examples_for_validators.rb +1 -1
- data/spec/models/validators/unique_validator_spec.rb +1 -2
- data/spec/page/bindings/content_binding_spec.rb +1 -1
- data/spec/page/bindings/template_binding/view_lookup_for_path_spec.rb +0 -1
- data/spec/page/path_string_renderer_spec.rb +2 -3
- data/spec/reactive/class_eventable_spec.rb +1 -1
- data/spec/reactive/computation_spec.rb +30 -31
- data/spec/reactive/reactive_hash_spec.rb +1 -1
- data/spec/router/routes_spec.rb +14 -16
- data/spec/server/html_parser/view_handler_spec.rb +1 -1
- data/spec/server/html_parser/view_parser_spec.rb +0 -1
- data/spec/server/rack/quite_common_logger_spec.rb +3 -3
- data/spec/tasks/dispatcher_spec.rb +1 -1
- data/spec/tasks/query_tracker_spec.rb +1 -3
- data/spec/utils/task_argument_filtererer_spec.rb +5 -5
- data/templates/project/app/main/controllers/main_controller.rb +1 -1
- data/templates/project/spec/app/main/models/sample_model_spec.rb +2 -2
- data/templates/project/spec/app/main/tasks/sample_task_spec.rb +2 -2
- data/volt.gemspec +3 -5
- metadata +19 -4
@@ -21,7 +21,7 @@ else
|
|
21
21
|
|
22
22
|
module Volt
|
23
23
|
class VoltLogger < Logger
|
24
|
-
def initialize(current={})
|
24
|
+
def initialize(current = {})
|
25
25
|
super(STDOUT)
|
26
26
|
@current = current
|
27
27
|
@formatter = Volt::VoltLoggerFormatter.new
|
@@ -38,7 +38,6 @@ else
|
|
38
38
|
level = error ? Logger::ERROR : Logger::INFO
|
39
39
|
text = TaskLogger.task_dispatch_message(self, args)
|
40
40
|
|
41
|
-
|
42
41
|
if error
|
43
42
|
text += "\n" + colorize(error.to_s, :red)
|
44
43
|
if error.is_a?(Exception) && !error.is_a?(VoltUserError)
|
@@ -47,7 +46,6 @@ else
|
|
47
46
|
end
|
48
47
|
|
49
48
|
log(level, text)
|
50
|
-
|
51
49
|
end
|
52
50
|
|
53
51
|
def args
|
@@ -70,7 +68,6 @@ else
|
|
70
68
|
Volt.logger.info(colorize(msg, color))
|
71
69
|
end
|
72
70
|
|
73
|
-
|
74
71
|
private
|
75
72
|
|
76
73
|
def colorize(string, color)
|
data/lib/volt/models.rb
CHANGED
@@ -5,9 +5,7 @@ require 'volt/models/persistors/store_factory'
|
|
5
5
|
require 'volt/models/persistors/array_store'
|
6
6
|
require 'volt/models/persistors/model_store'
|
7
7
|
require 'volt/models/persistors/params'
|
8
|
-
if RUBY_PLATFORM == 'opal'
|
9
|
-
require 'volt/models/persistors/cookies'
|
10
|
-
end
|
8
|
+
require 'volt/models/persistors/cookies' if RUBY_PLATFORM == 'opal'
|
11
9
|
require 'volt/models/persistors/flash'
|
12
10
|
require 'volt/models/persistors/local_store'
|
13
11
|
if RUBY_PLATFORM == 'opal'
|
@@ -20,4 +18,4 @@ else
|
|
20
18
|
require(gem_dir + '/stdlib/promise')
|
21
19
|
end
|
22
20
|
# TODO: remove once https://github.com/opal/opal/pull/725 is released.
|
23
|
-
require 'volt/utils/promise_patch'
|
21
|
+
require 'volt/utils/promise_patch'
|
@@ -11,7 +11,6 @@ module Volt
|
|
11
11
|
include StateManager
|
12
12
|
include StateHelpers
|
13
13
|
|
14
|
-
|
15
14
|
attr_reader :parent, :path, :persistor, :options, :array
|
16
15
|
|
17
16
|
# For many methods, we want to call load data as soon as the model is interacted
|
@@ -74,7 +73,7 @@ module Volt
|
|
74
73
|
end
|
75
74
|
|
76
75
|
if model.is_a?(Model) && !model.can_create?
|
77
|
-
|
76
|
+
fail "permissions did not allow create for #{model.inspect}"
|
78
77
|
end
|
79
78
|
|
80
79
|
super(model)
|
@@ -135,7 +134,6 @@ module Volt
|
|
135
134
|
self[0]
|
136
135
|
end
|
137
136
|
|
138
|
-
|
139
137
|
# returns a promise to fetch the first instance
|
140
138
|
def fetch_first(&block)
|
141
139
|
persistor = self.persistor
|
@@ -201,7 +199,7 @@ module Volt
|
|
201
199
|
end
|
202
200
|
end
|
203
201
|
|
204
|
-
def buffer(attrs={})
|
202
|
+
def buffer(attrs = {})
|
205
203
|
model_path = options[:path] + [:[]]
|
206
204
|
model_klass = Volt::Model.class_at_path(model_path)
|
207
205
|
|
@@ -215,9 +213,7 @@ module Volt
|
|
215
213
|
|
216
214
|
# Takes the persistor if there is one and
|
217
215
|
def setup_persistor(persistor)
|
218
|
-
if persistor
|
219
|
-
@persistor = persistor.new(self)
|
220
|
-
end
|
216
|
+
@persistor = persistor.new(self) if persistor
|
221
217
|
end
|
222
218
|
end
|
223
219
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Volt
|
2
2
|
module Associations
|
3
3
|
module ClassMethods
|
4
|
-
def belongs_to(method_name, key_name=nil)
|
4
|
+
def belongs_to(method_name, key_name = nil)
|
5
5
|
# getter
|
6
6
|
define_method(method_name) do
|
7
7
|
association_with_root_model('belongs_to') do |root|
|
@@ -9,15 +9,15 @@ module Volt
|
|
9
9
|
lookup_key = send(:"_#{key_name || method_name}_id")
|
10
10
|
|
11
11
|
# Return a promise for the belongs_to
|
12
|
-
root.send(:"_#{method_name.pluralize}").where(:
|
12
|
+
root.send(:"_#{method_name.pluralize}").where(_id: lookup_key).fetch_first
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
def has_many(method_name, remote_key_name=nil)
|
17
|
+
def has_many(method_name, remote_key_name = nil)
|
18
18
|
define_method(method_name) do
|
19
19
|
association_with_root_model('has_many') do |root|
|
20
|
-
id =
|
20
|
+
id = _id
|
21
21
|
|
22
22
|
# The key will be "{this class name}_id"
|
23
23
|
remote_key_name ||= :"#{path[-2].singularize}_id"
|
@@ -33,6 +33,7 @@ module Volt
|
|
33
33
|
end
|
34
34
|
|
35
35
|
private
|
36
|
+
|
36
37
|
# Currently the has_many and belongs_to associations only work on the store collection,
|
37
38
|
# this method checks to make sure we are on store and returns the root reference to it.
|
38
39
|
def association_with_root_model(method_name)
|
data/lib/volt/models/buffer.rb
CHANGED
@@ -7,8 +7,7 @@ module Volt
|
|
7
7
|
def save!(&block)
|
8
8
|
# TODO: this shouldn't need to be run, but if no attributes are assigned, then
|
9
9
|
# if needs to be run. Maybe there's a better way to handle it.
|
10
|
-
|
11
|
-
|
10
|
+
validate!.then do
|
12
11
|
# Get errors from validate
|
13
12
|
errors = self.errors.to_h
|
14
13
|
|
data/lib/volt/models/dirty.rb
CHANGED
@@ -8,7 +8,7 @@ module Volt
|
|
8
8
|
end
|
9
9
|
|
10
10
|
# Return true if key has changed
|
11
|
-
def changed?(key=nil)
|
11
|
+
def changed?(key = nil)
|
12
12
|
if key
|
13
13
|
# return the changed values for the keys
|
14
14
|
changed_attributes.key?(key)
|
@@ -85,4 +85,4 @@ module Volt
|
|
85
85
|
super
|
86
86
|
end
|
87
87
|
end
|
88
|
-
end
|
88
|
+
end
|
data/lib/volt/models/errors.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Volt
|
2
2
|
# Included in model's so they can inform the ArrayModel when new listeners are added or removed.
|
3
3
|
module ListenerTracker
|
4
|
-
|
5
4
|
# Called when data from this model begins being watched
|
6
5
|
def listener_added
|
7
6
|
@listener_count ||= 0
|
@@ -12,6 +11,5 @@ module Volt
|
|
12
11
|
@listener_count ||= 0
|
13
12
|
@listener_count -= 1
|
14
13
|
end
|
15
|
-
|
16
14
|
end
|
17
|
-
end
|
15
|
+
end
|
data/lib/volt/models/model.rb
CHANGED
@@ -49,11 +49,11 @@ module Volt
|
|
49
49
|
attr_reader :attributes, :parent, :path, :persistor, :options
|
50
50
|
|
51
51
|
INVALID_FIELD_NAMES = {
|
52
|
-
:
|
53
|
-
:
|
54
|
-
:
|
55
|
-
:
|
56
|
-
:
|
52
|
+
attributes: true,
|
53
|
+
parent: true,
|
54
|
+
path: true,
|
55
|
+
options: true,
|
56
|
+
persistor: true
|
57
57
|
}
|
58
58
|
|
59
59
|
def initialize(attributes = {}, options = {}, initial_state = nil)
|
@@ -126,7 +126,7 @@ module Volt
|
|
126
126
|
end
|
127
127
|
|
128
128
|
# Assign multiple attributes as a hash, directly.
|
129
|
-
def assign_attributes(attrs, initial_setup=false, skip_changes=false)
|
129
|
+
def assign_attributes(attrs, initial_setup = false, skip_changes = false)
|
130
130
|
@attributes ||= {}
|
131
131
|
|
132
132
|
attrs = wrap_values(attrs)
|
@@ -227,9 +227,7 @@ module Volt
|
|
227
227
|
|
228
228
|
@deps.changed!(attribute_name)
|
229
229
|
|
230
|
-
if old_value
|
231
|
-
@size_dep.changed!
|
232
|
-
end
|
230
|
+
@size_dep.changed! if old_value.nil? || new_value.nil?
|
233
231
|
|
234
232
|
# TODO: Can we make this so it doesn't need to be handled for non store collections
|
235
233
|
# (maybe move it to persistor, though thats weird since buffers don't have a persistor)
|
@@ -246,7 +244,7 @@ module Volt
|
|
246
244
|
# 1) a nil model, which returns a wrapped error
|
247
245
|
# 2) reading directly from attributes
|
248
246
|
# 3) trying to read a key that doesn't exist.
|
249
|
-
def get(attr_name, expand=false)
|
247
|
+
def get(attr_name, expand = false)
|
250
248
|
# Reading an attribute, we may get back a nil model.
|
251
249
|
attr_name = attr_name.to_sym
|
252
250
|
|
@@ -286,7 +284,7 @@ module Volt
|
|
286
284
|
end
|
287
285
|
end
|
288
286
|
|
289
|
-
def respond_to_missing?(method_name, include_private=false)
|
287
|
+
def respond_to_missing?(method_name, include_private = false)
|
290
288
|
method_name.to_s.start_with?('_') || super
|
291
289
|
end
|
292
290
|
|
@@ -343,7 +341,7 @@ module Volt
|
|
343
341
|
# Wrap result in a promise if it isn't one
|
344
342
|
return Promise.new.then { result }
|
345
343
|
else
|
346
|
-
fail
|
344
|
+
fail 'Model does not have a parent and cannot be deleted.'
|
347
345
|
end
|
348
346
|
end
|
349
347
|
|
@@ -355,12 +353,13 @@ module Volt
|
|
355
353
|
end
|
356
354
|
|
357
355
|
private
|
356
|
+
|
358
357
|
# Volt provides a few access methods to get more data about the model,
|
359
358
|
# we want to prevent these from being assigned or accessed through
|
360
359
|
# underscore methods.
|
361
360
|
def check_valid_field_name(name)
|
362
361
|
if INVALID_FIELD_NAMES[name]
|
363
|
-
|
362
|
+
fail InvalidFieldName, "`#{name}` is reserved and can not be used as a field"
|
364
363
|
end
|
365
364
|
end
|
366
365
|
|
@@ -377,13 +376,11 @@ module Volt
|
|
377
376
|
|
378
377
|
# Takes the persistor if there is one and
|
379
378
|
def setup_persistor(persistor)
|
380
|
-
if persistor
|
381
|
-
@persistor = persistor.new(self)
|
382
|
-
end
|
379
|
+
@persistor = persistor.new(self) if persistor
|
383
380
|
end
|
384
381
|
|
385
382
|
# Used internally from other methods that assign all attributes
|
386
|
-
def assign_all_attributes(attrs, track_changes=false)
|
383
|
+
def assign_all_attributes(attrs, track_changes = false)
|
387
384
|
# Assign each attribute using setters
|
388
385
|
attrs.each_pair do |key, value|
|
389
386
|
key = key.to_sym
|
@@ -408,7 +405,7 @@ module Volt
|
|
408
405
|
#
|
409
406
|
# @return [Promise|nil] a promise for when the save is
|
410
407
|
# complete
|
411
|
-
def run_changed(attribute_name=nil)
|
408
|
+
def run_changed(attribute_name = nil)
|
412
409
|
# no_validate mode should only be used internally. no_validate mode is a
|
413
410
|
# performance optimization that prevents validation from running after each
|
414
411
|
# change when assigning multile attributes.
|
@@ -416,7 +413,6 @@ module Volt
|
|
416
413
|
# Run the validations for all fields
|
417
414
|
result = nil
|
418
415
|
return validate!.then do
|
419
|
-
|
420
416
|
# Buffers are allowed to be in an invalid state
|
421
417
|
unless buffer?
|
422
418
|
# First check that all local validations pass
|
@@ -458,7 +454,7 @@ module Volt
|
|
458
454
|
end
|
459
455
|
|
460
456
|
# Didn't run validations
|
461
|
-
|
457
|
+
nil
|
462
458
|
end
|
463
459
|
end
|
464
460
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Volt
|
2
2
|
class Model
|
3
|
-
|
4
3
|
# The permissions module provides helpers for working with Volt permissions.
|
5
4
|
module Permissions
|
6
5
|
module ClassMethods
|
@@ -9,7 +8,7 @@ module Volt
|
|
9
8
|
# the user can not be changed.
|
10
9
|
#
|
11
10
|
# @param key [Symbol] the name of the attribute to store
|
12
|
-
def own_by_user(key
|
11
|
+
def own_by_user(key = :user_id)
|
13
12
|
# When the model is created, assign it the user_id (if the user is logged in)
|
14
13
|
on(:new) do
|
15
14
|
# Only assign the user_id if there isn't already one and the user is logged in.
|
@@ -29,12 +28,11 @@ module Volt
|
|
29
28
|
# for a nil model.
|
30
29
|
unless @attributes[:user_id]
|
31
30
|
# Show an error that the user is not logged in
|
32
|
-
next {key => ['requires a logged in user']}
|
31
|
+
next { key => ['requires a logged in user'] }
|
33
32
|
end
|
34
33
|
end
|
35
34
|
end
|
36
35
|
|
37
|
-
|
38
36
|
# TODO: Change to
|
39
37
|
# permissions(:create, :read, :update) do |action|
|
40
38
|
# if owner?
|
@@ -81,7 +79,7 @@ module Volt
|
|
81
79
|
end
|
82
80
|
end
|
83
81
|
else
|
84
|
-
|
82
|
+
fail 'allow should be called inside of a permissions block'
|
85
83
|
end
|
86
84
|
end
|
87
85
|
|
@@ -97,7 +95,7 @@ module Volt
|
|
97
95
|
end
|
98
96
|
end
|
99
97
|
else
|
100
|
-
|
98
|
+
fail 'deny should be called inside of a permissions block'
|
101
99
|
end
|
102
100
|
end
|
103
101
|
|
@@ -105,10 +103,10 @@ module Volt
|
|
105
103
|
# in user (```Volt.current_user```) is the owner of this instance.
|
106
104
|
#
|
107
105
|
# @param key [Symbol] the name of the attribute where the user_id is stored
|
108
|
-
def owner?(key
|
106
|
+
def owner?(key = :user_id)
|
109
107
|
# Lookup the original user_id
|
110
108
|
owner_id = was(key) || send(:"_#{key}")
|
111
|
-
owner_id
|
109
|
+
!owner_id.nil? && owner_id == Volt.current_user_id
|
112
110
|
end
|
113
111
|
|
114
112
|
# Returns boolean if the model can be deleted
|
@@ -134,7 +132,7 @@ module Volt
|
|
134
132
|
|
135
133
|
clear_allow_and_deny
|
136
134
|
|
137
|
-
|
135
|
+
!deny
|
138
136
|
end
|
139
137
|
|
140
138
|
# Return the list of allowed fields
|
@@ -145,7 +143,7 @@ module Volt
|
|
145
143
|
|
146
144
|
clear_allow_and_deny
|
147
145
|
|
148
|
-
|
146
|
+
result
|
149
147
|
end
|
150
148
|
|
151
149
|
# Filter fields returns the attributes with any denied or not allowed fields
|
@@ -161,21 +159,22 @@ module Volt
|
|
161
159
|
allow << :_id
|
162
160
|
|
163
161
|
# Only keep fields in the allow list
|
164
|
-
return @attributes.select {|key| allow.include?(key) }
|
162
|
+
return @attributes.select { |key| allow.include?(key) }
|
165
163
|
elsif deny == true
|
166
164
|
# Only keep id
|
167
165
|
# TODO: Should this be a full reject?
|
168
|
-
return @attributes.reject {|key| key != :_id }
|
166
|
+
return @attributes.reject { |key| key != :_id }
|
169
167
|
elsif deny && deny.size > 0
|
170
168
|
# Reject any in the deny list
|
171
|
-
return @attributes.reject {|key| deny.include?(key) }
|
169
|
+
return @attributes.reject { |key| deny.include?(key) }
|
172
170
|
else
|
173
171
|
return @attributes
|
174
172
|
end
|
175
173
|
end
|
176
174
|
|
177
175
|
private
|
178
|
-
|
176
|
+
|
177
|
+
def run_permissions(action_name = nil)
|
179
178
|
compute_allow_and_deny(action_name)
|
180
179
|
|
181
180
|
errors = {}
|
@@ -199,9 +198,7 @@ module Volt
|
|
199
198
|
elsif @__deny_fields
|
200
199
|
# Allow all except the denied
|
201
200
|
@__deny_fields.each do |field_name|
|
202
|
-
if changed?(field_name)
|
203
|
-
add_error_if_changed(errors, field_name)
|
204
|
-
end
|
201
|
+
add_error_if_changed(errors, field_name) if changed?(field_name)
|
205
202
|
end
|
206
203
|
end
|
207
204
|
|
@@ -244,4 +241,4 @@ module Volt
|
|
244
241
|
end
|
245
242
|
end
|
246
243
|
end
|
247
|
-
end
|
244
|
+
end
|
@@ -50,23 +50,19 @@ module Volt
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def inspect
|
53
|
-
"<#{self.class
|
53
|
+
"<#{self.class}:#{object_id} #{@model.path.inspect} #{@query.inspect}>"
|
54
54
|
end
|
55
55
|
|
56
56
|
# Called when an each binding is listening
|
57
57
|
def event_added(event, first, first_for_event)
|
58
58
|
# First event, we load the data.
|
59
|
-
if first
|
60
|
-
@listener_event_counter.add
|
61
|
-
end
|
59
|
+
@listener_event_counter.add if first
|
62
60
|
end
|
63
61
|
|
64
62
|
# Called when an each binding stops listening
|
65
63
|
def event_removed(event, last, last_for_event)
|
66
64
|
# Remove listener where there are no more events on this model
|
67
|
-
if last
|
68
|
-
@listener_event_counter.remove
|
69
|
-
end
|
65
|
+
@listener_event_counter.remove if last
|
70
66
|
end
|
71
67
|
|
72
68
|
# Called by child models to track their listeners
|
@@ -141,7 +137,7 @@ module Volt
|
|
141
137
|
if parent && (attrs = parent.attributes) && attrs[:_id]
|
142
138
|
query = query.dup
|
143
139
|
|
144
|
-
query << [:find, {:"#{@model.path[-3].singularize}_id" => attrs[:_id]}]
|
140
|
+
query << [:find, { :"#{@model.path[-3].singularize}_id" => attrs[:_id] }]
|
145
141
|
end
|
146
142
|
end
|
147
143
|
|
@@ -203,13 +199,12 @@ module Volt
|
|
203
199
|
if @model.loaded_state == :loaded
|
204
200
|
promise.resolve(@model)
|
205
201
|
else
|
206
|
-
|
202
|
+
proc do |comp|
|
207
203
|
if @model.loaded_state == :loaded
|
208
204
|
promise.resolve(@model)
|
209
205
|
|
210
206
|
comp.stop
|
211
207
|
end
|
212
|
-
|
213
208
|
end.watch!
|
214
209
|
end
|
215
210
|
|