47 Commits

Author SHA1 Message Date
Sina Atalay
b643d456e7 Fix flaky Hypothesis test for case-sensitive keyword matching
Some Unicode uppercase letters (e.g., mathematical bold 𝐀) have no
distinct lowercase form, so keyword.lower() == keyword. Filter these
out since the test requires a genuine case difference.
2026-03-25 16:38:48 +03:00
Sina Atalay
6956f39835 Address code review feedback on Hypothesis and classic_theme changes
- Update hypothesis to latest version (>=6.151.9)
- Remove pythonpath pytest config (was only needed for tests.strategies)
- Consolidate classic_theme.py into single file with all design models
- Move Hypothesis strategies from strategies.py into their test files
- Add noqa: ARG001 to unused yaml_field_override CLI parameter
- Fix lint and type errors across the codebase
2026-03-25 16:28:44 +03:00
Sina Atalay
2df9d2262b Fix placeholder removal eating provided placeholders with overlapping names
The regex in remove_not_provided_placeholders used a bare alternation
without word boundaries, so removing placeholder "AA" would also
destroy "AAA" in the same template. Fix: add \b word boundaries and
sort longest-first.

Also add Hypothesis tests for:
- remove_not_provided_placeholders: provided keys survive removal
- remove_connectors_of_missing_placeholders: connectors removed/preserved
- validate_arbitrary_date: pass-through for valid dates and custom text
- Mastodon URL: domain and username appear in generated URL
2026-03-25 16:28:44 +03:00
Sina Atalay
141ea9fe92 Fix bold_keywords not matching keywords with non-word boundaries (#706)
The \b word boundary anchor requires a word character (\w) on one side
and a non-word character on the other. Keywords ending with ":" or
starting with "+" have no word boundary at those positions, so \b
fails to match.

Fix: only add \b on the side of a keyword where the character is a
word character. For "Tech stack:", \b is added before "T" but not
after ":". For "C++", \b is added before "C" but not after "+".

Added a Hypothesis property test that catches this entire class of
bugs: any keyword surrounded by spaces in the input text must appear
bolded in the output.
2026-03-25 16:28:44 +03:00
Sina Atalay
005d1d835f Remove useless Hypothesis tests that fuzz trivial operations
Removed tests that were running 100 random inputs through string
operations that can never fail regardless of input:
- process_highlights: fuzzing "- " + string prepend
- process_authors: fuzzing ", ".join()
- PublicationEntry DOI URL: fuzzing f"https://doi.org/{doi}"

These tests add execution time without any chance of finding bugs.
2026-03-25 16:28:20 +03:00
Sina Atalay
427053339b Add Hypothesis tests for process_highlights, process_authors, clean_trailing_parts
- process_highlights: bullet count matches input length, output starts with "- "
- process_authors: comma count is n-1, all authors appear in output
- clean_trailing_parts: allowed trailing chars preserved, never crashes
2026-03-25 16:28:20 +03:00
Sina Atalay
0f7f6f4f97 Follow test naming conventions for Hypothesis tests
Merge property-based tests into existing test classes per the project
testing rules: multiple tests for the same function belong in a
TestFunctionName class.

- TestEscapeTypstCharactersProperties merged into TestEscapeTypstCharacters
- TestMarkdownToTypstProperties merged into TestMarkdownToTypst
- TestBuildDatePlaceholdersProperties merged into TestBuildDatePlaceholders
- TestComputeTimeSpanStringProperties merged into TestComputeTimeSpanString
- TestGetDateObjectProperties renamed to TestGetDateObject
- TestApplyOverridesProperties merged into TestApplyOverridesToDictionary
- TestUpdateValueByLocationProperties merged into TestUpdateValueByLocation
- TestResolveOutputFolderPlaceholderProperties merged into TestResolveOutputFolderPlaceholder
- TestBuildNameVariantsProperties renamed to TestBuildNameVariants
- TestTypstDimensionProperties renamed to TestTypstDimension
- TestSocialNetworkUsernameProperties merged into TestSocialNetwork
2026-03-25 16:28:20 +03:00
Sina Atalay
5e95eee87d Distribute Hypothesis tests into their respective unit test files
Move all 55 property-based tests from tests/test_hypothesis.py into
the existing test files for each module they test:

- test_string_processor.py: keyword bolding, placeholder, URL, pattern
- test_markdown_parser.py: Typst escaping, markdown-to-typst
- test_date.py: date parsing, placeholders, time spans
- test_override_dictionary.py: immutability, path traversal
- test_path_resolver.py: name variants, OUTPUT_FOLDER resolution
- test_classic_theme.py: Typst dimension validation
- test_social_network.py: username format validation

Reusable Hypothesis strategies live in tests/strategies.py. Added
pythonpath=["."] to pyproject.toml so tests can import the strategies
module.
2026-03-25 16:28:20 +03:00
Sina Atalay
43b255eff7 Split classic_theme.py into focused modules
Extract three modules from classic_theme.py (845 lines) to improve
navigability:

- templates.py: entry template option models and Templates class
- typography.py: Typography, FontFamily config, FontSize, SmallCaps, Bold
- header.py: Header, Connections, Links, PhoneNumberFormatType

classic_theme.py retains Page, Colors, Sections, Entries, and
ClassicTheme. All imports use absolute paths so the custom theme
generator (which copies classic_theme.py as text) continues to work.

Template entry option classes renamed from e.g. OneLineEntry to
OneLineEntryTemplate to avoid name collision with CV entry models.
2026-03-25 16:28:20 +03:00
Sina Atalay
db6ad98654 Fix test failures from code quality changes
- Revert entry_with_date.py to let ValueError propagate naturally
  (Pydantic produces better messages like "The month must be between
  1 and 12." than our generic wrapper)
- Update create_theme tests to expect typer.Exit (now has error handler)
- Update pdf_png test to use real temp file instead of patching read_text
- Fix watcher test mock to handle double join() call pattern
- Regenerate JSON schema after union type order change
2026-03-25 16:28:20 +03:00
Sina Atalay
dd5ac9115a Fix test_raises_error_when_version_missing_from_typst_toml match pattern 2026-03-21 03:56:52 +03:00
Sina Atalay
da94718587 Update dev tooling and dependencies to latest versions
Bump black (26.3.1), ruff (0.15.7), ty (0.0.24), prek (0.3.6), typer
(0.24.1), and codespell (v2.4.2). Add ty:ignore comments and type
annotations to satisfy stricter checks in ty 0.0.24. Make skill zip
generation reproducible with a fixed timestamp.
2026-03-21 01:20:17 +03:00
Sina Atalay
295ae6185b Fix #653: Allow SUMMARY placeholder to be used inline in templates
process_summary() unconditionally wrapped summary text in Markdown admonition
syntax (!!! summary), which only works as a block-level construct on its own
line. When users placed SUMMARY inline in a template (e.g., "**COMPANY**,
SUMMARY"), the admonition syntax broke rendering.

Now render_entry_templates() checks if SUMMARY appears on its own line in
the template. If standalone, admonition wrapping is applied for the special
#summary[] Typst formatting. If inline, the raw summary text is used directly.
2026-03-21 01:03:32 +03:00
Sina Atalay
e80ecfc559 Fix #685: Process markdown lines independently to prevent cross-line emphasis interference
When multi-line template fields (like main_column) contained markdown emphasis
markers on adjacent lines, the Python markdown library treated single-newline-
separated lines as one paragraph, causing markers to interact across lines and
produce garbled Typst output with mismatched brackets.

The fix processes each line of input independently in markdown_to_typst() while
preserving multi-line admonition blocks. This prevents emphasis markers on one
line from interfering with markers on adjacent lines.
2026-03-21 01:03:32 +03:00
Noah Croghan
fb9b0e9295 Fix EducationEntry location placement in markdown reference file (#691)
* Fix EducationEntry location placement

* Fix EducationEntry location placement in markdown reference file

---------

Co-authored-by: simonafield <simon.techkid@outlook.com>
2026-03-21 00:26:30 +03:00
Sina Atalay
9bc8c2862c Add Ink, Opal, and Ember themes with examples, docs, and test data
Ink: elegant academic theme with EB Garamond and purple palette.
Opal: modern minimalist with Lato and teal accents.
Ember: editorial theme with mixed Gentium Book Plus/Ubuntu fonts,
crimson accents, diamond bullets, and justified-with-no-hyphenation.

Updates README theme grid from 2x3 to 3x3 to showcase all 9 themes.
2026-03-20 21:25:38 +03:00
Sina Atalay
021c9fbde3 Add RenderCV skill with eval framework and auto-generated docs/llms.txt
- Add SKILL.md for AI agents: YAML schema reference, entry type field
  tables, design samples per theme, CLI reference, and important patterns
  (YAML quoting, phone validation, bullet characters)
- Add Jinja2 template and generate.py that auto-generates SKILL.md and
  docs/llms.txt from live Pydantic models and sample generators
- Add promptfoo eval suite (15 tests across 4 files): cv_generation,
  pdf_parsing, design, and cli_workflow
- Add deterministic grader that validates LLM output through RenderCV's
  own pydantic pipeline (not jsonschema)
2026-03-20 20:15:09 +03:00
Sina Atalay
bc87090b96 Add tests for uncovered edge cases in pdf_png and sample_generator 2026-03-20 18:30:02 +03:00
Sina Atalay
009eec5dfb Bundle rendercv-typst inside the Python package to decouple from Typst Universe
Move `rendercv-typst/` into `src/rendercv/renderer/rendercv_typst/` so that
`lib.typ` and `typst.toml` ship with every pip install. This eliminates the
runtime dependency on Typst Universe, allowing releases without waiting for
external PR reviews. The wheel excludes non-essential files (examples, template,
README, etc.) via `[tool.uv.build-backend]` wheel-exclude.
2026-03-20 18:18:04 +03:00
Sina Atalay
5927cf0d00 Update Harvard theme 2026-03-20 16:52:35 +03:00
Sina Atalay
4e07fa2380 Add centered section title types and bump rendercv-typst to 0.3.0
Add four new section title styles: `centered_without_line`,
`centered_with_partial_line` (baseline), `centered_with_centered_partial_line`
(middle-aligned), and `centered_with_full_line`. These allow section headings
to be centered with various line decorations, complementing the existing
left-aligned options.
2026-03-20 05:20:10 +03:00
Sina Atalay
9b7830a0e1 Create new theme: harvard 2026-03-19 23:03:18 +03:00
Sina Atalay
0c45adf776 Fix formatting and linting issues 2026-03-19 22:28:33 +03:00
Sina Atalay
7138cee196 Fix orphaned connector words when placeholders are removed from templates
When a placeholder like DEGREE was missing from an education entry, the
locale phrase "DEGREE in AREA" left the connector word "in" behind,
producing output like "Princeton University, in Computer Science". This
affected all locales with connector words (en, em, di, at, etc.).

The fix adds a general-purpose `remove_connectors_of_missing_placeholders`
step inside `remove_not_provided_placeholders` that strips bare connector
words from separators between placeholders when either side is missing.
This works for any template, not just locale phrases — for example,
"JOB_TITLE at COMPANY" now correctly drops "at" when COMPANY is absent.
2026-03-19 22:17:00 +03:00
Sina Atalay
4c617170e8 Clean up characters around empty string inputs 2026-03-04 04:21:34 +03:00
Sina Atalay
da2e657416 Increase test coverage 2026-03-03 16:39:23 +03:00
Sina Atalay
9e773d64d0 Only catch full words in settings.bold_keywords 2026-03-03 01:02:57 +03:00
Sina Atalay
1bd0277edb Allow empty sections 2026-03-02 18:36:52 +03:00
Sina Atalay
49a95fd9f1 Fix tests 2026-02-18 17:51:47 +03:00
Sina Atalay
fd5409c142 Support "today" in settings.current_date 2026-02-18 02:38:41 +03:00
Diorcet Yann
d0b2e12b3b Add settings.pdf_title field in order to customize the title of produced documents (#624)
* cv section: add title field in order to customize the title of produced documents

* Sync branch with origin/main

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Implement

* Use NAME - CV as pdf_title

---------

Co-authored-by: Sina Atalay <79940989+sinaatalay@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 14:48:40 +03:00
husam515
4a9083c117 Add Arabic locale support (#591)
* feat: Add Arabic locale support and update Typst preamble template.

* feat: add rtl support for the Full.html template

* fix: change  "'s CV" hardcoded word in the html/md outputs and make it changeable to support different languages.

* test: add tests for RTL support

* test: add tests for RTL support

* Improve implementation

* Update testdata

* Fix merge issues

* Simplify

* Add test and use type hints with type adapters

* Fix `just check` errors

---------

Co-authored-by: Khalid <khalid.pro.968@gmail.com>
Co-authored-by: Sina Atalay <79940989+sinaatalay@users.noreply.github.com>
2026-02-17 14:19:11 +03:00
Sina Atalay
9611320502 Add degree_width field to design.entries (#671)
* Add `design.entries.degree_width` field #649

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Bump rendercv typst version to 0.2.0

* Update testdata

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 14:03:07 +03:00
lif
abfe1e1733 feat: add --output-folder option to specify output directory (#578)
* feat: add --output-folder option to specify base output directory

This addresses issue #551 by adding support for customizing the output
folder for all generated files.

Changes:
- Add `output_folder` field to RenderCommand model
- Add `--output-folder` / `-o` CLI option
- When output_folder is set, it replaces the default `rendercv_output`
  folder in all output paths
- Support OUTPUT_FOLDER placeholder for advanced path customization
- Add comprehensive test coverage

Usage examples:
  # Simple: output all files to build/en/
  rendercv render cv.yaml --output-folder build/en/

  # Advanced: use OUTPUT_FOLDER placeholder for custom paths
  rendercv render cv.yaml --output-folder dist/ \
    --pdf-path OUTPUT_FOLDER/final/resume.pdf

Closes #551

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: address linting errors and Windows compatibility

- Fix PIE810: use tuple in startswith() call
- Fix ruff format issues
- Make tests cross-platform compatible for Windows

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: split compound assertions per PT018 rule

* Improve and update examples and schema

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Sina Atalay <79940989+sinaatalay@users.noreply.github.com>
2026-02-17 00:01:19 +03:00
Daniel Rafailov
3685da2b31 Automatically delete obsolete PNG files (#590)
* #588

* formatting issue fix

* Add tests

* Update uv.lock and testdata

---------

Co-authored-by: Sina Atalay <79940989+sinaatalay@users.noreply.github.com>
2026-02-16 20:18:49 +03:00
Sina Atalay
bb4349ac57 Implement locale.phrases (#618) 2026-02-16 19:24:39 +03:00
shraddha khetmalis
9b26e3b4a1 Feature/add day placeholder to single date formatting (fixes #548) (#571) (#571)
- Add DAY placeholders to single date formatting
- Add tests for DAY placeholders
- Apply ruff formatting
- fix: expose DAY placeholders in top note and footer templates
- fix: apply ruff formatting for DAY placeholders
- refactor: extract build_date_placeholders, add DAY/DAY_IN_TWO_DIGITS support

Co-authored-by: Sina Atalay <79940989+sinaatalay@users.noreply.github.com>
2026-02-16 15:42:12 +03:00
Jordan Bradford
a7b6e9a2d5 feat: Add Reddit social network (#658)
* Add Reddit social network

* Run `pre-commit`
2026-02-16 14:33:21 +03:00
Sina Atalay
32d67b0d13 Improve markdown templates 2025-12-23 20:03:33 +03:00
Sina Atalay
3d12051c2d Fix testdata files 2025-12-22 18:11:04 +03:00
Sina Atalay
b524e377fe Switch from pyright to ty (https://github.com/astral-sh/ty) 2025-12-22 16:54:22 +03:00
Jordan Bradford
17114e03b2 Add Bluesky (#560) 2025-12-21 23:18:13 +03:00
Sina Atalay
1e04ab0d25 Fix settings field issues 2025-12-12 22:27:12 +03:00
Sina Atalay
547b6dc806 Improve placeholders and JSON Schema 2025-12-12 13:29:15 +03:00
Sina Atalay
ac828184f1 Fix multiline summary issues 2025-12-12 13:22:23 +03:00
Sina Atalay
6bd1cadf36 Improve error handling 2025-12-09 23:20:06 +03:00
Sina Atalay
5cc5fbdf9e Massive Refactor: Architecture Redesign and Technical Debt Cleanup (#528)
* Rename `data` folder with schema

* Start refactoring data models

* Work on entry models

* Keep working on entries

* Keep working on data models

* Push old data files

* Keep working on data models

* First draft of schema.cv

* Keep working on schema

* Keep working on schema

* Improve schema.models

* Keep working on rendercv.schema

* Work on schema.design

* Keep working on rendercv.schema

* Complete variant_class_generator

* Keep working rendercv.schema

* Keep working on rendercv.schema

* Final touches to rendercv.schema

* Improve json schema descriptions in rendercv.schema

* Start working on rendercv.schema tests

* Keep implementing rendercv.schema tests

* Add more tests for rendercv.schema

* Improve rendercv.schema

* Improve docstrings and comments in rendercv.schema

* Implement better pydantic error handling in `rendercv.schema`

* Improve variant class system

* Fix rendercv.schema tests

* Start working on rendercv.templater

* Update template names

* Switching to new rendercv typst template soon

* Work on new templater

* Rename renderer with renderer_old

* Don't use utils in rendercv.schema

* Complete connections

* Update renderer folder structure

* Work on new renderer

* Work on new renderer

* Date processing on new renderer

* Improve date processing, support multiple emails, phones, and websites

* Improve markdown to Typst

* Complete entry template processing

* Time span computation in new renderer

* Better entry templates

* Setup new templates

* Improve rendercv.schema

* Start adding tests for rendercv.renderer

* New markdown parser!

* Improve markdown to typst conversion

* Finalize markdown parser

* Add new test files for rendercv.renderer

* Fix cv and connections

* Add connections test

* Improve connection tests

* Improve entry templates

* Add model processor tests

* Improve templater

* Rename old folders

* Improve schema

* Add file generation logic to renderer

* Fix naming issues

* Fix schema tests

* Add path type tests

* Add font family and typst dimension type tests

* Rename old tests

* Fix design tests

* Start integration testing of renderer

* Improve entry tempates

* Handle nested highlights properly

* Finalize Typst preamble template

* Start working on new CLI

* Remove old test files

* Implement override dictionary in new schema

* Start working on new CLI

* Better prints on render command

* New structure

* New render printer

* Add all the commands to new CLI

* Work on new command in new cli

* Improve new command

* Add error handler to new cli

* Work on create theme command

* Complete create theme command

* Remove old source files

* Improve exceptions

* Create new docs

* Add writing tests guide

* Fix cli printer and write tests

* Test copy templates

* Add app tests

* Bring back accidentally removed files

* Imporve cli and tests

* Fix path issues

* Improve

* Improve

* Add reference file comparison tests

* Fix path resolver

* Start working on test_pdf_png

* Implement comparison of multiple files (png)

* Start testing typst

* Fix templating issues

* Fix header and entry templates issues

* Implement short second rows

* Fix date issues

* Fix nested bullets and add summary

* Update testdata

* Implement footer

* Update testdata

* Reimagined design and locale schema, first iteration

* Reimagined design and locale second iteration

* Update design and locale schemas

* Adapt templater to the new design and locale

* Fix tests

* Update lib.typ and testdata for the new locale and design

* Implement proper tests with all combinations of entries

* Remove some docstrings

* fix connections logic

* Improve

* Start working on examples

* Update testdata

* Fix long second row issue

* fix templating issues

* Fix lib.typ issues

* Update testdata

* Fix clean_trailing_parts

* Update test cv

* update test cv

* Update theme defaults

* update schema and fix moderncv

* Fix moderncv issues

* Update testdata

* Update testdata and examples

* Fix issues about photo

* Fix typst photo path issues

* improve entry templates from yaml

* add new locale

* Rename writing tests doc

* Update writing tests

* Improve tests

* Add more cli tests

* Increase test coverage

* Rename variant pydantic model generator

* Improve tests

* Update testdata and improve tests

* Format, fix pre-commit errors

* Fix scripts and update entry figures

* Improve tests

* Write docstrings of schema

* Write schema docstrings

* Setup api reference

* Start working on new docs

* Work on docs

* Improve progress panel of render command

* Finalize new docs index

* Complete CLI docs

* Work on YAML input structure page

* Finalize user guide

* Start working on developer guide

* Improve api reference

* Improve developer guide

* Improve developer guide

* Improve developer gide

* Improve developer guide

* Improve developer guide

* Update developer guide

* Improve developer guide

* Improve developer guide

* Improve developer guide

* Developer guide first draft

* update developer guide

* Update examples

* Update testdata

* Handle wrong installation (rendercv instead of rendercv[full])

* Remove unnecessary files

* Write set up vs code page

* Update README.md

* Change docs description

* Compress design options gif

* minor updates

* Polish all the json schema descriptions

* Update testdata and examples

* Remove some emdashed from docs

* Add whatsapp support

* Add TestEscapeTypstCharacters to tests

* Implement custom connections

* Add page break before sections feature

* Revert page break before sections feature

* Rebase to main

* Fix social network tests, update schema
2025-12-09 17:03:56 +03:00