nene2-python 1.8.14__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.14 → nene2_python-1.8.15}/CHANGELOG.md +9 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/PKG-INFO +1 -1
- nene2_python-1.8.15/docs/field-trials/2026-05-field-trial-55.md +65 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/pyproject.toml +1 -1
- {nene2_python-1.8.14 → nene2_python-1.8.15}/uv.lock +1 -1
- {nene2_python-1.8.14 → nene2_python-1.8.15}/.env.example +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/.github/workflows/ci.yml +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/.github/workflows/docs.yml +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/.github/workflows/publish.yml +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/.gitignore +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/.vitepress/config.mts +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/.vitepress/theme/custom.css +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/.vitepress/theme/index.ts +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/AGENTS.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/CLAUDE.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/Dockerfile +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/LICENSE +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/README.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/alembic/README +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/alembic/env.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/alembic/script.py.mako +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/alembic/versions/001_create_notes_and_tags_tables.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/alembic.ini +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/compose.yaml +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/adr/0001-toolchain.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/adr/0002-clean-architecture.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/adr/0003-security-first.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/adr/0004-ai-first-design.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/adr/0005-logging.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/adr/0006-rate-limiting.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/adr/0009-mcp-design.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/adr/0010-async-use-case.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/adr/0011-mcp-as-core-dependency.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/de/index.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/de/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/explanation/architecture.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/explanation/design-philosophy.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-1.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-10.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-11.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-12.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-13.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-14.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-15.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-16.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-17.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-18.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-19.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-2.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-20.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-21.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-22.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-23.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-24.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-25.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-26.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-27.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-28.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-29.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-3.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-30.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-31.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-32.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-33.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-34.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-35.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-36.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-37.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-38.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-39.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-4.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-40.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-41.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-42.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-43.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-44.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-45.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-46.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-47.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-48.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-49.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-5.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-50.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-51.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-52.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-53.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-54.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-6.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-7.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-8.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/field-trials/2026-05-field-trial-9.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/fr/index.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/fr/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/how-to/add-new-domain.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/how-to/async-use-case.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/how-to/configure-auth.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/how-to/new-project.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/how-to/problem-details.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/how-to/run-tests.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/how-to/sqlalchemy-repository.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/how-to/validation.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/howto/mcp-setup.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/index.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/explanation/architecture.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/explanation/design-philosophy.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/how-to/add-new-domain.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/how-to/configure-auth.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/how-to/new-project.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/how-to/run-tests.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/how-to/sqlalchemy-repository.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/howto/mcp-setup.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/index.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/reference/api.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/reference/configuration.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/reference/framework-modules.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/tutorials/first-domain.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/ja/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/pt-br/index.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/pt-br/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/reference/api.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/reference/configuration.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/reference/framework-modules.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/roadmap.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/todo/current.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/tutorials/first-domain.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/zh/index.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/docs/zh/tutorials/getting-started.md +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/package-lock.json +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/package.json +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/__main__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/app.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/comment/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/comment/entity.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/comment/exceptions.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/comment/handler.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/comment/repository.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/comment/sqlalchemy_repository.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/comment/use_case.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/mcp.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/note/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/note/async_use_case.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/note/entity.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/note/exceptions.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/note/handler.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/note/repository.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/note/sqlalchemy_repository.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/note/use_case.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/schema.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/tag/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/tag/entity.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/tag/exceptions.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/tag/handler.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/tag/repository.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/tag/sqlalchemy_repository.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/example/tag/use_case.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/auth/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/auth/api_key.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/auth/bearer_token.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/auth/exceptions.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/auth/interfaces.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/auth/local_verifier.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/config/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/config/settings.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/database/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/database/exceptions.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/database/health.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/database/interfaces.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/database/sqlalchemy_executor.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/database/utils.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/http/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/http/health.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/http/pagination.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/http/problem_details.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/log/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/log/setup.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/mcp/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/mcp/http_client.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/mcp/server.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/middleware/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/middleware/domain_exception.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/middleware/error_handler.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/middleware/request_id.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/middleware/request_logging.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/middleware/request_size_limit.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/middleware/security_headers.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/middleware/throttle.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/py.typed +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/use_case/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/use_case/protocols.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/validation/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/nene2/validation/exceptions.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/scripts/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/src/scripts/export_openapi.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/comment/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/comment/test_comment_http.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/comment/test_comment_repository.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/comment/test_comment_use_case.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/conftest.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/note/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/note/test_async_note_use_case.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/note/test_list_notes.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/note/test_note_repository.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/tag/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/tag/test_tag_repository.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/tag/test_tags.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/test_cors.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/example/test_mcp.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/auth/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/auth/test_api_key.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/auth/test_bearer_token.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/auth/test_token_issuer.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/config/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/config/test_settings.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/database/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/database/test_transaction.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/database/test_utils.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/http/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/http/test_health.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/http/test_pagination.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/http/test_problem_details.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/log/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/log/test_setup.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/mcp/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/mcp/test_http_client.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/middleware/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/middleware/test_error_handler.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/middleware/test_request_id.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/middleware/test_request_logging.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/middleware/test_request_size_limit.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/middleware/test_security_headers.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/middleware/test_simple_domain_handler.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/middleware/test_throttle.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/use_case/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/use_case/test_protocols.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/validation/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/nene2/validation/test_exceptions.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/scripts/__init__.py +0 -0
- {nene2_python-1.8.14 → nene2_python-1.8.15}/tests/scripts/test_export_openapi.py +0 -0
|
@@ -5,6 +5,15 @@ 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
|
+
|
|
8
17
|
## [1.8.14] — 2026-05-20
|
|
9
18
|
|
|
10
19
|
FT54 フィールドトライアル — RequestSizeLimitMiddleware + path_limits 実運用検証。
|
|
@@ -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,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.14 → 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
|
|
File without changes
|
{nene2_python-1.8.14 → 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.14 → nene2_python-1.8.15}/tests/nene2/middleware/test_request_size_limit.py
RENAMED
|
File without changes
|
|
File without changes
|
{nene2_python-1.8.14 → 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
|