mobi/telephone_number

View on GitHub
lib/importers/test_data_importer.rb

Summary

Maintainability
A
35 mins
Test Coverage
module TelephoneNumber
  require 'nokogiri'
  require 'httparty'
  require 'yaml'

  class TestDataImporter
    URL =  "https://libphonenumber.appspot.com/phonenumberparser?number=%s&country=%s".freeze
    COUNTRIES = {
                  AE: %w(971529933171 971553006144 971551000291),
                  AR: %w(299154104587 1143211200),
                  AU: %w(0467703037),
                  BE: %w(32498485960 32477702206 32474095692),
                  BO: %w(59178500348 59178006138 59178006139),
                  BR: %w(011992339376 1123456789 11961234567 55991472683),
                  BY: %w(80152450911 294911911 152450911),
                  CA: %w(16135550119 16135550171 16135550112 16135550194
                         16135550122 16135550131 15146708700 14169158200),
                  CH: %w(41794173875 41795061129 41795820985),
                  CL: %w(961234567 221234567),
                  CN: %w(15694876068 13910503766 15845989469 05523245954 04717158875 03748086894),
                  CO: %w(6012345678 3211234567),
                  CR: %w(22123456 83123456),
                  DE: %w(15222503070),
                  DK: %w(4524453744 4551622172 4542428484),
                  EC: %w(593992441504 593984657155 593984015053),
                  EE: %w(37253629280 37253682997 37254004517),
                  ES: %w(34606217800 34667751353 34646570628),
                  FR: %w(0607114556),
                  GB: %w(448444156790 442079308181 442076139800 442076361000
                         07780991912 442076299400 442072227888),
                  HK: %w(64636251),
                  HU: %w(36709311285 36709311279 36709311206),
                  IE: %w(0863634875),
                  IN: %w(915622231515 912942433300 912912510101 911126779191
                         912224818000 917462223999 912266653366 912266325757
                         914066298585 911242451234 911166566162 911123890606
                         911123583754 5622231515 2942433300 2912510101
                         1126779191 2224818000 7462223999 2266653366
                         2266325757 4066298585 1242451234 1166566162
                         1123890606 1123583754 09176642499),
                  IT: %w(393478258998 393440161350),
                  JP: %w(312345678 9012345678),
                  KR: %w(821036424812 821053812833 821085894820),
                  MX: %w(4423593227 14423593227),
                  NL: %w(31610958780 31610000852 31611427604),
                  NO: %w(4792272668 4797065876 4792466013),
                  NZ: %w(64212715077 6421577017 64212862111),
                  PE: %w(51994156035 51987527881 51972737259),
                  PH: %w(639285588185 639285588262 639285548190),
                  PL: %w(48665666003 48885882321 48885889958),
                  QA: %w(97470482288 97474798678),
                  RO: %w(40724242563 40727798526 40727735377),
                  SA: %w(966503891468 966501543349 966500939012),
                  SE: %w(46708922920 46723985268 46761001966),
                  SG: %w(96924755),
                  TR: %w(905497728782 905497728780 905497728781),
                  TT: %w(18687804765 18687804843 18687804752),
                  TW: %w(886905627933 886905627901 886905627925),
                  US: %w(16502530000 14044879000 15123435283 13032450086 16175751300
                         3175083345 13128404100 12485934000 19497941600 14257395600 13103106000
                         16086699600 12125650000 14123456700 14157360000 12068761800
                         12023461100 3175082333, 3502341234, 3502523420, 3502504620, 5292500143,
                         5292520412),
                  VE: %w(584149993108 584248407260 584248271518),
                  ZA: %w(27826187617 27823014578 27828840632)
                }.freeze
    def self.import!
      output_hash = {}
      fetch_data(output_hash)
      write_file(output_hash)
      true
    end

    def self.fetch_data(output_hash)
      COUNTRIES.each do |key, value|
        output_hash[key] = {}

        value.each_with_index do |num, counter|
          page = HTTParty.get(format(URL, num, key.to_s))
          parsed_page = Nokogiri::HTML.parse(page)
          body = parsed_page.elements.first.elements.css('body').first
          parsed_data = parse_remote_data(counter, body.elements.css('table')[2])
          output_hash[key].merge!(parsed_data)
        end
      end
      return output_hash
    end

    def self.parse_remote_data(counter, table)
      output = { counter.to_s => {} }
      table.elements.each do |row|
        next if row.elements.one?
        key = case row.elements.css('th').text
              when 'E164 format'
                :e164_formatted
              when 'National format'
                :national_formatted
              when 'International format'
                :international_formatted
              end

        output[counter.to_s][key] = row.elements.css('td').text if key
      end
      return output
    end

    def self.write_file(data)
      File.open('test/valid_numbers.yml', 'w') do |file|
        file.write "# This file is generated automatically by TestDataImporter. \n" \
          "# Any changes made to this file will be overridden next time test data is generated. \n" \
          "# Please edit TestDataImporter if you need to add test cases. \n"

        file.write data.to_yaml
      end
    end
  end
end