From 519cce3fe40adbf8d60af27cb3f7ddf8a6a24d7f Mon Sep 17 00:00:00 2001 From: skshetry <18718008+skshetry@users.noreply.github.com> Date: Fri, 10 Nov 2023 12:55:49 +0545 Subject: [PATCH] logger: type-safe logger.trace (#10083) * use logger.getChild from `dvc.log` instead of `logging.getLogger` I got tired adding `# type: ignore[attr-defined]` while using `logger.trace`. So, now you need to import logger from `from dvc.log import logger` and create a child logger using `logger.getChild(__name__)`. `logger.getChild` will return a logger type-hinted as a logger having a `trace` method. So, from now on, instead of: ```python import logging logger = logging.getogger(__name__) ``` you'll have to do following: ```python from dvc.log import logger logger = logger.getChild(__name__) ``` * remove all dvc imports from dvc.logger * use Tqdm back --- dvc/analytics.py | 15 +++++++-------- dvc/cli/__init__.py | 13 +++++-------- dvc/cli/command.py | 5 +++-- dvc/cli/parser.py | 4 ++-- dvc/commands/add.py | 4 ++-- dvc/commands/artifacts.py | 4 ++-- dvc/commands/commit.py | 4 ++-- dvc/commands/completion.py | 4 ++-- dvc/commands/config.py | 4 ++-- dvc/commands/daemon.py | 5 ++--- dvc/commands/data.py | 6 +++--- dvc/commands/data_sync.py | 4 ++-- dvc/commands/destroy.py | 4 ++-- dvc/commands/diff.py | 4 ++-- dvc/commands/experiments/apply.py | 4 ++-- dvc/commands/experiments/branch.py | 4 ++-- dvc/commands/experiments/clean.py | 4 ++-- dvc/commands/experiments/diff.py | 4 ++-- dvc/commands/experiments/exec_run.py | 5 ++--- dvc/commands/experiments/ls.py | 4 ++-- dvc/commands/experiments/pull.py | 4 ++-- dvc/commands/experiments/push.py | 4 ++-- dvc/commands/experiments/queue_worker.py | 5 ++--- dvc/commands/experiments/remove.py | 4 ++-- dvc/commands/experiments/rename.py | 4 ++-- dvc/commands/experiments/run.py | 4 ++-- dvc/commands/experiments/save.py | 4 ++-- dvc/commands/experiments/show.py | 4 ++-- dvc/commands/freeze.py | 4 ++-- dvc/commands/gc.py | 4 ++-- dvc/commands/get.py | 4 ++-- dvc/commands/get_url.py | 4 ++-- dvc/commands/git_hook.py | 4 ++-- dvc/commands/imp.py | 4 ++-- dvc/commands/imp_url.py | 4 ++-- dvc/commands/init.py | 4 ++-- dvc/commands/install.py | 4 ++-- dvc/commands/ls/__init__.py | 4 ++-- dvc/commands/ls_url.py | 4 ++-- dvc/commands/metrics.py | 4 ++-- dvc/commands/move.py | 4 ++-- dvc/commands/params.py | 4 ++-- dvc/commands/plots.py | 4 ++-- dvc/commands/queue/kill.py | 4 ++-- dvc/commands/queue/logs.py | 4 ++-- dvc/commands/queue/remove.py | 4 ++-- dvc/commands/queue/start.py | 4 ++-- dvc/commands/queue/status.py | 4 ++-- dvc/commands/queue/stop.py | 4 ++-- dvc/commands/remove.py | 4 ++-- dvc/commands/root.py | 4 ++-- dvc/commands/stage.py | 7 +++---- dvc/commands/status.py | 5 ++--- dvc/commands/unprotect.py | 4 ++-- dvc/commands/update.py | 4 ++-- dvc/commands/version.py | 4 ++-- dvc/config.py | 4 ++-- dvc/config_schema.py | 5 +++-- dvc/daemon.py | 4 +++- dvc/dagascii.py | 5 +++-- dvc/data_cloud.py | 4 ++-- dvc/dependency/param.py | 4 ++-- dvc/dvcfile.py | 4 ++-- dvc/fs/data.py | 4 ++-- dvc/fs/dvc.py | 4 ++-- dvc/ignore.py | 4 ++-- dvc/log.py | 10 ++++++++++ dvc/logger.py | 14 ++++++-------- dvc/output.py | 4 ++-- dvc/parsing/__init__.py | 9 ++++----- dvc/parsing/context.py | 6 +++--- dvc/prompt.py | 5 +++-- dvc/render/match.py | 4 ++-- dvc/repo/__init__.py | 4 ++-- dvc/repo/artifacts.py | 8 ++++---- dvc/repo/brancher.py | 10 +++++----- dvc/repo/checkout.py | 4 ++-- dvc/repo/collect.py | 5 +++-- dvc/repo/diff.py | 4 ++-- dvc/repo/experiments/__init__.py | 4 ++-- dvc/repo/experiments/apply.py | 4 ++-- dvc/repo/experiments/branch.py | 5 ++--- dvc/repo/experiments/cache.py | 16 +++++----------- dvc/repo/experiments/collect.py | 4 ++-- dvc/repo/experiments/diff.py | 5 ++--- dvc/repo/experiments/executor/base.py | 7 +++---- dvc/repo/experiments/executor/local.py | 4 ++-- dvc/repo/experiments/ls.py | 4 ++-- dvc/repo/experiments/pull.py | 4 ++-- dvc/repo/experiments/push.py | 4 ++-- dvc/repo/experiments/queue/base.py | 4 ++-- dvc/repo/experiments/queue/celery.py | 15 +++++---------- dvc/repo/experiments/queue/tempdir.py | 4 ++-- dvc/repo/experiments/queue/utils.py | 4 ++-- dvc/repo/experiments/queue/workspace.py | 4 ++-- dvc/repo/experiments/remove.py | 4 ++-- dvc/repo/experiments/rename.py | 4 ++-- dvc/repo/experiments/run.py | 4 ++-- dvc/repo/experiments/save.py | 5 +++-- dvc/repo/experiments/show.py | 4 ++-- dvc/repo/experiments/stash.py | 4 ++-- dvc/repo/fetch.py | 4 ++-- dvc/repo/gc.py | 4 ++-- dvc/repo/get.py | 4 ++-- dvc/repo/imports.py | 5 +++-- dvc/repo/index.py | 7 +++---- dvc/repo/init.py | 4 ++-- dvc/repo/metrics/show.py | 4 ++-- dvc/repo/open_repo.py | 4 ++-- dvc/repo/params/show.py | 4 ++-- dvc/repo/plots/__init__.py | 11 ++++++++--- dvc/repo/pull.py | 5 ++--- dvc/repo/remove.py | 4 ++-- dvc/repo/reproduce.py | 4 ++-- dvc/repo/scm_context.py | 3 ++- dvc/repo/stage.py | 4 ++-- dvc/repo/status.py | 4 ++-- dvc/repo/worktree.py | 4 ++-- dvc/rwlock.py | 5 +++-- dvc/stage/__init__.py | 4 ++-- dvc/stage/cache.py | 4 ++-- dvc/stage/imports.py | 5 ++--- dvc/stage/loader.py | 8 +++----- dvc/stage/run.py | 4 ++-- dvc/ui/pager.py | 6 +++--- dvc/updater.py | 18 +++++++----------- dvc/utils/__init__.py | 11 ----------- dvc/utils/fs.py | 4 ++-- dvc/utils/hydra.py | 6 +++--- dvc/utils/studio.py | 12 +++++------- tests/func/plots/test_show.py | 3 +-- tests/func/test_daemon.py | 8 +++++--- 132 files changed, 328 insertions(+), 349 deletions(-) create mode 100644 dvc/log.py diff --git a/dvc/analytics.py b/dvc/analytics.py index 2ad66cb35..6fbb7a99a 100644 --- a/dvc/analytics.py +++ b/dvc/analytics.py @@ -1,10 +1,11 @@ import json -import logging import os +from dvc.log import logger + from .env import DVC_ANALYTICS_ENDPOINT, DVC_NO_ANALYTICS -logger = logging.getLogger(__name__) +logger = logger.getChild(__name__) def collect_and_send_report(args=None, return_code=None): @@ -35,9 +36,7 @@ def collect_and_send_report(args=None, return_code=None): with tempfile.NamedTemporaryFile(delete=False, mode="w") as fobj: json.dump(report, fobj) - logger.trace( # type: ignore[attr-defined] - "Saving analytics report to %s", fobj.name - ) + logger.trace("Saving analytics report to %s", fobj.name) daemon(["analytics", fobj.name]) @@ -78,15 +77,15 @@ def send(path): report.update(_runtime_info()) logger.debug("uploading report to %s", url) - logger.trace("Sending %s to %s", report, url) # type: ignore[attr-defined] + logger.trace("Sending %s to %s", report, url) try: requests.post(url, json=report, headers=headers, timeout=5) except requests.exceptions.RequestException as e: - logger.trace("", exc_info=True) # type: ignore[attr-defined] + logger.trace("", exc_info=True) logger.debug("failed to send analytics report %s", str(e)) - logger.trace("removing report %s", path) # type: ignore[attr-defined] + logger.trace("removing report %s", path) os.remove(path) diff --git a/dvc/cli/__init__.py b/dvc/cli/__init__.py index a5dd55e5d..a296ecc37 100644 --- a/dvc/cli/__init__.py +++ b/dvc/cli/__init__.py @@ -2,16 +2,15 @@ import logging import sys +from typing import Optional + +from dvc.log import logger # Workaround for CPython bug. See [1] and [2] for more info. # [1] https://github.com/aws/aws-cli/blob/1.16.277/awscli/clidriver.py#L55 # [2] https://bugs.python.org/issue29288 -from typing import Optional - "".encode("idna") -logger = logging.getLogger("dvc") - class DvcParserError(Exception): """Base class for CLI parser errors.""" @@ -197,7 +196,7 @@ def main(argv=None): # noqa: C901, PLR0912, PLR0915 logger.debug("v%s%s, %s on %s", __version__, pkg, pyv, platform()) logger.debug("command: %s", " ".join(argv or sys.argv)) - logger.trace(args) # type: ignore[attr-defined] + logger.trace(args) if sys.stdout and not sys.stdout.closed and not args.quiet: from dvc.ui import ui @@ -241,9 +240,7 @@ def main(argv=None): # noqa: C901, PLR0912, PLR0915 if analytics.is_enabled(): analytics.collect_and_send_report(args, ret) - logger.trace( # type: ignore[attr-defined] - "Process %s exiting with %s", os.getpid(), ret - ) + logger.trace("Process %s exiting with %s", os.getpid(), ret) return ret finally: diff --git a/dvc/cli/command.py b/dvc/cli/command.py index 8dc1db5b7..e94ea2583 100644 --- a/dvc/cli/command.py +++ b/dvc/cli/command.py @@ -1,12 +1,13 @@ -import logging import os from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Any +from dvc.log import logger + if TYPE_CHECKING: from dvc.config import Config -logger = logging.getLogger(__name__) +logger = logger.getChild(__name__) class CmdBase(ABC): diff --git a/dvc/cli/parser.py b/dvc/cli/parser.py index 00110ce81..5ff5199af 100644 --- a/dvc/cli/parser.py +++ b/dvc/cli/parser.py @@ -1,6 +1,5 @@ """Main parser for the dvc cli.""" import argparse -import logging import os from functools import lru_cache @@ -46,10 +45,11 @@ from dvc.commands import ( update, version, ) +from dvc.log import logger from . import DvcParserError -logger = logging.getLogger(__name__) +logger = logger.getChild(__name__) COMMANDS = [ init, diff --git a/dvc/commands/add.py b/dvc/commands/add.py index f42f5e40c..4a0b246f3 100644 --- a/dvc/commands/add.py +++ b/dvc/commands/add.py @@ -1,11 +1,11 @@ import argparse -import logging from dvc.cli import completion from dvc.cli.command import CmdBase from dvc.cli.utils import append_doc_link +from dvc.log import logger -logger = logging.getLogger(__name__) +logger = logger.getChild(__name__) class CmdAdd(CmdBase): diff --git a/dvc/commands/artifacts.py b/dvc/commands/artifacts.py index a2a8a564f..ccd576c2f 100644 --- a/dvc/commands/artifacts.py +++ b/dvc/commands/artifacts.py @@ -1,12 +1,12 @@ import argparse -import logging from dvc.cli import completion from dvc.cli.command import CmdBaseNoRepo from dvc.cli.utils import DictAction, append_doc_link, fix_subparsers from dvc.exceptions import DvcException +from dvc.log import logger -logger = logging.getLogger(__name__) +logger = logger.getChild(__name__) class CmdArtifactsGet(CmdBaseNoRepo): diff --git a/dvc/commands/commit.py b/dvc/commands/commit.py index 21c53ea7d..714b2433f 100644 --- a/dvc/commands/commit.py +++ b/dvc/commands/commit.py @@ -1,11 +1,11 @@ import argparse -import logging from dvc.cli import completion from dvc.cli.command import CmdBase from dvc.cli.utils import append_doc_link +from dvc.log import logger -logger = logging.getLogger(__name__) +logger = logger.getChild(__name__) class CmdCommit(CmdBase): diff --git a/dvc/commands/completion.py b/dvc/commands/completion.py index 98401ca9a..119b60741 100644 --- a/dvc/commands/completion.py +++ b/dvc/commands/completion.py @@ -1,12 +1,12 @@ import argparse -import logging from dvc.cli.command import CmdBaseNoRepo from dvc.cli.completion import PREAMBLE from dvc.cli.utils import append_doc_link +from dvc.log import logger from dvc.ui import ui -logger = logging.getLogger(__name__) +logger = logger.getChild(__name__) SUPPORTED_SHELLS = ["bash", "zsh"] diff --git a/dvc/commands/config.py b/dvc/commands/config.py index 7117d1191..ff8461bc6 100644 --- a/dvc/commands/config.py +++ b/dvc/commands/config.py @@ -1,12 +1,12 @@ import argparse -import logging import os from dvc.cli.command import CmdBaseNoRepo from dvc.cli.utils import append_doc_link +from dvc.log import logger from dvc.ui import ui -logger = logging.getLogger(__name__) +logger = logger.getChild(__name__) NAME_REGEX = r"^(?Premote\.)?(?P
[^\.]*)\.(?P