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 +4 -4
- data/CHANGELOG.md +13 -0
- data/Gemfile.lock +1 -1
- data/README.md +18 -0
- data/VERSION +1 -1
- data/lib/rails_ops/mixins/model/authorization.rb +2 -0
- data/lib/rails_ops/operation/model/create.rb +2 -0
- data/lib/rails_ops/operation/model/destroy.rb +6 -0
- data/lib/rails_ops/operation/model/load.rb +7 -0
- data/lib/rails_ops/operation/model/update.rb +6 -0
- data/lib/rails_ops/operation/model.rb +2 -0
- data/lib/rails_ops/operation.rb +2 -0
- data/rails_ops.gemspec +3 -3
- data/test/unit/rails_ops/operation/model/destroy_test.rb +10 -0
- data/test/unit/rails_ops/operation/model/load_test.rb +9 -0
- data/test/unit/rails_ops/operation/model/update_test.rb +10 -0
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c17daad4e6d8e1d04943b73574b3fc6cbe3beed71c6d698a25f112431d9eece2
|
4
|
+
data.tar.gz: a569daf8bb6737cbba7cb1c4b8402595be565532757939f560ab5eea8f2b06ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
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.
|
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
|
@@ -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)
|
data/lib/rails_ops/operation.rb
CHANGED
data/rails_ops.gemspec
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: rails_ops 1.7.
|
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.
|
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-
|
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.
|
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-
|
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.
|
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:
|