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
data/spec/models/model_spec.rb
CHANGED
@@ -201,7 +201,7 @@ describe Volt::Model do
|
|
201
201
|
a = Volt::Model.new
|
202
202
|
|
203
203
|
count = 0
|
204
|
-
-> { a._blue
|
204
|
+
-> { a._blue; count += 1 }.watch!
|
205
205
|
|
206
206
|
expect(count).to eq(1)
|
207
207
|
|
@@ -219,7 +219,7 @@ describe Volt::Model do
|
|
219
219
|
|
220
220
|
expect(count).to eq(0)
|
221
221
|
|
222
|
-
a._todos << {label: 'Be active'}
|
222
|
+
a._todos << { label: 'Be active' }
|
223
223
|
Volt::Computation.flush!
|
224
224
|
|
225
225
|
expect(count).to eq(1)
|
@@ -233,7 +233,7 @@ describe Volt::Model do
|
|
233
233
|
|
234
234
|
expect(last_count).to eq(0)
|
235
235
|
|
236
|
-
a._todos! << {checked: true}
|
236
|
+
a._todos! << { checked: true }
|
237
237
|
Volt::Computation.flush!
|
238
238
|
|
239
239
|
expect(last_count).to eq(1)
|
@@ -304,7 +304,7 @@ describe Volt::Model do
|
|
304
304
|
# Expand first
|
305
305
|
a._new_item!
|
306
306
|
count = 0
|
307
|
-
|
307
|
+
lambda do
|
308
308
|
count += 1
|
309
309
|
a._new_item._name
|
310
310
|
end.watch!
|
@@ -459,7 +459,6 @@ describe Volt::Model do
|
|
459
459
|
model.send(:"_#{attr_name}")
|
460
460
|
end.to raise_error(Volt::InvalidFieldName, "`#{attr_name}` is reserved and can not be used as a field")
|
461
461
|
end
|
462
|
-
|
463
462
|
end
|
464
463
|
|
465
464
|
it 'should prevent reserved attributes from being assigned directly' do
|
@@ -502,7 +501,7 @@ describe Volt::Model do
|
|
502
501
|
expect(model._name).to eq('Jimmy')
|
503
502
|
end
|
504
503
|
|
505
|
-
describe
|
504
|
+
describe 'model state' do
|
506
505
|
it 'should be new when created, then false after a change' do
|
507
506
|
a = Volt::Model.new
|
508
507
|
expect(a.new?).to eq(true)
|
@@ -515,12 +514,11 @@ describe Volt::Model do
|
|
515
514
|
a = Volt::Model.new
|
516
515
|
expect(a.new?).to eq(true)
|
517
516
|
|
518
|
-
a.attributes = {first: 'Jimmy', last: 'Dean'}
|
517
|
+
a.attributes = { first: 'Jimmy', last: 'Dean' }
|
519
518
|
expect(a.new?).to eq(false)
|
520
519
|
end
|
521
520
|
end
|
522
521
|
|
523
|
-
|
524
522
|
if RUBY_PLATFORM != 'opal'
|
525
523
|
it 'should update other queries on the server when a new model is created' do
|
526
524
|
query1 = store._todos!
|
@@ -529,21 +527,21 @@ describe Volt::Model do
|
|
529
527
|
count = 0
|
530
528
|
|
531
529
|
# count the number of todos
|
532
|
-
query2.fetch {|v| count += v.size }
|
530
|
+
query2.fetch { |v| count += v.size }
|
533
531
|
|
534
532
|
expect(count).to eq(0)
|
535
533
|
|
536
|
-
query1 << {label: 'One'}
|
534
|
+
query1 << { label: 'One' }
|
537
535
|
|
538
536
|
count = 0
|
539
|
-
query2.fetch {|v| count += v.size }
|
537
|
+
query2.fetch { |v| count += v.size }
|
540
538
|
|
541
539
|
expect(count).to eq(1)
|
542
540
|
end
|
543
541
|
|
544
542
|
it 'should query twice and return twice' do
|
545
|
-
store._items << {name: 'One'}
|
546
|
-
store._items << {name: 'Two'}
|
543
|
+
store._items << { name: 'One' }
|
544
|
+
store._items << { name: 'Two' }
|
547
545
|
|
548
546
|
a = store._items.fetch.sync
|
549
547
|
b = store._items.fetch.sync
|
@@ -554,4 +552,12 @@ describe Volt::Model do
|
|
554
552
|
expect(a.to_a).to eq(b.to_a)
|
555
553
|
end
|
556
554
|
end
|
555
|
+
|
556
|
+
describe 'destroy' do
|
557
|
+
it 'fails if attempting to destroy while parentless' do
|
558
|
+
model = Volt::Model.new(test: "yeah")
|
559
|
+
expect { model.destroy }.to raise_error(RuntimeError,
|
560
|
+
'Model does not have a parent and cannot be deleted.')
|
561
|
+
end
|
562
|
+
end
|
557
563
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
3
|
class TestUserTodo < Volt::Model
|
5
4
|
own_by_user
|
6
5
|
|
@@ -47,7 +46,7 @@ class ::TestUpdateReadCheck < Volt::Model
|
|
47
46
|
end
|
48
47
|
end
|
49
48
|
|
50
|
-
describe
|
49
|
+
describe 'model permissions' do
|
51
50
|
it 'should follow CRUD states when checking permissions' do
|
52
51
|
todo = TestUserTodoWithCrudStates.new.buffer
|
53
52
|
|
@@ -59,26 +58,23 @@ describe "model permissions" do
|
|
59
58
|
todo._name = 'Jimmy'
|
60
59
|
|
61
60
|
todo.save!.then do
|
62
|
-
spec_err =
|
61
|
+
spec_err = 'should not have saved'
|
63
62
|
end.fail do |err|
|
64
|
-
expect(err).to eq(
|
63
|
+
expect(err).to eq(name: ['can not be changed'])
|
65
64
|
end
|
66
65
|
end.fail do |err|
|
67
66
|
spec_err = "Did not save because: #{err.inspect}"
|
68
67
|
end
|
69
68
|
|
70
|
-
if spec_err
|
71
|
-
fail spec_err
|
72
|
-
end
|
69
|
+
fail spec_err if spec_err
|
73
70
|
end
|
74
71
|
|
75
72
|
# it 'should deny an insert/create if a deny without fields' do
|
76
73
|
# store._todos << {name: 'Ryan'}
|
77
74
|
# end
|
78
75
|
|
79
|
-
|
80
76
|
if RUBY_PLATFORM != 'opal'
|
81
|
-
describe
|
77
|
+
describe 'read permissions' do
|
82
78
|
it 'should deny read on a field' do
|
83
79
|
model = store._test_deny_read_names!.buffer
|
84
80
|
model._name = 'Jimmy'
|
@@ -113,7 +109,7 @@ describe "model permissions" do
|
|
113
109
|
end
|
114
110
|
|
115
111
|
it 'should not check the read permissions when updating (so that all fields are present for the permissions check)' do
|
116
|
-
model = store._test_update_read_checks!.append(
|
112
|
+
model = store._test_update_read_checks!.append(name: 'Ryan').sync
|
117
113
|
|
118
114
|
expect(model.create_check).to eq(true)
|
119
115
|
expect(model.read_check).to eq(nil)
|
@@ -146,7 +142,7 @@ describe "model permissions" do
|
|
146
142
|
end
|
147
143
|
|
148
144
|
it 'should not check read on delete, so all fields are available to the permissions block' do
|
149
|
-
model = store._test_update_read_checks!.append(
|
145
|
+
model = store._test_update_read_checks!.append(name: 'Ryan').sync
|
150
146
|
|
151
147
|
expect(model.read_check).to eq(nil)
|
152
148
|
|
@@ -155,4 +151,4 @@ describe "model permissions" do
|
|
155
151
|
expect(model.read_check).to eq(nil)
|
156
152
|
end
|
157
153
|
end
|
158
|
-
end
|
154
|
+
end
|
data/spec/models/url_spec.rb
CHANGED
@@ -20,7 +20,7 @@ describe Volt::URL do
|
|
20
20
|
subject { described_class.new fake_router }
|
21
21
|
|
22
22
|
describe '#parse' do
|
23
|
-
let(:fake_router) { double('Router', url_to_params: {foo: 'bar'}) }
|
23
|
+
let(:fake_router) { double('Router', url_to_params: { foo: 'bar' }) }
|
24
24
|
context 'with a valid url' do
|
25
25
|
it 'returns "http" for scheme' do
|
26
26
|
expect(subject.scheme).to eq 'http'
|
data/spec/models/user_spec.rb
CHANGED
@@ -2,9 +2,17 @@ require 'spec_helper'
|
|
2
2
|
require 'volt/models/user'
|
3
3
|
|
4
4
|
class FakeConfig
|
5
|
-
def public
|
6
|
-
|
7
|
-
|
5
|
+
def public
|
6
|
+
self
|
7
|
+
end
|
8
|
+
|
9
|
+
def auth
|
10
|
+
self
|
11
|
+
end
|
12
|
+
|
13
|
+
def use_username
|
14
|
+
true
|
15
|
+
end
|
8
16
|
end
|
9
17
|
|
10
18
|
describe Volt::User do
|
@@ -16,13 +24,13 @@ describe Volt::User do
|
|
16
24
|
allow(Volt).to receive(:config).and_return FakeConfig.new
|
17
25
|
end
|
18
26
|
|
19
|
-
it
|
27
|
+
it 'returns :username' do
|
20
28
|
expect(subject).to eq :username
|
21
29
|
end
|
22
30
|
end
|
23
31
|
|
24
32
|
describe 'when use_username is not set' do
|
25
|
-
it
|
33
|
+
it 'returns :email' do
|
26
34
|
expect(subject).to eq :email
|
27
35
|
end
|
28
36
|
end
|
@@ -36,11 +44,11 @@ describe Volt::User do
|
|
36
44
|
if RUBY_PLATFORM != 'opal'
|
37
45
|
describe 'when it is a Volt server' do
|
38
46
|
before do
|
39
|
-
allow(BCrypt::Password).to receive(:create).with('test')
|
40
|
-
and_return 'hashed-password'
|
47
|
+
allow(BCrypt::Password).to receive(:create).with('test')
|
48
|
+
.and_return 'hashed-password'
|
41
49
|
end
|
42
50
|
|
43
|
-
it
|
51
|
+
it 'encrypts password' do
|
44
52
|
subject
|
45
53
|
|
46
54
|
expect(BCrypt::Password).to have_received :create
|
@@ -49,7 +57,7 @@ describe Volt::User do
|
|
49
57
|
it 'sets _hashed_password to passed value' do
|
50
58
|
subject
|
51
59
|
|
52
|
-
expect(user._hashed_password).to eq
|
60
|
+
expect(user._hashed_password).to eq 'hashed-password'
|
53
61
|
end
|
54
62
|
end
|
55
63
|
end
|
@@ -61,7 +69,6 @@ describe Volt::User do
|
|
61
69
|
|
62
70
|
subject { user.password = 'a valid test password' }
|
63
71
|
|
64
|
-
|
65
72
|
it 'sets _password to passed value' do
|
66
73
|
subject
|
67
74
|
|
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
3
|
describe Volt::UserValidatorHelpers do
|
5
|
-
context
|
4
|
+
context 'with user' do
|
6
5
|
before do
|
7
6
|
allow(Volt).to receive(:current_user_id) { 294 }
|
8
7
|
end
|
@@ -21,4 +20,4 @@ describe Volt::UserValidatorHelpers do
|
|
21
20
|
expect(todo._user_id).to eq(294)
|
22
21
|
end
|
23
22
|
end
|
24
|
-
end
|
23
|
+
end
|
@@ -19,10 +19,9 @@ describe Volt::Model do
|
|
19
19
|
Class.new(Volt::Model) do
|
20
20
|
attr_accessor :ran_promise
|
21
21
|
validate do
|
22
|
-
|
23
22
|
Promise.new.then do
|
24
23
|
self.ran_promise = true
|
25
|
-
{name: 'Invalid'}
|
24
|
+
{ name: 'Invalid' }
|
26
25
|
end
|
27
26
|
end
|
28
27
|
end
|
@@ -54,7 +53,7 @@ describe Volt::Model do
|
|
54
53
|
model = test_model_with_promises.new
|
55
54
|
|
56
55
|
model.validate!.then do |errs|
|
57
|
-
expect(errs).to eq(
|
56
|
+
expect(errs).to eq(name: 'Invalid')
|
58
57
|
expect(model.ran_promise).to eq(true)
|
59
58
|
end
|
60
59
|
end
|
@@ -64,7 +63,7 @@ describe Volt::Model do
|
|
64
63
|
specify do
|
65
64
|
expect { model.mark_field! field }
|
66
65
|
.to change { model.marked_errors }
|
67
|
-
.from({}).to(
|
66
|
+
.from({}).to(field => [message])
|
68
67
|
end
|
69
68
|
end
|
70
69
|
|
@@ -112,7 +111,7 @@ describe Volt::Model do
|
|
112
111
|
Class.new(Volt::Model) do
|
113
112
|
validate :special_field, format: [
|
114
113
|
{ with: /regex/, message: 'regex failed' },
|
115
|
-
{ with: ->(x) {x == false}, message: 'proc failed' }
|
114
|
+
{ with: ->(x) { x == false }, message: 'proc failed' }
|
116
115
|
]
|
117
116
|
end
|
118
117
|
end
|
@@ -121,9 +120,7 @@ describe Volt::Model do
|
|
121
120
|
before { model._special_field = 'nope' }
|
122
121
|
|
123
122
|
it 'returns an array of errors' do
|
124
|
-
expect(model.errors).to eq(
|
125
|
-
special_field: [ regex_message, proc_message ]
|
126
|
-
})
|
123
|
+
expect(model.errors).to eq(special_field: [regex_message, proc_message])
|
127
124
|
end
|
128
125
|
end
|
129
126
|
|
@@ -135,7 +132,7 @@ describe Volt::Model do
|
|
135
132
|
end
|
136
133
|
|
137
134
|
it 'returns an array with a single error' do
|
138
|
-
expect(model.errors.to_h).to eq(
|
135
|
+
expect(model.errors.to_h).to eq(special_field: [proc_message])
|
139
136
|
end
|
140
137
|
end
|
141
138
|
end
|
@@ -167,4 +164,4 @@ describe Volt::Model do
|
|
167
164
|
model._name = 'ok' # fails again
|
168
165
|
expect(model._name).to eq('Jimmy')
|
169
166
|
end
|
170
|
-
end
|
167
|
+
end
|
@@ -41,7 +41,7 @@ describe Volt::Model do
|
|
41
41
|
specify do
|
42
42
|
expect { model.mark_field! field }
|
43
43
|
.to change { model.marked_errors }
|
44
|
-
.from({}).to(
|
44
|
+
.from({}).to(field => [message])
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
@@ -89,7 +89,7 @@ describe Volt::Model do
|
|
89
89
|
Class.new(Volt::Model) do
|
90
90
|
validate :special_field, format: [
|
91
91
|
{ with: /regex/, message: 'regex failed' },
|
92
|
-
{ with: ->(x) {x == false}, message: 'proc failed' }
|
92
|
+
{ with: ->(x) { x == false }, message: 'proc failed' }
|
93
93
|
]
|
94
94
|
end
|
95
95
|
end
|
@@ -98,9 +98,7 @@ describe Volt::Model do
|
|
98
98
|
before { model._special_field = 'nope' }
|
99
99
|
|
100
100
|
it 'returns an array of errors' do
|
101
|
-
expect(model.errors).to eq(
|
102
|
-
special_field: [ regex_message, proc_message ]
|
103
|
-
})
|
101
|
+
expect(model.errors).to eq(special_field: [regex_message, proc_message])
|
104
102
|
end
|
105
103
|
end
|
106
104
|
|
@@ -112,7 +110,7 @@ describe Volt::Model do
|
|
112
110
|
end
|
113
111
|
|
114
112
|
it 'returns an array with a single error' do
|
115
|
-
expect(model.errors.to_h).to eq(
|
113
|
+
expect(model.errors.to_h).to eq(special_field: [proc_message])
|
116
114
|
end
|
117
115
|
end
|
118
116
|
end
|
@@ -144,4 +142,4 @@ describe Volt::Model do
|
|
144
142
|
model._name = 'ok' # fails again
|
145
143
|
expect(model._name).to eq('Jimmy')
|
146
144
|
end
|
147
|
-
end
|
145
|
+
end
|
@@ -1,11 +1,19 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'models/validators/shared_examples_for_validators'
|
3
3
|
|
4
|
+
# test fake used for edge cases where default_options are not Hash types.
|
5
|
+
# Feel free to append stub methods to this class as needed for testing.
|
6
|
+
class SpecValidator < Volt::FormatValidator
|
7
|
+
def default_options
|
8
|
+
"No hash here, no sir!"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
4
12
|
describe Volt::FormatValidator do
|
5
13
|
subject { described_class.new(*init_params) }
|
6
14
|
|
7
|
-
let(:init_params) { [
|
8
|
-
let(:validate_params) { [
|
15
|
+
let(:init_params) { [model, field_name] }
|
16
|
+
let(:validate_params) { [model, field_name, options] }
|
9
17
|
|
10
18
|
let(:model) { Volt::Model.new field: field_content }
|
11
19
|
let(:field_name) { :field }
|
@@ -38,4 +46,14 @@ describe Volt::FormatValidator do
|
|
38
46
|
|
39
47
|
specify { expect(subject).to be_valid }
|
40
48
|
end
|
41
|
-
|
49
|
+
|
50
|
+
context 'when default_options is not a Hash' do
|
51
|
+
it 'returns the options hash instead of default_options' do
|
52
|
+
user = Volt::Model.new(email: "rick@nolematad.io")
|
53
|
+
validator = SpecValidator.new(user, 'email')
|
54
|
+
options = { with: /.+@.+/, message: 'must include an @ symbol' }
|
55
|
+
results = validator.apply(options).errors
|
56
|
+
expect(results.empty?).to be_truthy
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -6,23 +6,21 @@ describe Volt::LengthValidator do
|
|
6
6
|
|
7
7
|
let(:model) { Volt::Model.new name: name }
|
8
8
|
let(:field_name) { :name }
|
9
|
-
let(:name) {
|
9
|
+
let(:name) { 'John Doe' }
|
10
10
|
|
11
11
|
describe '.validate' do
|
12
12
|
describe 'when options is a Fixnum' do
|
13
13
|
let(:options) { 5 }
|
14
14
|
|
15
15
|
describe 'when name is "John Doe"' do
|
16
|
-
let(:name) {
|
16
|
+
let(:name) { 'John Doe' }
|
17
17
|
it { expect(subject).to eq({}) }
|
18
18
|
end
|
19
19
|
|
20
20
|
describe 'when name is "John"' do
|
21
|
-
let(:name) {
|
21
|
+
let(:name) { 'John' }
|
22
22
|
it do
|
23
|
-
expect(subject).to eq(
|
24
|
-
name: ["must be at least 5 characters"]
|
25
|
-
})
|
23
|
+
expect(subject).to eq(name: ['must be at least 5 characters'])
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
@@ -33,36 +31,28 @@ describe Volt::LengthValidator do
|
|
33
31
|
end
|
34
32
|
|
35
33
|
describe 'when name is "John Doe"' do
|
36
|
-
let(:name) {
|
34
|
+
let(:name) { 'John Doe' }
|
37
35
|
it { expect(subject).to eq({}) }
|
38
36
|
end
|
39
37
|
|
40
38
|
describe 'when name is "John"' do
|
41
|
-
let(:name) {
|
39
|
+
let(:name) { 'John' }
|
42
40
|
it do
|
43
41
|
if RUBY_PLATFORM == 'opal'
|
44
|
-
expect(subject).to eq({
|
45
|
-
name: ["must be at least {\"length\"=>5, \"maximum\"=>10} characters"]
|
46
|
-
})
|
42
|
+
expect(subject).to eq(name: ["must be at least {\"length\"=>5, \"maximum\"=>10} characters"])
|
47
43
|
else
|
48
|
-
expect(subject).to eq({
|
49
|
-
name: ["must be at least {:length=>5, :maximum=>10} characters"]
|
50
|
-
})
|
44
|
+
expect(subject).to eq(name: ['must be at least {:length=>5, :maximum=>10} characters'])
|
51
45
|
end
|
52
46
|
end
|
53
47
|
end
|
54
48
|
|
55
49
|
describe 'when name is "Zach Galifianakis"' do
|
56
|
-
let(:name) {
|
50
|
+
let(:name) { 'Zach Galifianakis' }
|
57
51
|
it do
|
58
52
|
if RUBY_PLATFORM == 'opal'
|
59
|
-
expect(subject).to eq({
|
60
|
-
name: ["must be less than {\"length\"=>5, \"maximum\"=>10} characters"]
|
61
|
-
})
|
53
|
+
expect(subject).to eq(name: ["must be less than {\"length\"=>5, \"maximum\"=>10} characters"])
|
62
54
|
else
|
63
|
-
expect(subject).to eq({
|
64
|
-
name: ["must be less than {:length=>5, :maximum=>10} characters"]
|
65
|
-
})
|
55
|
+
expect(subject).to eq(name: ['must be less than {:length=>5, :maximum=>10} characters'])
|
66
56
|
end
|
67
57
|
end
|
68
58
|
end
|
@@ -71,7 +61,7 @@ describe Volt::LengthValidator do
|
|
71
61
|
describe 'when options not a Fixnum or a Hash' do
|
72
62
|
let(:options) { 'string' }
|
73
63
|
|
74
|
-
it
|
64
|
+
it 'raises an exception' do
|
75
65
|
expect { subject }.to raise_error(
|
76
66
|
RuntimeError,
|
77
67
|
'The arguments to length must be a number or a hash'
|