Skip to content

Build

sereto.build

build_subfinding(project, target, sub_finding, version, intermediate_format, converter=None)

Process a sub-finding into the specified format and write it to the ".build" directory.

The sub-finding is first rendered as a Jinja2 template, then converted to the desired format. If the output file already exists and has the same content, it is not overwritten (to preserve timestamps).

Parameters:

Name Type Description Default
project Project

Project's representation.

required
target Target

The target containing the sub-finding.

required
sub_finding SubFinding

The sub-finding to process.

required
version ProjectVersion

The project version to use for rendering.

required
intermediate_format FileFormat

The desired output format (e.g., FileFormat.tex).

required
converter str | None

The convert recipe used for file format transformations. If None, the first recipe is used.

None
Source code in sereto/build.py
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
@validate_call
def build_subfinding(
    project: Project,
    target: Target,
    sub_finding: SubFinding,
    version: ProjectVersion,
    intermediate_format: FileFormat,
    converter: str | None = None,
) -> None:
    """Process a sub-finding into the specified format and write it to the ".build" directory.

    The sub-finding is first rendered as a Jinja2 template, then converted to the desired format.
    If the output file already exists and has the same content, it is not overwritten (to preserve timestamps).

    Args:
        project: Project's representation.
        target: The target containing the sub-finding.
        sub_finding: The sub-finding to process.
        version: The project version to use for rendering.
        intermediate_format: The desired output format (e.g., FileFormat.tex).
        converter: The convert recipe used for file format transformations. If None, the first recipe is used.
    """
    # Initialize the build directory
    init_build_dir(project=project, target=target)

    version_config = project.config.at_version(version=version)

    # Render Jinja2 template
    finding_content = render_jinja2(
        templates=[sub_finding.path.parent],
        file=sub_finding.path,
        vars={
            "f": sub_finding,
            "c": version_config,
            "config": project.config,
            "version": version,
        },
    )

    # Convert to desired format
    content = apply_convertor(
        input=finding_content,
        input_format=sub_finding.format,
        output_format=intermediate_format,
        render=project.settings.render,
        recipe=converter,
        replacements={
            "%TEMPLATES%": str(project.settings.templates_path),
        },
    )

    # Write the finding to the ".build" directory; do not overwrite the same content (preserve timestamps)
    write_if_different(
        file=project.path
        / ".build"
        / target.uname
        / f"{sub_finding.path.name.removesuffix(f'.{sub_finding.format.value}.j2')}.{intermediate_format.value}",
        content=content,
    )