rails_ops 1.5.7 → 1.6.0.rc0

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