Skip to content

Commit

Permalink
Allow #inspect method to be disabled with a switch
Browse files Browse the repository at this point in the history
  • Loading branch information
markprzepiora committed May 18, 2017
1 parent 46dd38c commit a775a3b
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 4 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@ point_a == point_c # => false
point_a.hash == point_c.hash # => false
point_a.eql?(point_c) # => false
point_a.equal?(point_c) # => false

class Person < Struct.new(:id, :name)
include Equalizer.new(:id, define_inspect: false)
end

amy = Person.new(1, "Amy")

amy.inspect # => '#<struct Person id=1, name="Amy">'
```

Supported Ruby Versions
Expand Down
9 changes: 5 additions & 4 deletions lib/equalizer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@ class Equalizer < Module
# #hash, and #inspect
#
# @param [Array<Symbol>] keys
# @param define_inspect [Boolean] whether to override #inspect
#
# @return [undefined]
#
# @api private
def initialize(*keys)
def initialize(*keys, define_inspect: true)
@keys = keys
define_methods
define_cmp_and_hash_methods
define_inspect_method if define_inspect
freeze
end

Expand All @@ -38,10 +40,9 @@ def included(descendant)
# @return [undefined]
#
# @api private
def define_methods
def define_cmp_and_hash_methods
define_cmp_method
define_hash_method
define_inspect_method
end

# Define an #cmp? method based on the instance's values identified by #keys
Expand Down
32 changes: 32 additions & 0 deletions spec/unit/equalizer/universal_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -155,4 +155,36 @@ def initialize(firstname, lastname)
end
end
end

context 'when define_inspect: false is specified' do
subject { object.new(*keys, define_inspect: false) }

let(:keys) { %i[firstname lastname].freeze }
let(:firstname) { 'John' }
let(:lastname) { 'Doe' }
let(:instance) { klass.new(firstname, lastname) }

let(:klass) do
::Class.new do
attr_reader :firstname, :lastname
private :firstname, :lastname

def initialize(firstname, lastname)
@firstname = firstname
@lastname = lastname
end
end
end

before do
# specify the class #inspect method
allow(klass).to receive_messages(name: nil, inspect: name)
klass.send(:include, subject)
end

it 'does not define a new #inspect method synamically' do
expect(subject.public_instance_methods(false).map(&:to_s))
.not_to include('inspect')
end
end
end

0 comments on commit a775a3b

Please sign in to comment.