rails_ops 1.3.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 365397242478d0f5dd89c5eadf97871c2e5d9a6a2f5b59dbfdbdb5a060bf56e0
4
- data.tar.gz: 45f57e7a2abfe574b2c7caeaa135fb4896c364bdc9e36c5adc673640e6be1351
3
+ metadata.gz: bf07735e6610693ed0a7595e5b85b2fa5c38f0cb1c470a9b7989a2d7105a4152
4
+ data.tar.gz: 33b92924b44d06b64309a057fb76fa7bac42c59faad7f67d2de584c819259766
5
5
  SHA512:
6
- metadata.gz: c58cba8d71ca052e676323d98a0dbdd58d39db4f3c1c9a15ed95d4f8714ae3377bbd4e7a45c5b83bccf74dba34ac573a690cd839174a3600ea03d0c3abab5514
7
- data.tar.gz: f3eebf9294ec8a7a84be52329964b6ee5a717099d52b10dcf408d2a7eaf92d19072b3b85b84affe33348117ed113a2cfeb10beed412c371270920ecbe86370a4
6
+ metadata.gz: 4ce25936523ca89e92e1aad1fbb0e884bd6bcd230afd1faa8e106a48f0f853d1305b1e6621063bc2b538e0a6e1e4ca1d8c8e395356489d552d764baf29410713
7
+ data.tar.gz: 970ffa94554885d4bcd9a2351a5b413d245f5f3b1ea7900d0220d1fe7e0d52fa98389025f61a29f7c0b300955741e09d8321502697d4a18235eaf97729952b49
data/.gitignore CHANGED
@@ -1,3 +1,5 @@
1
+ /bin
2
+ /RUBY_VERSION
1
3
  /.bundle/
2
4
  /.yardoc
3
5
  /Gemfile.lock
data/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+
4
+ ## 1.4.1 (2023-02-21)
5
+
6
+ * Fix specifying custom [param_key](README.md#param-key) when nesting model
7
+ operations
8
+
9
+ ## 1.4.0 (2023-02-21)
10
+
11
+ ### Changes
12
+
13
+ * #33: Improve resolving `param_key` in nested model operations.
14
+
15
+ ### Upgrading
16
+
17
+ Please see #33 for more information on this change. If all of your operations
18
+ follow the standard naming conventions (e.g. `Operations::User::Update` for
19
+ updating a model named `User`), no changes will be necessary. If you don't, you
20
+ may need to manually specify a `param_key` when using nested model operations
21
+ (see [Model nesting](README.md#param-key) for more information).
22
+
3
23
  ## 1.3.0 (2023-01-23)
4
24
 
5
25
  * Add `lock_mode` DSL method
data/README.md CHANGED
@@ -1380,6 +1380,21 @@ class User
1380
1380
  end
1381
1381
  ```
1382
1382
 
1383
+ #### Param key
1384
+
1385
+ When nesting a model operation, the sub operation is called automatically by
1386
+ RailsOps. For this purpose, it needs to know which `param_key` to use for
1387
+ calling the sub operation, e.g. `user: { name: 'Jane Doe' }`. Normally, this is
1388
+ derived by calling `<sub-op-model-class>.model_name.param_key`. If your
1389
+ operation for some reason expects a different param key, you can specify it
1390
+ using the option `param_key`, e.g.:
1391
+
1392
+ ```ruby
1393
+ # Operation Operations::Group::Create will receive the following params:
1394
+ # { my_custom_key: { ... } }
1395
+ nest_model_op :group, Operations::Group::Create, param_key: :my_custom_key
1396
+ ```
1397
+
1383
1398
  #### Custom parameters
1384
1399
 
1385
1400
  In the above examples, all `group_attributes` are automatically passed to the
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.0
1
+ 1.4.1
@@ -14,7 +14,7 @@ module RailsOps::Mixins::Model::Nesting
14
14
  end
15
15
 
16
16
  module ClassMethods
17
- def nest_model_op(attribute, klass, lookup_via_id_on_update: true, allow_id: false, &params_block)
17
+ def nest_model_op(attribute, klass, lookup_via_id_on_update: true, allow_id: false, param_key: nil, &params_block)
18
18
  # ---------------------------------------------------------------
19
19
  # Make sure we're working with an extension / copy
20
20
  # of the given model class
@@ -74,6 +74,7 @@ module RailsOps::Mixins::Model::Nesting
74
74
  self._nested_model_ops = _nested_model_ops.merge(
75
75
  attribute => {
76
76
  klass: klass,
77
+ param_key: param_key,
77
78
  attribute_name: reflection.class_name.underscore,
78
79
  params_proc: params_block,
79
80
  lookup_via_id_on_update: lookup_via_id_on_update,
@@ -123,11 +124,11 @@ module RailsOps::Mixins::Model::Nesting
123
124
  end
124
125
 
125
126
  # Wrap parameters for nested model operation
126
- model_class = config[:klass].name.deconstantize.demodulize.underscore.to_sym
127
+ param_key = config[:param_key] || config[:klass].model.model_name.param_key
127
128
 
128
129
  if action == :create
129
130
  wrapped_params = {
130
- model_class => op_params
131
+ param_key => op_params
131
132
  }
132
133
  elsif action == :update
133
134
  if config[:lookup_via_id_on_update]
@@ -139,7 +140,7 @@ module RailsOps::Mixins::Model::Nesting
139
140
 
140
141
  wrapped_params = {
141
142
  :id => id,
142
- model_class => op_params
143
+ param_key => op_params
143
144
  }
144
145
  else
145
146
  fail "Unsupported action #{action}."
data/rails_ops.gemspec CHANGED
@@ -1,52 +1,33 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: rails_ops 1.3.0 ruby lib
2
+ # stub: rails_ops 1.4.1 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "rails_ops".freeze
6
- s.version = "1.3.0"
6
+ s.version = "1.4.1"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
- s.date = "2023-01-23"
12
- s.files = [".github/workflows/rubocop.yml".freeze, ".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "Appraisals".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "gemfiles/rails_6.0.gemfile".freeze, "gemfiles/rails_6.1.gemfile".freeze, "gemfiles/rails_7.0.gemfile".freeze, "lib/generators/operation/USAGE".freeze, "lib/generators/operation/operation_generator.rb".freeze, "lib/generators/operation/templates/controller.erb".freeze, "lib/generators/operation/templates/create.erb".freeze, "lib/generators/operation/templates/destroy.erb".freeze, "lib/generators/operation/templates/load.erb".freeze, "lib/generators/operation/templates/update.erb".freeze, "lib/generators/operation/templates/view.erb".freeze, "lib/rails_ops.rb".freeze, "lib/rails_ops/authorization_backend/abstract.rb".freeze, "lib/rails_ops/authorization_backend/can_can_can.rb".freeze, "lib/rails_ops/configuration.rb".freeze, "lib/rails_ops/context.rb".freeze, "lib/rails_ops/controller_mixin.rb".freeze, "lib/rails_ops/exceptions.rb".freeze, "lib/rails_ops/hooked_job.rb".freeze, "lib/rails_ops/hookup.rb".freeze, "lib/rails_ops/hookup/dsl.rb".freeze, "lib/rails_ops/hookup/dsl_validator.rb".freeze, "lib/rails_ops/hookup/hook.rb".freeze, "lib/rails_ops/log_subscriber.rb".freeze, "lib/rails_ops/mixins.rb".freeze, "lib/rails_ops/mixins/authorization.rb".freeze, "lib/rails_ops/mixins/log_settings.rb".freeze, "lib/rails_ops/mixins/model.rb".freeze, "lib/rails_ops/mixins/model/authorization.rb".freeze, "lib/rails_ops/mixins/model/nesting.rb".freeze, "lib/rails_ops/mixins/param_authorization.rb".freeze, "lib/rails_ops/mixins/policies.rb".freeze, "lib/rails_ops/mixins/require_context.rb".freeze, "lib/rails_ops/mixins/routes.rb".freeze, "lib/rails_ops/mixins/schema_validation.rb".freeze, "lib/rails_ops/mixins/sub_ops.rb".freeze, "lib/rails_ops/model_mixins.rb".freeze, "lib/rails_ops/model_mixins/ar_extension.rb".freeze, "lib/rails_ops/model_mixins/marshalling.rb".freeze, "lib/rails_ops/model_mixins/parent_op.rb".freeze, "lib/rails_ops/model_mixins/sti_fixes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes/virtual_column_wrapper.rb".freeze, "lib/rails_ops/model_mixins/virtual_has_one.rb".freeze, "lib/rails_ops/model_mixins/virtual_model_name.rb".freeze, "lib/rails_ops/operation.rb".freeze, "lib/rails_ops/operation/model.rb".freeze, "lib/rails_ops/operation/model/create.rb".freeze, "lib/rails_ops/operation/model/destroy.rb".freeze, "lib/rails_ops/operation/model/load.rb".freeze, "lib/rails_ops/operation/model/update.rb".freeze, "lib/rails_ops/profiler.rb".freeze, "lib/rails_ops/profiler/node.rb".freeze, "lib/rails_ops/railtie.rb".freeze, "lib/rails_ops/scoped_env.rb".freeze, "lib/rails_ops/virtual_model.rb".freeze, "rails_ops.gemspec".freeze, "test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/assets/config/manifest.js".freeze, "test/dummy/app/assets/images/.keep".freeze, "test/dummy/app/assets/javascripts/application.js".freeze, "test/dummy/app/assets/javascripts/cable.js".freeze, "test/dummy/app/assets/javascripts/channels/.keep".freeze, "test/dummy/app/assets/stylesheets/application.css".freeze, "test/dummy/app/channels/application_cable/channel.rb".freeze, "test/dummy/app/channels/application_cable/connection.rb".freeze, "test/dummy/app/controllers/application_controller.rb".freeze, "test/dummy/app/controllers/concerns/.keep".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/jobs/application_job.rb".freeze, "test/dummy/app/mailers/application_mailer.rb".freeze, "test/dummy/app/models/animal.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/bird.rb".freeze, "test/dummy/app/models/cat.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/dog.rb".freeze, "test/dummy/app/models/flower.rb".freeze, "test/dummy/app/models/group.rb".freeze, "test/dummy/app/models/nightingale.rb".freeze, "test/dummy/app/models/phoenix.rb".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/app/views/layouts/application.html.erb".freeze, "test/dummy/app/views/layouts/mailer.html.erb".freeze, "test/dummy/app/views/layouts/mailer.text.erb".freeze, "test/dummy/bin/bundle".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/bin/update".freeze, "test/dummy/bin/yarn".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/cable.yml".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/development.rb".freeze, "test/dummy/config/environments/production.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/initializers/application_controller_renderer.rb".freeze, "test/dummy/config/initializers/assets.rb".freeze, "test/dummy/config/initializers/backtrace_silencers.rb".freeze, "test/dummy/config/initializers/cookies_serializer.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/mime_types.rb".freeze, "test/dummy/config/initializers/rails_ops.rb".freeze, "test/dummy/config/initializers/wrap_parameters.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/config/secrets.yml".freeze, "test/dummy/config/spring.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/lib/assets/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/package.json".freeze, "test/dummy/public/404.html".freeze, "test/dummy/public/422.html".freeze, "test/dummy/public/500.html".freeze, "test/dummy/public/apple-touch-icon-precomposed.png".freeze, "test/dummy/public/apple-touch-icon.png".freeze, "test/dummy/public/favicon.ico".freeze, "test/dummy/tmp/.keep".freeze, "test/test_helper.rb".freeze, "test/unit/rails_ops/generators/operation_generator_test.rb".freeze, "test/unit/rails_ops/mixins/model/nesting.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/load_test.rb".freeze, "test/unit/rails_ops/operation/model/sti_test.rb".freeze, "test/unit/rails_ops/operation/model/update_test.rb".freeze, "test/unit/rails_ops/operation/model_test.rb".freeze, "test/unit/rails_ops/operation/update_auth_test.rb".freeze, "test/unit/rails_ops/operation/update_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze]
13
- s.rubygems_version = "3.2.15".freeze
11
+ s.date = "2023-02-21"
12
+ s.files = [".github/workflows/rubocop.yml".freeze, ".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "Appraisals".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "gemfiles/rails_6.0.gemfile".freeze, "gemfiles/rails_6.1.gemfile".freeze, "gemfiles/rails_7.0.gemfile".freeze, "lib/generators/operation/USAGE".freeze, "lib/generators/operation/operation_generator.rb".freeze, "lib/generators/operation/templates/controller.erb".freeze, "lib/generators/operation/templates/create.erb".freeze, "lib/generators/operation/templates/destroy.erb".freeze, "lib/generators/operation/templates/load.erb".freeze, "lib/generators/operation/templates/update.erb".freeze, "lib/generators/operation/templates/view.erb".freeze, "lib/rails_ops.rb".freeze, "lib/rails_ops/authorization_backend/abstract.rb".freeze, "lib/rails_ops/authorization_backend/can_can_can.rb".freeze, "lib/rails_ops/configuration.rb".freeze, "lib/rails_ops/context.rb".freeze, "lib/rails_ops/controller_mixin.rb".freeze, "lib/rails_ops/exceptions.rb".freeze, "lib/rails_ops/hooked_job.rb".freeze, "lib/rails_ops/hookup.rb".freeze, "lib/rails_ops/hookup/dsl.rb".freeze, "lib/rails_ops/hookup/dsl_validator.rb".freeze, "lib/rails_ops/hookup/hook.rb".freeze, "lib/rails_ops/log_subscriber.rb".freeze, "lib/rails_ops/mixins.rb".freeze, "lib/rails_ops/mixins/authorization.rb".freeze, "lib/rails_ops/mixins/log_settings.rb".freeze, "lib/rails_ops/mixins/model.rb".freeze, "lib/rails_ops/mixins/model/authorization.rb".freeze, "lib/rails_ops/mixins/model/nesting.rb".freeze, "lib/rails_ops/mixins/param_authorization.rb".freeze, "lib/rails_ops/mixins/policies.rb".freeze, "lib/rails_ops/mixins/require_context.rb".freeze, "lib/rails_ops/mixins/routes.rb".freeze, "lib/rails_ops/mixins/schema_validation.rb".freeze, "lib/rails_ops/mixins/sub_ops.rb".freeze, "lib/rails_ops/model_mixins.rb".freeze, "lib/rails_ops/model_mixins/ar_extension.rb".freeze, "lib/rails_ops/model_mixins/marshalling.rb".freeze, "lib/rails_ops/model_mixins/parent_op.rb".freeze, "lib/rails_ops/model_mixins/sti_fixes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes/virtual_column_wrapper.rb".freeze, "lib/rails_ops/model_mixins/virtual_has_one.rb".freeze, "lib/rails_ops/model_mixins/virtual_model_name.rb".freeze, "lib/rails_ops/operation.rb".freeze, "lib/rails_ops/operation/model.rb".freeze, "lib/rails_ops/operation/model/create.rb".freeze, "lib/rails_ops/operation/model/destroy.rb".freeze, "lib/rails_ops/operation/model/load.rb".freeze, "lib/rails_ops/operation/model/update.rb".freeze, "lib/rails_ops/profiler.rb".freeze, "lib/rails_ops/profiler/node.rb".freeze, "lib/rails_ops/railtie.rb".freeze, "lib/rails_ops/scoped_env.rb".freeze, "lib/rails_ops/virtual_model.rb".freeze, "rails_ops.gemspec".freeze, "test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/assets/config/manifest.js".freeze, "test/dummy/app/assets/images/.keep".freeze, "test/dummy/app/assets/javascripts/application.js".freeze, "test/dummy/app/assets/javascripts/cable.js".freeze, "test/dummy/app/assets/javascripts/channels/.keep".freeze, "test/dummy/app/assets/stylesheets/application.css".freeze, "test/dummy/app/channels/application_cable/channel.rb".freeze, "test/dummy/app/channels/application_cable/connection.rb".freeze, "test/dummy/app/controllers/application_controller.rb".freeze, "test/dummy/app/controllers/concerns/.keep".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/jobs/application_job.rb".freeze, "test/dummy/app/mailers/application_mailer.rb".freeze, "test/dummy/app/models/animal.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/bird.rb".freeze, "test/dummy/app/models/cat.rb".freeze, "test/dummy/app/models/computer.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/cpu.rb".freeze, "test/dummy/app/models/dog.rb".freeze, "test/dummy/app/models/flower.rb".freeze, "test/dummy/app/models/group.rb".freeze, "test/dummy/app/models/mainboard.rb".freeze, "test/dummy/app/models/nightingale.rb".freeze, "test/dummy/app/models/phoenix.rb".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/app/views/layouts/application.html.erb".freeze, "test/dummy/app/views/layouts/mailer.html.erb".freeze, "test/dummy/app/views/layouts/mailer.text.erb".freeze, "test/dummy/bin/bundle".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/bin/update".freeze, "test/dummy/bin/yarn".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/cable.yml".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/development.rb".freeze, "test/dummy/config/environments/production.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/initializers/application_controller_renderer.rb".freeze, "test/dummy/config/initializers/assets.rb".freeze, "test/dummy/config/initializers/backtrace_silencers.rb".freeze, "test/dummy/config/initializers/cookies_serializer.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/mime_types.rb".freeze, "test/dummy/config/initializers/rails_ops.rb".freeze, "test/dummy/config/initializers/wrap_parameters.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/config/secrets.yml".freeze, "test/dummy/config/spring.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/lib/assets/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/package.json".freeze, "test/dummy/public/404.html".freeze, "test/dummy/public/422.html".freeze, "test/dummy/public/500.html".freeze, "test/dummy/public/apple-touch-icon-precomposed.png".freeze, "test/dummy/public/apple-touch-icon.png".freeze, "test/dummy/public/favicon.ico".freeze, "test/dummy/tmp/.keep".freeze, "test/test_helper.rb".freeze, "test/unit/rails_ops/generators/operation_generator_test.rb".freeze, "test/unit/rails_ops/mixins/model/deep_nesting_test.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/load_test.rb".freeze, "test/unit/rails_ops/operation/model/sti_test.rb".freeze, "test/unit/rails_ops/operation/model/update_test.rb".freeze, "test/unit/rails_ops/operation/model_test.rb".freeze, "test/unit/rails_ops/operation/update_auth_test.rb".freeze, "test/unit/rails_ops/operation/update_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze]
13
+ s.rubygems_version = "3.4.6".freeze
14
14
  s.summary = "An operations service layer for rails projects.".freeze
15
- s.test_files = ["test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/assets/config/manifest.js".freeze, "test/dummy/app/assets/images/.keep".freeze, "test/dummy/app/assets/javascripts/application.js".freeze, "test/dummy/app/assets/javascripts/cable.js".freeze, "test/dummy/app/assets/javascripts/channels/.keep".freeze, "test/dummy/app/assets/stylesheets/application.css".freeze, "test/dummy/app/channels/application_cable/channel.rb".freeze, "test/dummy/app/channels/application_cable/connection.rb".freeze, "test/dummy/app/controllers/application_controller.rb".freeze, "test/dummy/app/controllers/concerns/.keep".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/jobs/application_job.rb".freeze, "test/dummy/app/mailers/application_mailer.rb".freeze, "test/dummy/app/models/animal.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/bird.rb".freeze, "test/dummy/app/models/cat.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/dog.rb".freeze, "test/dummy/app/models/flower.rb".freeze, "test/dummy/app/models/group.rb".freeze, "test/dummy/app/models/nightingale.rb".freeze, "test/dummy/app/models/phoenix.rb".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/app/views/layouts/application.html.erb".freeze, "test/dummy/app/views/layouts/mailer.html.erb".freeze, "test/dummy/app/views/layouts/mailer.text.erb".freeze, "test/dummy/bin/bundle".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/bin/update".freeze, "test/dummy/bin/yarn".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/cable.yml".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/development.rb".freeze, "test/dummy/config/environments/production.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/initializers/application_controller_renderer.rb".freeze, "test/dummy/config/initializers/assets.rb".freeze, "test/dummy/config/initializers/backtrace_silencers.rb".freeze, "test/dummy/config/initializers/cookies_serializer.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/mime_types.rb".freeze, "test/dummy/config/initializers/rails_ops.rb".freeze, "test/dummy/config/initializers/wrap_parameters.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/config/secrets.yml".freeze, "test/dummy/config/spring.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/lib/assets/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/package.json".freeze, "test/dummy/public/404.html".freeze, "test/dummy/public/422.html".freeze, "test/dummy/public/500.html".freeze, "test/dummy/public/apple-touch-icon-precomposed.png".freeze, "test/dummy/public/apple-touch-icon.png".freeze, "test/dummy/public/favicon.ico".freeze, "test/dummy/tmp/.keep".freeze, "test/test_helper.rb".freeze, "test/unit/rails_ops/generators/operation_generator_test.rb".freeze, "test/unit/rails_ops/mixins/model/nesting.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/load_test.rb".freeze, "test/unit/rails_ops/operation/model/sti_test.rb".freeze, "test/unit/rails_ops/operation/model/update_test.rb".freeze, "test/unit/rails_ops/operation/model_test.rb".freeze, "test/unit/rails_ops/operation/update_auth_test.rb".freeze, "test/unit/rails_ops/operation/update_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze]
15
+ s.test_files = ["test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/assets/config/manifest.js".freeze, "test/dummy/app/assets/images/.keep".freeze, "test/dummy/app/assets/javascripts/application.js".freeze, "test/dummy/app/assets/javascripts/cable.js".freeze, "test/dummy/app/assets/javascripts/channels/.keep".freeze, "test/dummy/app/assets/stylesheets/application.css".freeze, "test/dummy/app/channels/application_cable/channel.rb".freeze, "test/dummy/app/channels/application_cable/connection.rb".freeze, "test/dummy/app/controllers/application_controller.rb".freeze, "test/dummy/app/controllers/concerns/.keep".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/jobs/application_job.rb".freeze, "test/dummy/app/mailers/application_mailer.rb".freeze, "test/dummy/app/models/animal.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/bird.rb".freeze, "test/dummy/app/models/cat.rb".freeze, "test/dummy/app/models/computer.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/cpu.rb".freeze, "test/dummy/app/models/dog.rb".freeze, "test/dummy/app/models/flower.rb".freeze, "test/dummy/app/models/group.rb".freeze, "test/dummy/app/models/mainboard.rb".freeze, "test/dummy/app/models/nightingale.rb".freeze, "test/dummy/app/models/phoenix.rb".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/app/views/layouts/application.html.erb".freeze, "test/dummy/app/views/layouts/mailer.html.erb".freeze, "test/dummy/app/views/layouts/mailer.text.erb".freeze, "test/dummy/bin/bundle".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/bin/update".freeze, "test/dummy/bin/yarn".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/cable.yml".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/development.rb".freeze, "test/dummy/config/environments/production.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/initializers/application_controller_renderer.rb".freeze, "test/dummy/config/initializers/assets.rb".freeze, "test/dummy/config/initializers/backtrace_silencers.rb".freeze, "test/dummy/config/initializers/cookies_serializer.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/mime_types.rb".freeze, "test/dummy/config/initializers/rails_ops.rb".freeze, "test/dummy/config/initializers/wrap_parameters.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/config/secrets.yml".freeze, "test/dummy/config/spring.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/lib/assets/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/package.json".freeze, "test/dummy/public/404.html".freeze, "test/dummy/public/422.html".freeze, "test/dummy/public/500.html".freeze, "test/dummy/public/apple-touch-icon-precomposed.png".freeze, "test/dummy/public/apple-touch-icon.png".freeze, "test/dummy/public/favicon.ico".freeze, "test/dummy/tmp/.keep".freeze, "test/test_helper.rb".freeze, "test/unit/rails_ops/generators/operation_generator_test.rb".freeze, "test/unit/rails_ops/mixins/model/deep_nesting_test.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/load_test.rb".freeze, "test/unit/rails_ops/operation/model/sti_test.rb".freeze, "test/unit/rails_ops/operation/model/update_test.rb".freeze, "test/unit/rails_ops/operation/model_test.rb".freeze, "test/unit/rails_ops/operation/update_auth_test.rb".freeze, "test/unit/rails_ops/operation/update_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze]
16
16
 
17
- if s.respond_to? :specification_version then
18
- s.specification_version = 4
19
- end
17
+ s.specification_version = 4
20
18
 
21
- if s.respond_to? :add_runtime_dependency then
22
- s.add_development_dependency(%q<appraisal>.freeze, [">= 0"])
23
- s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
24
- s.add_development_dependency(%q<rake>.freeze, [">= 0"])
25
- s.add_development_dependency(%q<sqlite3>.freeze, [">= 0"])
26
- s.add_development_dependency(%q<cancancan>.freeze, [">= 0"])
27
- s.add_development_dependency(%q<pry>.freeze, [">= 0"])
28
- s.add_development_dependency(%q<colorize>.freeze, [">= 0"])
29
- s.add_development_dependency(%q<rubocop>.freeze, ["= 0.47.1"])
30
- s.add_development_dependency(%q<sprockets-rails>.freeze, [">= 0"])
31
- s.add_runtime_dependency(%q<active_type>.freeze, [">= 1.3.0"])
32
- s.add_runtime_dependency(%q<minitest>.freeze, [">= 0"])
33
- s.add_runtime_dependency(%q<rails>.freeze, [">= 0"])
34
- s.add_runtime_dependency(%q<request_store>.freeze, [">= 0"])
35
- s.add_runtime_dependency(%q<schemacop>.freeze, [">= 2.4.2", "<= 3.1"])
36
- else
37
- s.add_dependency(%q<appraisal>.freeze, [">= 0"])
38
- s.add_dependency(%q<bundler>.freeze, [">= 0"])
39
- s.add_dependency(%q<rake>.freeze, [">= 0"])
40
- s.add_dependency(%q<sqlite3>.freeze, [">= 0"])
41
- s.add_dependency(%q<cancancan>.freeze, [">= 0"])
42
- s.add_dependency(%q<pry>.freeze, [">= 0"])
43
- s.add_dependency(%q<colorize>.freeze, [">= 0"])
44
- s.add_dependency(%q<rubocop>.freeze, ["= 0.47.1"])
45
- s.add_dependency(%q<sprockets-rails>.freeze, [">= 0"])
46
- s.add_dependency(%q<active_type>.freeze, [">= 1.3.0"])
47
- s.add_dependency(%q<minitest>.freeze, [">= 0"])
48
- s.add_dependency(%q<rails>.freeze, [">= 0"])
49
- s.add_dependency(%q<request_store>.freeze, [">= 0"])
50
- s.add_dependency(%q<schemacop>.freeze, [">= 2.4.2", "<= 3.1"])
51
- end
19
+ s.add_development_dependency(%q<appraisal>.freeze, [">= 0"])
20
+ s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
21
+ s.add_development_dependency(%q<rake>.freeze, [">= 0"])
22
+ s.add_development_dependency(%q<sqlite3>.freeze, [">= 0"])
23
+ s.add_development_dependency(%q<cancancan>.freeze, [">= 0"])
24
+ s.add_development_dependency(%q<pry>.freeze, [">= 0"])
25
+ s.add_development_dependency(%q<colorize>.freeze, [">= 0"])
26
+ s.add_development_dependency(%q<rubocop>.freeze, ["= 0.47.1"])
27
+ s.add_development_dependency(%q<sprockets-rails>.freeze, [">= 0"])
28
+ s.add_runtime_dependency(%q<active_type>.freeze, [">= 1.3.0"])
29
+ s.add_runtime_dependency(%q<minitest>.freeze, [">= 0"])
30
+ s.add_runtime_dependency(%q<rails>.freeze, [">= 0"])
31
+ s.add_runtime_dependency(%q<request_store>.freeze, [">= 0"])
32
+ s.add_runtime_dependency(%q<schemacop>.freeze, [">= 2.4.2", "<= 3.1"])
52
33
  end
@@ -0,0 +1,3 @@
1
+ class Computer < ApplicationRecord
2
+ belongs_to :mainboard, optional: true, autosave: false, validate: true
3
+ end
@@ -0,0 +1,2 @@
1
+ class Cpu < ApplicationRecord
2
+ end
@@ -0,0 +1,3 @@
1
+ class Mainboard < ApplicationRecord
2
+ belongs_to :cpu, optional: true, autosave: false, validate: true
3
+ end
@@ -14,4 +14,18 @@ ActiveRecord::Schema.define do
14
14
  create_table :flowers, force: true do |t|
15
15
  t.boolean :planted, null: false, default: true
16
16
  end
17
+
18
+ create_table :computers, force: true do |t|
19
+ t.string :name
20
+ t.references :mainboard
21
+ end
22
+
23
+ create_table :mainboards, force: true do |t|
24
+ t.string :name
25
+ t.references :cpu
26
+ end
27
+
28
+ create_table :cpus, force: true do |t|
29
+ t.string :name
30
+ end
17
31
  end
@@ -0,0 +1,144 @@
1
+ require 'test_helper'
2
+
3
+ class RailsOps::Mixins::Model::DeepNestingTest < ActiveSupport::TestCase
4
+ include TestHelper
5
+
6
+ CPU_CREATION_OP = Class.new(RailsOps::Operation::Model::Create) do
7
+ model Cpu do
8
+ validates :name, presence: true
9
+ end
10
+ end
11
+
12
+ MAINBOARD_CREATION_OP = Class.new(RailsOps::Operation::Model::Create) do
13
+ model Mainboard do
14
+ validates :name, presence: true
15
+ end
16
+
17
+ nest_model_op :cpu, CPU_CREATION_OP
18
+ end
19
+
20
+ COMPUTER_CREATION_OP = Class.new(RailsOps::Operation::Model::Create) do
21
+ model Computer do
22
+ validates :name, presence: true
23
+ end
24
+
25
+ nest_model_op :mainboard, MAINBOARD_CREATION_OP
26
+ end
27
+
28
+ def test_create_cpu
29
+ assert_nothing_raised do
30
+ CPU_CREATION_OP.run!(cpu: { name: 'CPU' })
31
+ end
32
+ end
33
+
34
+ def test_create_mainboard
35
+ assert_nothing_raised do
36
+ MAINBOARD_CREATION_OP.run!(
37
+ mainboard: {
38
+ name: 'Mainboard',
39
+ cpu_attributes: {
40
+ name: 'CPU'
41
+ }
42
+ }
43
+ )
44
+ end
45
+ end
46
+
47
+ def test_create_computer_success
48
+ model = assert_nothing_raised do
49
+ COMPUTER_CREATION_OP.run!(
50
+ computer: {
51
+ name: 'Computer',
52
+
53
+ mainboard_attributes: {
54
+ name: 'Mainboard',
55
+
56
+ cpu_attributes: {
57
+ name: 'CPU'
58
+ }
59
+ }
60
+ }
61
+ ).model
62
+ end
63
+
64
+ assert 'Computer', model.persisted?
65
+ assert 'Mainboard', model.mainboard.persisted?
66
+ assert 'CPU', model.mainboard.cpu.persisted?
67
+
68
+ assert_equal 'Computer', model.name
69
+ assert_equal 'Mainboard', model.mainboard.name
70
+ assert_equal 'CPU', model.mainboard.cpu.name
71
+ end
72
+
73
+ def test_create_computer_level_1_validation_error
74
+ op = COMPUTER_CREATION_OP.new(
75
+ computer: {
76
+ mainboard_attributes: {
77
+ name: 'Mainboard',
78
+
79
+ cpu_attributes: {
80
+ name: 'CPU'
81
+ }
82
+ }
83
+ }
84
+ )
85
+
86
+ assert_raises_with_message ActiveRecord::RecordInvalid, /Name can't be blank/ do
87
+ op.run!
88
+ end
89
+
90
+ assert_equal ["Name can't be blank"], op.model.errors.full_messages
91
+ refute op.model.persisted?
92
+ end
93
+
94
+ def test_create_computer_level_2_validation_error
95
+ op = COMPUTER_CREATION_OP.new(
96
+ computer: {
97
+ name: 'Computer',
98
+
99
+ mainboard_attributes: {
100
+ cpu_attributes: {
101
+ name: 'CPU'
102
+ }
103
+ }
104
+ }
105
+ )
106
+
107
+ assert_raises_with_message ActiveRecord::RecordInvalid, /Mainboard is invalid/ do
108
+ op.run!
109
+ end
110
+
111
+ assert_equal ["Mainboard is invalid"], op.model.errors.full_messages
112
+ refute op.model.persisted?
113
+
114
+ assert_equal ["Name can't be blank"], op.model.mainboard.errors.full_messages
115
+ refute op.model.mainboard.persisted?
116
+ end
117
+
118
+ def test_create_computer_level_3_validation_error
119
+ op = COMPUTER_CREATION_OP.new(
120
+ computer: {
121
+ name: 'Computer',
122
+
123
+ mainboard_attributes: {
124
+ name: 'Mainboard',
125
+
126
+ cpu_attributes: {}
127
+ }
128
+ }
129
+ )
130
+
131
+ assert_raises_with_message ActiveRecord::RecordInvalid, /Mainboard is invalid/ do
132
+ op.run!
133
+ end
134
+
135
+ assert_equal ["Mainboard is invalid"], op.model.errors.full_messages
136
+ refute op.model.persisted?
137
+
138
+ assert_equal ["Cpu is invalid"], op.model.mainboard.errors.full_messages
139
+ refute op.model.mainboard.persisted?
140
+
141
+ assert_equal ["Name can't be blank"], op.model.mainboard.cpu.errors.full_messages
142
+ refute op.model.mainboard.cpu.persisted?
143
+ end
144
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_ops
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-23 00:00:00.000000000 Z
11
+ date: 2023-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: appraisal
@@ -307,10 +307,13 @@ files:
307
307
  - test/dummy/app/models/application_record.rb
308
308
  - test/dummy/app/models/bird.rb
309
309
  - test/dummy/app/models/cat.rb
310
+ - test/dummy/app/models/computer.rb
310
311
  - test/dummy/app/models/concerns/.keep
312
+ - test/dummy/app/models/cpu.rb
311
313
  - test/dummy/app/models/dog.rb
312
314
  - test/dummy/app/models/flower.rb
313
315
  - test/dummy/app/models/group.rb
316
+ - test/dummy/app/models/mainboard.rb
314
317
  - test/dummy/app/models/nightingale.rb
315
318
  - test/dummy/app/models/phoenix.rb
316
319
  - test/dummy/app/models/user.rb
@@ -359,7 +362,7 @@ files:
359
362
  - test/dummy/tmp/.keep
360
363
  - test/test_helper.rb
361
364
  - test/unit/rails_ops/generators/operation_generator_test.rb
362
- - test/unit/rails_ops/mixins/model/nesting.rb
365
+ - test/unit/rails_ops/mixins/model/deep_nesting_test.rb
363
366
  - test/unit/rails_ops/mixins/param_authorization_test.rb
364
367
  - test/unit/rails_ops/mixins/policies_test.rb
365
368
  - test/unit/rails_ops/operation/model/create_test.rb
@@ -388,7 +391,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
388
391
  - !ruby/object:Gem::Version
389
392
  version: '0'
390
393
  requirements: []
391
- rubygems_version: 3.2.15
394
+ rubygems_version: 3.0.3.1
392
395
  signing_key:
393
396
  specification_version: 4
394
397
  summary: An operations service layer for rails projects.
@@ -413,10 +416,13 @@ test_files:
413
416
  - test/dummy/app/models/application_record.rb
414
417
  - test/dummy/app/models/bird.rb
415
418
  - test/dummy/app/models/cat.rb
419
+ - test/dummy/app/models/computer.rb
416
420
  - test/dummy/app/models/concerns/.keep
421
+ - test/dummy/app/models/cpu.rb
417
422
  - test/dummy/app/models/dog.rb
418
423
  - test/dummy/app/models/flower.rb
419
424
  - test/dummy/app/models/group.rb
425
+ - test/dummy/app/models/mainboard.rb
420
426
  - test/dummy/app/models/nightingale.rb
421
427
  - test/dummy/app/models/phoenix.rb
422
428
  - test/dummy/app/models/user.rb
@@ -465,7 +471,7 @@ test_files:
465
471
  - test/dummy/tmp/.keep
466
472
  - test/test_helper.rb
467
473
  - test/unit/rails_ops/generators/operation_generator_test.rb
468
- - test/unit/rails_ops/mixins/model/nesting.rb
474
+ - test/unit/rails_ops/mixins/model/deep_nesting_test.rb
469
475
  - test/unit/rails_ops/mixins/param_authorization_test.rb
470
476
  - test/unit/rails_ops/mixins/policies_test.rb
471
477
  - test/unit/rails_ops/operation/model/create_test.rb
@@ -1,60 +0,0 @@
1
- require 'test_helper'
2
-
3
- class RailsOps::Mixins::Model::NestingTest < ActiveSupport::TestCase
4
- include TestHelper
5
-
6
- GROUP_CREATION_OP = Class.new RailsOps::Operation::Model::Create do
7
- model Group do
8
- validates :name, presence: true
9
- end
10
- end
11
-
12
- BASIC_OP = Class.new RailsOps::Operation::Model::Create do
13
- model User do
14
- end
15
- nest_model_op :group, GROUP_CREATION_OP
16
- end
17
-
18
- def test_has_many_basic
19
- BASIC_OP.run!(
20
- user: {
21
- name: 'test',
22
- group_attributes: {
23
- name: 'g1',
24
- color: 'blue'
25
- }
26
- }
27
- )
28
-
29
- assert_equal 1, User.count
30
- assert_equal 1, Group.count
31
- assert_equal 'test', User.first.name
32
- assert_equal 'g1', Group.first.name
33
- assert_equal Group.first, User.first.group
34
- assert_equal [User.first], Group.first.users
35
- end
36
-
37
- def test_has_many_validation
38
- op = BASIC_OP.new(
39
- user: {
40
- name: 'test',
41
- group_attributes: {
42
- color: 'blue'
43
- }
44
- }
45
- )
46
-
47
- assert_raises ActiveRecord::RecordInvalid do
48
- op.run!
49
- end
50
-
51
- refute op.model.persisted?
52
- refute op.model.group.persisted?
53
-
54
- assert_equal BASIC_OP.model, op.model.class
55
- assert_equal GROUP_CREATION_OP.model, op.model.group.class
56
-
57
- refute op.model.group.valid?
58
- refute op.model.valid?
59
- end
60
- end