iknow_view_models 3.2.0 → 3.2.1

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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +13 -0
  3. data/Appraisals +6 -6
  4. data/Rakefile +5 -5
  5. data/gemfiles/rails_5_2.gemfile +5 -5
  6. data/gemfiles/rails_6_0.gemfile +5 -5
  7. data/iknow_view_models.gemspec +40 -39
  8. data/lib/iknow_view_models.rb +9 -7
  9. data/lib/iknow_view_models/version.rb +1 -1
  10. data/lib/view_model.rb +17 -14
  11. data/lib/view_model/access_control.rb +5 -2
  12. data/lib/view_model/access_control/composed.rb +10 -9
  13. data/lib/view_model/access_control/open.rb +2 -0
  14. data/lib/view_model/access_control/read_only.rb +2 -0
  15. data/lib/view_model/access_control/tree.rb +11 -6
  16. data/lib/view_model/access_control_error.rb +4 -1
  17. data/lib/view_model/active_record.rb +12 -11
  18. data/lib/view_model/active_record/association_data.rb +2 -1
  19. data/lib/view_model/active_record/association_manipulation.rb +6 -4
  20. data/lib/view_model/active_record/cache.rb +4 -2
  21. data/lib/view_model/active_record/collection_nested_controller.rb +3 -3
  22. data/lib/view_model/active_record/controller_base.rb +4 -1
  23. data/lib/view_model/active_record/nested_controller_base.rb +1 -0
  24. data/lib/view_model/active_record/update_context.rb +8 -6
  25. data/lib/view_model/active_record/update_data.rb +32 -30
  26. data/lib/view_model/active_record/update_operation.rb +17 -13
  27. data/lib/view_model/active_record/visitor.rb +0 -1
  28. data/lib/view_model/after_transaction_runner.rb +0 -1
  29. data/lib/view_model/callbacks.rb +3 -1
  30. data/lib/view_model/controller.rb +13 -3
  31. data/lib/view_model/deserialization_error.rb +15 -12
  32. data/lib/view_model/error.rb +12 -10
  33. data/lib/view_model/error_view.rb +3 -1
  34. data/lib/view_model/migration/no_path_error.rb +1 -0
  35. data/lib/view_model/migration/one_way_error.rb +1 -0
  36. data/lib/view_model/migration/unspecified_version_error.rb +1 -0
  37. data/lib/view_model/record.rb +11 -13
  38. data/lib/view_model/reference.rb +3 -1
  39. data/lib/view_model/references.rb +8 -5
  40. data/lib/view_model/registry.rb +1 -1
  41. data/lib/view_model/schemas.rb +9 -4
  42. data/lib/view_model/serialization_error.rb +4 -1
  43. data/lib/view_model/serialize_context.rb +4 -4
  44. data/lib/view_model/test_helpers.rb +8 -3
  45. data/lib/view_model/test_helpers/arvm_builder.rb +19 -14
  46. data/lib/view_model/traversal_context.rb +2 -1
  47. data/test/.rubocop.yml +14 -0
  48. data/test/helpers/arvm_test_models.rb +12 -9
  49. data/test/helpers/arvm_test_utilities.rb +5 -3
  50. data/test/helpers/controller_test_helpers.rb +31 -29
  51. data/test/helpers/match_enumerator.rb +1 -0
  52. data/test/helpers/query_logging.rb +2 -1
  53. data/test/helpers/test_access_control.rb +5 -3
  54. data/test/helpers/viewmodel_spec_helpers.rb +21 -20
  55. data/test/unit/view_model/access_control_test.rb +144 -144
  56. data/test/unit/view_model/active_record/alias_test.rb +15 -13
  57. data/test/unit/view_model/active_record/belongs_to_test.rb +40 -39
  58. data/test/unit/view_model/active_record/cache_test.rb +27 -26
  59. data/test/unit/view_model/active_record/cloner_test.rb +67 -63
  60. data/test/unit/view_model/active_record/controller_test.rb +37 -38
  61. data/test/unit/view_model/active_record/counter_test.rb +10 -9
  62. data/test/unit/view_model/active_record/customization_test.rb +59 -58
  63. data/test/unit/view_model/active_record/has_many_test.rb +112 -111
  64. data/test/unit/view_model/active_record/has_many_through_poly_test.rb +15 -14
  65. data/test/unit/view_model/active_record/has_many_through_test.rb +33 -38
  66. data/test/unit/view_model/active_record/has_one_test.rb +37 -36
  67. data/test/unit/view_model/active_record/migration_test.rb +13 -13
  68. data/test/unit/view_model/active_record/namespacing_test.rb +19 -17
  69. data/test/unit/view_model/active_record/poly_test.rb +44 -45
  70. data/test/unit/view_model/active_record/shared_test.rb +30 -28
  71. data/test/unit/view_model/active_record/version_test.rb +9 -7
  72. data/test/unit/view_model/active_record_test.rb +72 -72
  73. data/test/unit/view_model/callbacks_test.rb +19 -15
  74. data/test/unit/view_model/controller_test.rb +4 -2
  75. data/test/unit/view_model/record_test.rb +92 -97
  76. data/test/unit/view_model/traversal_context_test.rb +4 -5
  77. data/test/unit/view_model_test.rb +18 -16
  78. metadata +7 -5
@@ -1,10 +1,12 @@
1
- require_relative "../../../helpers/arvm_test_utilities.rb"
2
- require_relative "../../../helpers/arvm_test_models.rb"
3
- require_relative "../../../helpers/viewmodel_spec_helpers.rb"
1
+ # frozen_string_literal: true
4
2
 
5
- require "minitest/autorun"
3
+ require_relative '../../../helpers/arvm_test_utilities'
4
+ require_relative '../../../helpers/arvm_test_models'
5
+ require_relative '../../../helpers/viewmodel_spec_helpers'
6
6
 
7
- require "view_model/active_record"
7
+ require 'minitest/autorun'
8
+
9
+ require 'view_model/active_record'
8
10
 
9
11
  class ViewModel::ActiveRecord::Alias < ActiveSupport::TestCase
10
12
  include ARVMTestUtilities
@@ -14,18 +16,18 @@ class ViewModel::ActiveRecord::Alias < ActiveSupport::TestCase
14
16
 
15
17
  def child_attributes
16
18
  super.merge(
17
- viewmodel: ->(v) do
18
- add_view_alias "ChildA"
19
- add_view_alias "ChildB"
20
- end
19
+ viewmodel: ->(_v) do
20
+ add_view_alias 'ChildA'
21
+ add_view_alias 'ChildB'
22
+ end,
21
23
  )
22
24
  end
23
25
 
24
- it "permits association types to be aliased" do
25
- %w(Child ChildA ChildB).each do |view_alias|
26
+ it 'permits association types to be aliased' do
27
+ %w[Child ChildA ChildB].each do |view_alias|
26
28
  view = {
27
- "_type" => viewmodel_class.view_name,
28
- "child" => { "_type" => view_alias },
29
+ '_type' => viewmodel_class.view_name,
30
+ 'child' => { '_type' => view_alias },
29
31
  }
30
32
 
31
33
  parent = viewmodel_class.deserialize_from_view(view).model
@@ -1,10 +1,12 @@
1
- require_relative "../../../helpers/arvm_test_utilities.rb"
2
- require_relative "../../../helpers/arvm_test_models.rb"
3
- require_relative '../../../helpers/viewmodel_spec_helpers.rb'
1
+ # frozen_string_literal: true
4
2
 
5
- require "minitest/autorun"
3
+ require_relative '../../../helpers/arvm_test_utilities'
4
+ require_relative '../../../helpers/arvm_test_models'
5
+ require_relative '../../../helpers/viewmodel_spec_helpers'
6
6
 
7
- require "view_model/active_record"
7
+ require 'minitest/autorun'
8
+
9
+ require 'view_model/active_record'
8
10
 
9
11
  class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
10
12
  include ARVMTestUtilities
@@ -14,13 +16,13 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
14
16
  def setup
15
17
  super
16
18
 
17
- # TODO make a `has_list?` that allows a parent to set all children as an array
18
- @model1 = model_class.new(name: "p1",
19
- child: child_model_class.new(name: "p1l"))
19
+ # TODO: make a `has_list?` that allows a parent to set all children as an array
20
+ @model1 = model_class.new(name: 'p1',
21
+ child: child_model_class.new(name: 'p1l'))
20
22
  @model1.save!
21
23
 
22
- @model2 = model_class.new(name: "p2",
23
- child: child_model_class.new(name: "p2l"))
24
+ @model2 = model_class.new(name: 'p2',
25
+ child: child_model_class.new(name: 'p2l'))
24
26
 
25
27
  @model2.save!
26
28
 
@@ -30,14 +32,14 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
30
32
  def test_serialize_view
31
33
  view, _refs = serialize_with_references(ModelView.new(@model1))
32
34
 
33
- assert_equal({ "_type" => "Model",
34
- "_version" => 1,
35
- "id" => @model1.id,
36
- "name" => @model1.name,
37
- "child" => { "_type" => "Child",
38
- "_version" => 1,
39
- "id" => @model1.child.id,
40
- "name" => @model1.child.name },
35
+ assert_equal({ '_type' => 'Model',
36
+ '_version' => 1,
37
+ 'id' => @model1.id,
38
+ 'name' => @model1.name,
39
+ 'child' => { '_type' => 'Child',
40
+ '_version' => 1,
41
+ 'id' => @model1.child.id,
42
+ 'name' => @model1.child.name },
41
43
  },
42
44
  view)
43
45
  end
@@ -53,9 +55,9 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
53
55
 
54
56
  def test_create_from_view
55
57
  view = {
56
- "_type" => "Model",
57
- "name" => "p",
58
- "child" => { "_type" => "Child", "name" => "l" },
58
+ '_type' => 'Model',
59
+ 'name' => 'p',
60
+ 'child' => { '_type' => 'Child', 'name' => 'l' },
59
61
  }
60
62
 
61
63
  pv = ModelView.deserialize_from_view(view)
@@ -64,10 +66,10 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
64
66
  assert(!p.changed?)
65
67
  assert(!p.new_record?)
66
68
 
67
- assert_equal("p", p.name)
69
+ assert_equal('p', p.name)
68
70
 
69
71
  assert(p.child.present?)
70
- assert_equal("l", p.child.name)
72
+ assert_equal('l', p.child.name)
71
73
  end
72
74
 
73
75
  def test_create_belongs_to_nil
@@ -86,7 +88,7 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
86
88
  def test_belongs_to_create
87
89
  @model1.update(child: nil)
88
90
 
89
- alter_by_view!(ModelView, @model1) do |view, refs|
91
+ alter_by_view!(ModelView, @model1) do |view, _refs|
90
92
  view['child'] = { '_type' => 'Child', 'name' => 'cheese' }
91
93
  end
92
94
 
@@ -96,7 +98,7 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
96
98
  def test_belongs_to_replace
97
99
  old_child = @model1.child
98
100
 
99
- alter_by_view!(ModelView, @model1) do |view, refs|
101
+ alter_by_view!(ModelView, @model1) do |view, _refs|
100
102
  view['child'] = { '_type' => 'Child', 'name' => 'cheese' }
101
103
  end
102
104
 
@@ -108,7 +110,7 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
108
110
  old_p1_child = @model1.child
109
111
  old_p2_child = @model2.child
110
112
 
111
- set_by_view!(ModelView, [@model1, @model2]) do |(p1, p2), refs|
113
+ set_by_view!(ModelView, [@model1, @model2]) do |(p1, p2), _refs|
112
114
  p1['child'] = nil
113
115
  p2['child'] = update_hash_for(ChildView, old_p1_child)
114
116
  end
@@ -122,7 +124,7 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
122
124
  old_p1_child = @model1.child
123
125
  old_p2_child = @model2.child
124
126
 
125
- alter_by_view!(ModelView, [@model1, @model2]) do |(p1, p2), refs|
127
+ alter_by_view!(ModelView, [@model1, @model2]) do |(p1, p2), _refs|
126
128
  p1['child'] = update_hash_for(ChildView, old_p2_child)
127
129
  p2['child'] = update_hash_for(ChildView, old_p1_child)
128
130
  end
@@ -136,22 +138,22 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
136
138
  d_context = ModelView.new_deserialize_context
137
139
 
138
140
  target_child = Child.create
139
- from_model = Model.create(name: 'from', child: target_child)
140
- to_model = Model.create(name: 'p3')
141
+ from_model = Model.create(name: 'from', child: target_child)
142
+ to_model = Model.create(name: 'p3')
141
143
 
142
144
  alter_by_view!(
143
145
  ModelView, [from_model, to_model],
144
146
  deserialize_context: d_context
145
- ) do |(from, to), refs|
147
+ ) do |(from, to), _refs|
146
148
  from['child'] = nil
147
149
  to['child'] = update_hash_for(ChildView, target_child)
148
150
  end
149
151
 
150
152
  assert_equal(target_child, to_model.child, 'target child moved')
151
153
  assert_equal([ViewModel::Reference.new(ModelView, from_model.id),
152
- ViewModel::Reference.new(ModelView, to_model.id)],
154
+ ViewModel::Reference.new(ModelView, to_model.id),],
153
155
  d_context.valid_edit_refs,
154
- "only models are checked for change; child was not")
156
+ 'only models are checked for change; child was not')
155
157
  end
156
158
 
157
159
  def test_implicit_release_invalid_belongs_to
@@ -174,11 +176,11 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
174
176
  t.integer :deleted_child_id
175
177
  t.integer :ignored_child_id
176
178
  end,
177
- model: ->(m) do
179
+ model: ->(_m) do
178
180
  belongs_to :deleted_child, class_name: Child.name, dependent: :delete
179
181
  belongs_to :ignored_child, class_name: Child.name
180
182
  end,
181
- viewmodel: ->(v) do
183
+ viewmodel: ->(_v) do
182
184
  associations :deleted_child, :ignored_child
183
185
  end)
184
186
  end
@@ -198,7 +200,7 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
198
200
  end
199
201
 
200
202
  def test_no_gc_dependent_ignore
201
- model = model_class.create(ignored_child: Child.new(name: "one"))
203
+ model = model_class.create(ignored_child: Child.new(name: 'one'))
202
204
  old_child = model.ignored_child
203
205
 
204
206
  alter_by_view!(ModelView, model) do |ov, _refs|
@@ -232,7 +234,7 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
232
234
  end
233
235
 
234
236
  def test_renamed_roundtrip
235
- alter_by_view!(ModelView, @model) do |view, refs|
237
+ alter_by_view!(ModelView, @model) do |view, _refs|
236
238
  assert_equal({ 'id' => @model.child.id,
237
239
  '_type' => 'Child',
238
240
  '_version' => 1,
@@ -284,7 +286,6 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
284
286
  end
285
287
  end
286
288
 
287
-
288
289
  # Do we support replacing a node in the tree and remodeling its children
289
290
  # back to it? In theory we want to, but currently we don't: the child node
290
291
  # is unresolvable.
@@ -299,8 +300,8 @@ class ViewModel::ActiveRecord::BelongsToTest < ActiveSupport::TestCase
299
300
  def test_move
300
301
  model = Aye.create(bee: Bee.new(cee: Cee.new))
301
302
  assert_raises(ViewModel::DeserializationError::ParentNotFound) do
302
- alter_by_view!(AyeView, model) do |view, refs|
303
- view['bee'].delete("id")
303
+ alter_by_view!(AyeView, model) do |view, _refs|
304
+ view['bee'].delete('id')
304
305
  end
305
306
  end
306
307
  end
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "minitest/autorun"
4
- require "minitest/unit"
5
- require "minitest/hooks"
3
+ require 'minitest/autorun'
4
+ require 'minitest/unit'
5
+ require 'minitest/hooks'
6
6
 
7
- require_relative "../../../helpers/arvm_test_models.rb"
8
- require_relative "../../../helpers/arvm_test_utilities.rb"
9
- require_relative "../../../helpers/viewmodel_spec_helpers.rb"
7
+ require_relative '../../../helpers/arvm_test_models'
8
+ require_relative '../../../helpers/arvm_test_utilities'
9
+ require_relative '../../../helpers/viewmodel_spec_helpers'
10
10
 
11
- require "view_model"
12
- require "view_model/active_record"
11
+ require 'view_model'
12
+ require 'view_model/active_record'
13
13
 
14
14
  # IknowCache uses Rails.cache: create a dummy cache.
15
15
 
@@ -91,8 +91,8 @@ class ViewModel::ActiveRecord
91
91
  end
92
92
 
93
93
  included do
94
- let(:shared) { shared_model_class.create!(name: "shared1") }
95
- let(:root) { model_class.create!(name: "root1", child: Child.new(name: "owned1"), shared: shared) }
94
+ let(:shared) { shared_model_class.create!(name: 'shared1') }
95
+ let(:root) { model_class.create!(name: 'root1', child: Child.new(name: 'owned1'), shared: shared) }
96
96
  let(:root_view) { viewmodel_class.new(root) }
97
97
  end
98
98
  end
@@ -183,13 +183,14 @@ class ViewModel::ActiveRecord
183
183
 
184
184
  # The cached reference must correspond to the returned data.
185
185
  parsed_data = JSON.parse(ref_data)
186
- value(parsed_data["id"]).must_equal(id)
187
- value(parsed_data["_type"]).must_equal(view_name)
186
+ value(parsed_data['id']).must_equal(id)
187
+ value(parsed_data['_type']).must_equal(view_name)
188
188
 
189
189
  # When the cached reference is to independently cached data
190
190
  # (SharedView in this test), make sure that data is correctly
191
191
  # cached.
192
- next unless view_name == "Shared"
192
+ next unless view_name == 'Shared'
193
+
193
194
  value(id).must_equal(shared.id)
194
195
  cached_shared = read_cache(shared_viewmodel_class, id)
195
196
  value(cached_shared).must_be(:present?)
@@ -224,8 +225,8 @@ class ViewModel::ActiveRecord
224
225
  end
225
226
 
226
227
  def change_in_database
227
- root.update_attribute(:name, "CHANGEDROOT")
228
- shared.update_attribute(:name, "CHANGEDSHARED")
228
+ root.update_attribute(:name, 'CHANGEDROOT')
229
+ shared.update_attribute(:name, 'CHANGEDSHARED')
229
230
  end
230
231
 
231
232
  it 'resolves from the cache' do
@@ -243,7 +244,7 @@ class ViewModel::ActiveRecord
243
244
  viewmodel_class.viewmodel_cache.clear
244
245
 
245
246
  cache_data, cache_refs = serialize_with_cache
246
- value(cache_data[0]["name"]).must_equal("CHANGEDROOT") # Root view invalidated
247
+ value(cache_data[0]['name']).must_equal('CHANGEDROOT') # Root view invalidated
247
248
  value(cache_refs).must_equal(before_refs) # Shared view not invalidated
248
249
  end
249
250
 
@@ -301,7 +302,7 @@ class ViewModel::ActiveRecord
301
302
  viewmodel_class.viewmodel_cache.delete(root.id)
302
303
 
303
304
  cache_data, cache_refs = serialize_with_cache
304
- value(cache_data[0]["name"]).must_equal("CHANGEDROOT")
305
+ value(cache_data[0]['name']).must_equal('CHANGEDROOT')
305
306
  value(cache_refs).must_equal(before_refs)
306
307
  end
307
308
 
@@ -311,8 +312,8 @@ class ViewModel::ActiveRecord
311
312
 
312
313
  # Shared view invalidated, but root view not
313
314
  cache_data, cache_hrefs = serialize_with_cache
314
- value(cache_data[0]["name"]).must_equal("root1")
315
- value(cache_hrefs.values[0]["name"]).must_equal("CHANGEDSHARED")
315
+ value(cache_data[0]['name']).must_equal('root1')
316
+ value(cache_hrefs.values[0]['name']).must_equal('CHANGEDSHARED')
316
317
  end
317
318
 
318
319
  it 'can clear a cache via its external cache group' do
@@ -321,12 +322,12 @@ class ViewModel::ActiveRecord
321
322
 
322
323
  # Shared view invalidated, but root view not
323
324
  cache_data, cache_hrefs = serialize_with_cache
324
- value(cache_data[0]["name"]).must_equal("root1")
325
- value(cache_hrefs.values[0]["name"]).must_equal("CHANGEDSHARED")
325
+ value(cache_data[0]['name']).must_equal('root1')
326
+ value(cache_hrefs.values[0]['name']).must_equal('CHANGEDSHARED')
326
327
  end
327
328
 
328
329
  describe 'and a record not in the cache' do
329
- let(:root2) { model_class.create!(name: "root2", child: Child.new(name: "owned2"), shared: shared) }
330
+ let(:root2) { model_class.create!(name: 'root2', child: Child.new(name: 'owned2'), shared: shared) }
330
331
 
331
332
  def serialize_from_database
332
333
  views = model_class.find(root.id, root2.id).map { |r| viewmodel_class.new(r) }
@@ -354,21 +355,21 @@ class ViewModel::ActiveRecord
354
355
  change_in_database
355
356
 
356
357
  cache_data, cache_refs = serialize_with_cache
357
- value(cache_data[0]["name"]).must_equal("root1")
358
- value(cache_data[1]["name"]).must_equal("root2")
358
+ value(cache_data[0]['name']).must_equal('root1')
359
+ value(cache_data[1]['name']).must_equal('root2')
359
360
  value(cache_refs).must_equal(refs)
360
361
  end
361
362
  end
362
363
  end
363
364
  end
364
365
 
365
- describe "with a non-cacheable shared child" do
366
+ describe 'with a non-cacheable shared child' do
366
367
  include ViewModelSpecHelpers::ParentAndSharedBelongsToChild
367
368
  def model_attributes
368
369
  super.merge(viewmodel: ->(_) { cacheable! })
369
370
  end
370
371
 
371
- let(:root) { model_class.create!(name: "root1", child: Child.new(name: "owned1")) }
372
+ let(:root) { model_class.create!(name: 'root1', child: Child.new(name: 'owned1')) }
372
373
  let(:root_view) { viewmodel_class.new(root) }
373
374
 
374
375
  include BehavesLikeACache
@@ -1,14 +1,16 @@
1
- require "minitest/autorun"
2
- require "minitest/unit"
3
- require "minitest/hooks"
1
+ # frozen_string_literal: true
4
2
 
5
- require_relative "../../../helpers/arvm_test_models.rb"
6
- require_relative "../../../helpers/viewmodel_spec_helpers.rb"
3
+ require 'minitest/autorun'
4
+ require 'minitest/unit'
5
+ require 'minitest/hooks'
6
+
7
+ require_relative '../../../helpers/arvm_test_models'
8
+ require_relative '../../../helpers/viewmodel_spec_helpers'
7
9
 
8
10
  # MiniTest::Spec.register_spec_type(/./, Minitest::HooksSpec)
9
11
 
10
- require "view_model"
11
- require "view_model/active_record"
12
+ require 'view_model'
13
+ require 'view_model/active_record'
12
14
 
13
15
  class ViewModel::ActiveRecord
14
16
  class ClonerTest < ActiveSupport::TestCase
@@ -18,7 +20,7 @@ class ViewModel::ActiveRecord
18
20
  let(:viewmodel) { create_viewmodel! }
19
21
  let(:model) { viewmodel.model }
20
22
 
21
- describe "with single model" do
23
+ describe 'with single model' do
22
24
  include ViewModelSpecHelpers::Single
23
25
 
24
26
  def model_attributes
@@ -26,15 +28,15 @@ class ViewModel::ActiveRecord
26
28
  end
27
29
 
28
30
  def new_model
29
- model_class.new(name: "a", nonview: "b")
31
+ model_class.new(name: 'a', nonview: 'b')
30
32
  end
31
33
 
32
- it "persists the test setup" do
34
+ it 'persists the test setup' do
33
35
  assert(viewmodel.model.persisted?)
34
36
  refute(viewmodel.model.new_record?)
35
37
  end
36
38
 
37
- it "can clone the model" do
39
+ it 'can clone the model' do
38
40
  clone_model = Cloner.new.clone(viewmodel)
39
41
  assert(clone_model.new_record?)
40
42
  assert_nil(clone_model.id)
@@ -45,75 +47,75 @@ class ViewModel::ActiveRecord
45
47
  end
46
48
 
47
49
  class IgnoreParentCloner < Cloner
48
- def visit_model_view(node, model)
50
+ def visit_model_view(_node, _model)
49
51
  ignore!
50
52
  end
51
53
  end
52
54
 
53
- it "can ignore a model" do
55
+ it 'can ignore a model' do
54
56
  clone_model = IgnoreParentCloner.new.clone(viewmodel)
55
57
  assert_nil(clone_model)
56
58
  end
57
59
 
58
60
  class IgnoreAllCloner < Cloner
59
- def pre_visit(node, model)
61
+ def pre_visit(_node, _model)
60
62
  ignore!
61
63
  end
62
64
  end
63
65
 
64
- it "can ignore a model in pre-visit" do
66
+ it 'can ignore a model in pre-visit' do
65
67
  clone_model = IgnoreAllCloner.new.clone(viewmodel)
66
68
  assert_nil(clone_model)
67
69
  end
68
70
 
69
71
  class AlterAttributeCloner < Cloner
70
- def visit_model_view(node, model)
71
- model.name = "changed"
72
+ def visit_model_view(_node, model)
73
+ model.name = 'changed'
72
74
  end
73
75
  end
74
76
 
75
- it "can alter a model attribute" do
77
+ it 'can alter a model attribute' do
76
78
  clone_model = AlterAttributeCloner.new.clone(viewmodel)
77
79
  assert(clone_model.new_record?)
78
80
  assert_nil(clone_model.id)
79
- assert_equal("changed", clone_model.name)
80
- refute_equal("changed", model.name)
81
+ assert_equal('changed', clone_model.name)
82
+ refute_equal('changed', model.name)
81
83
  assert_equal(model.nonview, clone_model.nonview)
82
84
  clone_model.save!
83
85
  refute_equal(model, clone_model)
84
86
  end
85
87
 
86
88
  class PostAlterAttributeCloner < Cloner
87
- def end_visit_model_view(node, model)
88
- model.name = "changed"
89
+ def end_visit_model_view(_node, model)
90
+ model.name = 'changed'
89
91
  end
90
92
  end
91
93
 
92
- it "can alter a model attribute post-visit" do
94
+ it 'can alter a model attribute post-visit' do
93
95
  clone_model = PostAlterAttributeCloner.new.clone(viewmodel)
94
96
  assert(clone_model.new_record?)
95
97
  assert_nil(clone_model.id)
96
- assert_equal("changed", clone_model.name)
97
- refute_equal("changed", model.name)
98
+ assert_equal('changed', clone_model.name)
99
+ refute_equal('changed', model.name)
98
100
  assert_equal(model.nonview, clone_model.nonview)
99
101
  clone_model.save!
100
102
  refute_equal(model, clone_model)
101
103
  end
102
104
  end
103
105
 
104
- describe "with a child" do
106
+ describe 'with a child' do
105
107
  def new_child_model
106
- child_model_class.new(name: "b")
108
+ child_model_class.new(name: 'b')
107
109
  end
108
110
 
109
111
  def new_model
110
- model_class.new(name: "a", child: new_child_model)
112
+ model_class.new(name: 'a', child: new_child_model)
111
113
  end
112
114
 
113
115
  module BehavesLikeConstructingAChild
114
116
  extend ActiveSupport::Concern
115
117
  included do
116
- it "persists the test setup" do
118
+ it 'persists the test setup' do
117
119
  assert(viewmodel.model.persisted?)
118
120
  refute(viewmodel.model.new_record?)
119
121
  assert(viewmodel.model.child.persisted?)
@@ -123,7 +125,7 @@ class ViewModel::ActiveRecord
123
125
  end
124
126
 
125
127
  class IgnoreChildAssociationCloner < Cloner
126
- def visit_model_view(node, model)
128
+ def visit_model_view(_node, _model)
127
129
  ignore_association!(:child)
128
130
  end
129
131
  end
@@ -131,7 +133,7 @@ class ViewModel::ActiveRecord
131
133
  module BehavesLikeCloningAChild
132
134
  extend ActiveSupport::Concern
133
135
  included do
134
- it "can clone the model and child" do
136
+ it 'can clone the model and child' do
135
137
  clone_model = Cloner.new.clone(viewmodel)
136
138
 
137
139
  assert(clone_model.new_record?)
@@ -148,7 +150,7 @@ class ViewModel::ActiveRecord
148
150
  refute_equal(model.child, clone_model.child)
149
151
  end
150
152
 
151
- it "can ignore the child association" do
153
+ it 'can ignore the child association' do
152
154
  clone_model = IgnoreChildAssociationCloner.new.clone(viewmodel)
153
155
 
154
156
  assert(clone_model.new_record?)
@@ -160,66 +162,67 @@ class ViewModel::ActiveRecord
160
162
  end
161
163
  end
162
164
 
163
- describe "as belongs_to" do
165
+ describe 'as belongs_to' do
164
166
  include ViewModelSpecHelpers::ParentAndBelongsToChild
165
167
  include BehavesLikeConstructingAChild
166
168
  include BehavesLikeCloningAChild
167
169
  end
168
170
 
169
- describe "as has_one" do
171
+ describe 'as has_one' do
170
172
  include ViewModelSpecHelpers::ParentAndHasOneChild
171
173
  include BehavesLikeConstructingAChild
172
174
  include BehavesLikeCloningAChild
173
175
  end
174
176
 
175
- describe "as belongs_to shared child" do
177
+ describe 'as belongs_to shared child' do
176
178
  include ViewModelSpecHelpers::ParentAndSharedBelongsToChild
177
179
  include BehavesLikeConstructingAChild
178
- it "can clone the model but not the child" do
179
- clone_model = Cloner.new.clone(viewmodel)
180
180
 
181
- assert(clone_model.new_record?)
182
- assert_nil(clone_model.id)
183
- assert_equal(model.name, clone_model.name)
181
+ it 'can clone the model but not the child' do
182
+ clone_model = Cloner.new.clone(viewmodel)
184
183
 
185
- clone_child = clone_model.child
186
- refute(clone_child.new_record?)
187
- assert_equal(model.child, clone_child)
184
+ assert(clone_model.new_record?)
185
+ assert_nil(clone_model.id)
186
+ assert_equal(model.name, clone_model.name)
188
187
 
189
- clone_model.save!
190
- refute_equal(model, clone_model)
191
- assert_equal(model.child, clone_model.child)
192
- end
188
+ clone_child = clone_model.child
189
+ refute(clone_child.new_record?)
190
+ assert_equal(model.child, clone_child)
191
+
192
+ clone_model.save!
193
+ refute_equal(model, clone_model)
194
+ assert_equal(model.child, clone_model.child)
195
+ end
193
196
  end
194
197
  end
195
198
 
196
199
  class IgnoreChildrenAssociationCloner < Cloner
197
- def visit_model_view(node, model)
200
+ def visit_model_view(_node, _model)
198
201
  ignore_association!(:children)
199
202
  end
200
203
  end
201
204
 
202
- describe "with has_many children" do
205
+ describe 'with has_many children' do
203
206
  include ViewModelSpecHelpers::ParentAndHasManyChildren
204
207
  def new_child_models
205
- ["b", "c"].map { |n| child_model_class.new(name: n) }
208
+ ['b', 'c'].map { |n| child_model_class.new(name: n) }
206
209
  end
207
210
 
208
211
  def new_model
209
- model_class.new(name: "a", children: new_child_models)
212
+ model_class.new(name: 'a', children: new_child_models)
210
213
  end
211
214
 
212
- it "persists the test setup" do
215
+ it 'persists the test setup' do
213
216
  assert(viewmodel.model.persisted?)
214
217
  refute(viewmodel.model.new_record?)
215
218
  assert_equal(2, viewmodel.model.children.size)
216
- viewmodel.model.children.each do | child|
219
+ viewmodel.model.children.each do |child|
217
220
  assert(child.persisted?)
218
221
  refute(child.new_record?)
219
222
  end
220
223
  end
221
224
 
222
- it "can clone the model" do
225
+ it 'can clone the model' do
223
226
  clone_model = Cloner.new.clone(viewmodel)
224
227
 
225
228
  assert(clone_model.new_record?)
@@ -244,9 +247,10 @@ class ViewModel::ActiveRecord
244
247
  class IgnoreFirstChildCloner < Cloner
245
248
  def initialize
246
249
  @ignored_first = false
250
+ super
247
251
  end
248
252
 
249
- def visit_child_view(node, model)
253
+ def visit_child_view(_node, _model)
250
254
  unless @ignored_first
251
255
  @ignored_first = true
252
256
  ignore!
@@ -254,7 +258,7 @@ class ViewModel::ActiveRecord
254
258
  end
255
259
  end
256
260
 
257
- it "can ignore subset of children" do
261
+ it 'can ignore subset of children' do
258
262
  clone_model = IgnoreFirstChildCloner.new.clone(viewmodel)
259
263
 
260
264
  assert(clone_model.new_record?)
@@ -265,7 +269,7 @@ class ViewModel::ActiveRecord
265
269
  assert_equal(model.children[1].name, clone_model.children[0].name)
266
270
  end
267
271
 
268
- it "can ignore the children association" do
272
+ it 'can ignore the children association' do
269
273
  clone_model = IgnoreChildrenAssociationCloner.new.clone(viewmodel)
270
274
 
271
275
  assert(clone_model.new_record?)
@@ -276,19 +280,19 @@ class ViewModel::ActiveRecord
276
280
  end
277
281
  end
278
282
 
279
- describe "with has_many_through shared children" do
283
+ describe 'with has_many_through shared children' do
280
284
  include ViewModelSpecHelpers::ParentAndHasManyThroughChildren
281
285
  def new_model_children
282
- ["b", "c"].map.with_index do |n, i|
286
+ ['b', 'c'].map.with_index do |n, i|
283
287
  join_model_class.new(child: child_model_class.new(name: n), position: i)
284
288
  end
285
289
  end
286
290
 
287
291
  def new_model
288
- model_class.new( name: "a", model_children: new_model_children)
292
+ model_class.new(name: 'a', model_children: new_model_children)
289
293
  end
290
294
 
291
- it "persists the test setup" do
295
+ it 'persists the test setup' do
292
296
  assert(viewmodel.model.persisted?)
293
297
  refute(viewmodel.model.new_record?)
294
298
  assert_equal(2, viewmodel.model.model_children.size)
@@ -301,7 +305,7 @@ class ViewModel::ActiveRecord
301
305
  end
302
306
  end
303
307
 
304
- it "can clone the model and join model but not the child" do
308
+ it 'can clone the model and join model but not the child' do
305
309
  clone_model = Cloner.new.clone(viewmodel)
306
310
 
307
311
  assert(clone_model.new_record?)
@@ -325,7 +329,7 @@ class ViewModel::ActiveRecord
325
329
  end
326
330
  end
327
331
 
328
- it "can ignore the children association" do
332
+ it 'can ignore the children association' do
329
333
  clone_model = IgnoreChildrenAssociationCloner.new.clone(viewmodel)
330
334
 
331
335
  assert(clone_model.new_record?)