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.
Files changed (341) hide show
  1. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/PKG-INFO +12 -15
  2. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/README.md +11 -14
  3. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/automatic_id_none_refresh/annotations/en/tutorial002.md +3 -3
  4. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_004.md +1 -1
  5. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/insert/annotations/en/tutorial003.md +1 -1
  6. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/pyproject.toml +27 -15
  7. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/docs.py +5 -5
  8. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/generate_select.py +1 -1
  9. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/lint.sh +2 -2
  10. sqlmodel-0.0.39/scripts/prepare_release.py +209 -0
  11. sqlmodel-0.0.39/sqlmodel/.agents/skills/sqlmodel/SKILL.md +178 -0
  12. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/__init__.py +1 -1
  13. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/main.py +17 -17
  14. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/_expression_select_cls.py +2 -2
  15. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/_expression_select_gen.py +119 -92
  16. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/_expression_select_gen.py.jinja2 +8 -9
  17. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/expression.py +15 -15
  18. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/sqltypes.py +1 -1
  19. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/conftest.py +0 -6
  20. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/test_decimal/test_tutorial001.py +2 -2
  21. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/test_uuid/test_tutorial001.py +2 -2
  22. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/test_uuid/test_tutorial002.py +2 -2
  23. sqlmodel-0.0.39/tests/test_prepare_release.py +298 -0
  24. sqlmodel-0.0.39/tests/test_pydantic/test_model_dump.py +47 -0
  25. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_automatic_id_none_refresh/test_tutorial001_tutorial002.py +3 -3
  26. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_code_structure/test_tutorial001.py +2 -2
  27. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_code_structure/test_tutorial002.py +2 -2
  28. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_create_connected_tables/test_tutorial001.py +1 -3
  29. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_delete/test_tutorial001.py +2 -2
  30. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_insert/test_tutorial001.py +2 -2
  31. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_select/test_tutorial001_tutorial002.py +3 -3
  32. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_select/test_tutorial003.py +2 -2
  33. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_select/test_tutorial004.py +2 -2
  34. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_select/test_tutorial005.py +2 -2
  35. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_update/test_tutorial001.py +2 -2
  36. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_create_db_and_table/test_tutorial001.py +2 -2
  37. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_create_db_and_table/test_tutorial002.py +1 -3
  38. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_create_db_and_table/test_tutorial003.py +1 -3
  39. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_delete/test_tutorial001_tutorial002.py +3 -3
  40. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests001.py +1 -3
  41. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests002.py +1 -3
  42. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests003.py +1 -3
  43. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests004.py +1 -3
  44. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests_main.py +1 -3
  45. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_delete/test_tutorial001.py +1 -3
  46. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_limit_and_offset/test_tutorial001.py +1 -3
  47. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial001.py +1 -3
  48. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial002.py +1 -3
  49. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_read_one/test_tutorial001.py +1 -3
  50. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_relationships/test_tutorial001.py +1 -3
  51. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_response_model/test_tutorial001.py +1 -3
  52. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_session_with_dependency/test_tutorial001.py +1 -3
  53. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_simple_hero_api/test_tutorial001.py +1 -3
  54. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_teams/test_tutorial001.py +1 -3
  55. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_update/test_tutorial001.py +1 -3
  56. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_update/test_tutorial002.py +1 -3
  57. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_indexes/test_tutorial001.py +2 -2
  58. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_indexes/test_tutorial002.py +2 -2
  59. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_insert/test_tutorial001.py +1 -3
  60. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_insert/test_tutorial002.py +1 -3
  61. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_insert/test_tutorial003.py +1 -3
  62. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_limit_and_offset/test_tutorial001.py +2 -2
  63. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_limit_and_offset/test_tutorial002.py +2 -2
  64. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_limit_and_offset/test_tutorial003.py +2 -2
  65. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_limit_and_offset/test_tutorial004.py +2 -2
  66. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_many_to_many/test_tutorial001.py +2 -2
  67. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_many_to_many/test_tutorial002.py +2 -2
  68. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_many_to_many/test_tutorial003.py +2 -2
  69. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial001.py +2 -2
  70. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial002.py +2 -2
  71. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial003.py +2 -2
  72. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial004.py +2 -2
  73. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial005.py +2 -2
  74. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial006.py +2 -2
  75. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial007.py +2 -2
  76. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial008.py +2 -2
  77. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/test_tutorial009.py +2 -2
  78. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial001.py +2 -2
  79. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial002.py +2 -2
  80. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial003.py +1 -3
  81. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_create_and_update_relationships/test_tutorial001.py +2 -2
  82. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_define_relationship_attributes/test_tutorial001.py +2 -2
  83. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial001.py +2 -2
  84. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial002.py +2 -2
  85. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial003.py +2 -2
  86. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial004.py +2 -2
  87. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial005.py +2 -2
  88. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_read_relationships/test_tutorial001.py +2 -2
  89. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_read_relationships/test_tutorial002.py +2 -2
  90. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_select/test_tutorial001_tutorial002.py +3 -3
  91. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_select/test_tutorial003_tutorial004.py +3 -3
  92. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_update/test_tutorial001_tutorial002.py +3 -3
  93. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_update/test_tutorial003_tutorial004.py +3 -3
  94. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial001.py +2 -2
  95. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial002.py +2 -2
  96. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial003.py +2 -2
  97. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial004.py +2 -2
  98. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial005.py +2 -2
  99. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial006.py +2 -2
  100. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial006b.py +2 -2
  101. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial007.py +2 -2
  102. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial008.py +2 -2
  103. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial009.py +2 -2
  104. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/test_tutorial011.py +2 -2
  105. sqlmodel-0.0.38/scripts/mkdocs_hooks.py +0 -38
  106. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/LICENSE +0 -0
  107. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/__init__.py +0 -0
  108. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/__init__.py +0 -0
  109. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/decimal/__init__.py +0 -0
  110. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/decimal/tutorial001_py310.py +0 -0
  111. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/uuid/__init__.py +0 -0
  112. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/uuid/tutorial001_py310.py +0 -0
  113. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/advanced/uuid/tutorial002_py310.py +0 -0
  114. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/__init__.py +0 -0
  115. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/automatic_id_none_refresh/__init__.py +0 -0
  116. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/automatic_id_none_refresh/tutorial001_py310.py +0 -0
  117. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/automatic_id_none_refresh/tutorial002_py310.py +0 -0
  118. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/__init__.py +0 -0
  119. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial001_py310/__init__.py +0 -0
  120. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial001_py310/app.py +0 -0
  121. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial001_py310/database.py +0 -0
  122. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial001_py310/models.py +0 -0
  123. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial002_py310/__init__.py +0 -0
  124. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial002_py310/app.py +0 -0
  125. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial002_py310/database.py +0 -0
  126. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial002_py310/hero_model.py +0 -0
  127. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/code_structure/tutorial002_py310/team_model.py +0 -0
  128. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/__init__.py +0 -0
  129. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/create_tables/__init__.py +0 -0
  130. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/create_tables/tutorial001_py310.py +0 -0
  131. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/delete/__init__.py +0 -0
  132. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/delete/tutorial001_py310.py +0 -0
  133. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/insert/__init__.py +0 -0
  134. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/insert/tutorial001_py310.py +0 -0
  135. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/__init__.py +0 -0
  136. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/tutorial001_py310.py +0 -0
  137. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/tutorial002_py310.py +0 -0
  138. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/tutorial003_py310.py +0 -0
  139. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/tutorial004_py310.py +0 -0
  140. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/select/tutorial005_py310.py +0 -0
  141. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/update/__init__.py +0 -0
  142. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/connect/update/tutorial001_py310.py +0 -0
  143. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/create_db_and_table/__init__.py +0 -0
  144. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/create_db_and_table/annotations/en/tutorial003.md +0 -0
  145. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/create_db_and_table/tutorial001_py310.py +0 -0
  146. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/create_db_and_table/tutorial002_py310.py +0 -0
  147. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/create_db_and_table/tutorial003_py310.py +0 -0
  148. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/delete/__init__.py +0 -0
  149. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/delete/annotations/en/tutorial002.md +0 -0
  150. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/delete/tutorial001_py310.py +0 -0
  151. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/delete/tutorial002_py310.py +0 -0
  152. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/__init__.py +0 -0
  153. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/__init__.py +0 -0
  154. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/__init__.py +0 -0
  155. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_001.md +0 -0
  156. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_002.md +0 -0
  157. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_003.md +0 -0
  158. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_005.md +0 -0
  159. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_006.md +0 -0
  160. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/main.py +0 -0
  161. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_extra_coverage.py +0 -0
  162. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main.py +0 -0
  163. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_001.py +0 -0
  164. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_002.py +0 -0
  165. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_003.py +0 -0
  166. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_004.py +0 -0
  167. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_005.py +0 -0
  168. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_006.py +0 -0
  169. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/delete/__init__.py +0 -0
  170. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/delete/tutorial001_py310.py +0 -0
  171. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/limit_and_offset/__init__.py +0 -0
  172. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/limit_and_offset/tutorial001_py310.py +0 -0
  173. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/multiple_models/__init__.py +0 -0
  174. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/multiple_models/tutorial001_py310.py +0 -0
  175. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/multiple_models/tutorial002_py310.py +0 -0
  176. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/read_one/__init__.py +0 -0
  177. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/read_one/tutorial001_py310.py +0 -0
  178. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/relationships/__init__.py +0 -0
  179. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/relationships/tutorial001_py310.py +0 -0
  180. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/response_model/__init__.py +0 -0
  181. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/response_model/tutorial001_py310.py +0 -0
  182. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/session_with_dependency/__init__.py +0 -0
  183. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/session_with_dependency/tutorial001_py310.py +0 -0
  184. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/simple_hero_api/__init__.py +0 -0
  185. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/simple_hero_api/tutorial001_py310.py +0 -0
  186. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/teams/__init__.py +0 -0
  187. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/teams/tutorial001_py310.py +0 -0
  188. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/update/__init__.py +0 -0
  189. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/update/tutorial001_py310.py +0 -0
  190. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/fastapi/update/tutorial002_py310.py +0 -0
  191. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/indexes/__init__.py +0 -0
  192. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/indexes/tutorial001_py310.py +0 -0
  193. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/indexes/tutorial002_py310.py +0 -0
  194. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/insert/__init__.py +0 -0
  195. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/insert/tutorial001_py310.py +0 -0
  196. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/insert/tutorial002_py310.py +0 -0
  197. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/insert/tutorial003_py310.py +0 -0
  198. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/many_to_many/__init__.py +0 -0
  199. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/many_to_many/tutorial001_py310.py +0 -0
  200. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/many_to_many/tutorial002_py310.py +0 -0
  201. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/many_to_many/tutorial003_py310.py +0 -0
  202. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/offset_and_limit/__init__.py +0 -0
  203. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/offset_and_limit/tutorial001_py310.py +0 -0
  204. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/offset_and_limit/tutorial002_py310.py +0 -0
  205. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/offset_and_limit/tutorial003_py310.py +0 -0
  206. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/offset_and_limit/tutorial004_py310.py +0 -0
  207. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/__init__.py +0 -0
  208. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial001_py310.py +0 -0
  209. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial002_py310.py +0 -0
  210. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial003_py310.py +0 -0
  211. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial004_py310.py +0 -0
  212. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial005_py310.py +0 -0
  213. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial006_py310.py +0 -0
  214. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial007_py310.py +0 -0
  215. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial008_py310.py +0 -0
  216. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/one/tutorial009_py310.py +0 -0
  217. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/__init__.py +0 -0
  218. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/back_populates/__init__.py +0 -0
  219. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/back_populates/tutorial001_py310.py +0 -0
  220. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/back_populates/tutorial002_py310.py +0 -0
  221. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/back_populates/tutorial003_py310.py +0 -0
  222. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/__init__.py +0 -0
  223. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial001_py310.py +0 -0
  224. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial002_py310.py +0 -0
  225. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial003_py310.py +0 -0
  226. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial004_py310.py +0 -0
  227. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial005_py310.py +0 -0
  228. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/create_and_update_relationships/__init__.py +0 -0
  229. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/create_and_update_relationships/tutorial001_py310.py +0 -0
  230. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/define_relationship_attributes/__init__.py +0 -0
  231. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/define_relationship_attributes/tutorial001_py310.py +0 -0
  232. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/read_relationships/__init__.py +0 -0
  233. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/read_relationships/tutorial001_py310.py +0 -0
  234. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/relationship_attributes/read_relationships/tutorial002_py310.py +0 -0
  235. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/__init__.py +0 -0
  236. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/annotations/en/tutorial002.md +0 -0
  237. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/tutorial001_py310.py +0 -0
  238. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/tutorial002_py310.py +0 -0
  239. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/tutorial003_py310.py +0 -0
  240. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/select/tutorial004_py310.py +0 -0
  241. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/__init__.py +0 -0
  242. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/annotations/en/tutorial002.md +0 -0
  243. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/annotations/en/tutorial004.md +0 -0
  244. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/tutorial001_py310.py +0 -0
  245. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/tutorial002_py310.py +0 -0
  246. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/tutorial003_py310.py +0 -0
  247. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/update/tutorial004_py310.py +0 -0
  248. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/__init__.py +0 -0
  249. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial001_py310.py +0 -0
  250. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial002_py310.py +0 -0
  251. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial003_py310.py +0 -0
  252. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial004_py310.py +0 -0
  253. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial005_py310.py +0 -0
  254. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial006_py310.py +0 -0
  255. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial006b_py310.py +0 -0
  256. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial007_py310.py +0 -0
  257. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial008_py310.py +0 -0
  258. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial009_py310.py +0 -0
  259. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/docs_src/tutorial/where/tutorial011_py310.py +0 -0
  260. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/add_latest_release_date.py +0 -0
  261. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/deploy_docs_status.py +0 -0
  262. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/format.sh +0 -0
  263. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/scripts/test.sh +0 -0
  264. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/_compat.py +0 -0
  265. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/default.py +0 -0
  266. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/ext/__init__.py +0 -0
  267. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/ext/asyncio/__init__.py +0 -0
  268. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/ext/asyncio/session.py +0 -0
  269. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/orm/__init__.py +0 -0
  270. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/orm/session.py +0 -0
  271. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/pool/__init__.py +0 -0
  272. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/py.typed +0 -0
  273. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/__init__.py +0 -0
  274. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/sqlmodel/sql/base.py +0 -0
  275. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/__init__.py +0 -0
  276. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/__init__.py +0 -0
  277. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/test_decimal/__init__.py +0 -0
  278. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_advanced/test_uuid/__init__.py +0 -0
  279. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_aliases.py +0 -0
  280. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_annotated_uuid.py +0 -0
  281. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_default.py +0 -0
  282. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_deprecations.py +0 -0
  283. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_enums.py +0 -0
  284. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_enums_models.py +0 -0
  285. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_field_sa_args_kwargs.py +0 -0
  286. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_field_sa_column.py +0 -0
  287. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_field_sa_relationship.py +0 -0
  288. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_fields_set.py +0 -0
  289. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_future_annotations.py +0 -0
  290. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_instance_no_args.py +0 -0
  291. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_main.py +0 -0
  292. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_missing_type.py +0 -0
  293. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_nullable.py +0 -0
  294. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_ondelete_raises.py +0 -0
  295. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_pydantic/__init__.py +0 -0
  296. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_pydantic/test_field.py +0 -0
  297. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_query.py +0 -0
  298. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_select_gen.py +0 -0
  299. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_select_typing.py +0 -0
  300. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_sqlalchemy_type_errors.py +0 -0
  301. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/__init__.py +0 -0
  302. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_automatic_id_none_refresh/__init__.py +0 -0
  303. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_code_structure/__init__.py +0 -0
  304. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/__init__.py +0 -0
  305. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_create_connected_tables/__init__.py +0 -0
  306. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_delete/__init__.py +0 -0
  307. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_insert/__init__.py +0 -0
  308. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_select/__init__.py +0 -0
  309. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_connect/test_update/__init__.py +0 -0
  310. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_create_db_and_table/__init__.py +0 -0
  311. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_delete/__init__.py +0 -0
  312. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/__init__.py +0 -0
  313. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/__init__.py +0 -0
  314. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests005.py +0 -0
  315. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests006.py +0 -0
  316. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_delete/__init__.py +0 -0
  317. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_limit_and_offset/__init__.py +0 -0
  318. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_multiple_models/__init__.py +0 -0
  319. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_read_one/__init__.py +0 -0
  320. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_relationships/__init__.py +0 -0
  321. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_response_model/__init__.py +0 -0
  322. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_session_with_dependency/__init__.py +0 -0
  323. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_simple_hero_api/__init__.py +0 -0
  324. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_teams/__init__.py +0 -0
  325. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_fastapi/test_update/__init__.py +0 -0
  326. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_indexes/__init__.py +0 -0
  327. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_insert/__init__.py +0 -0
  328. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_limit_and_offset/__init__.py +0 -0
  329. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_many_to_many/__init__.py +0 -0
  330. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_one/__init__.py +0 -0
  331. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/__init__.py +0 -0
  332. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_back_populates/__init__.py +0 -0
  333. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_create_and_update_relationships/__init__.py +0 -0
  334. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_define_relationship_attributes/__init__.py +0 -0
  335. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/__init__.py +0 -0
  336. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_relationship_attributes/test_read_relationships/__init__.py +0 -0
  337. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_select/__init__.py +0 -0
  338. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_update/__init__.py +0 -0
  339. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_tutorial/test_where/__init__.py +0 -0
  340. {sqlmodel-0.0.38 → sqlmodel-0.0.39}/tests/test_update.py +0 -0
  341. {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.38
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" target="_blank">
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://github.com/fastapi/sqlmodel/actions?query=workflow%3APublish" target="_blank">
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" target="_blank">
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**: <a href="https://sqlmodel.tiangolo.com" target="_blank">https://sqlmodel.tiangolo.com</a>
56
+ **Documentation**: [https://sqlmodel.tiangolo.com](https://sqlmodel.tiangolo.com)
60
57
 
61
- **Source Code**: <a href="https://github.com/fastapi/sqlmodel" target="_blank">https://github.com/fastapi/sqlmodel</a>
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 <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a> and <a href="https://sqlalchemy.org/" class="external-link" target="_blank">SQLAlchemy</a>.
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" target="_blank"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" style="width: 20%;"></a>
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 <a href="https://fastapi.tiangolo.com" class="external-link" target="_blank">FastAPI</a> applications, it was created by the same <a href="https://tiangolo.com/" class="external-link" target="_blank">author</a>. 😁
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 <a href="https://www.python.org/downloads/" class="external-link" target="_blank">version of Python</a>.
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 <a href="https://sqlmodel.tiangolo.com/virtual-environments/" class="external-link" target="_blank">virtual environment</a>, activate it, and then install SQLModel, for example with:
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 <a href="https://sqlmodel.tiangolo.com/databases/" target="_blank">SQLModel documentation</a>.
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" target="_blank">
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://github.com/fastapi/sqlmodel/actions?query=workflow%3APublish" target="_blank">
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" target="_blank">
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**: <a href="https://sqlmodel.tiangolo.com" target="_blank">https://sqlmodel.tiangolo.com</a>
21
+ **Documentation**: [https://sqlmodel.tiangolo.com](https://sqlmodel.tiangolo.com)
25
22
 
26
- **Source Code**: <a href="https://github.com/fastapi/sqlmodel" target="_blank">https://github.com/fastapi/sqlmodel</a>
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 <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a> and <a href="https://sqlalchemy.org/" class="external-link" target="_blank">SQLAlchemy</a>.
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" target="_blank"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" style="width: 20%;"></a>
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 <a href="https://fastapi.tiangolo.com" class="external-link" target="_blank">FastAPI</a> applications, it was created by the same <a href="https://tiangolo.com/" class="external-link" target="_blank">author</a>. 😁
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 <a href="https://www.python.org/downloads/" class="external-link" target="_blank">version of Python</a>.
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 <a href="https://sqlmodel.tiangolo.com/virtual-environments/" class="external-link" target="_blank">virtual environment</a>, activate it, and then install SQLModel, for example with:
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 <a href="https://sqlmodel.tiangolo.com/databases/" target="_blank">SQLModel documentation</a>.
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
- /// info
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
- /// info
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
- /// info
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
- /// info
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 **sesion** will be assigned to the variable `session`.
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.38"
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 = mkdocs.utils.yaml_load(sponsors_data_path.read_text(encoding="utf-8"))
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 = ["mkdocs", "serve", "--dev-addr", "127.0.0.1:8008"]
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(["mkdocs", "build"], check=True)
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 mkdocs serve).
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"__ent{i}", annotation=t_var)
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)
@@ -3,7 +3,7 @@
3
3
  set -e
4
4
  set -x
5
5
 
6
- mypy sqlmodel
7
- mypy tests/test_select_typing.py
6
+ ty check sqlmodel
7
+ ty check tests/test_select_typing.py
8
8
  ruff check sqlmodel tests docs_src scripts
9
9
  ruff format sqlmodel tests docs_src scripts --check
@@ -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()