d6783c5
commit d6783c5
6 files changed
+88 -27
Showing 6 changed files+88-26
▼README.md
+50-12
| @@ -8,6 +8,12 @@ | ||
8 | 8 | <a href="https://github.com/swadhinbiswas/JustAPI/actions/workflows/ci.yml"> |
9 | 9 | <img src="https://github.com/swadhinbiswas/JustAPI/actions/workflows/ci.yml/badge.svg?branch=initial-setup" alt="CI"> |
10 | 10 | </a> |
11 | +<a href="https://github.com/swadhinbiswas/JustAPI/actions/workflows/wheels.yml"> | |
12 | + <img src="https://github.com/swadhinbiswas/JustAPI/actions/workflows/wheels.yml/badge.svg" alt="Wheels"> | |
13 | +</a> | |
14 | +<a href="https://github.com/swadhinbiswas/JustAPI/actions/workflows/publish.yml"> | |
15 | + <img src="https://github.com/swadhinbiswas/JustAPI/actions/workflows/publish.yml/badge.svg" alt="Publish"> | |
16 | +</a> | |
11 | 17 | <a href="https://github.com/swadhinbiswas/JustAPI/blob/initial-setup/LICENSE"> |
12 | 18 | <img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT"> |
13 | 19 | </a> |
| @@ -17,14 +23,17 @@ | ||
17 | 23 | <a href="https://www.rust-lang.org/"> |
18 | 24 | <img src="https://img.shields.io/badge/rust-1.85+-E6522C.svg?logo=rust&logoColor=white" alt="Rust version"> |
19 | 25 | </a> |
20 | -<a href="https://github.com/swadhinbiswas/JustAPI"> | |
21 | - <img src="https://img.shields.io/badge/version-2.0.0-green.svg" alt="Version"> | |
26 | +<a href="https://github.com/swadhinbiswas/JustAPI/blob/initial-setup/deny.toml"> | |
27 | + <img src="https://img.shields.io/badge/cargo--deny-v0.20-passing-green.svg" alt="cargo-deny"> | |
28 | +</a> | |
29 | +<a href="https://pypi.org/project/justapi/"> | |
30 | + <img src="https://img.shields.io/badge/pypi-2.0.8-blue.svg?logo=pypi&logoColor=white" alt="PyPI"> | |
22 | 31 | </a> |
23 | 32 | </p> |
24 | 33 | |
25 | 34 | --- |
26 | 35 | |
27 | -**Documentation**: <a href="https://github.com/swadhinbiswas/JustAPI/tree/initial-setup/docs" target="_blank">https://github.com/swadhinbiswas/JustAPI/docs</a> | |
36 | +**Documentation**: <a href="https://github.com/swadhinbiswas/JustAPI/tree/initial-setup/docs_site" target="_blank">https://github.com/swadhinbiswas/JustAPI/docs_site</a> | |
28 | 37 | |
29 | 38 | **Source Code**: <a href="https://github.com/swadhinbiswas/JustAPI" target="_blank">https://github.com/swadhinbiswas/JustAPI</a> |
30 | 39 | |
| @@ -122,19 +131,35 @@ platform, or a new validator (we wrap Pydantic v2 core / JSON Schema). See | ||
122 | 131 | |
123 | 132 | ## Installation |
124 | 133 | |
125 | -<div class="termy"> | |
134 | +### From PyPI (recommended) | |
126 | 135 | |
127 | -```console | |
128 | -$ pip install justapi | |
136 | +```bash | |
137 | +pip install justapi | |
138 | +``` | |
129 | 139 | |
140 | +With optional features (Pydantic v2, Jinja2, XML): | |
130 | 141 | |
131 | -Successfully installed justapi-2.0.0 | |
142 | +```bash | |
143 | +pip install "justapi[full]" | |
132 | 144 | ``` |
133 | 145 | |
134 | -</div> | |
146 | +### Via uv (faster) | |
147 | + | |
148 | +[uv](https://docs.astral.sh/uv/) is the recommended Python package manager: | |
135 | 149 | |
136 | -Or build from source with [maturin](https://www.maturin.rs/): | |
150 | +```bash | |
151 | +uv pip install justapi | |
152 | +uv pip install "justapi[full]" | |
153 | +``` | |
154 | + | |
155 | +### Run without installing | |
156 | + | |
157 | +```bash | |
158 | +uvx justapi create my_app | |
159 | +uvx justapi serve --reload | |
160 | +``` | |
161 | + | |
162 | +### Build from source | |
137 | 163 | |
138 | 164 | ```bash |
139 | 165 | cd crates/justapi-py |
| @@ -354,8 +379,9 @@ JustAPI gives you the same developer experience as FastAPI, but with a Rust engi | ||
354 | 379 | <tr><td>Plugin System</td><td>Third-party extension API with lifecycle hooks</td></tr> |
355 | 380 | <tr><td>WASM Plugins</td><td>wasmtime-powered WebAssembly middleware</td></tr> |
356 | 381 | |
357 | -<tr><td rowspan="3"><strong>🛡️ Quality</strong></td> | |
382 | +<tr><td rowspan="4"><strong>🛡️ Quality</strong></td> | |
358 | 383 | <td>Memory Safety</td><td>Miri-verified, 6 fuzz targets</td></tr> |
384 | +<tr><td>Supply Chain Security</td><td>cargo-deny v0.20 — advisories, bans, licenses, sources</td></tr> | |
359 | 385 | <tr><td>Type Stubs</td><td>Complete .pyi for all public modules</td></tr> |
360 | 386 | <tr><td>Test Utilities</td><td>Built-in TestClient & snapshot testing</td></tr> |
361 | 387 | </table> |
| @@ -444,7 +470,8 @@ justapi-bench ─→ justapi-core | ||
444 | 470 | |
445 | 471 | - **Rust** 1.85+ (edition 2021) — [install via rustup](https://rustup.rs/) |
446 | 472 | - **Python** 3.11+ — [download](https://www.python.org/downloads/) |
447 | -- **maturin** — `pip install maturin` | |
473 | +- **maturin** — `pip install maturin` (or `uv pip install maturin`) | |
474 | +- **uv** (optional, recommended) — [install guide](https://docs.astral.sh/uv/) | |
448 | 475 | |
449 | 476 | ### Building |
450 | 477 | |
| @@ -471,11 +498,17 @@ cargo clippy --workspace --tests -- -D warnings | ||
471 | 498 | # Format check |
472 | 499 | cargo fmt --check |
473 | 500 | |
501 | +# Supply chain security audit | |
502 | +cargo deny check | |
503 | + | |
474 | 504 | # Memory safety verification (requires nightly) |
475 | 505 | cargo miri test -p justapi-core |
476 | 506 | |
477 | 507 | # Python tests |
478 | 508 | cd crates/justapi-py && python -m pytest |
509 | + | |
510 | +# Python tests with uv | |
511 | +uv run pytest | |
479 | 512 | ``` |
480 | 513 | |
481 | 514 | ### Benchmarking |
| @@ -492,13 +525,15 @@ See [BENCHMARKS.md](BENCHMARKS.md) for full methodology, hardware specs, and his | ||
492 | 525 | |
493 | 526 | ## Deployment |
494 | 527 | |
495 | -### Docker | |
528 | +### Docker (uv-based) | |
496 | 529 | |
497 | 530 | ```bash |
498 | 531 | docker build -t justapi-app . |
499 | 532 | docker run -p 8000:8000 justapi-app |
500 | 533 | ``` |
501 | 534 | |
535 | +The multi-stage `Dockerfile` uses `uv` for fast, reproducible pip installs. | |
536 | + | |
502 | 537 | ### Docker Compose |
503 | 538 | |
504 | 539 | ```bash |
| @@ -536,6 +571,7 @@ Step-by-step deployment guides are available for: | ||
536 | 571 | | [**PLAN.md**](PLAN.md) | Living roadmap and current phase | |
537 | 572 | | [**ROADMAP.md**](ROADMAP.md) | Aspirational future work — explicitly *not yet built* | |
538 | 573 | | [**DECISIONS.md**](DECISIONS.md) | Architecture decision records | |
574 | +| [**PRODUCTION_PLAN.md**](PRODUCTION_PLAN.md) | 2.0.8 pre-release hardening plan | | |
539 | 575 | | [**AGENTS.md**](AGENTS.md) | Development rules and conventions | |
540 | 576 | |
541 | 577 | ## Contributing |
| @@ -554,6 +590,7 @@ git checkout -b feat/my-feature | ||
554 | 590 | cargo test --workspace |
555 | 591 | cargo clippy --workspace --tests -- -D warnings |
556 | 592 | cargo fmt --check |
593 | +cargo deny check | |
557 | 594 | |
558 | 595 | # Submit a PR |
559 | 596 | ``` |
560 | 597 | |
▼crates/justapi-py/README.md
+8-4
| @@ -7,9 +7,9 @@ network/protocol stack; Python executes only application logic. | ||
7 | 7 | |
8 | 8 | ## Project Status |
9 | 9 | |
10 | -**Phase 40 — The JustAPI 2.0 "Singularity" Release** (in progress) | |
10 | +**Phase 40 — The JustAPI 2.0 "Singularity" Release** (ready for publish) | |
11 | 11 | |
12 | -All 39 prior phases complete. See [PLAN.md](PLAN.md) for the full roadmap. | |
12 | +All 39 prior phases complete. CI/CD pipeline overhauled: uv-based builds, cargo-deny security audit, Miri memory safety, OIDC trusted publishing to PyPI. See [PLAN.md](PLAN.md) for the full roadmap. | |
13 | 13 | |
14 | 14 | ## Architecture |
15 | 15 | |
| @@ -46,7 +46,9 @@ app.run("127.0.0.1:8080") | ||
46 | 46 | Install the package: |
47 | 47 | |
48 | 48 | ```bash |
49 | -pip install justapi | |
49 | +pip install justapi # via pip | |
50 | +uv pip install justapi # via uv (recommended) | |
51 | +uvx justapi create my_app # no install needed | |
50 | 52 | ``` |
51 | 53 | |
52 | 54 | Or build from source with `maturin`: |
| @@ -93,6 +95,7 @@ justapi gen-client --lang python | ||
93 | 95 | | **Compression** | ✅ gzip/deflate/brotli/zstd | |
94 | 96 | | **Plugin System** | ✅ Third-party plugin API | |
95 | 97 | | **Memory Safety** | ✅ Miri-verified unsafe blocks, 6 fuzz targets | |
98 | +| **Supply Chain Security** | ✅ cargo-deny v0.20 — advisories, bans, licenses, sources | | |
96 | 99 | |
97 | 100 | ## Development |
98 | 101 | |
| @@ -106,9 +109,10 @@ justapi gen-client --lang python | ||
106 | 109 | ```bash |
107 | 110 | cargo build --workspace # debug build |
108 | 111 | cargo build --workspace --release # release build |
109 | -cargo test --workspace # run all tests (236+) | |
112 | +cargo test --workspace # run all tests (493+) | |
110 | 113 | cargo clippy --workspace --tests -- -D warnings # lint |
111 | 114 | cargo fmt --check # format check |
115 | +cargo deny check # supply chain security audit | |
112 | 116 | cargo miri test -p justapi-core # memory safety (nightly) |
113 | 117 | ``` |
114 | 118 | |
115 | 119 | |
▼docs_site/src/content/docs/contributing/coding-standards.md
+1-0
| @@ -69,6 +69,7 @@ All new public APIs require documentation (rustdoc or Python docstrings) before | ||
69 | 69 | - [ ] `cargo test --workspace` passes |
70 | 70 | - [ ] `cargo clippy --workspace --tests -- -D warnings` clean |
71 | 71 | - [ ] `cargo fmt --check` clean |
72 | +- [ ] `cargo deny check` clean (advisories, bans, licenses, sources) | |
72 | 73 | - [ ] `cargo miri test -p justapi-core` clean (if core touched) |
73 | 74 | - [ ] Benchmarks appended to BENCHMARKS.md (no p99 regression >5%) |
74 | 75 | - [ ] PLAN.md updated |
75 | 76 | |
▼docs_site/src/content/docs/contributing/development-setup.md
+12-1
| @@ -74,7 +74,9 @@ Recommended extensions: | ||
74 | 74 | - **pyright** or **pylance** — Python language support |
75 | 75 | - **maturin** — Python↔Rust integration |
76 | 76 | |
77 | -## Running Tests | |
77 | +## Pre-Submission Check Suite | |
78 | + | |
79 | +Run these before every PR: | |
78 | 80 | |
79 | 81 | ```bash |
80 | 82 | # Rust tests |
| @@ -83,9 +85,18 @@ cargo test --workspace | ||
83 | 85 | # Python tests |
84 | 86 | pytest |
85 | 87 | |
88 | +# Python tests with uv | |
89 | +uv run pytest | |
90 | + | |
86 | 91 | # Linting |
87 | 92 | cargo clippy --workspace --tests -- -D warnings |
88 | 93 | cargo fmt --check |
94 | + | |
95 | +# Supply chain security audit | |
96 | +cargo deny check | |
97 | + | |
98 | +# Memory safety (requires nightly Rust) | |
99 | +cargo +nightly miri test -p justapi-core | |
89 | 100 | ``` |
90 | 101 | |
91 | 102 | ## Next Steps |
92 | 103 | |
▼docs_site/src/content/docs/contributing/testing-guide.md
+8-5
| @@ -139,15 +139,18 @@ tests/ | ||
139 | 139 | |
140 | 140 | ## CI Testing |
141 | 141 | |
142 | -Every PR runs: | |
142 | +Every PR runs via `.github/workflows/wheels.yml`: | |
143 | 143 | |
144 | 144 | 1. `cargo test --workspace` |
145 | 145 | 2. `cargo clippy -- -D warnings` |
146 | 146 | 3. `cargo fmt --check` |
147 | -4. `cargo miri test -p justapi-core` | |
148 | -5. `pytest` (Python 3.12 + free-threaded 3.14t) | |
149 | -6. `cargo audit` | |
150 | -7. Fuzz tests (7 targets, 60s each) | |
147 | +4. `cargo deny check` (advisories, bans, licenses, sources) | |
148 | +5. `cargo miri test -p justapi-core` (nightly) | |
149 | +6. Build wheels for 6 targets (linux x86_64/aarch64, musl, macOS x86_64/aarch64, Windows x64) | |
150 | +7. `pytest` after wheel build (Python 3.12 + free-threaded 3.14t) | |
151 | +8. Publish to PyPI via OIDC trusted publishing (on tagged releases) | |
152 | + | |
153 | +On release, `.github/workflows/publish.yml` handles the standalone publish matrix. | |
151 | 154 | |
152 | 155 | ## See Also |
153 | 156 | |
154 | 157 | |
▼docs_site/src/content/docs/getting-started/installation.md
+9-4
| @@ -23,7 +23,7 @@ To install optional features (Pydantic v2, Jinja2, XML support): | ||
23 | 23 | pip install "justapi[full]" |
24 | 24 | ``` |
25 | 25 | |
26 | -## Install via uv | |
26 | +## Install via uv (recommended) | |
27 | 27 | |
28 | 28 | [uv](https://docs.astral.sh/uv/) is a fast Python package manager written in Rust. Install JustAPI with uv: |
29 | 29 | |
| @@ -55,7 +55,7 @@ This is ideal for CI pipelines, quick prototyping, and ephemeral environments. | ||
55 | 55 | |
56 | 56 | ```bash |
57 | 57 | python -c "import justapi; print(justapi.__version__)" |
58 | -# Output: 2.0.0 | |
58 | +# Output: 2.0.8 | |
59 | 59 | ``` |
60 | 60 | |
61 | 61 | ## Install CLI Tooling (`justapi-cli`) |
| @@ -68,7 +68,7 @@ cargo install justapi-cli | ||
68 | 68 | |
69 | 69 | # Verify |
70 | 70 | justapi --version |
71 | -# Output: justapi 2.0.0 | |
71 | +# Output: justapi 2.0.8 | |
72 | 72 | ``` |
73 | 73 | |
74 | 74 | ## Docker |
| @@ -79,7 +79,12 @@ Pull the official Docker image: | ||
79 | 79 | docker pull ghcr.io/justapi/justapi:latest |
80 | 80 | ``` |
81 | 81 | |
82 | -Or use the multi-stage `Dockerfile` in the repository root for custom builds. | |
82 | +Or build from the multi-stage `Dockerfile` in the repository root — the Dockerfile uses `uv` for fast, reproducible pip installs: | |
83 | + | |
84 | +```bash | |
85 | +docker build -t justapi-app . | |
86 | +docker run -p 8000:8000 justapi-app | |
87 | +``` | |
83 | 88 | |
84 | 89 | ## Build from Source |
85 | 90 | |
86 | 91 | |