class WorldDb::ReaderBase
Public Class Methods
new( opts={} )
click to toggle source
# File lib/worlddb/reader.rb, line 23 def initialize( opts={} ) ## option: do NOT generate/add any tags for countries/states/cities @skip_tags = opts[:skip_tags].present? ? true : false ## option: for now issue warning on update, that is, if key/record (country,state,city) already exists @strict = opts[:strict].present? ? true : false end
Public Instance Methods
load( name )
click to toggle source
# File lib/worlddb/reader.rb, line 40 def load( name ) if name =~ /^continents/ load_continent_defs( name ) elsif name =~ /\/continents/ load_continent_refs( name ) elsif name =~ /^lang/ ## todo: pass along opts too ## use match_usage( name ) - why? why not?? ??? r = create_lang_reader( name ) r.read() elsif name =~ /\/lang/ ## todo: pass along opts too ## use match_usage( name ) - why? why not?? ??? r = create_usage_reader( name ) r.read() elsif name =~ /\/fifa/ || name =~ /\/fips/ || name =~ /\/internet/ || name =~ /\/ioc/ || name =~ /\/iso/ || name =~ /\/motor/ load_codes( name ) elsif name =~ /^tag.*\.\d$/ ## todo: pass along opts too ## use match_tags( name ) - why? why not?? ??? ######## FIX: add back again ### fix: use read() only, that is, w/o name ## r = create_tag_reader( name ) ## r.read() elsif match_countries_for_continent( name ) do |continent| # # e.g. africa/countries or america/countries ### NB: continent changed to regions (e.g. middle-east, caribbean, north-america, etc.) ## auto-add continent (from folder structure) as tag ## fix: allow dash/hyphen/minus in tag ### todo/fix: add opts - how?? r = create_country_reader( name, tags: continent.tr('-', '_') ) r.read() end elsif match_cities_for_country( name ) do |country_key| # name =~ /\/([a-z]{2})\/cities/ ## auto-add required country code (from folder structure) country = Country.find_by_key!( country_key ) logger.debug "Country #{country.key} >#{country.name} (#{country.code})<" r = create_city_reader( name, country_id: country.id ) r.read() end elsif match_tree_for_country( name ) do |country_key| ## auto-add required country code (from folder structure) country = Country.find_by_key!( country_key ) logger.debug "Country #{country.key} >#{country.name} (#{country.code})<" r = create_tree_reader( name, country_id: country.id ) r.read() end elsif match_states_abbr_for_country( name ) do |country_key| # name =~ /\/([a-z]{2})\/states\.abbr/ load_states_xxx( country_key, 'abbr', name ) end elsif match_states_iso_for_country( name ) do |country_key| # name =~ /\/([a-z]{2})\/states\.iso/ load_states_xxx( country_key, 'iso', name ) end elsif match_states_nuts_for_country( name ) do |country_key| # name =~ /\/([a-z]{2})\/states\.nuts/ load_states_xxx( country_key, 'nuts', name ) end elsif match_adm3_counties_for_country( name ) do |country_key, state_key, part_name| ## auto-add required country code (from folder structure) country = Country.find_by_key!( country_key ) logger.debug "Country #{country.key} >#{country.name} (#{country.code})<" state = State.find_by_key_and_country_id!( state_key, country.id ) logger.debug "State (ADM1) #{state.key} >#{state.name}<" ### todo: move find adm2 to model for (re)use !!! part = Part.where( "lower(name) = ? AND state_id = ?", part_name, state.id ).first ## check - first needed? returns ary?? if part.nil? logger.error "fix!! - skipping adm3_counties - part (ADM2) '#{part_name}' not found" next end logger.debug "Part (ADM2) #{part.key} >#{part.name}<" st = create_county_reader( name, state_id: state.id, part_id: part.id, level: 3 ) # note: change county level to 3 (default is 2) st.read() end elsif match_adm2_counties_for_country( name ) do |country_key,state_key| ## auto-add required country code (from folder structure) country = Country.find_by_key!( country_key ) logger.debug "Country #{country.key} >#{country.name} (#{country.code})<" state = State.find_by_key_and_country_id!( state_key, country.id ) logger.debug "State (ADM1) #{state.key} >#{state.name}<" st = create_county_reader( name, state_id: state.id, ## part_id: nil, level: 2 ) st.read() end elsif match_adm2_parts_for_country( name ) do |country_key,state_key| ## auto-add required country code (from folder structure) country = Country.find_by_key!( country_key ) logger.debug "Country #{country.key} >#{country.name} (#{country.code})<" state = State.find_by_key_and_country_id!( state_key, country.id ) logger.debug "State (ADM2) #{state.key} >#{state.name}<" st = create_part_reader( name, state_id: state.id, level: 2 ) st.read() end ### fix: change to match_adm1_states_for_country() - why? why not?? elsif match_states_for_country( name ) do |country_key| # name =~ /\/([a-z]{2})\/states/ ## auto-add required country code (from folder structure) country = Country.find_by_key!( country_key ) logger.debug "Country #{country.key} >#{country.name} (#{country.code})<" st = create_state_reader( name, country_id: country.id, level: 1 ) st.read() end else logger.error "unknown world.db fixture type >#{name}<" # todo/fix: exit w/ error end end
load_codes( name )
click to toggle source
# File lib/worlddb/reader.rb, line 224 def load_codes( name ) reader = create_line_reader( name ) reader.each_line do |line| values = line.split(',') ## logger.debug '[>' + values.join( '<|>' ) + '<]' if name =~ /iso/ # special case for iso # country ref, alpha2, alpha3, num country_name = values[0].strip else # code, country ref country_name = values[1].strip end ## try to find country cty = Country.search_by_name( country_name ) if cty.nil? logger.warn "no country match found for >#{country_name}<; skipping line; in [#{name}]" next end if name =~ /\/fifa/ cty.fifa = values[0].strip elsif name =~ /\/fips/ cty.fips = values[0].strip elsif name =~ /\/internet/ # NOTE: remove (optional) leading . e.g. .at becomes at cty.net = values[0].sub( /^\s*\./,'' ).strip elsif name =~ /\/ioc/ cty.ioc = values[0].strip elsif name =~ /\/motor/ cty.motor = values[0].strip elsif name =~ /\/iso/ cty.alpha2 = values[1].strip cty.alpha3 = values[2].strip # NOTE: num is a string!!! use (rename to) num_str - why? why not? cty.num = values[3].strip else logger.warn "warn: unknown country code type; skipping line; in [#{name}]" next end cty.save! end end
load_continent_defs( name, more_attribs={} )
click to toggle source
use ContinentDef Reader
# File lib/worlddb/reader.rb, line 198 def load_continent_defs( name, more_attribs={} ) reader = create_values_reader( name, more_attribs ) reader.each_line do |attribs, values| ## check optional values values.each_with_index do |value, index| logger.warn "unknown type for value >#{value}<" end rec = Continent.find_by_key( attribs[ :key ] ) if rec.present? logger.debug "update Continent #{rec.id}-#{rec.key}:" else logger.debug "create Continent:" rec = Continent.new end logger.debug attribs.to_json rec.update_attributes!( attribs ) end # each lines end
load_continent_refs( name )
click to toggle source
use ContinentRefReader
# File lib/worlddb/reader.rb, line 186 def load_continent_refs( name ) reader = create_hash_reader( name ) reader.each do |key, value| country = Country.find_by_key!( key ) continent = Continent.find_by_key!( value ) country.continent_id = continent.id country.save! end end
load_setup( name )
click to toggle source
# File lib/worlddb/reader.rb, line 31 def load_setup( name ) reader = create_fixture_reader( name ) reader.each do |fixture| load( fixture ) end end
load_states_xxx( country_key, xxx, name )
click to toggle source
use StateAttrReader
# File lib/worlddb/reader.rb, line 171 def load_states_xxx( country_key, xxx, name ) country = Country.find_by_key!( country_key ) logger.debug "Country #{country.key} >#{country.name} (#{country.code})<" reader = create_hash_reader( name ) reader.each do |key, value| state = State.find_by_country_id_and_key!( country.id, key ) state.send( "#{xxx}=", value ) state.save! end end
strict?()
click to toggle source
# File lib/worlddb/reader.rb, line 20 def strict?() @strict == true; end