rails_ops 1.5.7 → 1.6.0.rc0

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.
data/rails_ops.gemspec CHANGED
@@ -1,15 +1,15 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: rails_ops 1.5.7 ruby lib
2
+ # stub: rails_ops 1.6.0.rc0 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "rails_ops".freeze
6
- s.version = "1.5.7"
6
+ s.version = "1.6.0.rc0"
7
7
 
8
- s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
8
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
- s.date = "2024-08-22"
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, "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]
11
+ s.date = "2025-01-22"
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
15
15
  s.summary = "An operations service layer for rails projects.".freeze
@@ -17,16 +17,6 @@ Gem::Specification.new do |s|
17
17
 
18
18
  s.specification_version = 4
19
19
 
20
- s.add_development_dependency(%q<appraisal>.freeze, [">= 0"])
21
- s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
22
- s.add_development_dependency(%q<rake>.freeze, [">= 0"])
23
- s.add_development_dependency(%q<sqlite3>.freeze, ["< 2.0.0"])
24
- s.add_development_dependency(%q<cancancan>.freeze, [">= 0"])
25
- s.add_development_dependency(%q<pry>.freeze, [">= 0"])
26
- s.add_development_dependency(%q<colorize>.freeze, [">= 0"])
27
- s.add_development_dependency(%q<rubocop>.freeze, ["= 1.45.1"])
28
- s.add_development_dependency(%q<sprockets-rails>.freeze, [">= 0"])
29
- s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
30
20
  s.add_runtime_dependency(%q<active_type>.freeze, [">= 1.3.0"])
31
21
  s.add_runtime_dependency(%q<minitest>.freeze, [">= 0"])
32
22
  s.add_runtime_dependency(%q<rails>.freeze, [">= 0"])
@@ -1,5 +1,6 @@
1
1
  require_relative 'boot'
2
2
 
3
+ require 'logger'
3
4
  require 'rails'
4
5
 
5
6
  require 'active_model/railtie'
data/test/test_helper.rb CHANGED
@@ -7,7 +7,6 @@ require File.expand_path('../test/dummy/config/environment.rb', __dir__)
7
7
  # ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
8
8
  require 'rails/test_help'
9
9
  require 'pry'
10
- require 'colorize'
11
10
 
12
11
  # Filter out Minitest backtrace while allowing backtrace from other libraries
13
12
  # to be shown.
@@ -42,6 +42,41 @@ class RailsOps::Mixins::ParamAuthorizationTest < ActiveSupport::TestCase
42
42
  end
43
43
  end
44
44
 
45
+ def test_without_array
46
+ @op = Class.new(RailsOps::Operation::Model::Load) do
47
+ schema3 do
48
+ int! :id
49
+ str? :foo
50
+ hsh? :bar do
51
+ str? :baz
52
+ end
53
+ end
54
+
55
+ model ::Group
56
+
57
+ authorize_param :foo, :foo, :subject_1
58
+ authorize_param :bar, :bar, :subject_1
59
+
60
+ def perform
61
+ # Do nothing
62
+ end
63
+ end
64
+
65
+ ctx = RailsOps::Context.new(ability: Ability.new)
66
+
67
+ assert_raises CanCan::AccessDenied do
68
+ @op.run!(ctx, id: 1, foo: 'bar')
69
+ end
70
+
71
+ assert_raises CanCan::AccessDenied do
72
+ @op.run!(ctx, id: 1, bar: {})
73
+ end
74
+
75
+ assert_raises CanCan::AccessDenied do
76
+ @op.run!(ctx, id: 1, bar: { baz: 'baz' })
77
+ end
78
+ end
79
+
45
80
  def test_without_ability
46
81
  @op.run!(id: 1)
47
82
  end
@@ -18,6 +18,12 @@ class RailsOps::Operation::AuthTest < ActiveSupport::TestCase
18
18
  model ::Group
19
19
  end
20
20
 
21
+ UPDATE_OP_WITH_SPECIAL_LOAD_OP = Class.new(RailsOps::Operation::Model::Update) do
22
+ model ::Group
23
+
24
+ load_model_authorization_action :create
25
+ end
26
+
21
27
  CREATE_OP = Class.new(RailsOps::Operation::Model::Create) do
22
28
  model ::Group
23
29
  end
@@ -78,12 +84,22 @@ class RailsOps::Operation::AuthTest < ActiveSupport::TestCase
78
84
  def test_permitted_update
79
85
  ctx = RailsOps::Context.new(ability: ABILITY.new(read: true, update: true))
80
86
  assert_nothing_raised do
87
+ # As `read``and `update` is permitted, `new` and `run` should both work for the operation
81
88
  op = UPDATE_OP.new(ctx, id: 1, group: { name: 'Group2' })
82
89
  res = op.run!
83
90
  assert_equal 'Group2', res.model.name
84
91
  end
85
92
  end
86
93
 
94
+ def test_unpermitted_read_permitted_update
95
+ # While `update` is permitted, `read` is not, and therefore already trying to
96
+ # instantiate the operation must fail.
97
+ ctx = RailsOps::Context.new(ability: ABILITY.new(update: true))
98
+ assert_raises CanCan::AccessDenied do
99
+ UPDATE_OP.new(ctx, id: 1, group: { name: 'Group2' })
100
+ end
101
+ end
102
+
87
103
  def test_unpermitted_create
88
104
  ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
89
105
  assert_raises CanCan::AccessDenied do
@@ -26,16 +26,14 @@ class RailsOps::Operation::Model::LoadTest < ActiveSupport::TestCase
26
26
  end
27
27
 
28
28
  def test_without_id
29
- op = BASIC_OP.new
30
29
  assert_raises_with_message RuntimeError, 'Param :id must be given.' do
31
- op.model
30
+ BASIC_OP.new
32
31
  end
33
32
  end
34
33
 
35
34
  def test_not_found
36
- op = BASIC_OP.new(id: 5)
37
35
  assert_raise ActiveRecord::RecordNotFound do
38
- op.model
36
+ BASIC_OP.new(id: 5)
39
37
  end
40
38
  end
41
39
 
@@ -1,4 +1,5 @@
1
1
  require 'test_helper'
2
+ require 'rails_ops/authorization_backend/can_can_can'
2
3
 
3
4
  class RailsOps::Operation::Model::UpdateTest < ActiveSupport::TestCase
4
5
  include TestHelper
@@ -62,10 +63,8 @@ class RailsOps::Operation::Model::UpdateTest < ActiveSupport::TestCase
62
63
 
63
64
  assert_equal :red, op.model.color
64
65
 
65
- op = FLOWER_OP.new(id: flower2.id)
66
-
67
66
  assert_raises ActiveRecord::RecordNotFound do
68
- op.model
67
+ FLOWER_OP.new(id: flower2.id)
69
68
  end
70
69
  end
71
70
 
@@ -90,4 +89,78 @@ class RailsOps::Operation::Model::UpdateTest < ActiveSupport::TestCase
90
89
  refute op2.model.respond_to?(:planted_is_true)
91
90
  refute op2.model.respond_to?(:response_to_everything)
92
91
  end
92
+
93
+ def test_load_authorization_order
94
+ RailsOps.config.authorization_backend = 'RailsOps::AuthorizationBackend::CanCanCan'
95
+
96
+ op_klass = Class.new(RailsOps::Operation::Model::Update) do
97
+ model ::Group
98
+ end
99
+
100
+ ability = Class.new do
101
+ include CanCan::Ability
102
+
103
+ def initialize
104
+ super
105
+ can :read, Group, color: 'red'
106
+ can :update, Group, color: 'red'
107
+ end
108
+ end.new
109
+
110
+ context = RailsOps::Context.new(ability: ability)
111
+
112
+ assert_nothing_raised do
113
+ model = Group.create!(color: 'red')
114
+ op_klass.run!(context, id: model.id, group: { color: 'red' })
115
+ end
116
+
117
+ assert_raises CanCan::AccessDenied do
118
+ model = Group.create!(color: 'blue')
119
+ op_klass.run!(context, id: model.id, group: { color: 'red' })
120
+ end
121
+
122
+ assert_nothing_raised do
123
+ model = Group.create!(color: 'red')
124
+ op_klass.run!(context, id: model.id, group: { color: 'blue' })
125
+ end
126
+ ensure
127
+ RailsOps.config.authorization_backend = nil
128
+ end
129
+
130
+ def test_update_authorization_order
131
+ RailsOps.config.authorization_backend = 'RailsOps::AuthorizationBackend::CanCanCan'
132
+
133
+ op_klass = Class.new(RailsOps::Operation::Model::Update) do
134
+ model ::Group
135
+ end
136
+
137
+ ability = Class.new do
138
+ include CanCan::Ability
139
+
140
+ def initialize
141
+ super
142
+ can :read, Group
143
+ can :update, Group, color: 'red'
144
+ end
145
+ end.new
146
+
147
+ context = RailsOps::Context.new(ability: ability)
148
+
149
+ assert_nothing_raised do
150
+ model = Group.create!(color: 'red')
151
+ op_klass.run!(context, id: model.id, group: { color: 'red' })
152
+ end
153
+
154
+ assert_raises CanCan::AccessDenied do
155
+ model = Group.create!(color: 'blue')
156
+ op_klass.run!(context, id: model.id, group: { color: 'red' })
157
+ end
158
+
159
+ assert_nothing_raised do
160
+ model = Group.create!(color: 'red')
161
+ op_klass.run!(context, id: model.id, group: { color: 'blue' })
162
+ end
163
+ ensure
164
+ RailsOps.config.authorization_backend = nil
165
+ end
93
166
  end
@@ -12,6 +12,7 @@ class RailsOps::Operation::UpdateLazyAuthTest < ActiveSupport::TestCase
12
12
 
13
13
  def perform
14
14
  fail osparams.exception if osparams.exception
15
+ save!
15
16
  @done = true
16
17
  end
17
18
  end
@@ -21,32 +22,48 @@ class RailsOps::Operation::UpdateLazyAuthTest < ActiveSupport::TestCase
21
22
 
22
23
  def initialize(read: false, update: false)
23
24
  super()
24
- can :read, Group if read
25
- can :update, Group if update
25
+ can :read, Group, color: %w[red green] if read
26
+ can :update, Group, color: 'red' if update
26
27
  end
27
28
  end
28
29
 
29
30
  setup do
30
31
  Group.delete_all
31
- Group.create!(id: 1, name: 'Group')
32
+ Group.create!(id: 1, name: 'Red Group', color: 'red')
33
+ Group.create!(id: 2, name: 'Blue group', color: 'blue')
34
+ Group.create!(id: 3, name: 'Green group', color: 'green')
32
35
  RailsOps.config.authorization_backend = 'RailsOps::AuthorizationBackend::CanCanCan'
33
36
  end
34
37
 
35
- def test_unpermitted_read
38
+ def test_unpermitted_read_permitted_color
36
39
  ctx = RailsOps::Context.new(ability: ABILITY.new)
37
40
  assert_raises CanCan::AccessDenied do
38
41
  BASIC_OP.new(ctx, id: 1)
39
42
  end
40
43
  end
41
44
 
42
- def test_permitted_read
45
+ def test_unpermitted_read_unpermitted_color
46
+ ctx = RailsOps::Context.new(ability: ABILITY.new)
47
+ assert_raises CanCan::AccessDenied do
48
+ BASIC_OP.new(ctx, id: 2)
49
+ end
50
+ end
51
+
52
+ def test_permitted_read_permitted_color
43
53
  ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
44
54
  assert_nothing_raised do
45
55
  BASIC_OP.new(ctx, id: 1)
46
56
  end
47
57
  end
48
58
 
49
- def test_unpermitted_update
59
+ def test_permitted_read_unpermitted_color
60
+ ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
61
+ assert_raises CanCan::AccessDenied do
62
+ BASIC_OP.new(ctx, id: 2)
63
+ end
64
+ end
65
+
66
+ def test_unpermitted_update_permitted_color
50
67
  ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
51
68
  op = BASIC_OP.new(ctx, id: 1)
52
69
  assert_raises CanCan::AccessDenied do
@@ -54,11 +71,27 @@ class RailsOps::Operation::UpdateLazyAuthTest < ActiveSupport::TestCase
54
71
  end
55
72
  end
56
73
 
57
- def test_permitted_update
74
+ def test_unpermitted_update_unpermitted_color
75
+ ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
76
+ op = BASIC_OP.new(ctx, id: 1)
77
+ assert_raises CanCan::AccessDenied do
78
+ op.run!
79
+ end
80
+ end
81
+
82
+ def test_permitted_update_permitted_color
58
83
  ctx = RailsOps::Context.new(ability: ABILITY.new(read: true, update: true))
59
84
  op = BASIC_OP.new(ctx, id: 1)
60
85
  assert_nothing_raised do
61
86
  op.run!
62
87
  end
63
88
  end
89
+
90
+ def test_permitted_update_unpermitted_color
91
+ ctx = RailsOps::Context.new(ability: ABILITY.new(read: true, update: true))
92
+ op = BASIC_OP.new(ctx, id: 3, group: { color: 'red' })
93
+ assert_raises CanCan::AccessDenied do
94
+ op.run!
95
+ end
96
+ end
64
97
  end
@@ -168,13 +168,21 @@ class RailsOps::OperationTest < ActiveSupport::TestCase
168
168
  end
169
169
 
170
170
  def test_inspect
171
- assert_equal 'RailsOps::OperationTest::BASIC_OP ({"foo"=>:bar})',
172
- BASIC_OP.new(foo: :bar).inspect
171
+ # See https://bugs.ruby-lang.org/issues/20433#note-10
172
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.4.0')
173
+ assert_equal 'RailsOps::OperationTest::BASIC_OP ({"foo" => :bar})', BASIC_OP.new(foo: :bar).inspect
174
+ else
175
+ assert_equal 'RailsOps::OperationTest::BASIC_OP ({"foo"=>:bar})', BASIC_OP.new(foo: :bar).inspect
176
+ end
173
177
  end
174
178
 
175
179
  def test_inspect_with_numeric_param_keys
176
- assert_equal 'RailsOps::OperationTest::BASIC_OP ({1=>2})',
177
- BASIC_OP.new(1 => 2).inspect
180
+ # See https://bugs.ruby-lang.org/issues/20433#note-10
181
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.4.0')
182
+ assert_equal 'RailsOps::OperationTest::BASIC_OP ({1 => 2})', BASIC_OP.new(1 => 2).inspect
183
+ else
184
+ assert_equal 'RailsOps::OperationTest::BASIC_OP ({1=>2})', BASIC_OP.new(1 => 2).inspect
185
+ end
178
186
  end
179
187
 
180
188
  def test_with_rollback_on_exception
metadata CHANGED
@@ -1,155 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_ops
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.7
4
+ version: 1.6.0.rc0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-22 00:00:00.000000000 Z
11
+ date: 2025-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: appraisal
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: sqlite3
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "<"
60
- - !ruby/object:Gem::Version
61
- version: 2.0.0
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "<"
67
- - !ruby/object:Gem::Version
68
- version: 2.0.0
69
- - !ruby/object:Gem::Dependency
70
- name: cancancan
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: pry
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: colorize
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - '='
116
- - !ruby/object:Gem::Version
117
- version: 1.45.1
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - '='
123
- - !ruby/object:Gem::Version
124
- version: 1.45.1
125
- - !ruby/object:Gem::Dependency
126
- name: sprockets-rails
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- - !ruby/object:Gem::Dependency
140
- name: simplecov
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '0'
153
13
  - !ruby/object:Gem::Dependency
154
14
  name: active_type
155
15
  requirement: !ruby/object:Gem::Requirement
@@ -226,8 +86,8 @@ dependencies:
226
86
  - - "<="
227
87
  - !ruby/object:Gem::Version
228
88
  version: '3.1'
229
- description:
230
- email:
89
+ description:
90
+ email:
231
91
  executables: []
232
92
  extensions: []
233
93
  extra_rdoc_files: []
@@ -249,6 +109,8 @@ files:
249
109
  - gemfiles/rails_6.1.gemfile
250
110
  - gemfiles/rails_7.0.gemfile
251
111
  - gemfiles/rails_7.1.gemfile
112
+ - gemfiles/rails_7.2.gemfile
113
+ - gemfiles/rails_8.0.gemfile
252
114
  - lib/generators/operation/USAGE
253
115
  - lib/generators/operation/operation_generator.rb
254
116
  - lib/generators/operation/templates/controller.erb
@@ -398,11 +260,11 @@ files:
398
260
  - test/unit/rails_ops/operation/update_lazy_auth_test.rb
399
261
  - test/unit/rails_ops/operation_test.rb
400
262
  - test/unit/rails_ops/profiler_test.rb
401
- homepage:
263
+ homepage:
402
264
  licenses:
403
265
  - MIT
404
266
  metadata: {}
405
- post_install_message:
267
+ post_install_message:
406
268
  rdoc_options: []
407
269
  require_paths:
408
270
  - lib
@@ -413,12 +275,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
413
275
  version: '0'
414
276
  required_rubygems_version: !ruby/object:Gem::Requirement
415
277
  requirements:
416
- - - ">="
278
+ - - ">"
417
279
  - !ruby/object:Gem::Version
418
- version: '0'
280
+ version: 1.3.1
419
281
  requirements: []
420
- rubygems_version: 3.5.4
421
- signing_key:
282
+ rubygems_version: 3.4.6
283
+ signing_key:
422
284
  specification_version: 4
423
285
  summary: An operations service layer for rails projects.
424
286
  test_files: