Skip to content

Commit 1f2813d

Browse files
committed
fix: jinja not able to handle paths properly, and passing verbosity flags for fill
1 parent 5092b00 commit 1f2813d

3 files changed

Lines changed: 71 additions & 56 deletions

File tree

src/somesy/cli/fill.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,9 @@
44
from sys import stdin
55

66
import typer
7-
from jinja2 import Environment, FileSystemLoader, FunctionLoader, select_autoescape
7+
from jinja2 import Environment, FunctionLoader, select_autoescape
88

9-
from somesy.core.core import discover_input
10-
11-
from ..core.models import SomesyInput
12-
from .util import wrap_exceptions
9+
from .util import resolved_somesy_input, wrap_exceptions
1310

1411
logger = logging.getLogger("somesy")
1512
app = typer.Typer()
@@ -56,19 +53,29 @@ def fill(
5653
),
5754
):
5855
"""Fill a Jinja2 template with somesy project metadata (e.g. list authors in project docs)."""
59-
somesy_input = SomesyInput.from_input_file(discover_input(input_file))
56+
somesy_input = resolved_somesy_input(input_file=input_file)
57+
6058
if template_file:
61-
env = Environment(loader=FileSystemLoader("."), autoescape=select_autoescape())
62-
template = env.get_template(str(template_file))
59+
logger.debug(f"Reading Jinja2 template from '{template_file}'.")
60+
with open(template_file, "r") as f:
61+
template_str = f.read()
6362
else:
64-
env = Environment(
65-
loader=FunctionLoader(lambda _: stdin.read()),
63+
logger.debug("Reading Jinja2 template from stdin.")
64+
template_str = stdin.read()
65+
66+
result = (
67+
Environment(
68+
loader=FunctionLoader(lambda _: template_str),
6669
autoescape=select_autoescape(),
6770
)
68-
template = env.get_template("")
69-
result = template.render(project=somesy_input.project)
70-
if not output_file:
71-
print(result)
72-
else:
71+
.get_template("")
72+
.render(project=somesy_input.project)
73+
)
74+
75+
if output_file:
76+
logger.debug(f"Writing result to '{output_file}'.")
7377
with open(output_file, "w") as f:
7478
f.write(result)
79+
else:
80+
logger.debug("Writing result to stdout.")
81+
print(result)

src/somesy/cli/sync.py

Lines changed: 12 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
"""Sync command for somesy."""
22
import logging
33
from pathlib import Path
4-
from typing import Optional
54

65
import typer
7-
from rich.pretty import pretty_repr
86

97
from somesy.commands import sync as sync_command
10-
from somesy.core.core import discover_input
11-
from somesy.core.log import SomesyLogLevel, get_log_level, set_log_level
12-
from somesy.core.models import SomesyConfig, SomesyInput
8+
from somesy.core.models import SomesyInput
139

14-
from .util import wrap_exceptions
10+
from .util import resolved_somesy_input, wrap_exceptions
1511

1612
logger = logging.getLogger("somesy")
1713

@@ -107,42 +103,17 @@ def sync(
107103
),
108104
):
109105
"""Sync project metadata input with metadata files."""
110-
# ---------------
111-
# config from CLI (merged with possibly set CLI flags for logging)
112-
passed_cli_args = {
113-
k: v
114-
for k, v in dict(
115-
input_file=discover_input(input_file),
116-
no_sync_cff=no_sync_cff,
117-
cff_file=cff_file,
118-
no_sync_pyproject=no_sync_pyproject,
119-
pyproject_file=pyproject_file,
120-
no_sync_package_json=no_sync_package_json,
121-
package_json_file=package_json_file,
122-
no_sync_codemeta=no_sync_codemeta,
123-
codemeta_file=codemeta_file,
124-
).items()
125-
if v is not None
126-
}
127-
somesy_conf = SomesyConfig(**passed_cli_args)
128-
129-
# cli_log_level is None if the user did not pass a log level (-> "default")
130-
cli_log_level: Optional[SomesyLogLevel] = get_log_level()
131-
132-
if cli_log_level is not None:
133-
# update log level flags if cli log level was set
134-
somesy_conf.update_log_level(cli_log_level)
135-
136-
somesy_input: SomesyInput = somesy_conf.get_input()
137-
138-
if cli_log_level is None:
139-
# no cli log level -> set it according to the loaded configuration
140-
set_log_level(somesy_input.config.log_level())
141-
142-
logger.debug(
143-
f"Combined config (Defaults + File + CLI):\n{pretty_repr(somesy_input.config)}"
106+
somesy_input = resolved_somesy_input(
107+
input_file=input_file,
108+
no_sync_cff=no_sync_cff,
109+
cff_file=cff_file,
110+
no_sync_pyproject=no_sync_pyproject,
111+
pyproject_file=pyproject_file,
112+
no_sync_package_json=no_sync_package_json,
113+
package_json_file=package_json_file,
114+
no_sync_codemeta=no_sync_codemeta,
115+
codemeta_file=codemeta_file,
144116
)
145-
# --------
146117
run_sync(somesy_input)
147118

148119

src/somesy/cli/util.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
"""Utility functions for CLI commands."""
22
import logging
33
import traceback
4+
from typing import Optional
45

56
import typer
67
import wrapt
8+
from rich.pretty import pretty_repr
9+
10+
from somesy.core.core import discover_input
11+
from somesy.core.log import SomesyLogLevel, get_log_level, set_log_level
12+
from somesy.core.models import SomesyConfig, SomesyInput
713

814
logger = logging.getLogger("somesy")
915

@@ -18,3 +24,34 @@ def wrap_exceptions(wrapped, instance, args, kwargs):
1824
logger.error(f"[bold red]Error: {e}[/bold red]")
1925
logger.debug(f"[red]{traceback.format_exc()}[/red]")
2026
raise typer.Exit(code=1) from e
27+
28+
29+
def resolved_somesy_input(**cli_args) -> SomesyInput:
30+
"""Return a combined `SomesyInput` based on config file and passed CLI args.
31+
32+
Will also adjust log levels accordingly.
33+
"""
34+
# figure out what input file to use
35+
input_file = discover_input(cli_args.pop("input_file", None))
36+
37+
# create config based on passed arguments
38+
passed_args = {k: v for k, v in cli_args.items() if v is not None}
39+
somesy_conf = SomesyConfig(input_file=input_file, **passed_args)
40+
41+
# cli_log_level is None if the user did not pass a log level (-> "default")
42+
cli_log_level: Optional[SomesyLogLevel] = get_log_level()
43+
44+
if cli_log_level is not None:
45+
# update log level flags if cli log level was set
46+
somesy_conf.update_log_level(cli_log_level)
47+
48+
somesy_input: SomesyInput = somesy_conf.get_input()
49+
50+
if cli_log_level is None:
51+
# no cli log level -> set it according to the loaded configuration
52+
set_log_level(somesy_input.config.log_level())
53+
54+
logger.debug(
55+
f"Combined config (Defaults + File + CLI):\n{pretty_repr(somesy_input.config)}"
56+
)
57+
return somesy_input

0 commit comments

Comments
 (0)