Module: Canon::Xml::NamespaceHelper

Defined in:
lib/canon/xml/namespace_helper.rb

Overview

Helper module for formatting namespace information in diff output

Class Method Summary collapse

Class Method Details

.attribute_mismatch_message(node1, node2) ⇒ String

Generate a mismatch message for attribute differences

Parameters:

  • node1 (AttributeNode)

    First attribute

  • node2 (AttributeNode)

    Second attribute

Returns:

  • (String)

    Human-readable mismatch message



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/canon/xml/namespace_helper.rb', line 79

def self.attribute_mismatch_message(node1, node2)
  type = mismatch_type(node1, node2)

  case type
  when :name
    ns = format_namespace(node1.namespace_uri)
    "mismatched attribute name: '#{node1.name}' vs '#{node2.name}' (#{ns})"
  when :namespace
    "mismatched attribute namespace: '#{node1.name}' " \
    "(#{format_namespace(node1.namespace_uri)} vs " \
    "#{format_namespace(node2.namespace_uri)})"
  when :both
    "mismatched attribute name and namespace: " \
    "'#{node1.name}' (#{format_namespace(node1.namespace_uri)}) vs " \
    "'#{node2.name}' (#{format_namespace(node2.namespace_uri)})"
  else
    "attributes differ"
  end
end

.element_mismatch_message(node1, node2) ⇒ String

Generate a mismatch message for element differences

Parameters:

  • node1 (ElementNode)

    First element

  • node2 (ElementNode)

    Second element

Returns:

  • (String)

    Human-readable mismatch message



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/canon/xml/namespace_helper.rb', line 54

def self.element_mismatch_message(node1, node2)
  type = mismatch_type(node1, node2)

  case type
  when :name
    ns = format_namespace(node1.namespace_uri)
    "mismatched element name: '#{node1.name}' vs '#{node2.name}' (#{ns})"
  when :namespace
    "mismatched element namespace: '#{node1.name}' " \
    "(#{format_namespace(node1.namespace_uri)} vs " \
    "#{format_namespace(node2.namespace_uri)})"
  when :both
    "mismatched element name and namespace: " \
    "'#{node1.name}' (#{format_namespace(node1.namespace_uri)}) vs " \
    "'#{node2.name}' (#{format_namespace(node2.namespace_uri)})"
  else
    "elements differ"
  end
end

.format_namespace(namespace_uri) ⇒ String

Format a namespace URI for display in diff output

Examples:

Empty namespace

format_namespace(nil) #=> "ns:[{blank}]"
format_namespace("") #=> "ns:[{blank}]"

Populated namespace

format_namespace("http://example.com") #=> "ns:[http://example.com]"

Parameters:

  • namespace_uri (String, nil)

    The namespace URI to format

Returns:

  • (String)

    Formatted namespace string



18
19
20
21
22
23
24
# File 'lib/canon/xml/namespace_helper.rb', line 18

def self.format_namespace(namespace_uri)
  if namespace_uri.nil? || namespace_uri.empty?
    "ns:[{blank}]"
  else
    "ns:[#{namespace_uri}]"
  end
end

.mismatch_type(node1, node2) ⇒ Symbol

Determine the type of mismatch between two nodes

Parameters:

  • node1 (Object)

    First node (ElementNode or AttributeNode)

  • node2 (Object)

    Second node (ElementNode or AttributeNode)

Returns:

  • (Symbol)

    Type of mismatch (:name, :namespace, :both, :none)



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/canon/xml/namespace_helper.rb', line 31

def self.mismatch_type(node1, node2)
  return :none unless node1 && node2

  name_differs = node1.name != node2.name
  namespace_differs = normalize_namespace(node1.namespace_uri) !=
    normalize_namespace(node2.namespace_uri)

  if name_differs && namespace_differs
    :both
  elsif name_differs
    :name
  elsif namespace_differs
    :namespace
  else
    :none
  end
end