class GlobalPhone::DatabaseGenerator

Constants

VERSION

Attributes

doc[R]

Public Class Methods

load(xml) click to toggle source
# File lib/global_phone/database_generator.rb, line 12
def self.load(xml)
  new(Nokogiri.XML(xml))
end
load_file(filename) click to toggle source
# File lib/global_phone/database_generator.rb, line 8
def self.load_file(filename)
  load(File.read(filename))
end
new(doc) click to toggle source
# File lib/global_phone/database_generator.rb, line 18
def initialize(doc)
  @doc = doc
end

Public Instance Methods

inspect() click to toggle source
# File lib/global_phone/database_generator.rb, line 34
def inspect
  "#<#{self.class.name} (#{doc.search("*").size} elements)>"
end
record_data() click to toggle source
# File lib/global_phone/database_generator.rb, line 28
def record_data
  @record_data ||= territory_nodes_by_region.map do |country_code, territory_nodes|
    truncate(compile_region(territory_nodes, country_code))
  end
end
test_cases() click to toggle source
# File lib/global_phone/database_generator.rb, line 22
def test_cases
  @test_cases ||= territory_nodes.map do |node|
    example_numbers_for_territory_node(node)
  end.flatten(1)
end

Protected Instance Methods

compile_format(node) click to toggle source
# File lib/global_phone/database_generator.rb, line 114
def compile_format(node)
  [
    node["pattern"],
    text_or_nil(node, "format"),
    pattern(node, "leadingDigits"),
    node["nationalPrefixFormattingRule"],
    text_or_nil(node, "intlFormat")
  ]
end
compile_formats(territory_nodes) click to toggle source
# File lib/global_phone/database_generator.rb, line 108
def compile_formats(territory_nodes)
  format_nodes_for(territory_nodes).map do |node|
    truncate(compile_format(node))
  end
end
compile_region(territory_nodes, country_code) click to toggle source
# File lib/global_phone/database_generator.rb, line 67
def compile_region(territory_nodes, country_code)
  territories, main_territory_node = compile_territories(territory_nodes)
  formats = compile_formats(territory_nodes)

  [
    country_code,
    formats,
    territories,
    main_territory_node["internationalPrefix"],
    main_territory_node["nationalPrefix"],
    squish(main_territory_node["nationalPrefixForParsing"]),
    squish(main_territory_node["nationalPrefixTransformRule"])
  ]
end
compile_territories(territory_nodes) click to toggle source
# File lib/global_phone/database_generator.rb, line 82
def compile_territories(territory_nodes)
  territories = []
  main_territory_node = territory_nodes.first

  territory_nodes.each do |node|
    territory = truncate(compile_territory(node))
    if node["mainCountryForCode"]
      main_territory_node = node
      territories.unshift(territory)
    else
      territories.push(territory)
    end
  end

  [territories, main_territory_node]
end
compile_territory(node) click to toggle source
# File lib/global_phone/database_generator.rb, line 99
def compile_territory(node)
  [
    territory_name(node),
    pattern(node, "generalDesc possibleNumberPattern"),
    pattern(node, "generalDesc nationalNumberPattern"),
    squish(node["nationalPrefixFormattingRule"])
  ]
end
example_number_types_to_exclude() click to toggle source
# File lib/global_phone/database_generator.rb, line 63
def example_number_types_to_exclude
  %w( emergency shortCode )
end
example_numbers_for_territory_node(node) click to toggle source
# File lib/global_phone/database_generator.rb, line 51
def example_numbers_for_territory_node(node)
  name = territory_name(node)
  return [] if name == "001"
  node.search(example_numbers_selector).map { |node| [node.text, name] }
end
example_numbers_selector() click to toggle source
# File lib/global_phone/database_generator.rb, line 57
def example_numbers_selector
  "./*[not(" + example_number_types_to_exclude.map do |type|
    "self::#{type}"
  end.join(" or ") + ")]/exampleNumber"
end
format_nodes_for(territory_nodes) click to toggle source
# File lib/global_phone/database_generator.rb, line 124
def format_nodes_for(territory_nodes)
  territory_nodes.map do |node|
    node.search("availableFormats numberFormat").to_a
  end.flatten
end
pattern(node, selector) click to toggle source
# File lib/global_phone/database_generator.rb, line 140
def pattern(node, selector)
  squish(text_or_nil(node, selector))
end
squish(string) click to toggle source
# File lib/global_phone/database_generator.rb, line 136
def squish(string)
  string.gsub(/\s+/, "") if string
end
territory_name(node) click to toggle source
# File lib/global_phone/database_generator.rb, line 47
def territory_name(node)
  node["id"]
end
territory_nodes() click to toggle source
# File lib/global_phone/database_generator.rb, line 39
def territory_nodes
  doc.search("territory")
end
territory_nodes_by_region() click to toggle source
# File lib/global_phone/database_generator.rb, line 43
def territory_nodes_by_region
  territory_nodes.group_by { |node| node["countryCode"] }
end
text_or_nil(node, selector) click to toggle source
# File lib/global_phone/database_generator.rb, line 144
def text_or_nil(node, selector)
  nodes = node.search(selector)
  nodes.empty? ? nil : nodes.text
end
truncate(array) click to toggle source
# File lib/global_phone/database_generator.rb, line 130
def truncate(array)
  array.dup.tap do |result|
    result.pop while result.any? && result.last.nil?
  end
end