Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ dist/
htmlcov/
.tox/
docs/_build/
.venv/
12 changes: 10 additions & 2 deletions examples/aliases/aliases.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def write_config(self, filename):
parser.add_section("aliases")
for key, value in self.aliases.items():
parser.set("aliases", key, value)
with open(filename, "wb") as file:
with open(filename, "w", encoding="utf-8") as file:
parser.write(file)


Expand Down Expand Up @@ -136,8 +136,16 @@ def status(config):
@click.option(
"--config_file", type=click.Path(exists=True, dir_okay=False), default="aliases.ini"
)
def alias(config, alias_, cmd, config_file):
@click.option(
"--dry-run",
is_flag=True,
help="Show what would change without writing the config file.",
)
def alias(config, alias_, cmd, config_file, dry_run):
"""Adds an alias to the specified configuration file."""
if dry_run:
click.echo(f"Would add '{alias_}' as alias for '{cmd}' in '{config_file}'")
return
config.add_alias(alias_, cmd)
config.write_config(config_file)
click.echo(f"Added '{alias_}' as alias for '{cmd}'")
82 changes: 82 additions & 0 deletions tests/test_examples_aliases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
from __future__ import annotations

import configparser
import importlib.util
from pathlib import Path

from click.testing import CliRunner


def _load_aliases_example_cli():
root = Path(__file__).resolve().parents[1]
module_path = root / "examples" / "aliases" / "aliases.py"
spec = importlib.util.spec_from_file_location("click_examples_aliases", module_path)
assert spec is not None
assert spec.loader is not None
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module.cli


def test_alias_writes_config_file(tmp_path):
cli = _load_aliases_example_cli()
runner = CliRunner()

config_path = tmp_path / "aliases.ini"
config_path.write_text("", encoding="utf-8")

result = runner.invoke(
cli,
["alias", "foo", "status", "--config_file", str(config_path)],
)
assert result.exit_code == 0, result.output
assert "Added 'foo' as alias for 'status'" in result.output

parser = configparser.RawConfigParser()
parser.read(config_path, encoding="utf-8")
assert parser.has_section("aliases")
assert parser.get("aliases", "foo") == "status"


def test_alias_dry_run_does_not_write_config_file(tmp_path):
cli = _load_aliases_example_cli()
runner = CliRunner()

config_path = tmp_path / "aliases.ini"
config_path.write_text("", encoding="utf-8")
before = config_path.read_text(encoding="utf-8")

result = runner.invoke(
cli,
["alias", "foo", "status", "--config_file", str(config_path), "--dry-run"],
)
assert result.exit_code == 0, result.output
assert "Would add 'foo' as alias for 'status' in" in result.output

after = config_path.read_text(encoding="utf-8")
assert after == before


def test_alias_overwrites_existing_alias(tmp_path):
cli = _load_aliases_example_cli()
runner = CliRunner()

config_path = tmp_path / "aliases.ini"
config_path.write_text("", encoding="utf-8")

first = runner.invoke(
cli,
["alias", "foo", "status", "--config_file", str(config_path)],
)
assert first.exit_code == 0, first.output

second = runner.invoke(
cli,
["alias", "foo", "commit", "--config_file", str(config_path)],
)
assert second.exit_code == 0, second.output
assert "Added 'foo' as alias for 'commit'" in second.output

parser = configparser.RawConfigParser()
parser.read(config_path, encoding="utf-8")
assert parser.get("aliases", "foo") == "commit"
Loading