Files
rendercv/pyproject.toml
2025-01-07 13:48:27 +03:00

267 lines
11 KiB
TOML

# Every modern Python package today has a `pyproject.toml` file. It is a Python
# standard. `pyproject.toml` file contains all the metadata about the package. It also
# includes the dependencies and required information for building the package. For more
# details, see https://pip.pypa.io/en/stable/reference/build-system/pyproject-toml/.
[build-system]
# If a code needs to be distributed, it might need to be compiled, or it might need to
# be bundled with other files. This process of making a code ready for distribution is
# called building.
# Python packages need to be built too, even though they are not compiled (mostly). At
# the end of the building process, a source distribution package (sdist) and a built
# distribution package (in Wheel format) are created.
# See https://packaging.python.org/en/latest/tutorials/packaging-projects/ for details.
# Built Distribution:
# https://packaging.python.org/en/latest/glossary/#term-Built-Distribution
# Source Distribution:
# https://packaging.python.org/en/latest/glossary/#term-Source-Distribution-or-sdist
# To build RenderCV, we need to specify which build package we want to use. There are
# many build packages like `setuptools`, `flit`, `poetry`, `hatchling`, etc. We will use
# `hatchling`.
requires = [
"hatchling==1.27.0",
] # List of packages that are needed to build RenderCV
# Python has a standard object format called build-backend object. Python standard asks
# this object to have some specific methods that do a specific job. For example, it
# should have a method called `build_wheel` that builds a wheel file. We use hatchling
# to build RenderCV, and hatchling's build-backend object is `hatchling.build`.
# See https://peps.python.org/pep-0517/
build-backend = "hatchling.build" # A build-backend object for building RenderCV
[tool.hatch.build.targets.sdist]
# In the sdist, what do we want to exclude? Gif files are huge.
exclude = ["*.gif"]
[tool.hatch.build.targets.wheel]
# In wheel, what do we want to include and exclude?
packages = ["rendercv"]
[tool.hatch.version]
# We will use hatchling to generate the version number of RenderCV. It will go to the
# `path` below and get the version number from there.
# See https://hatch.pypa.io/latest/version/
path = "rendercv/__init__.py"
[project]
# Under the `project` section, we specify the metadata about RenderCV.
name = 'rendercv'
description = 'Typst-based CV/resume generator'
authors = [{ name = 'Sina Atalay', email = 'dev@atalay.biz' }]
license = "MIT"
readme = "README.md"
requires-python = '>=3.10'
# RenderCV depends on these packages. They will be installed automatically when RenderCV
# is installed:
dependencies = [
'Jinja2==3.1.3', # to generate Typst and Markdown files
'phonenumbers==8.13.52', # to validate phone numbers
'email-validator==2.2.0', # to validate email addresses
'pydantic==2.9.2', # to validate and parse the input file
'pycountry==24.6.1', # for ISO 639-3 validation
'pydantic-extra-types==2.10.1', # to validate some extra types
]
classifiers = [
"Intended Audience :: Science/Research",
"Intended Audience :: Education",
"Topic :: Text Processing :: Markup",
"Topic :: Printing",
"Development Status :: 5 - Production/Stable",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
] # go to https://pypi.org/classifiers/ to see all classifiers
dynamic = ["version"] # We will use hatchling to generate the version number
[project.optional-dependencies]
full = [
'ruamel.yaml==0.18.6', # to parse YAML files
'typer==0.15.1', # to create the command-line interface
"markdown==3.7", # to convert Markdown to HTML
"watchdog==6.0.0", # to poll files for updates
"typst==0.12.2", # to render PDF from Typst source files
"rendercv-fonts==0.2.0", # some font files for RenderCV
]
[project.urls]
# Here, we can specify the URLs related to RenderCV. They will be listed under the
# "Project links" section in PyPI. See https://pypi.org/project/rendercv/
Source = 'https://github.com/rendercv/rendercv'
Documentation = 'https://docs.rendercv.com'
Changelog = 'https://docs.rendercv.com/changelog'
[project.scripts]
# Here, we specify the entry points of RenderCV.
# See https://packaging.python.org/en/latest/specifications/entry-points/#entry-points
# See https://hatch.pypa.io/latest/config/metadata/#cli
# The key and value below mean this: If someone installs RenderCV, then running
# `rendercv` in the terminal will run the function `app` in the module `cli` in the
# package `rendercv`.
rendercv = 'rendercv.cli:app'
# ======================================================================================
# Virtual Environments Below ===========================================================
# ======================================================================================
# RenderCV depends on other packages, which are listed under the `project` section as
# `dependencies`. However, for the development of RenderCV, we need some other packages
# too (like `black`, `ruff`, `mkdocs`, etc.). We need these packages in our virtual
# environments and we handle the environments with `hatchling`.
# There will be three virtual environments for RenderCV: `default`, `docs`, and `test`.
# `default` is the default virtual environment needed to develop RenderCV.
# `docs` is the virtual environment needed to build the documentation of RenderCV.
# `test` is the virtual environment needed to run the tests of RenderCV.
[tool.hatch.envs.default]
installer = "uv"
python = "3.13"
dependencies = [
"ruff", # to lint and format the code
"black", # to format the code
"ipython", # for ipython shell
"pyright", # to check the types
"pre-commit", # to run the checks before committing
"pytest==8.3.4", # to run the tests
"coverage==7.6.10", # to generate coverage reports
"pypdf==5.1.0", # to read PDF files
]
features = ["full"] # to install full optional dependencies
[tool.hatch.envs.default.scripts]
# Hatch allows us to define scripts that can be run in the activated virtual environment
# with `hatch run ENV_NAME:SCRIPT_NAME`.
# Format all the code in the `rendercv` package with `black`:
format = "ruff check --fix && ruff format && black rendercv docs tests" # hatch run format
# Lint the code in the `rendercv` package with `ruff`:
lint = "ruff check" # hatch run lint
# Check types in the `rendercv` package with `pyright`:
check-types = "pyright rendercv tests" # hatch run check-types
# Run pre-commit checks:
precommit = "pre-commit run --all-files" # hatch run pre-commit
# Run the tests:
test = "pytest" # hatch run test
# Run the tests and generate the coverage report as HTML:
test-and-report = "coverage run -m pytest && coverage combine && coverage report && coverage html --show-contexts" # hatch run test-and-report
[tool.hatch.envs.test]
template = "default"
[[tool.hatch.envs.test.matrix]]
python = ["3.10", "3.11", "3.12", "3.13"]
[tool.hatch.envs.docs]
installer = "uv"
python = "3.13"
# Dependencies to be installed in the `docs` virtual environment.
dependencies = [
"mkdocs-material==9.5.34", # to build docs
"mkdocstrings-python==1.11.1", # to build reference documentation from docstrings
"pdfCropMargins==2.1.3", # to generate entry figures for the documentation
"pillow==10.4.0", # lock the dependency of pdfCropMargins
"mkdocs-macros-plugin==1.0.5", # to be able to have dynamic content in the documentation
"PyMuPDF==1.24.14", # to convert PDF files to images
]
features = ["full"] # to install full optional dependencies
[tool.hatch.envs.docs.scripts]
# Build the documentation with `mkdocs`:
build = "mkdocs build --clean --strict" # hatch run docs:build
# Start the development server for the documentation with `mkdocs`:
serve = "mkdocs serve" # hatch run docs:serve
# Update schema.json:
update-schema = "python docs/update_schema.py" # hatch run docs:update-schema
# Update `examples` folder:
update-examples = "python docs/update_examples.py" # hatch run docs:update-examples
# Update entry figures in "Structure of the YAML File" page:
update-entry-figures = "python docs/update_entry_figures.py" # hatch run docs:update-entry-figures
# ======================================================================================
# Virtual Environments Above ===========================================================
# ======================================================================================
# RenderCV uses different tools to check the code quality, format the code, build the
# documentation, build the package, etc. We can specify the settings for these tools in
# `pyproject.toml` file under `[tool.name_of_the_tool]` so that new contributors can use
# these tools easily. Generally, popular IDEs grab these settings from `pyproject.toml`
# file automatically.
[tool.ruff]
line-length = 88
[tool.ruff.format]
docstring-code-format = true
[tool.ruff.lint]
extend-select = [
"B", # flake8-bugbear
"I", # isort
"ARG", # flake8-unused-arguments
"C4", # flake8-comprehensions
"EM", # flake8-errmsg
"ICN", # flake8-import-conventions
"ISC", # flake8-implicit-str-concat
"G", # flake8-logging-format
"PGH", # pygrep-hooks
"PIE", # flake8-pie
"PL", # pylint
"PT", # flake8-pytest-style
"PTH", # flake8-use-pathlib
"RET", # flake8-return
"RUF", # Ruff-specific
"SIM", # flake8-simplify
"T20", # flake8-print
"UP", # pyupgrade
"YTT", # flake8-2020
"EXE", # flake8-executable
"NPY", # NumPy specific rules
"PD", # pandas-vet
]
ignore = [
"PLR", # Design related pylint codes
"ISC001", # Conflicts with formatter
"UP007", # I like Optional type
"PGH003", # It would be nice to not ignore this
]
flake8-unused-arguments.ignore-variadic-names = true
[tool.black]
line-length = 88 # maximum line length
preview = true # to allow enable-unstable-feature
enable-unstable-feature = [
"string_processing",
] # to break strings into multiple lines
[tool.pyright]
reportIncompatibleVariableOverride = false # disable this error type
reportIncompatibleMethodOverride = false # disable this error type
exclude = ["rendercv/themes/*"]
[tool.coverage.run]
source = ['rendercv'] # The source to measure during execution
concurrency = ['multiprocessing'] # For watcher tests
# Use relative paths instead of absolute paths, this is useful for combining coverage
# reports from different OSes:
relative_files = true
[tool.coverage.report]
# Don't include jinja templates in the coverage report:
omit = ["*.j2.*", "rendercv/__main__.py"]
# Don't include these lines in the coverage report:
exclude_lines = ["if __name__ == .__main__.:"]
[tool.pytest.ini_options]
addopts = [
"-ra", # Show extra test summary info for all tests
"-v", # Increase verbosity
"--strict-markers", # Don't allow unknown markers
"--strict-config", # Always fail if there are unknown configuration options
]
testpaths = ["tests"]