[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "freeroute" version = "2026.07.14" description = "Native Python PCB autorouter — a Java-free port of the FreeRouting engine (Specctra DSN in, SES out)" readme = "README.md" license = "GPL-3.0-or-later" license-files = ["LICENSE"] authors = [{ name = "Ryan Malloy", email = "ryan@supported.systems" }] keywords = [ "pcb", "autorouter", "routing", "specctra", "dsn", "ses", "kicad", "eda", "freerouting", ] classifiers = [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Manufacturing", "Operating System :: OS Independent", "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)", "Typing :: Typed", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", ] requires-python = ">=3.10" dependencies = [] [project.urls] "Homepage" = "https://git.supported.systems/warehack.ing/freeroute" "Repository" = "https://git.supported.systems/warehack.ing/freeroute" "Issues" = "https://git.supported.systems/warehack.ing/freeroute/issues" # The Java engine this is a port of; freeroute ships no upstream code. "Upstream" = "https://github.com/freerouting/freerouting" [project.scripts] freeroute = "freeroute.cli:main" [dependency-groups] dev = [ "pytest>=7.0.0", "pytest-cov>=4.0.0", "ruff>=0.1.0", ] [tool.hatch.build.targets.wheel] packages = ["src/freeroute"] [tool.hatch.build.targets.sdist] # Ship the package, the licence, and the docs — nothing else. `reference/` is a # clone of the GPL FreeRouting Java tree used only as a porting reference; it is # never committed and must never be redistributed inside this package. include = [ "/src", "/docs", "/README.md", "/LICENSE", "/pyproject.toml", ] exclude = [ "/reference", "/tests", "/.github", "/dist", "/build", "/CLAUDE.md", "**/.env", "**/__pycache__", "**/*.py[cod]", "**/.pytest_cache", "**/.ruff_cache", "**/.coverage", ] [tool.ruff] target-version = "py310" line-length = 100 src = ["src", "tests"] [tool.ruff.lint] select = ["E", "W", "F", "I", "B", "C4", "UP", "SIM"] ignore = ["E501"] [tool.ruff.lint.isort] known-first-party = ["freeroute"] force-sort-within-sections = true [tool.pytest.ini_options] minversion = "7.0" testpaths = ["tests"] pythonpath = ["tests"] addopts = ["-ra", "--strict-markers"] markers = [ "oracle: runs the FreeRouting JAR (slow, needs Java); deselect with -m 'not oracle'", ]