-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpyproject.toml
More file actions
117 lines (107 loc) · 3.88 KB
/
Copy pathpyproject.toml
File metadata and controls
117 lines (107 loc) · 3.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
[project]
name = "firepact"
version = "0.1.8"
description = "Generate TypeScript types from your Pydantic models for the Firestore documents you read in realtime -- and fail CI on schema changes that would break a frontend still reading the old shape (FULL_TRANSITIVE)."
readme = "README.md"
requires-python = ">=3.11,<3.15"
license = { text = "MIT" }
authors = [{ name = "hironow" }]
keywords = ["firestore", "firebase", "typescript", "pydantic", "codegen", "json-schema", "compatibility", "schema-evolution"]
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Rust",
"Topic :: Database",
"Topic :: Software Development :: Code Generators",
"Topic :: Software Development :: Quality Assurance",
"Typing :: Typed",
]
dependencies = [
"pydantic>=2.9",
]
[project.urls]
Repository = "https://github.com/hironow/firepact"
Homepage = "https://github.com/hironow/firepact"
[project.scripts]
# Prior-tool-compatible CLI (drop-in for pydantic-to-typescript users).
pydantic2ts = "firepact.cli:main"
# Native entry point for the Firestore-aware generator.
firepact-gen = "firepact.cli:main"
# FULL_TRANSITIVE compatibility gate (no cargo binary needed).
firepact-compat = "firepact.cli:compat_main"
[dependency-groups]
dev = [
"pytest>=8",
"ruff>=0.6",
"mypy>=1.11",
]
# E2E only: the backend writer talks to the real Firestore emulator.
e2e = [
"google-cloud-firestore>=2.16",
]
# maturin builds the PyO3 extension (firepact._core) alongside the pure-Python
# layer under python/. The Python package reaches the Rust engine ONLY through
# _core (no subprocess fallback); the standalone `firepact` binary is a separate
# CLI / dev-and-test tool (ADR 0012).
[build-system]
requires = ["maturin>=1.7,<2"]
build-backend = "maturin"
[tool.maturin]
python-source = "python"
module-name = "firepact._core"
features = ["python"]
# Pin an ABSOLUTE dependency cutoff so uv.lock resolves identically on every
# machine and in CI. A relative exclude-newer-span (e.g. a developer's global
# rolling cooldown) moves daily and makes `uv sync --locked` non-deterministic.
# Bump this date on release; Dependabot's 7-day cooldown handles routine freshness.
[tool.uv]
exclude-newer = "2026-06-27T00:00:00Z"
[tool.ruff.lint]
# see: https://docs.astral.sh/ruff/rules/
select = [
"FAST", # FastAPI
"C90", # mccabe
"NPY", # numpy
"PD", # pandas
"B", # flake8-bugbear
"A", # flake8-builtins
"DTZ", # flake8-datetimez
"T20", # flake8-print
"N", # pep8-naming
"I", # isort
"E", # pycodestyle errors
"F", # Pyflakes
"PLE", # Pylint errors
"PLR", # Pylint refactor
"UP", # pyupgrade
"FURB", # refurb
# "DOC", # pydoclint
# "D", # pydocstyle
"RUF", # Ruff-specific rules
]
extend-ignore = ["E501", "RUF002", "RUF003"]
[tool.mypy]
python_version = "3.13"
strict = true
warn_unused_ignores = true
warn_redundant_casts = true
files = ["python", "examples", "tests"]
# tests/e2e is glue over optional (e2e-group) + emulator deps; its correctness is
# verified by running it (the e2e job), not by type-checking. Excluding it keeps
# mypy stable whether or not google-cloud-firestore happens to be installed.
exclude = ["^tests/e2e/"]
# google-cloud-firestore is an e2e-only dependency (not in the default env).
[[tool.mypy.overrides]]
module = ["google.*"]
ignore_missing_imports = true
[tool.pytest.ini_options]
# E2E (tests/e2e) is excluded from the default run -- it needs the emulator and
# the `e2e` dependency group; run it explicitly via `just test-e2e`.
testpaths = ["tests/unit", "tests/integration"]
pythonpath = ["python", "."]