Class: Canon::Comparison::Dimensions::BaseDimension Abstract
- Inherits:
-
Object
- Object
- Canon::Comparison::Dimensions::BaseDimension
- Defined in:
- lib/canon/comparison/dimensions/base_dimension.rb
Overview
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)
Direct Known Subclasses
AttributeOrderDimension, AttributePresenceDimension, AttributeValuesDimension, CommentsDimension, ElementPositionDimension, StructuralWhitespaceDimension, TextContentDimension
Constant Summary collapse
- STRICT =
Behavior constants
:strict- NORMALIZE =
:normalize- IGNORE =
:ignore
Instance Method Summary collapse
-
#compare(data1, data2, behavior) ⇒ Boolean
Compare extracted data according to behavior.
-
#compare_normalize(data1, data2) ⇒ Boolean
Normalized comparison.
-
#compare_strict(data1, data2) ⇒ Boolean
abstract
Strict comparison.
-
#dimension_name ⇒ Symbol
Get the dimension name.
-
#equivalent?(node1, node2, behavior) ⇒ Boolean
Check if two nodes are equivalent for this dimension.
-
#extract_data(node) ⇒ Object
abstract
Extract data from a node.
-
#supports_normalization? ⇒ Boolean
Check if this dimension supports normalization.
Instance Method Details
#compare(data1, data2, behavior) ⇒ Boolean
Compare extracted data 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
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
Subclass must implement
Strict comparison
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_name ⇒ Symbol
Get the 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
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
Subclass must implement
Extract data from a node
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
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 |