Class: Sinclair::EqualsChecker

Inherits:
Object
  • Object
show all
Defined in:
lib/sinclair/equals_checker.rb,
lib/sinclair/equals_checker/reader.rb

Overview

Class responsible for checking if two instances of a class are the equals

Examples:

regular usage

class SampleModel
  def initialize(name: nil, age: nil)
    @name = name
    @age  = age
  end

  protected

  attr_reader :name

  private

  attr_reader :age
end

class OtherModel < SampleModel
end

checker = Sinclair::EqualsChecker.new(:name, :age)

model1 = SampleModel.new(name: 'jack', age: 21)
model2 = SampleModel.new(name: 'rose', age: 23)

checker.match?(model1, model2) # returns false

similar models

checker = Sinclair::EqualsChecker.new(:name, :age)

model1 = SampleModel.new(name: 'jack', age: 21)
model2 = SampleModel.new(name: 'jack', age: 21)

checker.match?(model1, model2) # returns true

different classes

checker = Sinclair::EqualsChecker.new(:name, :age)

model1 = SampleModel.new(name: 'jack', age: 21)
model2 = OtherModel.new(name: 'jack', age: 21)

checker.match?(model1, model2) # returns false

Author:

  • darthjee

Defined Under Namespace

Classes: Reader

Instance Method Summary collapse

Constructor Details

#initialize(*attributes) ⇒ EqualsChecker

Returns a new instance of EqualsChecker.

Parameters:

  • attributes (Array<Symbol,String>)

    list of relevant attributes



56
57
58
# File 'lib/sinclair/equals_checker.rb', line 56

def initialize(*attributes)
  @attributes = Set.new(attributes.flatten)
end

Instance Method Details

#add(*attributes) ⇒ Set<Symbol,String>

Adds new fields to equals checker

checker.match?(model1, model2) # returns true

checker.add(:age)

checker.match?(model1, model2) # returns false

Examples:

adding fields to equal checker

checker = Sinclair::EqualsChecker.new(:name)

model1 = SampleModel.new(name: 'jack', age: 21)
model2 = SampleModel.new(name: 'jack', age: 22)

Parameters:

  • attributes (Array<Symbol,String>)

    list of relevant attributes

Returns:

  • (Set<Symbol,String>)


77
78
79
# File 'lib/sinclair/equals_checker.rb', line 77

def add(*attributes)
  @attributes += Set.new(attributes.flatten)
end

#match?(model, other) ⇒ TrueClass, FalseClass

Returns if 2 objects are equals

The check takes into consideration:

- They should be instances of the same class
- Their attributes (method calls) should return the same value,
for the configured attributes
- Public and private attributes are checked

Examples:

regular usage

class SampleModel
  def initialize(name: nil, age: nil)
    @name = name
    @age  = age
  end

  protected

  attr_reader :name

  private

  attr_reader :age
end

class OtherModel < SampleModel
end

checker = Sinclair::EqualsChecker.new(:name, :age)

model1 = SampleModel.new(name: 'jack', age: 21)
model2 = SampleModel.new(name: 'rose', age: 23)

checker.match?(model1, model2) # returns false

similar models

checker = Sinclair::EqualsChecker.new(:name, :age)

model1 = SampleModel.new(name: 'jack', age: 21)
model2 = SampleModel.new(name: 'jack', age: 21)

checker.match?(model1, model2) # returns true

different classes

checker = Sinclair::EqualsChecker.new(:name, :age)

model1 = SampleModel.new(name: 'jack', age: 21)
model2 = OtherModel.new(name: 'jack', age: 21)

checker.match?(model1, model2) # returns false

Returns:

  • (TrueClass, FalseClass)


92
93
94
95
96
97
98
# File 'lib/sinclair/equals_checker.rb', line 92

def match?(model, other)
  return false unless model.class == other.class

  attributes.all? do |attr|
    Reader.attributes_match?(attr, model, other)
  end
end