# Copyright 2019 Ram Rachum and collaborators. # This program is distributed under the MIT license. '''Python 2/3 compatibility''' import abc import os import inspect import sys import datetime as datetime_module PY3 = (sys.version_info[0] == 3) PY2 = not PY3 if hasattr(abc, 'ABC'): ABC = abc.ABC else: class ABC(object): """Helper class that provides a standard way to create an ABC using inheritance. """ __metaclass__ = abc.ABCMeta __slots__ = () if hasattr(os, 'PathLike'): PathLike = os.PathLike else: class PathLike(ABC): """Abstract base class for implementing the file system path protocol.""" @abc.abstractmethod def __fspath__(self): """Return the file system path representation of the object.""" raise NotImplementedError @classmethod def __subclasshook__(cls, subclass): return ( hasattr(subclass, '__fspath__') or # Make a concession for older `pathlib` versions:g (hasattr(subclass, 'open') and 'path' in subclass.__name__.lower()) ) try: iscoroutinefunction = inspect.iscoroutinefunction except AttributeError: iscoroutinefunction = lambda whatever: False # Lolz try: isasyncgenfunction = inspect.isasyncgenfunction except AttributeError: isasyncgenfunction = lambda whatever: False # Lolz if PY3: string_types = (str,) text_type = str else: string_types = (basestring,) text_type = unicode try: from collections import abc as collections_abc except ImportError: # Python 2.7 import collections as collections_abc if sys.version_info[:2] >= (3, 6): time_isoformat = datetime_module.time.isoformat else: def time_isoformat(time, timespec='microseconds'): assert isinstance(time, datetime_module.time) if timespec != 'microseconds': raise NotImplementedError result = '{:02d}:{:02d}:{:02d}.{:06d}'.format( time.hour, time.minute, time.second, time.microsecond ) assert len(result) == 15 return result def timedelta_format(timedelta): time = (datetime_module.datetime.min + timedelta).time() return time_isoformat(time, timespec='microseconds') def timedelta_parse(s): hours, minutes, seconds, microseconds = map( int, s.replace('.', ':').split(':') ) return datetime_module.timedelta(hours=hours, minutes=minutes, seconds=seconds, microseconds=microseconds)