Module: Phonelib::DataImporterHelper

Included in:
Phonelib::DataImporter::Importer
Defined in:
lib/phonelib/data_importer_helper.rb

Constant Summary collapse

XML_COMMENT_ATTRIBUTES =

xml comments attributes names that should not be parsed

%w(text comment)
XML_FORMAT_NAMES =

xml format attributes names

%w(intlFormat format)

Instance Method Summary collapse

Instance Method Details

#camel2snake(s) ⇒ Object

method that converts camel case to snake case


129
130
131
# File 'lib/phonelib/data_importer_helper.rb', line 129

def camel2snake(s)
  s.gsub(/[A-Z]+/) { |m| "_#{m.downcase}" }
end

#file_path(file) ⇒ Object


9
10
11
# File 'lib/phonelib/data_importer_helper.rb', line 9

def file_path(file)
  "#{File.dirname(__FILE__)}/../../#{file}"
end

#fill_prefixes(key, value, prefix, prefixes) ⇒ Object

method updates prefixes hash recursively


36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/phonelib/data_importer_helper.rb', line 36

def fill_prefixes(key, value, prefix, prefixes)
  prefixes = {} if prefixes.nil?
  if prefix.size == 1
    pr = prefix.to_i
    prefixes[pr] ||= {}
    prefixes[pr][key] = value
  else
    pr = prefix[0].to_i
    prefixes[pr] = fill_prefixes(key, value, prefix[1..-1], prefixes[pr])
  end
  prefixes
end

#hash_from_xml(data, type) ⇒ Object

method creates hash from xml elements/element attributes


62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/phonelib/data_importer_helper.rb', line 62

def hash_from_xml(data, type)
  hash = {}
  case type
  when :attributes
    data.attributes.each do |k, v|
      hash[name2sym(k)] = str_clean(v)
    end
  when :children
    data.each do |f|
      hash[name2sym(f[0])] = f[1]
    end
  when :element
    data.elements.each do |child|
      if child.name == 'possibleLengths'
        hash[Core::POSSIBLE_PATTERN] =
            possible_length_regex(hash_from_xml(child, :attributes))
      else
        hash[name2sym(child.name)] = str_clean(child.children.first)
      end
    end
  end
  hash
end

#main_from_xml(file) ⇒ Object

get main body from parsed xml document


110
111
112
113
114
115
116
# File 'lib/phonelib/data_importer_helper.rb', line 110

def main_from_xml(file)
  xml_data = File.read(file)
  xml_data.force_encoding('utf-8')

  doc = Nokogiri::XML(xml_data)
  doc.elements.first.elements.first
end

#name2sym(name) ⇒ Object

helper that converts xml element name to symbol


124
125
126
# File 'lib/phonelib/data_importer_helper.rb', line 124

def name2sym(name)
  camel2snake(name).to_sym
end

#not_format?(name) ⇒ Boolean

method for checking if element name is not a format element

Returns:

  • (Boolean)

50
51
52
# File 'lib/phonelib/data_importer_helper.rb', line 50

def not_format?(name)
  !XML_FORMAT_NAMES.include? name
end

#parse_raw_file(file) ⇒ Object

method parses raw data file


98
99
100
101
102
103
104
105
106
107
# File 'lib/phonelib/data_importer_helper.rb', line 98

def parse_raw_file(file)
  data = {}
  File.readlines(file).each do |line|
    line = str_clean line, false
    next if line.empty? || line[0] == '#'
    prefix, line_data = line.split('|')
    data[prefix] = line_data && line_data.strip.split('&')
  end
  data
end

#possible_length_regex(attributes) ⇒ Object


86
87
88
89
90
91
92
93
94
95
# File 'lib/phonelib/data_importer_helper.rb', line 86

def possible_length_regex(attributes)
  return '' unless attributes[:national]
  attributes[:national].split(',').map do |m|
    if m.include? '-'
      "\\d{#{m.gsub(/[\[\]]/, '').gsub('-', ',')}}"
    else
      "\\d{#{m}}"
    end
  end.join('|')
end

#save_data_fileObject

method saves parsed data to data files


14
15
16
17
18
# File 'lib/phonelib/data_importer_helper.rb', line 14

def save_data_file
  File.open(file_path(Phonelib::Core::FILE_MAIN_DATA), 'wb+') do |f|
    Marshal.dump(@data, f)
  end
end

#save_extended_data_fileObject

method saves extended data file


21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/phonelib/data_importer_helper.rb', line 21

def save_extended_data_file
  extended = {
    Phonelib::Core::EXT_PREFIXES => @prefixes,
    Phonelib::Core::EXT_GEO_NAMES => @geo_names,
    Phonelib::Core::EXT_COUNTRY_NAMES => @countries,
    Phonelib::Core::EXT_TIMEZONES => @timezones,
    Phonelib::Core::EXT_CARRIERS => @carriers
  }
  File.open(file_path(Phonelib::Core::FILE_EXT_DATA), 'wb+') do |f|
    Marshal.dump(extended, f)
  end
  puts 'DATA SAVED'
end

#str_clean(s, white_space = true) ⇒ Object

helper that cleans string


119
120
121
# File 'lib/phonelib/data_importer_helper.rb', line 119

def str_clean(s, white_space = true)
  s.to_s.tr(white_space ? " \n" : "\n", '')
end

#without_comments(data) ⇒ Object

method filters xml elements excluding comments elements


55
56
57
58
59
# File 'lib/phonelib/data_importer_helper.rb', line 55

def without_comments(data)
  data.select do |el|
    !XML_COMMENT_ATTRIBUTES.include? el.name
  end
end