rails_ops 1.7.0 → 1.7.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 010b1029e9dfdeef808a17c61fb3b5b6f47749b363962234a472d7b59f2830c3
4
- data.tar.gz: f8ba45974bd863da77b7c5d27530bd94d6b4a9b04962848d948799d2fa5e37c4
3
+ metadata.gz: c17daad4e6d8e1d04943b73574b3fc6cbe3beed71c6d698a25f112431d9eece2
4
+ data.tar.gz: a569daf8bb6737cbba7cb1c4b8402595be565532757939f560ab5eea8f2b06ce
5
5
  SHA512:
6
- metadata.gz: 7bef9d33ac6d02a9a6634d8a4fcabce53bfad4abc4d589cef63f51e2aceebb751bba4a3e65c7462b7fe670d0bed0b94a334b3d0c9b119c43b26ac62dd2ae90e7
7
- data.tar.gz: c382da348b07a9b4ed75d184defcd15bc6d26470158d0ab717ef919de7fd2fa8c4e3443be235be42a01eb63fcf760baf71365c851ce2e02fa50f07dbf52b21fc
6
+ metadata.gz: 7808e266d338deed54af3a8111b0dbf3c4364d6885bd09100898e629df57f0b1fb07dc5759d57fb5847770660ac050d39ebdc4e53bef6140131d68d8098360f9
7
+ data.tar.gz: 4c7c95588ec9b664e71d4a5dba6f3c74425db902eb0b20d7060ce72c9a4b3dc462e2fead2f0158f13178d58f29c936a3e2c422f8a748d71b7610504e3199194e
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.7.2 (2025-04-14)
4
+
5
+ * Add lazy load hooks
6
+
7
+ ## 1.7.1 (2025-01-31)
8
+
9
+ * Raise exception when using `model_authorization_action` in operations inheriting
10
+ directly from `RailsOps::Operation::Model::Load`. In `1.6.0`, this method was
11
+ renamed to `load_model_authorization_action` for these operations. Using
12
+ `model_authorization_action` was still possible, but RailsOps silently ignored
13
+ this. This release ensures that Load operations use the correct DSL method to
14
+ change authorization actions.
15
+
3
16
  ## 1.7.0 (2025-01-30)
4
17
 
5
18
  * Introduce new `:before_attr_assign` policy chain which allows to
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rails_ops (1.7.0)
4
+ rails_ops (1.7.2)
5
5
  active_type (>= 1.3.0)
6
6
  minitest
7
7
  rails (> 4)
data/README.md CHANGED
@@ -1833,6 +1833,24 @@ Of course, at this point, the operations will need some adaptions, especially th
1833
1833
  [parameter schemas](#validating-params), and the controllers need the logic for the
1834
1834
  success and failure cases, as this depends on your application.
1835
1835
 
1836
+ Lazy Load Hooks
1837
+ ---------------
1838
+
1839
+ RailsOps provides the following [Rails Lazy Load
1840
+ Hooks](https://api.rubyonrails.org/v7.1.3.4/classes/ActiveSupport/LazyLoadHooks.html):
1841
+
1842
+ - `rails_ops_op_model_create` for `RailsOps::Operation::Model::Create`
1843
+ - `rails_ops_op_model_destroy` for `RailsOps::Operation::Model::Destroy`
1844
+ - `rails_ops_op_model_load` for `RailsOps::Operation::Model::Load`
1845
+ - `rails_ops_op_model_update` for `RailsOps::Operation::Model::Update`
1846
+ - `rails_ops_op` for `RailsOps::Operation`
1847
+
1848
+ Example usage:
1849
+
1850
+ ```ruby
1851
+ ActiveSupport.on_load(:rails_ops_op_model_create) { include MyMixin }
1852
+ ```
1853
+
1836
1854
  Caveats
1837
1855
  -------
1838
1856
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.7.0
1
+ 1.7.2
@@ -24,6 +24,8 @@ module RailsOps::Mixins::Model::Authorization
24
24
  return _model_authorization_action
25
25
  end
26
26
 
27
+ alias original_authorization_action model_authorization_action
28
+
27
29
  # This wraps the original method
28
30
  # {RailsOps::Mixins::ParamAuthorization::ClassClassMethods.authorize_param}
29
31
  # to automatically use `authorize_model_with_authorize_only` and pass the
@@ -33,3 +33,5 @@ class RailsOps::Operation::Model::Create < RailsOps::Operation::Model
33
33
  save!
34
34
  end
35
35
  end
36
+
37
+ ActiveSupport.run_load_hooks(:rails_ops_op_model_create, RailsOps::Operation::Model::Create)
@@ -1,4 +1,8 @@
1
1
  class RailsOps::Operation::Model::Destroy < RailsOps::Operation::Model::Load
2
+ def self.model_authorization_action(*args, **kwargs, &block)
3
+ original_authorization_action(*args, **kwargs, &block)
4
+ end
5
+
2
6
  model_authorization_action :destroy
3
7
  lock_mode :exclusive
4
8
 
@@ -30,3 +34,5 @@ class RailsOps::Operation::Model::Destroy < RailsOps::Operation::Model::Load
30
34
  model.destroy!
31
35
  end
32
36
  end
37
+
38
+ ActiveSupport.run_load_hooks(:rails_ops_op_model_destroy, RailsOps::Operation::Model::Destroy)
@@ -31,6 +31,11 @@ class RailsOps::Operation::Model::Load < RailsOps::Operation::Model
31
31
 
32
32
  load_model_authorization_action :read
33
33
 
34
+ def self.model_authorization_action(*args, **kwargs, &block)
35
+ fail 'Using `model_authorization_action` in operations inheriting from RailsOps::Operation::Model::Load ' \
36
+ 'is not allowed, as this action will not be checked in `Load` operations. Use `load_model_authorization_action` instead.'
37
+ end
38
+
34
39
  def self.lock_model_at_build(enabled = true)
35
40
  self._lock_model_at_build = enabled
36
41
  end
@@ -137,3 +142,5 @@ class RailsOps::Operation::Model::Load < RailsOps::Operation::Model
137
142
  return nil
138
143
  end
139
144
  end
145
+
146
+ ActiveSupport.run_load_hooks(:rails_ops_op_model_load, RailsOps::Operation::Model::Load)
@@ -1,4 +1,8 @@
1
1
  class RailsOps::Operation::Model::Update < RailsOps::Operation::Model::Load
2
+ def self.model_authorization_action(*args, **kwargs, &block)
3
+ original_authorization_action(*args, **kwargs, &block)
4
+ end
5
+
2
6
  model_authorization_action :update
3
7
  lock_mode :exclusive
4
8
 
@@ -57,3 +61,5 @@ class RailsOps::Operation::Model::Update < RailsOps::Operation::Model::Load
57
61
  save!
58
62
  end
59
63
  end
64
+
65
+ ActiveSupport.run_load_hooks(:rails_ops_op_model_update, RailsOps::Operation::Model::Update)
@@ -194,3 +194,5 @@ class RailsOps::Operation::Model < RailsOps::Operation
194
194
  fail NotImplementedError, 'Method `build_model` must be implemented.'
195
195
  end
196
196
  end
197
+
198
+ ActiveSupport.run_load_hooks(:rails_ops_op_model, RailsOps::Operation::Model)
@@ -246,3 +246,5 @@ class RailsOps::Operation
246
246
  return params.inspect
247
247
  end
248
248
  end
249
+
250
+ ActiveSupport.run_load_hooks(:rails_ops_op, RailsOps::Operation)
data/rails_ops.gemspec CHANGED
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: rails_ops 1.7.0 ruby lib
2
+ # stub: rails_ops 1.7.2 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "rails_ops".freeze
6
- s.version = "1.7.0"
6
+ s.version = "1.7.2"
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 = "2025-01-30"
11
+ s.date = "2025-04-14"
12
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, "Gemfile.lock".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, "gemfiles/rails_7.1.gemfile".freeze, "gemfiles/rails_7.2.gemfile".freeze, "gemfiles/rails_8.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/controller_wrapper.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/controllers/group_controller.rb".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/ability.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/hookup.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/hookup_test.rb".freeze, "test/unit/rails_ops/mixins/controller_test.rb".freeze, "test/unit/rails_ops/mixins/model/deep_nesting_test.rb".freeze, "test/unit/rails_ops/mixins/model/marshalling_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/auth_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/destroy_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_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze, "test/unit/rails_ops/profiler_test.rb".freeze]
13
13
  s.licenses = ["MIT".freeze]
14
14
  s.rubygems_version = "3.4.6".freeze
@@ -28,4 +28,14 @@ class RailsOps::Operation::Model::DestroyTest < ActiveSupport::TestCase
28
28
  op.run!
29
29
  end
30
30
  end
31
+
32
+ def test_model_authorization_action_permitted
33
+ assert_nothing_raised do
34
+ Class.new(RailsOps::Operation::Model::Destroy) do
35
+ model Group
36
+ load_model_authorization_action :foobar
37
+ model_authorization_action :barfoo
38
+ end
39
+ end
40
+ end
31
41
  end
@@ -52,6 +52,15 @@ class RailsOps::Operation::Model::LoadTest < ActiveSupport::TestCase
52
52
 
53
53
  def test_too_many_authorization_actions
54
54
  assert_raises_with_message ArgumentError, 'Too many arguments' do
55
+ Class.new(RailsOps::Operation::Model::Load) do
56
+ model Group
57
+ load_model_authorization_action :read, :update
58
+ end
59
+ end
60
+ end
61
+
62
+ def test_model_authorization_action_not_permitted
63
+ assert_raises_with_message RuntimeError, /Use `load_model_authorization_action` instead/ do
55
64
  Class.new(RailsOps::Operation::Model::Load) do
56
65
  model Group
57
66
  model_authorization_action :read, :update
@@ -211,4 +211,14 @@ class RailsOps::Operation::Model::UpdateTest < ActiveSupport::TestCase
211
211
  op_klass.run!(id: model.id, group: { name: 'new_name' })
212
212
  end
213
213
  end
214
+
215
+ def test_model_authorization_action_permitted
216
+ assert_nothing_raised do
217
+ Class.new(RailsOps::Operation::Model::Update) do
218
+ model Group
219
+ load_model_authorization_action :foobar
220
+ model_authorization_action :barfoo
221
+ end
222
+ end
223
+ end
214
224
  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.7.0
4
+ version: 1.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-30 00:00:00.000000000 Z
11
+ date: 2025-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_type
@@ -86,8 +86,8 @@ dependencies:
86
86
  - - "<="
87
87
  - !ruby/object:Gem::Version
88
88
  version: '3.1'
89
- description:
90
- email:
89
+ description:
90
+ email:
91
91
  executables: []
92
92
  extensions: []
93
93
  extra_rdoc_files: []
@@ -260,11 +260,11 @@ files:
260
260
  - test/unit/rails_ops/operation/update_lazy_auth_test.rb
261
261
  - test/unit/rails_ops/operation_test.rb
262
262
  - test/unit/rails_ops/profiler_test.rb
263
- homepage:
263
+ homepage:
264
264
  licenses:
265
265
  - MIT
266
266
  metadata: {}
267
- post_install_message:
267
+ post_install_message:
268
268
  rdoc_options: []
269
269
  require_paths:
270
270
  - lib
@@ -279,8 +279,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
279
279
  - !ruby/object:Gem::Version
280
280
  version: '0'
281
281
  requirements: []
282
- rubygems_version: 3.4.6
283
- signing_key:
282
+ rubygems_version: 3.5.23
283
+ signing_key:
284
284
  specification_version: 4
285
285
  summary: An operations service layer for rails projects.
286
286
  test_files: