diff --git a/.github/workflows/_deploy_api.yaml b/.github/workflows/_deploy.yaml similarity index 95% rename from .github/workflows/_deploy_api.yaml rename to .github/workflows/_deploy.yaml index 05e3998..6dff81c 100644 --- a/.github/workflows/_deploy_api.yaml +++ b/.github/workflows/_deploy.yaml @@ -1,4 +1,4 @@ -name: Deploy API +name: Deploy on: workflow_call: diff --git a/.github/workflows/_deploy_transcriber.yaml b/.github/workflows/_deploy_transcriber.yaml deleted file mode 100644 index 42cf5de..0000000 --- a/.github/workflows/_deploy_transcriber.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: Deploy Transcriber - -on: - workflow_call: - inputs: - environment: - required: true - type: string - -jobs: - deploy: - runs-on: ubuntu-22.04 - environment: ${{ inputs.environment }} - steps: - - name: Checkout repository - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - - name: Install uv - uses: astral-sh/setup-uv@557e51de59eb14aaaba2ed9621916900a91d50c6 # v6.6.1 - with: - version: ${{ vars.UV_VERSION }} - - - name: Install Python packages - run: uv sync --locked --no-dev - shell: bash diff --git a/.github/workflows/pull_request.yaml b/.github/workflows/pull_request.yaml index e5952c6..5a3e44c 100644 --- a/.github/workflows/pull_request.yaml +++ b/.github/workflows/pull_request.yaml @@ -14,7 +14,7 @@ jobs: if: github.actor != 'dependabot[bot]' runs-on: ubuntu-latest outputs: - api-docker-tag: ${{ steps.api-docker-tag.outputs.api-docker-tag }} + python-archetype-docker-tag: ${{ steps.python-archetype-docker-tag.outputs.python-archetype-docker-tag }} env: COMMON__ENVIRONMENT: Development steps: @@ -24,7 +24,7 @@ jobs: - name: Install uv uses: astral-sh/setup-uv@557e51de59eb14aaaba2ed9621916900a91d50c6 # v6.6.1 with: - version: ${{ vars.UV_VERSION }} + version: 0.8.16 - name: Install Python uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 @@ -51,58 +51,37 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 - - name: Set api docker tag - id: api-docker-tag - run: echo "api-docker-tag=myregistry/api:${{ github.event.pull_request.head.sha }}" >> $GITHUB_OUTPUT + - name: Set docker tag + id: python-archetype-docker-tag + run: echo "python-archetype-docker-tag=myregistry/python-archetype:${{ github.event.pull_request.head.sha }}" >> $GITHUB_OUTPUT - - name: Build and push api + - name: Build and push uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 with: - file: api/src/api/Dockerfile - tags: ${{ steps.api-docker-tag.outputs.api-docker-tag }} + file: src/python_archetype/api/Dockerfile + tags: ${{ steps.python-archetype-docker-tag.outputs.python-archetype-docker-tag }} push: false - deploy-api-dev: + deploy-dev: needs: continuous-integration - uses: ./.github/workflows/_deploy_api.yaml + uses: ./.github/workflows/_deploy.yaml with: environment: dev - docker_tag: ${{ needs.continuous-integration.outputs.api-docker-tag }} + docker_tag: ${{ needs.continuous-integration.outputs.python-archetype-docker-tag }} secrets: inherit - deploy-transcriber-dev: - needs: continuous-integration - uses: ./.github/workflows/_deploy_transcriber.yaml - with: - environment: dev - secrets: inherit - - deploy-api-stg: - needs: [deploy-api-dev, deploy-transcriber-dev] - uses: ./.github/workflows/_deploy_api.yaml + deploy-stg: + needs: [continuous-integration, deploy-dev] + uses: ./.github/workflows/_deploy.yaml with: environment: stg - docker_tag: ${{ needs.continuous-integration.outputs.api-docker-tag }} - secrets: inherit - - deploy-transcriber-stg: - needs: [deploy-api-dev, deploy-transcriber-dev] - uses: ./.github/workflows/_deploy_transcriber.yaml - with: - environment: stg - secrets: inherit - - deploy-api-pro: - needs: [deploy-api-stg, deploy-transcriber-stg] - uses: ./.github/workflows/_deploy_api.yaml - with: - environment: pro - docker_tag: ${{ needs.continuous-integration.outputs.api-docker-tag }} + docker_tag: ${{ needs.continuous-integration.outputs.python-archetype-docker-tag }} secrets: inherit - deploy-transcriber-pro: - needs: [deploy-api-stg, deploy-transcriber-stg] - uses: ./.github/workflows/_deploy_transcriber.yaml + deploy-pro: + needs: [continuous-integration, deploy-stg] + uses: ./.github/workflows/_deploy.yaml with: environment: pro + docker_tag: ${{ needs.continuous-integration.outputs.python-archetype-docker-tag }} secrets: inherit diff --git a/.vscode/launch.json b/.vscode/launch.json index e236353..dd8b66a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,7 +8,7 @@ "module": "fastapi", "args": [ "dev", - "api/src/api/main.py" + "src/python_archetype/api/main.py" ], "console": "integratedTerminal", "justMyCode": false, diff --git a/README.md b/README.md index e1b9994..3f2a981 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,6 @@ # Overview -Python monorepo + uv + Vertical Slice Architecture - -# Projects -`api` and `transcriber`. +Python archetype + uv + Vertical Slice Architecture # Execute project diff --git a/api/pyproject.toml b/api/pyproject.toml deleted file mode 100644 index 68c7e6b..0000000 --- a/api/pyproject.toml +++ /dev/null @@ -1,7 +0,0 @@ -[project] -name = "api" -version = "0.1.0" - -[build-system] -requires = ["uv_build>=0.8.11,<0.9.0"] -build-backend = "uv_build" diff --git a/api/src/api/main.py b/api/src/api/main.py deleted file mode 100644 index 6477eb7..0000000 --- a/api/src/api/main.py +++ /dev/null @@ -1,43 +0,0 @@ -from collections.abc import AsyncGenerator -from contextlib import asynccontextmanager - -from fastapi import FastAPI -from fastapi.middleware.cors import CORSMiddleware -from opentelemetry.instrumentation.fastapi import ( # type: ignore[reportMissingTypeStubs] - FastAPIInstrumentor, -) - -from api.dependency_container import DependencyContainer -from api.workflows.products import product_router -from common.application_environment import ApplicationEnvironment - - -@asynccontextmanager -async def lifespan(_: FastAPI) -> AsyncGenerator[None]: - await DependencyContainer.initialize() - yield - - -def add_telemetry(app: FastAPI) -> None: - FastAPIInstrumentor.instrument_app(app) # type: ignore[reportUnknownMemberType] - - -openapi_url = ( - "/openapi.json" - if ApplicationEnvironment.get_current() != ApplicationEnvironment.PRODUCTION - else None -) -app = FastAPI( - title="Python monorepo", - version="0.1.0", - openapi_url=openapi_url, - lifespan=lifespan, -) -app.add_middleware( - CORSMiddleware, - allow_origins=["*"], - allow_credentials=False, - allow_methods=["*"], - allow_headers=["*"], -) -app.include_router(product_router.router) diff --git a/api/src/api/py.typed b/api/src/api/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/common/pyproject.toml b/common/pyproject.toml deleted file mode 100644 index 34b74e2..0000000 --- a/common/pyproject.toml +++ /dev/null @@ -1,7 +0,0 @@ -[project] -name = "common" -version = "0.1.0" - -[build-system] -requires = ["uv_build>=0.8.11,<0.9.0"] -build-backend = "uv_build" diff --git a/common/src/common/py.typed b/common/src/common/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/domain/pyproject.toml b/domain/pyproject.toml deleted file mode 100644 index 5d09237..0000000 --- a/domain/pyproject.toml +++ /dev/null @@ -1,7 +0,0 @@ -[project] -name = "domain" -version = "0.1.0" - -[build-system] -requires = ["uv_build>=0.8.11,<0.9.0"] -build-backend = "uv_build" diff --git a/domain/src/domain/py.typed b/domain/src/domain/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/notebooks/notebook.ipynb b/notebooks/notebook.ipynb index 4eecf36..c580c7f 100644 --- a/notebooks/notebook.ipynb +++ b/notebooks/notebook.ipynb @@ -1,5 +1,19 @@ { - "cells": [], + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from decimal import Decimal\n", + "\n", + "from python_archetype.domain.entities.product import Product\n", + "\n", + "Product(name=\"Sample Product\", price=Decimal(\"9.99\"), is_discontinued=False)" + ] + } + ], "metadata": { "kernelspec": { "display_name": ".venv", diff --git a/pyproject.toml b/pyproject.toml index b59345c..862b882 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,11 @@ [project] -name = "python-architecture" +name = "python-archetype" version = "0.1.0" requires-python = ">=3.12" dependencies = [ "aiohttp==3.12.15", "azure-cosmos==4.9.0", - "common", - "domain", "fastapi[standard-no-fastapi-cloud-cli]==0.116.1", - "opentelemetry-instrumentation-fastapi==0.57b0", "poethepoet==0.37.0", "pydantic==2.11.7", "pydantic-settings[azure-key-vault]==2.10.1", @@ -16,7 +13,6 @@ dependencies = [ [dependency-groups] dev = [ - "api", "jupyter==1.1.1", "pyright[nodejs]==1.1.405", "pytest==8.4.2", @@ -24,22 +20,14 @@ dev = [ "pytest-cov==7.0.0", "pytest-mock==3.15.0", "ruff==0.12.12", - "test-utils", - "transcriber", ] -[tool.uv] -required-version = ">=0.8.11,<0.9.0" - -[tool.uv.workspace] -members = ["api", "domain", "transcriber", "test_utils", "common", "scripts"] +[build-system] +requires = ["uv_build>=0.8.16,<0.9.0"] +build-backend = "uv_build" -[tool.uv.sources] -api = { workspace = true } -domain = { workspace = true } -transcriber = { workspace = true } -test-utils = { workspace = true } -common = { workspace = true } +[tool.uv] +required-version = ">=0.8.16,<0.9.0" [tool.pyright] typeCheckingMode = "strict" @@ -64,12 +52,12 @@ ignore = [ [tool.pytest.ini_options] -addopts = ["--import-mode=importlib"] +pythonpath = ["src", "tests"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" markers = ["unit: Unit tests", "integration: Integration tests"] [tool.poe.tasks] check-code.shell = "ruff check && ruff format --diff && pyright" -start-api-dev = "fastapi dev api/src/api/main.py" -start-api-pro.shell = "workers=$(nproc) && fastapi run --workers $workers api/src/api/main.py" +start-api-dev = "fastapi dev src/python_archetype/api/main.py" +start-api-pro.shell = "workers=$(nproc) && fastapi run --workers $workers src/python_archetype/api/main.py" diff --git a/scripts/main.py b/scripts/main.py index e257041..a490d8d 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -1,6 +1,6 @@ from decimal import Decimal -from domain.entities.product import Product +from python_archetype.domain.entities.product import Product def main() -> None: diff --git a/api/src/api/__init__.py b/src/python_archetype/__init__.py similarity index 100% rename from api/src/api/__init__.py rename to src/python_archetype/__init__.py diff --git a/api/src/api/.env b/src/python_archetype/api/.env similarity index 100% rename from api/src/api/.env rename to src/python_archetype/api/.env diff --git a/api/src/api/.env.Development b/src/python_archetype/api/.env.Development similarity index 100% rename from api/src/api/.env.Development rename to src/python_archetype/api/.env.Development diff --git a/api/src/api/.env.Local b/src/python_archetype/api/.env.Local similarity index 100% rename from api/src/api/.env.Local rename to src/python_archetype/api/.env.Local diff --git a/api/src/api/.env.Production b/src/python_archetype/api/.env.Production similarity index 100% rename from api/src/api/.env.Production rename to src/python_archetype/api/.env.Production diff --git a/api/src/api/.env.Staging b/src/python_archetype/api/.env.Staging similarity index 100% rename from api/src/api/.env.Staging rename to src/python_archetype/api/.env.Staging diff --git a/api/src/api/Dockerfile b/src/python_archetype/api/Dockerfile similarity index 70% rename from api/src/api/Dockerfile rename to src/python_archetype/api/Dockerfile index 27a4c5e..19dfa5b 100644 --- a/api/src/api/Dockerfile +++ b/src/python_archetype/api/Dockerfile @@ -1,5 +1,5 @@ -# 0.8.11-python3.12-bookworm-slim -FROM astral/uv@sha256:165703e3c12d7fca3dfa15b2012b98d6e03c261a516d4bd7ca3a956c57c7abce AS builder +# 0.8.16-python3.12-bookworm-slim +FROM astral/uv@sha256:7a97137011fcda1395e1081349fb43ff5fc35953295d8b7c83b75e8829c82c9d AS builder ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=0 @@ -7,13 +7,11 @@ WORKDIR /app RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ - uv sync --frozen --no-install-workspace --no-dev + uv sync --locked --no-install-workspace --no-dev COPY pyproject.toml uv.lock ./ -COPY common common -COPY domain domain -COPY api api +COPY src src RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-dev + uv sync --locked --no-dev # 3.12.11-slim-bookworm FROM python@sha256:42cf2422587a3dac0e0a3674a4d86f01570d5d7260588f3845f51e6176d8134b AS final diff --git a/api/src/api/services/__init__.py b/src/python_archetype/api/__init__.py similarity index 100% rename from api/src/api/services/__init__.py rename to src/python_archetype/api/__init__.py diff --git a/api/src/api/application_settings.py b/src/python_archetype/api/application_settings.py similarity index 95% rename from api/src/api/application_settings.py rename to src/python_archetype/api/application_settings.py index bc7552a..e279216 100644 --- a/api/src/api/application_settings.py +++ b/src/python_archetype/api/application_settings.py @@ -12,7 +12,7 @@ SettingsConfigDict, ) -from common.application_environment import ApplicationEnvironment +from python_archetype.common.application_environment import ApplicationEnvironment class ApplicationSettings(BaseSettings): diff --git a/api/src/api/dependency_container.py b/src/python_archetype/api/dependency_container.py similarity index 87% rename from api/src/api/dependency_container.py rename to src/python_archetype/api/dependency_container.py index 68be370..ec98761 100644 --- a/api/src/api/dependency_container.py +++ b/src/python_archetype/api/dependency_container.py @@ -4,15 +4,15 @@ from azure.cosmos import PartitionKey from azure.cosmos.aio import CosmosClient, DatabaseProxy -from api.application_settings import ApplicationSettings -from api.workflows.products.discontinue_product.discontinue_product_workflow import ( +from python_archetype.api.application_settings import ApplicationSettings +from python_archetype.api.workflows.products.discontinue_product.discontinue_product_workflow import ( DiscontinueProductWorkflow, ) -from api.workflows.products.publish_product.publish_product_workflow import ( +from python_archetype.api.workflows.products.publish_product.publish_product_workflow import ( PublishProductWorkflow, ) -from common.application_environment import ApplicationEnvironment -from domain.entities.product import Product +from python_archetype.common.application_environment import ApplicationEnvironment +from python_archetype.domain.entities.product import Product class DependencyContainer: diff --git a/src/python_archetype/api/main.py b/src/python_archetype/api/main.py new file mode 100644 index 0000000..aa6c0d9 --- /dev/null +++ b/src/python_archetype/api/main.py @@ -0,0 +1,26 @@ +from collections.abc import AsyncGenerator +from contextlib import asynccontextmanager + +from fastapi import FastAPI + +from python_archetype.api.dependency_container import DependencyContainer +from python_archetype.api.workflows.products import product_router +from python_archetype.common.application_environment import ApplicationEnvironment + + +@asynccontextmanager +async def lifespan(_: FastAPI) -> AsyncGenerator[None]: + await DependencyContainer.initialize() + yield + + +openapi_url = ( + "/openapi.json" + if ApplicationEnvironment.get_current() != ApplicationEnvironment.PRODUCTION + else None +) +app = FastAPI( + openapi_url=openapi_url, + lifespan=lifespan, +) +app.include_router(product_router.router) diff --git a/api/src/api/workflows/__init__.py b/src/python_archetype/api/services/__init__.py similarity index 100% rename from api/src/api/workflows/__init__.py rename to src/python_archetype/api/services/__init__.py diff --git a/api/src/api/services/some_common_service.py b/src/python_archetype/api/services/some_common_service.py similarity index 100% rename from api/src/api/services/some_common_service.py rename to src/python_archetype/api/services/some_common_service.py diff --git a/api/src/api/workflows/products/__init__.py b/src/python_archetype/api/workflows/__init__.py similarity index 100% rename from api/src/api/workflows/products/__init__.py rename to src/python_archetype/api/workflows/__init__.py diff --git a/api/src/api/workflows/products/discontinue_product/__init__.py b/src/python_archetype/api/workflows/products/__init__.py similarity index 100% rename from api/src/api/workflows/products/discontinue_product/__init__.py rename to src/python_archetype/api/workflows/products/__init__.py diff --git a/api/src/api/workflows/products/publish_product/__init__.py b/src/python_archetype/api/workflows/products/discontinue_product/__init__.py similarity index 100% rename from api/src/api/workflows/products/publish_product/__init__.py rename to src/python_archetype/api/workflows/products/discontinue_product/__init__.py diff --git a/api/src/api/workflows/products/discontinue_product/discontinue_product_request.py b/src/python_archetype/api/workflows/products/discontinue_product/discontinue_product_request.py similarity index 100% rename from api/src/api/workflows/products/discontinue_product/discontinue_product_request.py rename to src/python_archetype/api/workflows/products/discontinue_product/discontinue_product_request.py diff --git a/api/src/api/workflows/products/discontinue_product/discontinue_product_workflow.py b/src/python_archetype/api/workflows/products/discontinue_product/discontinue_product_workflow.py similarity index 81% rename from api/src/api/workflows/products/discontinue_product/discontinue_product_workflow.py rename to src/python_archetype/api/workflows/products/discontinue_product/discontinue_product_workflow.py index 0a4a1d2..8e16b1b 100644 --- a/api/src/api/workflows/products/discontinue_product/discontinue_product_workflow.py +++ b/src/python_archetype/api/workflows/products/discontinue_product/discontinue_product_workflow.py @@ -1,9 +1,9 @@ from azure.cosmos.aio import DatabaseProxy -from api.workflows.products.discontinue_product.discontinue_product_request import ( +from python_archetype.api.workflows.products.discontinue_product.discontinue_product_request import ( DiscontinueProductRequest, ) -from domain.entities.product import Product +from python_archetype.domain.entities.product import Product class DiscontinueProductWorkflow: diff --git a/api/src/api/workflows/products/product_router.py b/src/python_archetype/api/workflows/products/product_router.py similarity index 64% rename from api/src/api/workflows/products/product_router.py rename to src/python_archetype/api/workflows/products/product_router.py index cc4c42b..1b03b6c 100644 --- a/api/src/api/workflows/products/product_router.py +++ b/src/python_archetype/api/workflows/products/product_router.py @@ -1,13 +1,13 @@ from fastapi import APIRouter -from api.dependency_container import DependencyContainer -from api.workflows.products.discontinue_product.discontinue_product_request import ( +from python_archetype.api.dependency_container import DependencyContainer +from python_archetype.api.workflows.products.discontinue_product.discontinue_product_request import ( DiscontinueProductRequest, ) -from api.workflows.products.publish_product.publish_product_request import ( +from python_archetype.api.workflows.products.publish_product.publish_product_request import ( PublishProductRequest, ) -from api.workflows.products.publish_product.publish_product_response import ( +from python_archetype.api.workflows.products.publish_product.publish_product_response import ( PublishProductResponse, ) diff --git a/api/tests/__init__.py b/src/python_archetype/api/workflows/products/publish_product/__init__.py similarity index 100% rename from api/tests/__init__.py rename to src/python_archetype/api/workflows/products/publish_product/__init__.py diff --git a/api/src/api/workflows/products/publish_product/publish_product_request.py b/src/python_archetype/api/workflows/products/publish_product/publish_product_request.py similarity index 100% rename from api/src/api/workflows/products/publish_product/publish_product_request.py rename to src/python_archetype/api/workflows/products/publish_product/publish_product_request.py diff --git a/api/src/api/workflows/products/publish_product/publish_product_response.py b/src/python_archetype/api/workflows/products/publish_product/publish_product_response.py similarity index 100% rename from api/src/api/workflows/products/publish_product/publish_product_response.py rename to src/python_archetype/api/workflows/products/publish_product/publish_product_response.py diff --git a/api/src/api/workflows/products/publish_product/publish_product_workflow.py b/src/python_archetype/api/workflows/products/publish_product/publish_product_workflow.py similarity index 74% rename from api/src/api/workflows/products/publish_product/publish_product_workflow.py rename to src/python_archetype/api/workflows/products/publish_product/publish_product_workflow.py index 77f5f9b..05d61a9 100644 --- a/api/src/api/workflows/products/publish_product/publish_product_workflow.py +++ b/src/python_archetype/api/workflows/products/publish_product/publish_product_workflow.py @@ -1,12 +1,12 @@ from azure.cosmos.aio import DatabaseProxy -from api.workflows.products.publish_product.publish_product_request import ( +from python_archetype.api.workflows.products.publish_product.publish_product_request import ( PublishProductRequest, ) -from api.workflows.products.publish_product.publish_product_response import ( +from python_archetype.api.workflows.products.publish_product.publish_product_response import ( PublishProductResponse, ) -from domain.entities.product import Product +from python_archetype.domain.entities.product import Product class PublishProductWorkflow: diff --git a/api/tests/integration/__init__.py b/src/python_archetype/common/__init__.py similarity index 100% rename from api/tests/integration/__init__.py rename to src/python_archetype/common/__init__.py diff --git a/common/src/common/application_environment.py b/src/python_archetype/common/application_environment.py similarity index 100% rename from common/src/common/application_environment.py rename to src/python_archetype/common/application_environment.py diff --git a/common/src/common/business_error.py b/src/python_archetype/common/business_error.py similarity index 100% rename from common/src/common/business_error.py rename to src/python_archetype/common/business_error.py diff --git a/api/tests/integration/workflows/__init__.py b/src/python_archetype/domain/__init__.py similarity index 100% rename from api/tests/integration/workflows/__init__.py rename to src/python_archetype/domain/__init__.py diff --git a/api/tests/integration/workflows/products/__init__.py b/src/python_archetype/domain/entities/__init__.py similarity index 100% rename from api/tests/integration/workflows/products/__init__.py rename to src/python_archetype/domain/entities/__init__.py diff --git a/domain/src/domain/entities/product.py b/src/python_archetype/domain/entities/product.py similarity index 87% rename from domain/src/domain/entities/product.py rename to src/python_archetype/domain/entities/product.py index a35ab88..d98a367 100644 --- a/domain/src/domain/entities/product.py +++ b/src/python_archetype/domain/entities/product.py @@ -2,8 +2,8 @@ from pydantic import Field -from common.business_error import BusinessError -from domain.entity import Entity +from python_archetype.common.business_error import BusinessError +from python_archetype.domain.entity import Entity class Product(Entity): diff --git a/domain/src/domain/entity.py b/src/python_archetype/domain/entity.py similarity index 100% rename from domain/src/domain/entity.py rename to src/python_archetype/domain/entity.py diff --git a/test_utils/pyproject.toml b/test_utils/pyproject.toml deleted file mode 100644 index 076cad4..0000000 --- a/test_utils/pyproject.toml +++ /dev/null @@ -1,7 +0,0 @@ -[project] -name = "test-utils" -version = "0.1.0" - -[build-system] -requires = ["uv_build>=0.8.11,<0.9.0"] -build-backend = "uv_build" diff --git a/test_utils/src/test_utils/py.typed b/test_utils/src/test_utils/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/api/tests/integration/workflows/products/discontinue_product/__init__.py b/tests/__init__.py similarity index 100% rename from api/tests/integration/workflows/products/discontinue_product/__init__.py rename to tests/__init__.py diff --git a/api/tests/integration/workflows/products/publish_product/__init__.py b/tests/integration/__init__.py similarity index 100% rename from api/tests/integration/workflows/products/publish_product/__init__.py rename to tests/integration/__init__.py diff --git a/common/src/common/__init__.py b/tests/integration/api/workflows/__init__.py similarity index 100% rename from common/src/common/__init__.py rename to tests/integration/api/workflows/__init__.py diff --git a/domain/src/domain/__init__.py b/tests/integration/api/workflows/products/__init__.py similarity index 100% rename from domain/src/domain/__init__.py rename to tests/integration/api/workflows/products/__init__.py diff --git a/domain/src/domain/entities/__init__.py b/tests/integration/api/workflows/products/discontinue_product/__init__.py similarity index 100% rename from domain/src/domain/entities/__init__.py rename to tests/integration/api/workflows/products/discontinue_product/__init__.py diff --git a/api/tests/integration/workflows/products/discontinue_product/test_discontinue_product_workflow.py b/tests/integration/api/workflows/products/discontinue_product/test_discontinue_product_workflow.py similarity index 76% rename from api/tests/integration/workflows/products/discontinue_product/test_discontinue_product_workflow.py rename to tests/integration/api/workflows/products/discontinue_product/test_discontinue_product_workflow.py index 1bb559d..1ce3600 100644 --- a/api/tests/integration/workflows/products/discontinue_product/test_discontinue_product_workflow.py +++ b/tests/integration/api/workflows/products/discontinue_product/test_discontinue_product_workflow.py @@ -1,11 +1,11 @@ import pytest +from test_utils.builders.domain.entities.product_builder import ProductBuilder -from api.dependency_container import DependencyContainer -from api.workflows.products.discontinue_product.discontinue_product_request import ( +from python_archetype.api.dependency_container import DependencyContainer +from python_archetype.api.workflows.products.discontinue_product.discontinue_product_request import ( DiscontinueProductRequest, ) -from domain.entities.product import Product -from test_utils.builders.domain.entities.product_builder import ProductBuilder +from python_archetype.domain.entities.product import Product @pytest.mark.integration diff --git a/domain/tests/__init__.py b/tests/integration/api/workflows/products/publish_product/__init__.py similarity index 100% rename from domain/tests/__init__.py rename to tests/integration/api/workflows/products/publish_product/__init__.py diff --git a/api/tests/integration/workflows/products/publish_product/test_publish_product_workflow.py b/tests/integration/api/workflows/products/publish_product/test_publish_product_workflow.py similarity index 65% rename from api/tests/integration/workflows/products/publish_product/test_publish_product_workflow.py rename to tests/integration/api/workflows/products/publish_product/test_publish_product_workflow.py index 46539e8..b6e27e9 100644 --- a/api/tests/integration/workflows/products/publish_product/test_publish_product_workflow.py +++ b/tests/integration/api/workflows/products/publish_product/test_publish_product_workflow.py @@ -1,7 +1,7 @@ import pytest -from api.dependency_container import DependencyContainer -from test_utils.builders.api.workflows.products.publish_product.publish_product_request_builder import ( +from python_archetype.api.dependency_container import DependencyContainer +from tests.test_utils.builders.api.workflows.products.publish_product.publish_product_request_builder import ( PublishProductRequestBuilder, ) diff --git a/api/tests/integration/conftest.py b/tests/integration/conftest.py similarity index 65% rename from api/tests/integration/conftest.py rename to tests/integration/conftest.py index 22b5e16..fa31b73 100644 --- a/api/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -1,6 +1,6 @@ import pytest -from api.dependency_container import DependencyContainer +from python_archetype.api.dependency_container import DependencyContainer @pytest.fixture(autouse=True) diff --git a/domain/tests/unit/__init__.py b/tests/test_utils/__init__.py similarity index 100% rename from domain/tests/unit/__init__.py rename to tests/test_utils/__init__.py diff --git a/test_utils/src/test_utils/__init__.py b/tests/test_utils/builders/__init__.py similarity index 100% rename from test_utils/src/test_utils/__init__.py rename to tests/test_utils/builders/__init__.py diff --git a/test_utils/src/test_utils/builders/__init__.py b/tests/test_utils/builders/api/__init__.py similarity index 100% rename from test_utils/src/test_utils/builders/__init__.py rename to tests/test_utils/builders/api/__init__.py diff --git a/test_utils/src/test_utils/builders/api/__init__.py b/tests/test_utils/builders/api/workflows/__init__.py similarity index 100% rename from test_utils/src/test_utils/builders/api/__init__.py rename to tests/test_utils/builders/api/workflows/__init__.py diff --git a/test_utils/src/test_utils/builders/api/workflows/__init__.py b/tests/test_utils/builders/api/workflows/products/__init__.py similarity index 100% rename from test_utils/src/test_utils/builders/api/workflows/__init__.py rename to tests/test_utils/builders/api/workflows/products/__init__.py diff --git a/test_utils/src/test_utils/builders/api/workflows/products/__init__.py b/tests/test_utils/builders/api/workflows/products/publish_product/__init__.py similarity index 100% rename from test_utils/src/test_utils/builders/api/workflows/products/__init__.py rename to tests/test_utils/builders/api/workflows/products/publish_product/__init__.py diff --git a/test_utils/src/test_utils/builders/api/workflows/products/publish_product/publish_product_request_builder.py b/tests/test_utils/builders/api/workflows/products/publish_product/publish_product_request_builder.py similarity index 75% rename from test_utils/src/test_utils/builders/api/workflows/products/publish_product/publish_product_request_builder.py rename to tests/test_utils/builders/api/workflows/products/publish_product/publish_product_request_builder.py index 42a469f..db3c180 100644 --- a/test_utils/src/test_utils/builders/api/workflows/products/publish_product/publish_product_request_builder.py +++ b/tests/test_utils/builders/api/workflows/products/publish_product/publish_product_request_builder.py @@ -1,6 +1,6 @@ from decimal import Decimal -from api.workflows.products.publish_product.publish_product_request import ( +from python_archetype.api.workflows.products.publish_product.publish_product_request import ( PublishProductRequest, ) diff --git a/test_utils/src/test_utils/builders/api/workflows/products/publish_product/__init__.py b/tests/test_utils/builders/domain/__init__.py similarity index 100% rename from test_utils/src/test_utils/builders/api/workflows/products/publish_product/__init__.py rename to tests/test_utils/builders/domain/__init__.py diff --git a/test_utils/src/test_utils/builders/domain/__init__.py b/tests/test_utils/builders/domain/entities/__init__.py similarity index 100% rename from test_utils/src/test_utils/builders/domain/__init__.py rename to tests/test_utils/builders/domain/entities/__init__.py diff --git a/test_utils/src/test_utils/builders/domain/entities/product_builder.py b/tests/test_utils/builders/domain/entities/product_builder.py similarity index 88% rename from test_utils/src/test_utils/builders/domain/entities/product_builder.py rename to tests/test_utils/builders/domain/entities/product_builder.py index 1a262af..e270876 100644 --- a/test_utils/src/test_utils/builders/domain/entities/product_builder.py +++ b/tests/test_utils/builders/domain/entities/product_builder.py @@ -1,7 +1,7 @@ from decimal import Decimal from typing import Self -from domain.entities.product import Product +from python_archetype.domain.entities.product import Product class ProductBuilder: diff --git a/test_utils/src/test_utils/builders/domain/entities/__init__.py b/tests/unit/__init__.py similarity index 100% rename from test_utils/src/test_utils/builders/domain/entities/__init__.py rename to tests/unit/__init__.py diff --git a/transcriber/src/transcriber/__init__.py b/tests/unit/domain/__init__.py similarity index 100% rename from transcriber/src/transcriber/__init__.py rename to tests/unit/domain/__init__.py diff --git a/domain/tests/unit/test_product.py b/tests/unit/domain/test_product.py similarity index 87% rename from domain/tests/unit/test_product.py rename to tests/unit/domain/test_product.py index 2f6954b..a0f9821 100644 --- a/domain/tests/unit/test_product.py +++ b/tests/unit/domain/test_product.py @@ -1,8 +1,8 @@ import pytest - -from common.business_error import BusinessError from test_utils.builders.domain.entities.product_builder import ProductBuilder +from python_archetype.common.business_error import BusinessError + @pytest.mark.unit class TestProduct: diff --git a/transcriber/py.typed b/transcriber/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/transcriber/pyproject.toml b/transcriber/pyproject.toml deleted file mode 100644 index 656bf8e..0000000 --- a/transcriber/pyproject.toml +++ /dev/null @@ -1,7 +0,0 @@ -[project] -name = "transcriber" -version = "0.1.0" - -[build-system] -requires = ["uv_build>=0.8.11,<0.9.0"] -build-backend = "uv_build" diff --git a/transcriber/src/transcriber/transcriber_printer.py b/transcriber/src/transcriber/transcriber_printer.py deleted file mode 100644 index fbd8ec2..0000000 --- a/transcriber/src/transcriber/transcriber_printer.py +++ /dev/null @@ -1,3 +0,0 @@ -class TranscriberPrinter: - def print(self) -> None: - print("Transcriber printer") # noqa: T201 diff --git a/uv.lock b/uv.lock index 109d8ed..1bcb08c 100644 --- a/uv.lock +++ b/uv.lock @@ -6,17 +6,6 @@ resolution-markers = [ "python_full_version < '3.14'", ] -[manifest] -members = [ - "api", - "common", - "domain", - "python-architecture", - "scripts", - "test-utils", - "transcriber", -] - [[package]] name = "aiohappyeyeballs" version = "2.6.1" @@ -113,11 +102,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] -[[package]] -name = "api" -version = "0.1.0" -source = { editable = "api" } - [[package]] name = "appnope" version = "0.1.4" @@ -183,15 +167,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419, upload-time = "2023-09-30T22:11:16.072Z" }, ] -[[package]] -name = "asgiref" -version = "3.9.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/61/0aa957eec22ff70b830b22ff91f825e70e1ef732c06666a805730f28b36b/asgiref-3.9.1.tar.gz", hash = "sha256:a5ab6582236218e5ef1648f242fd9f10626cfd4de8dc377db215d5d5098e3142", size = 36870, upload-time = "2025-07-08T09:07:43.344Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/3c/0464dcada90d5da0e71018c04a140ad6349558afb30b3051b4264cc5b965/asgiref-3.9.1-py3-none-any.whl", hash = "sha256:f3bba7092a48005b5f5bacd747d36ee4a5a61f4a269a6df590b43144355ebd2c", size = 23790, upload-time = "2025-07-08T09:07:41.548Z" }, -] - [[package]] name = "asttokens" version = "3.0.0" @@ -453,11 +428,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, ] -[[package]] -name = "common" -version = "0.1.0" -source = { editable = "common" } - [[package]] name = "coverage" version = "7.10.6" @@ -601,11 +571,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, ] -[[package]] -name = "domain" -version = "0.1.0" -source = { editable = "domain" } - [[package]] name = "email-validator" version = "2.3.0" @@ -817,18 +782,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] -[[package]] -name = "importlib-metadata" -version = "8.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, -] - [[package]] name = "iniconfig" version = "2.1.0" @@ -1506,88 +1459,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, ] -[[package]] -name = "opentelemetry-api" -version = "1.36.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "importlib-metadata" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/27/d2/c782c88b8afbf961d6972428821c302bd1e9e7bc361352172f0ca31296e2/opentelemetry_api-1.36.0.tar.gz", hash = "sha256:9a72572b9c416d004d492cbc6e61962c0501eaf945ece9b5a0f56597d8348aa0", size = 64780, upload-time = "2025-07-29T15:12:06.02Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/ee/6b08dde0a022c463b88f55ae81149584b125a42183407dc1045c486cc870/opentelemetry_api-1.36.0-py3-none-any.whl", hash = "sha256:02f20bcacf666e1333b6b1f04e647dc1d5111f86b8e510238fcc56d7762cda8c", size = 65564, upload-time = "2025-07-29T15:11:47.998Z" }, -] - -[[package]] -name = "opentelemetry-instrumentation" -version = "0.57b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "packaging" }, - { name = "wrapt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/12/37/cf17cf28f945a3aca5a038cfbb45ee01317d4f7f3a0e5209920883fe9b08/opentelemetry_instrumentation-0.57b0.tar.gz", hash = "sha256:f2a30135ba77cdea2b0e1df272f4163c154e978f57214795d72f40befd4fcf05", size = 30807, upload-time = "2025-07-29T15:42:44.746Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/6f/f20cd1542959f43fb26a5bf9bb18cd81a1ea0700e8870c8f369bd07f5c65/opentelemetry_instrumentation-0.57b0-py3-none-any.whl", hash = "sha256:9109280f44882e07cec2850db28210b90600ae9110b42824d196de357cbddf7e", size = 32460, upload-time = "2025-07-29T15:41:40.883Z" }, -] - -[[package]] -name = "opentelemetry-instrumentation-asgi" -version = "0.57b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "asgiref" }, - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "opentelemetry-util-http" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/97/10/7ba59b586eb099fa0155521b387d857de476687c670096597f618d889323/opentelemetry_instrumentation_asgi-0.57b0.tar.gz", hash = "sha256:a6f880b5d1838f65688fc992c65fbb1d3571f319d370990c32e759d3160e510b", size = 24654, upload-time = "2025-07-29T15:42:48.199Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/07/ab97dd7e8bc680b479203f7d3b2771b7a097468135a669a38da3208f96cb/opentelemetry_instrumentation_asgi-0.57b0-py3-none-any.whl", hash = "sha256:47debbde6af066a7e8e911f7193730d5e40d62effc1ac2e1119908347790a3ea", size = 16599, upload-time = "2025-07-29T15:41:48.332Z" }, -] - -[[package]] -name = "opentelemetry-instrumentation-fastapi" -version = "0.57b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-instrumentation-asgi" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "opentelemetry-util-http" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/47/a8/7c22a33ff5986523a7f9afcb5f4d749533842c3cc77ef55b46727580edd0/opentelemetry_instrumentation_fastapi-0.57b0.tar.gz", hash = "sha256:73ac22f3c472a8f9cb21d1fbe5a4bf2797690c295fff4a1c040e9b1b1688a105", size = 20277, upload-time = "2025-07-29T15:42:58.68Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/df/f20fc21c88c7af5311bfefc15fc4e606bab5edb7c193aa8c73c354904c35/opentelemetry_instrumentation_fastapi-0.57b0-py3-none-any.whl", hash = "sha256:61e6402749ffe0bfec582e58155e0d81dd38723cd9bc4562bca1acca80334006", size = 12712, upload-time = "2025-07-29T15:42:03.332Z" }, -] - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.57b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7e/31/67dfa252ee88476a29200b0255bda8dfc2cf07b56ad66dc9a6221f7dc787/opentelemetry_semantic_conventions-0.57b0.tar.gz", hash = "sha256:609a4a79c7891b4620d64c7aac6898f872d790d75f22019913a660756f27ff32", size = 124225, upload-time = "2025-07-29T15:12:17.873Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/75/7d591371c6c39c73de5ce5da5a2cc7b72d1d1cd3f8f4638f553c01c37b11/opentelemetry_semantic_conventions-0.57b0-py3-none-any.whl", hash = "sha256:757f7e76293294f124c827e514c2a3144f191ef175b069ce8d1211e1e38e9e78", size = 201627, upload-time = "2025-07-29T15:12:04.174Z" }, -] - -[[package]] -name = "opentelemetry-util-http" -version = "0.57b0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/1b/6229c45445e08e798fa825f5376f6d6a4211d29052a4088eed6d577fa653/opentelemetry_util_http-0.57b0.tar.gz", hash = "sha256:f7417595ead0eb42ed1863ec9b2f839fc740368cd7bbbfc1d0a47bc1ab0aba11", size = 9405, upload-time = "2025-07-29T15:43:19.916Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/a6/b98d508d189b9c208f5978d0906141747d7e6df7c7cafec03657ed1ed559/opentelemetry_util_http-0.57b0-py3-none-any.whl", hash = "sha256:e54c0df5543951e471c3d694f85474977cd5765a3b7654398c83bab3d2ffb8e9", size = 7643, upload-time = "2025-07-29T15:42:41.744Z" }, -] - [[package]] name = "packaging" version = "25.0" @@ -1960,16 +1831,13 @@ wheels = [ ] [[package]] -name = "python-architecture" +name = "python-archetype" version = "0.1.0" -source = { virtual = "." } +source = { editable = "." } dependencies = [ { name = "aiohttp" }, { name = "azure-cosmos" }, - { name = "common" }, - { name = "domain" }, { name = "fastapi", extra = ["standard-no-fastapi-cloud-cli"] }, - { name = "opentelemetry-instrumentation-fastapi" }, { name = "poethepoet" }, { name = "pydantic" }, { name = "pydantic-settings", extra = ["azure-key-vault"] }, @@ -1977,7 +1845,6 @@ dependencies = [ [package.dev-dependencies] dev = [ - { name = "api" }, { name = "jupyter" }, { name = "pyright", extra = ["nodejs"] }, { name = "pytest" }, @@ -1985,18 +1852,13 @@ dev = [ { name = "pytest-cov" }, { name = "pytest-mock" }, { name = "ruff" }, - { name = "test-utils" }, - { name = "transcriber" }, ] [package.metadata] requires-dist = [ { name = "aiohttp", specifier = "==3.12.15" }, { name = "azure-cosmos", specifier = "==4.9.0" }, - { name = "common", editable = "common" }, - { name = "domain", editable = "domain" }, { name = "fastapi", extras = ["standard-no-fastapi-cloud-cli"], specifier = "==0.116.1" }, - { name = "opentelemetry-instrumentation-fastapi", specifier = "==0.57b0" }, { name = "poethepoet", specifier = "==0.37.0" }, { name = "pydantic", specifier = "==2.11.7" }, { name = "pydantic-settings", extras = ["azure-key-vault"], specifier = "==2.10.1" }, @@ -2004,7 +1866,6 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ - { name = "api", editable = "api" }, { name = "jupyter", specifier = "==1.1.1" }, { name = "pyright", extras = ["nodejs"], specifier = "==1.1.405" }, { name = "pytest", specifier = "==8.4.2" }, @@ -2012,8 +1873,6 @@ dev = [ { name = "pytest-cov", specifier = "==7.0.0" }, { name = "pytest-mock", specifier = "==3.15.0" }, { name = "ruff", specifier = "==0.12.12" }, - { name = "test-utils", editable = "test_utils" }, - { name = "transcriber", editable = "transcriber" }, ] [[package]] @@ -2347,11 +2206,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/28/7e/61c42657f6e4614a4258f1c3b0c5b93adc4d1f8575f5229d1906b483099b/ruff-0.12.12-py3-none-win_arm64.whl", hash = "sha256:2a8199cab4ce4d72d158319b63370abf60991495fb733db96cd923a34c52d093", size = 12256762, upload-time = "2025-09-04T16:50:15.737Z" }, ] -[[package]] -name = "scripts" -version = "0.1.0" -source = { virtual = "scripts" } - [[package]] name = "send2trash" version = "1.8.3" @@ -2447,11 +2301,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" }, ] -[[package]] -name = "test-utils" -version = "0.1.0" -source = { editable = "test_utils" } - [[package]] name = "tinycss2" version = "1.4.0" @@ -2492,11 +2341,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, ] -[[package]] -name = "transcriber" -version = "0.1.0" -source = { editable = "transcriber" } - [[package]] name = "typer" version = "0.17.4" @@ -2747,55 +2591,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575", size = 2196503, upload-time = "2025-04-10T13:01:23.086Z" }, ] -[[package]] -name = "wrapt" -version = "1.17.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/8f/aeb76c5b46e273670962298c23e7ddde79916cb74db802131d49a85e4b7d/wrapt-1.17.3.tar.gz", hash = "sha256:f66eb08feaa410fe4eebd17f2a2c8e2e46d3476e9f8c783daa8e09e0faa666d0", size = 55547, upload-time = "2025-08-12T05:53:21.714Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/41/cad1aba93e752f1f9268c77270da3c469883d56e2798e7df6240dcb2287b/wrapt-1.17.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ab232e7fdb44cdfbf55fc3afa31bcdb0d8980b9b95c38b6405df2acb672af0e0", size = 53998, upload-time = "2025-08-12T05:51:47.138Z" }, - { url = "https://files.pythonhosted.org/packages/60/f8/096a7cc13097a1869fe44efe68dace40d2a16ecb853141394047f0780b96/wrapt-1.17.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9baa544e6acc91130e926e8c802a17f3b16fbea0fd441b5a60f5cf2cc5c3deba", size = 39020, upload-time = "2025-08-12T05:51:35.906Z" }, - { url = "https://files.pythonhosted.org/packages/33/df/bdf864b8997aab4febb96a9ae5c124f700a5abd9b5e13d2a3214ec4be705/wrapt-1.17.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b538e31eca1a7ea4605e44f81a48aa24c4632a277431a6ed3f328835901f4fd", size = 39098, upload-time = "2025-08-12T05:51:57.474Z" }, - { url = "https://files.pythonhosted.org/packages/9f/81/5d931d78d0eb732b95dc3ddaeeb71c8bb572fb01356e9133916cd729ecdd/wrapt-1.17.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:042ec3bb8f319c147b1301f2393bc19dba6e176b7da446853406d041c36c7828", size = 88036, upload-time = "2025-08-12T05:52:34.784Z" }, - { url = "https://files.pythonhosted.org/packages/ca/38/2e1785df03b3d72d34fc6252d91d9d12dc27a5c89caef3335a1bbb8908ca/wrapt-1.17.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3af60380ba0b7b5aeb329bc4e402acd25bd877e98b3727b0135cb5c2efdaefe9", size = 88156, upload-time = "2025-08-12T05:52:13.599Z" }, - { url = "https://files.pythonhosted.org/packages/b3/8b/48cdb60fe0603e34e05cffda0b2a4adab81fd43718e11111a4b0100fd7c1/wrapt-1.17.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b02e424deef65c9f7326d8c19220a2c9040c51dc165cddb732f16198c168396", size = 87102, upload-time = "2025-08-12T05:52:14.56Z" }, - { url = "https://files.pythonhosted.org/packages/3c/51/d81abca783b58f40a154f1b2c56db1d2d9e0d04fa2d4224e357529f57a57/wrapt-1.17.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:74afa28374a3c3a11b3b5e5fca0ae03bef8450d6aa3ab3a1e2c30e3a75d023dc", size = 87732, upload-time = "2025-08-12T05:52:36.165Z" }, - { url = "https://files.pythonhosted.org/packages/9e/b1/43b286ca1392a006d5336412d41663eeef1ad57485f3e52c767376ba7e5a/wrapt-1.17.3-cp312-cp312-win32.whl", hash = "sha256:4da9f45279fff3543c371d5ababc57a0384f70be244de7759c85a7f989cb4ebe", size = 36705, upload-time = "2025-08-12T05:53:07.123Z" }, - { url = "https://files.pythonhosted.org/packages/28/de/49493f962bd3c586ab4b88066e967aa2e0703d6ef2c43aa28cb83bf7b507/wrapt-1.17.3-cp312-cp312-win_amd64.whl", hash = "sha256:e71d5c6ebac14875668a1e90baf2ea0ef5b7ac7918355850c0908ae82bcb297c", size = 38877, upload-time = "2025-08-12T05:53:05.436Z" }, - { url = "https://files.pythonhosted.org/packages/f1/48/0f7102fe9cb1e8a5a77f80d4f0956d62d97034bbe88d33e94699f99d181d/wrapt-1.17.3-cp312-cp312-win_arm64.whl", hash = "sha256:604d076c55e2fdd4c1c03d06dc1a31b95130010517b5019db15365ec4a405fc6", size = 36885, upload-time = "2025-08-12T05:52:54.367Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f6/759ece88472157acb55fc195e5b116e06730f1b651b5b314c66291729193/wrapt-1.17.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a47681378a0439215912ef542c45a783484d4dd82bac412b71e59cf9c0e1cea0", size = 54003, upload-time = "2025-08-12T05:51:48.627Z" }, - { url = "https://files.pythonhosted.org/packages/4f/a9/49940b9dc6d47027dc850c116d79b4155f15c08547d04db0f07121499347/wrapt-1.17.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a30837587c6ee3cd1a4d1c2ec5d24e77984d44e2f34547e2323ddb4e22eb77", size = 39025, upload-time = "2025-08-12T05:51:37.156Z" }, - { url = "https://files.pythonhosted.org/packages/45/35/6a08de0f2c96dcdd7fe464d7420ddb9a7655a6561150e5fc4da9356aeaab/wrapt-1.17.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:16ecf15d6af39246fe33e507105d67e4b81d8f8d2c6598ff7e3ca1b8a37213f7", size = 39108, upload-time = "2025-08-12T05:51:58.425Z" }, - { url = "https://files.pythonhosted.org/packages/0c/37/6faf15cfa41bf1f3dba80cd3f5ccc6622dfccb660ab26ed79f0178c7497f/wrapt-1.17.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6fd1ad24dc235e4ab88cda009e19bf347aabb975e44fd5c2fb22a3f6e4141277", size = 88072, upload-time = "2025-08-12T05:52:37.53Z" }, - { url = "https://files.pythonhosted.org/packages/78/f2/efe19ada4a38e4e15b6dff39c3e3f3f73f5decf901f66e6f72fe79623a06/wrapt-1.17.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ed61b7c2d49cee3c027372df5809a59d60cf1b6c2f81ee980a091f3afed6a2d", size = 88214, upload-time = "2025-08-12T05:52:15.886Z" }, - { url = "https://files.pythonhosted.org/packages/40/90/ca86701e9de1622b16e09689fc24b76f69b06bb0150990f6f4e8b0eeb576/wrapt-1.17.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:423ed5420ad5f5529db9ce89eac09c8a2f97da18eb1c870237e84c5a5c2d60aa", size = 87105, upload-time = "2025-08-12T05:52:17.914Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e0/d10bd257c9a3e15cbf5523025252cc14d77468e8ed644aafb2d6f54cb95d/wrapt-1.17.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e01375f275f010fcbf7f643b4279896d04e571889b8a5b3f848423d91bf07050", size = 87766, upload-time = "2025-08-12T05:52:39.243Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cf/7d848740203c7b4b27eb55dbfede11aca974a51c3d894f6cc4b865f42f58/wrapt-1.17.3-cp313-cp313-win32.whl", hash = "sha256:53e5e39ff71b3fc484df8a522c933ea2b7cdd0d5d15ae82e5b23fde87d44cbd8", size = 36711, upload-time = "2025-08-12T05:53:10.074Z" }, - { url = "https://files.pythonhosted.org/packages/57/54/35a84d0a4d23ea675994104e667ceff49227ce473ba6a59ba2c84f250b74/wrapt-1.17.3-cp313-cp313-win_amd64.whl", hash = "sha256:1f0b2f40cf341ee8cc1a97d51ff50dddb9fcc73241b9143ec74b30fc4f44f6cb", size = 38885, upload-time = "2025-08-12T05:53:08.695Z" }, - { url = "https://files.pythonhosted.org/packages/01/77/66e54407c59d7b02a3c4e0af3783168fff8e5d61def52cda8728439d86bc/wrapt-1.17.3-cp313-cp313-win_arm64.whl", hash = "sha256:7425ac3c54430f5fc5e7b6f41d41e704db073309acfc09305816bc6a0b26bb16", size = 36896, upload-time = "2025-08-12T05:52:55.34Z" }, - { url = "https://files.pythonhosted.org/packages/02/a2/cd864b2a14f20d14f4c496fab97802001560f9f41554eef6df201cd7f76c/wrapt-1.17.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cf30f6e3c077c8e6a9a7809c94551203c8843e74ba0c960f4a98cd80d4665d39", size = 54132, upload-time = "2025-08-12T05:51:49.864Z" }, - { url = "https://files.pythonhosted.org/packages/d5/46/d011725b0c89e853dc44cceb738a307cde5d240d023d6d40a82d1b4e1182/wrapt-1.17.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e228514a06843cae89621384cfe3a80418f3c04aadf8a3b14e46a7be704e4235", size = 39091, upload-time = "2025-08-12T05:51:38.935Z" }, - { url = "https://files.pythonhosted.org/packages/2e/9e/3ad852d77c35aae7ddebdbc3b6d35ec8013af7d7dddad0ad911f3d891dae/wrapt-1.17.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5ea5eb3c0c071862997d6f3e02af1d055f381b1d25b286b9d6644b79db77657c", size = 39172, upload-time = "2025-08-12T05:51:59.365Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f7/c983d2762bcce2326c317c26a6a1e7016f7eb039c27cdf5c4e30f4160f31/wrapt-1.17.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:281262213373b6d5e4bb4353bc36d1ba4084e6d6b5d242863721ef2bf2c2930b", size = 87163, upload-time = "2025-08-12T05:52:40.965Z" }, - { url = "https://files.pythonhosted.org/packages/e4/0f/f673f75d489c7f22d17fe0193e84b41540d962f75fce579cf6873167c29b/wrapt-1.17.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc4a8d2b25efb6681ecacad42fca8859f88092d8732b170de6a5dddd80a1c8fa", size = 87963, upload-time = "2025-08-12T05:52:20.326Z" }, - { url = "https://files.pythonhosted.org/packages/df/61/515ad6caca68995da2fac7a6af97faab8f78ebe3bf4f761e1b77efbc47b5/wrapt-1.17.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:373342dd05b1d07d752cecbec0c41817231f29f3a89aa8b8843f7b95992ed0c7", size = 86945, upload-time = "2025-08-12T05:52:21.581Z" }, - { url = "https://files.pythonhosted.org/packages/d3/bd/4e70162ce398462a467bc09e768bee112f1412e563620adc353de9055d33/wrapt-1.17.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d40770d7c0fd5cbed9d84b2c3f2e156431a12c9a37dc6284060fb4bec0b7ffd4", size = 86857, upload-time = "2025-08-12T05:52:43.043Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b8/da8560695e9284810b8d3df8a19396a6e40e7518059584a1a394a2b35e0a/wrapt-1.17.3-cp314-cp314-win32.whl", hash = "sha256:fbd3c8319de8e1dc79d346929cd71d523622da527cca14e0c1d257e31c2b8b10", size = 37178, upload-time = "2025-08-12T05:53:12.605Z" }, - { url = "https://files.pythonhosted.org/packages/db/c8/b71eeb192c440d67a5a0449aaee2310a1a1e8eca41676046f99ed2487e9f/wrapt-1.17.3-cp314-cp314-win_amd64.whl", hash = "sha256:e1a4120ae5705f673727d3253de3ed0e016f7cd78dc463db1b31e2463e1f3cf6", size = 39310, upload-time = "2025-08-12T05:53:11.106Z" }, - { url = "https://files.pythonhosted.org/packages/45/20/2cda20fd4865fa40f86f6c46ed37a2a8356a7a2fde0773269311f2af56c7/wrapt-1.17.3-cp314-cp314-win_arm64.whl", hash = "sha256:507553480670cab08a800b9463bdb881b2edeed77dc677b0a5915e6106e91a58", size = 37266, upload-time = "2025-08-12T05:52:56.531Z" }, - { url = "https://files.pythonhosted.org/packages/77/ed/dd5cf21aec36c80443c6f900449260b80e2a65cf963668eaef3b9accce36/wrapt-1.17.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ed7c635ae45cfbc1a7371f708727bf74690daedc49b4dba310590ca0bd28aa8a", size = 56544, upload-time = "2025-08-12T05:51:51.109Z" }, - { url = "https://files.pythonhosted.org/packages/8d/96/450c651cc753877ad100c7949ab4d2e2ecc4d97157e00fa8f45df682456a/wrapt-1.17.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:249f88ed15503f6492a71f01442abddd73856a0032ae860de6d75ca62eed8067", size = 40283, upload-time = "2025-08-12T05:51:39.912Z" }, - { url = "https://files.pythonhosted.org/packages/d1/86/2fcad95994d9b572db57632acb6f900695a648c3e063f2cd344b3f5c5a37/wrapt-1.17.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a03a38adec8066d5a37bea22f2ba6bbf39fcdefbe2d91419ab864c3fb515454", size = 40366, upload-time = "2025-08-12T05:52:00.693Z" }, - { url = "https://files.pythonhosted.org/packages/64/0e/f4472f2fdde2d4617975144311f8800ef73677a159be7fe61fa50997d6c0/wrapt-1.17.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5d4478d72eb61c36e5b446e375bbc49ed002430d17cdec3cecb36993398e1a9e", size = 108571, upload-time = "2025-08-12T05:52:44.521Z" }, - { url = "https://files.pythonhosted.org/packages/cc/01/9b85a99996b0a97c8a17484684f206cbb6ba73c1ce6890ac668bcf3838fb/wrapt-1.17.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223db574bb38637e8230eb14b185565023ab624474df94d2af18f1cdb625216f", size = 113094, upload-time = "2025-08-12T05:52:22.618Z" }, - { url = "https://files.pythonhosted.org/packages/25/02/78926c1efddcc7b3aa0bc3d6b33a822f7d898059f7cd9ace8c8318e559ef/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e405adefb53a435f01efa7ccdec012c016b5a1d3f35459990afc39b6be4d5056", size = 110659, upload-time = "2025-08-12T05:52:24.057Z" }, - { url = "https://files.pythonhosted.org/packages/dc/ee/c414501ad518ac3e6fe184753632fe5e5ecacdcf0effc23f31c1e4f7bfcf/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:88547535b787a6c9ce4086917b6e1d291aa8ed914fdd3a838b3539dc95c12804", size = 106946, upload-time = "2025-08-12T05:52:45.976Z" }, - { url = "https://files.pythonhosted.org/packages/be/44/a1bd64b723d13bb151d6cc91b986146a1952385e0392a78567e12149c7b4/wrapt-1.17.3-cp314-cp314t-win32.whl", hash = "sha256:41b1d2bc74c2cac6f9074df52b2efbef2b30bdfe5f40cb78f8ca22963bc62977", size = 38717, upload-time = "2025-08-12T05:53:15.214Z" }, - { url = "https://files.pythonhosted.org/packages/79/d9/7cfd5a312760ac4dd8bf0184a6ee9e43c33e47f3dadc303032ce012b8fa3/wrapt-1.17.3-cp314-cp314t-win_amd64.whl", hash = "sha256:73d496de46cd2cdbdbcce4ae4bcdb4afb6a11234a1df9c085249d55166b95116", size = 41334, upload-time = "2025-08-12T05:53:14.178Z" }, - { url = "https://files.pythonhosted.org/packages/46/78/10ad9781128ed2f99dbc474f43283b13fea8ba58723e98844367531c18e9/wrapt-1.17.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f38e60678850c42461d4202739f9bf1e3a737c7ad283638251e79cc49effb6b6", size = 38471, upload-time = "2025-08-12T05:52:57.784Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f6/a933bd70f98e9cf3e08167fc5cd7aaaca49147e48411c0bd5ae701bb2194/wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22", size = 23591, upload-time = "2025-08-12T05:53:20.674Z" }, -] - [[package]] name = "yarl" version = "1.20.1" @@ -2860,12 +2655,3 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/94/c3/b2e9f38bc3e11191981d57ea08cab2166e74ea770024a646617c9cddd9f6/yarl-1.20.1-cp313-cp313t-win_amd64.whl", hash = "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f", size = 93003, upload-time = "2025-06-10T00:45:27.752Z" }, { url = "https://files.pythonhosted.org/packages/b4/2d/2345fce04cfd4bee161bf1e7d9cdc702e3e16109021035dbb24db654a622/yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77", size = 46542, upload-time = "2025-06-10T00:46:07.521Z" }, ] - -[[package]] -name = "zipp" -version = "3.23.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, -]