From 2b0f92c88334e343520fb3a2ee2bceb68725b04c Mon Sep 17 00:00:00 2001 From: Dima Gerasimov Date: Fri, 16 Aug 2024 00:14:44 +0300 Subject: [PATCH] my.core: deprecate Path/dataclass imports from my.core during type checking runtime still works for backwards compatibility --- my/arbtt.py | 6 ++++-- my/browser/active_browser.py | 3 ++- my/core/__init__.py | 14 +++++++++----- my/core/core_config.py | 6 ++++-- my/google/takeout/parser.py | 3 ++- my/lastfm.py | 3 ++- my/location/fallback/via_ip.py | 3 ++- my/location/google_takeout_semantic.py | 3 ++- my/location/gpslogger.py | 5 ++++- my/stackexchange/gdpr.py | 6 +++--- 10 files changed, 34 insertions(+), 18 deletions(-) diff --git a/my/arbtt.py b/my/arbtt.py index 941a05f..6de8cb2 100644 --- a/my/arbtt.py +++ b/my/arbtt.py @@ -6,6 +6,7 @@ REQUIRES = ['ijson', 'cffi'] # NOTE likely also needs libyajl2 from apt or elsewhere? +from dataclasses import dataclass from pathlib import Path from typing import Sequence, Iterable, List, Optional @@ -22,8 +23,9 @@ def inputs() -> Sequence[Path]: return get_files(user_config.logfiles) -from .core import dataclass, Json, PathIsh, datetime_aware -from .core.compat import fromisoformat + +from my.core import Json, PathIsh, datetime_aware +from my.core.compat import fromisoformat @dataclass diff --git a/my/browser/active_browser.py b/my/browser/active_browser.py index 601182a..6f335bd 100644 --- a/my/browser/active_browser.py +++ b/my/browser/active_browser.py @@ -4,9 +4,10 @@ Parses active browser history by backing it up with [[http://github.com/seanbrec REQUIRES = ["browserexport", "sqlite_backup"] +from dataclasses import dataclass from my.config import browser as user_config -from my.core import Paths, dataclass +from my.core import Paths @dataclass diff --git a/my/core/__init__.py b/my/core/__init__.py index 3881485..fa50413 100644 --- a/my/core/__init__.py +++ b/my/core/__init__.py @@ -1,4 +1,6 @@ # this file only keeps the most common & critical types/utility functions +from typing import TYPE_CHECKING + from .common import get_files, PathIsh, Paths from .common import Json from .stats import stat, Stats @@ -12,10 +14,12 @@ from .logging import make_logger, LazyLogger from .util import __NOT_HPI_MODULE__ -# just for brevity in modules -# todo not sure about these.. maybe best to rely on regular imports.. perhaps compare? -from dataclasses import dataclass -from pathlib import Path +if not TYPE_CHECKING: + # we used to keep these here for brevity, but feels like it only adds confusion, + # e.g. suggest that we perhaps somehow modify builtin behaviour or whatever + # so best to prefer explicit behaviour + from dataclasses import dataclass + from pathlib import Path __all__ = [ @@ -34,7 +38,7 @@ __all__ = [ 'Res', 'unwrap', - 'dataclass', 'Path', # TODO deprecate these from use in my.core + 'dataclass', 'Path', ] diff --git a/my/core/core_config.py b/my/core/core_config.py index e70dc05..889dbf9 100644 --- a/my/core/core_config.py +++ b/my/core/core_config.py @@ -1,10 +1,13 @@ ''' Bindings for the 'core' HPI configuration ''' + +from dataclasses import dataclass +from pathlib import Path import re from typing import Sequence, Optional -from . import warnings, PathIsh, Path +from . import warnings, PathIsh try: from my.config import core as user_config # type: ignore[attr-defined] @@ -21,7 +24,6 @@ except Exception as e: _HPI_CACHE_DIR_DEFAULT = '' -from dataclasses import dataclass @dataclass class Config(user_config): ''' diff --git a/my/google/takeout/parser.py b/my/google/takeout/parser.py index 3ddd99d..173f99a 100644 --- a/my/google/takeout/parser.py +++ b/my/google/takeout/parser.py @@ -15,10 +15,11 @@ the cachew cache REQUIRES = ["git+https://github.com/seanbreckenridge/google_takeout_parser"] from contextlib import ExitStack +from dataclasses import dataclass import os from typing import List, Sequence, cast from pathlib import Path -from my.core import make_config, dataclass, stat, Stats +from my.core import make_config, stat, Stats from my.core.cachew import mcachew from my.core.common import LazyLogger, get_files, Paths from my.core.error import ErrorPolicy diff --git a/my/lastfm.py b/my/lastfm.py index 64ef1b3..37cec50 100644 --- a/my/lastfm.py +++ b/my/lastfm.py @@ -2,7 +2,8 @@ Last.fm scrobbles ''' -from my.core import Paths, dataclass, make_logger +from dataclasses import dataclass +from my.core import Paths, make_logger from my.config import lastfm as user_config diff --git a/my/location/fallback/via_ip.py b/my/location/fallback/via_ip.py index f637552..87802e7 100644 --- a/my/location/fallback/via_ip.py +++ b/my/location/fallback/via_ip.py @@ -4,9 +4,10 @@ Converts IP addresses provided by my.location.ip to estimated locations REQUIRES = ["git+https://github.com/seanbreckenridge/ipgeocache"] +from dataclasses import dataclass from datetime import timedelta -from my.core import dataclass, Stats, make_config +from my.core import Stats, make_config from my.config import location from my.core.warnings import medium diff --git a/my/location/google_takeout_semantic.py b/my/location/google_takeout_semantic.py index 4257f81..5f2c055 100644 --- a/my/location/google_takeout_semantic.py +++ b/my/location/google_takeout_semantic.py @@ -7,12 +7,13 @@ Extracts semantic location history using google_takeout_parser REQUIRES = ["git+https://github.com/seanbreckenridge/google_takeout_parser"] +from dataclasses import dataclass from typing import Iterator, List from my.google.takeout.parser import events, _cachew_depends_on as _parser_cachew_depends_on from google_takeout_parser.models import PlaceVisit as SemanticLocation -from my.core import dataclass, make_config, stat, LazyLogger, Stats +from my.core import make_config, stat, LazyLogger, Stats from my.core.cachew import mcachew from my.core.error import Res from .common import Location diff --git a/my/location/gpslogger.py b/my/location/gpslogger.py index 8fb59d0..6d158a0 100644 --- a/my/location/gpslogger.py +++ b/my/location/gpslogger.py @@ -4,8 +4,11 @@ Parse [[https://github.com/mendhak/gpslogger][gpslogger]] .gpx (xml) files REQUIRES = ["gpxpy"] + +from dataclasses import dataclass + from my.config import location -from my.core import Paths, dataclass +from my.core import Paths @dataclass diff --git a/my/stackexchange/gdpr.py b/my/stackexchange/gdpr.py index 2f3b98d..5292bef 100644 --- a/my/stackexchange/gdpr.py +++ b/my/stackexchange/gdpr.py @@ -5,8 +5,9 @@ Stackexchange data (uses [[https://stackoverflow.com/legal/gdpr/request][officia # TODO need to merge gdpr and stexport ### config +from dataclasses import dataclass from my.config import stackexchange as user_config -from ..core import dataclass, PathIsh, make_config, get_files +from my.core import PathIsh, make_config, get_files, Json @dataclass class stackexchange(user_config): gdpr_path: PathIsh # path to GDPR zip file @@ -16,8 +17,7 @@ config = make_config(stackexchange) # TODO just merge all of them and then filter?.. not sure -from ..core.common import Json -from ..core.compat import fromisoformat +from my.core.compat import fromisoformat from typing import NamedTuple, Iterable from datetime import datetime class Vote(NamedTuple):