nene2-python 1.8.13__tar.gz → 1.8.15__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nene2_python-1.8.13 → nene2_python-1.8.15}/CHANGELOG.md +18 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/PKG-INFO +1 -1
- nene2_python-1.8.15/docs/field-trials/2026-05-field-trial-54.md +71 -0
- nene2_python-1.8.15/docs/field-trials/2026-05-field-trial-55.md +65 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/pyproject.toml +1 -1
- {nene2_python-1.8.13 → nene2_python-1.8.15}/uv.lock +1 -1
- {nene2_python-1.8.13 → nene2_python-1.8.15}/.env.example +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/.github/workflows/ci.yml +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/.github/workflows/docs.yml +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/.github/workflows/publish.yml +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/.gitignore +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/.vitepress/config.mts +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/.vitepress/theme/custom.css +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/.vitepress/theme/index.ts +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/AGENTS.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/CLAUDE.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/Dockerfile +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/LICENSE +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/README.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/alembic/README +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/alembic/env.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/alembic/script.py.mako +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/alembic/versions/001_create_notes_and_tags_tables.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/alembic.ini +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/compose.yaml +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/adr/0001-toolchain.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/adr/0002-clean-architecture.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/adr/0003-security-first.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/adr/0004-ai-first-design.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/adr/0005-logging.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/adr/0006-rate-limiting.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/adr/0009-mcp-design.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/adr/0010-async-use-case.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/adr/0011-mcp-as-core-dependency.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/de/index.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/de/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/explanation/architecture.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/explanation/design-philosophy.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-1.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-10.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-11.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-12.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-13.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-14.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-15.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-16.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-17.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-18.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-19.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-2.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-20.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-21.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-22.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-23.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-24.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-25.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-26.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-27.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-28.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-29.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-3.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-30.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-31.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-32.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-33.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-34.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-35.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-36.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-37.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-38.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-39.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-4.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-40.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-41.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-42.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-43.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-44.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-45.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-46.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-47.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-48.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-49.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-5.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-50.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-51.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-52.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-53.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-6.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-7.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-8.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-9.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/fr/index.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/fr/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/how-to/add-new-domain.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/how-to/async-use-case.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/how-to/configure-auth.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/how-to/new-project.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/how-to/problem-details.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/how-to/run-tests.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/how-to/sqlalchemy-repository.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/how-to/validation.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/howto/mcp-setup.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/index.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/explanation/architecture.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/explanation/design-philosophy.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/how-to/add-new-domain.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/how-to/configure-auth.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/how-to/new-project.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/how-to/run-tests.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/how-to/sqlalchemy-repository.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/howto/mcp-setup.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/index.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/reference/api.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/reference/configuration.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/reference/framework-modules.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/tutorials/first-domain.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/ja/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/pt-br/index.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/pt-br/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/reference/api.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/reference/configuration.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/reference/framework-modules.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/roadmap.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/todo/current.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/tutorials/first-domain.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/zh/index.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/docs/zh/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/package-lock.json +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/package.json +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/__main__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/app.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/comment/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/comment/entity.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/comment/exceptions.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/comment/handler.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/comment/repository.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/comment/sqlalchemy_repository.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/comment/use_case.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/mcp.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/note/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/note/async_use_case.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/note/entity.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/note/exceptions.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/note/handler.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/note/repository.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/note/sqlalchemy_repository.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/note/use_case.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/schema.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/tag/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/tag/entity.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/tag/exceptions.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/tag/handler.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/tag/repository.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/tag/sqlalchemy_repository.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/example/tag/use_case.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/auth/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/auth/api_key.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/auth/bearer_token.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/auth/exceptions.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/auth/interfaces.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/auth/local_verifier.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/config/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/config/settings.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/database/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/database/exceptions.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/database/health.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/database/interfaces.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/database/sqlalchemy_executor.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/database/utils.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/http/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/http/health.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/http/pagination.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/http/problem_details.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/log/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/log/setup.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/mcp/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/mcp/http_client.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/mcp/server.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/middleware/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/middleware/domain_exception.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/middleware/error_handler.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/middleware/request_id.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/middleware/request_logging.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/middleware/request_size_limit.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/middleware/security_headers.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/middleware/throttle.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/py.typed +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/use_case/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/use_case/protocols.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/validation/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/nene2/validation/exceptions.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/scripts/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/src/scripts/export_openapi.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/comment/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/comment/test_comment_http.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/comment/test_comment_repository.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/comment/test_comment_use_case.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/conftest.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/note/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/note/test_async_note_use_case.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/note/test_list_notes.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/note/test_note_repository.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/tag/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/tag/test_tag_repository.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/tag/test_tags.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/test_cors.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/test_mcp.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/auth/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/auth/test_api_key.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/auth/test_bearer_token.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/auth/test_token_issuer.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/config/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/config/test_settings.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/database/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/database/test_transaction.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/database/test_utils.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/http/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/http/test_health.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/http/test_pagination.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/http/test_problem_details.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/log/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/log/test_setup.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/mcp/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/mcp/test_http_client.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/middleware/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/middleware/test_error_handler.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/middleware/test_request_id.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/middleware/test_request_logging.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/middleware/test_request_size_limit.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/middleware/test_security_headers.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/middleware/test_simple_domain_handler.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/middleware/test_throttle.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/use_case/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/use_case/test_protocols.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/validation/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/validation/test_exceptions.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/scripts/__init__.py +0 -0
- {nene2_python-1.8.13 → nene2_python-1.8.15}/tests/scripts/test_export_openapi.py +0 -0
|
@@ -5,6 +5,24 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
## [1.8.15] — 2026-05-20
|
|
9
|
+
|
|
10
|
+
FT55 フィールドトライアル — parse_db_datetime 実運用検証。
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Field trial report: `docs/field-trials/2026-05-field-trial-55.md`
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## [1.8.14] — 2026-05-20
|
|
18
|
+
|
|
19
|
+
FT54 フィールドトライアル — RequestSizeLimitMiddleware + path_limits 実運用検証。
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
- Field trial report: `docs/field-trials/2026-05-field-trial-54.md`
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
8
26
|
## [1.8.13] — 2026-05-20
|
|
9
27
|
|
|
10
28
|
FT53 フィールドトライアル — ApiKeyAuthMiddleware 実運用検証 + header_name パラメータ追加。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nene2-python
|
|
3
|
-
Version: 1.8.
|
|
3
|
+
Version: 1.8.15
|
|
4
4
|
Summary: NENE2 Python — minimal API framework following NENE2's design philosophy
|
|
5
5
|
Project-URL: Homepage, https://github.com/hideyukiMORI/nene2-python
|
|
6
6
|
Project-URL: Repository, https://github.com/hideyukiMORI/nene2-python
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Field Trial 54: RequestSizeLimitMiddleware + path_limits 実運用検証
|
|
2
|
+
|
|
3
|
+
**Date**: 2026-05-20
|
|
4
|
+
**Theme**: `RequestSizeLimitMiddleware` + `path_limits` の実運用パターン検証
|
|
5
|
+
**Version under test**: v1.8.13
|
|
6
|
+
**FT App**: `/home/xi/docker/nene2-python-FT/ft54-size-limit/`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 概要
|
|
11
|
+
|
|
12
|
+
ファイルアップロード API で `RequestSizeLimitMiddleware` の `path_limits` を使い、
|
|
13
|
+
エンドポイントごとに異なるサイズ上限を設定した。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 実装内容
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
app.add_middleware(
|
|
21
|
+
RequestSizeLimitMiddleware,
|
|
22
|
+
max_bytes=10 * KB, # デフォルト: 10KB
|
|
23
|
+
path_limits={
|
|
24
|
+
"/upload/avatar": 50 * KB, # プロフィール画像
|
|
25
|
+
"/upload/document": 200 * KB, # ドキュメント
|
|
26
|
+
},
|
|
27
|
+
exclude_paths=["/health"],
|
|
28
|
+
)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`path_limits` の値はデフォルト `max_bytes` を上書きする。
|
|
32
|
+
`/upload/avatar` は `10KB` 超過でも `50KB` 以下なら受け入れる。
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## テスト結果
|
|
37
|
+
|
|
38
|
+
9 tests, all passed.
|
|
39
|
+
|
|
40
|
+
| テスト | 結果 |
|
|
41
|
+
|---|---|
|
|
42
|
+
| /health は除外 | ✅ |
|
|
43
|
+
| /data の 5KB はデフォルト内 | ✅ |
|
|
44
|
+
| /data の 11KB がデフォルト超過 → 413 | ✅ |
|
|
45
|
+
| 413 が Problem Details 形式 (max_bytes フィールド含む) | ✅ |
|
|
46
|
+
| /upload/avatar の 40KB は path_limits 内 | ✅ |
|
|
47
|
+
| /upload/avatar の 51KB が path_limits 超過 → 413 | ✅ |
|
|
48
|
+
| /upload/document の 150KB は path_limits 内 | ✅ |
|
|
49
|
+
| /upload/document の 201KB が path_limits 超過 → 413 | ✅ |
|
|
50
|
+
| path_limits がデフォルトを上書きすることを確認 | ✅ |
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 摩擦ポイント
|
|
55
|
+
|
|
56
|
+
摩擦なし。`path_limits` の設定は直感的で期待通りに動作した。
|
|
57
|
+
|
|
58
|
+
413 レスポンスに `max_bytes` フィールドが含まれるため、クライアントが上限値を把握できる。
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## フレームワーク変更
|
|
63
|
+
|
|
64
|
+
なし。
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 結論
|
|
69
|
+
|
|
70
|
+
`RequestSizeLimitMiddleware` の `path_limits` はファイルアップロード API の実運用で
|
|
71
|
+
摩擦なく使える。デフォルト + パスごとのオーバーライドという設計が直感的。
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Field Trial 55: parse_db_datetime 実運用検証
|
|
2
|
+
|
|
3
|
+
**Date**: 2026-05-20
|
|
4
|
+
**Theme**: `nene2.database.utils.parse_db_datetime` の実運用パターン検証
|
|
5
|
+
**Version under test**: v1.8.14
|
|
6
|
+
**FT App**: `/home/xi/docker/nene2-python-FT/ft55-parse-datetime/`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 概要
|
|
11
|
+
|
|
12
|
+
SQLite に DATETIME 値を保存・読み出しし、`parse_db_datetime` で UTC-aware datetime に
|
|
13
|
+
変換するパターンをイベント管理 API で実運用した。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 実装内容
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
from nene2.database.utils import parse_db_datetime
|
|
21
|
+
|
|
22
|
+
event = Event(
|
|
23
|
+
id=row[0],
|
|
24
|
+
title=row[1],
|
|
25
|
+
scheduled_at=parse_db_datetime(row[2]), # SQLite 文字列 → UTC-aware datetime
|
|
26
|
+
)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
SQLite は DATETIME を `"2026-06-01 12:00:00"` のような文字列で返すが、
|
|
30
|
+
`parse_db_datetime` が透過的に UTC-aware `datetime` に変換する。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## テスト結果
|
|
35
|
+
|
|
36
|
+
7 tests, all passed.
|
|
37
|
+
|
|
38
|
+
| テスト | 結果 |
|
|
39
|
+
|---|---|
|
|
40
|
+
| イベント作成・取得 | ✅ |
|
|
41
|
+
| UTC-aware datetime で返ること | ✅ |
|
|
42
|
+
| SQLite 文字列形式の変換 (`"2026-06-01 12:00:00"`) | ✅ |
|
|
43
|
+
| MySQL 形式の naive datetime を UTC-aware に変換 | ✅ |
|
|
44
|
+
| すでに timezone-aware な datetime は保持 | ✅ |
|
|
45
|
+
| ISO 8601 の T 区切り形式のサポート | ✅ |
|
|
46
|
+
| 存在しないイベントで 404 | ✅ |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 摩擦ポイント
|
|
51
|
+
|
|
52
|
+
摩擦なし。`parse_db_datetime` の API は直感的で、SQLite / MySQL の差異を透過的に吸収する。
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## フレームワーク変更
|
|
57
|
+
|
|
58
|
+
なし。
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 結論
|
|
63
|
+
|
|
64
|
+
`parse_db_datetime` は SQLite (文字列) と MySQL (naive datetime) の両方を透過的に処理し、
|
|
65
|
+
常に UTC-aware `datetime` を返す。実運用で摩擦なく使える。
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nene2_python-1.8.13 → nene2_python-1.8.15}/alembic/versions/001_create_notes_and_tags_tables.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nene2_python-1.8.13 → nene2_python-1.8.15}/tests/example/comment/test_comment_repository.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/middleware/test_request_size_limit.py
RENAMED
|
File without changes
|
|
File without changes
|
{nene2_python-1.8.13 → nene2_python-1.8.15}/tests/nene2/middleware/test_simple_domain_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|