diff --git a/.env.example b/.env.example index 11a55cf..8be1548 100644 --- a/.env.example +++ b/.env.example @@ -46,6 +46,8 @@ KEYNETRA_RATE_LIMIT_WINDOW_SECONDS=60 KEYNETRA_SERVICE_MODE=all KEYNETRA_AUTO_SEED_SAMPLE_DATA=true KEYNETRA_OTEL_ENABLED=false +# Enforce explicit tenant resolution (no implicit fallback) +KEYNETRA_STRICT_TENANCY=false # Server defaults for CLI config mode KEYNETRA_SERVER_HOST=0.0.0.0 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc8ce77..8cc8b0e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: CI +name: CI Pipeline on: push: @@ -8,51 +8,197 @@ on: permissions: contents: read +env: + PYTHONUNBUFFERED: "1" + KEYNETRA_DATABASE_URL: sqlite+pysqlite:///./.keynetra-ci.db + KEYNETRA_API_KEYS: testkey + KEYNETRA_RATE_LIMIT_PER_MINUTE: "5000" + KEYNETRA_RATE_LIMIT_BURST: "5000" + jobs: + + # ------------------------------- + # Stage 1: Security Scan + # ------------------------------- + secret-scan: + name: ๐ Secret Scan (Gitleaks) + runs-on: ubuntu-latest + + steps: + - name: ๐ฅ Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: ๐ Run Gitleaks + run: | + docker run --rm \ + -v ${{ github.workspace }}:/repo \ + ghcr.io/gitleaks/gitleaks:latest \ + detect --source /repo --verbose --exit-code 1 + + + # ------------------------------- + # Stage 2: Lint & Static Checks + # ------------------------------- + lint: + name: ๐งน Lint & Formatting + runs-on: ubuntu-latest + needs: secret-scan + + steps: + - name: ๐ฅ Checkout repository + uses: actions/checkout@v4 + + - name: ๐ Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + + - name: ๐ฆ Install dependencies + run: | + pip install -r requirements.lock + pip install -r requirements-dev.lock + + - name: ๐งช Run linters + run: | + ruff check . + black --check . + isort --check-only . + lint-imports --config .importlinter + + + # ------------------------------- + # Stage 3: Security Dependencies + # ------------------------------- + security-deps: + name: ๐ก Dependency Security Scan + runs-on: ubuntu-latest + needs: lint + + steps: + - name: ๐ฅ Checkout repository + uses: actions/checkout@v4 + + - name: ๐ Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + + - name: ๐ฆ Install dependencies + run: | + pip install -r requirements.lock + pip install pip-audit + + - name: ๐ Run pip-audit + run: | + pip-audit + mkdir -p artifacts + pip-audit -f cyclonedx-json -o artifacts/sbom.cdx.json + + - name: ๐ค Upload SBOM + uses: actions/upload-artifact@v4 + with: + name: sbom + path: artifacts/sbom.cdx.json + + + # ------------------------------- + # Stage 4: Tests (Matrix) + # ------------------------------- test: name: CI / test (${{ matrix.python-version }}) runs-on: ubuntu-latest + needs: security-deps strategy: - fail-fast: false + fail-fast: true matrix: python-version: ["3.11", "3.12", "3.13", "3.14"] - env: - KEYNETRA_DATABASE_URL: sqlite+pysqlite:///./.keynetra-ci.db - KEYNETRA_API_KEYS: testkey - PYTHONUNBUFFERED: "1" - steps: - - name: Checkout repository + - name: ๐ฅ Checkout repository uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} + - name: ๐ Setup Python uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - cache: "pip" + cache: pip - - name: Install dependencies + - name: ๐ฆ Install dependencies run: | - python -m pip install --upgrade pip - python -m pip install -r requirements.txt - python -m pip install -r requirements-dev.txt - python -m pip install -e . + pip install --upgrade pip + pip install -r requirements.lock + pip install -r requirements-dev.lock + pip install -e . + + if [ -d ./keynetra-client-python ]; then + pip install -e ./keynetra-client-python + fi - - name: Lint + - name: ๐ OpenAPI drift check + run: keynetra check-openapi + + - name: ๐ Migration check + run: keynetra migrate --confirm-destructive + + - name: ๐งช Run tests with coverage run: | - ruff check . - black --check . - isort --check-only . + pytest -q \ + --cov=keynetra \ + --cov-fail-under=80 \ + --cov-report=term \ + --cov-report=json + + if [ -d ./keynetra-client-python/tests ]; then + pytest -q keynetra-client-python/tests + fi + + python scripts/check_coverage.py + + + # ------------------------------- + # Stage 5: Load Test + # ------------------------------- + load-test: + name: ๐ฆ Load Smoke Test + runs-on: ubuntu-latest + needs: test + + steps: + - name: ๐ฅ Checkout repository + uses: actions/checkout@v4 + + - name: ๐ Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip - - name: Migration check - env: - PYTHONPATH: ${{ github.workspace }} - run: python -m keynetra.cli migrate --confirm-destructive + - name: ๐ฆ Install dependencies + run: | + pip install -r requirements.lock + pip install locust uvicorn + + - name: ๐ Start API + run: | + python -m uvicorn keynetra.api.main:app --host 127.0.0.1 --port 8000 & + sleep 3 - - name: Tests and coverage - env: - PYTHONPATH: ${{ github.workspace }} + - name: โก Run Locust run: | - python -m pytest -q --cov=keynetra --cov-fail-under=80 \ No newline at end of file + locust \ + -f locustfile.py \ + --host http://127.0.0.1:8000 \ + --headless \ + -u 10 \ + -r 2 \ + -t 20s \ + --csv /tmp/locust \ + --only-summary + + - name: ๐ Validate load budget + run: python scripts/check_load_budget.py diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d09a355..2bc5214 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Release +name: ๐ Release on: push: @@ -7,36 +7,67 @@ on: permissions: contents: write + packages: write jobs: release: + name: ๐ฆ Python Release runs-on: ubuntu-latest env: KEYNETRA_DATABASE_URL: sqlite+pysqlite:///./.keynetra-release.db KEYNETRA_API_KEYS: testkey PYTHONUNBUFFERED: "1" steps: - - name: Checkout repository + - name: ๐ฅ Checkout repository uses: actions/checkout@v4 + with: + fetch-depth: 0 - - name: Set up Python 3.11 + - name: ๐ Set up Python 3.11 uses: actions/setup-python@v5 with: python-version: "3.11" + cache: "pip" - - name: Install dependencies + - name: ๐ฆ Install dependencies run: | python -m pip install --upgrade pip python -m pip install -r requirements.txt python -m pip install -r requirements-dev.txt + python -m pip install build twine + + - name: ๐ Lint & Security + run: | + ruff check . + black --check . + pip-audit + safety check + + - name: โ Run tests & coverage + run: | + pytest -q \ + --cov=keynetra \ + --cov-fail-under=85 \ + --cov-report=term \ + --cov-report=json:coverage.json - - name: Build Python package - run: python -m build + - name: ๐ Coverage Summary + if: always() + run: | + echo "## ๐ Test Coverage" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + if [ -f coverage.json ]; then + cat coverage.json >> $GITHUB_STEP_SUMMARY + else + echo "No coverage.json found" >> $GITHUB_STEP_SUMMARY + fi - - name: Run tests - run: pytest -q --cov=keynetra --cov-fail-under=80 + - name: ๐๏ธ Build Python package + run: | + python -m build + twine check dist/* - - name: Attach release artifacts + - name: ๐ค Upload release artifacts uses: actions/upload-artifact@v4 with: name: keynetra-release-artifacts @@ -44,14 +75,101 @@ jobs: dist/*.tar.gz dist/*.whl - - name: Publish GitHub release + - name: ๐ Publish GitHub release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} uses: softprops/action-gh-release@v2 with: name: KeyNetra ${{ github.ref_name }} body: | - Initial public release of the KeyNetra authorization engine. + # KeyNetra ${{ github.ref_name }} + + ๐ **New release of the KeyNetra authorization engine!** - Includes support for RBAC, ABAC, ACL, and ReBAC with a compiled authorization engine, distributed caching, policy simulation, impact analysis, and observability. + ## โจ Features + - RBAC, ABAC, ACL, ReBAC support + - Compiled authorization engine + - Distributed caching + - Policy simulation & impact analysis + - Full observability + + ## ๐ฆ Artifacts + - Python wheel & sdist + - Docker images (below) + + **Changelog:** [See commits](https://github.com/keynetra/keynetra/compare/${{ github.ref_previous }}...${{ github.ref }}) files: | dist/*.tar.gz dist/*.whl + generate_release_notes: true + + docker: + name: ๐ณ Docker Multi-Platform + runs-on: ubuntu-latest + needs: release + permissions: + contents: read + packages: write + strategy: + matrix: + platform: [linux/amd64, linux/arm64] + steps: + - name: ๐ฅ Checkout repo + uses: actions/checkout@v4 + + - name: ๐ Set up Python (for build) + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: ๐ฆ Install build deps + run: | + python -m pip install -r requirements.txt + + - name: โ๏ธ Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: ๐ Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: ๐ Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: ๐ Extract metadata + id: meta + uses: docker/metadata-action@v6 + with: + images: | + keynetra/keynetra + ghcr.io/${{ github.repository }}/keynetra + tags: | + type=ref,event=tag + type=sha,prefix={{branch}}- + + - name: ๐ณ Build & Push Multi-Platform + uses: docker/build-push-action@v6 + with: + context: . + platforms: ${{ matrix.platform }} + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: ๐ Docker Summary + if: always() + run: | + echo "## ๐ณ Docker Images Published" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Registry | Tags | Platforms |" >> $GITHUB_STEP_SUMMARY + echo "|----------|------|-----------|" >> $GITHUB_STEP_SUMMARY + echo "| Docker Hub | \`${{ steps.meta.outputs.tags }}\` | ${{ matrix.platform }} |" >> $GITHUB_STEP_SUMMARY + echo "| GHCR | \`${{ steps.meta.outputs.tags }}\` | ${{ matrix.platform }} |" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/.gitignore b/.gitignore index cf73dc8..32069b4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,69 @@ +# Python bytecode and caches __pycache__/ -*.pyc -.env -.venv -.vscode -.idea -dist/ +*.py[cod] +*$py.class + +# Build and packaging artifacts build/ +dist/ +site/ +*.egg-info/ +.eggs/ +pip-wheel-metadata/ + +# Virtual environments +.venv/ +venv/ +env/ +ENV/ + +# Test/coverage/type/lint caches .coverage +.coverage.* +coverage.xml htmlcov/ .pytest_cache/ -node_modules/ -.ruff_cache/ .mypy_cache/ +.ruff_cache/ +.import_linter_cache/ +.tox/ +.nox/ +coverage/ + +# Local environment files +.env +.env.local + +# Logs and temp files +*.log +*.tmp +*.swp + +# Local databases *.db *.sqlite *.sqlite3 + +# Terraform state and overrides +.terraform/ +*.tfstate +*.tfstate.* +override.tf +override.tf.json +*_override.tf +*_override.tf.json +.terraform.lock.hcl + +# Editor/IDE settings +.vscode/ +.idea/ + +# OS artifacts .DS_Store -docs-site \ No newline at end of file +Thumbs.db + +# JS/build cache +node_modules/ + +# Project-specific +docs-site diff --git a/.importlinter b/.importlinter new file mode 100644 index 0000000..23608da --- /dev/null +++ b/.importlinter @@ -0,0 +1,53 @@ +[importlinter] +root_package = keynetra + +[importlinter:contract:services-no-api] +name = Services must not import API layer +type = forbidden +source_modules = + keynetra.services +forbidden_modules = + keynetra.api + +[importlinter:contract:engine-no-runtime-layers] +name = Engine must not import API, services, or infrastructure +type = forbidden +source_modules = + keynetra.engine +forbidden_modules = + keynetra.api + keynetra.services + keynetra.infrastructure + +[importlinter:contract:infrastructure-no-api-or-services] +name = Infrastructure must not import API +type = forbidden +source_modules = + keynetra.infrastructure +forbidden_modules = + keynetra.api + +[importlinter:contract:domain-no-infra] +name = Domain must not import infrastructure +type = forbidden +source_modules = + keynetra.domain +forbidden_modules = + keynetra.infrastructure + +[importlinter:contract:domain-no-api-services] +name = Domain must not import API or services +type = forbidden +source_modules = + keynetra.domain +forbidden_modules = + keynetra.api + keynetra.services + +[importlinter:contract:config-no-api-routes] +name = Config must not import API routes +type = forbidden +source_modules = + keynetra.config +forbidden_modules = + keynetra.api.routes diff --git a/.safety-policy.yml b/.safety-policy.yml new file mode 100644 index 0000000..fbdbca4 --- /dev/null +++ b/.safety-policy.yml @@ -0,0 +1,5 @@ +ignore-vulnerabilities: + 64459: + reason: "Side-channel vulnerability in ecdsa not exploitable in this project" + 64396: + reason: "ecdsa library limitation; project does not use ECDSA private key operations" diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..6f2125f --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,31 @@ +# Code of Conduct + +## Our Commitment + +KeyNetra contributors are committed to a respectful, harassment-free environment for everyone, regardless of age, body size, disability, ethnicity, identity, experience level, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Expected Behavior + +- Be respectful and constructive. +- Assume good intent and ask clarifying questions before escalating. +- Focus feedback on code, design, and behavior, not people. +- Help new contributors onboard with clear guidance. + +## Unacceptable Behavior + +- Harassment, intimidation, or discriminatory language. +- Personal attacks, trolling, or sustained disruption. +- Sharing private information without explicit permission. +- Any conduct that is inappropriate in a professional open-source setting. + +## Enforcement + +Project maintainers are responsible for clarifying and enforcing standards. They may remove, edit, or reject contributions, comments, or issues that violate this code of conduct. + +## Reporting + +Report incidents privately to the maintainers through a security/contact channel listed in [SECURITY.md](./SECURITY.md). Reports will be reviewed promptly and handled confidentially. + +## Scope + +This code of conduct applies in all project spaces, including issues, pull requests, discussions, and community channels. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b93685a..8e90098 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,7 +15,7 @@ export KEYNETRA_API_KEYS=devkey Start the API locally: ```bash -python -m keynetra.cli serve +keynetra serve ``` ## Run tests diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..144958a --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,85 @@ +# Deployment Guide + +This guide documents supported deployment paths for KeyNetra v0.1.0-beta. + +## Prerequisites + +- Python 3.11+ +- Container runtime (Docker or compatible) +- PostgreSQL 16+ (recommended for production) +- Redis 7+ (recommended for distributed cache invalidation) + +## Environment Variables + +Minimum required variables: + +- `KEYNETRA_DATABASE_URL` +- `KEYNETRA_API_KEYS` or `KEYNETRA_API_KEY_HASHES` +- `KEYNETRA_JWT_SECRET` +- `KEYNETRA_STRICT_TENANCY=true` (recommended for multi-tenant production) + +Optional: + +- `KEYNETRA_REDIS_URL` +- `KEYNETRA_RATE_LIMIT_PER_MINUTE` +- `KEYNETRA_RATE_LIMIT_BURST` +- `KEYNETRA_RUN_MIGRATIONS` +- `KEYNETRA_AUTO_SEED_SAMPLE_DATA` + +See [.env.example](./.env.example) for a complete list. + +## Docker (Single Container) + +```bash +docker build -t keynetra:test . +docker run --rm -p 8080:8080 --env-file .env keynetra:test +``` + +Health and observability endpoints: + +- `GET http://localhost:8080/health` +- `GET http://localhost:8080/docs` +- `GET http://localhost:8080/metrics` + +## Docker Compose (Full Stack) + +```bash +docker compose up --build +``` + +Services: + +- KeyNetra API +- PostgreSQL +- Redis +- Prometheus +- Grafana +- node-exporter +- Loki + +## Kubernetes Manifests + +```bash +kubectl apply -f deploy/kubernetes/ +``` + +Included resources: + +- `deployment.yaml` +- `service.yaml` +- `configmap.yaml` +- `secret.yaml` +- `ingress.yaml` +- `hpa.yaml` + +## Helm + +```bash +helm install keynetra ./deploy/helm/keynetra +``` + +Render-only validation: + +```bash +helm template keynetra deploy/helm/keynetra +``` diff --git a/Dockerfile b/Dockerfile index 499cf05..c065d5a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,14 +15,16 @@ RUN pip install --no-cache-dir -r /app/requirements.txt COPY alembic.ini /app/alembic.ini COPY alembic /app/alembic COPY keynetra /app/keynetra -COPY infra/docker/start.sh /usr/local/bin/start-keynetra - -RUN chmod +x /usr/local/bin/start-keynetra && chown -R appuser:appuser /app +COPY contracts /app/contracts +COPY pyproject.toml /app/pyproject.toml +COPY README.md /app/README.md +RUN pip install --no-cache-dir /app +RUN chown -R appuser:appuser /app USER appuser -EXPOSE 8000 +EXPOSE 8080 HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=5 \ - CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health/ready', timeout=3)" + CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/health/ready', timeout=3)" -ENTRYPOINT ["start-keynetra"] +CMD ["keynetra", "serve", "--host", "0.0.0.0", "--port", "8080"] diff --git a/GOVERNANCE.md b/GOVERNANCE.md new file mode 100644 index 0000000..d934a57 --- /dev/null +++ b/GOVERNANCE.md @@ -0,0 +1,20 @@ +# Governance + +## Maintainers +- Core maintainers are responsible for release management, security triage, and architectural direction. +- Repository write access is restricted to maintainers and trusted release engineers. + +## Decision Process +- API and schema changes require a documented rationale in pull requests. +- Breaking changes require a deprecation window and changelog migration notes. +- Security-sensitive changes require at least one maintainer security review. + +## Release Cadence +- Patch releases: weekly or as needed for security/bug fixes. +- Minor releases: every 4-6 weeks. +- Emergency security releases: out-of-band. + +## Contribution Workflow +- Fork + pull request workflow. +- CI must be green (tests, lint, typing, security scans, contract checks). +- At least one maintainer approval required before merge. diff --git a/Makefile b/Makefile index 73e3a43..0840193 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,14 @@ PYTHON ?= python3.11 +VENV ?= .venv -.PHONY: install test lint format migrate run +.PHONY: install test lint format migrate run bootstrap smoke install: - $(PYTHON) -m pip install -r requirements.txt -r requirements-dev.txt + @if [ -f requirements.lock ] && [ -f requirements-dev.lock ]; then \ + $(PYTHON) -m pip install -r requirements-dev.lock; \ + else \ + $(PYTHON) -m pip install -r requirements.txt -r requirements-dev.txt; \ + fi test: $(PYTHON) -m pytest -q @@ -12,13 +17,31 @@ lint: $(PYTHON) -m ruff check . $(PYTHON) -m black --check . $(PYTHON) -m isort --check-only . + lint-imports --config .importlinter format: $(PYTHON) -m black . $(PYTHON) -m isort . migrate: - $(PYTHON) -m keynetra.cli migrate --confirm-destructive + keynetra migrate --confirm-destructive run: $(PYTHON) -m uvicorn keynetra.api.main:app --host 0.0.0.0 --port 8000 + +bootstrap: + $(PYTHON) -m venv $(VENV) + $(VENV)/bin/python -m pip install --upgrade pip + @if [ -f requirements.lock ] && [ -f requirements-dev.lock ]; then \ + $(VENV)/bin/python -m pip install -r requirements-dev.lock; \ + else \ + $(VENV)/bin/python -m pip install -r requirements.txt -r requirements-dev.txt; \ + fi + $(VENV)/bin/python -m pip install -e . + @if [ ! -f .env ]; then cp .env.example .env; fi + $(VENV)/bin/keynetra migrate --confirm-destructive + $(VENV)/bin/keynetra config doctor + $(VENV)/bin/python -m pytest -q tests/test_api_contract.py tests/test_compiled_policies.py + +smoke: + $(PYTHON) -m pytest -q tests/test_api_contract.py tests/test_compiled_policies.py tests/test_doctor.py diff --git a/README.md b/README.md index 98e040e..ce0196e 100644 --- a/README.md +++ b/README.md @@ -1,385 +1,238 @@ +
+
+
+
+
- Policy-driven authorization and access control engine for modern applications. -
+# KeyNetra + +Policy-driven authorization control plane for applications that need deterministic, explainable access decisions across RBAC, ACL, and ReBAC. + +## What KeyNetra Provides + +- Authorization engine with deterministic evaluation and explain traces +- FastAPI API server and operational CLI +- Multi-tenant policy evaluation with strict tenancy controls +- Policy lifecycle operations (validation, compile, simulation, impact analysis) +- Caching and access indexing for low-latency checks +- Structured logging, metrics, and dashboard-ready monitoring +- Deployment assets for Docker, Kubernetes, and Helm + +## Architecture -KeyNetra is an open-source authorization core built for teams that need Stripe/Keycloak/Casbin-level operational clarity while keeping architecture and deployment under their control. - -## Why KeyNetra - -- Deterministic evaluation pipeline with explain traces. -- Multiple authorization models in one runtime: - - RBAC - - ACL - - ReBAC - - schema-permission checks - - compiled policy graph evaluation -- Headless-first operation: - - HTTP API - - CLI - - embedded Python engine -- Production-focused defaults: - - migrations - - cache layers - - observability metrics - - Docker/Kubernetes deployment assets - -## Table Of Contents - -- [Quick Start](#quick-start) -- [Core Capabilities](#core-capabilities) -- [Usage Modes](#usage-modes) -- [Architecture](#architecture) -- [API Surface](#api-surface) -- [Configuration](#configuration) -- [Security](#security) -- [Caching and Consistency](#caching-and-consistency) -- [Observability](#observability) -- [Deployment](#deployment) -- [Development](#development) -- [Documentation](#documentation) -- [Release and Compatibility](#release-and-compatibility) -- [Citation](#citation) -- [Contributing](#contributing) -- [License](#license) - -## Quick Start - -### 1) Install +Layering is enforced through import contracts: + +- `keynetra.api` -> transport only +- `keynetra.services` -> orchestration and runtime flow +- `keynetra.engine` -> pure policy decision logic +- `keynetra.domain` -> shared models/schemas +- `keynetra.infrastructure` -> repositories, storage, cache adapters +- `keynetra.config` -> configuration loading and guardrails + +Detailed architecture notes: [`ARCHITECTURE.md`](./ARCHITECTURE.md) + +## Quick Start (Local) + +### 1) Setup ```bash python3.11 -m venv .venv source .venv/bin/activate +pip install --upgrade pip pip install -r requirements.txt -r requirements-dev.txt +pip install -e . cp .env.example .env ``` -### 2) Start API +### 2) Run API ```bash -python -m keynetra.cli serve --config examples/keynetra.yaml +keynetra serve --host 0.0.0.0 --port 8080 ``` -### 3) Verify health +### 3) Health and Docs ```bash -curl -i http://localhost:8000/health/ready +curl -i http://localhost:8080/health/ready +open http://localhost:8080/docs ``` -### 4) Run first authorization check +### 4) First Authorization Check ```bash -curl -s -X POST http://localhost:8000/check-access \ +curl -s -X POST http://localhost:8080/check-access \ -H "Content-Type: application/json" \ -H "X-API-Key: devkey" \ + -H "X-Tenant-Id: acme" \ -d '{ - "user": {"id": 1, "role": "manager"}, - "action": "approve_payment", - "resource": {"amount": 5000}, + "user": {"id": "u1", "role": "admin"}, + "action": "read", + "resource": {"resource_type": "document", "resource_id": "doc-1"}, "context": {} }' ``` -## Core Capabilities - -| Capability | Details | -| --- | --- | -| RBAC | Roles, permissions, role-permission bindings | -| ACL | Subject/resource/action-level allow/deny | -| ReBAC | Relationship tuples and index-assisted checks | -| Compiled policy graph | Deterministic policy evaluation stage | -| Auth modeling | Schema parser + validator + compiler | -| Simulation | `/simulate-policy` and `/impact-analysis` | -| Cache layers | Policy, decision, relationship, ACL, access index | -| Observability | Prometheus metrics + structured logs | -| Runtime modes | API, CLI, embedded Python | +## CLI Usage -## Usage Modes - -### API Server Mode +Entrypoint is standardized to `keynetra`: ```bash -python -m keynetra.cli serve --config examples/keynetra.yaml +keynetra --help +keynetra check-openapi +keynetra migrate --confirm-destructive +keynetra doctor --service core ``` -### CLI Mode +## API Surface (Core) -```bash -python -m keynetra.cli help-cli -python -m keynetra.cli check --config examples/keynetra.yaml --api-key devkey --action read --user '{"id":"u1"}' --resource '{"resource_type":"document","resource_id":"doc-1"}' -python -m keynetra.cli compile-policies --config examples/keynetra.yaml -python -m keynetra.cli doctor --service core --config examples/keynetra.yaml -``` +- `POST /check-access` +- `POST /check-access-batch` +- `POST /simulate` +- `POST /simulate-policy` +- `POST /impact-analysis` +- `GET /health`, `GET /health/ready`, `GET /metrics` -### Embedded Python Mode +OpenAPI contracts: -```python -from keynetra import KeyNetra +- [`contracts/openapi/openapi.json`](./contracts/openapi/openapi.json) +- [`contracts/openapi/keynetra-v0.1.0.yaml`](./contracts/openapi/keynetra-v0.1.0.yaml) -engine = KeyNetra.from_config("examples/keynetra.yaml") -engine.load_policies("examples/policies") -engine.load_model("examples/auth-model.yaml") +## Multi-Tenant and Security -decision = engine.check_access( - subject="user:1", - action="read", - resource="document:abc", - context={}, -) -print(decision.allowed) -``` +- Tenant-aware request flow and storage isolation +- Strict tenancy mode available via `KEYNETRA_STRICT_TENANCY=true` +- API key and JWT auth support +- Admin auth flow for privileged operations +- Rate limiting and request correlation IDs -### Pure Engine Import +See [`SECURITY.md`](./SECURITY.md) for security policy and reporting. -```python -from keynetra.engine import KeyNetraEngine +## Observability and Monitoring -engine = KeyNetraEngine( - [{"action": "read", "effect": "allow", "priority": 1, "conditions": {}}] -) -decision = engine.check_access( - subject="user:123", - action="read", - resource="document:abc", - context={}, -) -print(decision.allowed) -``` +KeyNetra exposes Prometheus metrics at `GET /metrics` including: -## Architecture +- HTTP request count/latency/error metrics +- Authorization decision and stage latency metrics +- Cache hit/miss metrics +- DB query latency metrics +- Tenant activity dimensions -Layered boundaries: +Monitoring assets: -- `keynetra/engine`: deterministic decision logic only -- `keynetra/services`: orchestration, hydration, consistency handling -- `keynetra/infrastructure`: DB/cache/repository side effects -- `keynetra/api`: transport, middleware, and route wiring +- Prometheus config: [`monitoring/prometheus/prometheus.yml`](./monitoring/prometheus/prometheus.yml) +- Grafana dashboard: [`monitoring/grafana/dashboards/keynetra-overview.json`](./monitoring/grafana/dashboards/keynetra-overview.json) +- Grafana provisioning: [`monitoring/grafana/provisioning`](./monitoring/grafana/provisioning) -```mermaid -flowchart LR - A[Request] --> B[AuthorizationService] - B --> C[KeyNetraEngine] - C --> D[Decision + Explain Trace] - B --> E[(Decision Cache)] - B --> F[(Audit Log)] -``` +## Deployment -Engine evaluation order: - -1. direct user permissions -2. ACL checks -3. RBAC role permissions -4. relationship index checks -5. schema permission checks -6. compiled policy graph checks -7. default deny - -## API Surface - -OpenAPI contract: [`contracts/openapi/keynetra-v0.1.0.yaml`](./contracts/openapi/keynetra-v0.1.0.yaml) - -Key endpoints: - -- Decisions: - - `POST /check-access` - - `POST /check-access-batch` - - `POST /simulate` -- Modeling: - - `POST /auth-model` - - `GET /auth-model` -- ACL: - - `POST /acl` - - `GET /acl/{resource_type}/{resource_id}` - - `DELETE /acl/{acl_id}` -- Simulation: - - `POST /simulate-policy` - - `POST /impact-analysis` -- Health and metrics: - - `GET /health` - - `GET /health/live` - - `GET /health/ready` - - `GET /metrics` -- Admin auth: - - `POST /admin/login` - -## Configuration - -KeyNetra supports YAML, JSON, and TOML config files: +### Docker ```bash -python -m keynetra.cli serve --config examples/keynetra.yaml +docker build -t keynetra:test . +docker run --rm -p 8080:8080 --env-file .env keynetra:test ``` -Example (`examples/keynetra.yaml`): - -```yaml -database: - url: sqlite+pysqlite:///./keynetra.db - -redis: - url: redis://localhost:6379/0 - -policies: - path: ./examples/policies - -models: - path: ./examples/auth-model.yaml +### Docker Compose (Full Dev/Obs Stack) -seed_data: true - -server: - host: 0.0.0.0 - port: 8080 +```bash +docker compose up --build ``` -Policy/model file support: - -- policies: `.yaml`, `.json`, `.polar` -- auth models: `.yaml`, `.json`, `.toml` (plus raw schema/text) - -## Security +Includes: -- API key auth (`X-API-Key`) -- JWT bearer auth -- admin login endpoint (`/admin/login`) -- management role enforcement (`viewer`, `developer`, `admin`) -- idempotency middleware for write safety -- API version negotiation (`X-API-Version`) - -For disclosure policy, see [`SECURITY.md`](./SECURITY.md). - -## Caching and Consistency - -Cache layers: - -- policy cache -- decision cache -- relationship cache -- ACL cache -- access-index cache - -Distribution and invalidation: - -- Redis backend with in-memory fallback -- namespace bump invalidation strategy -- policy distribution via Redis Pub/Sub - -## Observability - -- Prometheus metrics at `GET /metrics` -- structured logging (JSON) and rich colored logs -- explain traces and audit records for decision transparency - -Docker monitoring stack includes: - -- Prometheus: `http://localhost:9090` -- Grafana: `http://localhost:3000` - -## Deployment +- KeyNetra API +- PostgreSQL +- Redis +- Prometheus +- Grafana +- node-exporter +- Loki -### Docker Compose (default) +### Kubernetes ```bash -docker compose up --build +kubectl apply -f deploy/kubernetes/ ``` -### Docker Compose (development) +### Helm ```bash -docker compose -f docker-compose.dev.yml up --build +helm install keynetra ./deploy/helm/keynetra ``` -Services included in stack: +More deployment detail: [`DEPLOYMENT.md`](./DEPLOYMENT.md) -- KeyNetra API -- PostgreSQL -- Redis -- Prometheus -- Grafana +## SDKs -Kubernetes baseline: +SDKs are maintained separately from this engine repository. -- Helm chart at `infra/k8s/helm/keynetra` +- Python SDK package: `keynetra-client` +- SDK guide: [`SDK_GUIDE.md`](./SDK_GUIDE.md) -## Development +Example (Python SDK): -```bash -make install -make lint -make test -make migrate -make run +```python +from keynetra_client import KeyNetraClient + +client = KeyNetraClient("http://localhost:8080") +decision = client.check_access( + user={"id": "alice"}, + action="read", + resource={"type": "document", "id": "doc-1"}, +) +print(decision.allowed) ``` -Policy and diagnostics: +## Developer Workflow ```bash -python -m keynetra.cli test-policy examples/policy_tests.yaml -python -m keynetra.cli explain --user u1 --resource r1 --action read -python -m keynetra.cli benchmark --api-key devkey +ruff check . +black --check . +pytest +lint-imports --config .importlinter ``` -## Documentation +Convenience commands are available in [`Makefile`](./Makefile). -- docs index: [`docs/README.md`](./docs/README.md) -- architecture notes: [`architecture.md`](./architecture.md) -- Docusaurus site app: [`docs-site/`](./docs-site/) -- sidebar config: [`docs-site/sidebars.ts`](./docs-site/sidebars.ts) -- Docusaurus config: [`docs-site/docusaurus.config.ts`](./docs-site/docusaurus.config.ts) +## Documentation Index -## Release and Compatibility +- [`ARCHITECTURE.md`](./ARCHITECTURE.md) +- [`DEPLOYMENT.md`](./DEPLOYMENT.md) +- [`SDK_GUIDE.md`](./SDK_GUIDE.md) +- [`CONTRIBUTING.md`](./CONTRIBUTING.md) +- [`CODE_OF_CONDUCT.md`](./CODE_OF_CONDUCT.md) +- [`SECURITY.md`](./SECURITY.md) +- [`CHANGELOG.md`](./CHANGELOG.md) +- [`docs/README.md`](./docs/README.md) -Current version: `0.1.0` +## Contributing -- package version: [`pyproject.toml`](./pyproject.toml) -- runtime version: [`keynetra/version.py`](./keynetra/version.py) -- release notes: [`CHANGELOG.md`](./CHANGELOG.md) +Contributions are welcome. Start with [`CONTRIBUTING.md`](./CONTRIBUTING.md) and [`CODE_OF_CONDUCT.md`](./CODE_OF_CONDUCT.md). -Compatibility: +## License -- Python `3.11+` -- DB: PostgreSQL, SQLite -- Cache: Redis optional -- Deployment: Docker Compose, Helm baseline +Apache-2.0. See [`LICENSE`](./LICENSE). ## Citation ```bibtex -@software{keynetra_v0_1_0, - title = {KeyNetra: Policy-driven Authorization and Access Control Engine}, +@software{keynetra_2026, + title = {KeyNetra}, author = {KeyNetra Community}, year = {2026}, - version = {0.1.0}, - url = {https://github.com/keynetra/keynetra-core} + version = {0.1.0-beta}, + url = {https://github.com/keynetra/keynetra} } ``` - -## Contributing - -Contributions are welcome. - -- contribution guide: [`CONTRIBUTING.md`](./CONTRIBUTING.md) -- security policy: [`SECURITY.md`](./SECURITY.md) - -## License - -Apache License 2.0. See [`LICENSE`](./LICENSE). - ---- - -- Made with love for the KeyNetra Community. -
+Made with love โค๏ธ for KeyNetra Community.
\ No newline at end of file diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..dc3dfec --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,16 @@ +# Roadmap + +## 2026 H1 +- Harden production defaults and configuration safety checks. +- Expand CI quality gates: typing, security scans, contract drift, load smoke budgets. +- Introduce policy lifecycle states (`draft`, `active`, `archived`) with canary evaluation. + +## 2026 H2 +- Add first-class OpenFGA and OPA/Rego adapters. +- Publish Terraform provider for policy resources. +- Expand async data-path options for higher-concurrency deployments. + +## Backlog +- Deeper mutation testing strategy for policy/rule evaluation. +- Per-tenant async worker model and queue-based authorization batch processing. +- Additional policy authoring UX and governance tooling. diff --git a/SDK_GUIDE.md b/SDK_GUIDE.md new file mode 100644 index 0000000..a4f65e9 --- /dev/null +++ b/SDK_GUIDE.md @@ -0,0 +1,44 @@ +# SDK Guide + +KeyNetra SDKs are versioned independently from the core engine. + +## Repository Scope + +This repository contains the authorization engine, API server, CLI, and deployment assets. + +SDK implementations are maintained in separate repositories and released on their own cadence. + +## Python SDK + +- Package: `keynetra-client` +- Install: `pip install keynetra-client` + +Basic usage: + +```python +from keynetra_client import KeyNetraClient + +client = KeyNetraClient("http://localhost:8080") +decision = client.check_access( + user={"id": "alice"}, + action="read", + resource={"type": "document", "id": "doc-1"}, +) +print(decision.allowed) +``` + +## API Contract Compatibility + +- Server OpenAPI contract: `contracts/openapi/openapi.json` +- Validate API consistency from this repository: + +```bash +keynetra check-openapi +``` + +## Planned SDKs + +- Python +- TypeScript +- Go +- Java diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 0000000..c683a86 --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,18 @@ +# Support + +## Triage SLA +- Security reports: acknowledge within 24 hours. +- Bug reports: acknowledge within 3 business days. +- Feature requests: acknowledge within 5 business days. + +## Support Channels +- GitHub Issues for bugs and feature requests. +- Security issues via the disclosure process in `SECURITY.md`. + +## Release Support Policy +- Latest minor release is fully supported. +- Previous minor release receives security and critical bug fixes for 60 days. + +## Incident Escalation +- Production-impacting authorization regressions are prioritized as P0. +- Maintainers publish mitigation guidance and recovery steps in issue updates and release notes. diff --git a/alembic/versions/20260404_000001_init.py b/alembic/versions/20260404_000001_init.py deleted file mode 100644 index d9e4e77..0000000 --- a/alembic/versions/20260404_000001_init.py +++ /dev/null @@ -1,66 +0,0 @@ -from __future__ import annotations - -import sqlalchemy as sa - -from alembic import op - -revision = "20260404_000001" -down_revision = None -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.create_table( - "users", - sa.Column("id", sa.Integer(), primary_key=True), - sa.Column("external_id", sa.String(length=128), nullable=True), - ) - op.create_index("ix_users_external_id", "users", ["external_id"], unique=False) - - op.create_table( - "roles", - sa.Column("id", sa.Integer(), primary_key=True), - sa.Column("name", sa.String(length=64), nullable=False, unique=True), - ) - - op.create_table( - "permissions", - sa.Column("id", sa.Integer(), primary_key=True), - sa.Column("action", sa.String(length=128), nullable=False), - sa.UniqueConstraint("action", name="uq_permissions_action"), - ) - - op.create_table( - "user_roles", - sa.Column( - "user_id", sa.Integer(), sa.ForeignKey("users.id", ondelete="CASCADE"), primary_key=True - ), - sa.Column( - "role_id", sa.Integer(), sa.ForeignKey("roles.id", ondelete="CASCADE"), primary_key=True - ), - ) - - op.create_table( - "role_permissions", - sa.Column( - "role_id", sa.Integer(), sa.ForeignKey("roles.id", ondelete="CASCADE"), primary_key=True - ), - sa.Column( - "permission_id", - sa.Integer(), - sa.ForeignKey("permissions.id", ondelete="CASCADE"), - primary_key=True, - ), - ) - - # policies are created in 20260404_000002 (versioned policy schema) - - -def downgrade() -> None: - op.drop_table("role_permissions") - op.drop_table("user_roles") - op.drop_table("permissions") - op.drop_table("roles") - op.drop_index("ix_users_external_id", table_name="users") - op.drop_table("users") diff --git a/alembic/versions/20260404_000002_tenants_versioning_audit.py b/alembic/versions/20260404_000002_tenants_versioning_audit.py deleted file mode 100644 index b5f33ca..0000000 --- a/alembic/versions/20260404_000002_tenants_versioning_audit.py +++ /dev/null @@ -1,99 +0,0 @@ -from __future__ import annotations - -import sqlalchemy as sa - -from alembic import op - -revision = "20260404_000002" -down_revision = "20260404_000001" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.create_table( - "tenants", - sa.Column("id", sa.Integer(), primary_key=True), - sa.Column("tenant_key", sa.String(length=64), nullable=False, unique=True), - ) - - op.create_table( - "audit_logs", - sa.Column("id", sa.Integer(), primary_key=True), - sa.Column( - "tenant_id", - sa.Integer(), - sa.ForeignKey("tenants.id", ondelete="CASCADE"), - nullable=False, - ), - sa.Column("principal_type", sa.String(length=32), nullable=False), - sa.Column("principal_id", sa.String(length=128), nullable=False), - sa.Column("user", sa.JSON(), nullable=False, server_default=sa.text("'{}'")), - sa.Column("action", sa.String(length=128), nullable=False), - sa.Column("resource", sa.JSON(), nullable=False, server_default=sa.text("'{}'")), - sa.Column("decision", sa.String(length=8), nullable=False), - sa.Column("matched_policies", sa.JSON(), nullable=False, server_default=sa.text("'[]'")), - sa.Column("reason", sa.String(length=256), nullable=True), - sa.Column( - "created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now() - ), - ) - op.create_index("ix_audit_logs_tenant_id", "audit_logs", ["tenant_id"], unique=False) - - op.create_table( - "policies", - sa.Column("id", sa.Integer(), primary_key=True), - sa.Column( - "tenant_id", - sa.Integer(), - sa.ForeignKey("tenants.id", ondelete="CASCADE"), - nullable=False, - ), - sa.Column("policy_key", sa.String(length=64), nullable=False), - sa.Column("current_version", sa.Integer(), nullable=False, server_default="1"), - sa.UniqueConstraint("tenant_id", "policy_key", name="uq_policies_tenant_key"), - ) - op.create_index("ix_policies_tenant_id", "policies", ["tenant_id"], unique=False) - - op.create_table( - "policy_versions", - sa.Column("id", sa.Integer(), primary_key=True), - sa.Column( - "tenant_id", - sa.Integer(), - sa.ForeignKey("tenants.id", ondelete="CASCADE"), - nullable=False, - ), - sa.Column( - "policy_id", - sa.Integer(), - sa.ForeignKey("policies.id", ondelete="CASCADE"), - nullable=False, - ), - sa.Column("version", sa.Integer(), nullable=False), - sa.Column("action", sa.String(length=128), nullable=False), - sa.Column("effect", sa.String(length=16), nullable=False, server_default="deny"), - sa.Column("priority", sa.Integer(), nullable=False, server_default="100"), - sa.Column("conditions", sa.JSON(), nullable=False, server_default=sa.text("'{}'")), - sa.Column( - "created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now() - ), - sa.Column("created_by", sa.String(length=128), nullable=True), - sa.UniqueConstraint("policy_id", "version", name="uq_policy_versions_policy_version"), - ) - op.create_index( - "ix_policy_versions_tenant_action_priority", - "policy_versions", - ["tenant_id", "action", "priority"], - unique=False, - ) - - -def downgrade() -> None: - op.drop_index("ix_policy_versions_tenant_action_priority", table_name="policy_versions") - op.drop_table("policy_versions") - op.drop_index("ix_policies_tenant_id", table_name="policies") - op.drop_table("policies") - op.drop_index("ix_audit_logs_tenant_id", table_name="audit_logs") - op.drop_table("audit_logs") - op.drop_table("tenants") diff --git a/alembic/versions/20260404_000003_tenant_policy_version.py b/alembic/versions/20260404_000003_tenant_policy_version.py deleted file mode 100644 index 0c7c3ab..0000000 --- a/alembic/versions/20260404_000003_tenant_policy_version.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations - -import sqlalchemy as sa - -from alembic import op - -revision = "20260404_000003" -down_revision = "20260404_000002" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.add_column( - "tenants", sa.Column("policy_version", sa.Integer(), nullable=False, server_default="1") - ) - - -def downgrade() -> None: - op.drop_column("tenants", "policy_version") diff --git a/alembic/versions/20260404_000004_relationships.py b/alembic/versions/20260404_000004_relationships.py deleted file mode 100644 index 0a31fbc..0000000 --- a/alembic/versions/20260404_000004_relationships.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import annotations - -import sqlalchemy as sa - -from alembic import op - -revision = "20260404_000004" -down_revision = "20260404_000003" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.create_table( - "relationships", - sa.Column("id", sa.Integer(), primary_key=True), - sa.Column( - "tenant_id", - sa.Integer(), - sa.ForeignKey("tenants.id", ondelete="CASCADE"), - nullable=False, - ), - sa.Column("subject_type", sa.String(length=32), nullable=False), - sa.Column("subject_id", sa.String(length=128), nullable=False), - sa.Column("relation", sa.String(length=64), nullable=False), - sa.Column("object_type", sa.String(length=32), nullable=False), - sa.Column("object_id", sa.String(length=128), nullable=False), - sa.UniqueConstraint( - "tenant_id", - "subject_type", - "subject_id", - "relation", - "object_type", - "object_id", - name="uq_relationships_tuple", - ), - ) - op.create_index( - "ix_relationships_lookup", - "relationships", - ["tenant_id", "subject_type", "subject_id", "relation"], - unique=False, - ) - op.create_index("ix_relationships_tenant_id", "relationships", ["tenant_id"], unique=False) - - -def downgrade() -> None: - op.drop_index("ix_relationships_tenant_id", table_name="relationships") - op.drop_index("ix_relationships_lookup", table_name="relationships") - op.drop_table("relationships") diff --git a/alembic/versions/20260404_000005_audit_explainability.py b/alembic/versions/20260404_000005_audit_explainability.py deleted file mode 100644 index b744a42..0000000 --- a/alembic/versions/20260404_000005_audit_explainability.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import annotations - -import sqlalchemy as sa - -from alembic import op - -revision = "20260404_000005" -down_revision = "20260404_000004" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.add_column( - "audit_logs", - sa.Column("evaluated_rules", sa.JSON(), nullable=False, server_default=sa.text("'[]'")), - ) - op.add_column( - "audit_logs", - sa.Column("failed_conditions", sa.JSON(), nullable=False, server_default=sa.text("'[]'")), - ) - - -def downgrade() -> None: - op.drop_column("audit_logs", "failed_conditions") - op.drop_column("audit_logs", "evaluated_rules") diff --git a/alembic/versions/20260405_000006_idempotency.py b/alembic/versions/20260405_000006_idempotency.py deleted file mode 100644 index e6629a3..0000000 --- a/alembic/versions/20260405_000006_idempotency.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -import sqlalchemy as sa - -from alembic import op - -revision = "20260405_000006" -down_revision = "20260404_000005" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.create_table( - "idempotency_records", - sa.Column("id", sa.Integer(), primary_key=True), - sa.Column("scope", sa.String(length=256), nullable=False), - sa.Column("idempotency_key", sa.String(length=128), nullable=False), - sa.Column("request_hash", sa.String(length=64), nullable=False), - sa.Column("response_status_code", sa.Integer(), nullable=True), - sa.Column("response_body", sa.Text(), nullable=True), - sa.Column("response_content_type", sa.String(length=128), nullable=True), - sa.Column( - "created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now() - ), - sa.Column("completed_at", sa.DateTime(timezone=True), nullable=True), - sa.UniqueConstraint("scope", "idempotency_key", name="uq_idempotency_records_scope_key"), - ) - - -def downgrade() -> None: - op.drop_table("idempotency_records") diff --git a/alembic/versions/20260405_000007_resource_acl.py b/alembic/versions/20260405_000007_resource_acl.py deleted file mode 100644 index 73902e7..0000000 --- a/alembic/versions/20260405_000007_resource_acl.py +++ /dev/null @@ -1,52 +0,0 @@ -"""add resource acl table - -Revision ID: 20260405_000007 -Revises: 20260405_000006 -Create Date: 2026-04-05 00:07:00.000000 -""" - -from __future__ import annotations - -import sqlalchemy as sa - -from alembic import op - -# revision identifiers, used by Alembic. -revision = "20260405_000007" -down_revision = "20260405_000006" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.create_table( - "resource_acl", - sa.Column("id", sa.Integer(), primary_key=True), - sa.Column( - "tenant_id", - sa.Integer(), - sa.ForeignKey("tenants.id", ondelete="CASCADE"), - nullable=False, - ), - sa.Column("subject_type", sa.String(length=32), nullable=False), - sa.Column("subject_id", sa.String(length=128), nullable=False), - sa.Column("resource_type", sa.String(length=64), nullable=False), - sa.Column("resource_id", sa.String(length=128), nullable=False), - sa.Column("action", sa.String(length=128), nullable=False), - sa.Column("effect", sa.String(length=16), nullable=False), - sa.Column("created_at", sa.DateTime(), nullable=False), - ) - op.create_index( - "ix_resource_acl_lookup", - "resource_acl", - ["tenant_id", "resource_type", "resource_id", "action"], - ) - op.create_index( - "ix_resource_acl_subject", "resource_acl", ["tenant_id", "subject_type", "subject_id"] - ) - - -def downgrade() -> None: - op.drop_index("ix_resource_acl_subject", table_name="resource_acl") - op.drop_index("ix_resource_acl_lookup", table_name="resource_acl") - op.drop_table("resource_acl") diff --git a/alembic/versions/20260405_000008_auth_model_revision.py b/alembic/versions/20260405_000008_auth_model_revision.py deleted file mode 100644 index fe9fb8a..0000000 --- a/alembic/versions/20260405_000008_auth_model_revision.py +++ /dev/null @@ -1,46 +0,0 @@ -"""add auth model storage and authorization revision - -Revision ID: 20260405_000008 -Revises: 20260405_000007 -Create Date: 2026-04-05 00:08:00.000000 -""" - -from __future__ import annotations - -import sqlalchemy as sa - -from alembic import op - -revision = "20260405_000008" -down_revision = "20260405_000007" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.add_column( - "tenants", - sa.Column("authorization_revision", sa.Integer(), nullable=False, server_default="1"), - ) - op.create_table( - "auth_models", - sa.Column("id", sa.Integer(), primary_key=True), - sa.Column( - "tenant_id", - sa.Integer(), - sa.ForeignKey("tenants.id", ondelete="CASCADE"), - nullable=False, - unique=True, - ), - sa.Column("schema_text", sa.Text(), nullable=False), - sa.Column("schema_json", sa.JSON(), nullable=False), - sa.Column("compiled_json", sa.JSON(), nullable=False), - sa.Column("created_at", sa.DateTime(), nullable=False), - sa.Column("updated_at", sa.DateTime(), nullable=False), - sa.UniqueConstraint("tenant_id", name="uq_auth_models_tenant"), - ) - - -def downgrade() -> None: - op.drop_table("auth_models") - op.drop_column("tenants", "authorization_revision") diff --git a/alembic/versions/20260407_000001_initial_schema_v0.py b/alembic/versions/20260407_000001_initial_schema_v0.py new file mode 100644 index 0000000..5dac529 --- /dev/null +++ b/alembic/versions/20260407_000001_initial_schema_v0.py @@ -0,0 +1,36 @@ +"""initial_schema_v0 + +Revision ID: 20260407_000001 +Revises: +Create Date: 2026-04-07 +""" + +from __future__ import annotations + +from alembic import op + +# Ensure all models are registered on Base metadata. +from keynetra.domain.models import acl as _acl # noqa: F401 +from keynetra.domain.models import audit as _audit # noqa: F401 +from keynetra.domain.models import auth_model as _auth_model # noqa: F401 +from keynetra.domain.models import idempotency as _idempotency # noqa: F401 +from keynetra.domain.models import policy_versioning as _policy_versioning # noqa: F401 +from keynetra.domain.models import rbac as _rbac # noqa: F401 +from keynetra.domain.models import relationship as _relationship # noqa: F401 +from keynetra.domain.models import tenant as _tenant # noqa: F401 +from keynetra.domain.models.base import Base + +revision = "20260407_000001" +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade() -> None: + bind = op.get_bind() + Base.metadata.create_all(bind=bind) + + +def downgrade() -> None: + bind = op.get_bind() + Base.metadata.drop_all(bind=bind) diff --git a/contracts/openapi/keynetra-v0.1.0.yaml b/contracts/openapi/keynetra-v0.1.0.yaml index 9f388c0..da568a6 100644 --- a/contracts/openapi/keynetra-v0.1.0.yaml +++ b/contracts/openapi/keynetra-v0.1.0.yaml @@ -48,12 +48,23 @@ paths: - access summary: Check Access operationId: check_access_check_access_post + security: + - HTTPBearer: [] + - APIKeyHeader: [] + parameters: + - name: policy_set + in: query + required: false + schema: + type: string + default: active + title: Policy Set requestBody: + required: true content: application/json: schema: $ref: '#/components/schemas/AccessRequest' - required: true responses: '200': description: Successful Response @@ -67,9 +78,6 @@ paths: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' - security: - - HTTPBearer: [] - - APIKeyHeader: [] /simulate: post: tags: @@ -104,12 +112,23 @@ paths: - access summary: Check Access Batch operationId: check_access_batch_check_access_batch_post + security: + - HTTPBearer: [] + - APIKeyHeader: [] + parameters: + - name: policy_set + in: query + required: false + schema: + type: string + default: active + title: Policy Set requestBody: + required: true content: application/json: schema: $ref: '#/components/schemas/BatchAccessRequest' - required: true responses: '200': description: Successful Response @@ -123,9 +142,6 @@ paths: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' - security: - - HTTPBearer: [] - - APIKeyHeader: [] /admin/login: post: tags: @@ -1338,6 +1354,11 @@ components: principal_id: type: string title: Principal Id + correlation_id: + anyOf: + - type: string + - type: 'null' + title: Correlation Id user: additionalProperties: true type: object @@ -1653,6 +1674,10 @@ components: type: integer title: Priority default: 100 + state: + type: string + title: State + default: active conditions: additionalProperties: true type: object @@ -1675,6 +1700,10 @@ components: priority: type: integer title: Priority + state: + type: string + title: State + default: active conditions: additionalProperties: true type: object diff --git a/contracts/openapi/openapi.json b/contracts/openapi/openapi.json new file mode 100644 index 0000000..49856dd --- /dev/null +++ b/contracts/openapi/openapi.json @@ -0,0 +1,3587 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "KeyNetra", + "version": "0.1.0" + }, + "paths": { + "/health": { + "get": { + "tags": [ + "health" + ], + "summary": "Health", + "operationId": "health_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__str__" + } + } + } + } + } + } + }, + "/health/live": { + "get": { + "tags": [ + "health" + ], + "summary": "Liveness", + "operationId": "liveness_health_live_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__str__" + } + } + } + } + } + } + }, + "/health/ready": { + "get": { + "tags": [ + "health" + ], + "summary": "Readiness", + "operationId": "readiness_health_ready_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__object__" + } + } + } + } + } + } + }, + "/check-access": { + "post": { + "tags": [ + "access" + ], + "summary": "Check Access", + "operationId": "check_access_check_access_post", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "policy_set", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "active", + "title": "Policy Set" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AccessRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_AccessDecisionResponse_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/simulate": { + "post": { + "tags": [ + "access" + ], + "summary": "Simulate", + "operationId": "simulate_simulate_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AccessRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_SimulationResponse_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ] + } + }, + "/check-access-batch": { + "post": { + "tags": [ + "access" + ], + "summary": "Check Access Batch", + "operationId": "check_access_batch_check_access_batch_post", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "policy_set", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "active", + "title": "Policy Set" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BatchAccessRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_BatchAccessResponse_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/login": { + "post": { + "tags": [ + "auth", + "auth" + ], + "summary": "Admin Login", + "operationId": "admin_login_admin_login_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminLoginRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_AdminLoginResponse_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/policies": { + "get": { + "tags": [ + "management" + ], + "summary": "List Policies", + "operationId": "list_policies_policies_get", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 50, + "title": "Limit" + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cursor" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_list_PolicyOut__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "management" + ], + "summary": "Create Policy", + "operationId": "create_policy_policies_post", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_PolicyOut_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/policies/{policy_key}": { + "put": { + "tags": [ + "management" + ], + "summary": "Update Policy", + "operationId": "update_policy_policies__policy_key__put", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "policy_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Policy Key" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_PolicyOut_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "management" + ], + "summary": "Delete Policy", + "operationId": "delete_policy_policies__policy_key__delete", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "policy_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Policy Key" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__str__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/policies/dsl": { + "post": { + "tags": [ + "management" + ], + "summary": "Create Policy From Dsl", + "operationId": "create_policy_from_dsl_policies_dsl_post", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "dsl", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Dsl" + } + } + ], + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_PolicyOut_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/policies/{policy_key}/rollback/{version}": { + "post": { + "tags": [ + "management" + ], + "summary": "Rollback Policy", + "operationId": "rollback_policy_policies__policy_key__rollback__version__post", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "policy_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Policy Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Version" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__Union_int__str___" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/acl": { + "post": { + "tags": [ + "management" + ], + "summary": "Create Acl Entry", + "operationId": "create_acl_entry_acl_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ACLCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_ACLOut_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ] + } + }, + "/acl/{resource_type}/{resource_id}": { + "get": { + "tags": [ + "management" + ], + "summary": "List Acl Entries", + "operationId": "list_acl_entries_acl__resource_type___resource_id__get", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "resource_type", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Resource Type" + } + }, + { + "name": "resource_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Resource Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_list_ACLOut__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/acl/{acl_id}": { + "delete": { + "tags": [ + "management" + ], + "summary": "Delete Acl Entry", + "operationId": "delete_acl_entry_acl__acl_id__delete", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "acl_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Acl Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__int__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/auth-model": { + "get": { + "tags": [ + "management" + ], + "summary": "Get Auth Model", + "operationId": "get_auth_model_auth_model_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_AuthModelOut_" + } + } + } + } + }, + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ] + }, + "post": { + "tags": [ + "management" + ], + "summary": "Create Auth Model", + "operationId": "create_auth_model_auth_model_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthModelCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_AuthModelOut_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ] + } + }, + "/simulate-policy": { + "post": { + "tags": [ + "management" + ], + "summary": "Simulate Policy", + "operationId": "simulate_policy_simulate_policy_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicySimulationRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_PolicySimulationResponse_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ] + } + }, + "/impact-analysis": { + "post": { + "tags": [ + "management" + ], + "summary": "Impact Analysis", + "operationId": "impact_analysis_impact_analysis_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImpactAnalysisRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_ImpactAnalysisResponse_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ] + } + }, + "/roles": { + "get": { + "tags": [ + "management" + ], + "summary": "List Roles", + "operationId": "list_roles_roles_get", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 50, + "title": "Limit" + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cursor" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_list_RoleOut__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "management" + ], + "summary": "Create Role", + "operationId": "create_role_roles_post", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/roles/{role_id}": { + "put": { + "tags": [ + "management" + ], + "summary": "Update Role", + "operationId": "update_role_roles__role_id__put", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "role_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Role Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "management" + ], + "summary": "Delete Role", + "operationId": "delete_role_roles__role_id__delete", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "role_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Role Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__int__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/roles/{role_id}/permissions": { + "get": { + "tags": [ + "management" + ], + "summary": "List Role Permissions", + "operationId": "list_role_permissions_roles__role_id__permissions_get", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "role_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Role Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_list_PermissionOut__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/roles/{role_id}/permissions/{permission_id}": { + "post": { + "tags": [ + "management" + ], + "summary": "Add Permission To Role", + "operationId": "add_permission_to_role_roles__role_id__permissions__permission_id__post", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "role_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Role Id" + } + }, + { + "name": "permission_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Permission Id" + } + } + ], + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_PermissionOut_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "management" + ], + "summary": "Remove Permission From Role", + "operationId": "remove_permission_from_role_roles__role_id__permissions__permission_id__delete", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "role_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Role Id" + } + }, + { + "name": "permission_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Permission Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__int__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/permissions": { + "get": { + "tags": [ + "management" + ], + "summary": "List Permissions", + "operationId": "list_permissions_permissions_get", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 50, + "title": "Limit" + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cursor" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_list_PermissionOut__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "management" + ], + "summary": "Create Permission", + "operationId": "create_permission_permissions_post", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PermissionCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PermissionOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/permissions/{permission_id}": { + "put": { + "tags": [ + "management" + ], + "summary": "Update Permission", + "operationId": "update_permission_permissions__permission_id__put", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "permission_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Permission Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PermissionUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PermissionOut" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "management" + ], + "summary": "Delete Permission", + "operationId": "delete_permission_permissions__permission_id__delete", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "permission_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Permission Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__int__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/permissions/{permission_id}/roles": { + "get": { + "tags": [ + "management" + ], + "summary": "List Permission Roles", + "operationId": "list_permission_roles_permissions__permission_id__roles_get", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "permission_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Permission Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_list_RoleOut__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/relationships": { + "get": { + "tags": [ + "management" + ], + "summary": "List Relationships", + "operationId": "list_relationships_relationships_get", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "subject_type", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Subject Type" + } + }, + { + "name": "subject_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Subject Id" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 50, + "title": "Limit" + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cursor" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_list_dict_str__str___" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "management" + ], + "summary": "Create Relationship", + "operationId": "create_relationship_relationships_post", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RelationshipCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_RelationshipOut_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/audit": { + "get": { + "tags": [ + "management" + ], + "summary": "List Audit Logs", + "operationId": "list_audit_logs_audit_get", + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 50, + "title": "Limit" + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cursor" + } + }, + { + "name": "user_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User Id" + } + }, + { + "name": "resource_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Resource Id" + } + }, + { + "name": "decision", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Decision" + } + }, + { + "name": "start_time", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Start Time" + } + }, + { + "name": "end_time", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "End Time" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_list_AuditRecordOut__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/playground/evaluate": { + "post": { + "tags": [ + "playground" + ], + "summary": "Evaluate", + "operationId": "evaluate_playground_evaluate_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlaygroundEvaluateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__Any__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "HTTPBearer": [] + }, + { + "APIKeyHeader": [] + } + ] + } + }, + "/dev/sample-data": { + "get": { + "tags": [ + "dev" + ], + "summary": "Get Sample Data", + "operationId": "get_sample_data_dev_sample_data_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__object__" + } + } + } + } + } + } + }, + "/dev/sample-data/seed": { + "post": { + "tags": [ + "dev" + ], + "summary": "Seed Sample Data", + "operationId": "seed_sample_data_dev_sample_data_seed_post", + "parameters": [ + { + "name": "reset", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Clear the sample dataset before reseeding it.", + "default": false, + "title": "Reset" + }, + "description": "Clear the sample dataset before reseeding it." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse_dict_str__object__" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "ACLCreate": { + "properties": { + "subject_type": { + "type": "string", + "title": "Subject Type" + }, + "subject_id": { + "type": "string", + "title": "Subject Id" + }, + "resource_type": { + "type": "string", + "title": "Resource Type" + }, + "resource_id": { + "type": "string", + "title": "Resource Id" + }, + "action": { + "type": "string", + "title": "Action" + }, + "effect": { + "type": "string", + "title": "Effect" + } + }, + "type": "object", + "required": [ + "subject_type", + "subject_id", + "resource_type", + "resource_id", + "action", + "effect" + ], + "title": "ACLCreate" + }, + "ACLOut": { + "properties": { + "subject_type": { + "type": "string", + "title": "Subject Type" + }, + "subject_id": { + "type": "string", + "title": "Subject Id" + }, + "resource_type": { + "type": "string", + "title": "Resource Type" + }, + "resource_id": { + "type": "string", + "title": "Resource Id" + }, + "action": { + "type": "string", + "title": "Action" + }, + "effect": { + "type": "string", + "title": "Effect" + }, + "id": { + "type": "integer", + "title": "Id" + }, + "tenant_id": { + "type": "integer", + "title": "Tenant Id" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + } + }, + "type": "object", + "required": [ + "subject_type", + "subject_id", + "resource_type", + "resource_id", + "action", + "effect", + "id", + "tenant_id" + ], + "title": "ACLOut" + }, + "AccessDecisionResponse": { + "properties": { + "allowed": { + "type": "boolean", + "title": "Allowed" + }, + "decision": { + "type": "string", + "title": "Decision" + }, + "matched_policies": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Matched Policies" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reason" + }, + "policy_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Policy Id" + }, + "explain_trace": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array", + "title": "Explain Trace" + }, + "revision": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Revision" + } + }, + "type": "object", + "required": [ + "allowed", + "decision" + ], + "title": "AccessDecisionResponse" + }, + "AccessRequest": { + "properties": { + "user": { + "additionalProperties": true, + "type": "object", + "title": "User" + }, + "action": { + "type": "string", + "title": "Action" + }, + "resource": { + "additionalProperties": true, + "type": "object", + "title": "Resource" + }, + "context": { + "additionalProperties": true, + "type": "object", + "title": "Context" + }, + "consistency": { + "type": "string", + "title": "Consistency", + "default": "eventual" + }, + "revision": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Revision" + } + }, + "type": "object", + "required": [ + "action" + ], + "title": "AccessRequest", + "description": "Explicit authorization request passed through the API boundary." + }, + "AdminLoginRequest": { + "properties": { + "username": { + "type": "string", + "title": "Username" + }, + "password": { + "type": "string", + "title": "Password" + } + }, + "type": "object", + "required": [ + "username", + "password" + ], + "title": "AdminLoginRequest" + }, + "AdminLoginResponse": { + "properties": { + "access_token": { + "type": "string", + "title": "Access Token" + }, + "token_type": { + "type": "string", + "title": "Token Type", + "default": "bearer" + }, + "expires_in": { + "type": "integer", + "title": "Expires In" + }, + "role": { + "type": "string", + "title": "Role", + "default": "admin" + }, + "tenant_key": { + "type": "string", + "title": "Tenant Key" + } + }, + "type": "object", + "required": [ + "access_token", + "expires_in", + "tenant_key" + ], + "title": "AdminLoginResponse" + }, + "AuditRecordOut": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "principal_type": { + "type": "string", + "title": "Principal Type" + }, + "principal_id": { + "type": "string", + "title": "Principal Id" + }, + "correlation_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Correlation Id" + }, + "user": { + "additionalProperties": true, + "type": "object", + "title": "User" + }, + "action": { + "type": "string", + "title": "Action" + }, + "resource": { + "additionalProperties": true, + "type": "object", + "title": "Resource" + }, + "decision": { + "type": "string", + "title": "Decision" + }, + "matched_policies": { + "items": {}, + "type": "array", + "title": "Matched Policies" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reason" + }, + "evaluated_rules": { + "items": {}, + "type": "array", + "title": "Evaluated Rules" + }, + "failed_conditions": { + "items": {}, + "type": "array", + "title": "Failed Conditions" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "principal_type", + "principal_id", + "user", + "action", + "resource", + "decision", + "matched_policies", + "evaluated_rules", + "failed_conditions", + "created_at" + ], + "title": "AuditRecordOut" + }, + "AuthModelCreate": { + "properties": { + "schema": { + "type": "string", + "title": "Schema" + } + }, + "type": "object", + "required": [ + "schema" + ], + "title": "AuthModelCreate" + }, + "AuthModelOut": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "tenant_id": { + "type": "integer", + "title": "Tenant Id" + }, + "schema": { + "type": "string", + "title": "Schema" + }, + "parsed": { + "additionalProperties": true, + "type": "object", + "title": "Parsed" + }, + "compiled": { + "additionalProperties": true, + "type": "object", + "title": "Compiled" + } + }, + "type": "object", + "required": [ + "id", + "tenant_id", + "schema", + "parsed", + "compiled" + ], + "title": "AuthModelOut" + }, + "BatchAccessItem": { + "properties": { + "action": { + "type": "string", + "title": "Action" + }, + "resource": { + "additionalProperties": true, + "type": "object", + "title": "Resource" + } + }, + "type": "object", + "required": [ + "action" + ], + "title": "BatchAccessItem" + }, + "BatchAccessRequest": { + "properties": { + "user": { + "additionalProperties": true, + "type": "object", + "title": "User" + }, + "items": { + "items": { + "$ref": "#/components/schemas/BatchAccessItem" + }, + "type": "array", + "title": "Items" + }, + "consistency": { + "type": "string", + "title": "Consistency", + "default": "eventual" + }, + "revision": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Revision" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "BatchAccessRequest" + }, + "BatchAccessResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/BatchAccessResult" + }, + "type": "array", + "title": "Results" + }, + "revision": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Revision" + } + }, + "type": "object", + "required": [ + "results" + ], + "title": "BatchAccessResponse" + }, + "BatchAccessResult": { + "properties": { + "action": { + "type": "string", + "title": "Action" + }, + "allowed": { + "type": "boolean", + "title": "Allowed" + }, + "revision": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Revision" + } + }, + "type": "object", + "required": [ + "action", + "allowed" + ], + "title": "BatchAccessResult" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "ImpactAnalysisRequest": { + "properties": { + "policy_change": { + "type": "string", + "title": "Policy Change" + } + }, + "type": "object", + "required": [ + "policy_change" + ], + "title": "ImpactAnalysisRequest" + }, + "ImpactAnalysisResponse": { + "properties": { + "gained_access": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Gained Access" + }, + "lost_access": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Lost Access" + } + }, + "type": "object", + "title": "ImpactAnalysisResponse" + }, + "MetaBody": { + "properties": { + "request_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Request Id" + }, + "limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Limit" + }, + "next_cursor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Cursor" + }, + "extra": { + "additionalProperties": true, + "type": "object", + "title": "Extra" + } + }, + "type": "object", + "title": "MetaBody" + }, + "PermissionCreate": { + "properties": { + "action": { + "type": "string", + "title": "Action" + } + }, + "type": "object", + "required": [ + "action" + ], + "title": "PermissionCreate" + }, + "PermissionOut": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "action": { + "type": "string", + "title": "Action" + } + }, + "type": "object", + "required": [ + "id", + "action" + ], + "title": "PermissionOut" + }, + "PermissionUpdate": { + "properties": { + "action": { + "type": "string", + "title": "Action" + } + }, + "type": "object", + "required": [ + "action" + ], + "title": "PermissionUpdate" + }, + "PlaygroundEvaluateRequest": { + "properties": { + "policies": { + "items": { + "$ref": "#/components/schemas/PlaygroundPolicy" + }, + "type": "array", + "title": "Policies" + }, + "input": { + "$ref": "#/components/schemas/PlaygroundInput" + } + }, + "type": "object", + "required": [ + "policies", + "input" + ], + "title": "PlaygroundEvaluateRequest" + }, + "PlaygroundInput": { + "properties": { + "user": { + "additionalProperties": true, + "type": "object", + "title": "User" + }, + "resource": { + "additionalProperties": true, + "type": "object", + "title": "Resource" + }, + "action": { + "type": "string", + "title": "Action", + "default": "" + }, + "context": { + "additionalProperties": true, + "type": "object", + "title": "Context" + } + }, + "type": "object", + "title": "PlaygroundInput" + }, + "PlaygroundPolicy": { + "properties": { + "action": { + "type": "string", + "title": "Action" + }, + "effect": { + "type": "string", + "title": "Effect", + "default": "allow" + }, + "priority": { + "type": "integer", + "title": "Priority", + "default": 100 + }, + "policy_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Policy Id" + }, + "conditions": { + "additionalProperties": true, + "type": "object", + "title": "Conditions" + } + }, + "type": "object", + "required": [ + "action" + ], + "title": "PlaygroundPolicy" + }, + "PolicyCreate": { + "properties": { + "action": { + "type": "string", + "title": "Action" + }, + "effect": { + "type": "string", + "title": "Effect", + "default": "allow" + }, + "priority": { + "type": "integer", + "title": "Priority", + "default": 100 + }, + "state": { + "type": "string", + "title": "State", + "default": "active" + }, + "conditions": { + "additionalProperties": true, + "type": "object", + "title": "Conditions" + } + }, + "type": "object", + "required": [ + "action" + ], + "title": "PolicyCreate" + }, + "PolicyOut": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "action": { + "type": "string", + "title": "Action" + }, + "effect": { + "type": "string", + "title": "Effect" + }, + "priority": { + "type": "integer", + "title": "Priority" + }, + "state": { + "type": "string", + "title": "State", + "default": "active" + }, + "conditions": { + "additionalProperties": true, + "type": "object", + "title": "Conditions" + } + }, + "type": "object", + "required": [ + "id", + "action", + "effect", + "priority", + "conditions" + ], + "title": "PolicyOut" + }, + "PolicySimulationInput": { + "properties": { + "policy_change": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Policy Change" + }, + "relationship_change": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Relationship Change" + }, + "role_change": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Role Change" + } + }, + "type": "object", + "title": "PolicySimulationInput" + }, + "PolicySimulationRequest": { + "properties": { + "simulate": { + "$ref": "#/components/schemas/PolicySimulationInput" + }, + "request": { + "additionalProperties": true, + "type": "object", + "title": "Request" + } + }, + "type": "object", + "title": "PolicySimulationRequest" + }, + "PolicySimulationResponse": { + "properties": { + "decision_before": { + "additionalProperties": true, + "type": "object", + "title": "Decision Before" + }, + "decision_after": { + "additionalProperties": true, + "type": "object", + "title": "Decision After" + } + }, + "type": "object", + "required": [ + "decision_before", + "decision_after" + ], + "title": "PolicySimulationResponse" + }, + "RelationshipCreate": { + "properties": { + "subject_type": { + "type": "string", + "title": "Subject Type" + }, + "subject_id": { + "type": "string", + "title": "Subject Id" + }, + "relation": { + "type": "string", + "title": "Relation" + }, + "object_type": { + "type": "string", + "title": "Object Type" + }, + "object_id": { + "type": "string", + "title": "Object Id" + } + }, + "type": "object", + "required": [ + "subject_type", + "subject_id", + "relation", + "object_type", + "object_id" + ], + "title": "RelationshipCreate" + }, + "RelationshipOut": { + "properties": { + "subject_type": { + "type": "string", + "title": "Subject Type" + }, + "subject_id": { + "type": "string", + "title": "Subject Id" + }, + "relation": { + "type": "string", + "title": "Relation" + }, + "object_type": { + "type": "string", + "title": "Object Type" + }, + "object_id": { + "type": "string", + "title": "Object Id" + }, + "id": { + "type": "integer", + "title": "Id" + } + }, + "type": "object", + "required": [ + "subject_type", + "subject_id", + "relation", + "object_type", + "object_id", + "id" + ], + "title": "RelationshipOut" + }, + "RoleCreate": { + "properties": { + "name": { + "type": "string", + "title": "Name" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "RoleCreate" + }, + "RoleOut": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + } + }, + "type": "object", + "required": [ + "id", + "name" + ], + "title": "RoleOut" + }, + "RoleUpdate": { + "properties": { + "name": { + "type": "string", + "title": "Name" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "RoleUpdate" + }, + "SimulationResponse": { + "properties": { + "decision": { + "type": "string", + "title": "Decision" + }, + "matched_policies": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Matched Policies" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reason" + }, + "policy_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Policy Id" + }, + "explain_trace": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array", + "title": "Explain Trace" + }, + "failed_conditions": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Failed Conditions" + }, + "revision": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Revision" + } + }, + "type": "object", + "required": [ + "decision", + "matched_policies" + ], + "title": "SimulationResponse" + }, + "SuccessResponse_ACLOut_": { + "properties": { + "data": { + "$ref": "#/components/schemas/ACLOut" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[ACLOut]" + }, + "SuccessResponse_AccessDecisionResponse_": { + "properties": { + "data": { + "$ref": "#/components/schemas/AccessDecisionResponse" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[AccessDecisionResponse]" + }, + "SuccessResponse_AdminLoginResponse_": { + "properties": { + "data": { + "$ref": "#/components/schemas/AdminLoginResponse" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[AdminLoginResponse]" + }, + "SuccessResponse_AuthModelOut_": { + "properties": { + "data": { + "$ref": "#/components/schemas/AuthModelOut" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[AuthModelOut]" + }, + "SuccessResponse_BatchAccessResponse_": { + "properties": { + "data": { + "$ref": "#/components/schemas/BatchAccessResponse" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[BatchAccessResponse]" + }, + "SuccessResponse_ImpactAnalysisResponse_": { + "properties": { + "data": { + "$ref": "#/components/schemas/ImpactAnalysisResponse" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[ImpactAnalysisResponse]" + }, + "SuccessResponse_PermissionOut_": { + "properties": { + "data": { + "$ref": "#/components/schemas/PermissionOut" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[PermissionOut]" + }, + "SuccessResponse_PolicyOut_": { + "properties": { + "data": { + "$ref": "#/components/schemas/PolicyOut" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[PolicyOut]" + }, + "SuccessResponse_PolicySimulationResponse_": { + "properties": { + "data": { + "$ref": "#/components/schemas/PolicySimulationResponse" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[PolicySimulationResponse]" + }, + "SuccessResponse_RelationshipOut_": { + "properties": { + "data": { + "$ref": "#/components/schemas/RelationshipOut" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[RelationshipOut]" + }, + "SuccessResponse_SimulationResponse_": { + "properties": { + "data": { + "$ref": "#/components/schemas/SimulationResponse" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[SimulationResponse]" + }, + "SuccessResponse_dict_str__Any__": { + "properties": { + "data": { + "additionalProperties": true, + "type": "object", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[dict[str, Any]]" + }, + "SuccessResponse_dict_str__Union_int__str___": { + "properties": { + "data": { + "additionalProperties": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ] + }, + "type": "object", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[dict[str, Union[int, str]]]" + }, + "SuccessResponse_dict_str__int__": { + "properties": { + "data": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[dict[str, int]]" + }, + "SuccessResponse_dict_str__object__": { + "properties": { + "data": { + "additionalProperties": true, + "type": "object", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[dict[str, object]]" + }, + "SuccessResponse_dict_str__str__": { + "properties": { + "data": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[dict[str, str]]" + }, + "SuccessResponse_list_ACLOut__": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/ACLOut" + }, + "type": "array", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[list[ACLOut]]" + }, + "SuccessResponse_list_AuditRecordOut__": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/AuditRecordOut" + }, + "type": "array", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[list[AuditRecordOut]]" + }, + "SuccessResponse_list_PermissionOut__": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/PermissionOut" + }, + "type": "array", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[list[PermissionOut]]" + }, + "SuccessResponse_list_PolicyOut__": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/PolicyOut" + }, + "type": "array", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[list[PolicyOut]]" + }, + "SuccessResponse_list_RoleOut__": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/RoleOut" + }, + "type": "array", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[list[RoleOut]]" + }, + "SuccessResponse_list_dict_str__str___": { + "properties": { + "data": { + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/MetaBody" + }, + "error": { + "type": "null", + "title": "Error" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "SuccessResponse[list[dict[str, str]]]" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + }, + "input": { + "title": "Input" + }, + "ctx": { + "type": "object", + "title": "Context" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + } + }, + "securitySchemes": { + "HTTPBearer": { + "type": "http", + "scheme": "bearer" + }, + "APIKeyHeader": { + "type": "apiKey", + "in": "header", + "name": "X-API-Key" + } + } + } +} \ No newline at end of file diff --git a/coverage.json b/coverage.json new file mode 100644 index 0000000..3b75279 --- /dev/null +++ b/coverage.json @@ -0,0 +1 @@ +{"meta": {"format": 3, "version": "7.13.5", "timestamp": "2026-04-07T02:24:08.009199", "branch_coverage": false, "show_contexts": false}, "files": {"keynetra/__init__.py": {"executed_lines": [3, 5], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 5], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/dependencies.py": {"executed_lines": [1, 3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 56, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 80, 81, 97, 104, 109, 115], "summary": {"covered_lines": 69, "num_statements": 69, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"build_services": {"executed_lines": [61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 80, 81, 97, 104, 109, 115], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 56}, "": {"executed_lines": [1, 3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 56], "summary": {"covered_lines": 49, "num_statements": 49, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"ServiceContainer": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 35}, "": {"executed_lines": [1, 3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 56, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 80, 81, 97, 104, 109, 115], "summary": {"covered_lines": 69, "num_statements": 69, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/errors.py": {"executed_lines": [3, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 24, 27, 28, 29, 30, 31], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"ApiError.__init__": {"executed_lines": [27, 28, 29, 30, 31], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 24}, "": {"executed_lines": [3, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 24], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"ApiErrorCode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 9}, "ApiError": {"executed_lines": [27, 28, 29, 30, 31], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 21}, "": {"executed_lines": [3, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 24], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/main.py": {"executed_lines": [1, 2, 3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 34, 35, 45, 46, 47, 48, 50, 51, 52, 53, 54, 55, 56, 64, 66, 67, 69, 82, 85, 108, 109, 110, 111, 112, 113, 114, 116, 117, 118, 120, 121, 123, 124, 125, 126, 127, 128, 129, 130, 131, 140, 141, 142, 143, 154, 164, 165, 166, 167, 168, 170, 171, 173, 174, 176, 177, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 208], "summary": {"covered_lines": 96, "num_statements": 157, "percent_covered": 61.146496815286625, "percent_covered_display": "61", "missing_lines": 61, "excluded_lines": 0, "percent_statements_covered": 61.146496815286625, "percent_statements_covered_display": "61"}, "missing_lines": [36, 37, 38, 39, 40, 42, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 132, 133, 138, 144, 145, 146, 147, 148, 149, 150, 151, 155, 156, 157, 158, 159, 160, 161, 169, 175, 181, 182, 183, 184, 188, 205], "excluded_lines": [], "functions": {"_lifespan": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 6, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [36, 37, 38, 39, 40, 42], "excluded_lines": [], "start_line": 35}, "create_app": {"executed_lines": [46, 47, 48, 50, 51, 52, 53, 54, 55, 56, 64, 66, 67, 69, 82], "summary": {"covered_lines": 15, "num_statements": 25, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 10, "excluded_lines": 0, "percent_statements_covered": 60.0, "percent_statements_covered_display": "60"}, "missing_lines": [70, 71, 73, 74, 75, 76, 77, 78, 79, 80], "excluded_lines": [], "start_line": 45}, "_run_startup": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 19, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 19, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105], "excluded_lines": [], "start_line": 85}, "_start_policy_subscriber": {"executed_lines": [109, 110, 111, 112, 113, 114, 116, 117, 118, 120, 121, 123, 140, 141, 142, 143], "summary": {"covered_lines": 16, "num_statements": 24, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [144, 145, 146, 147, 148, 149, 150, 151], "excluded_lines": [], "start_line": 108}, "_start_policy_subscriber.run": {"executed_lines": [124, 125, 126, 127, 128, 129, 130, 131], "summary": {"covered_lines": 8, "num_statements": 11, "percent_covered": 72.72727272727273, "percent_covered_display": "73", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 72.72727272727273, "percent_statements_covered_display": "73"}, "missing_lines": [132, 133, 138], "excluded_lines": [], "start_line": 123}, "_stop_policy_subscriber": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [155, 156, 157, 158, 159, 160, 161], "excluded_lines": [], "start_line": 154}, "_bootstrap_file_backed_model": {"executed_lines": [165, 166, 167, 168, 170, 171, 173, 174, 176, 177], "summary": {"covered_lines": 10, "num_statements": 17, "percent_covered": 58.8235294117647, "percent_covered_display": "59", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 58.8235294117647, "percent_statements_covered_display": "59"}, "missing_lines": [169, 175, 181, 182, 183, 184, 188], "excluded_lines": [], "start_line": 164}, "_bootstrap_file_backed_policies": {"executed_lines": [192, 193, 194, 195, 196, 197, 198, 199, 200, 201], "summary": {"covered_lines": 10, "num_statements": 11, "percent_covered": 90.9090909090909, "percent_covered_display": "91", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 90.9090909090909, "percent_statements_covered_display": "91"}, "missing_lines": [205], "excluded_lines": [], "start_line": 191}, "": {"executed_lines": [1, 2, 3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 34, 35, 45, 85, 108, 154, 164, 191, 208], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 2, 3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 34, 35, 45, 46, 47, 48, 50, 51, 52, 53, 54, 55, 56, 64, 66, 67, 69, 82, 85, 108, 109, 110, 111, 112, 113, 114, 116, 117, 118, 120, 121, 123, 124, 125, 126, 127, 128, 129, 130, 131, 140, 141, 142, 143, 154, 164, 165, 166, 167, 168, 170, 171, 173, 174, 176, 177, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 208], "summary": {"covered_lines": 96, "num_statements": 157, "percent_covered": 61.146496815286625, "percent_covered_display": "61", "missing_lines": 61, "excluded_lines": 0, "percent_statements_covered": 61.146496815286625, "percent_statements_covered_display": "61"}, "missing_lines": [36, 37, 38, 39, 40, 42, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 132, 133, 138, 144, 145, 146, 147, 148, 149, 150, 151, 155, 156, 157, 158, 159, 160, 161, 169, 175, 181, 182, 183, 184, 188, 205], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/middleware/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/middleware/errors.py": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16, 19, 20, 23, 24, 26, 27, 28, 29, 37, 41, 43, 44, 45, 53, 61, 62, 64, 65, 79, 80], "summary": {"covered_lines": 33, "num_statements": 43, "percent_covered": 76.74418604651163, "percent_covered_display": "77", "missing_lines": 10, "excluded_lines": 0, "percent_statements_covered": 76.74418604651163, "percent_statements_covered_display": "77"}, "missing_lines": [68, 69, 77, 81, 82, 83, 91, 99, 100, 101], "excluded_lines": [], "functions": {"_request_id": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "register_error_handlers": {"executed_lines": [24, 26, 27, 43, 44, 64, 65, 79, 80], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 23}, "register_error_handlers.api_exception_handler": {"executed_lines": [28, 29, 37, 41], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 27}, "register_error_handlers.http_exception_handler": {"executed_lines": [45, 53, 61, 62], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 44}, "register_error_handlers.validation_exception_handler": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [68, 69, 77], "excluded_lines": [], "start_line": 65}, "register_error_handlers.unhandled_exception_handler": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [81, 82, 83, 91, 99, 100, 101], "excluded_lines": [], "start_line": 80}, "": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16, 19, 23], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16, 19, 20, 23, 24, 26, 27, 28, 29, 37, 41, 43, 44, 45, 53, 61, 62, 64, 65, 79, 80], "summary": {"covered_lines": 33, "num_statements": 43, "percent_covered": 76.74418604651163, "percent_covered_display": "77", "missing_lines": 10, "excluded_lines": 0, "percent_statements_covered": 76.74418604651163, "percent_statements_covered_display": "77"}, "missing_lines": [68, 69, 77, 81, 82, 83, 91, 99, 100, 101], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/middleware/idempotency.py": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 13, 14, 15, 18, 21, 27, 28, 29, 30, 32, 35, 36, 38, 39, 40, 42, 43, 44, 46, 47, 48, 49, 52, 53, 64, 76, 77, 82, 83, 84, 86, 88, 89, 90, 91, 92, 93, 94, 101, 102, 103, 106, 109, 110, 112, 113, 114, 115, 118, 119, 120], "summary": {"covered_lines": 58, "num_statements": 60, "percent_covered": 96.66666666666667, "percent_covered_display": "97", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 96.66666666666667, "percent_statements_covered_display": "97"}, "missing_lines": [65, 111], "excluded_lines": [], "functions": {"IdempotencyMiddleware.__init__": {"executed_lines": [28, 29, 30], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 27}, "IdempotencyMiddleware.dispatch": {"executed_lines": [35, 36, 38, 39, 40, 42, 43, 44, 46, 47, 48, 49, 52, 53, 64, 76, 77, 82, 83, 84, 86, 88, 89, 90, 91, 92, 93, 94, 101, 102, 103, 106], "summary": {"covered_lines": 32, "num_statements": 33, "percent_covered": 96.96969696969697, "percent_covered_display": "97", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 96.96969696969697, "percent_statements_covered_display": "97"}, "missing_lines": [65], "excluded_lines": [], "start_line": 32}, "_collect_body": {"executed_lines": [110, 112, 113, 114, 115], "summary": {"covered_lines": 5, "num_statements": 6, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83"}, "missing_lines": [111], "excluded_lines": [], "start_line": 109}, "_clone_response": {"executed_lines": [119, 120], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 118}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 13, 14, 15, 18, 21, 27, 32, 109, 118], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"IdempotencyMiddleware": {"executed_lines": [28, 29, 30, 35, 36, 38, 39, 40, 42, 43, 44, 46, 47, 48, 49, 52, 53, 64, 76, 77, 82, 83, 84, 86, 88, 89, 90, 91, 92, 93, 94, 101, 102, 103, 106], "summary": {"covered_lines": 35, "num_statements": 36, "percent_covered": 97.22222222222223, "percent_covered_display": "97", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 97.22222222222223, "percent_statements_covered_display": "97"}, "missing_lines": [65], "excluded_lines": [], "start_line": 18}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 13, 14, 15, 18, 21, 27, 32, 109, 110, 112, 113, 114, 115, 118, 119, 120], "summary": {"covered_lines": 23, "num_statements": 24, "percent_covered": 95.83333333333333, "percent_covered_display": "96", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 95.83333333333333, "percent_statements_covered_display": "96"}, "missing_lines": [111], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/middleware/logging.py": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 11, 12, 13, 16, 19, 20, 21, 23, 26, 27, 28, 29, 30, 40, 47], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"RequestLoggingMiddleware.__init__": {"executed_lines": [20, 21], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "RequestLoggingMiddleware.dispatch": {"executed_lines": [26, 27, 28, 29, 30, 40, 47], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 23}, "": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 11, 12, 13, 16, 19, 23], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"RequestLoggingMiddleware": {"executed_lines": [20, 21, 26, 27, 28, 29, 30, 40, 47], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 16}, "": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 11, 12, 13, 16, 19, 23], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/middleware/request_id.py": {"executed_lines": [1, 3, 4, 6, 7, 8, 10, 13, 21, 23, 26, 27, 28, 29, 30, 31, 32, 34], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"RequestIdMiddleware.dispatch": {"executed_lines": [26, 27, 28, 29, 30, 31, 32, 34], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 23}, "": {"executed_lines": [1, 3, 4, 6, 7, 8, 10, 13, 21, 23], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"RequestIdMiddleware": {"executed_lines": [26, 27, 28, 29, 30, 31, 32, 34], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 13}, "": {"executed_lines": [1, 3, 4, 6, 7, 8, 10, 13, 21, 23], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/middleware/tenant.py": {"executed_lines": [3, 5, 7, 8, 9, 11, 14, 17, 19, 22, 25, 26, 27, 28, 30, 31, 44, 45], "summary": {"covered_lines": 18, "num_statements": 19, "percent_covered": 94.73684210526316, "percent_covered_display": "95", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 94.73684210526316, "percent_statements_covered_display": "95"}, "missing_lines": [32], "excluded_lines": [], "functions": {"TenantResolverMiddleware.dispatch": {"executed_lines": [22, 25, 26, 27, 28, 30, 31, 44, 45], "summary": {"covered_lines": 9, "num_statements": 10, "percent_covered": 90.0, "percent_covered_display": "90", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 90.0, "percent_statements_covered_display": "90"}, "missing_lines": [32], "excluded_lines": [], "start_line": 19}, "": {"executed_lines": [3, 5, 7, 8, 9, 11, 14, 17, 19], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"TenantResolverMiddleware": {"executed_lines": [22, 25, 26, 27, 28, 30, 31, 44, 45], "summary": {"covered_lines": 9, "num_statements": 10, "percent_covered": 90.0, "percent_covered_display": "90", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 90.0, "percent_statements_covered_display": "90"}, "missing_lines": [32], "excluded_lines": [], "start_line": 14}, "": {"executed_lines": [3, 5, 7, 8, 9, 11, 14, 17, 19], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/middleware/versioning.py": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 13, 16, 19, 20, 21, 23, 26, 30, 31, 46, 47, 48, 49, 50, 51, 60, 61, 62], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"ApiVersionMiddleware.dispatch": {"executed_lines": [26, 30, 31, 46, 47, 48, 49, 50, 51, 60, 61, 62], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 23}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 13, 16, 19, 20, 21, 23], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"ApiVersionMiddleware": {"executed_lines": [26, 30, 31, 46, 47, 48, 49, 50, 51, 60, 61, 62], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 16}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 13, 16, 19, 20, 21, 23], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/pagination.py": {"executed_lines": [3, 5, 7, 8, 9, 12, 13, 16, 19, 20, 21, 22, 23, 24, 30], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"encode_cursor": {"executed_lines": [13], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 12}, "decode_cursor": {"executed_lines": [19, 20, 21, 22, 23, 24, 30], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 16}, "": {"executed_lines": [3, 5, 7, 8, 9, 12, 16], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 7, 8, 9, 12, 13, 16, 19, 20, 21, 22, 23, 24, 30], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/responses.py": {"executed_lines": [3, 5, 7, 10, 18, 27, 28], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"success_response": {"executed_lines": [18], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 10}, "request_id_from_state": {"executed_lines": [28], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 27}, "": {"executed_lines": [3, 5, 7, 10, 27], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 7, 10, 18, 27, 28], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/access.py": {"executed_lines": [7, 9, 11, 12, 14, 15, 16, 17, 18, 24, 32, 33, 34, 36, 37, 40, 41, 44, 50, 51, 54, 55, 56, 58, 59, 60, 61, 63, 64, 67, 68, 75, 78, 79, 80, 90, 95, 103, 104, 105, 106, 112, 113, 126, 148, 156, 170, 175, 182, 183, 184, 185, 197, 216, 223, 237, 242, 250, 251, 252, 253, 259, 260, 271, 291, 297], "summary": {"covered_lines": 66, "num_statements": 84, "percent_covered": 78.57142857142857, "percent_covered_display": "79", "missing_lines": 18, "excluded_lines": 0, "percent_statements_covered": 78.57142857142857, "percent_statements_covered_display": "79"}, "missing_lines": [82, 107, 114, 137, 138, 143, 144, 186, 205, 206, 211, 212, 254, 261, 280, 281, 286, 287], "excluded_lines": [], "functions": {"_legacy_service_override": {"executed_lines": [41], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 40}, "_resolve_tenant_key": {"executed_lines": [50, 51, 54, 55, 56, 58, 59, 60, 61, 63, 64, 67, 68, 75, 78, 79, 80], "summary": {"covered_lines": 17, "num_statements": 18, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 94.44444444444444, "percent_statements_covered_display": "94"}, "missing_lines": [82], "excluded_lines": [], "start_line": 44}, "check_access": {"executed_lines": [103, 104, 105, 106, 112, 113, 126, 148, 156], "summary": {"covered_lines": 9, "num_statements": 15, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 60.0, "percent_statements_covered_display": "60"}, "missing_lines": [107, 114, 137, 138, 143, 144], "excluded_lines": [], "start_line": 95}, "simulate": {"executed_lines": [182, 183, 184, 185, 197, 216, 223], "summary": {"covered_lines": 7, "num_statements": 12, "percent_covered": 58.333333333333336, "percent_covered_display": "58", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 58.333333333333336, "percent_statements_covered_display": "58"}, "missing_lines": [186, 205, 206, 211, 212], "excluded_lines": [], "start_line": 175}, "check_access_batch": {"executed_lines": [250, 251, 252, 253, 259, 260, 271, 291, 297], "summary": {"covered_lines": 9, "num_statements": 15, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 60.0, "percent_statements_covered_display": "60"}, "missing_lines": [254, 261, 280, 281, 286, 287], "excluded_lines": [], "start_line": 242}, "": {"executed_lines": [7, 9, 11, 12, 14, 15, 16, 17, 18, 24, 32, 33, 34, 36, 37, 40, 44, 90, 95, 170, 175, 237, 242], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [7, 9, 11, 12, 14, 15, 16, 17, 18, 24, 32, 33, 34, 36, 37, 40, 41, 44, 50, 51, 54, 55, 56, 58, 59, 60, 61, 63, 64, 67, 68, 75, 78, 79, 80, 90, 95, 103, 104, 105, 106, 112, 113, 126, 148, 156, 170, 175, 182, 183, 184, 185, 197, 216, 223, 237, 242, 250, 251, 252, 253, 259, 260, 271, 291, 297], "summary": {"covered_lines": 66, "num_statements": 84, "percent_covered": 78.57142857142857, "percent_covered_display": "79", "missing_lines": 18, "excluded_lines": 0, "percent_statements_covered": 78.57142857142857, "percent_statements_covered_display": "79"}, "missing_lines": [82, 107, 114, 137, 138, 143, 144, 186, 205, 206, 211, 212, 254, 261, 280, 281, 286, 287], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/acl.py": {"executed_lines": [1, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 25, 26, 32, 33, 42, 43, 48, 49, 54, 65, 66, 73, 74, 75, 82, 101, 102, 108, 109, 110, 111, 112, 113, 118, 119, 124], "summary": {"covered_lines": 40, "num_statements": 47, "percent_covered": 85.1063829787234, "percent_covered_display": "85", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 85.1063829787234, "percent_statements_covered_display": "85"}, "missing_lines": [27, 50, 51, 78, 79, 120, 121], "excluded_lines": [], "functions": {"create_acl_entry": {"executed_lines": [25, 26, 32, 33, 42, 43, 48, 49, 54], "summary": {"covered_lines": 9, "num_statements": 12, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [27, 50, 51], "excluded_lines": [], "start_line": 19}, "list_acl_entries": {"executed_lines": [73, 74, 75, 82], "summary": {"covered_lines": 4, "num_statements": 6, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [78, 79], "excluded_lines": [], "start_line": 66}, "delete_acl_entry": {"executed_lines": [108, 109, 110, 111, 112, 113, 118, 119, 124], "summary": {"covered_lines": 9, "num_statements": 11, "percent_covered": 81.81818181818181, "percent_covered_display": "82", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 81.81818181818181, "percent_statements_covered_display": "82"}, "missing_lines": [120, 121], "excluded_lines": [], "start_line": 102}, "": {"executed_lines": [1, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 65, 66, 101, 102], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 25, 26, 32, 33, 42, 43, 48, 49, 54, 65, 66, 73, 74, 75, 82, 101, 102, 108, 109, 110, 111, 112, 113, 118, 119, 124], "summary": {"covered_lines": 40, "num_statements": 47, "percent_covered": 85.1063829787234, "percent_covered_display": "85", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 85.1063829787234, "percent_statements_covered_display": "85"}, "missing_lines": [27, 50, 51, 78, 79, 120, 121], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/admin_auth.py": {"executed_lines": [1, 3, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 17, 20, 21, 26, 27, 28, 30, 37, 38, 39, 42, 43, 44, 45, 51, 52, 63], "summary": {"covered_lines": 29, "num_statements": 32, "percent_covered": 90.625, "percent_covered_display": "91", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 90.625, "percent_statements_covered_display": "91"}, "missing_lines": [31, 40, 41], "excluded_lines": [], "functions": {"admin_login": {"executed_lines": [26, 27, 28, 30, 37, 38, 39, 42, 43, 44, 45, 51, 52, 63], "summary": {"covered_lines": 14, "num_statements": 17, "percent_covered": 82.3529411764706, "percent_covered_display": "82", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 82.3529411764706, "percent_statements_covered_display": "82"}, "missing_lines": [31, 40, 41], "excluded_lines": [], "start_line": 21}, "": {"executed_lines": [1, 3, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 17, 20, 21], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 17, 20, 21, 26, 27, 28, 30, 37, 38, 39, 42, 43, 44, 45, 51, 52, 63], "summary": {"covered_lines": 29, "num_statements": 32, "percent_covered": 90.625, "percent_covered_display": "91", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 90.625, "percent_statements_covered_display": "91"}, "missing_lines": [31, 40, 41], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/audit.py": {"executed_lines": [1, 3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 19, 20, 32, 38, 39, 40, 54], "summary": {"covered_lines": 19, "num_statements": 22, "percent_covered": 86.36363636363636, "percent_covered_display": "86", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 86.36363636363636, "percent_statements_covered_display": "86"}, "missing_lines": [33, 50, 51], "excluded_lines": [], "functions": {"list_audit_logs": {"executed_lines": [32, 38, 39, 40, 54], "summary": {"covered_lines": 5, "num_statements": 8, "percent_covered": 62.5, "percent_covered_display": "62", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 62.5, "percent_statements_covered_display": "62"}, "missing_lines": [33, 50, 51], "excluded_lines": [], "start_line": 20}, "": {"executed_lines": [1, 3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 19, 20], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 19, 20, 32, 38, 39, 40, 54], "summary": {"covered_lines": 19, "num_statements": 22, "percent_covered": 86.36363636363636, "percent_covered_display": "86", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 86.36363636363636, "percent_statements_covered_display": "86"}, "missing_lines": [33, 50, 51], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/auth_model.py": {"executed_lines": [1, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 19, 21, 24, 25, 31, 32, 33, 34, 35, 36, 47, 50, 59, 71, 72, 77, 78, 79, 81], "summary": {"covered_lines": 31, "num_statements": 36, "percent_covered": 86.11111111111111, "percent_covered_display": "86", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 86.11111111111111, "percent_statements_covered_display": "86"}, "missing_lines": [51, 52, 55, 56, 80], "excluded_lines": [], "functions": {"create_auth_model": {"executed_lines": [31, 32, 33, 34, 35, 36, 47, 50, 59], "summary": {"covered_lines": 9, "num_statements": 13, "percent_covered": 69.23076923076923, "percent_covered_display": "69", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 69.23076923076923, "percent_statements_covered_display": "69"}, "missing_lines": [51, 52, 55, 56], "excluded_lines": [], "start_line": 25}, "get_auth_model": {"executed_lines": [77, 78, 79, 81], "summary": {"covered_lines": 4, "num_statements": 5, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [80], "excluded_lines": [], "start_line": 72}, "": {"executed_lines": [1, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 19, 21, 24, 25, 71, 72], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 19, 21, 24, 25, 31, 32, 33, 34, 35, 36, 47, 50, 59, 71, 72, 77, 78, 79, 81], "summary": {"covered_lines": 31, "num_statements": 36, "percent_covered": 86.11111111111111, "percent_covered_display": "86", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 86.11111111111111, "percent_statements_covered_display": "86"}, "missing_lines": [51, 52, 55, 56, 80], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/dev.py": {"executed_lines": [1, 3, 5, 6, 7, 8, 9, 10, 11, 13, 16, 17, 18, 21, 22, 26, 27, 32, 33, 39, 40, 41], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"_require_local_dev": {"executed_lines": [17, 18], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 16}, "get_sample_data": {"executed_lines": [26, 27], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 22}, "seed_sample_data": {"executed_lines": [39, 40, 41], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 33}, "": {"executed_lines": [1, 3, 5, 6, 7, 8, 9, 10, 11, 13, 16, 21, 22, 32, 33], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 5, 6, 7, 8, 9, 10, 11, 13, 16, 17, 18, 21, 22, 26, 27, 32, 33, 39, 40, 41], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/health.py": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 11, 13, 16, 17, 18, 21, 22, 23, 26, 27, 32, 33, 34, 38, 48, 54, 55, 56, 57, 62, 63, 64], "summary": {"covered_lines": 30, "num_statements": 40, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 10, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [58, 59, 66, 67, 68, 70, 71, 72, 73, 74], "excluded_lines": [], "functions": {"health": {"executed_lines": [18], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 17}, "liveness": {"executed_lines": [23], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 22}, "readiness": {"executed_lines": [32, 33, 34, 38, 48], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 27}, "_check_database": {"executed_lines": [55, 56, 57], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 60.0, "percent_statements_covered_display": "60"}, "missing_lines": [58, 59], "excluded_lines": [], "start_line": 54}, "_check_redis": {"executed_lines": [63, 64], "summary": {"covered_lines": 2, "num_statements": 10, "percent_covered": 20.0, "percent_covered_display": "20", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 20.0, "percent_statements_covered_display": "20"}, "missing_lines": [66, 67, 68, 70, 71, 72, 73, 74], "excluded_lines": [], "start_line": 62}, "": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 11, 13, 16, 17, 21, 22, 26, 27, 54, 62], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 11, 13, 16, 17, 18, 21, 22, 23, 26, 27, 32, 33, 34, 38, 48, 54, 55, 56, 57, 62, 63, 64], "summary": {"covered_lines": 30, "num_statements": 40, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 10, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [58, 59, 66, 67, 68, 70, 71, 72, 73, 74], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/metrics.py": {"executed_lines": [1, 3, 4, 5, 7, 10, 11, 12], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"metrics": {"executed_lines": [12], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 11}, "": {"executed_lines": [1, 3, 4, 5, 7, 10, 11], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 5, 7, 10, 11, 12], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/permissions.py": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 23, 26, 27, 34, 35, 36, 41, 42, 43, 52, 57, 58, 59, 62, 70, 71, 76, 77, 80, 81, 84, 85, 86, 87, 88, 89, 90, 94, 97, 98, 104, 105, 106, 107, 108, 117, 121, 122, 123, 124, 125, 126, 130, 133, 134, 140, 141, 146, 147, 148, 149, 152, 153, 154, 155, 159, 164, 165, 171, 172, 173, 175, 180], "summary": {"covered_lines": 77, "num_statements": 89, "percent_covered": 86.51685393258427, "percent_covered_display": "87", "missing_lines": 12, "excluded_lines": 0, "percent_statements_covered": 86.51685393258427, "percent_statements_covered_display": "87"}, "missing_lines": [44, 91, 92, 93, 118, 127, 128, 129, 156, 157, 158, 174], "excluded_lines": [], "functions": {"list_permissions": {"executed_lines": [34, 35, 36, 41, 42, 43, 52, 57, 58, 59, 62], "summary": {"covered_lines": 11, "num_statements": 12, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 91.66666666666667, "percent_statements_covered_display": "92"}, "missing_lines": [44], "excluded_lines": [], "start_line": 27}, "create_permission": {"executed_lines": [76, 77, 80, 81, 84, 85, 86, 87, 88, 89, 90, 94], "summary": {"covered_lines": 12, "num_statements": 15, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [91, 92, 93], "excluded_lines": [], "start_line": 71}, "update_permission": {"executed_lines": [104, 105, 106, 107, 108, 117, 121, 122, 123, 124, 125, 126, 130], "summary": {"covered_lines": 13, "num_statements": 17, "percent_covered": 76.47058823529412, "percent_covered_display": "76", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 76.47058823529412, "percent_statements_covered_display": "76"}, "missing_lines": [118, 127, 128, 129], "excluded_lines": [], "start_line": 98}, "delete_permission": {"executed_lines": [140, 141, 146, 147, 148, 149, 152, 153, 154, 155, 159], "summary": {"covered_lines": 11, "num_statements": 14, "percent_covered": 78.57142857142857, "percent_covered_display": "79", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 78.57142857142857, "percent_statements_covered_display": "79"}, "missing_lines": [156, 157, 158], "excluded_lines": [], "start_line": 134}, "list_permission_roles": {"executed_lines": [171, 172, 173, 175, 180], "summary": {"covered_lines": 5, "num_statements": 6, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83"}, "missing_lines": [174], "excluded_lines": [], "start_line": 165}, "": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 23, 26, 27, 70, 71, 97, 98, 133, 134, 164, 165], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 23, 26, 27, 34, 35, 36, 41, 42, 43, 52, 57, 58, 59, 62, 70, 71, 76, 77, 80, 81, 84, 85, 86, 87, 88, 89, 90, 94, 97, 98, 104, 105, 106, 107, 108, 117, 121, 122, 123, 124, 125, 126, 130, 133, 134, 140, 141, 146, 147, 148, 149, 152, 153, 154, 155, 159, 164, 165, 171, 172, 173, 175, 180], "summary": {"covered_lines": 77, "num_statements": 89, "percent_covered": 86.51685393258427, "percent_covered_display": "87", "missing_lines": 12, "excluded_lines": 0, "percent_statements_covered": 86.51685393258427, "percent_statements_covered_display": "87"}, "missing_lines": [44, 91, 92, 93, 118, 127, 128, 129, 156, 157, 158, 174], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/playground.py": {"executed_lines": [3, 5, 7, 8, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 32, 33, 34, 37, 40, 41, 46, 47, 53, 54], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"evaluate": {"executed_lines": [46, 47, 53, 54], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 41}, "": {"executed_lines": [3, 5, 7, 8, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 32, 33, 34, 37, 40, 41], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"PlaygroundPolicy": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 17}, "PlaygroundInput": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 25}, "PlaygroundEvaluateRequest": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 32}, "": {"executed_lines": [3, 5, 7, 8, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 32, 33, 34, 37, 40, 41, 46, 47, 53, 54], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/policies.py": {"executed_lines": [3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 21, 22, 29, 30, 35, 36, 37, 40, 41, 46, 55, 56, 63, 64, 70, 76, 77, 91, 94, 108, 109, 117, 123, 129, 130, 144, 147, 161, 162, 169, 170, 171, 172, 190, 191, 197, 198, 203, 208, 211, 218, 219, 224, 225], "summary": {"covered_lines": 57, "num_statements": 73, "percent_covered": 78.08219178082192, "percent_covered_display": "78", "missing_lines": 16, "excluded_lines": 0, "percent_statements_covered": 78.08219178082192, "percent_statements_covered_display": "78"}, "missing_lines": [42, 43, 65, 71, 87, 88, 118, 124, 140, 141, 175, 199, 200, 226, 227, 230], "excluded_lines": [], "functions": {"list_policies": {"executed_lines": [29, 30, 35, 36, 37, 40, 41, 46], "summary": {"covered_lines": 8, "num_statements": 10, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [42, 43], "excluded_lines": [], "start_line": 22}, "create_policy": {"executed_lines": [63, 64, 70, 76, 77, 91, 94], "summary": {"covered_lines": 7, "num_statements": 11, "percent_covered": 63.63636363636363, "percent_covered_display": "64", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 63.63636363636363, "percent_statements_covered_display": "64"}, "missing_lines": [65, 71, 87, 88], "excluded_lines": [], "start_line": 56}, "update_policy": {"executed_lines": [117, 123, 129, 130, 144, 147], "summary": {"covered_lines": 6, "num_statements": 10, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 60.0, "percent_statements_covered_display": "60"}, "missing_lines": [118, 124, 140, 141], "excluded_lines": [], "start_line": 109}, "create_policy_from_dsl": {"executed_lines": [169, 170, 171, 172], "summary": {"covered_lines": 4, "num_statements": 5, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [175], "excluded_lines": [], "start_line": 162}, "delete_policy": {"executed_lines": [197, 198, 203], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 60.0, "percent_statements_covered_display": "60"}, "missing_lines": [199, 200], "excluded_lines": [], "start_line": 191}, "rollback_policy": {"executed_lines": [218, 219, 224, 225], "summary": {"covered_lines": 4, "num_statements": 7, "percent_covered": 57.142857142857146, "percent_covered_display": "57", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 57.142857142857146, "percent_statements_covered_display": "57"}, "missing_lines": [226, 227, 230], "excluded_lines": [], "start_line": 211}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 21, 22, 55, 56, 108, 109, 161, 162, 190, 191, 208, 211], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 21, 22, 29, 30, 35, 36, 37, 40, 41, 46, 55, 56, 63, 64, 70, 76, 77, 91, 94, 108, 109, 117, 123, 129, 130, 144, 147, 161, 162, 169, 170, 171, 172, 190, 191, 197, 198, 203, 208, 211, 218, 219, 224, 225], "summary": {"covered_lines": 57, "num_statements": 73, "percent_covered": 78.08219178082192, "percent_covered_display": "78", "missing_lines": 16, "excluded_lines": 0, "percent_statements_covered": 78.08219178082192, "percent_statements_covered_display": "78"}, "missing_lines": [42, 43, 65, 71, 87, 88, 118, 124, 140, 141, 175, 199, 200, 226, 227, 230], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/relationships.py": {"executed_lines": [3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 20, 21, 22, 23, 24, 25, 28, 29, 32, 33, 42, 43, 48, 49, 60, 68, 71, 77, 78, 81, 82, 89], "summary": {"covered_lines": 34, "num_statements": 38, "percent_covered": 89.47368421052632, "percent_covered_display": "89", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 89.47368421052632, "percent_statements_covered_display": "89"}, "missing_lines": [56, 57, 85, 86], "excluded_lines": [], "functions": {"list_relationships": {"executed_lines": [42, 43, 48, 49, 60], "summary": {"covered_lines": 5, "num_statements": 7, "percent_covered": 71.42857142857143, "percent_covered_display": "71", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 71.42857142857143, "percent_statements_covered_display": "71"}, "missing_lines": [56, 57], "excluded_lines": [], "start_line": 33}, "create_relationship": {"executed_lines": [77, 78, 81, 82, 89], "summary": {"covered_lines": 5, "num_statements": 7, "percent_covered": 71.42857142857143, "percent_covered_display": "71", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 71.42857142857143, "percent_statements_covered_display": "71"}, "missing_lines": [85, 86], "excluded_lines": [], "start_line": 71}, "": {"executed_lines": [3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 20, 21, 22, 23, 24, 25, 28, 29, 32, 33, 68, 71], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"RelationshipCreate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 20}, "RelationshipOut": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 28}, "": {"executed_lines": [3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 20, 21, 22, 23, 24, 25, 28, 29, 32, 33, 42, 43, 48, 49, 60, 68, 71, 77, 78, 81, 82, 89], "summary": {"covered_lines": 34, "num_statements": 38, "percent_covered": 89.47368421052632, "percent_covered_display": "89", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 89.47368421052632, "percent_statements_covered_display": "89"}, "missing_lines": [56, 57, 85, 86], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/roles.py": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 22, 23, 30, 31, 37, 38, 39, 40, 46, 49, 50, 51, 54, 62, 63, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 82, 85, 86, 92, 93, 94, 95, 96, 101, 103, 104, 105, 106, 107, 108, 112, 115, 116, 122, 123, 133, 134, 135, 136, 137, 138, 139, 140, 141, 145, 150, 151, 157, 158, 163, 165, 174, 179, 186, 187, 188, 189, 191, 193, 194, 195, 196, 197, 198, 204, 210, 213, 220, 221, 222, 223, 225, 227, 228, 229, 230, 231, 232, 238], "summary": {"covered_lines": 106, "num_statements": 128, "percent_covered": 82.8125, "percent_covered_display": "83", "missing_lines": 22, "excluded_lines": 0, "percent_statements_covered": 82.8125, "percent_statements_covered_display": "83"}, "missing_lines": [32, 79, 80, 81, 102, 109, 110, 111, 142, 143, 144, 164, 190, 192, 199, 200, 201, 224, 226, 233, 234, 235], "excluded_lines": [], "functions": {"list_roles": {"executed_lines": [30, 31, 37, 38, 39, 40, 46, 49, 50, 51, 54], "summary": {"covered_lines": 11, "num_statements": 12, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 91.66666666666667, "percent_statements_covered_display": "92"}, "missing_lines": [32], "excluded_lines": [], "start_line": 23}, "create_role": {"executed_lines": [68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 82], "summary": {"covered_lines": 12, "num_statements": 15, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [79, 80, 81], "excluded_lines": [], "start_line": 63}, "update_role": {"executed_lines": [92, 93, 94, 95, 96, 101, 103, 104, 105, 106, 107, 108, 112], "summary": {"covered_lines": 13, "num_statements": 17, "percent_covered": 76.47058823529412, "percent_covered_display": "76", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 76.47058823529412, "percent_statements_covered_display": "76"}, "missing_lines": [102, 109, 110, 111], "excluded_lines": [], "start_line": 86}, "delete_role": {"executed_lines": [122, 123, 133, 134, 135, 136, 137, 138, 139, 140, 141, 145], "summary": {"covered_lines": 12, "num_statements": 15, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [142, 143, 144], "excluded_lines": [], "start_line": 116}, "list_role_permissions": {"executed_lines": [157, 158, 163, 165], "summary": {"covered_lines": 4, "num_statements": 5, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [164], "excluded_lines": [], "start_line": 151}, "add_permission_to_role": {"executed_lines": [186, 187, 188, 189, 191, 193, 194, 195, 196, 197, 198, 204], "summary": {"covered_lines": 12, "num_statements": 17, "percent_covered": 70.58823529411765, "percent_covered_display": "71", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 70.58823529411765, "percent_statements_covered_display": "71"}, "missing_lines": [190, 192, 199, 200, 201], "excluded_lines": [], "start_line": 179}, "remove_permission_from_role": {"executed_lines": [220, 221, 222, 223, 225, 227, 228, 229, 230, 231, 232, 238], "summary": {"covered_lines": 12, "num_statements": 17, "percent_covered": 70.58823529411765, "percent_covered_display": "71", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 70.58823529411765, "percent_statements_covered_display": "71"}, "missing_lines": [224, 226, 233, 234, 235], "excluded_lines": [], "start_line": 213}, "": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 22, 23, 62, 63, 85, 86, 115, 116, 150, 151, 174, 179, 210, 213], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 22, 23, 30, 31, 37, 38, 39, 40, 46, 49, 50, 51, 54, 62, 63, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 82, 85, 86, 92, 93, 94, 95, 96, 101, 103, 104, 105, 106, 107, 108, 112, 115, 116, 122, 123, 133, 134, 135, 136, 137, 138, 139, 140, 141, 145, 150, 151, 157, 158, 163, 165, 174, 179, 186, 187, 188, 189, 191, 193, 194, 195, 196, 197, 198, 204, 210, 213, 220, 221, 222, 223, 225, 227, 228, 229, 230, 231, 232, 238], "summary": {"covered_lines": 106, "num_statements": 128, "percent_covered": 82.8125, "percent_covered_display": "83", "missing_lines": 22, "excluded_lines": 0, "percent_statements_covered": 82.8125, "percent_statements_covered_display": "83"}, "missing_lines": [32, 79, 80, 81, 102, 109, 110, 111, 142, 143, 144, 164, 190, 192, 199, 200, 201, 224, 226, 233, 234, 235], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/routes/simulation.py": {"executed_lines": [1, 3, 4, 6, 7, 8, 9, 10, 11, 18, 21, 22, 28, 29, 30, 34, 35, 51, 70, 71, 77, 78, 89, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 108, 110, 112, 113, 114, 115, 116], "summary": {"covered_lines": 40, "num_statements": 51, "percent_covered": 78.43137254901961, "percent_covered_display": "78", "missing_lines": 11, "excluded_lines": 0, "percent_statements_covered": 78.43137254901961, "percent_statements_covered_display": "78"}, "missing_lines": [31, 43, 44, 47, 48, 81, 82, 85, 86, 109, 111], "excluded_lines": [], "functions": {"simulate_policy": {"executed_lines": [28, 29, 30, 34, 35, 51], "summary": {"covered_lines": 6, "num_statements": 11, "percent_covered": 54.54545454545455, "percent_covered_display": "55", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 54.54545454545455, "percent_statements_covered_display": "55"}, "missing_lines": [31, 43, 44, 47, 48], "excluded_lines": [], "start_line": 22}, "impact_analysis": {"executed_lines": [77, 78, 89], "summary": {"covered_lines": 3, "num_statements": 7, "percent_covered": 42.857142857142854, "percent_covered_display": "43", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 42.857142857142854, "percent_statements_covered_display": "43"}, "missing_lines": [81, 82, 85, 86], "excluded_lines": [], "start_line": 71}, "_normalize_request": {"executed_lines": [96, 97, 98, 99, 100, 101, 102, 103, 104, 108, 110, 112, 113, 114, 115, 116], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 88.88888888888889, "percent_statements_covered_display": "89"}, "missing_lines": [109, 111], "excluded_lines": [], "start_line": 95}, "": {"executed_lines": [1, 3, 4, 6, 7, 8, 9, 10, 11, 18, 21, 22, 70, 71, 95], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 6, 7, 8, 9, 10, 11, 18, 21, 22, 28, 29, 30, 34, 35, 51, 70, 71, 77, 78, 89, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 108, 110, 112, 113, 114, 115, 116], "summary": {"covered_lines": 40, "num_statements": 51, "percent_covered": 78.43137254901961, "percent_covered_display": "78", "missing_lines": 11, "excluded_lines": 0, "percent_statements_covered": 78.43137254901961, "percent_statements_covered_display": "78"}, "missing_lines": [31, 43, 44, 47, 48, 81, 82, 85, 86, 109, 111], "excluded_lines": [], "start_line": 1}}}, "keynetra/api/service_modes.py": {"executed_lines": [1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 45], "summary": {"covered_lines": 37, "num_statements": 38, "percent_covered": 97.36842105263158, "percent_covered_display": "97", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 97.36842105263158, "percent_statements_covered_display": "97"}, "missing_lines": [43], "excluded_lines": [], "functions": {"router_for_mode": {"executed_lines": [22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 45], "summary": {"covered_lines": 20, "num_statements": 21, "percent_covered": 95.23809523809524, "percent_covered_display": "95", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 95.23809523809524, "percent_statements_covered_display": "95"}, "missing_lines": [43], "excluded_lines": [], "start_line": 21}, "": {"executed_lines": [1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 45], "summary": {"covered_lines": 37, "num_statements": 38, "percent_covered": 97.36842105263158, "percent_covered_display": "97", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 97.36842105263158, "percent_statements_covered_display": "97"}, "missing_lines": [43], "excluded_lines": [], "start_line": 1}}}, "keynetra/cli.py": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 40, 41, 42, 43, 44, 45, 48, 54, 55, 56, 57, 58, 59, 60, 63, 64, 70, 72, 75, 76, 77, 78, 79, 80, 83, 84, 85, 86, 87, 88, 90, 93, 94, 95, 96, 99, 100, 101, 102, 103, 104, 105, 106, 108, 111, 112, 121, 122, 123, 124, 131, 132, 141, 142, 143, 144, 151, 154, 156, 157, 164, 165, 166, 174, 175, 178, 181, 182, 183, 184, 185, 186, 187, 188, 193, 194, 197, 198, 199, 201, 202, 206, 220, 222, 229, 230, 231, 232, 233, 234, 235, 237, 244, 245, 246, 247, 248, 249, 251, 258, 259, 260, 261, 262, 264, 265, 266, 275, 284, 295, 304, 305, 308, 311, 312, 321, 322, 323, 329, 330, 333, 334, 337, 384, 385, 394, 396, 397, 399, 400, 401, 402, 403, 404, 405, 406, 407, 413, 414, 417, 418, 426, 428, 429, 430, 431, 432, 433, 435, 437, 453, 454, 465, 466, 468, 469, 470, 471, 472, 473, 479, 480, 483, 484, 491, 492, 493, 494, 497, 498, 502, 503, 504, 507, 508, 519, 520, 521, 530, 536, 537, 540, 541, 548, 549, 550, 556, 557, 560, 561, 570, 572, 573, 574, 575, 576, 577, 578, 588, 590, 605, 606, 613, 614, 615, 617, 618, 619, 624, 625, 628, 629, 640, 641, 642, 643, 644, 646, 647, 648, 668, 669, 693, 694, 734, 735, 741, 743, 744, 745, 746, 754, 756, 757, 758, 761, 762, 798, 806, 807, 808, 810, 811, 812, 813, 814, 815, 816, 818, 819, 822, 823, 825, 826, 827, 828, 829, 830, 833, 834, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 862, 865, 866, 875, 876, 877, 878, 879, 880, 881, 882, 883, 892, 895, 896, 897, 899, 902, 903, 908, 909, 910, 911, 912, 913, 916, 918, 921, 922, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 942, 943, 944, 946, 949, 950, 951, 952, 958, 959, 962, 963, 964, 980, 981, 984, 985, 988], "summary": {"covered_lines": 362, "num_statements": 431, "percent_covered": 83.9907192575406, "percent_covered_display": "84", "missing_lines": 69, "excluded_lines": 0, "percent_statements_covered": 83.9907192575406, "percent_statements_covered_display": "84"}, "missing_lines": [71, 89, 107, 189, 190, 191, 203, 204, 294, 408, 409, 410, 411, 412, 650, 652, 653, 675, 677, 678, 679, 680, 681, 682, 684, 685, 686, 687, 689, 690, 702, 704, 705, 706, 707, 708, 709, 711, 712, 713, 714, 715, 717, 718, 719, 720, 730, 731, 747, 748, 749, 750, 751, 752, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 783, 794, 795, 824, 989], "excluded_lines": [], "functions": {"cli_root": {"executed_lines": [70, 72], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [71], "excluded_lines": [], "start_line": 64}, "_load_config": {"executed_lines": [76, 77, 78, 79, 80], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 75}, "_effective_config_path": {"executed_lines": [84, 85, 86, 87, 88, 90], "summary": {"covered_lines": 6, "num_statements": 7, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 85.71428571428571, "percent_statements_covered_display": "86"}, "missing_lines": [89], "excluded_lines": [], "start_line": 83}, "_maybe_load_config": {"executed_lines": [94, 95, 96], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 93}, "_resolve_url": {"executed_lines": [100, 101, 102, 103, 104, 105, 106, 108], "summary": {"covered_lines": 8, "num_statements": 9, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 88.88888888888889, "percent_statements_covered_display": "89"}, "missing_lines": [107], "excluded_lines": [], "start_line": 99}, "start": {"executed_lines": [121, 122, 123, 124], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 112}, "serve": {"executed_lines": [141, 142, 143, 144], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 132}, "_run_server": {"executed_lines": [154, 156, 157, 164, 165, 166, 174, 175], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 151}, "_render_startup_screen": {"executed_lines": [181, 182, 183, 184, 185, 186, 187, 188, 193, 194, 197, 198, 199, 201, 202, 206, 220, 222, 229, 230, 231, 232, 233, 234, 235, 237, 244, 245, 246, 247, 248, 249, 251, 258, 259, 260, 261, 262, 264, 265, 266, 275, 284, 295], "summary": {"covered_lines": 44, "num_statements": 50, "percent_covered": 88.0, "percent_covered_display": "88", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 88.0, "percent_statements_covered_display": "88"}, "missing_lines": [189, 190, 191, 203, 204, 294], "excluded_lines": [], "start_line": 178}, "version": {"executed_lines": [308], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 305}, "admin_login": {"executed_lines": [321, 322, 323, 329, 330], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 312}, "help_cli": {"executed_lines": [337], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 334}, "migrate": {"executed_lines": [394, 396, 397, 399, 400, 401, 402, 403, 404, 405, 406, 407, 413, 414], "summary": {"covered_lines": 14, "num_statements": 19, "percent_covered": 73.6842105263158, "percent_covered_display": "74", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 73.6842105263158, "percent_statements_covered_display": "74"}, "missing_lines": [408, 409, 410, 411, 412], "excluded_lines": [], "start_line": 385}, "seed_data": {"executed_lines": [426, 428, 429, 430, 431, 432, 433, 435, 437], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 418}, "check": {"executed_lines": [465, 466, 468, 469, 470, 471, 472, 473, 479, 480], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 454}, "model_apply": {"executed_lines": [491, 492, 493, 494], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 484}, "model_show": {"executed_lines": [502, 503, 504], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 498}, "simulate": {"executed_lines": [519, 520, 521, 530, 536, 537], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 508}, "impact": {"executed_lines": [548, 549, 550, 556, 557], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 541}, "explain": {"executed_lines": [570, 572, 573, 574, 575, 576, 577, 578, 588, 590], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 561}, "test_policy": {"executed_lines": [613, 614, 615, 617, 618, 619, 624, 625], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 606}, "compile_policies": {"executed_lines": [640, 641, 642, 643, 644, 646, 647, 648], "summary": {"covered_lines": 8, "num_statements": 11, "percent_covered": 72.72727272727273, "percent_covered_display": "73", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 72.72727272727273, "percent_statements_covered_display": "73"}, "missing_lines": [650, 652, 653], "excluded_lines": [], "start_line": 629}, "generate_openapi": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 13, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 13, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [675, 677, 678, 679, 680, 681, 682, 684, 685, 686, 687, 689, 690], "excluded_lines": [], "start_line": 669}, "check_openapi": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 18, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 18, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [702, 704, 705, 706, 707, 708, 709, 711, 712, 713, 714, 715, 717, 718, 719, 720, 730, 731], "excluded_lines": [], "start_line": 694}, "doctor": {"executed_lines": [741, 743, 744, 745, 746, 754, 756, 757, 758], "summary": {"covered_lines": 9, "num_statements": 15, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 60.0, "percent_statements_covered_display": "60"}, "missing_lines": [747, 748, 749, 750, 751, 752], "excluded_lines": [], "start_line": 735}, "config_doctor": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 13, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 13, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 783, 794, 795], "excluded_lines": [], "start_line": 762}, "_run_benchmark": {"executed_lines": [806, 807, 808, 810, 818, 819], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 798}, "_run_benchmark.send_request": {"executed_lines": [811, 812, 813, 814, 815, 816], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 810}, "_percentile": {"executed_lines": [823, 825, 826, 827, 828, 829, 830], "summary": {"covered_lines": 7, "num_statements": 8, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 87.5, "percent_statements_covered_display": "88"}, "missing_lines": [824], "excluded_lines": [], "start_line": 822}, "benchmark": {"executed_lines": [843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 862], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 834}, "acl_add": {"executed_lines": [875, 876, 877, 878, 879, 880, 881, 882, 883, 892, 895, 896, 897, 899], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 866}, "acl_list": {"executed_lines": [908, 909, 910, 911, 912, 913, 916, 918], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 903}, "acl_remove": {"executed_lines": [926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 942, 943, 944, 946], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 922}, "_read_applied_revisions": {"executed_lines": [950, 951, 952, 958, 959], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 949}, "_build_authorization_service": {"executed_lines": [963, 964], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 962}, "_coerce_scalar": {"executed_lines": [981], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 980}, "main": {"executed_lines": [985], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 984}, "": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 40, 41, 42, 43, 44, 45, 48, 54, 55, 56, 57, 58, 59, 60, 63, 64, 75, 83, 93, 99, 111, 112, 131, 132, 151, 178, 304, 305, 311, 312, 333, 334, 384, 385, 417, 418, 453, 454, 483, 484, 497, 498, 507, 508, 540, 541, 560, 561, 605, 606, 628, 629, 668, 669, 693, 694, 734, 735, 761, 762, 798, 822, 833, 834, 865, 866, 902, 903, 921, 922, 949, 962, 980, 984, 988], "summary": {"covered_lines": 105, "num_statements": 106, "percent_covered": 99.05660377358491, "percent_covered_display": "99", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 99.05660377358491, "percent_statements_covered_display": "99"}, "missing_lines": [989], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 40, 41, 42, 43, 44, 45, 48, 54, 55, 56, 57, 58, 59, 60, 63, 64, 70, 72, 75, 76, 77, 78, 79, 80, 83, 84, 85, 86, 87, 88, 90, 93, 94, 95, 96, 99, 100, 101, 102, 103, 104, 105, 106, 108, 111, 112, 121, 122, 123, 124, 131, 132, 141, 142, 143, 144, 151, 154, 156, 157, 164, 165, 166, 174, 175, 178, 181, 182, 183, 184, 185, 186, 187, 188, 193, 194, 197, 198, 199, 201, 202, 206, 220, 222, 229, 230, 231, 232, 233, 234, 235, 237, 244, 245, 246, 247, 248, 249, 251, 258, 259, 260, 261, 262, 264, 265, 266, 275, 284, 295, 304, 305, 308, 311, 312, 321, 322, 323, 329, 330, 333, 334, 337, 384, 385, 394, 396, 397, 399, 400, 401, 402, 403, 404, 405, 406, 407, 413, 414, 417, 418, 426, 428, 429, 430, 431, 432, 433, 435, 437, 453, 454, 465, 466, 468, 469, 470, 471, 472, 473, 479, 480, 483, 484, 491, 492, 493, 494, 497, 498, 502, 503, 504, 507, 508, 519, 520, 521, 530, 536, 537, 540, 541, 548, 549, 550, 556, 557, 560, 561, 570, 572, 573, 574, 575, 576, 577, 578, 588, 590, 605, 606, 613, 614, 615, 617, 618, 619, 624, 625, 628, 629, 640, 641, 642, 643, 644, 646, 647, 648, 668, 669, 693, 694, 734, 735, 741, 743, 744, 745, 746, 754, 756, 757, 758, 761, 762, 798, 806, 807, 808, 810, 811, 812, 813, 814, 815, 816, 818, 819, 822, 823, 825, 826, 827, 828, 829, 830, 833, 834, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 862, 865, 866, 875, 876, 877, 878, 879, 880, 881, 882, 883, 892, 895, 896, 897, 899, 902, 903, 908, 909, 910, 911, 912, 913, 916, 918, 921, 922, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 942, 943, 944, 946, 949, 950, 951, 952, 958, 959, 962, 963, 964, 980, 981, 984, 985, 988], "summary": {"covered_lines": 362, "num_statements": 431, "percent_covered": 83.9907192575406, "percent_covered_display": "84", "missing_lines": 69, "excluded_lines": 0, "percent_statements_covered": 83.9907192575406, "percent_statements_covered_display": "84"}, "missing_lines": [71, 89, 107, 189, 190, 191, 203, 204, 294, 408, 409, 410, 411, 412, 650, 652, 653, 675, 677, 678, 679, 680, 681, 682, 684, 685, 686, 687, 689, 690, 702, 704, 705, 706, 707, 708, 709, 711, 712, 713, 714, 715, 717, 718, 719, 720, 730, 731, 747, 748, 749, 750, 751, 752, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 783, 794, 795, 824, 989], "excluded_lines": [], "start_line": 1}}}, "keynetra/config/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/config/admin_auth.py": {"executed_lines": [1, 3, 4, 6, 8, 9, 10, 11, 13, 16, 17, 18, 19, 20, 23, 24, 25, 27, 32, 33, 34, 37, 38, 39, 45, 46, 56, 57, 58, 59, 61, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 76, 77, 80, 81, 82, 83, 84, 85, 86, 89, 90, 91, 92, 93, 95, 96, 99, 101, 102, 104, 105, 106, 108, 109, 110, 111, 112, 117, 120, 121, 124, 125, 127, 128, 129, 131, 132, 139, 140], "summary": {"covered_lines": 80, "num_statements": 86, "percent_covered": 93.02325581395348, "percent_covered_display": "93", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 93.02325581395348, "percent_statements_covered_display": "93"}, "missing_lines": [72, 78, 94, 100, 114, 142], "excluded_lines": [], "functions": {"require_management_role": {"executed_lines": [24, 25, 27, 61], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 23}, "require_management_role.dependency": {"executed_lines": [32, 33, 34, 37, 38, 39, 45, 46, 56, 57, 58, 59], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 27}, "_resolve_tenant_role": {"executed_lines": [65, 66, 67, 68, 69, 70, 71, 73, 74, 76, 77, 80, 81, 82, 83, 84, 85, 86, 89, 90, 91, 92, 93, 95, 96, 99, 101, 102, 104, 105, 106, 108, 109, 110, 111, 112], "summary": {"covered_lines": 36, "num_statements": 41, "percent_covered": 87.8048780487805, "percent_covered_display": "88", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 87.8048780487805, "percent_statements_covered_display": "88"}, "missing_lines": [72, 78, 94, 100, 114], "excluded_lines": [], "start_line": 64}, "_resolve_request_tenant_key": {"executed_lines": [120, 121, 124, 125, 127, 128, 129, 131, 132, 139, 140], "summary": {"covered_lines": 11, "num_statements": 12, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 91.66666666666667, "percent_statements_covered_display": "92"}, "missing_lines": [142], "excluded_lines": [], "start_line": 117}, "": {"executed_lines": [1, 3, 4, 6, 8, 9, 10, 11, 13, 16, 17, 18, 19, 20, 23, 64, 117], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"AdminAccess": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 17}, "": {"executed_lines": [1, 3, 4, 6, 8, 9, 10, 11, 13, 16, 17, 18, 19, 20, 23, 24, 25, 27, 32, 33, 34, 37, 38, 39, 45, 46, 56, 57, 58, 59, 61, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 76, 77, 80, 81, 82, 83, 84, 85, 86, 89, 90, 91, 92, 93, 95, 96, 99, 101, 102, 104, 105, 106, 108, 109, 110, 111, 112, 117, 120, 121, 124, 125, 127, 128, 129, 131, 132, 139, 140], "summary": {"covered_lines": 80, "num_statements": 86, "percent_covered": 93.02325581395348, "percent_covered_display": "93", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 93.02325581395348, "percent_statements_covered_display": "93"}, "missing_lines": [72, 78, 94, 100, 114, 142], "excluded_lines": [], "start_line": 1}}}, "keynetra/config/config_loader.py": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 10, 11, 16, 17, 18, 19, 20, 21, 22, 23, 24, 27, 28, 29, 30, 32, 33, 35, 36, 37, 38, 39, 41, 42, 44, 45, 46, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 66, 67, 68, 69, 70, 71, 72, 73, 75, 86, 89, 90, 92, 93, 94, 95, 96, 97, 98, 100, 103, 104, 105, 106, 107, 110, 111, 112, 113, 114, 115, 119, 120, 121, 122, 123, 128, 129, 130], "summary": {"covered_lines": 88, "num_statements": 104, "percent_covered": 84.61538461538461, "percent_covered_display": "85", "missing_lines": 16, "excluded_lines": 2, "percent_statements_covered": 84.61538461538461, "percent_statements_covered_display": "85"}, "missing_lines": [34, 43, 91, 99, 116, 124, 125, 131, 132, 133, 134, 135, 136, 137, 138, 139], "excluded_lines": [12, 13], "functions": {"load_config_file": {"executed_lines": [28, 29, 30, 32, 33, 35, 36, 37, 38, 39, 41, 42, 44, 45, 46], "summary": {"covered_lines": 15, "num_statements": 17, "percent_covered": 88.23529411764706, "percent_covered_display": "88", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 88.23529411764706, "percent_statements_covered_display": "88"}, "missing_lines": [34, 43], "excluded_lines": [], "start_line": 27}, "apply_config_to_environment": {"executed_lines": [50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 49}, "_normalize_config": {"executed_lines": [67, 68, 69, 70, 71, 72, 73, 75], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 66}, "_paths_from_payload": {"executed_lines": [89, 90, 92, 93, 94, 95, 96, 97, 98, 100], "summary": {"covered_lines": 10, "num_statements": 12, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83"}, "missing_lines": [91, 99], "excluded_lines": [], "start_line": 86}, "_nested": {"executed_lines": [104, 105, 106, 107], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 103}, "_as_str": {"executed_lines": [111, 112, 113, 114, 115], "summary": {"covered_lines": 5, "num_statements": 6, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83"}, "missing_lines": [116], "excluded_lines": [], "start_line": 110}, "_as_int": {"executed_lines": [120, 121, 122, 123], "summary": {"covered_lines": 4, "num_statements": 6, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [124, 125], "excluded_lines": [], "start_line": 119}, "_as_bool": {"executed_lines": [129, 130], "summary": {"covered_lines": 2, "num_statements": 11, "percent_covered": 18.181818181818183, "percent_covered_display": "18", "missing_lines": 9, "excluded_lines": 0, "percent_statements_covered": 18.181818181818183, "percent_statements_covered_display": "18"}, "missing_lines": [131, 132, 133, 134, 135, 136, 137, 138, 139], "excluded_lines": [], "start_line": 128}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 10, 11, 16, 17, 18, 19, 20, 21, 22, 23, 24, 27, 49, 66, 86, 103, 110, 119, 128], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [12, 13], "start_line": 1}}, "classes": {"KeyNetraFileConfig": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 17}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 10, 11, 16, 17, 18, 19, 20, 21, 22, 23, 24, 27, 28, 29, 30, 32, 33, 35, 36, 37, 38, 39, 41, 42, 44, 45, 46, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 66, 67, 68, 69, 70, 71, 72, 73, 75, 86, 89, 90, 92, 93, 94, 95, 96, 97, 98, 100, 103, 104, 105, 106, 107, 110, 111, 112, 113, 114, 115, 119, 120, 121, 122, 123, 128, 129, 130], "summary": {"covered_lines": 88, "num_statements": 104, "percent_covered": 84.61538461538461, "percent_covered_display": "85", "missing_lines": 16, "excluded_lines": 2, "percent_statements_covered": 84.61538461538461, "percent_statements_covered_display": "85"}, "missing_lines": [34, 43, 91, 99, 116, 124, 125, 131, 132, 133, 134, 135, 136, 137, 138, 139], "excluded_lines": [12, 13], "start_line": 1}}}, "keynetra/config/file_loaders.py": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 14, 15, 16, 17, 18, 19, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 63, 64, 65, 66, 67, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 86, 87, 89, 90, 91, 92, 95, 97, 98, 99, 100, 101, 102, 103, 104, 107, 108, 110, 111, 112, 113, 114, 115, 116, 118, 119, 120, 121, 122, 133, 136, 137, 138, 139, 143, 144, 145, 146, 147, 148, 149, 150, 151, 160, 161, 162, 163, 164, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 191, 194, 195, 196, 198, 199, 200, 201, 202, 203, 204, 205, 206, 209, 210, 211, 212, 213, 214, 215, 216, 218, 219, 221, 222, 223, 224, 225, 228, 229, 230, 232, 233, 234, 235, 236, 239, 240, 242, 243, 244, 246], "summary": {"covered_lines": 160, "num_statements": 178, "percent_covered": 89.88764044943821, "percent_covered_display": "90", "missing_lines": 18, "excluded_lines": 2, "percent_statements_covered": 89.88764044943821, "percent_statements_covered_display": "90"}, "missing_lines": [42, 57, 58, 59, 60, 61, 62, 77, 88, 93, 109, 117, 141, 142, 165, 197, 226, 237], "excluded_lines": [10, 11], "functions": {"load_policies_from_paths": {"executed_lines": [15, 16, 17, 18, 19, 27, 28, 29, 30, 31, 32], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 14}, "load_policies_from_file": {"executed_lines": [36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 48, 49, 50], "summary": {"covered_lines": 13, "num_statements": 14, "percent_covered": 92.85714285714286, "percent_covered_display": "93", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 92.85714285714286, "percent_statements_covered_display": "93"}, "missing_lines": [42], "excluded_lines": [], "start_line": 35}, "load_authorization_model_from_paths": {"executed_lines": [54, 55, 56, 63, 64, 65, 66, 67], "summary": {"covered_lines": 8, "num_statements": 14, "percent_covered": 57.142857142857146, "percent_covered_display": "57", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 57.142857142857146, "percent_statements_covered_display": "57"}, "missing_lines": [57, 58, 59, 60, 61, 62], "excluded_lines": [], "start_line": 53}, "_load_model_file_if_supported": {"executed_lines": [71, 72, 73, 74, 75, 76], "summary": {"covered_lines": 6, "num_statements": 7, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 85.71428571428571, "percent_statements_covered_display": "86"}, "missing_lines": [77], "excluded_lines": [], "start_line": 70}, "load_authorization_model_from_file": {"executed_lines": [81, 82, 83, 86, 87, 89, 90, 91, 92, 95, 97, 98, 99, 100, 101, 102, 103, 104], "summary": {"covered_lines": 18, "num_statements": 20, "percent_covered": 90.0, "percent_covered_display": "90", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 90.0, "percent_statements_covered_display": "90"}, "missing_lines": [88, 93], "excluded_lines": [], "start_line": 80}, "_normalize_policy_payload": {"executed_lines": [108, 110, 111, 112, 113, 114, 115, 116, 118, 119, 120, 121, 122, 133], "summary": {"covered_lines": 14, "num_statements": 16, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 87.5, "percent_statements_covered_display": "88"}, "missing_lines": [109, 117], "excluded_lines": [], "start_line": 107}, "_policy_from_effect_block": {"executed_lines": [137, 138, 139, 143, 144, 145, 146, 147, 148, 149, 150, 151], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 85.71428571428571, "percent_statements_covered_display": "86"}, "missing_lines": [141, 142], "excluded_lines": [], "start_line": 136}, "_parse_polar_policy_lines": {"executed_lines": [161, 162, 163, 164, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 191], "summary": {"covered_lines": 22, "num_statements": 23, "percent_covered": 95.65217391304348, "percent_covered_display": "96", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 95.65217391304348, "percent_statements_covered_display": "96"}, "missing_lines": [165], "excluded_lines": [], "start_line": 160}, "_coerce_scalar": {"executed_lines": [195, 196, 198, 199, 200, 201, 202, 203, 204, 205, 206], "summary": {"covered_lines": 11, "num_statements": 12, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 91.66666666666667, "percent_statements_covered_display": "92"}, "missing_lines": [197], "excluded_lines": [], "start_line": 194}, "_model_mapping_to_schema": {"executed_lines": [210, 211, 212, 213, 214, 215, 216, 218, 219, 221, 222, 223, 224, 225, 228, 229, 230, 232, 233, 234, 235, 236, 239, 240, 242, 243, 244, 246], "summary": {"covered_lines": 28, "num_statements": 30, "percent_covered": 93.33333333333333, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 93.33333333333333, "percent_statements_covered_display": "93"}, "missing_lines": [226, 237], "excluded_lines": [], "start_line": 209}, "": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 14, 35, 53, 70, 80, 107, 136, 160, 194, 209], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [10, 11], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 14, 15, 16, 17, 18, 19, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 63, 64, 65, 66, 67, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 86, 87, 89, 90, 91, 92, 95, 97, 98, 99, 100, 101, 102, 103, 104, 107, 108, 110, 111, 112, 113, 114, 115, 116, 118, 119, 120, 121, 122, 133, 136, 137, 138, 139, 143, 144, 145, 146, 147, 148, 149, 150, 151, 160, 161, 162, 163, 164, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 191, 194, 195, 196, 198, 199, 200, 201, 202, 203, 204, 205, 206, 209, 210, 211, 212, 213, 214, 215, 216, 218, 219, 221, 222, 223, 224, 225, 228, 229, 230, 232, 233, 234, 235, 236, 239, 240, 242, 243, 244, 246], "summary": {"covered_lines": 160, "num_statements": 178, "percent_covered": 89.88764044943821, "percent_covered_display": "90", "missing_lines": 18, "excluded_lines": 2, "percent_statements_covered": 89.88764044943821, "percent_statements_covered_display": "90"}, "missing_lines": [42, 57, 58, 59, 60, 61, 62, 77, 88, 93, 109, 117, 141, 142, 165, 197, 226, 237], "excluded_lines": [10, 11], "start_line": 1}}}, "keynetra/config/policies.py": {"executed_lines": [3, 5, 7], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 5, 7], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 7], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/config/rate_limit.py": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 17, 18, 19, 21, 24, 25, 26, 27, 30, 31, 32, 33, 73, 74, 75, 76, 77, 78, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 106, 107, 108, 109, 119, 120, 121, 122, 123, 124, 127, 128, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 150, 151, 170, 171, 172, 173, 174], "summary": {"covered_lines": 85, "num_statements": 85, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"RateLimitMiddleware.__init__": {"executed_lines": [75, 76, 77, 78], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 74}, "RateLimitMiddleware.dispatch": {"executed_lines": [81, 82, 84, 85, 86, 87, 88, 89, 90, 91], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 80}, "RateLimitMiddleware._consume": {"executed_lines": [94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 106, 107, 108, 109, 119, 120, 121, 122, 123, 124, 127, 128, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 93}, "RateLimitMiddleware._limited_response": {"executed_lines": [151], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 150}, "": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 17, 18, 19, 21, 24, 25, 26, 27, 30, 31, 32, 33, 73, 74, 80, 93, 150, 170, 171, 172, 173, 174], "summary": {"covered_lines": 33, "num_statements": 33, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"_LocalBucket": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 25}, "RateLimitMiddleware": {"executed_lines": [75, 76, 77, 78, 81, 82, 84, 85, 86, 87, 88, 89, 90, 91, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 106, 107, 108, 109, 119, 120, 121, 122, 123, 124, 127, 128, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 151], "summary": {"covered_lines": 52, "num_statements": 52, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 73}, "_BucketDecision": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 171}, "": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 17, 18, 19, 21, 24, 25, 26, 27, 30, 31, 32, 33, 73, 74, 80, 93, 150, 170, 171, 172, 173, 174], "summary": {"covered_lines": 33, "num_statements": 33, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/config/redis_client.py": {"executed_lines": [1, 3, 4, 6, 7, 11, 14, 15, 16, 17, 18, 19], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [8, 9], "functions": {"get_redis": {"executed_lines": [16, 17, 18, 19], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 15}, "": {"executed_lines": [1, 3, 4, 6, 7, 11, 14, 15], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [8, 9], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 6, 7, 11, 14, 15, 16, 17, 18, 19], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [8, 9], "start_line": 1}}}, "keynetra/config/sample_data.py": {"executed_lines": [1, 3, 4, 6, 8, 13, 17, 22, 32, 49, 60], "summary": {"covered_lines": 11, "num_statements": 12, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 91.66666666666667, "percent_statements_covered_display": "92"}, "missing_lines": [61], "excluded_lines": [], "functions": {"sample_bootstrap_document": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [61], "excluded_lines": [], "start_line": 60}, "": {"executed_lines": [1, 3, 4, 6, 8, 13, 17, 22, 32, 49, 60], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 6, 8, 13, 17, 22, 32, 49, 60], "summary": {"covered_lines": 11, "num_statements": 12, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 91.66666666666667, "percent_statements_covered_display": "92"}, "missing_lines": [61], "excluded_lines": [], "start_line": 1}}}, "keynetra/config/security.py": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 27, 43, 44, 47, 48, 49, 62, 63, 64, 67, 68, 69, 70, 75, 115, 121, 122, 123, 124, 125, 126, 127, 128, 129, 134, 135, 140, 142, 147, 148, 150, 151, 152, 153, 161, 164, 165, 166, 167, 168, 170, 171], "summary": {"covered_lines": 62, "num_statements": 106, "percent_covered": 58.490566037735846, "percent_covered_display": "58", "missing_lines": 44, "excluded_lines": 0, "percent_statements_covered": 58.490566037735846, "percent_statements_covered_display": "58"}, "missing_lines": [28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 110, 111, 112, 141, 154], "excluded_lines": [], "functions": {"_decode_with_jwks": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 11, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 11, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40], "excluded_lines": [], "start_line": 27}, "_unauthorized": {"executed_lines": [44], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 43}, "_log_failed_auth": {"executed_lines": [48, 49], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 47}, "_matches_api_key": {"executed_lines": [63, 64], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 62}, "_scopes_are_defined": {"executed_lines": [68, 69, 70], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 67}, "_get_jwks": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 31, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 31, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 110, 111, 112], "excluded_lines": [], "start_line": 75}, "get_principal": {"executed_lines": [121, 122, 123, 124, 125, 126, 127, 128, 129, 134, 135, 140, 142, 147, 148, 150, 151, 152, 153, 161, 164, 165, 166, 167, 168, 170, 171], "summary": {"covered_lines": 27, "num_statements": 29, "percent_covered": 93.10344827586206, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 93.10344827586206, "percent_statements_covered_display": "93"}, "missing_lines": [141, 154], "excluded_lines": [], "start_line": 115}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 27, 43, 47, 62, 67, 75, 115], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 27, 43, 44, 47, 48, 49, 62, 63, 64, 67, 68, 69, 70, 75, 115, 121, 122, 123, 124, 125, 126, 127, 128, 129, 134, 135, 140, 142, 147, 148, 150, 151, 152, 153, 161, 164, 165, 166, 167, 168, 170, 171], "summary": {"covered_lines": 62, "num_statements": 106, "percent_covered": 58.490566037735846, "percent_covered_display": "58", "missing_lines": 44, "excluded_lines": 0, "percent_statements_covered": 58.490566037735846, "percent_statements_covered_display": "58"}, "missing_lines": [28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 110, 111, 112, 141, 154], "excluded_lines": [], "start_line": 1}}}, "keynetra/config/settings.py": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 11, 13, 14, 17, 18, 20, 21, 23, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 68, 69, 70, 71, 72, 74, 75, 76, 77, 78, 80, 82, 83, 84, 85, 87, 89, 90, 91, 92, 94, 96, 97, 98, 99, 101, 103, 104, 105, 106, 108, 110, 111, 112, 113, 114, 115, 117, 119, 120, 121, 122, 124, 126, 127, 128, 129, 131, 133, 134, 135, 140, 141, 145, 147, 151, 154, 155, 158, 160, 162, 163, 164, 165, 171, 173, 174, 178, 181, 183, 184, 185, 186, 188, 189, 191, 193, 194, 195, 196, 198, 199, 200, 201, 203, 204, 205, 206, 207, 210, 212, 213, 214, 216, 217, 218, 219, 226, 228, 229, 231, 232, 234, 236, 237, 238, 239, 242, 243, 244, 245, 249, 250, 251, 254, 255], "summary": {"covered_lines": 165, "num_statements": 194, "percent_covered": 85.05154639175258, "percent_covered_display": "85", "missing_lines": 29, "excluded_lines": 0, "percent_statements_covered": 85.05154639175258, "percent_statements_covered_display": "85"}, "missing_lines": [79, 86, 93, 100, 107, 116, 123, 130, 142, 146, 148, 152, 156, 159, 166, 168, 169, 170, 175, 176, 179, 190, 208, 209, 211, 215, 233, 240, 246], "excluded_lines": [], "functions": {"Settings._validate_environment": {"executed_lines": [77, 78, 80], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [79], "excluded_lines": [], "start_line": 76}, "Settings._validate_service_timeout": {"executed_lines": [85, 87], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [86], "excluded_lines": [], "start_line": 84}, "Settings._validate_retry_attempts": {"executed_lines": [92, 94], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [93], "excluded_lines": [], "start_line": 91}, "Settings._validate_rate_limit_per_minute": {"executed_lines": [99, 101], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [100], "excluded_lines": [], "start_line": 98}, "Settings._validate_rate_limit_window_seconds": {"executed_lines": [106, 108], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [107], "excluded_lines": [], "start_line": 105}, "Settings._validate_rate_limit_burst": {"executed_lines": [113, 114, 115, 117], "summary": {"covered_lines": 4, "num_statements": 5, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [116], "excluded_lines": [], "start_line": 112}, "Settings._validate_jwks_cache_ttl_seconds": {"executed_lines": [122, 124], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [123], "excluded_lines": [], "start_line": 121}, "Settings._validate_jwks_backoff_max_seconds": {"executed_lines": [129, 131], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [130], "excluded_lines": [], "start_line": 128}, "Settings._validate_security_profile": {"executed_lines": [135, 140, 141, 145, 147, 151, 154, 155, 158, 160], "summary": {"covered_lines": 10, "num_statements": 16, "percent_covered": 62.5, "percent_covered_display": "62", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 62.5, "percent_statements_covered_display": "62"}, "missing_lines": [142, 146, 148, 152, 156, 159], "excluded_lines": [], "start_line": 134}, "Settings.load_policies": {"executed_lines": [163, 164, 165, 171, 173, 174, 178, 181], "summary": {"covered_lines": 8, "num_statements": 15, "percent_covered": 53.333333333333336, "percent_covered_display": "53", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 53.333333333333336, "percent_statements_covered_display": "53"}, "missing_lines": [166, 168, 169, 170, 175, 176, 179], "excluded_lines": [], "start_line": 162}, "Settings.parsed_policy_paths": {"executed_lines": [184, 185, 186], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 183}, "Settings.parsed_model_paths": {"executed_lines": [189, 191], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [190], "excluded_lines": [], "start_line": 188}, "Settings.parsed_api_keys": {"executed_lines": [194, 195, 196], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 193}, "Settings.parsed_api_key_hashes": {"executed_lines": [199, 200, 201], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 198}, "Settings.parsed_api_key_scopes": {"executed_lines": [204, 205, 206, 207, 210, 212, 213, 214, 216, 217, 218, 219, 226], "summary": {"covered_lines": 13, "num_statements": 17, "percent_covered": 76.47058823529412, "percent_covered_display": "76", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 76.47058823529412, "percent_statements_covered_display": "76"}, "missing_lines": [208, 209, 211, 215], "excluded_lines": [], "start_line": 203}, "Settings.is_development": {"executed_lines": [229], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 228}, "Settings.parsed_cors_allow_origins": {"executed_lines": [232, 234], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [233], "excluded_lines": [], "start_line": 231}, "Settings.parsed_cors_allow_methods": {"executed_lines": [237, 238, 239], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [240], "excluded_lines": [], "start_line": 236}, "Settings.parsed_cors_allow_headers": {"executed_lines": [243, 244, 245], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [246], "excluded_lines": [], "start_line": 242}, "get_settings": {"executed_lines": [251], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 250}, "reset_settings_cache": {"executed_lines": [255], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 254}, "": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 11, 13, 14, 17, 18, 20, 21, 23, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 68, 69, 70, 71, 72, 74, 75, 76, 82, 83, 84, 89, 90, 91, 96, 97, 98, 103, 104, 105, 110, 111, 112, 119, 120, 121, 126, 127, 128, 133, 134, 162, 183, 188, 193, 198, 203, 228, 231, 236, 242, 249, 250, 254], "summary": {"covered_lines": 93, "num_statements": 93, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"Settings": {"executed_lines": [77, 78, 80, 85, 87, 92, 94, 99, 101, 106, 108, 113, 114, 115, 117, 122, 124, 129, 131, 135, 140, 141, 145, 147, 151, 154, 155, 158, 160, 163, 164, 165, 171, 173, 174, 178, 181, 184, 185, 186, 189, 191, 194, 195, 196, 199, 200, 201, 204, 205, 206, 207, 210, 212, 213, 214, 216, 217, 218, 219, 226, 229, 232, 234, 237, 238, 239, 243, 244, 245], "summary": {"covered_lines": 70, "num_statements": 99, "percent_covered": 70.70707070707071, "percent_covered_display": "71", "missing_lines": 29, "excluded_lines": 0, "percent_statements_covered": 70.70707070707071, "percent_statements_covered_display": "71"}, "missing_lines": [79, 86, 93, 100, 107, 116, 123, 130, 142, 146, 148, 152, 156, 159, 166, 168, 169, 170, 175, 176, 179, 190, 208, 209, 211, 215, 233, 240, 246], "excluded_lines": [], "start_line": 17}, "": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 11, 13, 14, 17, 18, 20, 21, 23, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 68, 69, 70, 71, 72, 74, 75, 76, 82, 83, 84, 89, 90, 91, 96, 97, 98, 103, 104, 105, 110, 111, 112, 119, 120, 121, 126, 127, 128, 133, 134, 162, 183, 188, 193, 198, 203, 228, 231, 236, 242, 249, 250, 251, 254, 255], "summary": {"covered_lines": 95, "num_statements": 95, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/config/tenancy.py": {"executed_lines": [1, 3, 4, 6, 7, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 23, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 53, 56, 57, 58], "summary": {"covered_lines": 43, "num_statements": 44, "percent_covered": 97.72727272727273, "percent_covered_display": "98", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 97.72727272727273, "percent_statements_covered_display": "98"}, "missing_lines": [22], "excluded_lines": [], "functions": {"get_tenant_key": {"executed_lines": [12], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 11}, "normalize_tenant_key": {"executed_lines": [16, 17, 18, 19, 20, 21, 23], "summary": {"covered_lines": 7, "num_statements": 8, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 87.5, "percent_statements_covered_display": "88"}, "missing_lines": [22], "excluded_lines": [], "start_line": 15}, "tenant_from_principal": {"executed_lines": [27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 53], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 26}, "tenant_for_logs": {"executed_lines": [57, 58], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 56}, "": {"executed_lines": [1, 3, 4, 6, 7, 8, 11, 15, 26, 56], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 6, 7, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 23, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 53, 56, 57, 58], "summary": {"covered_lines": 43, "num_statements": 44, "percent_covered": 97.72727272727273, "percent_covered_display": "98", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 97.72727272727273, "percent_statements_covered_display": "98"}, "missing_lines": [22], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/models/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/models/acl.py": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 23, 27], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 23, 27], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"ResourceACL": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 11}, "": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 23, 27], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/models/audit.py": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 17, 18, 19, 21, 22, 23, 25, 26, 27, 28, 29, 31], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 17, 18, 19, 21, 22, 23, 25, 26, 27, 28, 29, 31], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"AuditLog": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 11}, "": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 17, 18, 19, 21, 22, 23, 25, 26, 27, 28, 29, 31], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/models/auth_model.py": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 18, 19, 20, 21, 24, 28], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 18, 19, 20, 21, 24, 28], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"AuthorizationModel": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 11}, "": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 18, 19, 20, 21, 24, 28], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/models/base.py": {"executed_lines": [1, 3, 6, 7], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 6, 7], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"Base": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 6}, "": {"executed_lines": [1, 3, 6, 7], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/models/idempotency.py": {"executed_lines": [1, 3, 5, 6, 8, 11, 14, 16, 17, 18, 19, 20, 21, 22, 23, 26, 28], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 5, 6, 8, 11, 14, 16, 17, 18, 19, 20, 21, 22, 23, 26, 28], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"IdempotencyRecord": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 11}, "": {"executed_lines": [1, 3, 5, 6, 8, 11, 14, 16, 17, 18, 19, 20, 21, 22, 23, 26, 28], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/models/policy_versioning.py": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 16, 17, 18, 20, 23, 24, 26, 27, 28, 31, 33, 34, 35, 36, 38, 41, 42, 44], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 16, 17, 18, 20, 23, 24, 26, 27, 28, 31, 33, 34, 35, 36, 38, 41, 42, 44], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"Policy": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 11}, "PolicyVersion": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 23}, "": {"executed_lines": [1, 3, 5, 6, 8, 11, 12, 14, 15, 16, 17, 18, 20, 23, 24, 26, 27, 28, 31, 33, 34, 35, 36, 38, 41, 42, 44], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/models/rbac.py": {"executed_lines": [1, 3, 4, 6, 8, 15, 25, 26, 28, 29, 31, 33, 36, 37, 39, 40, 42, 43, 48, 49, 51, 52, 54, 58], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 4, 6, 8, 15, 25, 26, 28, 29, 31, 33, 36, 37, 39, 40, 42, 43, 48, 49, 51, 52, 54, 58], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"User": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 25}, "Role": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 36}, "Permission": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 48}, "": {"executed_lines": [1, 3, 4, 6, 8, 15, 25, 26, 28, 29, 31, 33, 36, 37, 39, 40, 42, 43, 48, 49, 51, 52, 54, 58], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/models/relationship.py": {"executed_lines": [1, 3, 4, 6, 9, 10, 12, 13, 15, 16, 17, 18, 19, 21], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 4, 6, 9, 10, 12, 13, 15, 16, 17, 18, 19, 21], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"Relationship": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 9}, "": {"executed_lines": [1, 3, 4, 6, 9, 10, 12, 13, 15, 16, 17, 18, 19, 21], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/models/tenant.py": {"executed_lines": [1, 3, 4, 6, 9, 10, 12, 13, 14, 15], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 4, 6, 9, 10, 12, 13, 14, 15], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"Tenant": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 9}, "": {"executed_lines": [1, 3, 4, 6, 9, 10, 12, 13, 14, 15], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/pagination.py": {"executed_lines": [3, 5, 6, 7, 10, 11, 12, 15, 16, 18, 19, 20, 21, 22], "summary": {"covered_lines": 14, "num_statements": 15, "percent_covered": 93.33333333333333, "percent_covered_display": "93", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 93.33333333333333, "percent_statements_covered_display": "93"}, "missing_lines": [17], "excluded_lines": [], "functions": {"encode_cursor": {"executed_lines": [11, 12], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 10}, "decode_cursor": {"executed_lines": [16, 18, 19, 20, 21, 22], "summary": {"covered_lines": 6, "num_statements": 7, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 85.71428571428571, "percent_statements_covered_display": "86"}, "missing_lines": [17], "excluded_lines": [], "start_line": 15}, "": {"executed_lines": [3, 5, 6, 7, 10, 15], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 6, 7, 10, 11, 12, 15, 16, 18, 19, 20, 21, 22], "summary": {"covered_lines": 14, "num_statements": 15, "percent_covered": 93.33333333333333, "percent_covered_display": "93", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 93.33333333333333, "percent_statements_covered_display": "93"}, "missing_lines": [17], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/schemas/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/schemas/access.py": {"executed_lines": [1, 3, 5, 8, 11, 12, 13, 14, 15, 16, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 48, 49, 50, 51, 52, 55, 56, 57, 58, 61, 62, 63], "summary": {"covered_lines": 43, "num_statements": 43, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 5, 8, 11, 12, 13, 14, 15, 16, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 48, 49, 50, 51, 52, 55, 56, 57, 58, 61, 62, 63], "summary": {"covered_lines": 43, "num_statements": 43, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"AccessRequest": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 8}, "AccessResponse": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "AccessDecisionResponse": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 23}, "SimulationResponse": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 33}, "BatchAccessItem": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 43}, "BatchAccessRequest": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 48}, "BatchAccessResult": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 55}, "BatchAccessResponse": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 61}, "": {"executed_lines": [1, 3, 5, 8, 11, 12, 13, 14, 15, 16, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 48, 49, 50, 51, 52, 55, 56, 57, 58, 61, 62, 63], "summary": {"covered_lines": 43, "num_statements": 43, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/schemas/api.py": {"executed_lines": [3, 5, 7, 9, 12, 13, 14, 15, 18, 19, 20, 21, 22, 25, 26, 27, 28, 31, 32, 33], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 5, 7, 9, 12, 13, 14, 15, 18, 19, 20, 21, 22, 25, 26, 27, 28, 31, 32, 33], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"ErrorBody": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 12}, "MetaBody": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 18}, "SuccessResponse": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 25}, "ErrorResponse": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 31}, "": {"executed_lines": [3, 5, 7, 9, 12, 13, 14, 15, 18, 19, 20, 21, 22, 25, 26, 27, 28, 31, 32, 33], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/schemas/management.py": {"executed_lines": [1, 3, 4, 6, 9, 10, 13, 14, 17, 18, 19, 22, 23, 26, 27, 30, 31, 32, 35, 36, 37, 40, 41, 42, 43, 44, 45, 48, 49, 50, 51, 52, 53, 54, 57, 58, 59, 60, 61, 62, 63, 66, 67, 68, 69, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 88, 89, 90, 93, 94, 95, 96, 97, 98], "summary": {"covered_lines": 68, "num_statements": 68, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 4, 6, 9, 10, 13, 14, 17, 18, 19, 22, 23, 26, 27, 30, 31, 32, 35, 36, 37, 40, 41, 42, 43, 44, 45, 48, 49, 50, 51, 52, 53, 54, 57, 58, 59, 60, 61, 62, 63, 66, 67, 68, 69, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 88, 89, 90, 93, 94, 95, 96, 97, 98], "summary": {"covered_lines": 68, "num_statements": 68, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"RoleCreate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 9}, "RoleUpdate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 13}, "RoleOut": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 17}, "PermissionCreate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 22}, "PermissionUpdate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 26}, "PermissionOut": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 30}, "RolePermissionOut": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 35}, "PolicyCreate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 40}, "PolicyOut": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 48}, "ACLCreate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 57}, "ACLOut": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 66}, "AuditRecordOut": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 72}, "AdminLoginRequest": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 88}, "AdminLoginResponse": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 93}, "": {"executed_lines": [1, 3, 4, 6, 9, 10, 13, 14, 17, 18, 19, 22, 23, 26, 27, 30, 31, 32, 35, 36, 37, 40, 41, 42, 43, 44, 45, 48, 49, 50, 51, 52, 53, 54, 57, 58, 59, 60, 61, 62, 63, 66, 67, 68, 69, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 88, 89, 90, 93, 94, 95, 96, 97, 98], "summary": {"covered_lines": 68, "num_statements": 68, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/domain/schemas/modeling.py": {"executed_lines": [1, 3, 5, 8, 9, 10, 13, 14, 15, 16, 17, 18, 19, 22, 23, 24, 25, 28, 29, 30, 33, 34, 35, 38, 39, 42, 43, 44], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 5, 8, 9, 10, 13, 14, 15, 16, 17, 18, 19, 22, 23, 24, 25, 28, 29, 30, 33, 34, 35, 38, 39, 42, 43, 44], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"AuthModelCreate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 8}, "AuthModelOut": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 13}, "PolicySimulationInput": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 22}, "PolicySimulationRequest": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 28}, "PolicySimulationResponse": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 33}, "ImpactAnalysisRequest": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 38}, "ImpactAnalysisResponse": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 42}, "": {"executed_lines": [1, 3, 5, 8, 9, 10, 13, 14, 15, 16, 17, 18, 19, 22, 23, 24, 25, 28, 29, 30, 33, 34, 35, 38, 39, 42, 43, 44], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/engine/__init__.py": {"executed_lines": [3, 11], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 11], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 11], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/engine/compiled/__init__.py": {"executed_lines": [1, 6, 8], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 6, 8], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 6, 8], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/engine/compiled/decision_graph.py": {"executed_lines": [3, 5, 6, 7, 8, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23, 24, 27, 28, 29, 31, 32, 33, 34, 35, 36, 37, 38, 43, 44, 45, 46, 47, 50, 53, 54, 55, 57, 58, 59, 61, 62, 63, 65, 66, 67, 68, 69, 72], "summary": {"covered_lines": 49, "num_statements": 49, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"DecisionGraph.evaluate": {"executed_lines": [32, 33, 34, 35, 36, 37, 38, 43, 44, 45, 46, 47], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 31}, "CompiledPolicyStore.__init__": {"executed_lines": [54, 55], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 53}, "CompiledPolicyStore.get": {"executed_lines": [58, 59], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 57}, "CompiledPolicyStore.set": {"executed_lines": [62, 63], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 61}, "CompiledPolicyStore.invalidate": {"executed_lines": [66, 67, 68, 69], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 65}, "": {"executed_lines": [3, 5, 6, 7, 8, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23, 24, 27, 28, 29, 31, 50, 53, 57, 61, 65, 72], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"GraphDecision": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 12}, "CompiledPolicyNode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "DecisionGraph": {"executed_lines": [32, 33, 34, 35, 36, 37, 38, 43, 44, 45, 46, 47], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 28}, "CompiledPolicyStore": {"executed_lines": [54, 55, 58, 59, 62, 63, 66, 67, 68, 69], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 50}, "": {"executed_lines": [3, 5, 6, 7, 8, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23, 24, 27, 28, 29, 31, 50, 53, 57, 61, 65, 72], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/engine/compiled/policy_compiler.py": {"executed_lines": [3, 5, 6, 8, 9, 12, 13, 14, 15, 16, 17, 18, 21, 25, 28, 30, 31, 32, 33, 35, 36, 37, 38, 40, 49, 52, 62, 66, 67], "summary": {"covered_lines": 29, "num_statements": 30, "percent_covered": 96.66666666666667, "percent_covered_display": "97", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 96.66666666666667, "percent_statements_covered_display": "97"}, "missing_lines": [34], "excluded_lines": [], "functions": {"compile_policy_ast": {"executed_lines": [25, 28, 30, 40], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 21}, "compile_policy_ast.evaluate": {"executed_lines": [31, 32, 33, 35, 36, 37, 38], "summary": {"covered_lines": 7, "num_statements": 8, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 87.5, "percent_statements_covered_display": "88"}, "missing_lines": [34], "excluded_lines": [], "start_line": 30}, "compile_policy_graph": {"executed_lines": [52, 62, 66, 67], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 49}, "": {"executed_lines": [3, 5, 6, 8, 9, 12, 13, 14, 15, 16, 17, 18, 21, 49], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"PolicyAST": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 13}, "": {"executed_lines": [3, 5, 6, 8, 9, 12, 13, 14, 15, 16, 17, 18, 21, 25, 28, 30, 31, 32, 33, 35, 36, 37, 38, 40, 49, 52, 62, 66, 67], "summary": {"covered_lines": 29, "num_statements": 30, "percent_covered": 96.66666666666667, "percent_covered_display": "97", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 96.66666666666667, "percent_statements_covered_display": "97"}, "missing_lines": [34], "excluded_lines": [], "start_line": 1}}}, "keynetra/engine/keynetra_engine.py": {"executed_lines": [8, 10, 11, 12, 13, 14, 16, 17, 18, 19, 27, 28, 31, 32, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46, 47, 50, 51, 52, 53, 54, 56, 57, 58, 67, 68, 71, 72, 73, 74, 76, 77, 85, 86, 93, 94, 95, 96, 97, 98, 99, 101, 102, 105, 108, 111, 114, 126, 129, 130, 131, 132, 133, 134, 136, 139, 140, 141, 144, 146, 149, 151, 152, 153, 154, 156, 159, 161, 162, 163, 164, 166, 167, 180, 195, 198, 200, 201, 202, 203, 204, 205, 207, 210, 211, 214, 215, 216, 218, 223, 227, 230, 236, 240, 243, 244, 257, 259, 272, 275, 277, 291, 292, 293, 302, 309, 310, 319, 320, 321, 327, 328, 330, 331, 338, 339, 340, 342, 343, 345, 346, 347, 354, 356, 357, 358, 363, 364, 373, 374, 375, 380, 381, 390, 391, 392, 397, 398, 407, 408, 411, 416, 417, 426, 427, 428, 433, 434, 443, 444, 445, 450, 451, 460, 461, 466, 467, 477, 487, 488, 489, 490, 491, 492, 500, 505, 509, 519, 522, 525, 526, 534, 535, 540, 542, 549, 550, 551, 556, 557, 558, 559, 564, 565, 566, 569, 570, 571, 572, 573, 581, 582, 587, 588, 589, 591, 594, 595, 596, 604, 605, 608, 610, 617, 618, 619, 620, 625, 626, 627, 629, 634, 636, 637, 639, 640, 648, 653, 658, 660, 663, 664, 665, 666, 667, 672, 673, 681, 683, 686, 687, 688, 693, 694, 695, 696, 703, 704, 712, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 728, 729, 730, 735, 736, 737, 738, 740, 741, 742, 743, 744, 745, 747, 748, 755, 756, 758, 766, 771, 773, 774, 775, 777, 780, 782, 792, 794, 820, 828], "summary": {"covered_lines": 290, "num_statements": 354, "percent_covered": 81.92090395480226, "percent_covered_display": "82", "missing_lines": 64, "excluded_lines": 0, "percent_statements_covered": 81.92090395480226, "percent_statements_covered_display": "82"}, "missing_lines": [117, 118, 119, 120, 121, 122, 123, 124, 142, 143, 150, 160, 165, 168, 169, 170, 171, 172, 173, 174, 175, 177, 178, 184, 185, 186, 187, 188, 189, 190, 193, 199, 208, 212, 217, 224, 311, 312, 315, 322, 323, 324, 325, 329, 341, 628, 633, 635, 638, 739, 770, 772, 781, 783, 786, 791, 801, 802, 810, 823, 824, 825, 826, 829], "excluded_lines": [], "functions": {"PolicyDefinition.from_dict": {"executed_lines": [58], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 57}, "ExplainTraceStep.to_dict": {"executed_lines": [77], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 76}, "AuthorizationDecision.evaluated_rules": {"executed_lines": [105], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 102}, "ConditionEvaluator.evaluate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [117, 118, 119, 120, 121, 122, 123, 124], "excluded_lines": [], "start_line": 114}, "ConditionEvaluator.handle_role": {"executed_lines": [129, 130, 131, 132, 133, 134], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 126}, "ConditionEvaluator.handle_max_amount": {"executed_lines": [139, 140, 141, 144], "summary": {"covered_lines": 4, "num_statements": 6, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [142, 143], "excluded_lines": [], "start_line": 136}, "ConditionEvaluator.handle_owner_only": {"executed_lines": [149, 151, 152, 153, 154], "summary": {"covered_lines": 5, "num_statements": 6, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83"}, "missing_lines": [150], "excluded_lines": [], "start_line": 146}, "ConditionEvaluator.handle_time_range": {"executed_lines": [159, 161, 162, 163, 164, 166, 167], "summary": {"covered_lines": 7, "num_statements": 19, "percent_covered": 36.8421052631579, "percent_covered_display": "37", "missing_lines": 12, "excluded_lines": 0, "percent_statements_covered": 36.8421052631579, "percent_statements_covered_display": "37"}, "missing_lines": [160, 165, 168, 169, 170, 171, 172, 173, 174, 175, 177, 178], "excluded_lines": [], "start_line": 156}, "ConditionEvaluator.handle_geo_match": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [184, 185, 186, 187, 188, 189, 190, 193], "excluded_lines": [], "start_line": 180}, "ConditionEvaluator.handle_has_relation": {"executed_lines": [198, 200, 201, 202, 203, 204, 205, 207, 210, 211, 214, 215, 216, 218, 223], "summary": {"covered_lines": 15, "num_statements": 20, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [199, 208, 212, 217, 224], "excluded_lines": [], "start_line": 195}, "KeyNetraEngine.__init__": {"executed_lines": [236, 240, 243, 244, 257], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 230}, "KeyNetraEngine.decide": {"executed_lines": [272, 275], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 259}, "KeyNetraEngine.check_access": {"executed_lines": [291, 292, 293], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 277}, "KeyNetraEngine._normalize_input": {"executed_lines": [309, 310], "summary": {"covered_lines": 2, "num_statements": 5, "percent_covered": 40.0, "percent_covered_display": "40", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 40.0, "percent_statements_covered_display": "40"}, "missing_lines": [311, 312, 315], "excluded_lines": [], "start_line": 302}, "KeyNetraEngine._normalize_subject": {"executed_lines": [320, 321], "summary": {"covered_lines": 2, "num_statements": 6, "percent_covered": 33.333333333333336, "percent_covered_display": "33", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 33.333333333333336, "percent_statements_covered_display": "33"}, "missing_lines": [322, 323, 324, 325], "excluded_lines": [], "start_line": 319}, "KeyNetraEngine._normalize_resource": {"executed_lines": [328, 330, 331], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [329], "excluded_lines": [], "start_line": 327}, "KeyNetraEngine._parse_descriptor": {"executed_lines": [339, 340, 342, 343], "summary": {"covered_lines": 4, "num_statements": 5, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [341], "excluded_lines": [], "start_line": 338}, "KeyNetraEngine._decide_structured": {"executed_lines": [346, 347, 354, 356, 357, 358, 363, 364, 373, 374, 375, 380, 381, 390, 391, 392, 397, 398, 407, 408, 411, 416, 417, 426, 427, 428, 433, 434, 443, 444, 445, 450, 451, 460, 461, 466, 467], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 345}, "KeyNetraEngine._decision_from_stage": {"executed_lines": [487, 488, 489, 490, 491, 492, 500, 505, 509], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 477}, "KeyNetraEngine._evaluate_direct_permissions": {"executed_lines": [522, 525, 526, 534, 535, 540], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 519}, "KeyNetraEngine._evaluate_acl": {"executed_lines": [549, 550, 551, 556, 557, 558, 559, 564, 565, 566, 569, 570, 571, 572, 573, 581, 582, 587, 588, 589], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 542}, "KeyNetraEngine._evaluate_role_permissions": {"executed_lines": [594, 595, 596, 604, 605, 608], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 591}, "KeyNetraEngine._evaluate_relationship_index": {"executed_lines": [617, 618, 619, 620, 625, 626, 627, 629, 634, 636, 637, 639, 640, 648, 653, 658], "summary": {"covered_lines": 16, "num_statements": 20, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [628, 633, 635, 638], "excluded_lines": [], "start_line": 610}, "KeyNetraEngine._evaluate_compiled_policies": {"executed_lines": [663, 664, 665, 666, 667, 672, 673, 681], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 660}, "KeyNetraEngine._evaluate_permission_graph": {"executed_lines": [686, 687, 688, 693, 694, 695, 696, 703, 704, 712], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 683}, "KeyNetraEngine._subject_descriptors": {"executed_lines": [715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 728, 729, 730, 735, 736, 737, 738, 740, 741, 742, 743, 744, 745], "summary": {"covered_lines": 24, "num_statements": 25, "percent_covered": 96.0, "percent_covered_display": "96", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 96.0, "percent_statements_covered_display": "96"}, "missing_lines": [739], "excluded_lines": [], "start_line": 714}, "KeyNetraEngine._resource_identity": {"executed_lines": [748, 755, 756], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 747}, "KeyNetraEngine._acl_matches": {"executed_lines": [766, 771, 773, 774, 775], "summary": {"covered_lines": 5, "num_statements": 7, "percent_covered": 71.42857142857143, "percent_covered_display": "71", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 71.42857142857143, "percent_statements_covered_display": "71"}, "missing_lines": [770, 772], "excluded_lines": [], "start_line": 758}, "KeyNetraEngine._acl_subject_matches": {"executed_lines": [780, 782, 792], "summary": {"covered_lines": 3, "num_statements": 7, "percent_covered": 42.857142857142854, "percent_covered_display": "43", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 42.857142857142854, "percent_statements_covered_display": "43"}, "missing_lines": [781, 783, 786, 791], "excluded_lines": [], "start_line": 777}, "KeyNetraEngine._decision_from_policy": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [801, 802, 810], "excluded_lines": [], "start_line": 794}, "KeyNetraEngine._best_reason": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [823, 824, 825, 826], "excluded_lines": [], "start_line": 820}, "KeyNetraEngine._policy_id": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [829], "excluded_lines": [], "start_line": 828}, "": {"executed_lines": [8, 10, 11, 12, 13, 14, 16, 17, 18, 19, 27, 28, 31, 32, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46, 47, 50, 51, 52, 53, 54, 56, 57, 67, 68, 71, 72, 73, 74, 76, 85, 86, 93, 94, 95, 96, 97, 98, 99, 101, 102, 108, 111, 114, 126, 136, 146, 156, 180, 195, 227, 230, 259, 277, 302, 319, 327, 338, 345, 477, 519, 542, 591, 610, 660, 683, 714, 747, 758, 777, 794, 820, 828], "summary": {"covered_lines": 82, "num_statements": 82, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"AuthorizationInput": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 32}, "PolicyDefinition": {"executed_lines": [58], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 47}, "ExplainTraceStep": {"executed_lines": [77], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 68}, "AuthorizationDecision": {"executed_lines": [105], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 86}, "ConditionEvaluator": {"executed_lines": [129, 130, 131, 132, 133, 134, 139, 140, 141, 144, 149, 151, 152, 153, 154, 159, 161, 162, 163, 164, 166, 167, 198, 200, 201, 202, 203, 204, 205, 207, 210, 211, 214, 215, 216, 218, 223], "summary": {"covered_lines": 37, "num_statements": 73, "percent_covered": 50.68493150684932, "percent_covered_display": "51", "missing_lines": 36, "excluded_lines": 0, "percent_statements_covered": 50.68493150684932, "percent_statements_covered_display": "51"}, "missing_lines": [117, 118, 119, 120, 121, 122, 123, 124, 142, 143, 150, 160, 165, 168, 169, 170, 171, 172, 173, 174, 175, 177, 178, 184, 185, 186, 187, 188, 189, 190, 193, 199, 208, 212, 217, 224], "excluded_lines": [], "start_line": 111}, "KeyNetraEngine": {"executed_lines": [236, 240, 243, 244, 257, 272, 275, 291, 292, 293, 309, 310, 320, 321, 328, 330, 331, 339, 340, 342, 343, 346, 347, 354, 356, 357, 358, 363, 364, 373, 374, 375, 380, 381, 390, 391, 392, 397, 398, 407, 408, 411, 416, 417, 426, 427, 428, 433, 434, 443, 444, 445, 450, 451, 460, 461, 466, 467, 487, 488, 489, 490, 491, 492, 500, 505, 509, 522, 525, 526, 534, 535, 540, 549, 550, 551, 556, 557, 558, 559, 564, 565, 566, 569, 570, 571, 572, 573, 581, 582, 587, 588, 589, 594, 595, 596, 604, 605, 608, 617, 618, 619, 620, 625, 626, 627, 629, 634, 636, 637, 639, 640, 648, 653, 658, 663, 664, 665, 666, 667, 672, 673, 681, 686, 687, 688, 693, 694, 695, 696, 703, 704, 712, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 728, 729, 730, 735, 736, 737, 738, 740, 741, 742, 743, 744, 745, 748, 755, 756, 766, 771, 773, 774, 775, 780, 782, 792], "summary": {"covered_lines": 168, "num_statements": 196, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 28, "excluded_lines": 0, "percent_statements_covered": 85.71428571428571, "percent_statements_covered_display": "86"}, "missing_lines": [311, 312, 315, 322, 323, 324, 325, 329, 341, 628, 633, 635, 638, 739, 770, 772, 781, 783, 786, 791, 801, 802, 810, 823, 824, 825, 826, 829], "excluded_lines": [], "start_line": 227}, "": {"executed_lines": [8, 10, 11, 12, 13, 14, 16, 17, 18, 19, 27, 28, 31, 32, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46, 47, 50, 51, 52, 53, 54, 56, 57, 67, 68, 71, 72, 73, 74, 76, 85, 86, 93, 94, 95, 96, 97, 98, 99, 101, 102, 108, 111, 114, 126, 136, 146, 156, 180, 195, 227, 230, 259, 277, 302, 319, 327, 338, 345, 477, 519, 542, 591, 610, 660, 683, 714, 747, 758, 777, 794, 820, 828], "summary": {"covered_lines": 82, "num_statements": 82, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/engine/model_graph/__init__.py": {"executed_lines": [1, 8], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 8], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 8], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/engine/model_graph/permission_graph.py": {"executed_lines": [3, 5, 6, 7, 9, 12, 13, 14, 15, 16, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 34, 35, 36, 41, 47, 48, 49, 52, 53, 56, 57, 60, 61, 62, 64, 65, 67, 68, 69, 71, 73, 74, 77, 78, 79, 81, 82, 83, 84, 86, 88, 90, 92, 93, 96, 99, 100, 101, 103, 104, 105, 107, 108, 109, 111, 116], "summary": {"covered_lines": 68, "num_statements": 78, "percent_covered": 87.17948717948718, "percent_covered_display": "87", "missing_lines": 10, "excluded_lines": 0, "percent_statements_covered": 87.17948717948718, "percent_statements_covered_display": "87"}, "missing_lines": [70, 72, 75, 80, 85, 87, 89, 91, 112, 113], "excluded_lines": [], "functions": {"CompiledPermissionGraph.evaluate": {"executed_lines": [25, 26, 27, 28, 29, 30, 31, 34, 35, 36, 41], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 24}, "CompiledPermissionGraph._resource_identity": {"executed_lines": [48, 49, 52, 53], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 47}, "_PermissionEvaluator.__init__": {"executed_lines": [60, 61, 62], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 57}, "_PermissionEvaluator.evaluate": {"executed_lines": [65, 67, 68, 69, 71, 73, 74], "summary": {"covered_lines": 7, "num_statements": 10, "percent_covered": 70.0, "percent_covered_display": "70", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 70.0, "percent_statements_covered_display": "70"}, "missing_lines": [70, 72, 75], "excluded_lines": [], "start_line": 64}, "_PermissionEvaluator._has_relation": {"executed_lines": [78, 79, 81, 82, 83, 84, 86, 88, 90, 92, 93], "summary": {"covered_lines": 11, "num_statements": 16, "percent_covered": 68.75, "percent_covered_display": "69", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 68.75, "percent_statements_covered_display": "69"}, "missing_lines": [80, 85, 87, 89, 91], "excluded_lines": [], "start_line": 77}, "PermissionGraphStore.__init__": {"executed_lines": [100, 101], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 99}, "PermissionGraphStore.get": {"executed_lines": [104, 105], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 103}, "PermissionGraphStore.set": {"executed_lines": [108, 109], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 107}, "PermissionGraphStore.invalidate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [112, 113], "excluded_lines": [], "start_line": 111}, "": {"executed_lines": [3, 5, 6, 7, 9, 12, 13, 14, 15, 16, 19, 20, 21, 22, 24, 47, 56, 57, 64, 77, 96, 99, 103, 107, 111, 116], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"AuthorizationGraphDecision": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 13}, "CompiledPermissionGraph": {"executed_lines": [25, 26, 27, 28, 29, 30, 31, 34, 35, 36, 41, 48, 49, 52, 53], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 20}, "_PermissionEvaluator": {"executed_lines": [60, 61, 62, 65, 67, 68, 69, 71, 73, 74, 78, 79, 81, 82, 83, 84, 86, 88, 90, 92, 93], "summary": {"covered_lines": 21, "num_statements": 29, "percent_covered": 72.41379310344827, "percent_covered_display": "72", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 72.41379310344827, "percent_statements_covered_display": "72"}, "missing_lines": [70, 72, 75, 80, 85, 87, 89, 91], "excluded_lines": [], "start_line": 56}, "PermissionGraphStore": {"executed_lines": [100, 101, 104, 105, 108, 109], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [112, 113], "excluded_lines": [], "start_line": 96}, "": {"executed_lines": [3, 5, 6, 7, 9, 12, 13, 14, 15, 16, 19, 20, 21, 22, 24, 47, 56, 57, 64, 77, 96, 99, 103, 107, 111, 116], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/headless.py": {"executed_lines": [1, 3, 4, 5, 7, 8, 13, 14, 19, 20, 23, 24, 27, 28, 30, 31, 32, 33, 34, 36, 37, 38, 42, 44, 45, 46, 47, 50, 51, 52, 57, 65, 66, 67, 77, 78, 79, 80, 81, 82, 85, 86, 88, 89, 97, 98, 99, 100, 101, 102], "summary": {"covered_lines": 50, "num_statements": 53, "percent_covered": 94.33962264150944, "percent_covered_display": "94", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 94.33962264150944, "percent_statements_covered_display": "94"}, "missing_lines": [48, 83, 87], "excluded_lines": [], "functions": {"KeyNetra.from_config": {"executed_lines": [32, 33, 34, 36, 37, 38, 42], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 31}, "KeyNetra.load_policies": {"executed_lines": [45, 46, 47], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [48], "excluded_lines": [], "start_line": 44}, "KeyNetra.load_model": {"executed_lines": [51, 52], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 50}, "KeyNetra.check_access": {"executed_lines": [65, 66, 67], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 57}, "KeyNetra._subject_to_user": {"executed_lines": [78, 79, 80, 81, 82], "summary": {"covered_lines": 5, "num_statements": 6, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83"}, "missing_lines": [83], "excluded_lines": [], "start_line": 77}, "KeyNetra._resource_to_payload": {"executed_lines": [86, 88, 89], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [87], "excluded_lines": [], "start_line": 85}, "_parse_descriptor": {"executed_lines": [98, 99, 100, 101, 102], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 97}, "": {"executed_lines": [1, 3, 4, 5, 7, 8, 13, 14, 19, 20, 23, 24, 27, 28, 30, 31, 44, 50, 57, 77, 85, 97], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"KeyNetra": {"executed_lines": [32, 33, 34, 36, 37, 38, 42, 45, 46, 47, 51, 52, 65, 66, 67, 78, 79, 80, 81, 82, 86, 88, 89], "summary": {"covered_lines": 23, "num_statements": 26, "percent_covered": 88.46153846153847, "percent_covered_display": "88", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 88.46153846153847, "percent_statements_covered_display": "88"}, "missing_lines": [48, 83, 87], "excluded_lines": [], "start_line": 24}, "": {"executed_lines": [1, 3, 4, 5, 7, 8, 13, 14, 19, 20, 23, 24, 27, 28, 30, 31, 44, 50, 57, 77, 85, 97, 98, 99, 100, 101, 102], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/cache/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/cache/access_index_cache.py": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 16, 17, 18, 20, 23, 31, 32, 33, 34, 35, 39, 42, 43, 44, 45, 47, 48, 50, 77, 79, 88, 102, 113, 114, 120, 121, 123, 124, 126, 127, 137, 139, 140, 143, 144], "summary": {"covered_lines": 42, "num_statements": 49, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 85.71428571428571, "percent_statements_covered_display": "86"}, "missing_lines": [36, 37, 38, 40, 41, 46, 49], "excluded_lines": [], "functions": {"RedisBackedAccessIndexCache.__init__": {"executed_lines": [17, 18], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 16}, "RedisBackedAccessIndexCache.get": {"executed_lines": [23, 31, 32, 33, 34, 35, 39, 42, 43, 44, 45, 47, 48, 50, 77], "summary": {"covered_lines": 15, "num_statements": 22, "percent_covered": 68.18181818181819, "percent_covered_display": "68", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 68.18181818181819, "percent_statements_covered_display": "68"}, "missing_lines": [36, 37, 38, 40, 41, 46, 49], "excluded_lines": [], "start_line": 20}, "RedisBackedAccessIndexCache.set": {"executed_lines": [88, 102], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 79}, "RedisBackedAccessIndexCache.invalidate": {"executed_lines": [114], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 113}, "RedisBackedAccessIndexCache.invalidate_tenant": {"executed_lines": [121], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 120}, "RedisBackedAccessIndexCache.invalidate_global": {"executed_lines": [124], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 123}, "RedisBackedAccessIndexCache._key": {"executed_lines": [127, 137], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 126}, "RedisBackedAccessIndexCache._namespace_key": {"executed_lines": [140], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 139}, "build_access_index_cache": {"executed_lines": [144], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 143}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 16, 20, 79, 113, 120, 123, 126, 139, 143], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"RedisBackedAccessIndexCache": {"executed_lines": [17, 18, 23, 31, 32, 33, 34, 35, 39, 42, 43, 44, 45, 47, 48, 50, 77, 88, 102, 114, 121, 124, 127, 137, 140], "summary": {"covered_lines": 25, "num_statements": 32, "percent_covered": 78.125, "percent_covered_display": "78", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 78.125, "percent_statements_covered_display": "78"}, "missing_lines": [36, 37, 38, 40, 41, 46, 49], "excluded_lines": [], "start_line": 13}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 16, 20, 79, 113, 120, 123, 126, 139, 143, 144], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/cache/acl_cache.py": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 16, 17, 18, 20, 23, 31, 32, 33, 62, 71, 72, 83, 84, 90, 93, 94, 103, 105, 106, 109, 110], "summary": {"covered_lines": 28, "num_statements": 44, "percent_covered": 63.63636363636363, "percent_covered_display": "64", "missing_lines": 16, "excluded_lines": 0, "percent_statements_covered": 63.63636363636363, "percent_statements_covered_display": "64"}, "missing_lines": [34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 60, 91], "excluded_lines": [], "functions": {"RedisBackedACLCache.__init__": {"executed_lines": [17, 18], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 16}, "RedisBackedACLCache.get": {"executed_lines": [23, 31, 32, 33], "summary": {"covered_lines": 4, "num_statements": 19, "percent_covered": 21.05263157894737, "percent_covered_display": "21", "missing_lines": 15, "excluded_lines": 0, "percent_statements_covered": 21.05263157894737, "percent_statements_covered_display": "21"}, "missing_lines": [34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 60], "excluded_lines": [], "start_line": 20}, "RedisBackedACLCache.set": {"executed_lines": [71, 72], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 62}, "RedisBackedACLCache.invalidate": {"executed_lines": [84], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 83}, "RedisBackedACLCache.invalidate_global": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [91], "excluded_lines": [], "start_line": 90}, "RedisBackedACLCache._key": {"executed_lines": [94, 103], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 93}, "RedisBackedACLCache._namespace_key": {"executed_lines": [106], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 105}, "build_acl_cache": {"executed_lines": [110], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 109}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 16, 20, 62, 83, 90, 93, 105, 109], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"RedisBackedACLCache": {"executed_lines": [17, 18, 23, 31, 32, 33, 71, 72, 84, 94, 103, 106], "summary": {"covered_lines": 12, "num_statements": 28, "percent_covered": 42.857142857142854, "percent_covered_display": "43", "missing_lines": 16, "excluded_lines": 0, "percent_statements_covered": 42.857142857142854, "percent_statements_covered_display": "43"}, "missing_lines": [34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 60, 91], "excluded_lines": [], "start_line": 13}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 16, 20, 62, 83, 90, 93, 105, 109, 110], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/cache/backends.py": {"executed_lines": [7, 9, 10, 11, 13, 15, 18, 30, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 50, 51, 53, 54, 55, 56, 57, 60, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 76, 77, 78, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 101, 104, 107, 108, 109], "summary": {"covered_lines": 64, "num_statements": 66, "percent_covered": 96.96969696969697, "percent_covered_display": "97", "missing_lines": 2, "excluded_lines": 10, "percent_statements_covered": 96.96969696969697, "percent_statements_covered_display": "97"}, "missing_lines": [74, 79], "excluded_lines": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "functions": {"CacheBackend.get": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [21], "start_line": 21}, "CacheBackend.set": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [23], "start_line": 23}, "CacheBackend.delete": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [25], "start_line": 25}, "CacheBackend.incr": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [27], "start_line": 27}, "InMemoryCacheBackend.__init__": {"executed_lines": [34], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 33}, "InMemoryCacheBackend.get": {"executed_lines": [37, 38, 39, 40, 41, 42, 43, 44], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 36}, "InMemoryCacheBackend.set": {"executed_lines": [47, 48], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 46}, "InMemoryCacheBackend.delete": {"executed_lines": [51], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 50}, "InMemoryCacheBackend.incr": {"executed_lines": [54, 55, 56, 57], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 53}, "RedisCacheBackend.__init__": {"executed_lines": [64], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 63}, "RedisCacheBackend.get": {"executed_lines": [67, 68, 69, 70, 71, 72, 73], "summary": {"covered_lines": 7, "num_statements": 8, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 87.5, "percent_statements_covered_display": "88"}, "missing_lines": [74], "excluded_lines": [], "start_line": 66}, "RedisCacheBackend.set": {"executed_lines": [77, 78, 81, 82, 83, 84], "summary": {"covered_lines": 6, "num_statements": 7, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 85.71428571428571, "percent_statements_covered_display": "86"}, "missing_lines": [79], "excluded_lines": [], "start_line": 76}, "RedisCacheBackend.delete": {"executed_lines": [87, 88, 89, 90, 91], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 86}, "RedisCacheBackend.incr": {"executed_lines": [94, 95, 96, 97, 98], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 93}, "build_cache_backend": {"executed_lines": [107, 108, 109], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 104}, "": {"executed_lines": [7, 9, 10, 11, 13, 15, 18, 30, 33, 36, 46, 50, 53, 60, 63, 66, 76, 86, 93, 101, 104], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 6, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [20, 22, 24, 26, 28, 29], "start_line": 1}}, "classes": {"CacheBackend": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 4, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [21, 23, 25, 27], "start_line": 18}, "InMemoryCacheBackend": {"executed_lines": [34, 37, 38, 39, 40, 41, 42, 43, 44, 47, 48, 51, 54, 55, 56, 57], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 30}, "RedisCacheBackend": {"executed_lines": [64, 67, 68, 69, 70, 71, 72, 73, 77, 78, 81, 82, 83, 84, 87, 88, 89, 90, 91, 94, 95, 96, 97, 98], "summary": {"covered_lines": 24, "num_statements": 26, "percent_covered": 92.3076923076923, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 92.3076923076923, "percent_statements_covered_display": "92"}, "missing_lines": [74, 79], "excluded_lines": [], "start_line": 60}, "": {"executed_lines": [7, 9, 10, 11, 13, 15, 18, 30, 33, 36, 46, 50, 53, 60, 63, 66, 76, 86, 93, 101, 104, 107, 108, 109], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 6, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [20, 22, 24, 26, 28, 29], "start_line": 1}}}, "keynetra/infrastructure/cache/decision_cache.py": {"executed_lines": [8, 10, 11, 12, 14, 15, 16, 19, 20, 23, 26, 27, 29, 30, 31, 32, 33, 34, 37, 61, 62, 71, 73, 81, 82, 91, 92, 94, 95, 97, 98, 99, 101, 102, 105, 108], "summary": {"covered_lines": 36, "num_statements": 38, "percent_covered": 94.73684210526316, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 94.73684210526316, "percent_statements_covered_display": "95"}, "missing_lines": [35, 36], "excluded_lines": [], "functions": {"_stable_json": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "RedisBackedDecisionCache.__init__": {"executed_lines": [27], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 26}, "RedisBackedDecisionCache.get": {"executed_lines": [30, 31, 32, 33, 34, 37], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [35, 36], "excluded_lines": [], "start_line": 29}, "RedisBackedDecisionCache.set": {"executed_lines": [62, 71], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 61}, "RedisBackedDecisionCache.make_key": {"executed_lines": [81, 82, 91, 92], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 73}, "RedisBackedDecisionCache.bump_namespace": {"executed_lines": [95], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 94}, "RedisBackedDecisionCache._tenant_namespace": {"executed_lines": [98, 99], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 97}, "RedisBackedDecisionCache._namespace_key": {"executed_lines": [102], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 101}, "build_decision_cache": {"executed_lines": [108], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 105}, "": {"executed_lines": [8, 10, 11, 12, 14, 15, 16, 19, 23, 26, 29, 61, 73, 94, 97, 101, 105], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"RedisBackedDecisionCache": {"executed_lines": [27, 30, 31, 32, 33, 34, 37, 62, 71, 81, 82, 91, 92, 95, 98, 99, 102], "summary": {"covered_lines": 17, "num_statements": 19, "percent_covered": 89.47368421052632, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 89.47368421052632, "percent_statements_covered_display": "89"}, "missing_lines": [35, 36], "excluded_lines": [], "start_line": 23}, "": {"executed_lines": [8, 10, 11, 12, 14, 15, 16, 19, 20, 23, 26, 29, 61, 73, 94, 97, 101, 105, 108], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/cache/policy_cache.py": {"executed_lines": [7, 9, 10, 12, 13, 14, 17, 20, 21, 23, 24, 25, 26, 27, 28, 29, 32, 34, 35, 36, 38, 44, 46, 47, 48, 61, 63, 64, 66, 67, 68, 70, 71, 74, 77], "summary": {"covered_lines": 35, "num_statements": 39, "percent_covered": 89.74358974358974, "percent_covered_display": "90", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 89.74358974358974, "percent_statements_covered_display": "90"}, "missing_lines": [30, 31, 33, 37], "excluded_lines": [], "functions": {"RedisBackedPolicyCache.__init__": {"executed_lines": [21], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 20}, "RedisBackedPolicyCache.get": {"executed_lines": [24, 25, 26, 27, 28, 29, 32, 34, 35, 36, 38, 44], "summary": {"covered_lines": 12, "num_statements": 16, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [30, 31, 33, 37], "excluded_lines": [], "start_line": 23}, "RedisBackedPolicyCache.set": {"executed_lines": [47, 48, 61], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 46}, "RedisBackedPolicyCache.invalidate": {"executed_lines": [64], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 63}, "RedisBackedPolicyCache._cache_key": {"executed_lines": [67, 68], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 66}, "RedisBackedPolicyCache._namespace_key": {"executed_lines": [71], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 70}, "build_policy_cache": {"executed_lines": [77], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 74}, "": {"executed_lines": [7, 9, 10, 12, 13, 14, 17, 20, 23, 46, 63, 66, 70, 74], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"RedisBackedPolicyCache": {"executed_lines": [21, 24, 25, 26, 27, 28, 29, 32, 34, 35, 36, 38, 44, 47, 48, 61, 64, 67, 68, 71], "summary": {"covered_lines": 20, "num_statements": 24, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83"}, "missing_lines": [30, 31, 33, 37], "excluded_lines": [], "start_line": 17}, "": {"executed_lines": [7, 9, 10, 12, 13, 14, 17, 20, 23, 46, 63, 66, 70, 74, 77], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/cache/policy_distribution.py": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 12, 15, 16, 17, 18, 20, 24, 25, 26, 27, 41, 44, 45, 47, 48], "summary": {"covered_lines": 23, "num_statements": 29, "percent_covered": 79.3103448275862, "percent_covered_display": "79", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 79.3103448275862, "percent_statements_covered_display": "79"}, "missing_lines": [21, 28, 29, 30, 31, 38], "excluded_lines": [], "functions": {"PolicyUpdateEvent.to_json": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [21], "excluded_lines": [], "start_line": 20}, "publish_policy_update": {"executed_lines": [25, 26, 27], "summary": {"covered_lines": 3, "num_statements": 8, "percent_covered": 37.5, "percent_covered_display": "38", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 37.5, "percent_statements_covered_display": "38"}, "missing_lines": [28, 29, 30, 31, 38], "excluded_lines": [], "start_line": 24}, "RedisPolicyEventPublisher.__init__": {"executed_lines": [45], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 44}, "RedisPolicyEventPublisher.publish_policy_update": {"executed_lines": [48], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 47}, "": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 12, 15, 16, 17, 18, 20, 24, 41, 44, 47], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"PolicyUpdateEvent": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [21], "excluded_lines": [], "start_line": 16}, "RedisPolicyEventPublisher": {"executed_lines": [45, 48], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 41}, "": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 12, 15, 16, 17, 18, 20, 24, 25, 26, 27, 41, 44, 47], "summary": {"covered_lines": 21, "num_statements": 26, "percent_covered": 80.76923076923077, "percent_covered_display": "81", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 80.76923076923077, "percent_statements_covered_display": "81"}, "missing_lines": [28, 29, 30, 31, 38], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/cache/relationship_cache.py": {"executed_lines": [3, 5, 6, 8, 9, 12, 15, 16, 17, 19, 22, 25, 26, 27, 28, 31, 33, 34, 35, 37, 46, 48, 56, 57, 63, 64, 68, 69, 72, 75], "summary": {"covered_lines": 30, "num_statements": 34, "percent_covered": 88.23529411764706, "percent_covered_display": "88", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 88.23529411764706, "percent_statements_covered_display": "88"}, "missing_lines": [29, 30, 32, 36], "excluded_lines": [], "functions": {"RedisBackedRelationshipCache.__init__": {"executed_lines": [16, 17], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 15}, "RedisBackedRelationshipCache.get": {"executed_lines": [22, 25, 26, 27, 28, 31, 33, 34, 35, 37, 46], "summary": {"covered_lines": 11, "num_statements": 15, "percent_covered": 73.33333333333333, "percent_covered_display": "73", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 73.33333333333333, "percent_statements_covered_display": "73"}, "missing_lines": [29, 30, 32, 36], "excluded_lines": [], "start_line": 19}, "RedisBackedRelationshipCache.set": {"executed_lines": [56, 57], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 48}, "RedisBackedRelationshipCache.invalidate": {"executed_lines": [64], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 63}, "RedisBackedRelationshipCache._key": {"executed_lines": [69], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 68}, "build_relationship_cache": {"executed_lines": [75], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 72}, "": {"executed_lines": [3, 5, 6, 8, 9, 12, 15, 19, 48, 63, 68, 72], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"RedisBackedRelationshipCache": {"executed_lines": [16, 17, 22, 25, 26, 27, 28, 31, 33, 34, 35, 37, 46, 56, 57, 64, 69], "summary": {"covered_lines": 17, "num_statements": 21, "percent_covered": 80.95238095238095, "percent_covered_display": "81", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 80.95238095238095, "percent_statements_covered_display": "81"}, "missing_lines": [29, 30, 32, 36], "excluded_lines": [], "start_line": 12}, "": {"executed_lines": [3, 5, 6, 8, 9, 12, 15, 19, 48, 63, 68, 72, 75], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/cache/user_cache.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 36, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 36, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [1, 3, 4, 5, 7, 8, 9, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 28, 29, 30, 31, 32, 33, 34, 40, 41, 44, 45, 46, 47, 48, 49, 50, 51, 52, 58], "excluded_lines": [], "functions": {"get_cached_user_context": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 17, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 17, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [15, 16, 17, 18, 19, 20, 21, 22, 28, 29, 30, 31, 32, 33, 34, 40, 41], "excluded_lines": [], "start_line": 14}, "set_cached_user_context": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 9, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 9, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [45, 46, 47, 48, 49, 50, 51, 52, 58], "excluded_lines": [], "start_line": 44}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 10, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 10, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [1, 3, 4, 5, 7, 8, 9, 11, 14, 44], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 36, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 36, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [1, 3, 4, 5, 7, 8, 9, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 28, 29, 30, 31, 32, 33, 34, 40, 41, 44, 45, 46, 47, 48, 49, 50, 51, 52, 58], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/errors.py": {"executed_lines": [1, 4, 8, 12], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 4, 8, 12], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"KeyNetraError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 4}, "BootstrapError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 8}, "ConfigurationError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 12}, "": {"executed_lines": [1, 4, 8, 12], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/logging.py": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 12, 18, 19, 21, 22, 24, 25, 26, 27, 28, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46, 47, 48, 49, 50, 51, 52, 61, 62, 65, 71, 72, 73, 74, 75, 78, 79, 80, 81, 84, 85, 88, 89, 92, 93], "summary": {"covered_lines": 55, "num_statements": 62, "percent_covered": 88.70967741935483, "percent_covered_display": "89", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 88.70967741935483, "percent_statements_covered_display": "89"}, "missing_lines": [53, 54, 55, 56, 57, 58, 59], "excluded_lines": [], "functions": {"JsonLogFormatter.format": {"executed_lines": [21, 22, 24, 25, 26, 27, 28], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "configure_json_logging": {"executed_lines": [32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 31}, "configure_rich_logging": {"executed_lines": [47, 48, 49, 50, 51, 52, 61, 62, 65, 71, 72, 73, 74, 75], "summary": {"covered_lines": 14, "num_statements": 21, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [53, 54, 55, 56, 57, 58, 59], "excluded_lines": [], "start_line": 46}, "log_event": {"executed_lines": [79, 80, 81], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 78}, "set_correlation_id": {"executed_lines": [85], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 84}, "reset_correlation_id": {"executed_lines": [89], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 88}, "get_correlation_id": {"executed_lines": [93], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 92}, "": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 12, 18, 19, 31, 46, 78, 84, 88, 92], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"JsonLogFormatter": {"executed_lines": [21, 22, 24, 25, 26, 27, 28], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 18}, "": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 12, 18, 19, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46, 47, 48, 49, 50, 51, 52, 61, 62, 65, 71, 72, 73, 74, 75, 78, 79, 80, 81, 84, 85, 88, 89, 92, 93], "summary": {"covered_lines": 48, "num_statements": 55, "percent_covered": 87.27272727272727, "percent_covered_display": "87", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 87.27272727272727, "percent_statements_covered_display": "87"}, "missing_lines": [53, 54, 55, 56, 57, 58, 59], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/metrics.py": {"executed_lines": [3, 5, 11], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 5, 11], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 11], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/repositories/__init__.py": {"executed_lines": [3, 4, 5, 6, 7, 8, 10], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 4, 5, 6, 7, 8, 10], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 4, 5, 6, 7, 8, 10], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/repositories/acl.py": {"executed_lines": [3, 5, 6, 8, 9, 12, 15, 16, 18, 29, 38, 39, 40, 41, 43, 46, 57, 59, 60, 69, 71, 79, 91, 93, 94, 99, 101, 102], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"SqlACLRepository.__init__": {"executed_lines": [16], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 15}, "SqlACLRepository.create_acl_entry": {"executed_lines": [29, 38, 39, 40, 41], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 18}, "SqlACLRepository.list_resource_acl": {"executed_lines": [46, 57], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 43}, "SqlACLRepository.get_acl_entry": {"executed_lines": [60, 69], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 59}, "SqlACLRepository.find_matching_acl": {"executed_lines": [79, 91], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 71}, "SqlACLRepository.delete_acl_entry": {"executed_lines": [94, 99], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 93}, "SqlACLRepository._to_record": {"executed_lines": [102], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 101}, "": {"executed_lines": [3, 5, 6, 8, 9, 12, 15, 18, 43, 59, 71, 93, 101], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"SqlACLRepository": {"executed_lines": [16, 29, 38, 39, 40, 41, 46, 57, 60, 69, 79, 91, 94, 99, 102], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 12}, "": {"executed_lines": [3, 5, 6, 8, 9, 12, 15, 18, 43, 59, 71, 93, 101], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/repositories/audit.py": {"executed_lines": [3, 5, 7, 8, 10, 11, 12, 13, 16, 19, 20, 22, 32, 46, 47, 49, 61, 62, 63, 64, 65, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 87, 94, 95, 96, 101, 103, 104, 105, 107, 109, 110, 111], "summary": {"covered_lines": 43, "num_statements": 44, "percent_covered": 97.72727272727273, "percent_covered_display": "98", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 97.72727272727273, "percent_statements_covered_display": "98"}, "missing_lines": [106], "excluded_lines": [], "functions": {"SqlAuditRepository.__init__": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "SqlAuditRepository.write": {"executed_lines": [32, 46, 47], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 22}, "SqlAuditRepository.list_page": {"executed_lines": [61, 62, 63, 64, 65, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 87, 94, 95, 96, 101], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 49}, "SqlAuditRepository._json_field": {"executed_lines": [104, 105, 107], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [106], "excluded_lines": [], "start_line": 103}, "SqlAuditRepository._to_item": {"executed_lines": [111], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 110}, "": {"executed_lines": [3, 5, 7, 8, 10, 11, 12, 13, 16, 19, 22, 49, 103, 109, 110], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"SqlAuditRepository": {"executed_lines": [20, 32, 46, 47, 61, 62, 63, 64, 65, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 87, 94, 95, 96, 101, 104, 105, 107, 111], "summary": {"covered_lines": 28, "num_statements": 29, "percent_covered": 96.55172413793103, "percent_covered_display": "97", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 96.55172413793103, "percent_statements_covered_display": "97"}, "missing_lines": [106], "excluded_lines": [], "start_line": 16}, "": {"executed_lines": [3, 5, 7, 8, 10, 11, 12, 13, 16, 19, 22, 49, 103, 109, 110], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/repositories/auth_models.py": {"executed_lines": [3, 5, 6, 8, 9, 12, 15, 16, 18, 19, 26, 28, 36, 43, 44, 50, 55, 56, 57, 59, 60], "summary": {"covered_lines": 21, "num_statements": 24, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 87.5, "percent_statements_covered_display": "88"}, "missing_lines": [52, 53, 54], "excluded_lines": [], "functions": {"SqlAuthModelRepository.__init__": {"executed_lines": [16], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 15}, "SqlAuthModelRepository.get_model": {"executed_lines": [19, 26], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 18}, "SqlAuthModelRepository.upsert_model": {"executed_lines": [36, 43, 44, 50, 55, 56, 57], "summary": {"covered_lines": 7, "num_statements": 10, "percent_covered": 70.0, "percent_covered_display": "70", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 70.0, "percent_statements_covered_display": "70"}, "missing_lines": [52, 53, 54], "excluded_lines": [], "start_line": 28}, "SqlAuthModelRepository._to_record": {"executed_lines": [60], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 59}, "": {"executed_lines": [3, 5, 6, 8, 9, 12, 15, 18, 28, 59], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"SqlAuthModelRepository": {"executed_lines": [16, 19, 26, 36, 43, 44, 50, 55, 56, 57, 60], "summary": {"covered_lines": 11, "num_statements": 14, "percent_covered": 78.57142857142857, "percent_covered_display": "79", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 78.57142857142857, "percent_statements_covered_display": "79"}, "missing_lines": [52, 53, 54], "excluded_lines": [], "start_line": 12}, "": {"executed_lines": [3, 5, 6, 8, 9, 12, 15, 18, 28, 59], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/repositories/idempotency.py": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 15, 16, 19, 20, 21, 22, 23, 26, 29, 30, 32, 35, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52, 60, 68, 69, 71, 72, 73, 74, 75, 77, 78], "summary": {"covered_lines": 42, "num_statements": 45, "percent_covered": 93.33333333333333, "percent_covered_display": "93", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 93.33333333333333, "percent_statements_covered_display": "93"}, "missing_lines": [47, 51, 70], "excluded_lines": [], "functions": {"SqlIdempotencyRepository.__init__": {"executed_lines": [30], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 29}, "SqlIdempotencyRepository.start": {"executed_lines": [35, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52], "summary": {"covered_lines": 14, "num_statements": 16, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 87.5, "percent_statements_covered_display": "88"}, "missing_lines": [47, 51], "excluded_lines": [], "start_line": 32}, "SqlIdempotencyRepository.complete": {"executed_lines": [68, 69, 71, 72, 73, 74, 75], "summary": {"covered_lines": 7, "num_statements": 8, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 87.5, "percent_statements_covered_display": "88"}, "missing_lines": [70], "excluded_lines": [], "start_line": 60}, "SqlIdempotencyRepository._get": {"executed_lines": [78], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 77}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 15, 16, 19, 20, 21, 22, 23, 26, 29, 32, 60, 77], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"IdempotencyStartResult": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 16}, "SqlIdempotencyRepository": {"executed_lines": [30, 35, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52, 68, 69, 71, 72, 73, 74, 75, 78], "summary": {"covered_lines": 23, "num_statements": 26, "percent_covered": 88.46153846153847, "percent_covered_display": "88", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 88.46153846153847, "percent_statements_covered_display": "88"}, "missing_lines": [47, 51, 70], "excluded_lines": [], "start_line": 26}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 15, 16, 19, 20, 21, 22, 23, 26, 29, 32, 60, 77], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/repositories/policies.py": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 13, 14, 15, 18, 21, 22, 24, 27, 28, 31, 32, 33, 47, 48, 60, 62, 65, 66, 69, 70, 71, 84, 85, 96, 98, 105, 112, 122, 125, 126, 127, 139, 140, 141, 142, 143, 145, 157, 166, 167, 168, 169, 170, 172, 173, 175, 186, 187, 188, 204, 205, 214, 215, 224, 226, 236, 237, 243, 244, 253, 255, 260, 261, 263, 266, 267, 274, 275, 278, 282], "summary": {"covered_lines": 77, "num_statements": 109, "percent_covered": 70.64220183486239, "percent_covered_display": "71", "missing_lines": 32, "excluded_lines": 0, "percent_statements_covered": 70.64220183486239, "percent_statements_covered_display": "71"}, "missing_lines": [29, 30, 34, 46, 67, 68, 72, 83, 113, 189, 191, 192, 202, 203, 225, 238, 239, 240, 241, 254, 277, 283, 296, 297, 298, 299, 300, 301, 302, 303, 304, 316], "excluded_lines": [], "functions": {"SqlPolicyRepository.__init__": {"executed_lines": [22], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 21}, "SqlPolicyRepository.list_current_policies": {"executed_lines": [27, 28, 31, 32, 33, 47, 48, 60], "summary": {"covered_lines": 8, "num_statements": 12, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [29, 30, 34, 46], "excluded_lines": [], "start_line": 24}, "SqlPolicyRepository.list_current_policy_views": {"executed_lines": [65, 66, 69, 70, 71, 84, 85, 96], "summary": {"covered_lines": 8, "num_statements": 12, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [67, 68, 72, 83], "excluded_lines": [], "start_line": 62}, "SqlPolicyRepository.list_current_policy_page": {"executed_lines": [105, 112, 122, 125, 126, 127, 139, 140, 141, 142, 143], "summary": {"covered_lines": 11, "num_statements": 12, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 91.66666666666667, "percent_statements_covered_display": "92"}, "missing_lines": [113], "excluded_lines": [], "start_line": 98}, "SqlPolicyRepository.create_policy_version": {"executed_lines": [157, 166, 167, 168, 169, 170, 172, 173, 175, 186, 187, 188, 204, 205], "summary": {"covered_lines": 14, "num_statements": 19, "percent_covered": 73.6842105263158, "percent_covered_display": "74", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 73.6842105263158, "percent_statements_covered_display": "74"}, "missing_lines": [189, 191, 192, 202, 203], "excluded_lines": [], "start_line": 145}, "SqlPolicyRepository.rollback_policy": {"executed_lines": [215, 224, 226, 236, 237], "summary": {"covered_lines": 5, "num_statements": 10, "percent_covered": 50.0, "percent_covered_display": "50", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 50.0, "percent_statements_covered_display": "50"}, "missing_lines": [225, 238, 239, 240, 241], "excluded_lines": [], "start_line": 214}, "SqlPolicyRepository.delete_policy": {"executed_lines": [244, 253, 255, 260, 261], "summary": {"covered_lines": 5, "num_statements": 6, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83"}, "missing_lines": [254], "excluded_lines": [], "start_line": 243}, "SqlPolicyRepository._current_policy_rows": {"executed_lines": [266, 267, 274, 275, 278], "summary": {"covered_lines": 5, "num_statements": 6, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83"}, "missing_lines": [277], "excluded_lines": [], "start_line": 263}, "SqlPolicyRepository._legacy_current_policy_rows": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 11, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 11, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [283, 296, 297, 298, 299, 300, 301, 302, 303, 304, 316], "excluded_lines": [], "start_line": 282}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 13, 14, 15, 18, 21, 24, 62, 98, 145, 214, 243, 263, 282], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"SqlPolicyRepository": {"executed_lines": [22, 27, 28, 31, 32, 33, 47, 48, 60, 65, 66, 69, 70, 71, 84, 85, 96, 105, 112, 122, 125, 126, 127, 139, 140, 141, 142, 143, 157, 166, 167, 168, 169, 170, 172, 173, 175, 186, 187, 188, 204, 205, 215, 224, 226, 236, 237, 244, 253, 255, 260, 261, 266, 267, 274, 275, 278], "summary": {"covered_lines": 57, "num_statements": 89, "percent_covered": 64.04494382022472, "percent_covered_display": "64", "missing_lines": 32, "excluded_lines": 0, "percent_statements_covered": 64.04494382022472, "percent_statements_covered_display": "64"}, "missing_lines": [29, 30, 34, 46, 67, 68, 72, 83, 113, 189, 191, 192, 202, 203, 225, 238, 239, 240, 241, 254, 277, 283, 296, 297, 298, 299, 300, 301, 302, 303, 304, 316], "excluded_lines": [], "start_line": 18}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 12, 13, 14, 15, 18, 21, 24, 62, 98, 145, 214, 243, 263, 282], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/repositories/relationships.py": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 16, 17, 19, 22, 38, 49, 58, 64, 85, 97, 98, 99, 109, 110, 120, 122, 125, 141, 152, 155, 156, 189, 228, 238, 246, 247, 248, 249], "summary": {"covered_lines": 35, "num_statements": 51, "percent_covered": 68.62745098039215, "percent_covered_display": "69", "missing_lines": 16, "excluded_lines": 0, "percent_statements_covered": 68.62745098039215, "percent_statements_covered_display": "69"}, "missing_lines": [65, 111, 112, 157, 174, 177, 178, 187, 192, 193, 194, 198, 215, 216, 217, 226], "excluded_lines": [], "functions": {"SqlRelationshipRepository.__init__": {"executed_lines": [17], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 16}, "SqlRelationshipRepository.list_for_subject": {"executed_lines": [22, 38], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "SqlRelationshipRepository.list_for_subject_page": {"executed_lines": [58, 64, 85, 97, 98, 99, 109, 110, 120], "summary": {"covered_lines": 9, "num_statements": 12, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [65, 111, 112], "excluded_lines": [], "start_line": 49}, "SqlRelationshipRepository.list_for_object": {"executed_lines": [125, 141], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 122}, "SqlRelationshipRepository.list_for_subjects": {"executed_lines": [155, 156], "summary": {"covered_lines": 2, "num_statements": 7, "percent_covered": 28.571428571428573, "percent_covered_display": "29", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 28.571428571428573, "percent_statements_covered_display": "29"}, "missing_lines": [157, 174, 177, 178, 187], "excluded_lines": [], "start_line": 152}, "SqlRelationshipRepository.list_for_objects": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [192, 193, 194, 198, 215, 216, 217, 226], "excluded_lines": [], "start_line": 189}, "SqlRelationshipRepository.create": {"executed_lines": [238, 246, 247, 248, 249], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 228}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 16, 19, 49, 122, 152, 189, 228], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"SqlRelationshipRepository": {"executed_lines": [17, 22, 38, 58, 64, 85, 97, 98, 99, 109, 110, 120, 125, 141, 155, 156, 238, 246, 247, 248, 249], "summary": {"covered_lines": 21, "num_statements": 37, "percent_covered": 56.75675675675676, "percent_covered_display": "57", "missing_lines": 16, "excluded_lines": 0, "percent_statements_covered": 56.75675675675676, "percent_statements_covered_display": "57"}, "missing_lines": [65, 111, 112, 157, 174, 177, 178, 187, 192, 193, 194, 198, 215, 216, 217, 226], "excluded_lines": [], "start_line": 13}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 16, 19, 49, 122, 152, 189, 228], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/repositories/tenants.py": {"executed_lines": [7, 9, 10, 12, 13, 16, 19, 20, 22, 30, 31, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 48, 49, 50, 51, 53, 54, 55, 57, 58, 59, 60, 62, 63], "summary": {"covered_lines": 34, "num_statements": 40, "percent_covered": 85.0, "percent_covered_display": "85", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 85.0, "percent_statements_covered_display": "85"}, "missing_lines": [23, 26, 27, 28, 47, 56], "excluded_lines": [], "functions": {"SqlTenantRepository.__init__": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "SqlTenantRepository.get_by_id": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [23, 26, 27, 28], "excluded_lines": [], "start_line": 22}, "SqlTenantRepository.get_or_create": {"executed_lines": [31, 36, 37, 38, 39, 40, 41, 42], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 30}, "SqlTenantRepository.bump_policy_version": {"executed_lines": [45, 46, 48, 49, 50, 51], "summary": {"covered_lines": 6, "num_statements": 7, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 85.71428571428571, "percent_statements_covered_display": "86"}, "missing_lines": [47], "excluded_lines": [], "start_line": 44}, "SqlTenantRepository.bump_revision": {"executed_lines": [54, 55, 57, 58, 59, 60], "summary": {"covered_lines": 6, "num_statements": 7, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 85.71428571428571, "percent_statements_covered_display": "86"}, "missing_lines": [56], "excluded_lines": [], "start_line": 53}, "SqlTenantRepository._to_record": {"executed_lines": [63], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 62}, "": {"executed_lines": [7, 9, 10, 12, 13, 16, 19, 22, 30, 44, 53, 62], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"SqlTenantRepository": {"executed_lines": [20, 31, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 54, 55, 57, 58, 59, 60, 63], "summary": {"covered_lines": 22, "num_statements": 28, "percent_covered": 78.57142857142857, "percent_covered_display": "79", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 78.57142857142857, "percent_statements_covered_display": "79"}, "missing_lines": [23, 26, 27, 28, 47, 56], "excluded_lines": [], "start_line": 16}, "": {"executed_lines": [7, 9, 10, 12, 13, 16, 19, 22, 30, 44, 53, 62], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/repositories/users.py": {"executed_lines": [3, 5, 7, 8, 10, 13, 16, 17, 19, 20, 29, 30, 45, 46, 47, 49, 50, 51], "summary": {"covered_lines": 18, "num_statements": 37, "percent_covered": 48.648648648648646, "percent_covered_display": "49", "missing_lines": 19, "excluded_lines": 0, "percent_statements_covered": 48.648648648648646, "percent_statements_covered_display": "49"}, "missing_lines": [31, 32, 33, 34, 35, 36, 37, 38, 52, 61, 62, 63, 64, 65, 66, 67, 68, 69, 75], "excluded_lines": [], "functions": {"SqlUserRepository.__init__": {"executed_lines": [17], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 16}, "SqlUserRepository.get_user_context": {"executed_lines": [20, 29, 30], "summary": {"covered_lines": 3, "num_statements": 11, "percent_covered": 27.272727272727273, "percent_covered_display": "27", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 27.272727272727273, "percent_statements_covered_display": "27"}, "missing_lines": [31, 32, 33, 34, 35, 36, 37, 38], "excluded_lines": [], "start_line": 19}, "SqlUserRepository.list_user_ids": {"executed_lines": [46, 47], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 45}, "SqlUserRepository.get_user_contexts": {"executed_lines": [50, 51], "summary": {"covered_lines": 2, "num_statements": 13, "percent_covered": 15.384615384615385, "percent_covered_display": "15", "missing_lines": 11, "excluded_lines": 0, "percent_statements_covered": 15.384615384615385, "percent_statements_covered_display": "15"}, "missing_lines": [52, 61, 62, 63, 64, 65, 66, 67, 68, 69, 75], "excluded_lines": [], "start_line": 49}, "": {"executed_lines": [3, 5, 7, 8, 10, 13, 16, 19, 45, 49], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"SqlUserRepository": {"executed_lines": [17, 20, 29, 30, 46, 47, 50, 51], "summary": {"covered_lines": 8, "num_statements": 27, "percent_covered": 29.62962962962963, "percent_covered_display": "30", "missing_lines": 19, "excluded_lines": 0, "percent_statements_covered": 29.62962962962963, "percent_statements_covered_display": "30"}, "missing_lines": [31, 32, 33, 34, 35, 36, 37, 38, 52, 61, 62, 63, 64, 65, 66, 67, 68, 69, 75], "excluded_lines": [], "start_line": 13}, "": {"executed_lines": [3, 5, 7, 8, 10, 13, 16, 19, 45, 49], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/storage/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/infrastructure/storage/session.py": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14, 17, 18, 19, 42, 43, 45, 55, 58, 59, 60, 61, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 83, 84, 85, 86, 87, 88, 89, 91], "summary": {"covered_lines": 44, "num_statements": 46, "percent_covered": 95.65217391304348, "percent_covered_display": "96", "missing_lines": 2, "excluded_lines": 16, "percent_statements_covered": 95.65217391304348, "percent_statements_covered_display": "96"}, "missing_lines": [49, 67], "excluded_lines": [22, 23, 24, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], "functions": {"_operation_name": {"executed_lines": [18, 19], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 17}, "_before_cursor_execute": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [26], "start_line": 23}, "_after_cursor_execute": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 7, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [33, 34, 35, 36, 37, 38, 39], "start_line": 30}, "create_engine_for_url": {"executed_lines": [45, 55], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [49], "excluded_lines": [], "start_line": 43}, "create_session_factory": {"executed_lines": [60, 61], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 59}, "initialize_database": {"executed_lines": [66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80], "summary": {"covered_lines": 12, "num_statements": 13, "percent_covered": 92.3076923076923, "percent_covered_display": "92", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 92.3076923076923, "percent_statements_covered_display": "92"}, "missing_lines": [67], "excluded_lines": [], "start_line": 65}, "get_db": {"executed_lines": [84, 85, 86, 87, 88, 89, 91], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 83}, "": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14, 17, 42, 43, 58, 59, 64, 65, 83], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 8, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [22, 23, 24, 25, 29, 30, 31, 32], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14, 17, 18, 19, 42, 43, 45, 55, 58, 59, 60, 61, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 83, 84, 85, 86, 87, 88, 89, 91], "summary": {"covered_lines": 44, "num_statements": 46, "percent_covered": 95.65217391304348, "percent_covered_display": "96", "missing_lines": 2, "excluded_lines": 16, "percent_statements_covered": 95.65217391304348, "percent_statements_covered_display": "96"}, "missing_lines": [49, 67], "excluded_lines": [22, 23, 24, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], "start_line": 1}}}, "keynetra/main.py": {"executed_lines": [6, 8], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [6, 8], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [6, 8], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/migrations.py": {"executed_lines": [3, 5, 6, 7, 9, 10, 13, 14, 15, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 91.30434782608695, "percent_statements_covered_display": "91"}, "missing_lines": [16, 17], "excluded_lines": [], "functions": {"parse_revision_file": {"executed_lines": [14, 15, 18, 19, 20, 21], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [16, 17], "excluded_lines": [], "start_line": 13}, "find_destructive_revisions": {"executed_lines": [25, 26, 27, 28, 29, 30, 31], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 24}, "": {"executed_lines": [3, 5, 6, 7, 9, 10, 13, 24], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 6, 7, 9, 10, 13, 14, 15, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 91.30434782608695, "percent_statements_covered_display": "91"}, "missing_lines": [16, 17], "excluded_lines": [], "start_line": 1}}}, "keynetra/modeling/__init__.py": {"executed_lines": [1, 2, 3, 5], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 2, 3, 5], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 2, 3, 5], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/modeling/model_validator.py": {"executed_lines": [3, 5, 14, 15, 17, 19, 21, 23, 24, 26, 27, 29, 30, 32, 35, 36, 37, 39, 40, 43, 44, 45, 46], "summary": {"covered_lines": 23, "num_statements": 34, "percent_covered": 67.6470588235294, "percent_covered_display": "68", "missing_lines": 11, "excluded_lines": 0, "percent_statements_covered": 67.6470588235294, "percent_statements_covered_display": "68"}, "missing_lines": [16, 18, 20, 22, 25, 28, 31, 38, 41, 42, 47], "excluded_lines": [], "functions": {"validate_authorization_schema": {"executed_lines": [15, 17, 19, 21, 23, 24, 26, 27, 29, 30, 32], "summary": {"covered_lines": 11, "num_statements": 18, "percent_covered": 61.111111111111114, "percent_covered_display": "61", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 61.111111111111114, "percent_statements_covered_display": "61"}, "missing_lines": [16, 18, 20, 22, 25, 28, 31], "excluded_lines": [], "start_line": 14}, "_validate_expr": {"executed_lines": [36, 37, 39, 40, 43, 44, 45, 46], "summary": {"covered_lines": 8, "num_statements": 12, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [38, 41, 42, 47], "excluded_lines": [], "start_line": 35}, "": {"executed_lines": [3, 5, 14, 35], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 14, 15, 17, 19, 21, 23, 24, 26, 27, 29, 30, 32, 35, 36, 37, 39, 40, 43, 44, 45, 46], "summary": {"covered_lines": 23, "num_statements": 34, "percent_covered": 67.6470588235294, "percent_covered_display": "68", "missing_lines": 11, "excluded_lines": 0, "percent_statements_covered": 67.6470588235294, "percent_statements_covered_display": "68"}, "missing_lines": [16, 18, 20, 22, 25, 28, 31, 38, 41, 42, 47], "excluded_lines": [], "start_line": 1}}}, "keynetra/modeling/permission_compiler.py": {"executed_lines": [3, 5, 6, 8, 9, 20, 21, 22, 23, 26, 27, 28, 29, 30, 31, 32, 34, 35, 47, 50, 53, 54, 58, 67, 68, 69, 70, 72, 74, 75], "summary": {"covered_lines": 30, "num_statements": 33, "percent_covered": 90.9090909090909, "percent_covered_display": "91", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 90.9090909090909, "percent_statements_covered_display": "91"}, "missing_lines": [71, 73, 76], "excluded_lines": [], "functions": {"CompiledAuthorizationModel.to_dict": {"executed_lines": [35], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 34}, "compile_authorization_schema": {"executed_lines": [50, 53, 54, 58], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 47}, "_expr_to_dict": {"executed_lines": [68, 69, 70, 72, 74, 75], "summary": {"covered_lines": 6, "num_statements": 9, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [71, 73, 76], "excluded_lines": [], "start_line": 67}, "": {"executed_lines": [3, 5, 6, 8, 9, 20, 21, 22, 23, 26, 27, 28, 29, 30, 31, 32, 34, 47, 67], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"CompiledPermission": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 21}, "CompiledAuthorizationModel": {"executed_lines": [35], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 27}, "": {"executed_lines": [3, 5, 6, 8, 9, 20, 21, 22, 23, 26, 27, 28, 29, 30, 31, 32, 34, 47, 50, 53, 54, 58, 67, 68, 69, 70, 72, 74, 75], "summary": {"covered_lines": 29, "num_statements": 32, "percent_covered": 90.625, "percent_covered_display": "91", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 90.625, "percent_statements_covered_display": "91"}, "missing_lines": [71, 73, 76], "excluded_lines": [], "start_line": 1}}}, "keynetra/modeling/schema_parser.py": {"executed_lines": [3, 5, 6, 7, 10, 11, 12, 15, 16, 17, 20, 21, 22, 23, 26, 27, 28, 29, 32, 35, 36, 37, 38, 39, 40, 41, 44, 47, 48, 49, 50, 53, 54, 55, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 82, 91, 92, 94, 95, 96, 97, 99, 101, 102, 104, 107, 108, 110, 111, 112, 113, 115, 116, 117, 119, 122, 123, 124, 126, 129, 130, 131, 132, 133, 134, 137, 138, 139, 142, 145, 146, 148, 149, 150, 153, 158, 160], "summary": {"covered_lines": 98, "num_statements": 119, "percent_covered": 82.3529411764706, "percent_covered_display": "82", "missing_lines": 21, "excluded_lines": 0, "percent_statements_covered": 82.3529411764706, "percent_statements_covered_display": "82"}, "missing_lines": [51, 56, 80, 93, 98, 100, 103, 109, 114, 118, 125, 140, 141, 147, 151, 152, 154, 155, 156, 157, 159], "excluded_lines": [], "functions": {"parse_authorization_schema": {"executed_lines": [48, 49, 50, 53, 54, 55, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 82], "summary": {"covered_lines": 28, "num_statements": 31, "percent_covered": 90.3225806451613, "percent_covered_display": "90", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 90.3225806451613, "percent_statements_covered_display": "90"}, "missing_lines": [51, 56, 80], "excluded_lines": [], "start_line": 47}, "_parse_relation": {"executed_lines": [92, 94, 95, 96, 97, 99, 101, 102, 104], "summary": {"covered_lines": 9, "num_statements": 13, "percent_covered": 69.23076923076923, "percent_covered_display": "69", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 69.23076923076923, "percent_statements_covered_display": "69"}, "missing_lines": [93, 98, 100, 103], "excluded_lines": [], "start_line": 91}, "_parse_permission": {"executed_lines": [108, 110, 111, 112, 113, 115, 116, 117, 119], "summary": {"covered_lines": 9, "num_statements": 12, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [109, 114, 118], "excluded_lines": [], "start_line": 107}, "_tokenize": {"executed_lines": [123, 124, 126], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [125], "excluded_lines": [], "start_line": 122}, "_parse_expr": {"executed_lines": [130, 131, 132, 133, 134], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 129}, "_parse_term": {"executed_lines": [138, 139, 142], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 60.0, "percent_statements_covered_display": "60"}, "missing_lines": [140, 141], "excluded_lines": [], "start_line": 137}, "_parse_factor": {"executed_lines": [146, 148, 149, 150, 153, 158, 160], "summary": {"covered_lines": 7, "num_statements": 15, "percent_covered": 46.666666666666664, "percent_covered_display": "47", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 46.666666666666664, "percent_statements_covered_display": "47"}, "missing_lines": [147, 151, 152, 154, 155, 156, 157, 159], "excluded_lines": [], "start_line": 145}, "": {"executed_lines": [3, 5, 6, 7, 10, 11, 12, 15, 16, 17, 20, 21, 22, 23, 26, 27, 28, 29, 32, 35, 36, 37, 38, 39, 40, 41, 44, 47, 91, 107, 122, 129, 137, 145], "summary": {"covered_lines": 34, "num_statements": 34, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"IdentifierExpr": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 11}, "NotExpr": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 16}, "AndExpr": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 21}, "OrExpr": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 27}, "AuthorizationSchema": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 36}, "": {"executed_lines": [3, 5, 6, 7, 10, 11, 12, 15, 16, 17, 20, 21, 22, 23, 26, 27, 28, 29, 32, 35, 36, 37, 38, 39, 40, 41, 44, 47, 48, 49, 50, 53, 54, 55, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 82, 91, 92, 94, 95, 96, 97, 99, 101, 102, 104, 107, 108, 110, 111, 112, 113, 115, 116, 117, 119, 122, 123, 124, 126, 129, 130, 131, 132, 133, 134, 137, 138, 139, 142, 145, 146, 148, 149, 150, 153, 158, 160], "summary": {"covered_lines": 98, "num_statements": 119, "percent_covered": 82.3529411764706, "percent_covered_display": "82", "missing_lines": 21, "excluded_lines": 0, "percent_statements_covered": 82.3529411764706, "percent_statements_covered_display": "82"}, "missing_lines": [51, 56, 80, 93, 98, 100, 103, 109, 114, 118, 125, 140, 141, 147, 151, 152, 154, 155, 156, 157, 159], "excluded_lines": [], "start_line": 1}}}, "keynetra/observability/__init__.py": {"executed_lines": [1, 3, 19], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 19], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 19], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/observability/http_metrics.py": {"executed_lines": [3, 5, 6, 11, 12, 17, 27, 30, 31, 32, 33, 35, 36, 42, 43], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 6, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [7, 8, 9, 22, 23, 24], "functions": {"record_http_request": {"executed_lines": [30, 31, 32, 33, 35, 36, 42, 43], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 27}, "": {"executed_lines": [3, 5, 6, 11, 12, 17, 27], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 6, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [7, 8, 9, 22, 23, 24], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 6, 11, 12, 17, 27, 30, 31, 32, 33, 35, 36, 42, 43], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 6, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [7, 8, 9, 22, 23, 24], "start_line": 1}}}, "keynetra/observability/metrics.py": {"executed_lines": [3, 5, 6, 11, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77, 82, 87, 92, 97, 123, 124, 125, 128, 129, 130, 137, 138, 139, 142, 143, 144, 147, 148, 149, 152, 153, 154, 157, 158, 159, 162, 163, 164, 167, 168, 169, 174, 175, 176, 177, 180, 181, 182, 183, 186, 187, 188, 189, 190, 191, 193, 194, 196, 197, 201, 202, 203, 206, 207, 208, 211, 212, 213, 216, 217, 218, 221, 226, 227, 228, 231, 232, 233], "summary": {"covered_lines": 86, "num_statements": 90, "percent_covered": 95.55555555555556, "percent_covered_display": "96", "missing_lines": 4, "excluded_lines": 22, "percent_statements_covered": 95.55555555555556, "percent_statements_covered_display": "96"}, "missing_lines": [192, 198, 222, 223], "excluded_lines": [7, 8, 9, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120], "functions": {"_tenant_label": {"executed_lines": [124, 125], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 123}, "_cache_type_label": {"executed_lines": [129, 130], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 128}, "record_access_check": {"executed_lines": [138, 139], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 137}, "record_acl_match": {"executed_lines": [143, 144], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 142}, "record_policy_evaluation": {"executed_lines": [148, 149], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 147}, "record_relationship_traversal": {"executed_lines": [153, 154], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 152}, "record_policy_compilation": {"executed_lines": [158, 159], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 157}, "record_revision_update": {"executed_lines": [163, 164], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 162}, "observe_access_check_latency": {"executed_lines": [168, 169], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 167}, "record_cache_hit": {"executed_lines": [175, 176, 177], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 174}, "record_cache_miss": {"executed_lines": [181, 182, 183], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 180}, "record_cache_event": {"executed_lines": [187, 188, 189, 190, 191, 193, 194, 196, 197], "summary": {"covered_lines": 9, "num_statements": 11, "percent_covered": 81.81818181818181, "percent_covered_display": "82", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 81.81818181818181, "percent_statements_covered_display": "82"}, "missing_lines": [192, 198], "excluded_lines": [], "start_line": 186}, "observe_decision_latency": {"executed_lines": [202, 203], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 201}, "record_api_error": {"executed_lines": [207, 208], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 206}, "record_bootstrap_failure": {"executed_lines": [212, 213], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 211}, "record_auth_failure": {"executed_lines": [217, 218], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 216}, "record_jwks_fetch": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [222, 223], "excluded_lines": [], "start_line": 221}, "record_access_index_rebuild": {"executed_lines": [227, 228], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 226}, "observe_db_query_latency": {"executed_lines": [232, 233], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 231}, "": {"executed_lines": [3, 5, 6, 11, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77, 82, 87, 92, 97, 123, 128, 137, 142, 147, 152, 157, 162, 167, 174, 180, 186, 201, 206, 211, 216, 221, 226, 231], "summary": {"covered_lines": 41, "num_statements": 41, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 22, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [7, 8, 9, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 6, 11, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77, 82, 87, 92, 97, 123, 124, 125, 128, 129, 130, 137, 138, 139, 142, 143, 144, 147, 148, 149, 152, 153, 154, 157, 158, 159, 162, 163, 164, 167, 168, 169, 174, 175, 176, 177, 180, 181, 182, 183, 186, 187, 188, 189, 190, 191, 193, 194, 196, 197, 201, 202, 203, 206, 207, 208, 211, 212, 213, 216, 217, 218, 221, 226, 227, 228, 231, 232, 233], "summary": {"covered_lines": 86, "num_statements": 90, "percent_covered": 95.55555555555556, "percent_covered_display": "96", "missing_lines": 4, "excluded_lines": 22, "percent_statements_covered": 95.55555555555556, "percent_statements_covered_display": "96"}, "missing_lines": [192, 198, 222, 223], "excluded_lines": [7, 8, 9, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120], "start_line": 1}}}, "keynetra/services/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/access_indexer.py": {"executed_lines": [3, 5, 6, 7, 8, 10, 11, 21, 22, 23, 24, 26, 30, 36, 39, 47, 48, 49, 50, 51, 52, 53, 54, 56, 64, 70, 71, 72, 73, 74, 83, 89, 90, 92, 100, 101, 107, 108, 114, 122, 128, 142, 143, 164, 171, 173, 203, 204, 205, 206, 207, 214, 219, 220, 222, 223, 226, 229, 230, 235, 238, 245, 274, 275], "summary": {"covered_lines": 64, "num_statements": 114, "percent_covered": 56.14035087719298, "percent_covered_display": "56", "missing_lines": 50, "excluded_lines": 0, "percent_statements_covered": 56.14035087719298, "percent_statements_covered_display": "56"}, "missing_lines": [27, 31, 75, 81, 176, 177, 178, 179, 180, 182, 183, 184, 190, 191, 193, 194, 196, 201, 208, 209, 210, 211, 212, 236, 239, 240, 241, 242, 243, 246, 247, 248, 249, 250, 251, 252, 255, 256, 257, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272], "excluded_lines": [], "functions": {"AccessSubject.to_descriptor": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [27], "excluded_lines": [], "start_line": 26}, "relationship_descriptor": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [31], "excluded_lines": [], "start_line": 30}, "AccessIndexer.__init__": {"executed_lines": [47, 48, 49, 50, 51, 52, 53, 54], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 39}, "AccessIndexer.build_resource_index": {"executed_lines": [64, 70, 71, 72, 73, 74, 83, 89, 90], "summary": {"covered_lines": 9, "num_statements": 11, "percent_covered": 81.81818181818181, "percent_covered_display": "82", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 81.81818181818181, "percent_statements_covered_display": "82"}, "missing_lines": [75, 81], "excluded_lines": [], "start_line": 56}, "AccessIndexer._rebuild_resource_index": {"executed_lines": [100, 101, 107, 108, 114, 122, 128, 142, 143, 164, 171], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 92}, "AccessIndexer._schedule_background_refresh": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [176, 177, 178, 179, 180, 182, 196, 201], "excluded_lines": [], "start_line": 173}, "AccessIndexer._schedule_background_refresh.run": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 6, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [183, 184, 190, 191, 193, 194], "excluded_lines": [], "start_line": 182}, "AccessIndexer._memo_get": {"executed_lines": [204, 205, 206, 207], "summary": {"covered_lines": 4, "num_statements": 9, "percent_covered": 44.44444444444444, "percent_covered_display": "44", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 44.44444444444444, "percent_statements_covered_display": "44"}, "missing_lines": [208, 209, 210, 211, 212], "excluded_lines": [], "start_line": 203}, "AccessIndexer._memo_set": {"executed_lines": [219, 220], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 214}, "AccessIndexer.invalidate_resource": {"executed_lines": [223, 226, 229, 230, 235], "summary": {"covered_lines": 5, "num_statements": 6, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83"}, "missing_lines": [236], "excluded_lines": [], "start_line": 222}, "AccessIndexer.invalidate_tenant": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [239, 240, 241, 242, 243], "excluded_lines": [], "start_line": 238}, "AccessIndexer.subject_descriptors": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 21, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 21, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [246, 247, 248, 249, 250, 251, 252, 255, 256, 257, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272], "excluded_lines": [], "start_line": 245}, "AccessIndexer._subject_descriptor": {"executed_lines": [275], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 274}, "": {"executed_lines": [3, 5, 6, 7, 8, 10, 11, 21, 22, 23, 24, 26, 30, 36, 39, 56, 92, 173, 203, 214, 222, 238, 245, 274], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"AccessSubject": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [27], "excluded_lines": [], "start_line": 22}, "AccessIndexer": {"executed_lines": [47, 48, 49, 50, 51, 52, 53, 54, 64, 70, 71, 72, 73, 74, 83, 89, 90, 100, 101, 107, 108, 114, 122, 128, 142, 143, 164, 171, 204, 205, 206, 207, 219, 220, 223, 226, 229, 230, 235, 275], "summary": {"covered_lines": 40, "num_statements": 88, "percent_covered": 45.45454545454545, "percent_covered_display": "45", "missing_lines": 48, "excluded_lines": 0, "percent_statements_covered": 45.45454545454545, "percent_statements_covered_display": "45"}, "missing_lines": [75, 81, 176, 177, 178, 179, 180, 182, 183, 184, 190, 191, 193, 194, 196, 201, 208, 209, 210, 211, 212, 236, 239, 240, 241, 242, 243, 246, 247, 248, 249, 250, 251, 252, 255, 256, 257, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272], "excluded_lines": [], "start_line": 36}, "": {"executed_lines": [3, 5, 6, 7, 8, 10, 11, 21, 22, 23, 24, 26, 30, 36, 39, 56, 92, 173, 203, 214, 222, 238, 245, 274], "summary": {"covered_lines": 24, "num_statements": 25, "percent_covered": 96.0, "percent_covered_display": "96", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 96.0, "percent_statements_covered_display": "96"}, "missing_lines": [31], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/attribute_validation.py": {"executed_lines": [1, 3, 6, 7, 10, 11, 13, 15, 17, 18, 20, 22, 26, 27, 30, 31], "summary": {"covered_lines": 16, "num_statements": 22, "percent_covered": 72.72727272727273, "percent_covered_display": "73", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 72.72727272727273, "percent_statements_covered_display": "73"}, "missing_lines": [12, 14, 16, 19, 21, 23], "excluded_lines": [], "functions": {"_validate_dict": {"executed_lines": [11, 13, 15, 17, 18, 20, 22], "summary": {"covered_lines": 7, "num_statements": 13, "percent_covered": 53.84615384615385, "percent_covered_display": "54", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 53.84615384615385, "percent_statements_covered_display": "54"}, "missing_lines": [12, 14, 16, 19, 21, 23], "excluded_lines": [], "start_line": 10}, "validate_user": {"executed_lines": [27], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 26}, "validate_resource": {"executed_lines": [31], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 30}, "": {"executed_lines": [1, 3, 6, 7, 10, 26, 30], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"AttributeValidationError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 6}, "": {"executed_lines": [1, 3, 6, 7, 10, 11, 13, 15, 17, 18, 20, 22, 26, 27, 30, 31], "summary": {"covered_lines": 16, "num_statements": 22, "percent_covered": 72.72727272727273, "percent_covered_display": "73", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 72.72727272727273, "percent_statements_covered_display": "73"}, "missing_lines": [12, 14, 16, 19, 21, 23], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/audit.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [7, 9], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [7, 9], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [7, 9], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/authorization.py": {"executed_lines": [7, 9, 10, 11, 12, 13, 14, 16, 17, 18, 24, 25, 26, 27, 28, 29, 44, 45, 48, 49, 52, 53, 54, 57, 60, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 105, 107, 121, 122, 123, 124, 131, 132, 139, 140, 143, 144, 146, 147, 148, 153, 154, 160, 161, 162, 165, 171, 177, 178, 179, 180, 181, 189, 209, 211, 239, 251, 252, 253, 254, 255, 256, 260, 261, 292, 293, 296, 297, 298, 299, 300, 301, 306, 309, 317, 322, 323, 324, 330, 331, 335, 336, 339, 341, 349, 353, 355, 379, 389, 398, 400, 401, 403, 421, 430, 431, 432, 436, 437, 449, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 479, 480, 488, 499, 500, 501, 502, 503, 504, 505, 506, 510, 511, 512, 513, 514, 517, 518, 526, 532, 533, 535, 538, 539, 542, 547, 549, 550, 551, 554, 556, 558, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 574, 575, 601, 602, 612, 613, 623, 626, 627, 628, 629, 632, 656, 657, 658, 660, 661, 662, 676, 677, 679, 680, 681, 690, 691, 699, 700, 701, 715, 716, 718, 721, 722, 738, 739, 740, 756, 759, 761, 764, 765, 786, 787, 794, 795, 797, 798, 799], "summary": {"covered_lines": 217, "num_statements": 255, "percent_covered": 85.09803921568627, "percent_covered_display": "85", "missing_lines": 38, "excluded_lines": 0, "percent_statements_covered": 85.09803921568627, "percent_statements_covered_display": "85"}, "missing_lines": [190, 191, 201, 225, 267, 268, 274, 307, 332, 333, 338, 367, 412, 419, 465, 467, 468, 469, 651, 652, 666, 667, 668, 675, 705, 706, 707, 714, 729, 730, 746, 747, 748, 755, 777, 778, 806, 807], "excluded_lines": [], "functions": {"AuthorizationService.__init__": {"executed_lines": [78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 105], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 60}, "AuthorizationService.authorize": {"executed_lines": [121, 122, 123, 124, 131, 132, 139, 140, 143, 144, 146, 147, 148, 153, 154, 160, 161, 162, 165, 171, 177, 178, 179, 180, 181, 189, 209], "summary": {"covered_lines": 27, "num_statements": 30, "percent_covered": 90.0, "percent_covered_display": "90", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 90.0, "percent_statements_covered_display": "90"}, "missing_lines": [190, 191, 201], "excluded_lines": [], "start_line": 107}, "AuthorizationService.authorize_async": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [225], "excluded_lines": [], "start_line": 211}, "AuthorizationService.authorize_batch": {"executed_lines": [251, 252, 253, 254, 255, 256, 260, 261, 292, 293, 296, 297, 298, 299, 300, 301, 306, 309, 317, 322, 323, 324, 330, 331, 335, 336, 339, 341, 349, 353], "summary": {"covered_lines": 30, "num_statements": 37, "percent_covered": 81.08108108108108, "percent_covered_display": "81", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 81.08108108108108, "percent_statements_covered_display": "81"}, "missing_lines": [267, 268, 274, 307, 332, 333, 338], "excluded_lines": [], "start_line": 239}, "AuthorizationService.authorize_batch_async": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [367], "excluded_lines": [], "start_line": 355}, "AuthorizationService.simulate": {"executed_lines": [389, 398], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 379}, "AuthorizationService.get_revision": {"executed_lines": [401], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 400}, "AuthorizationService.build_input": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [412, 419], "excluded_lines": [], "start_line": 403}, "AuthorizationService._build_input": {"executed_lines": [430, 431, 432, 436, 437], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 421}, "AuthorizationService._build_authorization_input": {"executed_lines": [459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 479, 480, 488], "summary": {"covered_lines": 13, "num_statements": 17, "percent_covered": 76.47058823529412, "percent_covered_display": "76", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 76.47058823529412, "percent_statements_covered_display": "76"}, "missing_lines": [465, 467, 468, 469], "excluded_lines": [], "start_line": 449}, "AuthorizationService._hydrate_user": {"executed_lines": [500, 501, 502, 503, 504, 505, 506, 510, 511, 512, 513, 514, 517, 518, 526, 532, 533], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 499}, "AuthorizationService._build_engine": {"executed_lines": [538, 539, 542, 547, 549, 558, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 535}, "AuthorizationService._build_engine._load_current_policies": {"executed_lines": [550, 551, 554, 556], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 549}, "AuthorizationService._decision_from_cache": {"executed_lines": [575], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 574}, "AuthorizationService._safe_deny": {"executed_lines": [602], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 601}, "AuthorizationService._safe_allow": {"executed_lines": [613], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 612}, "AuthorizationService._fallback_decision": {"executed_lines": [626, 627, 628, 629, 632, 656, 657, 658], "summary": {"covered_lines": 8, "num_statements": 10, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [651, 652], "excluded_lines": [], "start_line": 623}, "AuthorizationService._safe_cache_get": {"executed_lines": [661, 662, 676, 677], "summary": {"covered_lines": 4, "num_statements": 8, "percent_covered": 50.0, "percent_covered_display": "50", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 50.0, "percent_statements_covered_display": "50"}, "missing_lines": [666, 667, 668, 675], "excluded_lines": [], "start_line": 660}, "AuthorizationService._safe_cache_set": {"executed_lines": [680, 681, 690, 691], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 679}, "AuthorizationService._safe_policy_cache_get": {"executed_lines": [700, 701, 715, 716], "summary": {"covered_lines": 4, "num_statements": 8, "percent_covered": 50.0, "percent_covered_display": "50", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 50.0, "percent_statements_covered_display": "50"}, "missing_lines": [705, 706, 707, 714], "excluded_lines": [], "start_line": 699}, "AuthorizationService._safe_policy_cache_set": {"executed_lines": [721, 722], "summary": {"covered_lines": 2, "num_statements": 4, "percent_covered": 50.0, "percent_covered_display": "50", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 50.0, "percent_statements_covered_display": "50"}, "missing_lines": [729, 730], "excluded_lines": [], "start_line": 718}, "AuthorizationService._safe_relationship_cache_get": {"executed_lines": [739, 740, 756, 759], "summary": {"covered_lines": 4, "num_statements": 8, "percent_covered": 50.0, "percent_covered_display": "50", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 50.0, "percent_statements_covered_display": "50"}, "missing_lines": [746, 747, 748, 755], "excluded_lines": [], "start_line": 738}, "AuthorizationService._safe_relationship_cache_set": {"executed_lines": [764, 765], "summary": {"covered_lines": 2, "num_statements": 4, "percent_covered": 50.0, "percent_covered_display": "50", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 50.0, "percent_statements_covered_display": "50"}, "missing_lines": [777, 778], "excluded_lines": [], "start_line": 761}, "AuthorizationService._resource_identity": {"executed_lines": [787, 794, 795], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 786}, "AuthorizationService._safe_audit_write": {"executed_lines": [798, 799], "summary": {"covered_lines": 2, "num_statements": 4, "percent_covered": 50.0, "percent_covered_display": "50", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 50.0, "percent_statements_covered_display": "50"}, "missing_lines": [806, 807], "excluded_lines": [], "start_line": 797}, "": {"executed_lines": [7, 9, 10, 11, 12, 13, 14, 16, 17, 18, 24, 25, 26, 27, 28, 29, 44, 45, 48, 49, 52, 53, 54, 57, 60, 107, 211, 239, 355, 379, 400, 403, 421, 449, 499, 535, 574, 601, 612, 623, 660, 679, 699, 718, 738, 761, 786, 797], "summary": {"covered_lines": 48, "num_statements": 48, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"AuthorizationResult": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 49}, "AuthorizationService": {"executed_lines": [78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 105, 121, 122, 123, 124, 131, 132, 139, 140, 143, 144, 146, 147, 148, 153, 154, 160, 161, 162, 165, 171, 177, 178, 179, 180, 181, 189, 209, 251, 252, 253, 254, 255, 256, 260, 261, 292, 293, 296, 297, 298, 299, 300, 301, 306, 309, 317, 322, 323, 324, 330, 331, 335, 336, 339, 341, 349, 353, 389, 398, 401, 430, 431, 432, 436, 437, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 479, 480, 488, 500, 501, 502, 503, 504, 505, 506, 510, 511, 512, 513, 514, 517, 518, 526, 532, 533, 538, 539, 542, 547, 549, 550, 551, 554, 556, 558, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 575, 602, 613, 626, 627, 628, 629, 632, 656, 657, 658, 661, 662, 676, 677, 680, 681, 690, 691, 700, 701, 715, 716, 721, 722, 739, 740, 756, 759, 764, 765, 787, 794, 795, 798, 799], "summary": {"covered_lines": 169, "num_statements": 207, "percent_covered": 81.64251207729468, "percent_covered_display": "82", "missing_lines": 38, "excluded_lines": 0, "percent_statements_covered": 81.64251207729468, "percent_statements_covered_display": "82"}, "missing_lines": [190, 191, 201, 225, 267, 268, 274, 307, 332, 333, 338, 367, 412, 419, 465, 467, 468, 469, 651, 652, 666, 667, 668, 675, 705, 706, 707, 714, 729, 730, 746, 747, 748, 755, 777, 778, 806, 807], "excluded_lines": [], "start_line": 57}, "": {"executed_lines": [7, 9, 10, 11, 12, 13, 14, 16, 17, 18, 24, 25, 26, 27, 28, 29, 44, 45, 48, 49, 52, 53, 54, 57, 60, 107, 211, 239, 355, 379, 400, 403, 421, 449, 499, 535, 574, 601, 612, 623, 660, 679, 699, 718, 738, 761, 786, 797], "summary": {"covered_lines": 48, "num_statements": 48, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/doctor.py": {"executed_lines": [7, 9, 10, 11, 12, 14, 15, 17, 18, 19, 22, 23, 26, 27, 28, 29, 32, 35, 41, 42, 50, 53, 57, 58, 59, 60, 61, 62, 65, 68, 73, 74, 76, 77, 78, 79, 82, 84, 88, 90, 111, 114, 115, 116, 117, 118, 130, 133, 134, 135, 138, 139, 140, 147, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 171, 172], "summary": {"covered_lines": 70, "num_statements": 78, "percent_covered": 89.74358974358974, "percent_covered_display": "90", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 89.74358974358974, "percent_statements_covered_display": "90"}, "missing_lines": [75, 83, 85, 89, 124, 125, 141, 142], "excluded_lines": [], "functions": {"run_core_doctor": {"executed_lines": [35, 41, 42], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 32}, "_check_env": {"executed_lines": [53, 57, 58, 59, 60, 61, 62, 65, 68, 73, 74, 76, 77, 78, 79, 82, 84, 88, 90], "summary": {"covered_lines": 19, "num_statements": 23, "percent_covered": 82.6086956521739, "percent_covered_display": "83", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 82.6086956521739, "percent_statements_covered_display": "83"}, "missing_lines": [75, 83, 85, 89], "excluded_lines": [], "start_line": 50}, "_check_database": {"executed_lines": [114, 115, 116, 117, 118], "summary": {"covered_lines": 5, "num_statements": 7, "percent_covered": 71.42857142857143, "percent_covered_display": "71", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 71.42857142857143, "percent_statements_covered_display": "71"}, "missing_lines": [124, 125], "excluded_lines": [], "start_line": 111}, "_check_redis": {"executed_lines": [133, 134, 135, 138, 139, 140], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [141, 142], "excluded_lines": [], "start_line": 130}, "_check_migrations": {"executed_lines": [150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 171, 172], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 147}, "": {"executed_lines": [7, 9, 10, 11, 12, 14, 15, 17, 18, 19, 22, 23, 26, 27, 28, 29, 32, 50, 111, 130, 147], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"DoctorCheck": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 23}, "": {"executed_lines": [7, 9, 10, 11, 12, 14, 15, 17, 18, 19, 22, 23, 26, 27, 28, 29, 32, 35, 41, 42, 50, 53, 57, 58, 59, 60, 61, 62, 65, 68, 73, 74, 76, 77, 78, 79, 82, 84, 88, 90, 111, 114, 115, 116, 117, 118, 130, 133, 134, 135, 138, 139, 140, 147, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 171, 172], "summary": {"covered_lines": 70, "num_statements": 78, "percent_covered": 89.74358974358974, "percent_covered_display": "90", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 89.74358974358974, "percent_statements_covered_display": "90"}, "missing_lines": [75, 83, 85, 89, 124, 125, 141, 142], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/impact_analysis.py": {"executed_lines": [3, 5, 6, 8, 9, 15, 18, 19, 20, 21, 24, 25, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 56, 57, 58, 59, 60, 63, 64, 65, 68, 69, 70, 81, 82, 83, 94, 95, 96, 101, 106, 107, 112, 117, 118, 119, 120, 121, 123, 124, 127, 130, 138, 140, 147, 148, 149, 150, 155, 161], "summary": {"covered_lines": 60, "num_statements": 73, "percent_covered": 82.1917808219178, "percent_covered_display": "82", "missing_lines": 13, "excluded_lines": 0, "percent_statements_covered": 82.1917808219178, "percent_statements_covered_display": "82"}, "missing_lines": [61, 62, 66, 67, 79, 80, 92, 93, 104, 105, 131, 151, 154], "excluded_lines": [], "functions": {"ImpactAnalyzer.__init__": {"executed_lines": [33, 34, 35, 36], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 25}, "ImpactAnalyzer.analyze_policy_change": {"executed_lines": [39, 40, 41, 42, 43, 56, 57, 58, 59, 60, 63, 64, 65, 68, 69, 70, 81, 82, 83, 94, 95, 96, 101, 106, 107, 112, 117, 118, 119, 120, 121], "summary": {"covered_lines": 31, "num_statements": 41, "percent_covered": 75.60975609756098, "percent_covered_display": "76", "missing_lines": 10, "excluded_lines": 0, "percent_statements_covered": 75.60975609756098, "percent_statements_covered_display": "76"}, "missing_lines": [61, 62, 66, 67, 79, 80, 92, 93, 104, 105], "excluded_lines": [], "start_line": 38}, "ImpactAnalyzer._candidate_resources": {"executed_lines": [124, 127, 130, 138], "summary": {"covered_lines": 4, "num_statements": 5, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80"}, "missing_lines": [131], "excluded_lines": [], "start_line": 123}, "ImpactAnalyzer._enrich_user_with_relationships": {"executed_lines": [147, 148, 149, 150, 155, 161], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [151, 154], "excluded_lines": [], "start_line": 140}, "": {"executed_lines": [3, 5, 6, 8, 9, 15, 18, 19, 20, 21, 24, 25, 38, 123, 140], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"ImpactResult": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "ImpactAnalyzer": {"executed_lines": [33, 34, 35, 36, 39, 40, 41, 42, 43, 56, 57, 58, 59, 60, 63, 64, 65, 68, 69, 70, 81, 82, 83, 94, 95, 96, 101, 106, 107, 112, 117, 118, 119, 120, 121, 124, 127, 130, 138, 147, 148, 149, 150, 155, 161], "summary": {"covered_lines": 45, "num_statements": 58, "percent_covered": 77.58620689655173, "percent_covered_display": "78", "missing_lines": 13, "excluded_lines": 0, "percent_statements_covered": 77.58620689655173, "percent_statements_covered_display": "78"}, "missing_lines": [61, 62, 66, 67, 79, 80, 92, 93, 104, 105, 131, 151, 154], "excluded_lines": [], "start_line": 24}, "": {"executed_lines": [3, 5, 6, 8, 9, 15, 18, 19, 20, 21, 24, 25, 38, 123, 140], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/interfaces.py": {"executed_lines": [7, 9, 10, 12, 19, 20, 23, 24, 25, 26, 29, 30, 33, 34, 35, 36, 37, 39, 40, 49, 50, 53, 54, 55, 56, 57, 58, 59, 60, 61, 63, 64, 81, 82, 85, 86, 89, 90, 93, 94, 95, 96, 97, 98, 101, 102, 105, 106, 107, 108, 109, 110, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 130, 131, 134, 135, 136, 137, 138, 139, 140, 143, 144, 147, 148, 149, 150, 151, 152, 153, 155, 156, 157, 168, 180, 217, 232, 240, 277, 305, 315, 332, 365, 385, 386, 389, 390, 391, 392, 393, 394, 395, 396, 397, 400, 424, 432, 451], "summary": {"covered_lines": 113, "num_statements": 113, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 238, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 234, 235, 236, 237, 238, 239, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 307, 308, 309, 310, 311, 312, 313, 314, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 426, 427, 428, 429, 430, 431, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 453, 454, 455], "functions": {"RelationshipRecord.to_dict": {"executed_lines": [40], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 39}, "ACLRecord.to_dict": {"executed_lines": [64], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 63}, "CachedDecision.from_decision": {"executed_lines": [157], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 156}, "TenantRepository.get_or_create": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [171], "start_line": 171}, "TenantRepository.get_by_id": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [173], "start_line": 173}, "TenantRepository.bump_policy_version": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [175], "start_line": 175}, "TenantRepository.bump_revision": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [177], "start_line": 177}, "PolicyRepository.list_current_policies": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [185], "start_line": 183}, "PolicyRepository.list_current_policy_views": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [187], "start_line": 187}, "PolicyRepository.list_current_policy_page": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [195], "start_line": 189}, "PolicyRepository.create_policy_version": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [208], "start_line": 197}, "PolicyRepository.rollback_policy": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [212], "start_line": 210}, "PolicyRepository.delete_policy": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [214], "start_line": 214}, "AuthModelRepository.get_model": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [220], "start_line": 220}, "AuthModelRepository.upsert_model": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [229], "start_line": 222}, "UserRepository.get_user_context": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [235], "start_line": 235}, "UserRepository.list_user_ids": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [237], "start_line": 237}, "RelationshipRepository.list_for_subject": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [245], "start_line": 243}, "RelationshipRepository.list_for_subject_page": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [255], "start_line": 247}, "RelationshipRepository.list_for_object": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [263], "start_line": 257}, "RelationshipRepository.create": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [274], "start_line": 265}, "AuditRepository.write": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [289], "start_line": 280}, "AuditRepository.list_page": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [302], "start_line": 291}, "PolicyCache.get": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [308], "start_line": 308}, "PolicyCache.set": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [310], "start_line": 310}, "PolicyCache.invalidate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [312], "start_line": 312}, "RelationshipCache.get": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [320], "start_line": 318}, "RelationshipCache.set": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [329], "start_line": 322}, "ACLRepository.create_acl_entry": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [345], "start_line": 335}, "ACLRepository.list_resource_acl": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [349], "start_line": 347}, "ACLRepository.get_acl_entry": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [351], "start_line": 351}, "ACLRepository.find_matching_acl": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [360], "start_line": 353}, "ACLRepository.delete_acl_entry": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [362], "start_line": 362}, "ACLCache.get": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [370], "start_line": 368}, "ACLCache.set": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [380], "start_line": 372}, "ACLCache.invalidate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [382], "start_line": 382}, "AccessIndexCache.get": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [405], "start_line": 403}, "AccessIndexCache.set": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [415], "start_line": 407}, "AccessIndexCache.invalidate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [417], "start_line": 417}, "AccessIndexCache.invalidate_tenant": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [419], "start_line": 419}, "AccessIndexCache.invalidate_global": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [421], "start_line": 421}, "RoleBindingRepository.list_user_ids": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [427], "start_line": 427}, "RoleBindingRepository.invalidate": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [429], "start_line": 429}, "DecisionCache.get": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [435], "start_line": 435}, "DecisionCache.set": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [437], "start_line": 437}, "DecisionCache.make_key": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [446], "start_line": 439}, "DecisionCache.bump_namespace": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [448], "start_line": 448}, "PolicyEventPublisher.publish_policy_update": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [454], "start_line": 454}, "": {"executed_lines": [7, 9, 10, 12, 19, 20, 23, 24, 25, 26, 29, 30, 33, 34, 35, 36, 37, 39, 49, 50, 53, 54, 55, 56, 57, 58, 59, 60, 61, 63, 81, 82, 85, 86, 89, 90, 93, 94, 95, 96, 97, 98, 101, 102, 105, 106, 107, 108, 109, 110, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 130, 131, 134, 135, 136, 137, 138, 139, 140, 143, 144, 147, 148, 149, 150, 151, 152, 153, 155, 156, 168, 180, 217, 232, 240, 277, 305, 315, 332, 365, 385, 386, 389, 390, 391, 392, 393, 394, 395, 396, 397, 400, 424, 432, 451], "summary": {"covered_lines": 110, "num_statements": 110, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 192, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [170, 172, 174, 176, 178, 179, 183, 184, 186, 188, 189, 190, 191, 192, 193, 194, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 209, 210, 211, 213, 215, 216, 219, 221, 222, 223, 224, 225, 226, 227, 228, 230, 231, 234, 236, 238, 239, 243, 244, 246, 247, 248, 249, 250, 251, 252, 253, 254, 256, 257, 258, 259, 260, 261, 262, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 275, 276, 280, 281, 282, 283, 284, 285, 286, 287, 288, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 303, 304, 307, 309, 311, 313, 314, 318, 319, 321, 322, 323, 324, 325, 326, 327, 328, 330, 331, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 346, 347, 348, 350, 352, 353, 354, 355, 356, 357, 358, 359, 361, 363, 364, 368, 369, 371, 372, 373, 374, 375, 376, 377, 378, 379, 381, 383, 384, 403, 404, 406, 407, 408, 409, 410, 411, 412, 413, 414, 416, 418, 420, 422, 423, 426, 428, 430, 431, 434, 436, 438, 439, 440, 441, 442, 443, 444, 445, 447, 449, 450, 453], "start_line": 1}}, "classes": {"TenantRecord": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 20}, "RelationshipRecord": {"executed_lines": [40], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 30}, "ACLRecord": {"executed_lines": [64], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 50}, "PolicyRecord": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 82}, "PolicyMutationResult": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 90}, "PolicyListItem": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 102}, "AuditListItem": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 114}, "AuthModelRecord": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 131}, "CachedDecision": {"executed_lines": [157], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 144}, "TenantRepository": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 4, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [171, 173, 175, 177], "start_line": 168}, "PolicyRepository": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 6, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [185, 187, 195, 208, 212, 214], "start_line": 180}, "AuthModelRepository": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [220, 229], "start_line": 217}, "UserRepository": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [235, 237], "start_line": 232}, "RelationshipRepository": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 4, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [245, 255, 263, 274], "start_line": 240}, "AuditRepository": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [289, 302], "start_line": 277}, "PolicyCache": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 3, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [308, 310, 312], "start_line": 305}, "RelationshipCache": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [320, 329], "start_line": 315}, "ACLRepository": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 5, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [345, 349, 351, 360, 362], "start_line": 332}, "ACLCache": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 3, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [370, 380, 382], "start_line": 365}, "AccessIndexEntry": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 386}, "AccessIndexCache": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 5, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [405, 415, 417, 419, 421], "start_line": 400}, "RoleBindingRepository": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [427, 429], "start_line": 424}, "DecisionCache": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 4, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [435, 437, 446, 448], "start_line": 432}, "PolicyEventPublisher": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [454], "start_line": 451}, "": {"executed_lines": [7, 9, 10, 12, 19, 20, 23, 24, 25, 26, 29, 30, 33, 34, 35, 36, 37, 39, 49, 50, 53, 54, 55, 56, 57, 58, 59, 60, 61, 63, 81, 82, 85, 86, 89, 90, 93, 94, 95, 96, 97, 98, 101, 102, 105, 106, 107, 108, 109, 110, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 130, 131, 134, 135, 136, 137, 138, 139, 140, 143, 144, 147, 148, 149, 150, 151, 152, 153, 155, 156, 168, 180, 217, 232, 240, 277, 305, 315, 332, 365, 385, 386, 389, 390, 391, 392, 393, 394, 395, 396, 397, 400, 424, 432, 451], "summary": {"covered_lines": 110, "num_statements": 110, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 192, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [170, 172, 174, 176, 178, 179, 183, 184, 186, 188, 189, 190, 191, 192, 193, 194, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 209, 210, 211, 213, 215, 216, 219, 221, 222, 223, 224, 225, 226, 227, 228, 230, 231, 234, 236, 238, 239, 243, 244, 246, 247, 248, 249, 250, 251, 252, 253, 254, 256, 257, 258, 259, 260, 261, 262, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 275, 276, 280, 281, 282, 283, 284, 285, 286, 287, 288, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 303, 304, 307, 309, 311, 313, 314, 318, 319, 321, 322, 323, 324, 325, 326, 327, 328, 330, 331, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 346, 347, 348, 350, 352, 353, 354, 355, 356, 357, 358, 359, 361, 363, 364, 368, 369, 371, 372, 373, 374, 375, 376, 377, 378, 379, 381, 383, 384, 403, 404, 406, 407, 408, 409, 410, 411, 412, 413, 414, 416, 418, 420, 422, 423, 426, 428, 430, 431, 434, 436, 438, 439, 440, 441, 442, 443, 444, 445, 447, 449, 450, 453], "start_line": 1}}}, "keynetra/services/policies.py": {"executed_lines": [3, 5, 6, 7, 8, 16, 19, 22, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 47, 54, 55, 58, 59, 60, 61, 62, 63, 65, 77, 78, 79, 89, 90, 99, 100, 101, 102, 103, 104, 107, 111, 113, 114, 115, 118, 119, 120, 121, 122, 123, 126, 130, 132, 133, 134, 135, 136, 137, 138, 139, 140, 143, 148, 149, 150, 164], "summary": {"covered_lines": 70, "num_statements": 70, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"PolicyService.__init__": {"executed_lines": [31, 32, 33, 34, 35, 36], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 22}, "PolicyService.list_policies": {"executed_lines": [39, 40, 41, 42, 43, 44, 45], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 38}, "PolicyService.list_policies_page": {"executed_lines": [54, 55, 58, 59, 60, 61, 62, 63], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 47}, "PolicyService.create_policy": {"executed_lines": [77, 78, 79, 89, 90, 99, 100, 101, 102, 103, 104, 107, 111], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 65}, "PolicyService.rollback_policy": {"executed_lines": [114, 115, 118, 119, 120, 121, 122, 123, 126, 130], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 113}, "PolicyService.delete_policy": {"executed_lines": [133, 134, 135, 136, 137, 138, 139, 140, 143], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 132}, "PolicyService._compile_and_store": {"executed_lines": [149, 150, 164], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 148}, "": {"executed_lines": [3, 5, 6, 7, 8, 16, 19, 22, 38, 47, 65, 113, 132, 148], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"PolicyService": {"executed_lines": [31, 32, 33, 34, 35, 36, 39, 40, 41, 42, 43, 44, 45, 54, 55, 58, 59, 60, 61, 62, 63, 77, 78, 79, 89, 90, 99, 100, 101, 102, 103, 104, 107, 111, 114, 115, 118, 119, 120, 121, 122, 123, 126, 130, 133, 134, 135, 136, 137, 138, 139, 140, 143, 149, 150, 164], "summary": {"covered_lines": 56, "num_statements": 56, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "": {"executed_lines": [3, 5, 6, 7, 8, 16, 19, 22, 38, 47, 65, 113, 132, 148], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/policy_dsl.py": {"executed_lines": [1, 3, 4, 6, 7, 12, 23, 28, 29, 31, 32, 33, 34, 35, 36, 40, 43, 44, 47, 48, 50, 53, 54, 56], "summary": {"covered_lines": 24, "num_statements": 29, "percent_covered": 82.75862068965517, "percent_covered_display": "83", "missing_lines": 5, "excluded_lines": 2, "percent_statements_covered": 82.75862068965517, "percent_statements_covered_display": "83"}, "missing_lines": [38, 41, 45, 49, 51], "excluded_lines": [8, 9], "functions": {"dsl_to_policy": {"executed_lines": [23, 28, 29, 31, 32, 33, 34, 35, 36, 40, 43, 44, 47, 48, 50, 53, 54, 56], "summary": {"covered_lines": 18, "num_statements": 23, "percent_covered": 78.26086956521739, "percent_covered_display": "78", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 78.26086956521739, "percent_statements_covered_display": "78"}, "missing_lines": [38, 41, 45, 49, 51], "excluded_lines": [], "start_line": 12}, "": {"executed_lines": [1, 3, 4, 6, 7, 12], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [8, 9], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 3, 4, 6, 7, 12, 23, 28, 29, 31, 32, 33, 34, 35, 36, 40, 43, 44, 47, 48, 50, 53, 54, 56], "summary": {"covered_lines": 24, "num_statements": 29, "percent_covered": 82.75862068965517, "percent_covered_display": "83", "missing_lines": 5, "excluded_lines": 2, "percent_statements_covered": 82.75862068965517, "percent_statements_covered_display": "83"}, "missing_lines": [38, 41, 45, 49, 51], "excluded_lines": [8, 9], "start_line": 1}}}, "keynetra/services/policy_lint.py": {"executed_lines": [3, 5, 6, 7, 9, 10, 12, 13, 16, 17, 18, 21, 24, 25, 26, 28, 29, 30, 31, 33, 34, 35, 37, 38, 39, 40, 42, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 75], "summary": {"covered_lines": 45, "num_statements": 48, "percent_covered": 93.75, "percent_covered_display": "94", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 93.75, "percent_statements_covered_display": "94"}, "missing_lines": [66, 67, 71], "excluded_lines": [], "functions": {"PolicyLintService.__init__": {"executed_lines": [25, 26], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 24}, "PolicyLintService.lint": {"executed_lines": [29, 30, 31, 33, 34, 35], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 28}, "PolicyLintService._serialize_conditions": {"executed_lines": [39, 40], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 38}, "PolicyLintService._collect_unused_role_warnings": {"executed_lines": [48, 49, 50, 51, 52, 53, 54], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 42}, "PolicyLintService._collect_duplicate_warnings": {"executed_lines": [57, 58, 59, 60, 61, 62, 63, 64, 65, 75], "summary": {"covered_lines": 10, "num_statements": 13, "percent_covered": 76.92307692307692, "percent_covered_display": "77", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 76.92307692307692, "percent_statements_covered_display": "77"}, "missing_lines": [66, 67, 71], "excluded_lines": [], "start_line": 56}, "": {"executed_lines": [3, 5, 6, 7, 9, 10, 12, 13, 16, 17, 18, 21, 24, 28, 37, 38, 42, 56], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"PolicyLintWarning": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 17}, "PolicyLintService": {"executed_lines": [25, 26, 29, 30, 31, 33, 34, 35, 39, 40, 48, 49, 50, 51, 52, 53, 54, 57, 58, 59, 60, 61, 62, 63, 64, 65, 75], "summary": {"covered_lines": 27, "num_statements": 30, "percent_covered": 90.0, "percent_covered_display": "90", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 90.0, "percent_statements_covered_display": "90"}, "missing_lines": [66, 67, 71], "excluded_lines": [], "start_line": 21}, "": {"executed_lines": [3, 5, 6, 7, 9, 10, 12, 13, 16, 17, 18, 21, 24, 28, 37, 38, 42, 56], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/policy_simulator.py": {"executed_lines": [3, 5, 6, 8, 9, 10, 11, 14, 15, 16, 17, 20, 21, 28, 29, 30, 32, 42, 43, 50, 60, 61, 62, 74, 75], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"PolicySimulator.__init__": {"executed_lines": [28, 29, 30], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 21}, "PolicySimulator.simulate_policy_change": {"executed_lines": [42, 43, 50, 60, 61, 62, 74, 75], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 32}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 11, 14, 15, 16, 17, 20, 21, 32], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"SimulationResult": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 15}, "PolicySimulator": {"executed_lines": [28, 29, 30, 42, 43, 50, 60, 61, 62, 74, 75], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 20}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 11, 14, 15, 16, 17, 20, 21, 32], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/policy_testing.py": {"executed_lines": [9, 11, 12, 13, 15, 16, 18, 19, 24, 25, 28, 29, 30, 33, 34, 37, 38, 41, 42, 45, 46, 47, 48, 49, 50, 51, 54, 57, 58, 61, 62, 63, 65, 68, 71, 72, 75, 78, 79, 80, 81, 82, 93, 96, 99, 100, 103, 104, 105, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 120, 121, 122, 124, 126, 127, 128, 130, 131, 133, 142, 143, 145, 146, 147, 148, 150, 152, 155, 156, 157, 158, 159, 161, 163, 165, 168, 180, 181, 182], "summary": {"covered_lines": 89, "num_statements": 107, "percent_covered": 83.17757009345794, "percent_covered_display": "83", "missing_lines": 18, "excluded_lines": 2, "percent_statements_covered": 83.17757009345794, "percent_statements_covered_display": "83"}, "missing_lines": [59, 64, 66, 106, 119, 123, 125, 129, 132, 144, 149, 151, 153, 160, 162, 164, 166, 183], "excluded_lines": [20, 21], "functions": {"parse_policy_test_suite": {"executed_lines": [57, 58, 61, 62, 63, 65, 68, 71, 72], "summary": {"covered_lines": 9, "num_statements": 12, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75"}, "missing_lines": [59, 64, 66], "excluded_lines": [], "start_line": 54}, "run_policy_test_suite": {"executed_lines": [78, 79, 80, 81, 82, 93], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 75}, "validate_policy_test_suite": {"executed_lines": [99, 100], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 96}, "_load_document": {"executed_lines": [104, 105], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [106], "excluded_lines": [], "start_line": 103}, "_parse_policy_entry": {"executed_lines": [110, 111, 112, 113, 114, 115, 116, 117, 118, 120, 121, 122, 124, 126, 127, 128, 130, 131, 133], "summary": {"covered_lines": 19, "num_statements": 24, "percent_covered": 79.16666666666667, "percent_covered_display": "79", "missing_lines": 5, "excluded_lines": 0, "percent_statements_covered": 79.16666666666667, "percent_statements_covered_display": "79"}, "missing_lines": [119, 123, 125, 129, 132], "excluded_lines": [], "start_line": 109}, "_parse_test_case": {"executed_lines": [143, 145, 146, 147, 148, 150, 152, 155, 156, 157, 158, 159, 161, 163, 165, 168], "summary": {"covered_lines": 16, "num_statements": 24, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [144, 149, 151, 153, 160, 162, 164, 166], "excluded_lines": [], "start_line": 142}, "_dump_document": {"executed_lines": [181, 182], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "67"}, "missing_lines": [183], "excluded_lines": [], "start_line": 180}, "": {"executed_lines": [9, 11, 12, 13, 15, 16, 18, 19, 24, 25, 28, 29, 30, 33, 34, 37, 38, 41, 42, 45, 46, 47, 48, 49, 50, 51, 54, 75, 96, 103, 109, 142, 180], "summary": {"covered_lines": 33, "num_statements": 33, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [20, 21], "start_line": 1}}, "classes": {"PolicyTestCase": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 25}, "PolicyTestSuite": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 34}, "PolicyTestResult": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 42}, "": {"executed_lines": [9, 11, 12, 13, 15, 16, 18, 19, 24, 25, 28, 29, 30, 33, 34, 37, 38, 41, 42, 45, 46, 47, 48, 49, 50, 51, 54, 57, 58, 61, 62, 63, 65, 68, 71, 72, 75, 78, 79, 80, 81, 82, 93, 96, 99, 100, 103, 104, 105, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 120, 121, 122, 124, 126, 127, 128, 130, 131, 133, 142, 143, 145, 146, 147, 148, 150, 152, 155, 156, 157, 158, 159, 161, 163, 165, 168, 180, 181, 182], "summary": {"covered_lines": 89, "num_statements": 107, "percent_covered": 83.17757009345794, "percent_covered_display": "83", "missing_lines": 18, "excluded_lines": 2, "percent_statements_covered": 83.17757009345794, "percent_statements_covered_display": "83"}, "missing_lines": [59, 64, 66, 106, 119, 123, 125, 129, 132, 144, 149, 151, 153, 160, 162, 164, 166, 183], "excluded_lines": [20, 21], "start_line": 1}}}, "keynetra/services/relationships.py": {"executed_lines": [3, 5, 12, 15, 18, 27, 28, 29, 30, 31, 32, 34, 37, 38, 41, 42, 43, 48, 54, 56, 65, 66, 73, 75, 85, 86, 94, 97, 98, 99, 100, 101], "summary": {"covered_lines": 32, "num_statements": 32, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"RelationshipService.__init__": {"executed_lines": [27, 28, 29, 30, 31, 32], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 18}, "RelationshipService.list_relationships": {"executed_lines": [37, 38, 41, 42, 43, 48, 54], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 34}, "RelationshipService.list_relationships_page": {"executed_lines": [65, 66, 73], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 56}, "RelationshipService.create_relationship": {"executed_lines": [85, 86, 94, 97, 98, 99, 100, 101], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 75}, "": {"executed_lines": [3, 5, 12, 15, 18, 34, 56, 75], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"RelationshipService": {"executed_lines": [27, 28, 29, 30, 31, 32, 37, 38, 41, 42, 43, 48, 54, 65, 66, 73, 85, 86, 94, 97, 98, 99, 100, 101], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 15}, "": {"executed_lines": [3, 5, 12, 15, 18, 34, 56, 75], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/resilience.py": {"executed_lines": [3, 5, 6, 7, 8, 9, 11, 13, 16, 17, 18, 19, 20, 21, 22, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"with_timeout": {"executed_lines": [17, 18, 19, 20, 21, 22], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 16}, "retry": {"executed_lines": [28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 25}, "": {"executed_lines": [3, 5, 6, 7, 8, 9, 11, 13, 16, 25], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [3, 5, 6, 7, 8, 9, 11, 13, 16, 17, 18, 19, 20, 21, 22, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/revisions.py": {"executed_lines": [3, 5, 6, 9, 12, 13, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"RevisionService.__init__": {"executed_lines": [13], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 12}, "RevisionService.get_revision": {"executed_lines": [16, 17], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 15}, "RevisionService.bump_revision": {"executed_lines": [20, 21, 22, 23, 24, 25, 26, 27, 28], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 19}, "": {"executed_lines": [3, 5, 6, 9, 12, 15, 19], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"RevisionService": {"executed_lines": [13, 16, 17, 20, 21, 22, 23, 24, 25, 26, 27, 28], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 9}, "": {"executed_lines": [3, 5, 6, 9, 12, 15, 19], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}, "keynetra/services/seeding.py": {"executed_lines": [3, 5, 7, 8, 10, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 45, 46, 47, 49, 52, 53, 54, 55, 56, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 88, 101, 102, 112, 114, 115, 125, 126, 137, 183, 193, 202, 203, 205, 206, 207, 208, 220], "summary": {"covered_lines": 71, "num_statements": 94, "percent_covered": 75.53191489361703, "percent_covered_display": "76", "missing_lines": 23, "excluded_lines": 0, "percent_statements_covered": 75.53191489361703, "percent_statements_covered_display": "76"}, "missing_lines": [50, 138, 139, 140, 142, 143, 144, 154, 155, 157, 158, 160, 161, 167, 168, 169, 170, 171, 172, 173, 178, 179, 180], "excluded_lines": [], "functions": {"seed_demo_data": {"executed_lines": [45, 46, 47, 49, 52, 53, 54, 55, 56, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 88, 101, 102, 112, 114, 115, 125, 126], "summary": {"covered_lines": 42, "num_statements": 43, "percent_covered": 97.67441860465117, "percent_covered_display": "98", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 97.67441860465117, "percent_statements_covered_display": "98"}, "missing_lines": [50], "excluded_lines": [], "start_line": 35}, "_clear_sample_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 22, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 22, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0"}, "missing_lines": [138, 139, 140, 142, 143, 144, 154, 155, 157, 158, 160, 161, 167, 168, 169, 170, 171, 172, 173, 178, 179, 180], "excluded_lines": [], "start_line": 137}, "_ensure_policy": {"executed_lines": [193, 202, 203, 205, 206, 207, 208, 220], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 183}, "": {"executed_lines": [3, 5, 7, 8, 10, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 137, 183], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"SeedSummary": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 25}, "": {"executed_lines": [3, 5, 7, 8, 10, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 45, 46, 47, 49, 52, 53, 54, 55, 56, 57, 59, 60, 61, 62, 63, 64, 66, 67, 68, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 88, 101, 102, 112, 114, 115, 125, 126, 137, 183, 193, 202, 203, 205, 206, 207, 208, 220], "summary": {"covered_lines": 71, "num_statements": 94, "percent_covered": 75.53191489361703, "percent_covered_display": "76", "missing_lines": 23, "excluded_lines": 0, "percent_statements_covered": 75.53191489361703, "percent_statements_covered_display": "76"}, "missing_lines": [50, 138, 139, 140, 142, 143, 144, 154, 155, 157, 158, 160, 161, 167, 168, 169, 170, 171, 172, 173, 178, 179, 180], "excluded_lines": [], "start_line": 1}}}, "keynetra/version.py": {"executed_lines": [1, 2, 4], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 2, 4], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}, "classes": {"": {"executed_lines": [1, 2, 4], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100"}, "missing_lines": [], "excluded_lines": [], "start_line": 1}}}}, "totals": {"covered_lines": 4791, "num_statements": 5613, "percent_covered": 85.35542490646714, "percent_covered_display": "85", "missing_lines": 822, "excluded_lines": 302, "percent_statements_covered": 85.35542490646714, "percent_statements_covered_display": "85"}} \ No newline at end of file diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 0000000..de027b2 --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,27 @@ +# Deploy Assets + +Production-ready deployment manifests are generated in this directory. + +## Structure + +- `deploy/docker/`: container image and compose stack +- `deploy/kubernetes/`: raw Kubernetes manifests +- `deploy/helm/keynetra/`: installable Helm chart + +## Required Environment Variables + +- `KEYNETRA_DATABASE_URL`: SQLAlchemy DSN +- `KEYNETRA_REDIS_URL`: Redis URL for cache and invalidation +- `KEYNETRA_API_KEYS` or `KEYNETRA_API_KEY_HASHES` +- `KEYNETRA_API_KEY_SCOPES_JSON`: role/permission scopes for API keys +- `KEYNETRA_JWT_SECRET`: non-default outside development +- `KEYNETRA_STRICT_TENANCY=true`: required for strict multi-tenant behavior + +## Quick Commands + +- Docker compose: + - `docker compose -f deploy/docker/docker-compose.yml up --build` +- Kubernetes: + - `kubectl apply -f deploy/kubernetes/` +- Helm: + - `helm install keynetra ./deploy/helm/keynetra` diff --git a/deploy/docker/Dockerfile b/deploy/docker/Dockerfile new file mode 100644 index 0000000..186286e --- /dev/null +++ b/deploy/docker/Dockerfile @@ -0,0 +1,30 @@ +FROM python:3.11-slim + +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PIP_NO_CACHE_DIR=1 + +WORKDIR /app + +RUN adduser --disabled-password --gecos "" --uid 10001 keynetra + +COPY requirements.lock requirements.lock +RUN pip install --upgrade pip && pip install -r requirements.lock + +COPY alembic.ini alembic.ini +COPY alembic alembic +COPY keynetra keynetra +COPY contracts contracts +COPY pyproject.toml pyproject.toml +COPY README.md README.md + +RUN pip install . && chown -R keynetra:keynetra /app + +USER keynetra + +EXPOSE 8000 + +HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=5 \ + CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health/ready', timeout=3)" + +CMD ["keynetra", "serve", "--host", "0.0.0.0", "--port", "8000"] diff --git a/deploy/docker/README.md b/deploy/docker/README.md new file mode 100644 index 0000000..70017c5 --- /dev/null +++ b/deploy/docker/README.md @@ -0,0 +1,39 @@ +# Docker Deploy + +Docker assets: + +- `deploy/docker/Dockerfile` +- `deploy/docker/docker-compose.yml` + +## Local Docker Compose + +From repository root: + +```bash +docker compose -f deploy/docker/docker-compose.yml up --build +``` + +Default compose setup expects: + +- API on `http://localhost:8000` +- Postgres/Redis services from `deploy/docker/docker-compose.yml` + +## Minimal Environment Example + +```env +KEYNETRA_DATABASE_URL=postgresql+psycopg://postgres:postgres@db:5432/keynetra +KEYNETRA_REDIS_URL=redis://redis:6379/0 +KEYNETRA_API_KEYS=devkey +KEYNETRA_API_KEY_SCOPES_JSON={"devkey":{"tenant":"default","role":"admin","permissions":["*"]}} +KEYNETRA_JWT_SECRET=replace-with-strong-secret +KEYNETRA_ENVIRONMENT=prod +KEYNETRA_STRICT_TENANCY=true +``` + +## Scale API Replicas + +```bash +docker compose -f deploy/docker/docker-compose.yml up --scale keynetra=3 +``` + +Use a reverse proxy/load balancer in front of replicas for production traffic. diff --git a/deploy/docker/docker-compose.yml b/deploy/docker/docker-compose.yml new file mode 100644 index 0000000..92d88ff --- /dev/null +++ b/deploy/docker/docker-compose.yml @@ -0,0 +1,57 @@ +name: keynetra + +services: + keynetra: + build: + context: ../.. + dockerfile: deploy/docker/Dockerfile + restart: unless-stopped + ports: + - "8000:8000" + environment: + KEYNETRA_ENVIRONMENT: ${KEYNETRA_ENVIRONMENT:-development} + KEYNETRA_DATABASE_URL: ${KEYNETRA_DATABASE_URL:-postgresql+psycopg://keynetra:keynetra@postgres:5432/keynetra} + KEYNETRA_REDIS_URL: ${KEYNETRA_REDIS_URL:-redis://redis:6379/0} + KEYNETRA_API_KEYS: ${KEYNETRA_API_KEYS:-devkey} + KEYNETRA_JWT_SECRET: ${KEYNETRA_JWT_SECRET:-change-me} + KEYNETRA_STRICT_TENANCY: ${KEYNETRA_STRICT_TENANCY:-false} + KEYNETRA_AUTO_SEED_SAMPLE_DATA: ${KEYNETRA_AUTO_SEED_SAMPLE_DATA:-false} + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + healthcheck: + test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health/ready', timeout=3)"] + interval: 30s + timeout: 5s + retries: 5 + start_period: 20s + + postgres: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_USER: ${KEYNETRA_POSTGRES_USER:-keynetra} + POSTGRES_PASSWORD: ${KEYNETRA_POSTGRES_PASSWORD:-keynetra} + POSTGRES_DB: ${KEYNETRA_POSTGRES_DB:-keynetra} + volumes: + - keynetra_postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] + interval: 10s + timeout: 5s + retries: 5 + + redis: + image: redis:7-alpine + restart: unless-stopped + command: ["redis-server", "--save", "", "--appendonly", "no"] + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + keynetra_postgres_data: diff --git a/deploy/helm/README.md b/deploy/helm/README.md new file mode 100644 index 0000000..dc594d3 --- /dev/null +++ b/deploy/helm/README.md @@ -0,0 +1,24 @@ +# Helm Deploy + +Chart path: + +- `deploy/helm/keynetra` + +## Install + +```bash +helm upgrade --install keynetra ./deploy/helm/keynetra +``` + +## Override Examples + +```bash +helm upgrade --install keynetra ./deploy/helm/keynetra \ + --set image.repository=ghcr.io/keynetra/keynetra \ + --set image.tag=v0.1.0 \ + --set env.KEYNETRA_DATABASE_URL=postgresql+psycopg://... \ + --set env.KEYNETRA_REDIS_URL=redis://... \ + --set env.KEYNETRA_STRICT_TENANCY=true \ + --set secretEnv.KEYNETRA_API_KEY_HASHES=
`
-
-Use this file as the entry point for doc sources, templates, and branding assets.
-
-## Branding asset
-
-- File: `data/imgs/logo.png`
-- Use: hero banner, doc headers, quickstart references
-- Recommended alt text: "KeyNetra Logo"
-
-## Doc sources
-
-- `README.md`: top-level landing
-- `docs/api-endpoints.md`: HTTP contract details
-- `docs/models/`: authorization model explanations
-- `docs/policies.md`: policy structure guidance
-- `docs/use-cases.md`: real-world example scenarios
-- `docs/deep-dive/`: developer manual, code walkthrough, integration cookbook
-
-Each markdown includes the same logo to keep visual continuity.
-
-## When adding new docs
-
-1. Save art in `data/imgs/` and reference via relative path `data/imgs/logo.png`.
-2. Reuse the same hero markup `