Property-based testing — Hypothesis integration: strategy_for_input_model(), test_endpoint() in semblance.property_testing; generate inputs from input models, validate responses match output schema and optional invariants
PUT, PATCH, DELETE endpoint support
Optional response schema validation — SemblanceAPI(validate_responses=True) verifies generated responses conform to output model
Rate limiting simulation — rate_limit=N requests per second per endpoint (sliding window, 429 when exceeded)
Phase 6 — Stateful CRUD & Export ✓
Stateful PUT/PATCH/DELETE ✓ — When stateful=True, PUT upsert by path + id, PATCH update by id, DELETE remove by id; extend StatefulStore with get-by-id, update, remove so list GET and single-item GET/PUT/PATCH/DELETE use stored data
Export and CLI ✓ — Include PUT, PATCH, DELETE in export fixtures and OpenAPI example generation (minimal body/path params); _sample_request and schema iteration extended for put/patch/delete
OpenAPI polish ✓ — Document 429 response when rate_limit is set; optional response descriptions for simulated error codes (4xx/5xx)
Phase 7 — Developer Experience & Extensibility ✓
Built-in request links ✓ — FromHeader(name), FromCookie(name) for binding output fields to request headers/cookies (with register_link-style resolution)
Config file ✓ — Optional defaults from [tool.semblance] in pyproject.toml or semblance.yaml (e.g. seed, validate_responses, stateful) via SemblanceAPI(config_path=...) or SemblanceAPI.from_config()
Pytest plugin ✓ — Markers @pytest.mark.semblance(app="module:attr") and @pytest.mark.semblance_property_tests(app="..."); fixtures semblance_api, semblance_client; parametrized property tests per endpoint
Reproducible failures ✓ — On Hypothesis failure in test_endpoint, error message includes "Reproduce with curl:" and "Or Python:" snippets
Mount and middleware ✓ — api.mount_into(parent_app, path_prefix); api.add_middleware(MiddlewareClass, **kwargs) applied in as_fastapi()