sqlmodel 0.0.38__tar.gz → 0.0.39__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.
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/PKG-INFO +12 -15
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/README.md +11 -14
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/automatic_id_none_refresh/annotations/en/tutorial002.md +3 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_004.md +1 -1
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/insert/annotations/en/tutorial003.md +1 -1
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/pyproject.toml +27 -15
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/docs.py +5 -5
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/generate_select.py +1 -1
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/lint.sh +2 -2
- sqlmodel-0.0.39/scripts/prepare_release.py +209 -0
- sqlmodel-0.0.39/sqlmodel/.agents/skills/sqlmodel/SKILL.md +178 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/__init__.py +1 -1
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/main.py +17 -17
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/_expression_select_cls.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/_expression_select_gen.py +119 -92
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/_expression_select_gen.py.jinja2 +8 -9
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/expression.py +15 -15
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/sqltypes.py +1 -1
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/conftest.py +0 -6
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/test_decimal/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/test_uuid/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/test_uuid/test_tutorial002.py +2 -2
- sqlmodel-0.0.39/tests/test_prepare_release.py +298 -0
- sqlmodel-0.0.39/tests/test_pydantic/test_model_dump.py +47 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_automatic_id_none_refresh/test_tutorial001_tutorial002.py +3 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_code_structure/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_code_structure/test_tutorial002.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_create_connected_tables/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_delete/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_insert/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_select/test_tutorial001_tutorial002.py +3 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_select/test_tutorial003.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_select/test_tutorial004.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_select/test_tutorial005.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_update/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_create_db_and_table/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_create_db_and_table/test_tutorial002.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_create_db_and_table/test_tutorial003.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_delete/test_tutorial001_tutorial002.py +3 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests002.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests003.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests004.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests_main.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_delete/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_limit_and_offset/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial002.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_read_one/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_relationships/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_response_model/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_session_with_dependency/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_simple_hero_api/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_teams/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_update/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_update/test_tutorial002.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_indexes/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_indexes/test_tutorial002.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_insert/test_tutorial001.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_insert/test_tutorial002.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_insert/test_tutorial003.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_limit_and_offset/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_limit_and_offset/test_tutorial002.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_limit_and_offset/test_tutorial003.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_limit_and_offset/test_tutorial004.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_many_to_many/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_many_to_many/test_tutorial002.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_many_to_many/test_tutorial003.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial002.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial003.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial004.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial005.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial006.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial007.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial008.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial009.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial002.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial003.py +1 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_create_and_update_relationships/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_define_relationship_attributes/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial002.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial003.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial004.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial005.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_read_relationships/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_read_relationships/test_tutorial002.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_select/test_tutorial001_tutorial002.py +3 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_select/test_tutorial003_tutorial004.py +3 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_update/test_tutorial001_tutorial002.py +3 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_update/test_tutorial003_tutorial004.py +3 -3
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial001.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial002.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial003.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial004.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial005.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial006.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial006b.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial007.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial008.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial009.py +2 -2
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial011.py +2 -2
- sqlmodel-0.0.38/scripts/mkdocs_hooks.py +0 -38
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/LICENSE +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/decimal/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/decimal/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/uuid/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/uuid/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/uuid/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/automatic_id_none_refresh/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/automatic_id_none_refresh/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/automatic_id_none_refresh/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial001_py310/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial001_py310/app.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial001_py310/database.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial001_py310/models.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial002_py310/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial002_py310/app.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial002_py310/database.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial002_py310/hero_model.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial002_py310/team_model.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/create_tables/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/create_tables/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/delete/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/delete/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/insert/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/insert/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/tutorial005_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/update/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/update/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/create_db_and_table/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/create_db_and_table/annotations/en/tutorial003.md +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/create_db_and_table/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/create_db_and_table/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/create_db_and_table/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/delete/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/delete/annotations/en/tutorial002.md +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/delete/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/delete/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_001.md +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_002.md +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_003.md +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_005.md +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_006.md +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/main.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_extra_coverage.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_001.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_002.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_003.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_004.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_005.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_006.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/delete/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/delete/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/limit_and_offset/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/limit_and_offset/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/multiple_models/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/multiple_models/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/multiple_models/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/read_one/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/read_one/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/relationships/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/relationships/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/response_model/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/response_model/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/session_with_dependency/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/session_with_dependency/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/simple_hero_api/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/simple_hero_api/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/teams/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/teams/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/update/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/update/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/update/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/indexes/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/indexes/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/indexes/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/insert/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/insert/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/insert/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/insert/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/many_to_many/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/many_to_many/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/many_to_many/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/many_to_many/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/offset_and_limit/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/offset_and_limit/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/offset_and_limit/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/offset_and_limit/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/offset_and_limit/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial005_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial006_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial007_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial008_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial009_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/back_populates/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/back_populates/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/back_populates/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/back_populates/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial005_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/create_and_update_relationships/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/create_and_update_relationships/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/define_relationship_attributes/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/define_relationship_attributes/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/read_relationships/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/read_relationships/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/read_relationships/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/annotations/en/tutorial002.md +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/annotations/en/tutorial002.md +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/annotations/en/tutorial004.md +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial005_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial006_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial006b_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial007_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial008_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial009_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial011_py310.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/add_latest_release_date.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/deploy_docs_status.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/format.sh +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/test.sh +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/_compat.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/default.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/ext/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/ext/asyncio/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/ext/asyncio/session.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/orm/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/orm/session.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/pool/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/py.typed +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/base.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/test_decimal/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/test_uuid/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_aliases.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_annotated_uuid.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_default.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_deprecations.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_enums.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_enums_models.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_field_sa_args_kwargs.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_field_sa_column.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_field_sa_relationship.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_fields_set.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_future_annotations.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_instance_no_args.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_main.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_missing_type.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_nullable.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_ondelete_raises.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_pydantic/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_pydantic/test_field.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_query.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_select_gen.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_select_typing.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_sqlalchemy_type_errors.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_automatic_id_none_refresh/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_code_structure/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_create_connected_tables/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_delete/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_insert/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_select/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_update/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_create_db_and_table/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_delete/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests005.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests006.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_delete/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_limit_and_offset/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_multiple_models/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_read_one/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_relationships/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_response_model/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_session_with_dependency/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_simple_hero_api/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_teams/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_update/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_indexes/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_insert/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_limit_and_offset/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_many_to_many/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_back_populates/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_create_and_update_relationships/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_define_relationship_attributes/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_read_relationships/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_select/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_update/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/__init__.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_update.py +0 -0
- {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_validation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlmodel
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.39
|
|
4
4
|
Summary: SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness.
|
|
5
5
|
Author-Email: =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= <tiangolo@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -41,30 +41,27 @@ Description-Content-Type: text/markdown
|
|
|
41
41
|
<em>SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness.</em>
|
|
42
42
|
</p>
|
|
43
43
|
<p align="center">
|
|
44
|
-
<a href="https://github.com/fastapi/sqlmodel/actions?query=workflow%3ATest+event%3Apush+branch%3Amain"
|
|
44
|
+
<a href="https://github.com/fastapi/sqlmodel/actions?query=workflow%3ATest+event%3Apush+branch%3Amain">
|
|
45
45
|
<img src="https://github.com/fastapi/sqlmodel/actions/workflows/test.yml/badge.svg?event=push&branch=main" alt="Test">
|
|
46
46
|
</a>
|
|
47
|
-
<a href="https://
|
|
48
|
-
<img src="https://github.com/fastapi/sqlmodel/actions/workflows/publish.yml/badge.svg" alt="Publish">
|
|
49
|
-
</a>
|
|
50
|
-
<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/sqlmodel" target="_blank">
|
|
47
|
+
<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/sqlmodel">
|
|
51
48
|
<img src="https://coverage-badge.samuelcolvin.workers.dev/fastapi/sqlmodel.svg" alt="Coverage">
|
|
52
|
-
<a href="https://pypi.org/project/sqlmodel"
|
|
49
|
+
<a href="https://pypi.org/project/sqlmodel">
|
|
53
50
|
<img src="https://img.shields.io/pypi/v/sqlmodel?color=%2334D058&label=pypi%20package" alt="Package version">
|
|
54
51
|
</a>
|
|
55
52
|
</p>
|
|
56
53
|
|
|
57
54
|
---
|
|
58
55
|
|
|
59
|
-
**Documentation**:
|
|
56
|
+
**Documentation**: [https://sqlmodel.tiangolo.com](https://sqlmodel.tiangolo.com)
|
|
60
57
|
|
|
61
|
-
**Source Code**:
|
|
58
|
+
**Source Code**: [https://github.com/fastapi/sqlmodel](https://github.com/fastapi/sqlmodel)
|
|
62
59
|
|
|
63
60
|
---
|
|
64
61
|
|
|
65
62
|
SQLModel is a library for interacting with <abbr title='Also called "Relational databases"'>SQL databases</abbr> from Python code, with Python objects. It is designed to be intuitive, easy to use, highly compatible, and robust.
|
|
66
63
|
|
|
67
|
-
**SQLModel** is based on Python type annotations, and powered by
|
|
64
|
+
**SQLModel** is based on Python type annotations, and powered by [Pydantic](https://pydantic-docs.helpmanual.io/) and [SQLAlchemy](https://sqlalchemy.org/).
|
|
68
65
|
|
|
69
66
|
The key features are:
|
|
70
67
|
|
|
@@ -84,9 +81,9 @@ The key features are:
|
|
|
84
81
|
|
|
85
82
|
## SQL Databases in FastAPI
|
|
86
83
|
|
|
87
|
-
<a href="https://fastapi.tiangolo.com"
|
|
84
|
+
<a href="https://fastapi.tiangolo.com"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" style="width: 20%;"></a>
|
|
88
85
|
|
|
89
|
-
**SQLModel** is designed to simplify interacting with SQL databases in
|
|
86
|
+
**SQLModel** is designed to simplify interacting with SQL databases in [FastAPI](https://fastapi.tiangolo.com) applications, it was created by the same [author](https://tiangolo.com/). 😁
|
|
90
87
|
|
|
91
88
|
It combines SQLAlchemy and Pydantic and tries to simplify the code you write as much as possible, allowing you to reduce the **code duplication to a minimum**, but while getting the **best developer experience** possible.
|
|
92
89
|
|
|
@@ -94,13 +91,13 @@ It combines SQLAlchemy and Pydantic and tries to simplify the code you write as
|
|
|
94
91
|
|
|
95
92
|
## Requirements
|
|
96
93
|
|
|
97
|
-
A recent and currently supported
|
|
94
|
+
A recent and currently supported [version of Python](https://www.python.org/downloads/).
|
|
98
95
|
|
|
99
96
|
As **SQLModel** is based on **Pydantic** and **SQLAlchemy**, it requires them. They will be automatically installed when you install SQLModel.
|
|
100
97
|
|
|
101
98
|
## Installation
|
|
102
99
|
|
|
103
|
-
Make sure you create a
|
|
100
|
+
Make sure you create a [virtual environment](https://sqlmodel.tiangolo.com/virtual-environments/), activate it, and then install SQLModel, for example with:
|
|
104
101
|
|
|
105
102
|
<div class="termy">
|
|
106
103
|
|
|
@@ -114,7 +111,7 @@ Successfully installed sqlmodel
|
|
|
114
111
|
|
|
115
112
|
## Example
|
|
116
113
|
|
|
117
|
-
For an introduction to databases, SQL, and everything else, see the
|
|
114
|
+
For an introduction to databases, SQL, and everything else, see the [SQLModel documentation](https://sqlmodel.tiangolo.com/databases/).
|
|
118
115
|
|
|
119
116
|
Here's a quick example. ✨
|
|
120
117
|
|
|
@@ -6,30 +6,27 @@
|
|
|
6
6
|
<em>SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness.</em>
|
|
7
7
|
</p>
|
|
8
8
|
<p align="center">
|
|
9
|
-
<a href="https://github.com/fastapi/sqlmodel/actions?query=workflow%3ATest+event%3Apush+branch%3Amain"
|
|
9
|
+
<a href="https://github.com/fastapi/sqlmodel/actions?query=workflow%3ATest+event%3Apush+branch%3Amain">
|
|
10
10
|
<img src="https://github.com/fastapi/sqlmodel/actions/workflows/test.yml/badge.svg?event=push&branch=main" alt="Test">
|
|
11
11
|
</a>
|
|
12
|
-
<a href="https://
|
|
13
|
-
<img src="https://github.com/fastapi/sqlmodel/actions/workflows/publish.yml/badge.svg" alt="Publish">
|
|
14
|
-
</a>
|
|
15
|
-
<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/sqlmodel" target="_blank">
|
|
12
|
+
<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/sqlmodel">
|
|
16
13
|
<img src="https://coverage-badge.samuelcolvin.workers.dev/fastapi/sqlmodel.svg" alt="Coverage">
|
|
17
|
-
<a href="https://pypi.org/project/sqlmodel"
|
|
14
|
+
<a href="https://pypi.org/project/sqlmodel">
|
|
18
15
|
<img src="https://img.shields.io/pypi/v/sqlmodel?color=%2334D058&label=pypi%20package" alt="Package version">
|
|
19
16
|
</a>
|
|
20
17
|
</p>
|
|
21
18
|
|
|
22
19
|
---
|
|
23
20
|
|
|
24
|
-
**Documentation**:
|
|
21
|
+
**Documentation**: [https://sqlmodel.tiangolo.com](https://sqlmodel.tiangolo.com)
|
|
25
22
|
|
|
26
|
-
**Source Code**:
|
|
23
|
+
**Source Code**: [https://github.com/fastapi/sqlmodel](https://github.com/fastapi/sqlmodel)
|
|
27
24
|
|
|
28
25
|
---
|
|
29
26
|
|
|
30
27
|
SQLModel is a library for interacting with <abbr title='Also called "Relational databases"'>SQL databases</abbr> from Python code, with Python objects. It is designed to be intuitive, easy to use, highly compatible, and robust.
|
|
31
28
|
|
|
32
|
-
**SQLModel** is based on Python type annotations, and powered by
|
|
29
|
+
**SQLModel** is based on Python type annotations, and powered by [Pydantic](https://pydantic-docs.helpmanual.io/) and [SQLAlchemy](https://sqlalchemy.org/).
|
|
33
30
|
|
|
34
31
|
The key features are:
|
|
35
32
|
|
|
@@ -49,9 +46,9 @@ The key features are:
|
|
|
49
46
|
|
|
50
47
|
## SQL Databases in FastAPI
|
|
51
48
|
|
|
52
|
-
<a href="https://fastapi.tiangolo.com"
|
|
49
|
+
<a href="https://fastapi.tiangolo.com"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" style="width: 20%;"></a>
|
|
53
50
|
|
|
54
|
-
**SQLModel** is designed to simplify interacting with SQL databases in
|
|
51
|
+
**SQLModel** is designed to simplify interacting with SQL databases in [FastAPI](https://fastapi.tiangolo.com) applications, it was created by the same [author](https://tiangolo.com/). 😁
|
|
55
52
|
|
|
56
53
|
It combines SQLAlchemy and Pydantic and tries to simplify the code you write as much as possible, allowing you to reduce the **code duplication to a minimum**, but while getting the **best developer experience** possible.
|
|
57
54
|
|
|
@@ -59,13 +56,13 @@ It combines SQLAlchemy and Pydantic and tries to simplify the code you write as
|
|
|
59
56
|
|
|
60
57
|
## Requirements
|
|
61
58
|
|
|
62
|
-
A recent and currently supported
|
|
59
|
+
A recent and currently supported [version of Python](https://www.python.org/downloads/).
|
|
63
60
|
|
|
64
61
|
As **SQLModel** is based on **Pydantic** and **SQLAlchemy**, it requires them. They will be automatically installed when you install SQLModel.
|
|
65
62
|
|
|
66
63
|
## Installation
|
|
67
64
|
|
|
68
|
-
Make sure you create a
|
|
65
|
+
Make sure you create a [virtual environment](https://sqlmodel.tiangolo.com/virtual-environments/), activate it, and then install SQLModel, for example with:
|
|
69
66
|
|
|
70
67
|
<div class="termy">
|
|
71
68
|
|
|
@@ -79,7 +76,7 @@ Successfully installed sqlmodel
|
|
|
79
76
|
|
|
80
77
|
## Example
|
|
81
78
|
|
|
82
|
-
For an introduction to databases, SQL, and everything else, see the
|
|
79
|
+
For an introduction to databases, SQL, and everything else, see the [SQLModel documentation](https://sqlmodel.tiangolo.com/databases/).
|
|
83
80
|
|
|
84
81
|
Here's a quick example. ✨
|
|
85
82
|
|
|
@@ -307,7 +307,7 @@
|
|
|
307
307
|
|
|
308
308
|
33. Print the `hero_1`.
|
|
309
309
|
|
|
310
|
-
///
|
|
310
|
+
/// note
|
|
311
311
|
|
|
312
312
|
Even if the `hero_1` wasn't fresh, this would **not** trigger a `refresh` making the **session** use the **engine** to fetch data from the database because it is not accessing an attribute.
|
|
313
313
|
|
|
@@ -323,7 +323,7 @@
|
|
|
323
323
|
|
|
324
324
|
34. Print the `hero_2`.
|
|
325
325
|
|
|
326
|
-
///
|
|
326
|
+
/// note
|
|
327
327
|
|
|
328
328
|
Even if the `hero_2` wasn't fresh, this would **not** trigger a `refresh` making the **session** use the **engine** to fetch data from the database because it is not accessing an attribute.
|
|
329
329
|
|
|
@@ -339,7 +339,7 @@
|
|
|
339
339
|
|
|
340
340
|
35. Print the `hero_3`.
|
|
341
341
|
|
|
342
|
-
///
|
|
342
|
+
/// note
|
|
343
343
|
|
|
344
344
|
Even if the `hero_3` wasn't fresh, this would **not** trigger a `refresh` making the **session** use the **engine** to fetch data from the database because it is not accessing an attribute.
|
|
345
345
|
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
We tell it that with the `poolclass=StaticPool` parameter.
|
|
24
24
|
|
|
25
|
-
///
|
|
25
|
+
/// note
|
|
26
26
|
|
|
27
27
|
You can read more details in the <a href="https://docs.sqlalchemy.org/en/14/dialects/sqlite.html#using-a-memory-database-in-multiple-threads" class="external-link" target="_blank">SQLAlchemy documentation about Using a Memory Database in Multiple Threads</a>
|
|
28
28
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
3. Use a `with` block to create a `Session` using the `engine`.
|
|
8
8
|
|
|
9
|
-
The new **
|
|
9
|
+
The new **session** will be assigned to the variable `session`.
|
|
10
10
|
|
|
11
11
|
And it will be automatically closed when the `with` block is finished.
|
|
12
12
|
|
|
@@ -41,7 +41,7 @@ dependencies = [
|
|
|
41
41
|
"pydantic>=2.11.0",
|
|
42
42
|
"typing-extensions>=4.5.0",
|
|
43
43
|
]
|
|
44
|
-
version = "0.0.
|
|
44
|
+
version = "0.0.39"
|
|
45
45
|
|
|
46
46
|
[project.urls]
|
|
47
47
|
Homepage = "https://github.com/fastapi/sqlmodel"
|
|
@@ -55,6 +55,7 @@ dev = [
|
|
|
55
55
|
{ include-group = "docs" },
|
|
56
56
|
{ include-group = "tests" },
|
|
57
57
|
"prek>=0.2.24,<1.0.0",
|
|
58
|
+
"zizmor >=1.23.1",
|
|
58
59
|
]
|
|
59
60
|
docs = [
|
|
60
61
|
"black >=24.1.0",
|
|
@@ -63,13 +64,11 @@ docs = [
|
|
|
63
64
|
"griffe-warnings-deprecated >=1.1.0",
|
|
64
65
|
"markdown-include-variants >=0.0.8",
|
|
65
66
|
"mdx-include >=1.4.1",
|
|
66
|
-
"mkdocs-macros-plugin >=1.5.0",
|
|
67
|
-
"mkdocs-material >=9.7.5",
|
|
68
|
-
"mkdocs-redirects >=1.2.1",
|
|
69
67
|
"mkdocstrings[python] >=1.0.3",
|
|
70
68
|
"pillow >=12.1.1",
|
|
71
69
|
"pyyaml >=5.3.1",
|
|
72
70
|
"typer >=0.24.1",
|
|
71
|
+
"zensical>=0.0.42",
|
|
73
72
|
]
|
|
74
73
|
github-actions = [
|
|
75
74
|
"httpx >=0.28.1",
|
|
@@ -85,9 +84,10 @@ tests = [
|
|
|
85
84
|
"fastapi >=0.128.0",
|
|
86
85
|
"httpx >=0.28.1",
|
|
87
86
|
"jinja2 >=3.1.6",
|
|
88
|
-
"mypy >=1.19.1",
|
|
89
87
|
"pytest >=7.0.1",
|
|
90
88
|
"ruff >=0.15.6",
|
|
89
|
+
"ty>=0.0.25",
|
|
90
|
+
"typer >=0.24.1",
|
|
91
91
|
"typing-extensions >=4.15.0",
|
|
92
92
|
]
|
|
93
93
|
|
|
@@ -131,16 +131,6 @@ exclude_lines = [
|
|
|
131
131
|
[tool.coverage.html]
|
|
132
132
|
show_contexts = true
|
|
133
133
|
|
|
134
|
-
[tool.mypy]
|
|
135
|
-
strict = true
|
|
136
|
-
exclude = "sqlmodel.sql._expression_select_gen"
|
|
137
|
-
|
|
138
|
-
[[tool.mypy.overrides]]
|
|
139
|
-
module = "docs_src.*"
|
|
140
|
-
disallow_incomplete_defs = false
|
|
141
|
-
disallow_untyped_defs = false
|
|
142
|
-
disallow_untyped_calls = false
|
|
143
|
-
|
|
144
134
|
[tool.ruff.lint]
|
|
145
135
|
select = [
|
|
146
136
|
"E",
|
|
@@ -170,3 +160,25 @@ known-third-party = [
|
|
|
170
160
|
|
|
171
161
|
[tool.ruff.lint.pyupgrade]
|
|
172
162
|
keep-runtime-typing = true
|
|
163
|
+
|
|
164
|
+
[tool.ty.terminal]
|
|
165
|
+
error-on-warning = true
|
|
166
|
+
|
|
167
|
+
[tool.typos.files]
|
|
168
|
+
extend-exclude = [
|
|
169
|
+
"coverage/",
|
|
170
|
+
"dist/",
|
|
171
|
+
"docs/img/",
|
|
172
|
+
"docs/release-notes.md",
|
|
173
|
+
"htmlcov/",
|
|
174
|
+
"site/",
|
|
175
|
+
"site_build/",
|
|
176
|
+
"uv.lock",
|
|
177
|
+
]
|
|
178
|
+
|
|
179
|
+
[tool.typos.default.extend-identifiers]
|
|
180
|
+
alls = "alls"
|
|
181
|
+
|
|
182
|
+
[tool.typos.default.extend-words]
|
|
183
|
+
Ines = "Ines"
|
|
184
|
+
selectin = "selectin"
|
|
@@ -6,8 +6,8 @@ import subprocess
|
|
|
6
6
|
from http.server import HTTPServer, SimpleHTTPRequestHandler
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
|
-
import mkdocs.utils
|
|
10
9
|
import typer
|
|
10
|
+
import yaml
|
|
11
11
|
from jinja2 import Template
|
|
12
12
|
from ruff.__main__ import find_ruff_bin
|
|
13
13
|
|
|
@@ -45,7 +45,7 @@ def generate_readme_content() -> str:
|
|
|
45
45
|
match_start = re.search(r"<!-- sponsors -->", content)
|
|
46
46
|
match_end = re.search(r"<!-- /sponsors -->", content)
|
|
47
47
|
sponsors_data_path = en_docs_path / "data" / "sponsors.yml"
|
|
48
|
-
sponsors =
|
|
48
|
+
sponsors = yaml.safe_load(sponsors_data_path.read_text(encoding="utf-8"))
|
|
49
49
|
if not (match_start and match_end):
|
|
50
50
|
raise RuntimeError("Couldn't auto-generate sponsors section")
|
|
51
51
|
if not match_pre:
|
|
@@ -108,7 +108,7 @@ def live(dirty: bool = False) -> None:
|
|
|
108
108
|
en.
|
|
109
109
|
"""
|
|
110
110
|
# Enable line numbers during local development to make it easier to highlight
|
|
111
|
-
args = ["
|
|
111
|
+
args = ["zensical", "serve", "--dev-addr", "127.0.0.1:8008"]
|
|
112
112
|
if dirty:
|
|
113
113
|
args.append("--dirty")
|
|
114
114
|
subprocess.run(args, env={**os.environ, "LINENUMS": "true"}, check=True)
|
|
@@ -120,7 +120,7 @@ def build() -> None:
|
|
|
120
120
|
Build the docs.
|
|
121
121
|
"""
|
|
122
122
|
print("Building docs")
|
|
123
|
-
subprocess.run(["
|
|
123
|
+
subprocess.run(["zensical", "build"], check=True)
|
|
124
124
|
typer.secho("Successfully built docs", color=typer.colors.GREEN)
|
|
125
125
|
|
|
126
126
|
|
|
@@ -129,7 +129,7 @@ def serve() -> None:
|
|
|
129
129
|
"""
|
|
130
130
|
A quick server to preview a built site.
|
|
131
131
|
|
|
132
|
-
For development, prefer the command live (or just
|
|
132
|
+
For development, prefer the command live (or just zensical serve).
|
|
133
133
|
|
|
134
134
|
This is here only to preview the documentation site.
|
|
135
135
|
|
|
@@ -37,7 +37,7 @@ for total_args in range(2, number_of_types + 1):
|
|
|
37
37
|
else:
|
|
38
38
|
t_type = f"_T{i}"
|
|
39
39
|
t_var = f"_TCCA[{t_type}]"
|
|
40
|
-
arg = Arg(name=f"
|
|
40
|
+
arg = Arg(name=f"ent{i}", annotation=t_var)
|
|
41
41
|
ret_type = t_type
|
|
42
42
|
args.append(arg)
|
|
43
43
|
return_types.append(ret_type)
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"""Prepare a release by updating the package version and release notes."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from datetime import date
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Annotated, Literal
|
|
7
|
+
|
|
8
|
+
import typer
|
|
9
|
+
|
|
10
|
+
VERSION_PATTERN = re.compile(r'(?m)^__version__ = "(\d+\.\d+\.\d+)"$')
|
|
11
|
+
VERSION_HEADING_PATTERN = re.compile(r"(?m)^## (\d+\.\d+\.\d+)(?: \([^)]+\))?$")
|
|
12
|
+
RELEASE_NOTES_HEADER = "# Release Notes\n\n"
|
|
13
|
+
LATEST_CHANGES_HEADER = "## Latest Changes"
|
|
14
|
+
BumpType = Literal["major", "minor", "patch"]
|
|
15
|
+
|
|
16
|
+
app = typer.Typer()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def parse_version(version: str) -> tuple[int, int, int]:
|
|
20
|
+
match = re.fullmatch(r"\d+\.\d+\.\d+", version)
|
|
21
|
+
if not match:
|
|
22
|
+
raise ValueError(f"Invalid version: {version!r}. Expected format: X.Y.Z")
|
|
23
|
+
major, minor, patch = version.split(".")
|
|
24
|
+
return int(major), int(minor), int(patch)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_current_version(content: str, version_file: Path) -> str:
|
|
28
|
+
matches = list(VERSION_PATTERN.finditer(content))
|
|
29
|
+
if len(matches) != 1:
|
|
30
|
+
raise RuntimeError(
|
|
31
|
+
f"Expected exactly one __version__ assignment in {version_file}, "
|
|
32
|
+
f"found {len(matches)}"
|
|
33
|
+
)
|
|
34
|
+
return matches[0].group(1)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def bump_version(version: str, bump: BumpType) -> str:
|
|
38
|
+
major, minor, patch = parse_version(version)
|
|
39
|
+
if bump == "major":
|
|
40
|
+
return f"{major + 1}.0.0"
|
|
41
|
+
if bump == "minor":
|
|
42
|
+
return f"{major}.{minor + 1}.0"
|
|
43
|
+
return f"{major}.{minor}.{patch + 1}"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def update_version_file(content: str, version: str, version_file: Path) -> str:
|
|
47
|
+
current_version = get_current_version(content, version_file)
|
|
48
|
+
if parse_version(version) <= parse_version(current_version):
|
|
49
|
+
raise RuntimeError(
|
|
50
|
+
f"New version {version} must be greater than current version {current_version}"
|
|
51
|
+
)
|
|
52
|
+
return VERSION_PATTERN.sub(f'__version__ = "{version}"', content, count=1)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def update_release_notes(
|
|
56
|
+
content: str, version: str, release_date: date, release_notes_file: Path
|
|
57
|
+
) -> str:
|
|
58
|
+
if not content.startswith(RELEASE_NOTES_HEADER):
|
|
59
|
+
raise RuntimeError(
|
|
60
|
+
f"{release_notes_file} must start with {RELEASE_NOTES_HEADER!r}"
|
|
61
|
+
)
|
|
62
|
+
if re.search(rf"^## {re.escape(version)}(?: \([^)]+\))?$", content, re.M):
|
|
63
|
+
raise RuntimeError(f"Release notes already contain a section for {version}")
|
|
64
|
+
|
|
65
|
+
latest_header = f"{RELEASE_NOTES_HEADER}{LATEST_CHANGES_HEADER}\n"
|
|
66
|
+
if not content.startswith(latest_header):
|
|
67
|
+
raise RuntimeError(f"{release_notes_file} must start with {latest_header!r}")
|
|
68
|
+
|
|
69
|
+
release_header = f"## {version} ({release_date.isoformat()})"
|
|
70
|
+
return content.replace(
|
|
71
|
+
latest_header,
|
|
72
|
+
f"{RELEASE_NOTES_HEADER}{LATEST_CHANGES_HEADER}\n\n{release_header}\n",
|
|
73
|
+
1,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def get_release_notes_body(content: str, version: str, release_notes_file: Path) -> str:
|
|
78
|
+
version_heading = re.compile(rf"(?m)^## {re.escape(version)}(?: \([^)]+\))?$")
|
|
79
|
+
match = version_heading.search(content)
|
|
80
|
+
if not match:
|
|
81
|
+
raise RuntimeError(
|
|
82
|
+
f"Could not find release notes section for {version} in {release_notes_file}"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
next_match = VERSION_HEADING_PATTERN.search(content, match.end())
|
|
86
|
+
end = next_match.start() if next_match else len(content)
|
|
87
|
+
body = content[match.end() : end].strip()
|
|
88
|
+
if not body:
|
|
89
|
+
raise RuntimeError(
|
|
90
|
+
f"Release notes section for {version} in {release_notes_file} is empty"
|
|
91
|
+
)
|
|
92
|
+
return f"{body}\n"
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@app.command()
|
|
96
|
+
def prepare(
|
|
97
|
+
bump: Annotated[
|
|
98
|
+
BumpType,
|
|
99
|
+
typer.Argument(
|
|
100
|
+
envvar="PREPARE_RELEASE_BUMP",
|
|
101
|
+
help="The release bump to make: major, minor, or patch.",
|
|
102
|
+
),
|
|
103
|
+
],
|
|
104
|
+
version_file: Annotated[
|
|
105
|
+
Path,
|
|
106
|
+
typer.Option(
|
|
107
|
+
envvar="PREPARE_RELEASE_VERSION_FILE",
|
|
108
|
+
exists=True,
|
|
109
|
+
file_okay=True,
|
|
110
|
+
dir_okay=False,
|
|
111
|
+
readable=True,
|
|
112
|
+
writable=True,
|
|
113
|
+
help="Path to the Python file containing the __version__ assignment.",
|
|
114
|
+
),
|
|
115
|
+
],
|
|
116
|
+
release_notes_file: Annotated[
|
|
117
|
+
Path,
|
|
118
|
+
typer.Option(
|
|
119
|
+
envvar="PREPARE_RELEASE_RELEASE_NOTES_FILE",
|
|
120
|
+
exists=True,
|
|
121
|
+
file_okay=True,
|
|
122
|
+
dir_okay=False,
|
|
123
|
+
readable=True,
|
|
124
|
+
writable=True,
|
|
125
|
+
help="Path to the release notes Markdown file.",
|
|
126
|
+
),
|
|
127
|
+
],
|
|
128
|
+
release_date: Annotated[
|
|
129
|
+
str,
|
|
130
|
+
typer.Option(
|
|
131
|
+
"--date",
|
|
132
|
+
envvar="PREPARE_RELEASE_DATE",
|
|
133
|
+
help="Release date in YYYY-MM-DD format. Defaults to today.",
|
|
134
|
+
),
|
|
135
|
+
] = date.today().isoformat(),
|
|
136
|
+
) -> None:
|
|
137
|
+
parsed_release_date = date.fromisoformat(release_date or date.today().isoformat())
|
|
138
|
+
|
|
139
|
+
version_file_content = version_file.read_text()
|
|
140
|
+
release_notes_content = release_notes_file.read_text()
|
|
141
|
+
version = bump_version(
|
|
142
|
+
get_current_version(version_file_content, version_file), bump
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
version_file.write_text(
|
|
146
|
+
update_version_file(version_file_content, version, version_file)
|
|
147
|
+
)
|
|
148
|
+
release_notes_file.write_text(
|
|
149
|
+
update_release_notes(
|
|
150
|
+
release_notes_content, version, parsed_release_date, release_notes_file
|
|
151
|
+
)
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
typer.echo(f"Prepared release {version} ({parsed_release_date.isoformat()})")
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
@app.command()
|
|
158
|
+
def current_version(
|
|
159
|
+
version_file: Annotated[
|
|
160
|
+
Path,
|
|
161
|
+
typer.Option(
|
|
162
|
+
envvar="PREPARE_RELEASE_VERSION_FILE",
|
|
163
|
+
exists=True,
|
|
164
|
+
file_okay=True,
|
|
165
|
+
dir_okay=False,
|
|
166
|
+
readable=True,
|
|
167
|
+
help="Path to the Python file containing the __version__ assignment.",
|
|
168
|
+
),
|
|
169
|
+
],
|
|
170
|
+
) -> None:
|
|
171
|
+
typer.echo(get_current_version(version_file.read_text(), version_file))
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
@app.command()
|
|
175
|
+
def release_notes(
|
|
176
|
+
version_file: Annotated[
|
|
177
|
+
Path,
|
|
178
|
+
typer.Option(
|
|
179
|
+
envvar="PREPARE_RELEASE_VERSION_FILE",
|
|
180
|
+
exists=True,
|
|
181
|
+
file_okay=True,
|
|
182
|
+
dir_okay=False,
|
|
183
|
+
readable=True,
|
|
184
|
+
help="Path to the Python file containing the __version__ assignment.",
|
|
185
|
+
),
|
|
186
|
+
],
|
|
187
|
+
release_notes_file: Annotated[
|
|
188
|
+
Path,
|
|
189
|
+
typer.Option(
|
|
190
|
+
envvar="PREPARE_RELEASE_RELEASE_NOTES_FILE",
|
|
191
|
+
exists=True,
|
|
192
|
+
file_okay=True,
|
|
193
|
+
dir_okay=False,
|
|
194
|
+
readable=True,
|
|
195
|
+
help="Path to the release notes Markdown file.",
|
|
196
|
+
),
|
|
197
|
+
],
|
|
198
|
+
) -> None:
|
|
199
|
+
version = get_current_version(version_file.read_text(), version_file)
|
|
200
|
+
typer.echo(
|
|
201
|
+
get_release_notes_body(
|
|
202
|
+
release_notes_file.read_text(), version, release_notes_file
|
|
203
|
+
),
|
|
204
|
+
nl=False,
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
if __name__ == "__main__":
|
|
209
|
+
app()
|