general: switch to using native 3.8 versions for cached_property/Literal/Protocol instead of compat

This commit is contained in:
Dima Gerasimov 2023-05-16 01:01:48 +01:00 committed by karlicoss
parent c34656e8fb
commit fe88380499
16 changed files with 29 additions and 98 deletions

View file

@ -3,13 +3,12 @@ from my.config import codeforces as config # type: ignore[attr-defined]
from datetime import datetime, timezone from datetime import datetime, timezone
from typing import NamedTuple from functools import cached_property
import json import json
from typing import Dict, Iterator from typing import NamedTuple, Dict, Iterator
from ..core import get_files, Res, unwrap from ..core import get_files, Res, unwrap
from ..core.compat import cached_property
from ..core.konsume import ignore, wrap from ..core.konsume import ignore, wrap

View file

@ -3,13 +3,12 @@ from my.config import topcoder as config # type: ignore[attr-defined]
from datetime import datetime from datetime import datetime
from typing import NamedTuple from functools import cached_property
import json import json
from typing import Dict, Iterator from typing import NamedTuple, Dict, Iterator
from ..core import get_files, Res, unwrap, Json from ..core import get_files, Res, unwrap, Json
from ..core.compat import cached_property
from ..core.error import Res, unwrap from ..core.error import Res, unwrap
from ..core.konsume import zoom, wrap, ignore from ..core.konsume import zoom, wrap, ignore

View file

@ -98,7 +98,7 @@ class location:
accuracy: float = 100 accuracy: float = 100
from my.core.compat import Literal from typing import Literal
class time: class time:
class tz: class tz:
policy: Literal['keep', 'convert', 'throw'] policy: Literal['keep', 'convert', 'throw']

View file

@ -366,10 +366,6 @@ def isoparse(s: str) -> tzdatetime:
return datetime.fromisoformat(s) return datetime.fromisoformat(s)
# legacy import -- we should use compat directly instead
from .compat import Literal
import re import re
# https://stackoverflow.com/a/295466/706389 # https://stackoverflow.com/a/295466/706389
def get_valid_filename(s: str) -> str: def get_valid_filename(s: str) -> str:
@ -664,5 +660,7 @@ def assert_never(value: NoReturn) -> NoReturn:
assert False, f'Unhandled value: {value} ({type(value).__name__})' assert False, f'Unhandled value: {value} ({type(value).__name__})'
# legacy deprecated import ## legacy imports, keeping them here for backwards compatibility
from .compat import cached_property as cproperty from functools import cached_property as cproperty
from typing import Literal
##

View file

@ -3,6 +3,7 @@ Some backwards compatibility stuff/deprecation helpers
''' '''
import sys import sys
from types import ModuleType from types import ModuleType
from typing import TYPE_CHECKING
from . import warnings from . import warnings
from .common import LazyLogger from .common import LazyLogger
@ -53,20 +54,10 @@ import os
windows = os.name == 'nt' windows = os.name == 'nt'
# keeping just for backwards compatibility, used to have compat implementation for 3.6
import sqlite3 import sqlite3
def sqlite_backup(*, source: sqlite3.Connection, dest: sqlite3.Connection, **kwargs) -> None: def sqlite_backup(*, source: sqlite3.Connection, dest: sqlite3.Connection, **kwargs) -> None:
if sys.version_info[:2] >= (3, 7): source.backup(dest, **kwargs)
source.backup(dest, **kwargs)
else:
# https://stackoverflow.com/a/10856450/706389
import io
tempfile = io.StringIO()
for line in source.iterdump():
tempfile.write('%s\n' % line)
tempfile.seek(0)
dest.cursor().executescript(tempfile.read())
dest.commit()
# can remove after python3.9 # can remove after python3.9
@ -76,55 +67,10 @@ def removeprefix(text: str, prefix: str) -> str:
return text return text
# can remove after python3.8 ## used to have compat function before 3.8 for these
if sys.version_info[:2] >= (3, 8): from functools import cached_property
from functools import cached_property from typing import Literal, Protocol, TypedDict
else: ##
from typing import TypeVar, Callable
Cl = TypeVar('Cl')
R = TypeVar('R')
def cached_property(f: Callable[[Cl], R]) -> R:
import functools
return property(functools.lru_cache(maxsize=1)(f))
del Cl
del R
from typing import TYPE_CHECKING
if sys.version_info[:2] >= (3, 8):
from typing import Literal
else:
if TYPE_CHECKING:
from typing_extensions import Literal
else:
# erm.. I guess as long as it's not crashing, whatever...
class _Literal:
def __getitem__(self, args):
pass
Literal = _Literal()
if sys.version_info[:2] >= (3, 8):
from typing import Protocol
else:
if TYPE_CHECKING:
from typing_extensions import Protocol
else:
# todo could also use NamedTuple?
Protocol = object
if sys.version_info[:2] >= (3, 8):
from typing import TypedDict
else:
if TYPE_CHECKING:
from typing_extensions import TypedDict
else:
from typing import Dict
TypedDict = Dict
if sys.version_info[:2] >= (3, 10): if sys.version_info[:2] >= (3, 10):

View file

@ -2,11 +2,10 @@ from __future__ import annotations
from .common import assert_subpackage; assert_subpackage(__name__) from .common import assert_subpackage; assert_subpackage(__name__)
from .common import PathIsh from .common import PathIsh
from .compat import Protocol
from .sqlite import sqlite_connect_immutable from .sqlite import sqlite_connect_immutable
## sadly dataset doesn't have any type definitions ## sadly dataset doesn't have any type definitions
from typing import Iterable, Iterator, Dict, Optional, Any from typing import Iterable, Iterator, Dict, Optional, Any, Protocol
from contextlib import AbstractContextManager from contextlib import AbstractContextManager

View file

@ -4,9 +4,7 @@ See https://beepb00p.xyz/mypy-error-handling.html#kiss for more detail
""" """
from itertools import tee from itertools import tee
from typing import Union, TypeVar, Iterable, List, Tuple, Type, Optional, Callable, Any, cast, Iterator from typing import Union, TypeVar, Iterable, List, Tuple, Type, Optional, Callable, Any, cast, Iterator, Literal
from .compat import Literal
T = TypeVar('T') T = TypeVar('T')

View file

@ -5,7 +5,7 @@ Various pandas helpers and convenience functions
# NOTE: this file is meant to be importable without Pandas installed # NOTE: this file is meant to be importable without Pandas installed
from datetime import datetime from datetime import datetime
from pprint import pformat from pprint import pformat
from typing import Optional, TYPE_CHECKING, Any, Iterable, Type, Dict from typing import Optional, TYPE_CHECKING, Any, Iterable, Type, Dict, Literal
from . import warnings, Res from . import warnings, Res
from .common import LazyLogger, Json, asdict from .common import LazyLogger, Json, asdict
@ -45,8 +45,6 @@ def check_dateish(s) -> Iterable[str]:
'''.strip() '''.strip()
from .compat import Literal
ErrorColPolicy = Literal[ ErrorColPolicy = Literal[
'add_if_missing', # add error column if it's missing 'add_if_missing', # add error column if it's missing
'warn' , # warn, but do not modify 'warn' , # warn, but do not modify

View file

@ -6,11 +6,10 @@ from pathlib import Path
import shutil import shutil
import sqlite3 import sqlite3
from tempfile import TemporaryDirectory from tempfile import TemporaryDirectory
from typing import Tuple, Any, Iterator, Callable, Optional, Union from typing import Tuple, Any, Iterator, Callable, Optional, Union, Literal
from .common import PathIsh, assert_never from .common import PathIsh, assert_never
from .compat import Literal
def sqlite_connect_immutable(db: PathIsh) -> sqlite3.Connection: def sqlite_connect_immutable(db: PathIsh) -> sqlite3.Connection:
@ -86,8 +85,7 @@ def sqlite_copy_and_open(db: PathIsh) -> sqlite3.Connection:
for p in tocopy: for p in tocopy:
shutil.copy(p, tdir / p.name) shutil.copy(p, tdir / p.name)
with sqlite3.connect(str(tdir / dp.name)) as conn: with sqlite3.connect(str(tdir / dp.name)) as conn:
from .compat import sqlite_backup conn.backup(target=dest)
sqlite_backup(source=conn, dest=dest)
conn.close() conn.close()
return dest return dest

View file

@ -1,8 +1,7 @@
from my.core import __NOT_HPI_MODULE__ from my.core import __NOT_HPI_MODULE__
from typing import Iterator, Optional from typing import Iterator, Optional, Protocol
from my.core.compat import Protocol
from my.core import datetime_aware from my.core import datetime_aware

View file

@ -1,10 +1,9 @@
from dataclasses import replace from dataclasses import replace
from datetime import datetime from datetime import datetime
from itertools import chain from itertools import chain
from typing import Iterator, Dict, Any from typing import Iterator, Dict, Any, Protocol
from my.core import warn_if_empty, Res from my.core import warn_if_empty, Res
from my.core.compat import Protocol
class User(Protocol): class User(Protocol):

View file

@ -1,9 +1,8 @@
from datetime import date, datetime from datetime import date, datetime
from typing import Union, Tuple, Optional, Iterable, TextIO, Iterator from typing import Union, Tuple, Optional, Iterable, TextIO, Iterator, Protocol
from dataclasses import dataclass from dataclasses import dataclass
from my.core import __NOT_HPI_MODULE__ from my.core import __NOT_HPI_MODULE__
from my.core.compat import Protocol
DateIsh = Union[datetime, date, str] DateIsh = Union[datetime, date, str]

View file

@ -73,7 +73,7 @@ def get_location(dt: datetime) -> LatLon:
return loc[0].lat, loc[0].lon return loc[0].lat, loc[0].lon
# TODO: in python3.9, use functools.cached_property instead? # TODO: in python3.8, use functools.cached_property instead?
@lru_cache(maxsize=None) @lru_cache(maxsize=None)
def homes_cached() -> List[Tuple[datetime, LatLon]]: def homes_cached() -> List[Tuple[datetime, LatLon]]:
return list(config._history) return list(config._history)

View file

@ -4,10 +4,9 @@ type of shared models have a standardized interface
""" """
from my.core import __NOT_HPI_MODULE__ from my.core import __NOT_HPI_MODULE__
from typing import Set, Iterator from typing import Set, Iterator, Protocol
from itertools import chain from itertools import chain
from my.core.compat import Protocol
from my.core import datetime_aware, Json from my.core import datetime_aware, Json

View file

@ -6,12 +6,12 @@ REQUIRES = [
'icalendar', 'icalendar',
] ]
from datetime import datetime
from functools import cached_property
import re import re
from typing import Dict, List, Iterator from typing import Dict, List, Iterator
from datetime import datetime
from .core.common import LazyLogger, get_files, group_by_key, make_dict from .core.common import LazyLogger, get_files, group_by_key, make_dict
from .core.compat import cached_property
from my.config import rtm as config from my.config import rtm as config

View file

@ -22,9 +22,9 @@ except ImportError as ie:
from dataclasses import dataclass from dataclasses import dataclass
from functools import cached_property
import html import html
from ..core.common import Paths, datetime_aware from ..core.common import Paths, datetime_aware
from ..core.compat import cached_property
from ..core.error import Res from ..core.error import Res
from ..core.kompress import ZipPath from ..core.kompress import ZipPath