rails_ops 1.8.0 → 1.8.1

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: d983d20a0a0bf3e1b7e967d0dbd16aec64f253c8a7a12e7c6b72f9f6f676b604
4
- data.tar.gz: 00a7b268b2337ba5b2cf57855b9d611a7c9dbe3492cd9484345ad1f7956b2b27
3
+ metadata.gz: 8559933ff507cb992933a71e6966461cad346d4351046cf3d213e35813d8fe64
4
+ data.tar.gz: 81821f4b58e5503e150c18f60cc55172108d173d2d4abfe5cb094781b9cdf4e2
5
5
  SHA512:
6
- metadata.gz: 9a50ef1e82a5a82e1adddb76435389babd2f34a6fe3e4f80c06bf3ec061b26235fa80541cfbfdab6fdc43f253245b388b1b376d8032e090c510fe1a4f2edc591
7
- data.tar.gz: fca76d3c3c65cc564744596dd298e8a52e69320cd0eb5952750e689dc879b21dce5dab13dd6372456108ea367aa536a62e40a58d4c069af5ab78eb214167c3be
6
+ metadata.gz: 86cc9b385e8a43be9ea7e23abddc320f772cacffe00ab3671c8ade66fee62df0e4db28bf70d200d220178ffb46720291897ddbe63841e5b6c8bf46065b9439b8
7
+ data.tar.gz: 828c27f4c316fdbaac2f48749a39caef6ea21dd2010be0adeb5ee4cc3f8933da35409b26699805d29aa20a388fb53ce26374159bf1320b5e8cf78a93594c6607
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.8.1 (2026-05-27)
4
+
5
+ * Add explicit `**kwargs` forwarding to `schema2` and `schema`. These
6
+ methods never properly supported keyword arguments — it only appeared
7
+ to work under Ruby 2 due to its implicit hash-to-kwargs conversion.
8
+ Calls like `schema2 policy_chain: :on_init do ... end` now work
9
+ correctly on all supported Ruby versions.
10
+
11
+ Internal reference: `#149499`.
12
+
3
13
  ## 1.8.0 (2026-05-07)
4
14
 
5
15
  * `Operation#run` (non-bang) now wraps the call to `run!` in a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rails_ops (1.8.0)
4
+ rails_ops (1.8.1)
5
5
  active_type (>= 1.3.0)
6
6
  minitest
7
7
  rails (> 4)
@@ -142,11 +142,11 @@ GEM
142
142
  net-smtp (0.4.0.1)
143
143
  net-protocol
144
144
  nio4r (2.7.0)
145
- nokogiri (1.19.1-arm64-darwin)
145
+ nokogiri (1.19.3-arm64-darwin)
146
146
  racc (~> 1.4)
147
- nokogiri (1.19.1-x86_64-darwin)
147
+ nokogiri (1.19.3-x86_64-darwin)
148
148
  racc (~> 1.4)
149
- nokogiri (1.19.1-x86_64-linux-gnu)
149
+ nokogiri (1.19.3-x86_64-linux-gnu)
150
150
  racc (~> 1.4)
151
151
  parallel (1.26.3)
152
152
  parser (3.3.7.0)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.8.0
1
+ 1.8.1
@@ -22,27 +22,44 @@ module RailsOps::Mixins::SchemaValidation
22
22
  # Only one schema can be active at a time. Defining multiple schemata or
23
23
  # defining schemas in a subclass always override previously defined schemas.
24
24
  #
25
- # @param *args [Array] Parameters to pass at schema initialization
25
+ # @param *args [Array] Positional parameters to pass at schema
26
+ # initialization
27
+ # @param **kwargs [Hash] Keyword arguments to pass at schema
28
+ # initialization
26
29
  # @yield Block to pass at schema initialization
27
- def schema2(*args, &block)
28
- if args.any? || block_given?
29
- self._op_schema = Schemacop::Schema.new(*args, &block)
30
+ def schema2(*args, **kwargs, &block)
31
+ if args.any? || kwargs.any? || block_given?
32
+ self._op_schema = Schemacop::Schema.new(*args, **kwargs, &block)
30
33
  else
31
34
  # Define empty schema (not possible with V2 schema).
32
35
  schema3
33
36
  end
34
37
  end
35
38
 
39
+ # @param type [Symbol] Root node type (default: `:hash`)
40
+ # @param *args [Array] Positional parameters to pass at schema
41
+ # initialization
42
+ # @param **kwargs [Hash] Keyword arguments to pass at schema
43
+ # initialization
44
+ # @yield Block to pass at schema initialization
36
45
  def schema3(type = :hash, *args, **kwargs, &block)
37
46
  self._op_schema = Schemacop::Schema3.new(type, *args, **kwargs, &block)
38
47
  end
39
48
 
40
- def schema(*args, &block)
49
+ # Delegates to {#schema2} or {#schema3} based on
50
+ # {RailsOps.config.default_schemacop_version}.
51
+ #
52
+ # @param *args [Array] Positional parameters to pass at schema
53
+ # initialization
54
+ # @param **kwargs [Hash] Keyword arguments to pass at schema
55
+ # initialization
56
+ # @yield Block to pass at schema initialization
57
+ def schema(*args, **kwargs, &block)
41
58
  case RailsOps.config.default_schemacop_version
42
59
  when 2
43
- schema2(*args, &block)
60
+ schema2(*args, **kwargs, &block)
44
61
  when 3
45
- schema3(*args, &block)
62
+ schema3(*args, **kwargs, &block)
46
63
  else
47
64
  fail 'Schemacop schema versions supported are 2 and 3.'
48
65
  end
data/rails_ops.gemspec CHANGED
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: rails_ops 1.8.0 ruby lib
2
+ # stub: rails_ops 1.8.1 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "rails_ops".freeze
6
- s.version = "1.8.0"
6
+ s.version = "1.8.1"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
- s.date = "2026-05-07"
11
+ s.date = "2026-05-27"
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, "CLAUDE.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, "test/unit/rails_ops/railtie_test.rb".freeze]
13
13
  s.homepage = "https://github.com/sitrox/rails_ops".freeze
14
14
  s.licenses = ["MIT".freeze]
@@ -450,6 +450,79 @@ class RailsOps::OperationTest < ActiveSupport::TestCase
450
450
  end
451
451
  end
452
452
 
453
+ def test_schema2_with_kwargs
454
+ op = Class.new(RailsOps::Operation) do
455
+ schema2 policy_chain: :on_init do
456
+ req :id, :integer
457
+ end
458
+ def perform; end
459
+ end
460
+
461
+ op.run!(id: 1)
462
+ assert_raises Schemacop::Exceptions::ValidationError do
463
+ op.run!(id: 'not_an_integer')
464
+ end
465
+ end
466
+
467
+ def test_schema2_with_kwargs_only
468
+ op = Class.new(RailsOps::Operation) do
469
+ schema2 policy_chain: :on_init
470
+ def perform; end
471
+ end
472
+
473
+ assert op._op_schema.is_a?(Schemacop::Schema2)
474
+ end
475
+
476
+ def test_schema3_with_kwargs
477
+ op = Class.new(RailsOps::Operation) do
478
+ schema3 :hash, title: 'test' do
479
+ int! :id
480
+ end
481
+ def perform; end
482
+ end
483
+
484
+ op.run!(id: 1)
485
+ assert_raises Schemacop::Exceptions::ValidationError do
486
+ op.run!(id: 'not_an_integer')
487
+ end
488
+ end
489
+
490
+ def test_schema_default_v2_with_kwargs
491
+ original = RailsOps.config.default_schemacop_version
492
+ RailsOps.config.default_schemacop_version = 2
493
+ op = Class.new(RailsOps::Operation) do
494
+ schema policy_chain: :on_init do
495
+ req :id, :integer
496
+ end
497
+ def perform; end
498
+ end
499
+
500
+ op.run!(id: 1)
501
+ assert_raises Schemacop::Exceptions::ValidationError do
502
+ op.run!(id: 'not_an_integer')
503
+ end
504
+ ensure
505
+ RailsOps.config.default_schemacop_version = original
506
+ end
507
+
508
+ def test_schema_default_v3_with_kwargs
509
+ original = RailsOps.config.default_schemacop_version
510
+ RailsOps.config.default_schemacop_version = 3
511
+ op = Class.new(RailsOps::Operation) do
512
+ schema title: 'test' do
513
+ int! :id
514
+ end
515
+ def perform; end
516
+ end
517
+
518
+ op.run!(id: 1)
519
+ assert_raises Schemacop::Exceptions::ValidationError do
520
+ op.run!(id: 'not_an_integer')
521
+ end
522
+ ensure
523
+ RailsOps.config.default_schemacop_version = original
524
+ end
525
+
453
526
  def test_op_with_schema_default
454
527
  RailsOps.config.default_schemacop_version = 3
455
528
  test_op_with_schema3(use_default: true)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_ops
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-05-07 00:00:00.000000000 Z
10
+ date: 2026-05-27 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: active_type