sqlalchemy-cratedb 0.41.0.dev2__tar.gz → 0.42.0__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 (171) hide show
  1. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/CHANGES.md +12 -1
  2. sqlalchemy_cratedb-0.42.0/CLAUDE.md +73 -0
  3. {sqlalchemy_cratedb-0.41.0.dev2/src/sqlalchemy_cratedb.egg-info → sqlalchemy_cratedb-0.42.0}/PKG-INFO +18 -15
  4. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/pyproject.toml +55 -74
  5. sqlalchemy_cratedb-0.42.0/setup.cfg +4 -0
  6. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/__init__.py +15 -0
  7. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/core14.py +1 -5
  8. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/core20.py +24 -6
  9. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compiler.py +3 -0
  10. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/dialect.py +38 -7
  11. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/sa_version.py +1 -0
  12. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/support/polyfill.py +1 -2
  13. sqlalchemy_cratedb-0.42.0/src/sqlalchemy_cratedb/util.py +27 -0
  14. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0/src/sqlalchemy_cratedb.egg-info}/PKG-INFO +18 -15
  15. sqlalchemy_cratedb-0.42.0/src/sqlalchemy_cratedb.egg-info/SOURCES.txt +45 -0
  16. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb.egg-info/requires.txt +16 -15
  17. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/tests/test_error_handling.py +5 -6
  18. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/advanced-querying.rst.txt +0 -335
  19. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/crud.rst.txt +0 -301
  20. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/data-types.rst.txt +0 -87
  21. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/dataframe.rst.txt +0 -258
  22. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/getting-started.rst.txt +0 -211
  23. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/index-all.rst.txt +0 -21
  24. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/index.rst.txt +0 -253
  25. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/inspection-reflection.rst.txt +0 -126
  26. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/install.rst.txt +0 -50
  27. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/migrate-from-crate-client.md.txt +0 -50
  28. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/overview.rst.txt +0 -761
  29. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/support.md.txt +0 -243
  30. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/working-with-types.rst.txt +0 -303
  31. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_static/bundle/main.js.LICENSE.txt +0 -27
  32. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_static/vendor/furo/scripts/furo.js.LICENSE.txt +0 -7
  33. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/output.txt +0 -13
  34. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt +0 -28
  35. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt +0 -1
  36. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/PyYAML-6.0.2.dist-info/top_level.txt +0 -2
  37. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/alabaster-0.7.16.dist-info/entry_points.txt +0 -3
  38. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/babel-2.16.0.dist-info/entry_points.txt +0 -20
  39. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/babel-2.16.0.dist-info/top_level.txt +0 -1
  40. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/certifi-2024.8.30.dist-info/top_level.txt +0 -1
  41. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/charset_normalizer-3.4.0.dist-info/entry_points.txt +0 -2
  42. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/charset_normalizer-3.4.0.dist-info/top_level.txt +0 -1
  43. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt +0 -27
  44. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/crate/theme/rtd/crate/static/bundle/main.js.LICENSE.txt +0 -27
  45. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/crate/theme/rtd/crate/static/vendor/furo/scripts/furo.js.LICENSE.txt +0 -7
  46. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/crate_docs_theme-0.36.1.dist-info/namespace_packages.txt +0 -1
  47. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/crate_docs_theme-0.36.1.dist-info/top_level.txt +0 -1
  48. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/README.txt +0 -17
  49. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamsa.txt +0 -162
  50. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamsb.txt +0 -126
  51. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamsc.txt +0 -29
  52. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamsn.txt +0 -96
  53. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamso.txt +0 -62
  54. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamsr.txt +0 -191
  55. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isobox.txt +0 -46
  56. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isocyr1.txt +0 -73
  57. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isocyr2.txt +0 -32
  58. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isodia.txt +0 -20
  59. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isogrk1.txt +0 -55
  60. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isogrk2.txt +0 -26
  61. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isogrk3.txt +0 -52
  62. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isogrk4-wide.txt +0 -49
  63. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isogrk4.txt +0 -8
  64. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isolat1.txt +0 -68
  65. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isolat2.txt +0 -128
  66. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomfrk-wide.txt +0 -58
  67. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomfrk.txt +0 -11
  68. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomopf-wide.txt +0 -32
  69. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomopf.txt +0 -13
  70. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomscr-wide.txt +0 -58
  71. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomscr.txt +0 -17
  72. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isonum.txt +0 -82
  73. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isopub.txt +0 -90
  74. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isotech.txt +0 -168
  75. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/mmlalias.txt +0 -554
  76. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/mmlextra-wide.txt +0 -113
  77. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/mmlextra.txt +0 -87
  78. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/s5defs.txt +0 -68
  79. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/xhtml1-lat1.txt +0 -102
  80. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/xhtml1-special.txt +0 -37
  81. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/xhtml1-symbol.txt +0 -130
  82. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/writers/html4css1/template.txt +0 -8
  83. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/writers/html5_polyglot/template.txt +0 -8
  84. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/writers/pep_html/template.txt +0 -25
  85. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/writers/s5_html/themes/README.txt +0 -6
  86. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils-0.19.dist-info/COPYING.txt +0 -157
  87. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils-0.19.dist-info/entry_points.txt +0 -3
  88. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils-0.19.dist-info/top_level.txt +0 -1
  89. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils_stubs-0.0.22.dist-info/top_level.txt +0 -1
  90. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/furo/theme/furo/static/scripts/furo.js.LICENSE.txt +0 -7
  91. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/furo-2024.5.6.dist-info/entry_points.txt +0 -2
  92. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/imagesize-1.4.1.dist-info/top_level.txt +0 -1
  93. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/importlib_metadata-8.5.0.dist-info/top_level.txt +0 -1
  94. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/jinja2-3.1.4.dist-info/LICENSE.txt +0 -28
  95. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/jinja2-3.1.4.dist-info/entry_points.txt +0 -3
  96. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/linkify_it_py-2.0.3.dist-info/top_level.txt +0 -1
  97. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/livereload-2.7.0.dist-info/entry_points.txt +0 -2
  98. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/livereload-2.7.0.dist-info/top_level.txt +0 -1
  99. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/markdown_it_py-3.0.0.dist-info/entry_points.txt +0 -3
  100. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/myst_parser-3.0.1.dist-info/entry_points.txt +0 -10
  101. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/pip/_vendor/vendor.txt +0 -18
  102. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/pip-24.3.1.dist-info/AUTHORS.txt +0 -799
  103. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/pip-24.3.1.dist-info/LICENSE.txt +0 -20
  104. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/pip-24.3.1.dist-info/entry_points.txt +0 -3
  105. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/pip-24.3.1.dist-info/top_level.txt +0 -1
  106. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/pygments-2.18.0.dist-info/entry_points.txt +0 -2
  107. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/requests-2.32.3.dist-info/top_level.txt +0 -1
  108. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/setuptools-58.1.0.dist-info/entry_points.txt +0 -56
  109. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/setuptools-58.1.0.dist-info/top_level.txt +0 -3
  110. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/snowballstemmer-2.2.0.dist-info/top_level.txt +0 -1
  111. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinx-7.1.2.dist-info/entry_points.txt +0 -6
  112. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinx_autobuild-2021.3.14.dist-info/entry_points.txt +0 -3
  113. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinx_basic_ng-1.0.0b2.dist-info/entry_points.txt +0 -2
  114. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinx_basic_ng-1.0.0b2.dist-info/top_level.txt +0 -1
  115. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinx_copybutton-0.5.2.dist-info/top_level.txt +0 -1
  116. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinx_design/compiled/material-icons_VERSION.txt +0 -3
  117. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinx_design_elements-0.4.0.dist-info/top_level.txt +0 -1
  118. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinx_sitemap-2.6.0.dist-info/top_level.txt +0 -1
  119. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinx_togglebutton-0.3.2.dist-info/top_level.txt +0 -1
  120. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/namespace_packages.txt +0 -1
  121. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/top_level.txt +0 -1
  122. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinxcontrib_mermaid-1.0.0.dist-info/top_level.txt +0 -1
  123. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinxcontrib_plantuml-0.30.dist-info/namespace_packages.txt +0 -1
  124. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinxcontrib_plantuml-0.30.dist-info/top_level.txt +0 -1
  125. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinxext_opengraph-0.9.1.dist-info/top_level.txt +0 -1
  126. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/tornado/test/static/robots.txt +0 -2
  127. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/tornado/test/static_foo.txt +0 -2
  128. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/tornado-6.4.1.dist-info/top_level.txt +0 -1
  129. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/uc_micro_py-1.0.3.dist-info/top_level.txt +0 -1
  130. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/urllib3-2.2.3.dist-info/licenses/LICENSE.txt +0 -21
  131. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/wheel/vendored/vendor.txt +0 -1
  132. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/wheel-0.45.0.dist-info/LICENSE.txt +0 -21
  133. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/wheel-0.45.0.dist-info/entry_points.txt +0 -6
  134. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/zipp-3.21.0.dist-info/top_level.txt +0 -1
  135. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/common-build/requirements.txt +0 -12
  136. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/docs/_extra/robots.txt +0 -2
  137. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/docs/requirements.txt +0 -2
  138. sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/helpers/preview/etc/requirements.txt +0 -3
  139. sqlalchemy_cratedb-0.41.0.dev2/docs/_extra/robots.txt +0 -4
  140. sqlalchemy_cratedb-0.41.0.dev2/setup.cfg +0 -7
  141. sqlalchemy_cratedb-0.41.0.dev2/src/sqlalchemy_cratedb.egg-info/SOURCES.txt +0 -166
  142. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/CODE_OF_CONDUCT.md +0 -0
  143. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/CONTRIBUTING.md +0 -0
  144. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/DEVELOP.md +0 -0
  145. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/LICENSE +0 -0
  146. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/MANIFEST.in +0 -0
  147. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/NOTICE +0 -0
  148. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/README.md +0 -0
  149. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/backlog.md +0 -0
  150. {sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build → sqlalchemy_cratedb-0.42.0/docs/_extra}/robots.txt +0 -0
  151. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/docs/requirements.txt +0 -0
  152. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/setup.py +0 -0
  153. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/__init__.py +0 -0
  154. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/api13.py +0 -0
  155. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/core10.py +0 -0
  156. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/predicate.py +0 -0
  157. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/support/__init__.py +0 -0
  158. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/support/pandas.py +0 -0
  159. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/support/util.py +0 -0
  160. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/type/__init__.py +0 -0
  161. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/type/array.py +0 -0
  162. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/type/geo.py +0 -0
  163. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/type/object.py +0 -0
  164. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/type/vector.py +0 -0
  165. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb.egg-info/dependency_links.txt +0 -0
  166. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb.egg-info/entry_points.txt +0 -0
  167. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb.egg-info/top_level.txt +0 -0
  168. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/tests/test_schema.py +0 -0
  169. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/tests/test_support_pandas.py +0 -0
  170. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/tests/test_support_polyfill.py +0 -0
  171. {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/tests/test_support_util.py +0 -0
@@ -1,6 +1,17 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 2026/05/28 0.42.0
4
+ - Added support for SQL Alchemy 2.1
5
+ - Added support for Python 3.14
6
+ - Added canonical [PostgreSQL client parameter `sslmode`], implementing
7
+ `sslmode=require` to connect to SSL-enabled CrateDB instances without
8
+ verifying the host name. The previous `ssl=true` parameter is flagged
9
+ for deprecation, therefore `sslmode` takes precedence while both
10
+ options coexist.
11
+
12
+ [PostgreSQL client parameter `sslmode`]: https://www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-PROTECTION
13
+
14
+ ## 2025/01/30 0.41.0
4
15
  - Dependencies: Updated to `crate-2.0.0`, which uses `orjson` for JSON marshalling
5
16
 
6
17
  ## 2024/11/04 0.40.1
@@ -0,0 +1,73 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ `sqlalchemy-cratedb` is a SQLAlchemy dialect for CrateDB, a distributed SQL database. It supports SQLAlchemy 1.3 through 2.1 (with ongoing 2.1 compatibility work on the current branch).
8
+
9
+ ## Development Setup
10
+
11
+ ```bash
12
+ source bootstrap.sh # Creates .venv with Python 3.11, installs all deps in editable mode
13
+ ```
14
+
15
+ Environment variables that influence bootstrap:
16
+ - `CRATEDB_VERSION` (default: `5.5.1`) — CrateDB Docker image version
17
+ - `SQLALCHEMY_VERSION` (default: `<2.2`) — SQLAlchemy version constraint
18
+ - `PIP_ALLOW_PRERELEASE=true` — allow pre-release packages
19
+
20
+ ## Common Commands
21
+
22
+ ```bash
23
+ poe format # Auto-format code (ruff + black)
24
+ poe lint # Run linters (ruff, validate-pyproject)
25
+ poe test # Run pytest + integration tests
26
+ poe check # lint + test combined
27
+
28
+ # Run specific tests
29
+ pytest tests/dict_test.py
30
+ pytest -k SqlAlchemyCompilerTest
31
+ pytest -k test_score
32
+
33
+ # Run integration/doctests
34
+ python -m unittest -vvv tests/integration.py
35
+ ```
36
+
37
+ Tests require a live CrateDB instance via Docker (managed automatically by `cratedb_toolkit.testing.testcontainers`).
38
+
39
+ ## Architecture
40
+
41
+ ### Source layout (`src/sqlalchemy_cratedb/`)
42
+
43
+ - **`dialect.py`** — Core dialect: type mappings, Date/DateTime handling, schema reflection
44
+ - **`compiler.py`** — SQL/DDL compilation: `CrateDDLCompiler`, `CrateTypeCompiler`, `CrateIdentifierPreparer`, and `rewrite_update()` for partial object updates
45
+ - **`predicate.py`** — `match()` predicate for full-text search
46
+ - **`sa_version.py`** — Version detection; exports `SA_VERSION`, `SA_1_4`, `SA_2_0`, `SA_2_1` constants
47
+ - **`compat/`** — Multi-version SQLAlchemy compatibility: `core10.py`, `core14.py`, `core20.py`, `core21.py`, `api13.py`
48
+ - **`type/`** — Custom CrateDB types: `ObjectType` (JSON objects), `ObjectArray`, `FloatVector`, `Geopoint`, `Geoshape`
49
+ - **`support/`** — Integrations and polyfills: `pandas.py` (bulk insert), `polyfill.py` (refresh-after-DML, uniqueness, autoincrement timestamps), `util.py`
50
+
51
+ ### Key architectural patterns
52
+
53
+ **Multi-version compatibility:** The `compat/` directory contains separate modules for each major SQLAlchemy version. `sa_version.py` detects the installed version at runtime using `verlib2`, and code conditionally imports from the appropriate compat module. When adding features, check whether they need version-specific handling.
54
+
55
+ **Custom types:** CrateDB types (ObjectType, FloatVector, etc.) implement SQLAlchemy's bind/result processor pattern — `bind_processor()` converts Python → SQL, `result_processor()` converts SQL → Python. The `CrateTypeCompiler` generates the SQL type strings.
56
+
57
+ **Update rewriting:** `compiler.py::rewrite_update()` transforms partial dictionary updates on `ObjectType` columns into CrateDB's subscript assignment syntax (e.g., `obj['key'] = value`).
58
+
59
+ **Polyfills:** `support/polyfill.py` monkey-patches SQLAlchemy internals to add features CrateDB doesn't natively support (e.g., `refresh_after_dml`, `uniqueness_strategy`).
60
+
61
+ ### Testing
62
+
63
+ Tests in `tests/` follow two patterns:
64
+ - `*_test.py` files: unit/integration tests using pytest with a live CrateDB instance
65
+ - `tests/integration.py`: doctests for documentation examples, run with `unittest`
66
+
67
+ The `conftest.py` provides a session-scoped `cratedb_service` fixture that starts CrateDB via Docker containers.
68
+
69
+ ## Code Style
70
+
71
+ - Line length: 100 characters (ruff + black)
72
+ - Ruff rules enforced: A, B, C4, E, ERA, F, I, PD, RET, S, T20, W, YTT
73
+ - Mypy strict mode is configured but not always enforced in CI
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: sqlalchemy-cratedb
3
- Version: 0.41.0.dev2
3
+ Version: 0.42.0
4
4
  Summary: SQLAlchemy dialect for CrateDB.
5
5
  Author-email: "Crate.io" <office@crate.io>
6
6
  License: Apache License 2.0
@@ -34,6 +34,7 @@ Classifier: Programming Language :: Python :: 3.10
34
34
  Classifier: Programming Language :: Python :: 3.11
35
35
  Classifier: Programming Language :: Python :: 3.12
36
36
  Classifier: Programming Language :: Python :: 3.13
37
+ Classifier: Programming Language :: Python :: 3.14
37
38
  Classifier: Programming Language :: Python :: Implementation :: CPython
38
39
  Classifier: Programming Language :: Python :: Implementation :: PyPy
39
40
  Classifier: Programming Language :: SQL
@@ -64,35 +65,37 @@ Description-Content-Type: text/markdown
64
65
  License-File: LICENSE
65
66
  License-File: NOTICE
66
67
  Requires-Dist: backports.zoneinfo<1; python_version < "3.9"
67
- Requires-Dist: crate<3,>=2.0.0.dev6
68
+ Requires-Dist: crate<3,>=2
68
69
  Requires-Dist: geojson<4,>=2.5
70
+ Requires-Dist: importlib-metadata; python_version < "3.8"
69
71
  Requires-Dist: importlib-resources; python_version < "3.9"
70
- Requires-Dist: sqlalchemy<2.1,>=1
71
- Requires-Dist: verlib2==0.2
72
+ Requires-Dist: sqlalchemy<2.2,>=1
73
+ Requires-Dist: verlib2<0.4
72
74
  Provides-Extra: all
73
75
  Requires-Dist: sqlalchemy-cratedb[vector]; extra == "all"
74
76
  Provides-Extra: develop
75
- Requires-Dist: mypy<1.15; extra == "develop"
76
- Requires-Dist: poethepoet<0.33; extra == "develop"
77
- Requires-Dist: pyproject-fmt<2.6; extra == "develop"
78
- Requires-Dist: ruff<0.10; extra == "develop"
79
- Requires-Dist: validate-pyproject<0.24; extra == "develop"
77
+ Requires-Dist: mypy<1.20; extra == "develop"
78
+ Requires-Dist: poethepoet<1; extra == "develop"
79
+ Requires-Dist: pyproject-fmt<3; extra == "develop"
80
+ Requires-Dist: ruff<0.16; extra == "develop"
81
+ Requires-Dist: validate-pyproject<1; extra == "develop"
80
82
  Provides-Extra: doc
81
83
  Requires-Dist: crate-docs-theme>=0.26.5; extra == "doc"
82
- Requires-Dist: sphinx<9,>=3.5; extra == "doc"
84
+ Requires-Dist: sphinx<10,>=3.5; extra == "doc"
83
85
  Provides-Extra: release
84
86
  Requires-Dist: build<2; extra == "release"
85
87
  Requires-Dist: twine<7; extra == "release"
86
88
  Provides-Extra: test
87
89
  Requires-Dist: cratedb-toolkit[testing]; extra == "test"
88
- Requires-Dist: dask[dataframe]; python_version < "3.13" and extra == "test"
89
- Requires-Dist: pandas<2.3; extra == "test"
90
+ Requires-Dist: dask[dataframe]; extra == "test"
91
+ Requires-Dist: pandas<2.4; extra == "test"
90
92
  Requires-Dist: pueblo>=0.0.7; extra == "test"
91
- Requires-Dist: pytest<9; extra == "test"
92
- Requires-Dist: pytest-cov<7; extra == "test"
93
+ Requires-Dist: pytest<10; extra == "test"
94
+ Requires-Dist: pytest-cov<8; extra == "test"
93
95
  Requires-Dist: pytest-mock<4; extra == "test"
94
96
  Provides-Extra: vector
95
97
  Requires-Dist: numpy; extra == "vector"
98
+ Dynamic: license-file
96
99
 
97
100
  # SQLAlchemy dialect for CrateDB
98
101
 
@@ -7,7 +7,6 @@ requires = [
7
7
 
8
8
  [project]
9
9
  name = "sqlalchemy-cratedb"
10
- version = "0.41.0.dev2"
11
10
  description = "SQLAlchemy dialect for CrateDB."
12
11
  readme = "README.md"
13
12
  keywords = [
@@ -52,6 +51,7 @@ classifiers = [
52
51
  "Programming Language :: Python :: 3.11",
53
52
  "Programming Language :: Python :: 3.12",
54
53
  "Programming Language :: Python :: 3.13",
54
+ "Programming Language :: Python :: 3.14",
55
55
  "Programming Language :: Python :: Implementation :: CPython",
56
56
  "Programming Language :: Python :: Implementation :: PyPy",
57
57
  "Programming Language :: SQL",
@@ -78,30 +78,31 @@ classifiers = [
78
78
  "Topic :: Text Processing",
79
79
  "Topic :: Utilities",
80
80
  ]
81
- #dynamic = [
82
- # "version",
83
- #]
81
+ dynamic = [
82
+ "version",
83
+ ]
84
84
  dependencies = [
85
85
  "backports.zoneinfo<1; python_version<'3.9'",
86
- "crate>=2.0.0.dev6,<3",
87
- "geojson<4,>=2.5",
86
+ "crate>=2,<3",
87
+ "geojson>=2.5,<4",
88
+ "importlib-metadata; python_version<'3.8'",
88
89
  "importlib-resources; python_version<'3.9'",
89
- "sqlalchemy<2.1,>=1",
90
- "verlib2==0.2",
90
+ "sqlalchemy>=1,<2.2",
91
+ "verlib2<0.4",
91
92
  ]
92
93
  optional-dependencies.all = [
93
94
  "sqlalchemy-cratedb[vector]",
94
95
  ]
95
96
  optional-dependencies.develop = [
96
- "mypy<1.15",
97
- "poethepoet<0.33",
98
- "pyproject-fmt<2.6",
99
- "ruff<0.10",
100
- "validate-pyproject<0.24",
97
+ "mypy<1.20",
98
+ "poethepoet<1",
99
+ "pyproject-fmt<3",
100
+ "ruff<0.16",
101
+ "validate-pyproject<1",
101
102
  ]
102
103
  optional-dependencies.doc = [
103
104
  "crate-docs-theme>=0.26.5",
104
- "sphinx>=3.5,<9",
105
+ "sphinx>=3.5,<10",
105
106
  ]
106
107
  optional-dependencies.release = [
107
108
  "build<2",
@@ -109,11 +110,11 @@ optional-dependencies.release = [
109
110
  ]
110
111
  optional-dependencies.test = [
111
112
  "cratedb-toolkit[testing]",
112
- "dask[dataframe]; python_version<'3.13'",
113
- "pandas<2.3",
113
+ "dask[dataframe]",
114
+ "pandas<2.4",
114
115
  "pueblo>=0.0.7",
115
- "pytest<9",
116
- "pytest-cov<7",
116
+ "pytest<10",
117
+ "pytest-cov<8",
117
118
  "pytest-mock<4",
118
119
  ]
119
120
  optional-dependencies.vector = [
@@ -130,10 +131,7 @@ line-length = 100
130
131
 
131
132
  [tool.ruff]
132
133
  line-length = 100
133
-
134
- extend-exclude = [
135
- ]
136
-
134
+ extend-exclude = []
137
135
  lint.select = [
138
136
  # Builtins
139
137
  "A",
@@ -161,7 +159,6 @@ lint.select = [
161
159
  # flake8-2020
162
160
  "YTT",
163
161
  ]
164
-
165
162
  lint.extend-ignore = [
166
163
  # zip() without an explicit strict= parameter
167
164
  "B905",
@@ -169,8 +166,6 @@ lint.extend-ignore = [
169
166
  "C402",
170
167
  # Unnecessary `map` usage (rewrite using a `set` comprehension)
171
168
  "C417",
172
- # df is a bad variable name. Be kinder to your future self.
173
- "PD901",
174
169
  # Unnecessary variable assignment before `return` statement
175
170
  "RET504",
176
171
  # Unnecessary `elif` after `return` statement
@@ -180,11 +175,11 @@ lint.extend-ignore = [
180
175
  # Possible SQL injection vector through string-based query construction
181
176
  "S608",
182
177
  ]
183
-
184
178
  lint.per-file-ignores."examples/*" = [
185
- "T201", # Allow `print`
179
+ "E501", # Line too long
180
+ "ERA001", # Found commented-out code
181
+ "T201", # Allow `print`
186
182
  ]
187
-
188
183
  lint.per-file-ignores."tests/*" = [
189
184
  "S101", # Allow use of `assert`, and `print`
190
185
  "S608", # Possible SQL injection vector through string-based query construction
@@ -192,55 +187,49 @@ lint.per-file-ignores."tests/*" = [
192
187
  "W293", # Blank line contains whitespace
193
188
  ]
194
189
 
195
- [tool.pytest.ini_options]
196
- addopts = """
190
+ [tool.pytest]
191
+ ini_options.addopts = """
197
192
  -rfEXs -p pytester --strict-markers --verbosity=3
198
193
  --cov --cov-report=term-missing --cov-report=xml
199
194
  """
200
- minversion = "2.0"
201
- log_level = "DEBUG"
202
- log_cli_level = "DEBUG"
203
- log_format = "%(asctime)-15s [%(name)-36s] %(levelname)-8s: %(message)s"
204
- pythonpath = [
195
+ ini_options.minversion = "2.0"
196
+ ini_options.log_level = "DEBUG"
197
+ ini_options.log_cli_level = "DEBUG"
198
+ ini_options.log_format = "%(asctime)-15s [%(name)-36s] %(levelname)-8s: %(message)s"
199
+ ini_options.pythonpath = [
205
200
  "src",
206
201
  ]
207
- testpaths = [
202
+ ini_options.testpaths = [
208
203
  "examples",
209
204
  "sqlalchemy_cratedb",
210
205
  "tests",
211
206
  ]
212
- python_files = [
207
+ ini_options.python_files = [
213
208
  "test_*.py",
214
209
  "*_test.py",
215
210
  ]
216
- xfail_strict = true
217
- markers = [
218
- ]
219
-
220
- [tool.coverage.paths]
221
- source = [
222
- "src/",
223
- ]
211
+ ini_options.xfail_strict = true
212
+ ini_options.markers = []
224
213
 
225
- [tool.coverage.run]
226
- branch = false
227
- omit = [
214
+ [tool.coverage]
215
+ run.branch = false
216
+ run.omit = [
228
217
  "tests/*",
229
218
  ]
230
-
231
- [tool.coverage.report]
232
- fail_under = 0
233
- show_missing = true
234
- exclude_lines = [
219
+ paths.source = [
220
+ "src/",
221
+ ]
222
+ report.exclude_lines = [
235
223
  "# pragma: no cover",
236
224
  "raise NotImplemented",
237
225
  ]
226
+ report.fail_under = 0
227
+ report.show_missing = true
238
228
 
239
229
  [tool.mypy]
240
230
  mypy_path = "src"
241
231
  packages = [ "sqlalchemy_cratedb" ]
242
- exclude = [
243
- ]
232
+ exclude = []
244
233
  check_untyped_defs = true
245
234
  explicit_package_bases = true
246
235
  ignore_missing_imports = true
@@ -248,49 +237,41 @@ implicit_optional = true
248
237
  install_types = true
249
238
  namespace_packages = true
250
239
  non_interactive = true
251
- # Needed until `mypy-0.990` for `ConverterDefinition` in `converter.py`.
252
- # https://github.com/python/mypy/issues/731#issuecomment-1260976955
253
- # enable_recursive_aliases = true
254
-
255
- [tool.versioningit.vcs]
256
- method = "git"
257
- default-tag = "0.0.0"
258
240
 
241
+ [tool.poe]
259
242
  # ===================
260
243
  # Tasks configuration
261
244
  # ===================
262
245
 
263
- [tool.poe.tasks]
264
-
265
- check = [
246
+ tasks.check = [
266
247
  "lint",
267
248
  "test",
268
249
  ]
269
-
270
- format = [
250
+ tasks.format = [
271
251
  # Format project metadata.
272
252
  { cmd = "pyproject-fmt --keep-full-version pyproject.toml" },
273
-
274
253
  # Format code.
275
254
  # Configure Ruff not to auto-fix a few items that are useful in workbench mode.
276
255
  # e.g.: unused imports (F401), unused variables (F841), `print` statements (T201), commented-out code (ERA001)
277
256
  { cmd = "ruff format" },
278
257
  { cmd = "ruff check --fix --ignore=ERA --ignore=F401 --ignore=F841 --ignore=T20 --ignore=ERA001" },
279
258
  ]
280
-
281
- lint = [
259
+ tasks.lint = [
282
260
  { cmd = "ruff format --check" },
283
261
  { cmd = "ruff check" },
284
262
  { cmd = "validate-pyproject pyproject.toml" },
285
263
  # { cmd = "mypy" },
286
264
  ]
287
-
288
- release = [
265
+ tasks.release = [
289
266
  { cmd = "python -m build" },
290
267
  { cmd = "twine upload --skip-existing dist/*" },
291
268
  ]
292
-
293
- test = [
269
+ tasks.test = [
294
270
  { cmd = "pytest" },
295
271
  { cmd = "python -m unittest -vvv tests/integration.py" },
296
272
  ]
273
+
274
+ [tool.versioningit]
275
+ vcs.method = "git-archive"
276
+ vcs.default-tag = "0.0.0"
277
+ vcs.describe-subst = "$Format:%(describe:tags)$"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -52,7 +52,22 @@ if SA_VERSION < SA_1_4:
52
52
  monkeypatch_add_exec_driver_sql()
53
53
 
54
54
 
55
+ try:
56
+ from importlib.metadata import PackageNotFoundError, version
57
+ except (ImportError, ModuleNotFoundError): # pragma:nocover
58
+ from importlib_metadata import ( # type: ignore[assignment,no-redef,unused-ignore]
59
+ PackageNotFoundError,
60
+ version,
61
+ )
62
+
63
+ try:
64
+ __version__ = version("sqlalchemy-cratedb")
65
+ except PackageNotFoundError: # pragma: no cover
66
+ __version__ = "unknown"
67
+
68
+
55
69
  __all__ = [
70
+ __version__,
56
71
  dialect,
57
72
  FloatVector,
58
73
  Geopoint,
@@ -317,11 +317,7 @@ def _get_crud_params(compiler, stmt, compile_state, **kw):
317
317
  _column_as_key,
318
318
  kw,
319
319
  )
320
- elif (
321
- not values
322
- and compiler.for_executemany # noqa: W503
323
- and compiler.dialect.supports_default_metavalue # noqa: W503
324
- ):
320
+ elif not values and compiler.for_executemany and compiler.dialect.supports_default_metavalue:
325
321
  # convert an "INSERT DEFAULT VALUES"
326
322
  # into INSERT (firstcol) VALUES (DEFAULT) which can be turned
327
323
  # into an in-place multi values. This supports
@@ -46,18 +46,31 @@ from sqlalchemy.sql.dml import DMLState, _DMLColumnElement
46
46
  from sqlalchemy.sql.dml import isinsert as _compile_state_isinsert
47
47
 
48
48
  from sqlalchemy_cratedb.compiler import CrateCompiler
49
+ from sqlalchemy_cratedb.sa_version import SA_2_1, SA_VERSION
49
50
 
50
51
 
51
52
  class CrateCompilerSA20(CrateCompiler):
52
- def visit_update(self, update_stmt, **kw):
53
+ def visit_update(self, update_stmt, visiting_cte=None, **kw):
53
54
  compile_state = update_stmt._compile_state_factory(update_stmt, self, **kw)
54
55
  update_stmt = compile_state.statement
55
56
 
56
- # [20] CrateDB patch.
57
+ # CrateDB patch.
57
58
  if not compile_state._dict_parameters and not hasattr(update_stmt, "_crate_specific"):
58
- return super().visit_update(update_stmt, **kw)
59
+ if SA_VERSION >= SA_2_1:
60
+ return super().visit_update(update_stmt, visiting_cte=visiting_cte, **kw)
61
+ else:
62
+ return super().visit_update(update_stmt, **kw)
63
+
64
+ # SA 2.1 introduced visiting_cte for CTE support.
65
+ if SA_VERSION >= SA_2_1:
66
+ if visiting_cte is not None:
67
+ kw["visiting_cte"] = visiting_cte
68
+ toplevel = False
69
+ else:
70
+ toplevel = not self.stack
71
+ else:
72
+ toplevel = not self.stack
59
73
 
60
- toplevel = not self.stack
61
74
  if toplevel:
62
75
  self.isupdate = True
63
76
  if not self.dml_compile_state:
@@ -152,7 +165,11 @@ class CrateCompilerSA20(CrateCompiler):
152
165
  if t:
153
166
  text += " WHERE " + t
154
167
 
155
- limit_clause = self.update_limit_clause(update_stmt)
168
+ # SA 2.1 renamed update_limit_clause to update_post_criteria_clause.
169
+ if SA_VERSION >= SA_2_1:
170
+ limit_clause = self.update_post_criteria_clause(update_stmt, **kw)
171
+ else:
172
+ limit_clause = self.update_limit_clause(update_stmt)
156
173
  if limit_clause:
157
174
  text += " " + limit_clause
158
175
 
@@ -275,7 +292,8 @@ def _get_crud_params(
275
292
  assert mp is not None
276
293
  spd = mp[0]
277
294
  stmt_parameter_tuples = list(spd.items())
278
- elif compile_state._ordered_values:
295
+ elif SA_VERSION < SA_2_1 and compile_state._ordered_values:
296
+ # _ordered_values was removed in SA 2.1.
279
297
  spd = compile_state._dict_parameters
280
298
  stmt_parameter_tuples = compile_state._ordered_values
281
299
  elif compile_state._dict_parameters:
@@ -214,6 +214,9 @@ class CrateTypeCompiler(compiler.GenericTypeCompiler):
214
214
  def visit_DECIMAL(self, type_, **kw):
215
215
  return "DOUBLE"
216
216
 
217
+ def visit_double(self, type_, **kw):
218
+ return "DOUBLE"
219
+
217
220
  def visit_BIGINT(self, type_, **kw):
218
221
  return "LONG"
219
222
 
@@ -20,10 +20,12 @@
20
20
  # software solely pursuant to the terms of the relevant commercial agreement.
21
21
 
22
22
  import logging
23
+ import warnings
23
24
  from datetime import date, datetime
24
25
 
25
26
  from sqlalchemy import types as sqltypes
26
27
  from sqlalchemy.engine import default, reflection
28
+ from sqlalchemy.exc import SQLAlchemyError
27
29
  from sqlalchemy.sql import functions
28
30
  from sqlalchemy.util import asbool, to_list
29
31
 
@@ -34,6 +36,7 @@ from .compiler import (
34
36
  )
35
37
  from .sa_version import SA_1_4, SA_2_0, SA_VERSION
36
38
  from .type import FloatVector, ObjectArray, ObjectType
39
+ from .util import SSLMode
37
40
 
38
41
  TYPES_MAP = {
39
42
  "boolean": sqltypes.Boolean,
@@ -160,7 +163,6 @@ colspecs = {
160
163
  sqltypes.TIMESTAMP: DateTime,
161
164
  }
162
165
 
163
-
164
166
  if SA_VERSION >= SA_2_0:
165
167
  from .compat.core20 import CrateCompilerSA20
166
168
 
@@ -226,12 +228,41 @@ class CrateDialect(default.DefaultDialect):
226
228
  if "servers" in kwargs:
227
229
  server = kwargs.pop("servers")
228
230
  servers = to_list(server)
229
- if servers:
230
- use_ssl = asbool(kwargs.pop("ssl", False))
231
- if use_ssl:
232
- servers = ["https://" + server for server in servers]
233
- return self.dbapi.connect(servers=servers, **kwargs)
234
- return self.dbapi.connect(**kwargs)
231
+
232
+ # Process legacy SSL option `ssl`.
233
+ if "ssl" in kwargs:
234
+ warnings.warn(
235
+ "The `ssl=true` option will be deprecated, "
236
+ "please use `sslmode=require` going forward.",
237
+ DeprecationWarning,
238
+ stacklevel=2,
239
+ )
240
+ use_ssl = asbool(kwargs.pop("ssl", False))
241
+
242
+ # Process new SSL option `sslmode`.
243
+ # Please consult https://www.postgresql.org/docs/18/libpq-connect.html.
244
+ if "sslmode" in kwargs:
245
+ try:
246
+ sslmode = SSLMode.parse(kwargs.pop("sslmode"))
247
+ except AttributeError as exc:
248
+ modes = ", ".join(SSLMode.modes)
249
+ raise SQLAlchemyError(
250
+ "`sslmode` parameter must be one of: {}".format(modes)
251
+ ) from exc
252
+ if sslmode < SSLMode.allow:
253
+ use_ssl = False
254
+ else:
255
+ use_ssl = True
256
+ if sslmode >= SSLMode.verify_ca:
257
+ kwargs["verify_ssl_cert"] = True
258
+ else:
259
+ kwargs["verify_ssl_cert"] = False
260
+
261
+ if not servers:
262
+ servers = [self.dbapi.http.Client.default_server.replace("http://", "")]
263
+ if use_ssl:
264
+ servers = ["https://" + server for server in servers]
265
+ return self.dbapi.connect(servers=servers, **kwargs)
235
266
 
236
267
  def do_execute(self, cursor, statement, parameters, context=None):
237
268
  """
@@ -26,3 +26,4 @@ SA_VERSION = Version(sa.__version__)
26
26
 
27
27
  SA_1_4 = Version("1.4.0b1")
28
28
  SA_2_0 = Version("2.0.0")
29
+ SA_2_1 = Version("2.1.0b1")
@@ -56,11 +56,10 @@ def check_uniqueness_factory(sa_entity, *attribute_names):
56
56
  stmt = stmt.filter(
57
57
  getattr(sa_entity, attribute_name) == getattr(target, attribute_name)
58
58
  )
59
- stmt = stmt.compile(bind=connection.engine)
60
59
  results = connection.execute(stmt)
61
60
  if results.rowcount > 0:
62
61
  raise IntegrityError(
63
- statement=stmt,
62
+ statement=str(stmt),
64
63
  params=[],
65
64
  orig=Exception(
66
65
  f"DuplicateKeyException in table '{target.__tablename__}' "
@@ -0,0 +1,27 @@
1
+ import enum
2
+
3
+ from sqlalchemy.util import classproperty
4
+
5
+
6
+ class SSLMode(enum.IntEnum):
7
+ """
8
+ SSLMode class from asyncpg, with a little improvement.
9
+ https://github.com/MagicStack/asyncpg/blob/v0.31.0/asyncpg/connect_utils.py#L36-L48
10
+ """
11
+
12
+ disable = 0
13
+ allow = 1
14
+ prefer = 2
15
+ require = 3
16
+ verify_ca = 4
17
+ verify_full = 5
18
+
19
+ @classmethod
20
+ def parse(cls, sslmode):
21
+ if isinstance(sslmode, cls):
22
+ return sslmode
23
+ return getattr(cls, sslmode.replace("-", "_"))
24
+
25
+ @classproperty
26
+ def modes(cls):
27
+ return [m.name.replace("_", "-") for m in cls]