Skip to content

Commit 8330ace

Browse files
committed
fea: Add file handler for log output
Signed-off-by: Helio Chissini de Castro <heliocastro@gmail.com>
1 parent f70700f commit 8330ace

File tree

6 files changed

+47
-30
lines changed

6 files changed

+47
-30
lines changed

src/python_inspector/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,3 @@
1313
pyinspector_settings = settings.Settings()
1414

1515
settings.create_cache_directory(pyinspector_settings.CACHE_THIRDPARTY_DIR)
16-

src/python_inspector/dependencies.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ def get_dependencies_from_requirements(
3939
)
4040
for dependent_package in dependent_packages:
4141
logger.debug(
42-
"dependent_package.extracted_requirement: "
43-
f"{dependent_package.extracted_requirement}",
44-
)
42+
f"dependent_package.extracted_requirement: {dependent_package.extracted_requirement}",
43+
)
4544
yield dependent_package
4645

4746

src/python_inspector/logging.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#
99

1010
import logging
11+
from pathlib import Path
1112
from types import TracebackType
1213
from typing import Any, Optional, Tuple, Type, Union
1314

@@ -70,21 +71,22 @@ def deep(
7071
stacklevel=stacklevel,
7172
)
7273

73-
7474
logging.Logger.trace = trace
7575
logging.Logger.deep = deep
7676

7777

78-
def setup_logger(level: str = "WARNING") -> None:
78+
def setup_logger(level: str = "WARNING", log_file: Optional[Path] = None) -> None:
7979
"""
80-
Configures the logger for the 'python-inspector' application.
80+
Configure the logger for the 'python-inspector' application.
8181
8282
This function sets up a custom logging level, assigns a custom logger class,
8383
and configures the logger with the specified logging level. If no handlers are present,
8484
it adds a stream handler with a simple formatter.
8585
8686
Args:
8787
level (str): The logging level to set for the logger (e.g., 'DEBUG', 'INFO', 'WARNING', "TRACE").
88+
log_file (Optional[Path]): File name for persistent log
89+
8890
"""
8991
# Setup out trace level
9092
logging.addLevelName(TRACE_LEVEL, "TRACE")
@@ -101,6 +103,11 @@ def setup_logger(level: str = "WARNING") -> None:
101103
handler.setFormatter(formatter)
102104
_logger.addHandler(handler)
103105

106+
if log_file:
107+
file_handler = logging.FileHandler(log_file, encoding="utf-8")
108+
file_handler.setFormatter(formatter)
109+
logger.addHandler(file_handler)
110+
104111

105112
# Logger as a singleton
106113
logger: logging.Logger = logging.getLogger("python-inspector")

src/python_inspector/resolve_cli.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
# See https://aboutcode.org for more information about nexB OSS projects.
1010
#
1111

12-
from typing import Dict
12+
from pathlib import Path
13+
from typing import Dict, Optional
1314

1415
import click
1516

@@ -174,7 +175,12 @@ def print_version(ctx, param, value):
174175
callback=print_version,
175176
help="Show the version and exit.",
176177
)
177-
@click.option("--ignore-errors", is_flag=True, default=False, help="Ignore errors and continue execution.")
178+
@click.option(
179+
"--ignore-errors",
180+
is_flag=True,
181+
default=False,
182+
help="Ignore errors and continue execution.",
183+
)
178184
@click.help_option("-h", "--help")
179185
@click.option(
180186
"--generic-paths",
@@ -183,6 +189,11 @@ def print_version(ctx, param, value):
183189
help="Use generic or truncated paths in the JSON output header and files sections. "
184190
"Used only for testing to avoid absolute paths and paths changing at each run.",
185191
)
192+
@click.option(
193+
"--log-file",
194+
type=click.Path(path_type=Path),
195+
help="Write logs to a file.",
196+
)
186197
def resolve_dependencies(
187198
ctx,
188199
requirement_files,
@@ -196,6 +207,7 @@ def resolve_dependencies(
196207
netrc_file,
197208
max_rounds,
198209
verbose,
210+
log_file: Optional[Path],
199211
use_cached_index=False,
200212
use_pypi_json_api=False,
201213
analyze_setup_py_insecurely=False,
@@ -236,15 +248,15 @@ def resolve_dependencies(
236248

237249
# Setup verbose level
238250
if verbose >= 4:
239-
logging.setup_logger("DEEP")
251+
logging.setup_logger("DEEP", log_file=log_file)
240252
elif verbose == 3:
241-
logging.setup_logger("TRACE")
253+
logging.setup_logger("TRACE", log_file=log_file)
242254
elif verbose == 2:
243-
logging.setup_logger("DEBUG")
255+
logging.setup_logger("DEBUG", log_file=log_file)
244256
elif verbose == 1:
245-
logging.setup_logger("INFO")
257+
logging.setup_logger("INFO", log_file=log_file)
246258
else:
247-
logging.setup_logger()
259+
logging.setup_logger(log_file=log_file)
248260

249261
options = get_pretty_options(ctx, generic_paths=generic_paths)
250262

src/python_inspector/setup_py_live_eval.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
def minver_error(pkg_name):
3131
"""Report error about missing minimum version constraint and exit."""
3232
logger.error(
33-
'Specify minimal version of "{0}" using ' '">=" or "=="'.format(pkg_name),
33+
'Specify minimal version of "{0}" using ">=" or "=="'.format(pkg_name),
3434
file=sys.stderr,
3535
)
3636
sys.exit(1)
@@ -165,7 +165,7 @@ def iter_requirements(level, extras, setup_file):
165165
specs = {s.operator: s.version for s in specs._specs}
166166
if ((">=" in specs) and (">" in specs)) or (("<=" in specs) and ("<" in specs)):
167167
logger.error(
168-
"Do not specify such weird constraints! " '("{0}")'.format(pkg),
168+
'Do not specify such weird constraints! ("{0}")'.format(pkg),
169169
file=sys.stderr,
170170
)
171171
sys.exit(1)

src/python_inspector/utils_pypi.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -301,9 +301,9 @@ async def get_supported_and_valid_wheels(
301301
):
302302
continue
303303
logger.trace(
304-
f""" get_supported_and_valid_wheels: Getting wheel from index (or cache):
305-
{durl}"""
306-
)
304+
f""" get_supported_and_valid_wheels: Getting wheel from index (or cache):
305+
{await wheel.download_url(repo)}"""
306+
)
307307
wheels.append(wheel)
308308
return wheels
309309

@@ -606,17 +606,17 @@ async def get_best_download_url(self, repos=tuple()):
606606
package = await repo.get_package_version(name=self.name, version=self.version)
607607
if not package:
608608
logger.debug(
609-
f" get_best_download_url: {self.name}=={self.version} "
610-
f"not found in {repo.index_url}"
611-
)
609+
f" get_best_download_url: {self.name}=={self.version} "
610+
f"not found in {repo.index_url}"
611+
)
612612
continue
613613
pypi_url = package.get_url_for_filename(self.filename)
614614
if pypi_url:
615615
return pypi_url
616616
else:
617617
logger.debug(
618-
f" get_best_download_url: {self.filename} not found in {repo.index_url}"
619-
)
618+
f" get_best_download_url: {self.filename} not found in {repo.index_url}"
619+
)
620620

621621
async def download(
622622
self,
@@ -628,8 +628,8 @@ async def download(
628628
"""
629629
assert self.filename
630630
logger.trace(
631-
f"Fetching distribution of {self.name}=={self.version}: {self.filename}",
632-
)
631+
f"Fetching distribution of {self.name}=={self.version}: {self.filename}",
632+
)
633633

634634
# FIXME:
635635
await fetch_and_save(
@@ -1202,16 +1202,16 @@ def package_from_dists(cls, dists):
12021202
for dist in dists:
12031203
if dist.normalized_name != normalized_name:
12041204
logger.debug(
1205-
f" Skipping inconsistent dist name: expected {normalized_name} got {dist}"
1206-
)
1205+
f" Skipping inconsistent dist name: expected {normalized_name} got {dist}"
1206+
)
12071207
continue
12081208
elif dist.version != version:
12091209
dv = packaging_version.parse(dist.version)
12101210
v = packaging_version.parse(version)
12111211
if dv != v:
12121212
logger.debug(
1213-
f" Skipping inconsistent dist version: expected {version} got {dist}"
1214-
)
1213+
f" Skipping inconsistent dist version: expected {version} got {dist}"
1214+
)
12151215
continue
12161216

12171217
if isinstance(dist, Sdist):

0 commit comments

Comments
 (0)