rails_ops 1.1.24 → 1.1.28

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rubocop.yml +17 -0
  3. data/.github/workflows/ruby.yml +37 -7
  4. data/.gitignore +2 -0
  5. data/.rubocop.yml +1 -0
  6. data/Appraisals +19 -0
  7. data/CHANGELOG.md +25 -2
  8. data/LICENSE +1 -1
  9. data/README.md +106 -13
  10. data/Rakefile +2 -0
  11. data/VERSION +1 -1
  12. data/gemfiles/rails_5.1.gemfile +7 -0
  13. data/gemfiles/rails_5.2.gemfile +7 -0
  14. data/gemfiles/rails_6.0.gemfile +7 -0
  15. data/gemfiles/rails_6.1.gemfile +7 -0
  16. data/gemfiles/rails_7.0.gemfile +7 -0
  17. data/lib/generators/operation/USAGE +21 -0
  18. data/lib/generators/operation/operation_generator.rb +64 -0
  19. data/lib/generators/operation/templates/controller.erb +56 -0
  20. data/lib/generators/operation/templates/create.erb +15 -0
  21. data/lib/generators/operation/templates/destroy.erb +13 -0
  22. data/lib/generators/operation/templates/load.erb +13 -0
  23. data/lib/generators/operation/templates/update.erb +16 -0
  24. data/lib/generators/operation/templates/view.erb +0 -0
  25. data/lib/rails_ops/mixins/model/authorization.rb +1 -3
  26. data/lib/rails_ops/model_mixins/sti_fixes.rb +2 -6
  27. data/lib/rails_ops/model_mixins/virtual_attributes/virtual_column_wrapper.rb +4 -0
  28. data/lib/rails_ops.rb +1 -13
  29. data/rails_ops.gemspec +10 -6
  30. data/test/dummy/app/models/flower.rb +7 -0
  31. data/test/dummy/config/application.rb +10 -10
  32. data/test/dummy/db/schema.rb +4 -0
  33. data/test/unit/rails_ops/generators/operation_generator_test.rb +254 -0
  34. data/test/unit/rails_ops/operation/model/create_test.rb +16 -0
  35. data/test/unit/rails_ops/operation/model/update_test.rb +71 -0
  36. metadata +56 -11
  37. data/lib/rails_ops/model_casting.rb +0 -17
  38. data/lib/rails_ops/patches/active_type_patch.rb +0 -52
data/rails_ops.gemspec CHANGED
@@ -1,24 +1,25 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: rails_ops 1.1.24 ruby lib
2
+ # stub: rails_ops 1.1.28 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "rails_ops".freeze
6
- s.version = "1.1.24"
6
+ s.version = "1.1.28"
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 = "2021-11-25"
12
- s.files = [".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".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_casting.rb".freeze, "lib/rails_ops/model_mixins.rb".freeze, "lib/rails_ops/model_mixins/ar_extension.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/patches/active_type_patch.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/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/mixins/model/nesting.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.22".freeze
11
+ s.date = "2022-02-16"
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_5.1.gemfile".freeze, "gemfiles/rails_5.2.gemfile".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/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/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.1.2".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/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/mixins/model/nesting.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/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/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
17
  if s.respond_to? :specification_version then
18
18
  s.specification_version = 4
19
19
  end
20
20
 
21
21
  if s.respond_to? :add_runtime_dependency then
22
+ s.add_development_dependency(%q<appraisal>.freeze, [">= 0"])
22
23
  s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
23
24
  s.add_development_dependency(%q<rake>.freeze, [">= 0"])
24
25
  s.add_development_dependency(%q<sqlite3>.freeze, [">= 0"])
@@ -26,12 +27,14 @@ Gem::Specification.new do |s|
26
27
  s.add_development_dependency(%q<pry>.freeze, [">= 0"])
27
28
  s.add_development_dependency(%q<colorize>.freeze, [">= 0"])
28
29
  s.add_development_dependency(%q<rubocop>.freeze, ["= 0.47.1"])
30
+ s.add_development_dependency(%q<sprockets-rails>.freeze, [">= 0"])
29
31
  s.add_runtime_dependency(%q<active_type>.freeze, [">= 1.3.0"])
30
32
  s.add_runtime_dependency(%q<minitest>.freeze, [">= 0"])
31
33
  s.add_runtime_dependency(%q<rails>.freeze, [">= 0"])
32
34
  s.add_runtime_dependency(%q<request_store>.freeze, [">= 0"])
33
35
  s.add_runtime_dependency(%q<schemacop>.freeze, [">= 2.4.2", "<= 3.1"])
34
36
  else
37
+ s.add_dependency(%q<appraisal>.freeze, [">= 0"])
35
38
  s.add_dependency(%q<bundler>.freeze, [">= 0"])
36
39
  s.add_dependency(%q<rake>.freeze, [">= 0"])
37
40
  s.add_dependency(%q<sqlite3>.freeze, [">= 0"])
@@ -39,6 +42,7 @@ Gem::Specification.new do |s|
39
42
  s.add_dependency(%q<pry>.freeze, [">= 0"])
40
43
  s.add_dependency(%q<colorize>.freeze, [">= 0"])
41
44
  s.add_dependency(%q<rubocop>.freeze, ["= 0.47.1"])
45
+ s.add_dependency(%q<sprockets-rails>.freeze, [">= 0"])
42
46
  s.add_dependency(%q<active_type>.freeze, [">= 1.3.0"])
43
47
  s.add_dependency(%q<minitest>.freeze, [">= 0"])
44
48
  s.add_dependency(%q<rails>.freeze, [">= 0"])
@@ -0,0 +1,7 @@
1
+ class Flower < ApplicationRecord
2
+ # default_scope ->() { where(planted: true) }
3
+
4
+ def self.default_scope
5
+ where(planted: true)
6
+ end
7
+ end
@@ -2,16 +2,16 @@ require_relative 'boot'
2
2
 
3
3
  require 'rails'
4
4
 
5
- require "active_model/railtie"
6
- require "active_job/railtie"
7
- require "active_record/railtie"
5
+ require 'active_model/railtie'
6
+ require 'active_job/railtie'
7
+ require 'active_record/railtie'
8
8
  # require "active_storage/engine"
9
- require "action_controller/railtie"
10
- require "action_mailer/railtie"
11
- require "action_view/railtie"
12
- require "action_cable/engine"
13
- require "sprockets/railtie"
14
- require "rails/test_unit/railtie"
9
+ require 'action_controller/railtie'
10
+ require 'action_mailer/railtie'
11
+ require 'action_view/railtie'
12
+ require 'action_cable/engine'
13
+ require 'sprockets/railtie'
14
+ require 'rails/test_unit/railtie'
15
15
 
16
16
  Bundler.require(*Rails.groups)
17
17
  require 'rails_ops'
@@ -19,7 +19,7 @@ require 'rails_ops'
19
19
  module Dummy
20
20
  class Application < Rails::Application
21
21
  # Initialize configuration defaults for originally generated Rails version.
22
- config.load_defaults 5.1
22
+ config.load_defaults "#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}"
23
23
 
24
24
  # Settings in config/environments/* take precedence over those specified here.
25
25
  # Application configuration should go into files in config/initializers
@@ -10,4 +10,8 @@ ActiveRecord::Schema.define do
10
10
  create_table :animals, force: true do |t|
11
11
  t.string :type
12
12
  end
13
+
14
+ create_table :flowers, force: true do |t|
15
+ t.boolean :planted, null: false, default: true
16
+ end
13
17
  end
@@ -0,0 +1,254 @@
1
+ require 'test_helper'
2
+ require 'generators/operation/operation_generator'
3
+
4
+ class OperationGeneratorTest < Rails::Generators::TestCase
5
+ tests OperationGenerator
6
+ destination File.expand_path('../../../tmp', File.dirname(__FILE__))
7
+
8
+ setup do
9
+ prepare_destination
10
+
11
+ # Add an empty routes file
12
+ Dir.mkdir(File.join(destination_root, 'config'))
13
+ File.open(File.join(destination_root, 'config', 'routes.rb'), 'w') do |f|
14
+ f.write <<~ROUTES
15
+ Rails.application.routes.draw do
16
+ end
17
+ ROUTES
18
+ end
19
+ end
20
+
21
+ def test_all
22
+ run_generator ['User']
23
+
24
+ # Check that operations are generated
25
+ assert_operations
26
+
27
+ # Check that views are generated
28
+ assert_views
29
+
30
+ # Check that the controller is generated
31
+ assert_controller
32
+
33
+ # Check that the routes entry is added
34
+ assert_routes
35
+ end
36
+
37
+ def test_no_views
38
+ run_generator ['User', '--skip-views']
39
+
40
+ assert_operations
41
+ assert_controller
42
+ assert_routes
43
+
44
+ # Check that the views were skipped
45
+ %w(index show new edit).each do |view|
46
+ assert_no_file "app/views/users/#{view}.html.haml"
47
+ end
48
+ end
49
+
50
+ def test_no_controller
51
+ run_generator ['User', '--skip-controller']
52
+
53
+ assert_operations
54
+ assert_views
55
+ assert_routes
56
+
57
+ # Check that the controller was skipped
58
+ assert_no_file 'app/controllers/users_controller.rb'
59
+ end
60
+
61
+ def test_no_routes
62
+ run_generator ['User', '--skip-routes']
63
+
64
+ assert_operations
65
+ assert_views
66
+ assert_controller
67
+
68
+ # Check that the routes were not added
69
+ assert_file 'config/routes.rb' do |routes|
70
+ assert_no_match(/resources :users/, routes)
71
+ end
72
+ end
73
+
74
+ def test_skip_all
75
+ run_generator ['User', '--skip-controller', '--skip-routes', '--skip-views']
76
+
77
+ assert_operations
78
+
79
+ # Check that the controller was skipped
80
+ assert_no_file 'app/controllers/users_controller.rb'
81
+
82
+ # Check that the routes were not added
83
+ assert_file 'config/routes.rb' do |routes|
84
+ assert_no_match(/resources :users/, routes)
85
+ end
86
+
87
+ # Check that the views were skipped
88
+ %w(index show new edit).each do |view|
89
+ assert_no_file "app/views/users/#{view}.html.haml"
90
+ end
91
+ end
92
+
93
+ def test_only_operations
94
+ run_generator ['User', '--only-operations']
95
+
96
+ assert_operations
97
+
98
+ # Check that the controller was skipped
99
+ assert_no_file 'app/controllers/users_controller.rb'
100
+
101
+ # Check that the routes were not added
102
+ assert_file 'config/routes.rb' do |routes|
103
+ assert_no_match(/resources :users/, routes)
104
+ end
105
+
106
+ # Check that the views were skipped
107
+ %w(index show new edit).each do |view|
108
+ assert_no_file "app/views/users/#{view}.html.haml"
109
+ end
110
+ end
111
+
112
+ def test_lowercase_name
113
+ run_generator ['user']
114
+
115
+ # Check that operations are generated
116
+ assert_operations
117
+
118
+ # Check that views are generated
119
+ assert_views
120
+
121
+ # Check that the controller is generated
122
+ assert_controller
123
+
124
+ # Check that the routes entry is added
125
+ assert_routes
126
+ end
127
+
128
+ def test_module_name
129
+ optiongroups = [['User', '--module=Admin'], ['User', '--module=admin']]
130
+
131
+ optiongroups.each do |optiongroup|
132
+ run_generator optiongroup
133
+
134
+ # Check that namespaced operations are generated
135
+ assert_file 'app/operations/admin/user/create.rb' do |operation|
136
+ assert_match(/module Operations::Admin::User/, operation)
137
+ assert_match(/class Create < RailsOps::Operation::Model::Create/, operation)
138
+ assert_match(/model ::User/, operation)
139
+ end
140
+ assert_file 'app/operations/admin/user/destroy.rb' do |operation|
141
+ assert_match(/module Operations::Admin::User/, operation)
142
+ assert_match(/class Destroy < RailsOps::Operation::Model::Destroy/, operation)
143
+ assert_match(/model ::User/, operation)
144
+ end
145
+ assert_file 'app/operations/admin/user/load.rb' do |operation|
146
+ assert_match(/module Operations::Admin::User/, operation)
147
+ assert_match(/class Load < RailsOps::Operation::Model::Load/, operation)
148
+ assert_match(/model ::User/, operation)
149
+ end
150
+ assert_file 'app/operations/admin/user/update.rb' do |operation|
151
+ assert_match(/module Operations::Admin::User/, operation)
152
+ assert_match(/class Update < RailsOps::Operation::Model::Update/, operation)
153
+ assert_match(/model ::User/, operation)
154
+ end
155
+
156
+ # Check that views are generated
157
+ %w(index show new edit).each do |view|
158
+ assert_file "app/views/admin/users/#{view}.html.haml"
159
+ end
160
+
161
+ # Check that the controller is generated
162
+ assert_file 'app/controllers/admin/users_controller.rb' do |controller|
163
+ assert_match(/module Admin/, controller)
164
+ assert_match(/class UsersController < ApplicationController/, controller)
165
+ end
166
+
167
+ # Check that the routes entry is added
168
+ assert_routes
169
+ end
170
+ end
171
+
172
+ def test_nested_module_name
173
+ run_generator ['User', '--module=admin/foo']
174
+
175
+ # Check that namespaced operations are generated
176
+ assert_file 'app/operations/admin/foo/user/create.rb' do |operation|
177
+ assert_match(/module Operations::Admin::Foo::User/, operation)
178
+ assert_match(/class Create < RailsOps::Operation::Model::Create/, operation)
179
+ assert_match(/model ::User/, operation)
180
+ end
181
+ assert_file 'app/operations/admin/foo/user/destroy.rb' do |operation|
182
+ assert_match(/module Operations::Admin::Foo::User/, operation)
183
+ assert_match(/class Destroy < RailsOps::Operation::Model::Destroy/, operation)
184
+ assert_match(/model ::User/, operation)
185
+ end
186
+ assert_file 'app/operations/admin/foo/user/load.rb' do |operation|
187
+ assert_match(/module Operations::Admin::Foo::User/, operation)
188
+ assert_match(/class Load < RailsOps::Operation::Model::Load/, operation)
189
+ assert_match(/model ::User/, operation)
190
+ end
191
+ assert_file 'app/operations/admin/foo/user/update.rb' do |operation|
192
+ assert_match(/module Operations::Admin::Foo::User/, operation)
193
+ assert_match(/class Update < RailsOps::Operation::Model::Update/, operation)
194
+ assert_match(/model ::User/, operation)
195
+ end
196
+
197
+ # Check that views are generated
198
+ %w(index show new edit).each do |view|
199
+ assert_file "app/views/admin/foo/users/#{view}.html.haml"
200
+ end
201
+
202
+ # Check that the controller is generated
203
+ assert_file 'app/controllers/admin/foo/users_controller.rb' do |controller|
204
+ assert_match(/module Admin::Foo/, controller)
205
+ assert_match(/class UsersController < ApplicationController/, controller)
206
+ end
207
+
208
+ # Check that the routes entry is added
209
+ assert_routes
210
+ end
211
+
212
+ private
213
+
214
+ def assert_operations
215
+ assert_file 'app/operations/user/create.rb' do |operation|
216
+ assert_match(/module Operations::User/, operation)
217
+ assert_match(/class Create < RailsOps::Operation::Model::Create/, operation)
218
+ assert_match(/model ::User/, operation)
219
+ end
220
+ assert_file 'app/operations/user/destroy.rb' do |operation|
221
+ assert_match(/module Operations::User/, operation)
222
+ assert_match(/class Destroy < RailsOps::Operation::Model::Destroy/, operation)
223
+ assert_match(/model ::User/, operation)
224
+ end
225
+ assert_file 'app/operations/user/load.rb' do |operation|
226
+ assert_match(/module Operations::User/, operation)
227
+ assert_match(/class Load < RailsOps::Operation::Model::Load/, operation)
228
+ assert_match(/model ::User/, operation)
229
+ end
230
+ assert_file 'app/operations/user/update.rb' do |operation|
231
+ assert_match(/module Operations::User/, operation)
232
+ assert_match(/class Update < RailsOps::Operation::Model::Update/, operation)
233
+ assert_match(/model ::User/, operation)
234
+ end
235
+ end
236
+
237
+ def assert_views
238
+ %w(index show new edit).each do |view|
239
+ assert_file "app/views/users/#{view}.html.haml"
240
+ end
241
+ end
242
+
243
+ def assert_controller
244
+ assert_file 'app/controllers/users_controller.rb' do |controller|
245
+ assert_match(/class UsersController < ApplicationController/, controller)
246
+ end
247
+ end
248
+
249
+ def assert_routes
250
+ assert_file 'config/routes.rb' do |routes|
251
+ assert_match(/resources :users/, routes)
252
+ end
253
+ end
254
+ end
@@ -7,6 +7,22 @@ class RailsOps::Operation::Model::CreateTest < ActiveSupport::TestCase
7
7
  model Group
8
8
  end
9
9
 
10
+ ATTR_OP = Class.new(RailsOps::Operation::Model::Create) do
11
+ model ::Group do
12
+ attribute :long_group_name
13
+ end
14
+ end
15
+
16
+ def test_attribute
17
+ op = ATTR_OP.run!(group: { name: 'Test', color: 'red', long_group_name: 'Testgroup for extended testing' })
18
+
19
+ assert_equal 'Test', op.model.name
20
+ assert_equal 'red', op.model.color
21
+ assert_equal 'Testgroup for extended testing', op.model.long_group_name
22
+ assert op.model.persisted?
23
+ refute op.model.changed?
24
+ end
25
+
10
26
  def test_basic
11
27
  op = BASIC_OP.run!(group: { name: 'test', color: 'red' })
12
28
 
@@ -7,6 +7,35 @@ class RailsOps::Operation::Model::UpdateTest < ActiveSupport::TestCase
7
7
  model Group
8
8
  end
9
9
 
10
+ FLOWER_OP = Class.new(RailsOps::Operation::Model::Update) do
11
+ model Flower do
12
+ attribute :color
13
+
14
+ def optimal_bpm
15
+ 174
16
+ end
17
+ end
18
+ end
19
+
20
+ SECOND_FLOWER_OP = Class.new(RailsOps::Operation::Model::Update) do
21
+ model Flower do
22
+ validate :planted_is_true
23
+ before_update :do_calculation
24
+
25
+ def response_to_everything
26
+ 42
27
+ end
28
+
29
+ def planted_is_true
30
+ errors.add(:planted, 'Needs to be true') unless planted?
31
+ end
32
+
33
+ def do_calculation
34
+ 1 + 1
35
+ end
36
+ end
37
+ end
38
+
10
39
  def test_basic
11
40
  g = Group.create
12
41
  op = BASIC_OP.new(id: g.id)
@@ -19,4 +48,46 @@ class RailsOps::Operation::Model::UpdateTest < ActiveSupport::TestCase
19
48
  op = BASIC_OP.new(id: g.id)
20
49
  assert_equal op, op.model.parent_op
21
50
  end
51
+
52
+ def test_issue_59992
53
+ flower1 = Flower.create!(planted: true)
54
+ flower2 = Flower.create!(planted: false)
55
+
56
+ op = FLOWER_OP.new(id: flower1.id)
57
+
58
+ assert op.model.respond_to?(:color)
59
+ assert op.model.is_a?(FLOWER_OP.model)
60
+
61
+ op.model.color = :red
62
+
63
+ assert_equal :red, op.model.color
64
+
65
+ op = FLOWER_OP.new(id: flower2.id)
66
+
67
+ assert_raises ActiveRecord::RecordNotFound do
68
+ op.model
69
+ end
70
+ end
71
+
72
+ def test_validation
73
+ flower = Flower.create!(planted: true)
74
+ assert flower.planted
75
+
76
+ # This works fine
77
+ op1 = SECOND_FLOWER_OP.run!(id: flower.id, flower: { planted: true })
78
+ assert_equal 42, op1.model.response_to_everything
79
+ assert op1.model.respond_to?(:response_to_everything)
80
+ assert op1.model.respond_to?(:planted_is_true)
81
+ refute op1.model.respond_to?(:optimal_bpm)
82
+
83
+ # This fails in Rails 7 and ruby 3.1.0, as the validation seems to be triggered
84
+ # in this as well, even though the validation is not defined here
85
+ # More interesting, it seems that only the validation and the before_update
86
+ # are handled incorrectly, the other methods work fine
87
+ op2 = FLOWER_OP.run!(id: flower.id, flower: { planted: true })
88
+ assert_equal 174, op2.model.optimal_bpm
89
+ assert op2.model.respond_to?(:optimal_bpm)
90
+ refute op2.model.respond_to?(:planted_is_true)
91
+ refute op2.model.respond_to?(:response_to_everything)
92
+ end
22
93
  end