iknow_view_models 3.1.6 → 3.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +6 -6
  3. data/.rubocop.yml +18 -0
  4. data/Appraisals +6 -6
  5. data/Gemfile +6 -2
  6. data/Rakefile +5 -5
  7. data/gemfiles/rails_5_2.gemfile +5 -5
  8. data/gemfiles/rails_6_0.gemfile +9 -0
  9. data/iknow_view_models.gemspec +40 -38
  10. data/lib/iknow_view_models.rb +9 -7
  11. data/lib/iknow_view_models/version.rb +1 -1
  12. data/lib/view_model.rb +31 -17
  13. data/lib/view_model/access_control.rb +5 -2
  14. data/lib/view_model/access_control/composed.rb +10 -9
  15. data/lib/view_model/access_control/open.rb +2 -0
  16. data/lib/view_model/access_control/read_only.rb +2 -0
  17. data/lib/view_model/access_control/tree.rb +11 -6
  18. data/lib/view_model/access_control_error.rb +4 -1
  19. data/lib/view_model/active_record.rb +13 -12
  20. data/lib/view_model/active_record/association_data.rb +3 -2
  21. data/lib/view_model/active_record/association_manipulation.rb +6 -4
  22. data/lib/view_model/active_record/cache.rb +114 -34
  23. data/lib/view_model/active_record/cache/cacheable_view.rb +2 -2
  24. data/lib/view_model/active_record/collection_nested_controller.rb +3 -3
  25. data/lib/view_model/active_record/controller.rb +68 -1
  26. data/lib/view_model/active_record/controller_base.rb +4 -1
  27. data/lib/view_model/active_record/nested_controller_base.rb +1 -0
  28. data/lib/view_model/active_record/update_context.rb +8 -6
  29. data/lib/view_model/active_record/update_data.rb +32 -30
  30. data/lib/view_model/active_record/update_operation.rb +17 -13
  31. data/lib/view_model/active_record/visitor.rb +0 -1
  32. data/lib/view_model/after_transaction_runner.rb +2 -2
  33. data/lib/view_model/callbacks.rb +3 -1
  34. data/lib/view_model/controller.rb +13 -3
  35. data/lib/view_model/deserialization_error.rb +15 -12
  36. data/lib/view_model/error.rb +12 -10
  37. data/lib/view_model/error_view.rb +3 -1
  38. data/lib/view_model/migratable_view.rb +78 -0
  39. data/lib/view_model/migration.rb +48 -0
  40. data/lib/view_model/migration/no_path_error.rb +26 -0
  41. data/lib/view_model/migration/one_way_error.rb +24 -0
  42. data/lib/view_model/migration/unspecified_version_error.rb +24 -0
  43. data/lib/view_model/migrator.rb +108 -0
  44. data/lib/view_model/record.rb +15 -14
  45. data/lib/view_model/reference.rb +3 -1
  46. data/lib/view_model/references.rb +8 -5
  47. data/lib/view_model/registry.rb +1 -1
  48. data/lib/view_model/schemas.rb +9 -4
  49. data/lib/view_model/serialization_error.rb +4 -1
  50. data/lib/view_model/serialize_context.rb +4 -4
  51. data/lib/view_model/test_helpers.rb +8 -3
  52. data/lib/view_model/test_helpers/arvm_builder.rb +21 -15
  53. data/lib/view_model/traversal_context.rb +2 -1
  54. data/nix/dependencies.nix +5 -0
  55. data/nix/gem/generate.rb +2 -1
  56. data/shell.nix +8 -3
  57. data/test/.rubocop.yml +14 -0
  58. data/test/helpers/arvm_test_models.rb +12 -9
  59. data/test/helpers/arvm_test_utilities.rb +5 -3
  60. data/test/helpers/controller_test_helpers.rb +55 -32
  61. data/test/helpers/match_enumerator.rb +1 -0
  62. data/test/helpers/query_logging.rb +2 -1
  63. data/test/helpers/test_access_control.rb +5 -3
  64. data/test/helpers/viewmodel_spec_helpers.rb +88 -22
  65. data/test/unit/view_model/access_control_test.rb +144 -144
  66. data/test/unit/view_model/active_record/alias_test.rb +15 -13
  67. data/test/unit/view_model/active_record/belongs_to_test.rb +40 -39
  68. data/test/unit/view_model/active_record/cache_test.rb +68 -31
  69. data/test/unit/view_model/active_record/cloner_test.rb +67 -63
  70. data/test/unit/view_model/active_record/controller_test.rb +113 -65
  71. data/test/unit/view_model/active_record/counter_test.rb +10 -9
  72. data/test/unit/view_model/active_record/customization_test.rb +59 -58
  73. data/test/unit/view_model/active_record/has_many_test.rb +112 -111
  74. data/test/unit/view_model/active_record/has_many_through_poly_test.rb +15 -14
  75. data/test/unit/view_model/active_record/has_many_through_test.rb +33 -38
  76. data/test/unit/view_model/active_record/has_one_test.rb +37 -36
  77. data/test/unit/view_model/active_record/migration_test.rb +161 -0
  78. data/test/unit/view_model/active_record/namespacing_test.rb +19 -17
  79. data/test/unit/view_model/active_record/poly_test.rb +44 -45
  80. data/test/unit/view_model/active_record/shared_test.rb +30 -28
  81. data/test/unit/view_model/active_record/version_test.rb +9 -7
  82. data/test/unit/view_model/active_record_test.rb +72 -72
  83. data/test/unit/view_model/callbacks_test.rb +19 -15
  84. data/test/unit/view_model/controller_test.rb +4 -2
  85. data/test/unit/view_model/record_test.rb +92 -97
  86. data/test/unit/view_model/traversal_context_test.rb +4 -5
  87. data/test/unit/view_model_test.rb +18 -16
  88. metadata +36 -12
  89. data/.travis.yml +0 -31
  90. data/appveyor.yml +0 -22
  91. data/gemfiles/rails_6_0_beta.gemfile +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6fc1b45c59ce7be7ea1052ef27c81bf46ca556ed5d36119cf35cd3b8ecb5b07a
4
- data.tar.gz: a667a697d8c71947884707f99d9d2bc6cb53361565cf153c8e28186a92b8e7db
3
+ metadata.gz: a86b2b9fdc89ee421bcb155ae29e3ac4f2c809be4d40e483a405337f8729a7f9
4
+ data.tar.gz: 8fd1c498264a0eefe30d9c3c6a35c4f005a94aaf71b03d37044a23212cb90eb4
5
5
  SHA512:
6
- metadata.gz: c30f535e0a125a591519b1a7de0101176031afcff50d1656388cacf7bc8dc1f400c816ccefc19f7a0454fbb768911801c25ab4335ea567cab55d354f4a70aeae
7
- data.tar.gz: d2a75cde7251e75ce400544efc02f19890edec7604131fad67ccaa8ddd37f6e51af8b72f14c3b40f33ef219c278558f550cbcabb4aad4d05fff5b0549612fc4b
6
+ metadata.gz: c2a2fd321cf605709eb398771cd6cc475869e80c59d5a4934a2cf5429cfa3e1a6a5e3e74f358227793ff2cc7ce10a1eff46fe3c4db20e859d49d54be306b4afb
7
+ data.tar.gz: cfb7009b02acbebce85d3ad41205549430370710633d51176ac8596acf6a83fb98f0e76132bf850baf37da36acfe402afc21d00c8996f66ca2a98f62a9380dc1
@@ -102,15 +102,15 @@ workflows:
102
102
  build:
103
103
  jobs:
104
104
  - test:
105
- name: 'ruby 2.6 rails 5.2 pg 11'
105
+ name: 'ruby 2.6 rails 5.2 pg 12'
106
106
  ruby-version: "2.6"
107
- pg-version: "11"
107
+ pg-version: "12"
108
108
  gemfile: gemfiles/rails_5_2.gemfile
109
109
  - test:
110
- name: 'ruby 2.6 rails 6.0 pg 11'
111
- ruby-version: "2.6"
112
- pg-version: "11"
113
- gemfile: gemfiles/rails_6_0_beta.gemfile
110
+ name: 'ruby 2.7 rails 6.0 pg 12'
111
+ ruby-version: "2.7"
112
+ pg-version: "12"
113
+ gemfile: gemfiles/rails_6_0.gemfile
114
114
  - publish:
115
115
  filters:
116
116
  branches:
@@ -0,0 +1,18 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.7
3
+ Exclude:
4
+ - Appraisals
5
+ - Gemfile
6
+ - Rakefile
7
+ - 'gemfiles/*'
8
+ - 'nix/gem/**/*'
9
+
10
+ inherit_gem:
11
+ rubocop-iknow: rubocop.yml
12
+
13
+ Metrics/BlockNesting:
14
+ Enabled: false
15
+ Lint/IneffectiveAccessModifier:
16
+ Enabled: false
17
+ Lint/UselessAccessModifier:
18
+ Enabled: false
data/Appraisals CHANGED
@@ -1,9 +1,9 @@
1
- appraise "rails-5-2" do
2
- gem "activerecord", "~> 5.2.0"
3
- gem "activesupport", "~> 5.2.0"
1
+ appraise 'rails-5-2' do
2
+ gem 'activerecord', '~> 5.2.0'
3
+ gem 'activesupport', '~> 5.2.0'
4
4
  end
5
5
 
6
- appraise "rails-6-0-beta" do
7
- gem "activerecord", "~> 6.0.0.beta"
8
- gem "activesupport", "~> 6.0.0.beta"
6
+ appraise 'rails-6-0' do
7
+ gem 'activerecord', '~> 6.0.0'
8
+ gem 'activesupport', '~> 6.0.0'
9
9
  end
data/Gemfile CHANGED
@@ -3,9 +3,13 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in cerego_view_models.gemspec
4
4
  gemspec
5
5
 
6
+ # Add our linter rules as a development dependency
7
+ gem 'rubocop'
8
+ gem 'rubocop-iknow'
9
+
6
10
  # Test metadata collection for circleci
7
11
  gem 'minitest-ci'
8
12
 
9
13
  # Override gemspec for development version preferences
10
- gem 'activerecord', '~> 5.2.0'
11
- gem 'activesupport', '~> 5.2.0'
14
+ gem 'activerecord', '~> 6.0.0'
15
+ gem 'activesupport', '~> 6.0.0'
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
3
 
4
4
  Rake::TestTask.new do |t|
5
5
  t.libs << 'test'
@@ -8,14 +8,14 @@ Rake::TestTask.new do |t|
8
8
  t.verbose = true
9
9
  end
10
10
 
11
- desc "Open an IRB console with the test helpers"
11
+ desc 'Open an IRB console with the test helpers'
12
12
  task :test_console do
13
13
  ruby %{-r bundler/setup -Ilib -e 'load "test/helpers/arvm_test_models.rb"' -r irb -e 'IRB.start(__FILE__)'}
14
14
  end
15
15
 
16
- desc "Open a Pry console with the test helpers"
16
+ desc 'Open a Pry console with the test helpers'
17
17
  task 'test_console:pry' do
18
- ruby %{-r bundler/setup -Ilib -e 'load "test/helpers/arvm_test_models.rb"' -r pry -e 'Pry.start'}
18
+ ruby %(-r bundler/setup -Ilib -e 'load "test/helpers/arvm_test_models.rb"' -r pry -e 'Pry.start')
19
19
  end
20
20
 
21
21
  task :default => :test
@@ -1,9 +1,9 @@
1
1
  # This file was generated by Appraisal
2
2
 
3
- source "https://rubygems.org"
3
+ source 'https://rubygems.org'
4
4
 
5
- gem "minitest-ci"
6
- gem "activerecord", "~> 5.2.0"
7
- gem "activesupport", "~> 5.2.0"
5
+ gem 'minitest-ci'
6
+ gem 'activerecord', '~> 5.2.0'
7
+ gem 'activesupport', '~> 5.2.0'
8
8
 
9
- gemspec path: "../"
9
+ gemspec path: '../'
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'minitest-ci'
6
+ gem 'activerecord', '~> 6.0.0'
7
+ gem 'activesupport', '~> 6.0.0'
8
+
9
+ gemspec path: '../'
@@ -1,50 +1,52 @@
1
1
  # frozen_string_literal: true
2
- # coding: utf-8
3
2
 
4
- lib = File.expand_path('../lib', __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
5
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
5
  require 'iknow_view_models/version'
7
6
 
8
7
  Gem::Specification.new do |spec|
9
- spec.name = "iknow_view_models"
8
+ spec.name = 'iknow_view_models'
10
9
  spec.version = IknowViewModels::VERSION
11
- spec.authors = ["iKnow Team"]
12
- spec.email = ["edge@iknow.jp"]
13
- spec.summary = "ViewModels provide a means of encapsulating a collection of related data and specifying its JSON serialization."
14
- spec.description = ""
15
- spec.homepage = "https://github.com/iknow/cerego_view_models"
16
- spec.license = "MIT"
10
+ spec.authors = ['iKnow Team']
11
+ spec.email = ['edge@iknow.jp']
12
+ spec.summary = 'ViewModels provide a means of encapsulating a collection of related data and specifying its JSON serialization.'
13
+ spec.description = ''
14
+ spec.homepage = 'https://github.com/iknow/cerego_view_models'
15
+ spec.license = 'MIT'
17
16
 
18
17
  spec.files = `git ls-files -z`.split("\x0")
19
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
- spec.require_paths = ["lib"]
22
-
23
- spec.add_dependency "activerecord", ">= 5.0"
24
- spec.add_dependency "activesupport", ">= 5.0"
25
-
26
- spec.add_dependency "acts_as_manual_list"
27
- spec.add_dependency "deep_preloader", ">= 1.0.1"
28
- spec.add_dependency "iknow_cache"
29
- spec.add_dependency "iknow_params", "~> 2.2.0"
30
- spec.add_dependency "safe_values"
31
- spec.add_dependency "keyword_builder"
32
-
33
- spec.add_dependency "concurrent-ruby"
34
- spec.add_dependency "jbuilder"
35
- spec.add_dependency "json_schema"
36
- spec.add_dependency "lazily"
37
- spec.add_dependency "renum"
38
- spec.add_dependency "oj"
39
-
40
- spec.add_development_dependency "appraisal"
41
- spec.add_development_dependency "bundler"
42
- spec.add_development_dependency "byebug"
43
- spec.add_development_dependency "method_source"
44
- spec.add_development_dependency "minitest-hooks"
45
- spec.add_development_dependency "pg", '~> 0.18' # As of 5.1.4, Rails runtime check excludes pg 1.x, see #31669
46
- spec.add_development_dependency "pry"
47
- spec.add_development_dependency "rake"
48
- spec.add_development_dependency "rspec-expectations"
49
- spec.add_development_dependency "sqlite3"
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.required_ruby_version = 2.6
23
+
24
+ spec.add_dependency 'activerecord', '>= 5.0'
25
+ spec.add_dependency 'activesupport', '>= 5.0'
26
+
27
+ spec.add_dependency 'acts_as_manual_list'
28
+ spec.add_dependency 'deep_preloader', '>= 1.0.1'
29
+ spec.add_dependency 'iknow_cache'
30
+ spec.add_dependency 'iknow_params', '~> 2.2.0'
31
+ spec.add_dependency 'keyword_builder'
32
+ spec.add_dependency 'safe_values'
33
+
34
+ spec.add_dependency 'concurrent-ruby'
35
+ spec.add_dependency 'jbuilder'
36
+ spec.add_dependency 'json_schema'
37
+ spec.add_dependency 'lazily'
38
+ spec.add_dependency 'oj'
39
+ spec.add_dependency 'renum'
40
+ spec.add_dependency 'rgl'
41
+
42
+ spec.add_development_dependency 'appraisal'
43
+ spec.add_development_dependency 'bundler'
44
+ spec.add_development_dependency 'byebug'
45
+ spec.add_development_dependency 'method_source'
46
+ spec.add_development_dependency 'minitest-hooks'
47
+ spec.add_development_dependency 'pg'
48
+ spec.add_development_dependency 'pry'
49
+ spec.add_development_dependency 'rake'
50
+ spec.add_development_dependency 'rspec-expectations'
51
+ spec.add_development_dependency 'sqlite3'
50
52
  end
@@ -1,10 +1,12 @@
1
- require "iknow_view_models/version"
2
- require "view_model"
3
- require "view_model/controller"
4
- require "view_model/active_record"
5
- require "view_model/active_record/controller"
6
- require "view_model/active_record/singular_nested_controller"
7
- require "view_model/active_record/collection_nested_controller"
1
+ # frozen_string_literal: true
2
+
3
+ require 'iknow_view_models/version'
4
+ require 'view_model'
5
+ require 'view_model/controller'
6
+ require 'view_model/active_record'
7
+ require 'view_model/active_record/controller'
8
+ require 'view_model/active_record/singular_nested_controller'
9
+ require 'view_model/active_record/collection_nested_controller'
8
10
 
9
11
  module IknowViewModels
10
12
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module IknowViewModels
4
- VERSION = '3.1.6'
4
+ VERSION = '3.2.2'
5
5
  end
@@ -6,14 +6,19 @@ require 'jbuilder'
6
6
  require 'deep_preloader'
7
7
 
8
8
  class ViewModel
9
- REFERENCE_ATTRIBUTE = "_ref"
10
- ID_ATTRIBUTE = "id"
11
- TYPE_ATTRIBUTE = "_type"
12
- VERSION_ATTRIBUTE = "_version"
13
- NEW_ATTRIBUTE = "_new"
14
-
15
- Metadata = Struct.new(:id, :view_name, :schema_version, :new) do
16
- alias :new? :new
9
+ REFERENCE_ATTRIBUTE = '_ref'
10
+ ID_ATTRIBUTE = 'id'
11
+ TYPE_ATTRIBUTE = '_type'
12
+ VERSION_ATTRIBUTE = '_version'
13
+ NEW_ATTRIBUTE = '_new'
14
+
15
+ # Migrations leave a metadata attribute _migrated on any views that they
16
+ # alter. This attribute is accessible as metadata when deserializing migrated
17
+ # input, and is included in the output serialization sent to clients.
18
+ MIGRATED_ATTRIBUTE = '_migrated'
19
+
20
+ Metadata = Struct.new(:id, :view_name, :schema_version, :new, :migrated) do
21
+ alias_method :new?, :new
17
22
  end
18
23
 
19
24
  class << self
@@ -23,6 +28,7 @@ class ViewModel
23
28
  attr_writer :view_name
24
29
 
25
30
  def inherited(subclass)
31
+ super
26
32
  subclass.initialize_as_viewmodel
27
33
  end
28
34
 
@@ -38,6 +44,7 @@ class ViewModel
38
44
  # try to auto-detect based on class name
39
45
  match = /(.*)View$/.match(self.name)
40
46
  raise ArgumentError.new("Could not auto-determine ViewModel name from class name '#{self.name}'") if match.nil?
47
+
41
48
  ViewModel::Registry.default_view_name(match[1])
42
49
  end
43
50
  end
@@ -72,6 +79,7 @@ class ViewModel
72
79
  end
73
80
 
74
81
  attr_accessor attr
82
+
75
83
  define_method("deserialize_#{attr}") do |value, references: {}, deserialize_context: self.class.new_deserialize_context|
76
84
  self.public_send("#{attr}=", value)
77
85
  end
@@ -99,8 +107,9 @@ class ViewModel
99
107
  type_name = hash.delete(ViewModel::TYPE_ATTRIBUTE)
100
108
  schema_version = hash.delete(ViewModel::VERSION_ATTRIBUTE)
101
109
  new = hash.delete(ViewModel::NEW_ATTRIBUTE) { false }
110
+ migrated = hash.delete(ViewModel::MIGRATED_ATTRIBUTE) { false }
102
111
 
103
- Metadata.new(id, type_name, schema_version, new)
112
+ Metadata.new(id, type_name, schema_version, new, migrated)
104
113
  end
105
114
 
106
115
  def extract_reference_only_metadata(hash)
@@ -108,7 +117,7 @@ class ViewModel
108
117
  id = hash.delete(ViewModel::ID_ATTRIBUTE)
109
118
  type_name = hash.delete(ViewModel::TYPE_ATTRIBUTE)
110
119
 
111
- Metadata.new(id, type_name, nil, false)
120
+ Metadata.new(id, type_name, nil, false, false)
112
121
  end
113
122
 
114
123
  def extract_reference_metadata(hash)
@@ -116,7 +125,7 @@ class ViewModel
116
125
  hash.delete(ViewModel::REFERENCE_ATTRIBUTE)
117
126
  end
118
127
 
119
- def is_update_hash?(hash)
128
+ def is_update_hash?(hash) # rubocop:disable Naming/PredicateName
120
129
  ViewModel::Schemas.verify_schema!(ViewModel::Schemas::VIEWMODEL_UPDATE, hash)
121
130
  hash.has_key?(ViewModel::ID_ATTRIBUTE) &&
122
131
  !hash.fetch(ViewModel::ActiveRecord::NEW_ATTRIBUTE, false)
@@ -192,12 +201,12 @@ class ViewModel
192
201
  end
193
202
 
194
203
  member_names.each do |attr|
195
- if view_hash.has_key?(attr)
196
- viewmodel.public_send("deserialize_#{attr}",
197
- view_hash[attr],
198
- references: references,
199
- deserialize_context: deserialize_context)
200
- end
204
+ next unless view_hash.has_key?(attr)
205
+
206
+ viewmodel.public_send("deserialize_#{attr}",
207
+ view_hash[attr],
208
+ references: references,
209
+ deserialize_context: deserialize_context)
201
210
  end
202
211
 
203
212
  deserialize_context.run_callback(ViewModel::Callbacks::Hook::BeforeValidate, viewmodel)
@@ -234,6 +243,11 @@ class ViewModel
234
243
  schema_version == self.schema_version
235
244
  end
236
245
 
246
+ def schema_hash(schema_versions)
247
+ version_string = schema_versions.to_a.sort.join(',')
248
+ Base64.urlsafe_encode64(Digest::MD5.digest(version_string))
249
+ end
250
+
237
251
  def preload_for_serialization(viewmodels, serialize_context: new_serialize_context, include_referenced: true, lock: nil)
238
252
  Array.wrap(viewmodels).group_by(&:class).each do |type, views|
239
253
  DeepPreloader.preload(views.map(&:model),
@@ -13,11 +13,12 @@ require 'view_model/access_control_error'
13
13
  class ViewModel::AccessControl
14
14
  Result = Struct.new(:permit, :error) do
15
15
  def initialize(permit, error: nil)
16
- raise ArgumentError.new("Successful AccessControl::Result may not have an error") if permit && error
16
+ raise ArgumentError.new('Successful AccessControl::Result may not have an error') if permit && error
17
+
17
18
  super(permit, error)
18
19
  end
19
20
 
20
- alias :permit? :permit
21
+ alias_method :permit?, :permit
21
22
 
22
23
  # Merge this result with another access control result. Takes a block
23
24
  # returning a result, and returns a combined result for both tests. Access
@@ -129,6 +130,7 @@ class ViewModel::AccessControl
129
130
  if @initial_editability_store.has_key?(view.object_id)
130
131
  raise RuntimeError.new("Access control data already recorded for view #{view.to_reference}")
131
132
  end
133
+
132
134
  @initial_editability_store[view.object_id] = initial_editability
133
135
  end
134
136
 
@@ -136,6 +138,7 @@ class ViewModel::AccessControl
136
138
  unless @initial_editability_store.has_key?(view.object_id)
137
139
  raise RuntimeError.new("No access control data recorded for view #{view.to_reference}")
138
140
  end
141
+
139
142
  @initial_editability_store.delete(view.object_id)
140
143
  end
141
144
 
@@ -8,8 +8,9 @@
8
8
  class ViewModel::AccessControl::Composed < ViewModel::AccessControl
9
9
  ComposedResult = Struct.new(:allow, :veto, :allow_error, :veto_error) do
10
10
  def initialize(allow, veto, allow_error, veto_error)
11
- raise ArgumentError.new("Non-vetoing result may not have a veto error") if veto_error && !veto
12
- raise ArgumentError.new("Allowing result may not have a allow error") if allow_error && allow
11
+ raise ArgumentError.new('Non-vetoing result may not have a veto error') if veto_error && !veto
12
+ raise ArgumentError.new('Allowing result may not have a allow error') if allow_error && allow
13
+
13
14
  super
14
15
  end
15
16
 
@@ -64,7 +65,7 @@ class ViewModel::AccessControl::Composed < ViewModel::AccessControl
64
65
  attr_reader :reasons
65
66
 
66
67
  def initialize(nodes, reasons)
67
- super("Action not permitted because none of the possible conditions were met.", nodes)
68
+ super('Action not permitted because none of the possible conditions were met.', nodes)
68
69
  @reasons = reasons
69
70
  end
70
71
 
@@ -92,7 +93,7 @@ class ViewModel::AccessControl::Composed < ViewModel::AccessControl
92
93
  end
93
94
 
94
95
  def initialize_as_composed_access_control
95
- @included_checkers = []
96
+ @included_checkers = []
96
97
 
97
98
  @edit_valid_ifs = []
98
99
  @edit_valid_unlesses = []
@@ -152,15 +153,16 @@ class ViewModel::AccessControl::Composed < ViewModel::AccessControl
152
153
  @included_checkers.each do |ancestor|
153
154
  next unless visited.add?(ancestor)
154
155
  next if include_ancestor && !include_ancestor.call(ancestor)
156
+
155
157
  ancestor.each_check(check_name) { |x| yield x }
156
158
  end
157
159
  end
158
160
 
159
161
  def inspect
160
- s = super + "("
161
- s += inspect_checks.join(", ")
162
+ s = super + '('
163
+ s += inspect_checks.join(', ')
162
164
  s += " includes checkers: #{@included_checkers.inspect}" if @included_checkers.present?
163
- s += ")"
165
+ s += ')'
164
166
  s
165
167
  end
166
168
 
@@ -174,7 +176,6 @@ class ViewModel::AccessControl::Composed < ViewModel::AccessControl
174
176
  checks << "edit_valid_unless: #{@edit_valid_unlesses.map(&:reason)}" if @edit_valid_unlesses.present?
175
177
  checks
176
178
  end
177
-
178
179
  end
179
180
 
180
181
  # final
@@ -199,7 +200,7 @@ class ViewModel::AccessControl::Composed < ViewModel::AccessControl
199
200
 
200
201
  veto = vetoed_checker.present?
201
202
  if veto
202
- veto_error = vetoed_checker.error_type.new("Action not permitted because: " +
203
+ veto_error = vetoed_checker.error_type.new('Action not permitted because: ' +
203
204
  vetoed_checker.reason,
204
205
  env.view.blame_reference)
205
206
  end