#!/usr/bin/env python from collections import defaultdict from pycountry import countries, subdivisions from pycountry_convert import country_alpha2_to_continent_code subs = defaultdict(dict) for subdivision in subdivisions: # Route53 only supports US states, Dyn (and others) support US states and CA provinces if subdivision.country_code not in ('US', 'CA'): continue subs[subdivision.country_code][subdivision.code[3:]] = { 'name': subdivision.name } subs = dict(subs) # These are best guesses at things pycountry_convert doesn't map continent_backups = { 'AQ': 'AN', 'EH': 'AF', 'PN': 'OC', 'SX': 'NA', 'TF': 'AN', 'TL': 'AS', 'UM': 'OC', 'VA': 'EU', } geos = defaultdict(dict) for country in countries: try: continent_code = country_alpha2_to_continent_code(country.alpha_2) except KeyError: try: continent_code = continent_backups[country.alpha_2] except KeyError: raise print( '{} {} {}'.format( country.alpha_2, country.name, getattr(country, 'official_name', ''), ) ) geos[continent_code][country.alpha_2] = {'name': country.name} try: geos[continent_code][country.alpha_2]['provinces'] = subs[ country.alpha_2 ] except KeyError: pass geos = dict(geos) print( '''# # -*- coding: utf-8 -*- # # This file is generated using # ./script/generate-geo-data > octodns/record/geo_data.py # do not modify it directly # geo_data = {''' ) for continent, details in sorted(geos.items()): print(f" '{continent}': {{") for country, info in sorted(details.items()): name = info['name'] quoted_name = f'"{name}"' if "'" in name else f"'{name}'" if 'provinces' in info: print(f" '{country}': {{") print(f" 'name': {quoted_name},") print(" 'provinces': {") for prov, info in sorted(info['provinces'].items()): name = info['name'] quoted_name = f'"{name}"' if "'" in name else f"'{name}'" print(f" '{prov}': {{'name': {quoted_name}}},") print(' },') print(' },') else: print(f" '{country}': {{'name': {quoted_name}}},") print(' },') print('}')