volt 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- 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/lib/volt/utils/timers.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
module Volt
|
2
|
-
|
3
2
|
# The timers class provides useful methods for working in an asynchronus environment.
|
4
3
|
class Timers
|
5
4
|
# next tick (same as setImmediate) calls the block of code after any currently
|
@@ -7,7 +6,7 @@ module Volt
|
|
7
6
|
def self.next_tick(&block)
|
8
7
|
if Volt.in_browser?
|
9
8
|
`setImmediate(function() {`
|
10
|
-
|
9
|
+
yield
|
11
10
|
`})`
|
12
11
|
else
|
13
12
|
tick_timers = (Thread.current['tick_timers'] ||= [])
|
@@ -23,11 +22,8 @@ module Volt
|
|
23
22
|
if tick_timers
|
24
23
|
# clear
|
25
24
|
Thread.current['tick_timers'] = nil
|
26
|
-
tick_timers.each
|
27
|
-
# Run the timer
|
28
|
-
timer.call
|
29
|
-
end
|
25
|
+
tick_timers.each(&:call)
|
30
26
|
end
|
31
27
|
end
|
32
28
|
end
|
33
|
-
end
|
29
|
+
end
|
data/lib/volt/version.rb
CHANGED
data/lib/volt/volt/app.rb
CHANGED
@@ -17,9 +17,7 @@ module Volt
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# Require in app and initializers
|
20
|
-
unless RUBY_PLATFORM == 'opal'
|
21
|
-
Volt.run_app_and_initializers
|
22
|
-
end
|
20
|
+
Volt.run_app_and_initializers unless RUBY_PLATFORM == 'opal'
|
23
21
|
|
24
22
|
# Load component paths
|
25
23
|
@component_paths = ComponentPaths.new(app_path)
|
@@ -45,12 +43,12 @@ module Volt
|
|
45
43
|
@component_paths.app_folders do |app_folder|
|
46
44
|
# Sort so we get consistent load order across platforms
|
47
45
|
Dir["#{app_folder}/*/controllers/server/*.rb"].each do |ruby_file|
|
48
|
-
#path = ruby_file.gsub(/^#{app_folder}\//, '')[0..-4]
|
49
|
-
#require(path)
|
46
|
+
# path = ruby_file.gsub(/^#{app_folder}\//, '')[0..-4]
|
47
|
+
# require(path)
|
50
48
|
require(ruby_file)
|
51
49
|
end
|
52
50
|
end
|
53
51
|
end
|
54
52
|
end
|
55
53
|
end
|
56
|
-
end
|
54
|
+
end
|
data/lib/volt/volt/users.rb
CHANGED
@@ -64,7 +64,7 @@ module Volt
|
|
64
64
|
|
65
65
|
# Put in a deprecation placeholder
|
66
66
|
def user
|
67
|
-
Volt.logger.warn(
|
67
|
+
Volt.logger.warn('deprication: Volt.user has been renamed to Volt.current_user (to be more clear about what it returns). Volt.user will be deprecated in the future.')
|
68
68
|
current_user
|
69
69
|
end
|
70
70
|
|
@@ -80,7 +80,7 @@ module Volt
|
|
80
80
|
|
81
81
|
# Login the user, return a promise for success
|
82
82
|
def login(username, password)
|
83
|
-
UserTasks.login(
|
83
|
+
UserTasks.login(login: username, password: password).then do |result|
|
84
84
|
# Assign the user_id cookie for the user
|
85
85
|
$page.cookies._user_id = result
|
86
86
|
|
@@ -112,9 +112,10 @@ module Volt
|
|
112
112
|
end
|
113
113
|
|
114
114
|
private
|
115
|
+
|
115
116
|
# Returns a query for the current user_id or nil if there is no user_id
|
116
117
|
def user_query
|
117
|
-
user_id =
|
118
|
+
user_id = current_user_id
|
118
119
|
if user_id
|
119
120
|
$page.store._users.where(_id: user_id)
|
120
121
|
else
|
@@ -1,18 +1,18 @@
|
|
1
1
|
module Main
|
2
2
|
class TodosController < Volt::ModelController
|
3
|
-
model :
|
3
|
+
model :store
|
4
4
|
|
5
5
|
def add_todo
|
6
|
-
_todos << { name: _new_todo }
|
7
|
-
|
6
|
+
_todos << { name: page._new_todo }
|
7
|
+
page._new_todo = ''
|
8
8
|
end
|
9
9
|
|
10
10
|
def remove_todo(todo)
|
11
|
-
|
11
|
+
todo.destroy
|
12
12
|
end
|
13
13
|
|
14
14
|
def completed
|
15
15
|
_todos.count(&:_completed)
|
16
16
|
end
|
17
17
|
end
|
18
|
-
end
|
18
|
+
end
|
@@ -93,13 +93,12 @@ describe Volt::Actions do
|
|
93
93
|
|
94
94
|
expect(test_class.ran_one).to eq(true)
|
95
95
|
expect(test_class.ran_two).to eq(true)
|
96
|
-
|
97
96
|
end
|
98
97
|
|
99
98
|
it 'should raise an exception if no symbol or block is provided' do
|
100
99
|
expect do
|
101
100
|
TestActions2.before_action
|
102
|
-
end.to raise_error(RuntimeError,
|
101
|
+
end.to raise_error(RuntimeError, 'No callback symbol or block provided')
|
103
102
|
end
|
104
103
|
|
105
104
|
it 'should support multiple symbols passed an action helper' do
|
@@ -116,15 +115,15 @@ describe Volt::Actions do
|
|
116
115
|
end
|
117
116
|
|
118
117
|
it 'should stop the chain when #stop_chain is called and return false from #run_actions' do
|
119
|
-
|
118
|
+
test_class = TestStopCallbacks.new
|
120
119
|
|
121
|
-
|
122
|
-
|
120
|
+
result = test_class.run_actions(:before, :index)
|
121
|
+
expect(result).to eq(true)
|
123
122
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
123
|
+
expect(test_class.ran_one).to eq(true)
|
124
|
+
expect(test_class.ran_two).to eq(true)
|
125
|
+
expect(test_class.ran_end_of_two).to eq(nil)
|
126
|
+
expect(test_class.ran_three).to eq(nil)
|
128
127
|
end
|
129
128
|
|
130
129
|
it 'should call without any callbacks' do
|
@@ -145,4 +144,4 @@ describe Volt::Actions do
|
|
145
144
|
expect(test_only.ran_one).to eq(true)
|
146
145
|
expect(test_only.ran_two).to eq(true)
|
147
146
|
end
|
148
|
-
end
|
147
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe 'blank' do
|
4
4
|
it 'should report blank when blank' do
|
5
5
|
expect(' '.blank?).to eq(true)
|
6
6
|
end
|
@@ -8,4 +8,4 @@ describe "blank" do
|
|
8
8
|
it 'should report not blank when not blank' do
|
9
9
|
expect(' text '.blank?).to eq(false)
|
10
10
|
end
|
11
|
-
end
|
11
|
+
end
|
@@ -8,17 +8,15 @@ if RUBY_PLATFORM != 'opal'
|
|
8
8
|
let(:logger) { Volt::VoltLogger.new }
|
9
9
|
|
10
10
|
let(:logger_with_opts) do
|
11
|
-
Volt::VoltLogger.new(
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
run_time: run_time
|
16
|
-
})
|
11
|
+
Volt::VoltLogger.new(args: args,
|
12
|
+
class_name: class_name,
|
13
|
+
method_name: method_name,
|
14
|
+
run_time: run_time)
|
17
15
|
end
|
18
16
|
|
19
17
|
it 'should log only severity and message wrapped in line breaks' do
|
20
18
|
expect(STDOUT).to receive(:write).with("\n\n[INFO] message\n")
|
21
|
-
logger.log(Logger::INFO,
|
19
|
+
logger.log(Logger::INFO, 'message')
|
22
20
|
end
|
23
21
|
|
24
22
|
it 'should convert an array of arguments into a string' do
|
@@ -27,7 +25,7 @@ if RUBY_PLATFORM != 'opal'
|
|
27
25
|
|
28
26
|
describe 'when STDOUT is a TTY' do
|
29
27
|
before { allow(STDOUT).to receive(:tty?).and_return(true) }
|
30
|
-
|
28
|
+
|
31
29
|
it 'should return a blue class name' do
|
32
30
|
expect(logger_with_opts.class_name).to eq("\e[1;34m#{class_name}\e[0;37m")
|
33
31
|
end
|
@@ -47,7 +47,7 @@ describe '#camelize' do
|
|
47
47
|
end
|
48
48
|
|
49
49
|
describe '#headerize' do
|
50
|
-
it
|
50
|
+
it 'headerizes' do
|
51
51
|
expect('test_case'.headerize).to eq('Test-Case')
|
52
52
|
end
|
53
53
|
|
@@ -55,5 +55,5 @@ describe '#headerize' do
|
|
55
55
|
it 'underscores' do
|
56
56
|
expect(underscored.headerize).to eq(headerized)
|
57
57
|
end
|
58
|
-
end
|
59
|
-
end
|
58
|
+
end
|
59
|
+
end
|
@@ -32,9 +32,7 @@ describe 'bindings test', type: :feature, sauce: true do
|
|
32
32
|
|
33
33
|
# phantom does not support the html5 history api
|
34
34
|
# TODO: We could probably polyfill this in phantom
|
35
|
-
if ENV['BROWSER'] != 'phantom'
|
36
|
-
expect(current_path).to eq('/bindings')
|
37
|
-
end
|
35
|
+
expect(current_path).to eq('/bindings') if ENV['BROWSER'] != 'phantom'
|
38
36
|
|
39
37
|
# Fill in one field and see if it updates the rest
|
40
38
|
fill_in('paramsName1', with: 'Params bindings')
|
@@ -59,9 +57,7 @@ describe 'bindings test', type: :feature, sauce: true do
|
|
59
57
|
|
60
58
|
# phantom does not support the html5 history api
|
61
59
|
# TODO: We could probably polyfill this in phantom
|
62
|
-
if ENV['BROWSER'] != 'phantom'
|
63
|
-
expect(current_path).to eq('/bindings')
|
64
|
-
end
|
60
|
+
expect(current_path).to eq('/bindings') if ENV['BROWSER'] != 'phantom'
|
65
61
|
|
66
62
|
# Fill in one field and see if it updates the rest
|
67
63
|
fill_in('routesName1', with: 'Routes bindings')
|
@@ -166,9 +162,7 @@ describe 'bindings test', type: :feature, sauce: true do
|
|
166
162
|
|
167
163
|
click_link 'Bindings'
|
168
164
|
|
169
|
-
if ENV['BROWSER'] != 'phantom'
|
170
|
-
expect(current_path).to eq('/bindings')
|
171
|
-
end
|
165
|
+
expect(current_path).to eq('/bindings') if ENV['BROWSER'] != 'phantom'
|
172
166
|
|
173
167
|
expect(find('#paramsCheck3')).to have_content('')
|
174
168
|
# Fill in one field and see if it updates the rest
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe 'HTML safe/raw', type: :feature do
|
4
4
|
it 'should render html with the raw helper' do
|
5
5
|
visit '/html_safe'
|
6
6
|
|
7
7
|
expect(page).to have_selector('button[id="examplebutton"]')
|
8
8
|
end
|
9
|
-
end
|
9
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'todos app', type: :feature, sauce: true do
|
4
|
+
it 'should add a todo and remove it' do
|
5
|
+
visit '/todos'
|
6
|
+
|
7
|
+
fill_in 'newtodo', :with => 'Todo 1'
|
8
|
+
find('#newtodo').native.send_keys(:return)
|
9
|
+
|
10
|
+
expect(page).to have_content('Todo 1')
|
11
|
+
|
12
|
+
expect(find('#newtodo').value).to eq('')
|
13
|
+
|
14
|
+
click_button 'X'
|
15
|
+
|
16
|
+
expect(page).to_not have_content('Todo 1')
|
17
|
+
|
18
|
+
# Make sure it deleted
|
19
|
+
page.driver.browser.navigate.refresh
|
20
|
+
expect(page).to_not have_content('Todo 1')
|
21
|
+
end
|
22
|
+
end
|
@@ -6,8 +6,8 @@ describe 'yield binding', type: :feature, sauce: true do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
it 'should render the yielded content multiple times' do
|
9
|
-
expect(page).to have_content(
|
10
|
-
expect(page).to have_content(
|
9
|
+
expect(page).to have_content('My yielded content 1')
|
10
|
+
expect(page).to have_content('My yielded content 2')
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'should render the content from the tag\'s controller when yielding' do
|
@@ -11,10 +11,10 @@ end
|
|
11
11
|
describe Volt::Associations do
|
12
12
|
if RUBY_PLATFORM != 'opal'
|
13
13
|
before do
|
14
|
-
store._people! << {name: 'Jimmy'}
|
14
|
+
store._people! << { name: 'Jimmy' }
|
15
15
|
@person = store._people[0]
|
16
|
-
@person._addresses! << {city: 'Bozeman'}
|
17
|
-
@person._addresses << {city: 'Portland'}
|
16
|
+
@person._addresses! << { city: 'Bozeman' }
|
17
|
+
@person._addresses << { city: 'Portland' }
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'should associate via belongs_to' do
|
@@ -31,4 +31,4 @@ describe Volt::Associations do
|
|
31
31
|
expect(addresses[0]._city).to eq('Bozeman')
|
32
32
|
end
|
33
33
|
end
|
34
|
-
end
|
34
|
+
end
|
data/spec/models/buffer_spec.rb
CHANGED
@@ -37,7 +37,7 @@ describe Volt::Buffer do
|
|
37
37
|
expect(then_count).to eq(0)
|
38
38
|
expect(fail_count).to eq(1)
|
39
39
|
expect(error.class).to eq(Volt::Errors)
|
40
|
-
expect(error).to eq(
|
40
|
+
expect(error).to eq(name: ['must be at least 5 characters'])
|
41
41
|
end
|
42
42
|
end
|
43
|
-
end
|
43
|
+
end
|
data/spec/models/dirty_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe 'Volt::Dirty' do
|
4
4
|
let(:model) do
|
5
5
|
model = Volt::Model.new
|
6
6
|
|
@@ -30,7 +30,7 @@ describe "Volt::Dirty" do
|
|
30
30
|
expect(model.name_was).to eq(nil)
|
31
31
|
expect(model.name_changes).to eq([nil, 'Bob', 'Jimmy', 'Martin', nil])
|
32
32
|
|
33
|
-
expect(model.changed_attributes).to eq(
|
33
|
+
expect(model.changed_attributes).to eq(name: [nil, 'Bob', 'Jimmy', 'Martin', nil])
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'should say models are changed' do
|
@@ -46,9 +46,8 @@ describe "Volt::Dirty" do
|
|
46
46
|
expect(model.changed?(:name)).to eq(false)
|
47
47
|
|
48
48
|
expect(model.changed?).to eq(false)
|
49
|
-
model._some_other_attr =
|
49
|
+
model._some_other_attr = 'Wow!'
|
50
50
|
expect(model.changed?).to eq(true)
|
51
|
-
|
52
51
|
end
|
53
52
|
|
54
53
|
it 'should reset changes' do
|
@@ -81,26 +80,26 @@ describe "Volt::Dirty" do
|
|
81
80
|
|
82
81
|
it 'should revert changes' do
|
83
82
|
expect(model.attributes).to eq({})
|
84
|
-
model.attributes = {first: 'Bob', last: 'Smith'}
|
85
|
-
expect(model.attributes).to eq(
|
83
|
+
model.attributes = { first: 'Bob', last: 'Smith' }
|
84
|
+
expect(model.attributes).to eq(first: 'Bob', last: 'Smith')
|
86
85
|
|
87
86
|
model.revert_changes!
|
88
|
-
expect(model.attributes).to eq(
|
87
|
+
expect(model.attributes).to eq(first: nil, last: nil)
|
89
88
|
end
|
90
89
|
|
91
90
|
it 'should revert changes after a clear_tracked_changed!' do
|
92
91
|
expect(model.attributes).to eq({})
|
93
|
-
model.attributes = {first: 'Bob', last: 'Smith'}
|
94
|
-
expect(model.attributes).to eq(
|
92
|
+
model.attributes = { first: 'Bob', last: 'Smith' }
|
93
|
+
expect(model.attributes).to eq(first: 'Bob', last: 'Smith')
|
95
94
|
|
96
95
|
model.clear_tracked_changes!
|
97
96
|
expect(model.changed_attributes).to eq({})
|
98
97
|
|
99
98
|
model._first = 'Jimmy'
|
100
99
|
model._last = 'Dean'
|
101
|
-
expect(model.attributes).to eq(
|
100
|
+
expect(model.attributes).to eq(first: 'Jimmy', last: 'Dean')
|
102
101
|
|
103
102
|
model.revert_changes!
|
104
|
-
expect(model.attributes).to eq(
|
103
|
+
expect(model.attributes).to eq(first: 'Bob', last: 'Smith')
|
105
104
|
end
|
106
105
|
end
|