mirror of
				https://github.com/github/octodns.git
				synced 2024-05-11 05:55:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#
 | 
						|
#
 | 
						|
#
 | 
						|
 | 
						|
from logging import getLogger
 | 
						|
 | 
						|
from .geo_data import geo_data
 | 
						|
 | 
						|
 | 
						|
class GeoCodes(object):
 | 
						|
    log = getLogger('GeoCodes')
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def validate(cls, code, prefix):
 | 
						|
        '''
 | 
						|
        Validates an octoDNS geo code making sure that it is a valid and
 | 
						|
        corresponding:
 | 
						|
            * continent
 | 
						|
            * continent & country
 | 
						|
            * continent, country, & province
 | 
						|
        '''
 | 
						|
        reasons = []
 | 
						|
 | 
						|
        pieces = code.split('-')
 | 
						|
        n = len(pieces)
 | 
						|
        if n > 3:
 | 
						|
            reasons.append('{}invalid geo code "{}"'.format(prefix, code))
 | 
						|
        elif n > 0 and pieces[0] not in geo_data:
 | 
						|
            reasons.append('{}unknown continent code "{}"'
 | 
						|
                           .format(prefix, code))
 | 
						|
        elif n > 1 and pieces[1] not in geo_data[pieces[0]]:
 | 
						|
            reasons.append('{}unknown country code "{}"'.format(prefix, code))
 | 
						|
        elif n > 2 and \
 | 
						|
                pieces[2] not in geo_data[pieces[0]][pieces[1]]['provinces']:
 | 
						|
            reasons.append('{}unknown province code "{}"'.format(prefix, code))
 | 
						|
 | 
						|
        return reasons
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def parse(cls, code):
 | 
						|
        pieces = code.split('-')
 | 
						|
        try:
 | 
						|
            country_code = pieces[1]
 | 
						|
        except IndexError:
 | 
						|
            country_code = None
 | 
						|
        try:
 | 
						|
            province_code = pieces[2]
 | 
						|
        except IndexError:
 | 
						|
            province_code = None
 | 
						|
        return {
 | 
						|
            'continent_code': pieces[0],
 | 
						|
            'country_code': country_code,
 | 
						|
            'province_code': province_code,
 | 
						|
        }
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def country_to_code(cls, country):
 | 
						|
        for continent, countries in geo_data.items():
 | 
						|
            if country in countries:
 | 
						|
                return '{}-{}'.format(continent, country)
 | 
						|
        cls.log.warn('country_to_code: unrecognized country "%s"', country)
 | 
						|
        return
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def province_to_code(cls, province):
 | 
						|
        # We get to cheat on this one since we only support provinces in NA-US
 | 
						|
        if province not in geo_data['NA']['US']['provinces']:
 | 
						|
            cls.log.warn('country_to_code: unrecognized province "%s"',
 | 
						|
                         province)
 | 
						|
            return
 | 
						|
        return 'NA-US-{}'.format(province)
 |