def _read_timezone_ids_and_aliases() -> Dict[str, List[str]]: """Read ZIC-format file from pytz's tzdata.zi. Output {zone: [aliases]}. Spec: https://man7.org/linux/man-pages/man8/zic.8.html#FILES """ # example Zone line: # Z Antarctica/Troll 0 - -00 2005 F 12 # we only care about the zone_re = re.compile(r"(?:Z|Zo|Zon|Zone)\s+(?P<zone>[^\s]+)") # example Link line: # L Asia/Nicosia Europe/Nicosia # here, "Asia/Nicosia" is the zone, and "Europe/Nicosia" is the link link_re = re.compile( r"(?:L|Li|Lin|Link)\s+(?P<zone>[^\s]+)\s+(?P<alias>[^\s]+)") zone_aliases = {} # mapping from zone to all aliases (includes all zones) with pytz.open_resource("tzdata.zi") as bio: with io.TextIOWrapper(bio, encoding="ascii") as tio: for line in tio.readlines(): zone_match = zone_re.match(line) if zone_match: zone = zone_match.group("zone") if zone not in zone_aliases: if zone in pytz.all_timezones_set: # ignore "Factory" zone zone_aliases[zone] = [] link_match = link_re.match(line) if link_match: zone = link_match.group("zone") alias = link_match.group("alias") if zone in zone_aliases: zone_aliases[zone].append(alias) else: zone_aliases[zone] = [alias] return zone_aliases
def load(cls, name): name = _compat.decode(name) try: with pytz.open_resource(name) as f: return cls._load(f) except _compat.FileNotFoundError: raise ValueError('Unknown timezone [{}]'.format(name))
def load(cls): with open_resource('leap-seconds.list') as f: table = [ tuple(map(int, line.split(None, 2)[:2])) for line in f if not (line.startswith('#') or line.strip() == '') ] table.reverse() cls._leap_seconds = tuple(table)
def get_canonical_timezone_map() -> Dict[str, str]: canonical = {} with TextIOWrapper( pytz.open_resource( "tzdata.zi" ) # type: ignore[attr-defined] # Unclear if this is part of the public pytz API ) as f: for line in f: if line.startswith("L "): l, name, alias = line.split() canonical[alias] = name return canonical
def get_timezone_coordinates(timezone): global _coordinates if not _coordinates: _coordinates = {} zone_tab = pytz.open_resource('zone.tab') for line in zone_tab.readlines(): if line.startswith('#'): continue code, coordinates, zone = line.split(None, 4)[:3] _coordinates[zone] = _dms_to_point(coordinates) if hasattr(timezone, 'zone'): return _coordinates.get(timezone.zone) return _coordinates.get(timezone)
def _fill(self): data = {} zone_tab = pytz.open_resource('zone.tab') try: for line in zone_tab: line = line.decode('UTF-8') if line.startswith('#'): continue code, coordinates, zone = line.split(None, 4)[:3] match = re_zoneloc.match(coordinates) if match: data[zone] = self._convert_coordinates(match) self.data = data finally: zone_tab.close()
def get_timezones(self): zone_tab = pytz.open_resource('zone.tab') try: data = {} for line in zone_tab: line = line.decode('UTF-8') if line.startswith('#'): continue code, coordinates, zone = line.split(None, 4)[:3] if zone not in pytz.all_timezones_set: continue try: data[code].append(zone) except KeyError: data[code] = [zone] self.timezones = data finally: zone_tab.close()
def _zone_tab(): zonetype = collections.namedtuple('Zone', ('code', 'coordinates', 'zone', 'comment')) with pytz.open_resource('zone.tab') as fobj: for line in fobj: line = line.decode('UTF-8') if line.startswith('#'): continue pieces = line.rstrip().split(None, 3) code, coordinates, zone = pieces[:3] comment = len(pieces) == 4 and pieces[3] or '' if zone not in pytz.all_timezones_set: continue coordinates = _parse_iso6709(coordinates) if not coordinates: continue lat, lon = coordinates yield zonetype(code, (lat, lon), zone, comment)
print 'Using config file: {0}'.format(configFileName) # Next, we need the (stripped) DC file: dcFile = DCFile() filepath = os.path.join(args.src_dir, 'astron') for filename in os.listdir(filepath): if filename.endswith('.dc'): dcFile.read(Filename.fromOsSpecific(os.path.join(filepath, filename))) dcStream = StringStream() dcFile.write(dcStream, True) dcData = dcStream.getData() # Now, collect our timezone info: zoneInfo = {} for timezone in pytz.all_timezones: zoneInfo['zoneinfo/' + timezone] = pytz.open_resource(timezone).read() # Finally, write our data to game_data.py: print 'Writing game_data.py...' gameData = '''\ CONFIG = %r DC = %r ZONEINFO = %r''' with open(os.path.join(args.build_dir, 'game_data.py'), 'w') as f: f.write(gameData % (configData, dcData, zoneInfo)) def getDirectoryMD5Hash(directory): def _updateChecksum(checksum, dirname, filenames): for filename in sorted(filenames): path = os.path.join(dirname, filename)