Skip to content

Commit a9daf8c

Browse files
committed
Adjust commands due to Pydantic validation
* As Pydantic takes care of validation the envconfig, we don't have to check that anymore * Remove any checking of if context.envconfig is None * Adjust ManagedGitRepo to allow string or Repo as remote_url This makes it easier * Use `cast(Envconfig, context.envconfig)` to avoid type errors
1 parent 13cc03c commit a9daf8c

11 files changed

Lines changed: 95 additions & 79 deletions

File tree

docs/source/reference/_autoapi/docbuild/utils/git/ManagedGitRepo.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
docbuild.utils.git.ManagedGitRepo
22
=================================
33

4-
.. py:class:: docbuild.utils.git.ManagedGitRepo(remote_url: str, rootdir: pathlib.Path, gitconfig: pathlib.Path | None = None)
4+
.. py:class:: docbuild.utils.git.ManagedGitRepo(repo: str | docbuild.models.repo.Repo, rootdir: pathlib.Path, gitconfig: pathlib.Path | None = None)
55
66
Manages a bare repository and its temporary worktrees.
77

src/docbuild/cli/cmd_build/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ def build(ctx: click.Context, doctypes: tuple[Doctype]) -> None:
5858
"""
5959
ctx.ensure_object(DocBuildContext)
6060
context: DocBuildContext = ctx.obj
61+
# env = cast(EnvConfig, context.envconfig)
6162

6263
click.echo(f"[BUILD] Verbosity: {context.verbose}")
6364
click.echo(f"{context=}")

src/docbuild/cli/cmd_c14n/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ def c14n(ctx: click.Context) -> None:
1010
1111
:param ctx: The Click context object.
1212
"""
13+
# env = cast(EnvConfig, context.envconfig)
1314
click.echo(f"[C17N] Verbosity: {ctx.obj.verbose}")

src/docbuild/cli/cmd_metadata/metaprocess.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
import logging
77
from pathlib import Path
88
import shlex
9-
from typing import Any
9+
from typing import Any, cast
1010

1111
from lxml import etree
1212
from pydantic import ValidationError
1313
from rich.console import Console
1414

1515
from ...config.xml.stitch import create_stitchfile
1616
from ...constants import DEFAULT_DELIVERABLES
17+
from ...models.config.env import EnvConfig
1718
from ...models.deliverable import Deliverable
1819
from ...models.doctype import Doctype
1920
from ...models.manifest import Document, Manifest
@@ -407,12 +408,13 @@ async def process(
407408
configured correctly.
408409
:return: 0 if all files passed validation, 1 if any failures occurred.
409410
"""
410-
configdir = Path(context.envconfig.paths.config_dir).expanduser()
411+
env = cast(EnvConfig, context.envconfig)
412+
configdir = Path(env.paths.config_dir).expanduser()
411413
stdout.print(f"Config path: {configdir}")
412414
xmlconfigs = tuple(configdir.rglob("[a-z]*.xml"))
413415
stitchnode: etree._ElementTree = await create_stitchfile(xmlconfigs)
414416

415-
tmp_metadata_dir = context.envconfig.paths.tmp.tmp_metadata_dir
417+
tmp_metadata_dir = env.paths.tmp.tmp_metadata_dir
416418
# TODO: Is this necessary here?
417419
tmp_metadata_dir.mkdir(parents=True, exist_ok=True)
418420

src/docbuild/cli/cmd_repo/cmd_clone.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,6 @@ def clone(ctx: click.Context, repos: tuple[str, ...]) -> None:
3535
:param ctx: The Click context object.
3636
"""
3737
context: DocBuildContext = ctx.obj
38-
if context.envconfig is None:
39-
raise ValueError("No envconfig found in context.")
40-
4138
result = asyncio.run(process(context, repos))
4239
log.info(f"Clone process completed with exit code: {result}")
4340
ctx.exit(result)

src/docbuild/cli/cmd_repo/cmd_dir.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
"""Show the directory path for permanent repositories."""
22

3+
from typing import cast
4+
35
import click
46

57
from ...cli.context import DocBuildContext
8+
from ...models.config.env import EnvConfig
69

710

811
@click.command(help=__doc__, name="dir")
@@ -16,9 +19,7 @@ def cmd_dir(ctx: click.Context) -> None:
1619
:param ctx: The Click context object.
1720
"""
1821
context: DocBuildContext = ctx.obj
19-
if context.envconfig is None:
20-
raise ValueError("No envconfig found in context.")
21-
22-
repo_dir = context.envconfig.get("paths", {}).get("repo_dir", None)
22+
env = cast(EnvConfig, context.envconfig)
23+
repo_dir = env.paths.repo_dir
2324
print(repo_dir)
2425
ctx.exit(0)

src/docbuild/cli/cmd_repo/cmd_list.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
"""List the available permanent repositories."""
22

33
from pathlib import Path
4+
from typing import cast
45

56
import click
67
from rich.console import Console
78

89
from ...cli.context import DocBuildContext
10+
from ...models.config.env import EnvConfig
911

1012
console = Console()
1113
console_err = Console(stderr=True)
@@ -24,15 +26,9 @@ def cmd_list(ctx: click.Context) -> None:
2426
:param ctx: The Click context object.
2527
"""
2628
context: DocBuildContext = ctx.obj
27-
if context.envconfig is None:
28-
raise ValueError("No envconfig found in context.")
29-
30-
repo_dir = context.envconfig.get("paths", {}).get("repo_dir", None)
31-
if repo_dir is None:
32-
raise ValueError(
33-
"No permanent repositories defined, neither with "
34-
"--env-config nor as default."
35-
)
29+
env = cast(EnvConfig, context.envconfig)
30+
31+
repo_dir = env.paths.repo_dir
3632
repo_dir = Path(repo_dir).resolve()
3733
if not repo_dir.exists():
3834
console_err.print(

src/docbuild/cli/cmd_repo/process.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import asyncio
44
import logging
55
from pathlib import Path
6+
from typing import cast
67

78
from ...cli.context import DocBuildContext
89
from ...config.xml.stitch import create_stitchfile
910
from ...constants import GITLOGGER_NAME
11+
from ...models.config.env import EnvConfig
1012
from ...models.repo import Repo
1113
from ...utils.contextmgr import make_timer
1214
from ...utils.git import ManagedGitRepo
@@ -23,14 +25,9 @@ async def process(context: DocBuildContext, repos: tuple[str, ...]) -> int:
2325
:raises ValueError: If configuration paths are missing.
2426
"""
2527
# The calling command function is expected to have checked context.envconfig.
26-
paths = context.envconfig.get("paths", {})
27-
config_dir_str = paths.get("config_dir")
28-
repo_dir_str = paths.get("repo_dir")
29-
30-
if not config_dir_str:
31-
raise ValueError("Could not get a value from envconfig.paths.config_dir")
32-
if not repo_dir_str:
33-
raise ValueError("Could not get a value from envconfig.paths.repo_dir")
28+
envcfg = cast(EnvConfig, context.envconfig)
29+
config_dir_str = envcfg.paths.config_dir
30+
repo_dir_str = envcfg.paths.repo_dir
3431

3532
configdir = Path(config_dir_str).expanduser()
3633
repo_dir = Path(repo_dir_str).expanduser()
@@ -52,6 +49,7 @@ async def process(context: DocBuildContext, repos: tuple[str, ...]) -> int:
5249
else:
5350
# Create a unique list from user input, preserving order
5451
unique_git_repos = list(dict.fromkeys(Repo(r) for r in repos))
52+
log.debug("User-specified repositories: %s", unique_git_repos)
5553

5654
if not unique_git_repos:
5755
log.info("No repositories found to clone.")

src/docbuild/cli/cmd_validate/__init__.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
from collections.abc import Iterator
55
import logging
66
from pathlib import Path
7+
from typing import cast
78

89
import click
910

11+
from ...models.config.env import EnvConfig
1012
from ..context import DocBuildContext
1113
from . import process as process_mod
1214

@@ -36,20 +38,12 @@ def validate(
3638
:param validation_method: Validation method to use, 'jing' or 'lxml'.
3739
"""
3840
context: DocBuildContext = ctx.obj
41+
env = cast(EnvConfig, context.envconfig)
3942

4043
# Set the chosen validation method in the context for downstream use
4144
context.validation_method = validation_method.lower()
4245

43-
if context.envconfig is None:
44-
raise ValueError("No envconfig found in context.")
45-
46-
if (paths := ctx.obj.envconfig.get("paths")) is None:
47-
raise ValueError("No paths found in envconfig.")
48-
49-
configdir = paths.get("config_dir", None)
50-
if configdir is None:
51-
raise ValueError("Could not get a value from envconfig.paths.config_dir")
52-
46+
configdir = env.paths.config_dir
5347
configdir_path = Path(configdir).expanduser()
5448

5549
if not xmlfiles:

src/docbuild/utils/git.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,24 @@ def clear_cache(cls) -> None:
3232
cls._is_updated.clear()
3333

3434
def __init__(
35-
self: Self, remote_url: str, rootdir: Path, gitconfig: Path | None = None
35+
self: Self, repo: str | Repo, rootdir: Path, gitconfig: Path | None = None
3636
) -> None:
3737
"""Initialize the managed repository.
3838
39-
:param remote_url: The remote URL of the repository.
39+
:param repo: The remote URL or :class:`~docbuild.models.repo.Repo` instance of the repository to manage.
40+
Repo instance of the repository.
4041
:param permanent_root: The root directory for storing permanent bare clones.
4142
:param gitconfig: The path to a separate Git configuration file
4243
(=None, use the default config from etc/gitconfig)
4344
"""
44-
self._repo_model = Repo(remote_url)
45+
if isinstance(repo, str):
46+
self._repo_model = Repo(repo)
47+
elif isinstance(repo, Repo):
48+
self._repo_model = repo
49+
else:
50+
raise TypeError(
51+
f"remote_url must be a string or Repo instance, got {type(repo)}"
52+
)
4553
self._permanent_root = rootdir
4654
# The Repo model handles the "sluggification" of the URL
4755
self.bare_repo_path = self._permanent_root / self._repo_model.slug

0 commit comments

Comments
 (0)