Class: Canon::Comparison::Dimensions::BaseDimension Abstract

Inherits:
Object
  • Object
show all
Defined in:
lib/canon/comparison/dimensions/base_dimension.rb

Overview

This class is abstract.

Subclass and implement abstract methods

Base class for comparison dimensions

A dimension represents “WHAT to compare” - a specific aspect of a document that can be compared (e.g., text content, attributes, comments).

Each dimension knows how to:

  • Extract relevant data from a node

  • Compare data according to a behavior (:strict, :normalize, :ignore)

Subclasses must implement:

  • extract_data(node) - Extract relevant data from a node

  • compare_strict(data1, data2) - Strict comparison

  • compare_normalize(data1, data2) - Normalized comparison (optional)

Constant Summary collapse

STRICT =

Behavior constants

:strict
NORMALIZE =
:normalize
IGNORE =
:ignore

Instance Method Summary collapse

Instance Method Details

#compare(data1, data2, behavior) ⇒ Boolean

Compare extracted data according to behavior

Parameters:

  • data1 (Object)

    First data

  • data2 (Object)

    Second data

  • behavior (Symbol)

    Comparison behavior (:strict, :normalize, :ignore)

Returns:

  • (Boolean)

    true if data matches according to behavior



42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/canon/comparison/dimensions/base_dimension.rb', line 42

def compare(data1, data2, behavior)
  case behavior
  when STRICT
    compare_strict(data1, data2)
  when NORMALIZE
    compare_normalize(data1, data2)
  when IGNORE
    true
  else
    raise Error, "Unknown behavior: #{behavior}"
  end
end

#compare_normalize(data1, data2) ⇒ Boolean

Normalized comparison

Parameters:

  • data1 (Object)

    First data

  • data2 (Object)

    Second data

Returns:

  • (Boolean)

    true if data matches after normalization



92
93
94
95
# File 'lib/canon/comparison/dimensions/base_dimension.rb', line 92

def compare_normalize(data1, data2)
  # Default implementation: delegate to strict comparison
  compare_strict(data1, data2)
end

#compare_strict(data1, data2) ⇒ Boolean

This method is abstract.

Subclass must implement

Strict comparison

Parameters:

  • data1 (Object)

    First data

  • data2 (Object)

    Second data

Returns:

  • (Boolean)

    true if data matches strictly

Raises:

  • (NotImplementedError)


82
83
84
85
# File 'lib/canon/comparison/dimensions/base_dimension.rb', line 82

def compare_strict(data1, data2)
  raise NotImplementedError,
        "#{self.class} must implement compare_strict"
end

#dimension_nameSymbol

Get the dimension name

Returns:

  • (Symbol)

    Dimension name



30
31
32
33
34
# File 'lib/canon/comparison/dimensions/base_dimension.rb', line 30

def dimension_name
  @dimension_name ||= self.class.name.split("::").last.gsub(
    /Dimension$/, ""
  ).downcase.to_sym
end

#equivalent?(node1, node2, behavior) ⇒ Boolean

Check if two nodes are equivalent for this dimension

Parameters:

  • node1 (Object)

    First node

  • node2 (Object)

    Second node

  • behavior (Symbol)

    Comparison behavior

Returns:

  • (Boolean)

    true if nodes match for this dimension



61
62
63
64
65
# File 'lib/canon/comparison/dimensions/base_dimension.rb', line 61

def equivalent?(node1, node2, behavior)
  data1 = extract_data(node1)
  data2 = extract_data(node2)
  compare(data1, data2, behavior)
end

#extract_data(node) ⇒ Object

This method is abstract.

Subclass must implement

Extract data from a node

Parameters:

  • node (Object)

    Node to extract data from

Returns:

  • (Object)

    Extracted data

Raises:

  • (NotImplementedError)


72
73
74
# File 'lib/canon/comparison/dimensions/base_dimension.rb', line 72

def extract_data(node)
  raise NotImplementedError, "#{self.class} must implement extract_data"
end

#supports_normalization?Boolean

Check if this dimension supports normalization

Returns:

  • (Boolean)

    true if normalization is supported



100
101
102
103
# File 'lib/canon/comparison/dimensions/base_dimension.rb', line 100

def supports_normalization?
  # Check if compare_normalize is overridden (not the default implementation)
  method(:compare_normalize).owner != BaseDimension
end