From 98f886621729dfbe1b2e4cd7f405f4820c5e5596 Mon Sep 17 00:00:00 2001 From: Connor Ferster Date: Wed, 5 Aug 2026 05:26:51 +0000 Subject: [PATCH 1/3] fix: config loader looks for *.ymprint.yml --- src/ymprint/cli/config.py | 6 ++---- src/ymprint/config/doctemplate.py | 11 ++++++++++- src/ymprint/context_builder.py | 4 +++- src/ymprint/report_reader.py | 3 ++- test.pdf | Bin 0 -> 1707 bytes test.yml | 13 +++++++++++++ .../example_2_config/doctemplate.yml | 8 ++++++-- tests/test-data/example_output1.pdf | Bin 57888 -> 57817 bytes tests/test-data/filled_forms.pdf | Bin 45802 -> 45804 bytes tests/test-data/report_example_2.yml | 4 +++- uv.lock | 2 +- 11 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 test.pdf create mode 100644 test.yml diff --git a/src/ymprint/cli/config.py b/src/ymprint/cli/config.py index 0c5b8f8..6956f0d 100644 --- a/src/ymprint/cli/config.py +++ b/src/ymprint/cli/config.py @@ -1,14 +1,12 @@ from pathlib import Path from typing import Optional -CONFIG_FILENAMES = ['doctemplate.yml', 'textstyles.yml', 'tablestyles.yml'] def locate_config_dir(cwd: Path) -> Optional[Path]: config_dir = None for parent in cwd.parents: - filenames = [path.name for path in parent.glob("*.yml")] - intersection = set(CONFIG_FILENAMES) & set(filenames) - if intersection!= set(): + filenames = [path.name for path in parent.glob("*.ymprint.yml")] + if filenames: config_dir = parent return config_dir diff --git a/src/ymprint/config/doctemplate.py b/src/ymprint/config/doctemplate.py index a7ed2dd..fb27b41 100644 --- a/src/ymprint/config/doctemplate.py +++ b/src/ymprint/config/doctemplate.py @@ -1,3 +1,4 @@ +from enum import StrEnum import pathlib from typing import Optional from pydantic import BaseModel, Field, ConfigDict @@ -12,10 +13,18 @@ class Margins(BaseModel): right: float bottom: float +class RelativeTo(StrEnum): + CONFIG = 'config' + SOURCE = 'source' + +class PDFBackground(BaseModel): + filepath: str + relative_to: Optional[RelativeTo] = Field(alias='relative-to', default=None) + class PageConfig(BaseModel): # model_config = ConfigDict(populate_by_name=True) margins: Margins - background: Optional[str] = None + background: Optional[PDFBackground] = None class PageSizeMixin: page_size: str = Field(alias='page-size') diff --git a/src/ymprint/context_builder.py b/src/ymprint/context_builder.py index be79c6e..1c459f7 100644 --- a/src/ymprint/context_builder.py +++ b/src/ymprint/context_builder.py @@ -10,7 +10,8 @@ def build_context( tablestyles_yaml: dict, document_vars: dict, source_path: str | pathlib.Path, - destination_path: str | pathlib.Path + destination_path: str | pathlib.Path, + config_path: str | pathlib.Path ) -> dict: # inline_styles = {} if "_style" not in content_yaml else content_yaml.pop("_style") report_styles = ReportStyles.model_validate(text_styles_yaml['_style']) @@ -65,6 +66,7 @@ def build_context( } }, "source_path": source_path, + "config_path": config_path, "destination_path": destination_path, } return context \ No newline at end of file diff --git a/src/ymprint/report_reader.py b/src/ymprint/report_reader.py index 2713adc..7aecce4 100644 --- a/src/ymprint/report_reader.py +++ b/src/ymprint/report_reader.py @@ -54,7 +54,8 @@ def load_report(source_yaml: str | pathlib.Path, destination_pdf: str | pathlib. tablestyles, document_vars, source_yaml, - destination_pdf + destination_pdf, + report_config_path, ) story = build_story(source_data, context) if context['doctemplate']['yaml']['_doc'].get('first-page') is not None: diff --git a/test.pdf b/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..94c5998162f09be60bf0539956666180f17c21b7 GIT binary patch literal 1707 zcmb_deNYr-7_XRWX0u2xBMa#*V}b_RuiN{`^91&8;YPk8unx=R?malT+dcR82+^D< z?PDaf!#{EohnZ$%Kq!KQz!JiwnhF8KaTu+@oR~oq6-jXzd-wP{!RfEwKX&JRK7P;h z{PuaCjmj`_Ysfe)7S(;EyA_K9d6H9>p#TcDf>a+;0y2)$#!(nX0s@Ey#hAf>=WO*r zoaJTSB^Kftd?EA#3Td-&i{KEEK0^}iJ{y#xgArnk=wMK=DKsQ`{D?ADzrQKM6t|DAT6V3P;HC` z=+tDKPN&yx!m~t~mmwhVEa(+|k_}a+M9o4~N)V+sQzk14h$7i*)hoK-6q$vf90@dv zI;a5U9-I<~aPVwjfvoVUkV@i-ycY(<$n5+ht(rZ{c zkz=U@Elm?7y6e?uB++YWHO10K1Isd;j$yP36hTmCjgF)fSW0Wws%e(cb0)n}S*Ko^ Sm*fC}B&{W|s3>zfhy4rB?nd$e literal 0 HcmV?d00001 diff --git a/test.yml b/test.yml new file mode 100644 index 0000000..de17319 --- /dev/null +++ b/test.yml @@ -0,0 +1,13 @@ +_doc: + margins: + top: 1.0 + left: 1.0 + right: 1.0 + bottom: 1.0 +yep: > + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt + ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation + ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur + sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit + anim id est laborum. diff --git a/tests/test-data/example_2_config/doctemplate.yml b/tests/test-data/example_2_config/doctemplate.yml index 1827a6c..e3fd63e 100644 --- a/tests/test-data/example_2_config/doctemplate.yml +++ b/tests/test-data/example_2_config/doctemplate.yml @@ -6,11 +6,15 @@ _doc: left: 84 right: 84 bottom: 84 - background: background_other_pages.pdf + background: + filepath: background_other_pages.pdf + relative-to: source first-page: margins: top: 240 left: 84 right: 84 bottom: 84 - background: background_first_page.pdf \ No newline at end of file + background: + filepath: background_first_page.pdf + relative-to: source \ No newline at end of file diff --git a/tests/test-data/example_output1.pdf b/tests/test-data/example_output1.pdf index 99296fe8a33a4781157b57b953899ea949548749..806eb4b6ec2ac44f025de9af2fd2c431989a18f0 100644 GIT binary patch delta 3580 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 SXKpMWfh2IlU}R%G?*9PbeQQYo delta 3636 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 Zz{xM*zMrcb7fJ=H3gwcKA(&`${R>h5ibVhb diff --git a/tests/test-data/filled_forms.pdf b/tests/test-data/filled_forms.pdf index fe7516daeeff4d1715e65f268275a0c26454c5fe..c951c8f6db9f6420f2b139bdf4602914f7f19125 100644 GIT binary patch delta 281 zcmZX~v1$TA6op~ja_rLuCdIaTXXehmGZ0p0$5{l6G$~?XA*fYIu~{UY_yTG69VBJY zXR;9=!o<=&)#2wmpR&s-`yK2u<&LoH=RImiKacHf|MZ~D0MI!NUcN5HaI$*e$UpVH zpZ2#-N%)`qkm7bwdxZODwCXs6>^qLp-Zup3HqGwl+P8z9W1xtn#uRNL8%-G$MH2uJ wSu?ugxnig&B+D@o>5vG(Deu{!DVa(t=0zbsn?>Dx)vL8YBx^*Trp>|GHdJ(gU)4hkT%dIY@&vWC1sRFO+oV63#v_**1WAxt c!x diff --git a/uv.lock b/uv.lock index c681d3b..d51ff82 100644 --- a/uv.lock +++ b/uv.lock @@ -587,7 +587,7 @@ wheels = [ [[package]] name = "ymprint" -version = "0.1.0" +version = "0.2.0" source = { editable = "." } dependencies = [ { name = "jinja2" }, From 0334f6c343757c66d6ccb2e488afc61b97aa6fa2 Mon Sep 17 00:00:00 2001 From: Connor Ferster Date: Thu, 13 Aug 2026 19:28:31 +0000 Subject: [PATCH 2/3] feat: implement background paths; chore: test data clean-up --- src/ymprint/cli/config.py | 8 +- src/ymprint/cli/main.py | 10 +-- src/ymprint/config/pdf_postprocessing.py | 35 +++++++-- src/ymprint/report_reader.py | 7 +- test.pdf | Bin 1707 -> 1712 bytes test.yml | 6 ++ .../{textstyles.yml => config.ymprint.yml} | 9 +++ .../example_1_config/doctemplate.yml | 8 -- .../example_2_config/config.ymprint.yml | 69 ++++++++++++++++++ .../example_2_config/doctemplate.yml | 20 ----- .../example_2_config/tablestyles.yml | 34 --------- .../test-data/example_2_config/textstyles.yml | 15 ---- tests/test-data/example_output1.pdf | Bin 57817 -> 57798 bytes tests/test-data/filled_forms.pdf | Bin 45804 -> 45804 bytes tests/test_content_converters.py | 1 + tests/test_context_builder.py | 1 + tests/test_report_reader.py | 1 + 17 files changed, 125 insertions(+), 99 deletions(-) rename tests/test-data/example_1_config/{textstyles.yml => config.ymprint.yml} (66%) delete mode 100644 tests/test-data/example_1_config/doctemplate.yml create mode 100644 tests/test-data/example_2_config/config.ymprint.yml delete mode 100644 tests/test-data/example_2_config/doctemplate.yml delete mode 100644 tests/test-data/example_2_config/tablestyles.yml delete mode 100644 tests/test-data/example_2_config/textstyles.yml diff --git a/src/ymprint/cli/config.py b/src/ymprint/cli/config.py index 6956f0d..1e8efa4 100644 --- a/src/ymprint/cli/config.py +++ b/src/ymprint/cli/config.py @@ -2,12 +2,12 @@ from typing import Optional -def locate_config_dir(cwd: Path) -> Optional[Path]: - config_dir = None +def locate_config_file(cwd: Path) -> Optional[Path]: + config_file = None for parent in cwd.parents: filenames = [path.name for path in parent.glob("*.ymprint.yml")] if filenames: - config_dir = parent - return config_dir + config_file = filenames[0] + return config_file diff --git a/src/ymprint/cli/main.py b/src/ymprint/cli/main.py index 737040d..68f2da3 100644 --- a/src/ymprint/cli/main.py +++ b/src/ymprint/cli/main.py @@ -10,7 +10,7 @@ from typer import Typer from ..report_reader import load_report -from .config import locate_config_dir, CONFIG_FILENAMES +from .config import locate_config_file from .okular import ensure_okular from ..config.config_loaders import load_config_directory @@ -63,7 +63,7 @@ def convert( # Identify config files and content files to watch here # ensure_demo_file() if config_dir is None: - config_dir = locate_config_dir(Path.cwd()) + config_dir = locate_config_file(Path.cwd()) load_report(source, destination, config_dir) console = Console() @@ -81,7 +81,7 @@ def convert( def live( src: Annotated[str, "YAML file path to render to PDF"], dest: Annotated[Optional[str], "File path of output PDF file. If not provided file name and path of source file will be used (wtih .pdf extension)."] = None, - config_dir: Annotated[Optional[str], "Directory of optional config files (doctemplate.yml, textstyles.yml, tablestyles.yml)"] = None, + config_file: Annotated[Optional[str], "Location of optional document config *.ymprint.yml file"] = None, ): source = Path(src) if dest is None: @@ -90,8 +90,8 @@ def live( destination = Path(dest) # Identify config files and content files to watch here # ensure_demo_file() - if config_dir is None: - config_dir = locate_config_dir(Path.cwd()) + if config_file is None: + config_dir = locate_config_file(Path.cwd()) file_watchers = [FileWatcher(Path(source))] if config_dir is not None: diff --git a/src/ymprint/config/pdf_postprocessing.py b/src/ymprint/config/pdf_postprocessing.py index e43af96..1a0bbb8 100644 --- a/src/ymprint/config/pdf_postprocessing.py +++ b/src/ymprint/config/pdf_postprocessing.py @@ -109,15 +109,29 @@ def fill_forms_and_bake(vars: dict, pdf_backgrounds: dict[str, io.BytesIO | None def load_pdf_backgrounds(context: dict) -> dict[str, io.BytesIO | None]: source_path = pathlib.Path(context['source_path']) source_parent = source_path.parent - first_page = context['doctemplate']['yaml']['_doc'].get('first-page') - if isinstance(first_page, dict): - first_page_background = first_page.get("background") - if first_page_background is not None: - first_page_background = source_parent / first_page_background + + if context['config_path'] is not None: + config_path = pathlib.Path(context['config_path']) + config_parent = config_path.parent + else: + config_path = source_path + config_parent = source_parent + + first_page_bg = context['doctemplate']['yaml']['_doc'].get('first-page', {}).get('background') + if isinstance(first_page_bg, dict): + print(f"{first_page.get('background', {})=}") + first_page_background_filepath = first_page_bg.get('filepath') + relative_to = first_page_bg.get('relative_to') + if relative_to == 'source': + first_page_background = source_parent / first_page_background_filepath + elif relative_to == 'config': + first_page_background = config_parent / first_page_background_filepath + else: + first_page_background = first_page_background_filepath else: first_page_background = None - remaining = context['doctemplate']['yaml']['_doc'].get('background') + remaining = context['doctemplate']['yaml']['_doc'].get('background', {}) first_page_pdf = remaining_pdf = None first_page_data = remaining_page_data = None if first_page_background is not None: @@ -126,7 +140,14 @@ def load_pdf_backgrounds(context: dict) -> dict[str, io.BytesIO | None]: first_page_pdf.save(first_page_data) first_page_data.seek(0) if remaining is not None: - remaining_page_background = source_parent / remaining + relative_to = remaining.get('relative_to') + if relative_to == 'source': + remaining_page_background = source_parent / remaining.get('filepath') + elif relative_to == 'config': + remaining_page_background = config_parent / remaining.get('filepath') + else: + remaining_page_background = remaining.get('filepath') + remaining_pdf = mu.open(remaining_page_background) remaining_page_data = io.BytesIO() remaining_pdf.save(remaining_page_data) diff --git a/src/ymprint/report_reader.py b/src/ymprint/report_reader.py index 7aecce4..919a6de 100644 --- a/src/ymprint/report_reader.py +++ b/src/ymprint/report_reader.py @@ -45,8 +45,6 @@ def load_report(source_yaml: str | pathlib.Path, destination_pdf: str | pathlib. textstyles, tablestyles, doc_data = load_report_config(source_data, report_config_path) doctemplate = DocConfig.model_validate(doc_data['_doc']) document_vars = extract_vars(source_data) - - context = build_context( source_data, textstyles, @@ -57,6 +55,7 @@ def load_report(source_yaml: str | pathlib.Path, destination_pdf: str | pathlib. destination_pdf, report_config_path, ) + print(f"{doc_data=}") story = build_story(source_data, context) if context['doctemplate']['yaml']['_doc'].get('first-page') is not None: story = [NextPageTemplate(1)] + story @@ -75,10 +74,6 @@ def load_report(source_yaml: str | pathlib.Path, destination_pdf: str | pathlib. ) - - - - def extract_vars(source_data: dict) -> dict: if "_vars" in source_data: return source_data.pop("_vars") diff --git a/test.pdf b/test.pdf index 94c5998162f09be60bf0539956666180f17c21b7..807ea06dc2ff9b6ef1bbc72d7304ed3b23e0abef 100644 GIT binary patch delta 603 zcmV-h0;K(`4X_QcYytu{G?Q)uAb(QLZqzUkzUL{vV?ia@o9-riMU+!7mBIrUXLcDB z+gbmV^7f23EYOwOSc()Sfu(}<5>H1r1J0s5}J!}x&vu{kxDPK|!p zw@U5zG9c%z?&^cL^L)urEEgQgkxhoLDzTU-A0@W9f3~z_Do{0ONhw%s$V#6r z3r{B339+`sz!UkJbInpnZJ8JIGAA*Ka5%7KgNYKw+UmkwHJKVAOJM2GZz!&P>!PXd z)rynh41|o=Q1!wNJ$erw+!W~H=QvLAmmM0 z#Wo!K%PK6Vuka8>o=uFXZwwc3(GLF`} zaKY6ePF(RzNxqq?7bu-URz~yEb-0Wu+^q1q*0&`SI2LK^;s#HMG)MYQ(?C(Ikq^&d zEVHmldJ``|DG?lxE?Y7=HbXN) zMnf_|H#0LZF+(yrIW$E>GeS8xGc+pF diff --git a/test.yml b/test.yml index de17319..3b57c01 100644 --- a/test.yml +++ b/test.yml @@ -4,6 +4,12 @@ _doc: left: 1.0 right: 1.0 bottom: 1.0 + first-page: + margins: + top: 1.0 + left: 1.0 + right: 1.0 + bottom: 1.0 yep: > Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation diff --git a/tests/test-data/example_1_config/textstyles.yml b/tests/test-data/example_1_config/config.ymprint.yml similarity index 66% rename from tests/test-data/example_1_config/textstyles.yml rename to tests/test-data/example_1_config/config.ymprint.yml index a37e962..3925ddc 100644 --- a/tests/test-data/example_1_config/textstyles.yml +++ b/tests/test-data/example_1_config/config.ymprint.yml @@ -1,3 +1,12 @@ +_doc: + page-size: a4 + landscape: false + margins: + top: 84 + left: 84 + right: 84 + bottom: 84 + _style: headings: font: Helvetica diff --git a/tests/test-data/example_1_config/doctemplate.yml b/tests/test-data/example_1_config/doctemplate.yml deleted file mode 100644 index 81b30f7..0000000 --- a/tests/test-data/example_1_config/doctemplate.yml +++ /dev/null @@ -1,8 +0,0 @@ -_doc: - page-size: a4 - landscape: false - margins: - top: 84 - left: 84 - right: 84 - bottom: 84 \ No newline at end of file diff --git a/tests/test-data/example_2_config/config.ymprint.yml b/tests/test-data/example_2_config/config.ymprint.yml new file mode 100644 index 0000000..d000eaa --- /dev/null +++ b/tests/test-data/example_2_config/config.ymprint.yml @@ -0,0 +1,69 @@ +_doc: + page-size: letter + landscape: true + margins: + top: 84 + left: 84 + right: 84 + bottom: 84 + background: + filepath: background_other_pages.pdf + relative-to: source + first-page: + margins: + top: 240 + left: 84 + right: 84 + bottom: 84 + background: + filepath: background_first_page.pdf + relative-to: source + +_tablestyle: + cell-padding: + top: 5 + left: 5 + right: 5 + bottom: 5 + + headers: + text: + font: Helvetica + size: 11 + color: "#000000" + row: + color: "#ffffff" + lines: + - above + - below + - between + body: + text: + font: "Helvetica" + size: 11 + color: "black" + rows: + color: + even: "#ffffff" + odd: "#eeeeee" + lines: + - above + - below + - between + + +_style: + headings: + font: Helvetica + color: "#111111" + ratio: minor second + body: + # font: Times + color: black + size: 10 # pts + bullets: + font: Helvetica + size: 12 + color: black + symbol: "-" + spacing: 1.1 diff --git a/tests/test-data/example_2_config/doctemplate.yml b/tests/test-data/example_2_config/doctemplate.yml deleted file mode 100644 index e3fd63e..0000000 --- a/tests/test-data/example_2_config/doctemplate.yml +++ /dev/null @@ -1,20 +0,0 @@ -_doc: - page-size: letter - landscape: true - margins: - top: 84 - left: 84 - right: 84 - bottom: 84 - background: - filepath: background_other_pages.pdf - relative-to: source - first-page: - margins: - top: 240 - left: 84 - right: 84 - bottom: 84 - background: - filepath: background_first_page.pdf - relative-to: source \ No newline at end of file diff --git a/tests/test-data/example_2_config/tablestyles.yml b/tests/test-data/example_2_config/tablestyles.yml deleted file mode 100644 index 57fc9f1..0000000 --- a/tests/test-data/example_2_config/tablestyles.yml +++ /dev/null @@ -1,34 +0,0 @@ -_tablestyle: - cell-padding: - top: 5 - left: 5 - right: 5 - bottom: 5 - - headers: - text: - font: Helvetica - size: 11 - color: "#000000" - row: - color: "#ffffff" - lines: - - above - - below - - between - body: - text: - font: "Helvetica" - size: 11 - color: "black" - rows: - color: - even: "#ffffff" - odd: "#eeeeee" - lines: - - above - - below - - between - - - \ No newline at end of file diff --git a/tests/test-data/example_2_config/textstyles.yml b/tests/test-data/example_2_config/textstyles.yml deleted file mode 100644 index 957e43c..0000000 --- a/tests/test-data/example_2_config/textstyles.yml +++ /dev/null @@ -1,15 +0,0 @@ -_style: - headings: - font: Helvetica - color: "#111111" - ratio: minor second - body: - # font: Times - color: black - size: 10 # pts - bullets: - font: Helvetica - size: 12 - color: black - symbol: "-" - spacing: 1.1 diff --git a/tests/test-data/example_output1.pdf b/tests/test-data/example_output1.pdf index 806eb4b6ec2ac44f025de9af2fd2c431989a18f0..b09a2899b4d5a040d5d4026166d3b43176e543c9 100644 GIT binary patch delta 3561 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 Bbo2lK delta 3582 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 X?tk;Tiz^Qb1BGFEz+i%@0nh&dt7mJ- diff --git a/tests/test-data/filled_forms.pdf b/tests/test-data/filled_forms.pdf index c951c8f6db9f6420f2b139bdf4602914f7f19125..99f2f7256231e8d703d224c9c7b27d08a57252b7 100644 GIT binary patch delta 80 zcmWN^%?*Gc3LJM8bgNqn8aR_bdd{(X+H*I_h*ENbkHxg2+5L{~1L-Xm&;S4c delta 80 zcmV~$(G7qg3uE#!v2DBIP4kYa$s Date: Thu, 13 Aug 2026 20:00:02 +0000 Subject: [PATCH 3/3] Tests pass --- src/ymprint/config/config_loaders.py | 5 ++++- src/ymprint/config/pdf_postprocessing.py | 5 ++++- tests/test-data/example_output1.pdf | Bin 57798 -> 57798 bytes tests/test-data/example_output2.pdf | Bin 86041 -> 78401 bytes tests/test-data/example_output3.pdf | Bin 38536 -> 38520 bytes tests/test-data/filled_forms.pdf | Bin 45804 -> 45804 bytes tests/test_content_converters.py | 2 +- tests/test_loadconfig.py | 4 ++-- tests/test_pdf_postprocessing.py | 1 - tests/test_report_reader.py | 2 -- 10 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/ymprint/config/config_loaders.py b/src/ymprint/config/config_loaders.py index efa1f46..70ce385 100644 --- a/src/ymprint/config/config_loaders.py +++ b/src/ymprint/config/config_loaders.py @@ -98,7 +98,10 @@ def build_current_config(default_config: dict, config_data: DeepChainMap): for key in default_config: value = config_data[key] if isinstance(value, DeepChainMap): - value = build_current_config(default_config[key], value) + default_value = default_config[key] + # This condition only exists for the background key which is None in the defaults + if default_value is not None: + value = build_current_config(default_config[key], value) style_map.update({key: value}) return style_map diff --git a/src/ymprint/config/pdf_postprocessing.py b/src/ymprint/config/pdf_postprocessing.py index 1a0bbb8..94137bb 100644 --- a/src/ymprint/config/pdf_postprocessing.py +++ b/src/ymprint/config/pdf_postprocessing.py @@ -109,6 +109,7 @@ def fill_forms_and_bake(vars: dict, pdf_backgrounds: dict[str, io.BytesIO | None def load_pdf_backgrounds(context: dict) -> dict[str, io.BytesIO | None]: source_path = pathlib.Path(context['source_path']) source_parent = source_path.parent + print(f"{source_parent=}") if context['config_path'] is not None: config_path = pathlib.Path(context['config_path']) @@ -140,7 +141,8 @@ def load_pdf_backgrounds(context: dict) -> dict[str, io.BytesIO | None]: first_page_pdf.save(first_page_data) first_page_data.seek(0) if remaining is not None: - relative_to = remaining.get('relative_to') + relative_to = remaining.get('relative-to') + print(f"{relative_to=}") if relative_to == 'source': remaining_page_background = source_parent / remaining.get('filepath') elif relative_to == 'config': @@ -148,6 +150,7 @@ def load_pdf_backgrounds(context: dict) -> dict[str, io.BytesIO | None]: else: remaining_page_background = remaining.get('filepath') + print(f"{remaining_page_background=}") remaining_pdf = mu.open(remaining_page_background) remaining_page_data = io.BytesIO() remaining_pdf.save(remaining_page_data) diff --git a/tests/test-data/example_output1.pdf b/tests/test-data/example_output1.pdf index b09a2899b4d5a040d5d4026166d3b43176e543c9..94418d2fb737f2c33c80340c64852dc31f0d581a 100644 GIT binary patch delta 78 zcmWN=(G7qg3)sggkoAXfeX fTtEyq**71nt|782=VaNpMxuI}dZ`FR_cNCdpZ*oz delta 78 zcmX?hnEBXY<_*~o9W0%kjU1f}On{`Tv$2Jfv#}Eh8<;s8IGI}5*%-Q-7+V-RnVOp# e7`nPxI$D~!7?~RxIvN<7nHX8RI8R>vP#OTI^cD{Q diff --git a/tests/test-data/example_output2.pdf b/tests/test-data/example_output2.pdf index 0e5970967f68d75804b2e182bece9b18ba7f7bda..0af00b74c561f3176985eb9560abfc4c5c10540a 100644 GIT binary patch delta 4118 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 K(lWDVVg3i=GeH0V delta 11584 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

>F?EX%NgLr<4cb> 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 delta 1253 zcmV_^zWZ0qrGT478NNjo*uyTc4=i#?YhW)0 z7PQLP%F41M$;tNL?~s&a*|DvpNPz;41)C;k_|3-|ayZc41Q<|!;%~MB_;m)CzcXMQ zW;ehjkubZ0-)57$NvD}`NF*mlr2=Q5fKZK}1PDqXXp6oR1?7rJHijm_oBNA4T3{9oc26u2!jg7|8$juyoP4!pl)o{ z!1@L(l^wlGNehVxB=dG z(=K^t2U*o8?}RALMVE6;-wPOmrG#TC)mzCXA9tqPrngL_#H*&Y+hyE?yP`EmcediJ z-ck#C+)&hIorQs^th)hx?w1M+CZ$_-)TNJZd8H{4M$2zgC$=@nXrZVS78JM-j}#Qj7Zk1N>xv=!xCW|Rv#muMl&=vK{7BlG&M3fHa0;+H!(IeFg{&AJ_>VmVRCeMa%E-; PGdM6aI0_{tMNdWwK-xu7 diff --git a/tests/test-data/filled_forms.pdf b/tests/test-data/filled_forms.pdf index 99f2f7256231e8d703d224c9c7b27d08a57252b7..fe5d2eb10ee0b57635a927b04d09ac978f34940e 100644 GIT binary patch delta 80 zcmWN{%ME}a3;@u?HJqY9N)uy33#{kCMGTub1UH7zcYbSbYi`dqoKsNgL8gI)0v!Ug fX-kGghLJM8bgNqn8aR_bdd{(X+H*I_h*ENbkHxg2+5L{~1L-Xm&;S4c diff --git a/tests/test_content_converters.py b/tests/test_content_converters.py index f47fab9..85d5339 100644 --- a/tests/test_content_converters.py +++ b/tests/test_content_converters.py @@ -33,7 +33,7 @@ def default_context(default_config): def test_convert_paragraph(report_ex1, default_context): data = report_ex1 assert con.convert_paragraph(data['title']['first topic'], default_context) - assert con.convert_paragraph(data['title']['fourth topic']['first sub topic'], default_context) + assert con.convert_paragraph(data['title']['An actual topic']['first sub topic'], default_context) def test_convert_ul(report_ex1, default_context): data = report_ex1 diff --git a/tests/test_loadconfig.py b/tests/test_loadconfig.py index 1749091..c03756a 100644 --- a/tests/test_loadconfig.py +++ b/tests/test_loadconfig.py @@ -30,10 +30,10 @@ def test_load_report_config(): assert styles['_style']['body']['size'] == 10 # from config dir # assert styles['_style']['body']['spacing'] == 1.5 # from default config - assert tablestyles['_tablestyle']['cell-padding']['top'] == 5 # from config dir + assert tablestyles['_tablestyle']['cell-padding']['top'] == 7.5 # from config dir assert tablestyles['_tablestyle']['headers']['text']['bold'] == True # from default config - assert doc['_doc']['page-size'] == 'letter' + assert doc['_doc']['page-size'] == 'a4' # assert doc['_doc']['first-page']['background'] is None # This key is intentionally not included in the model. See next test. diff --git a/tests/test_pdf_postprocessing.py b/tests/test_pdf_postprocessing.py index 1f89110..7f1e742 100644 --- a/tests/test_pdf_postprocessing.py +++ b/tests/test_pdf_postprocessing.py @@ -23,4 +23,3 @@ def test_fill_forms_and_bake(): filled_data = fill_forms_and_bake(vars, {"first": bg_data, "remaining": None}) filled = pymupdf.open(stream=filled_data['first']) filled.save(TEST_DATA / "filled_forms.pdf") - assert False diff --git a/tests/test_report_reader.py b/tests/test_report_reader.py index b99a4a1..f884c1a 100644 --- a/tests/test_report_reader.py +++ b/tests/test_report_reader.py @@ -38,5 +38,3 @@ def test_load_yaml(report_ex1, report_ex2): load_report(TEST_DATA / "report_example_1.yml", TEST_DATA / "example_output1.pdf", TEST_DATA / "example_1_config") load_report(TEST_DATA / "report_example_2.yml", TEST_DATA / "example_output2.pdf", TEST_DATA / "example_2_config") load_report(TEST_DATA / "report_example_3.yml", TEST_DATA / "example_output3.pdf", TEST_DATA / "example_1_config") - - assert False