Skip to content

Commit

Permalink
Exclude default config value from the pip-compile header (#1893)
Browse files Browse the repository at this point in the history
  • Loading branch information
atugushev authored Jul 1, 2023
1 parent 64859e3 commit e8b8ce7
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 4 deletions.
28 changes: 25 additions & 3 deletions piptools/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import collections
import copy
import functools
import itertools
import json
import os
Expand Down Expand Up @@ -366,6 +365,12 @@ def get_compile_command(click_ctx: click.Context) -> str:
if option_long_name in COMPILE_EXCLUDE_OPTIONS:
continue

# Exclude config option if it's the default one
if option_long_name == "--config":
default_config = select_config_file(click_ctx.params.get("src_files", ()))
if value == default_config:
continue

# Skip options without a value
if option.default is None and not value:
continue
Expand Down Expand Up @@ -594,7 +599,14 @@ def select_config_file(src_files: tuple[str, ...]) -> Path | None:
),
None,
)
return config_file_path
if config_file_path is None:
return None

return (
config_file_path.relative_to(working_directory)
if is_path_relative_to(config_file_path, working_directory)
else config_file_path
)


# Some of the defined click options have different `dest` values than the defaults
Expand Down Expand Up @@ -628,7 +640,6 @@ def get_click_dest_for_option(option_name: str) -> str:
]


@functools.lru_cache()
def parse_config_file(config_file: Path) -> dict[str, Any]:
try:
config = tomllib.loads(config_file.read_text(encoding="utf-8"))
Expand Down Expand Up @@ -656,3 +667,14 @@ def parse_config_file(config_file: Path) -> dict[str, Any]:
original_option, f"Config key '{original_option}' must be a list"
)
return piptools_config


def is_path_relative_to(path1: Path, path2: Path) -> bool:
"""Return True if ``path1`` is relative to ``path2``."""
# TODO: remove this function in favor of Path.is_relative_to()
# when we drop support for Python 3.8
try:
path1.relative_to(path2)
except ValueError:
return False
return True
2 changes: 1 addition & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,6 @@ def _maker(

config_to_dump = {"tool": {"pip-tools": {pyproject_param: new_default}}}
config_file.write_text(tomli_w.dumps(config_to_dump))
return config_file
return config_file.relative_to(tmpdir_cwd)

return _maker
24 changes: 24 additions & 0 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,30 @@ def test_get_compile_command(tmpdir_cwd, cli_args, expected_command):
assert get_compile_command(ctx) == expected_command


@pytest.mark.parametrize(
("config_file", "expected_command"),
(
pytest.param(
"pyproject.toml", "pip-compile", id="exclude default pyproject.toml"
),
pytest.param(
".pip-tools.toml", "pip-compile", id="exclude default .pip-tools.toml"
),
pytest.param(
"my-config.toml",
"pip-compile --config=my-config.toml",
id="include non-default my-config.toml",
),
),
)
def test_get_compile_command_with_config(tmpdir_cwd, config_file, expected_command):
"""Test that get_compile_command excludes or includes config file."""
with open(config_file, "w"):
pass
with compile_cli.make_context("pip-compile", ["--config", config_file]) as ctx:
assert get_compile_command(ctx) == expected_command


def test_get_compile_command_escaped_filenames(tmpdir_cwd):
"""
Test that get_compile_command output (re-)escapes ' -- '-escaped filenames.
Expand Down

0 comments on commit e8b8ce7

Please sign in to comment.