rails_ops 1.1.24 → 1.1.28

Sign up to get free protection for your applications and to get access to all the features.
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