Skip to content

Commit

Permalink
Avoid method redefinition warnings (#554)
Browse files Browse the repository at this point in the history
Ruby warnings often point to mistakes so it's a good idea
to enable them in the test suite.

Co-authored-by: Jean Boussier <[email protected]>
  • Loading branch information
casperisfine and byroot committed Sep 19, 2024
1 parent 15e8508 commit 1cf144d
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 19 deletions.
2 changes: 1 addition & 1 deletion Gemfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion lib/semian/protected_resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ module Semian
class ProtectedResource
extend Forwardable

def_delegators :@bulkhead, :destroy, :count, :semid, :tickets, :registered_workers
def_delegators :@bulkhead, :count, :semid, :tickets, :registered_workers
def_delegators :@circuit_breaker,
:reset,
:mark_failed,
Expand Down
26 changes: 16 additions & 10 deletions lib/semian/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ class << Semian::Resource
def instance(name, **kwargs)
Semian.resources[name] ||= ProtectedResource.new(name, new(name, **kwargs), nil)
end

private

def redefinable(method_name)
alias_method(method_name, method_name) # Silence method redefinition warnings
end
end

def initialize(name, tickets: nil, quota: nil, permissions: Semian.default_permissions, timeout: 0)
Expand All @@ -26,41 +32,41 @@ def initialize(name, tickets: nil, quota: nil, permissions: Semian.default_permi
@name = name
end

def reset_registered_workers!
redefinable def reset_registered_workers!
end

def destroy
redefinable def destroy
end

def unregister_worker
redefinable def unregister_worker
end

def acquire(*)
redefinable def acquire(*)
wait_time = 0
yield wait_time
end

def count
redefinable def count
0
end

def tickets
redefinable def tickets
0
end

def registered_workers
redefinable def registered_workers
0
end

def semid
redefinable def semid
0
end

def key
redefinable def key
"0x00000000"
end

def in_use?
redefinable def in_use?
false
end
end
Expand Down
23 changes: 16 additions & 7 deletions test/adapters/net_http_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -525,13 +525,17 @@ def with_semian_configuration(options = DEFAULT_SEMIAN_CONFIGURATION)
orig_semian_options = Semian::NetHTTP.semian_configuration
Semian::NetHTTP.instance_variable_set(:@semian_configuration, nil)
mutated_objects = {}
Semian::NetHTTP.send(:alias_method, :orig_semian_resource, :semian_resource)
Semian::NetHTTP.send(:alias_method, :orig_raw_semian_options, :raw_semian_options)
Semian::NetHTTP.send(:define_method, :semian_resource) do
Semian::NetHTTP.alias_method(:orig_semian_resource, :semian_resource)
Semian::NetHTTP.alias_method(:orig_raw_semian_options, :raw_semian_options)

Semian::NetHTTP.alias_method(:semian_resource, :semian_resource) # Silence redefinition warnings
Semian::NetHTTP.define_method(:semian_resource) do
mutated_objects[self] = [@semian_resource, @raw_semian_options] unless mutated_objects.key?(self)
orig_semian_resource
end
Semian::NetHTTP.send(:define_method, :raw_semian_options) do

Semian::NetHTTP.alias_method(:raw_semian_options, :raw_semian_options) # Silence redefinition warnings
Semian::NetHTTP.define_method(:raw_semian_options) do
mutated_objects[self] = [@semian_resource, @raw_semian_options] unless mutated_objects.key?(self)
orig_raw_semian_options
end
Expand All @@ -541,9 +545,14 @@ def with_semian_configuration(options = DEFAULT_SEMIAN_CONFIGURATION)
ensure
Semian::NetHTTP.instance_variable_set(:@semian_configuration, nil)
Semian::NetHTTP.semian_configuration = orig_semian_options
Semian::NetHTTP.send(:alias_method, :semian_resource, :orig_semian_resource)
Semian::NetHTTP.send(:alias_method, :raw_semian_options, :orig_raw_semian_options)
Semian::NetHTTP.send(:undef_method, :orig_semian_resource, :orig_raw_semian_options)

Semian::NetHTTP.alias_method(:semian_resource, :semian_resource) # Silence redefinition warnings
Semian::NetHTTP.alias_method(:semian_resource, :orig_semian_resource)

Semian::NetHTTP.alias_method(:raw_semian_options, :raw_semian_options) # Silence redefinition warnings
Semian::NetHTTP.alias_method(:raw_semian_options, :orig_raw_semian_options)

Semian::NetHTTP.undef_method(:orig_semian_resource, :orig_raw_semian_options)
mutated_objects.each do |instance, (res, opt)| # Sadly, only way to fully restore cached properties
instance.instance_variable_set(:@semian_resource, res)
instance.instance_variable_set(:@raw_semian_options, opt)
Expand Down
1 change: 1 addition & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
require "bundler/setup"

require "minitest/autorun"
$VERBOSE = true
require "semian"
require "toxiproxy"
require "tempfile"
Expand Down

0 comments on commit 1cf144d

Please sign in to comment.