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.
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/CHANGES.md +12 -1
- sqlalchemy_cratedb-0.42.0/CLAUDE.md +73 -0
- {sqlalchemy_cratedb-0.41.0.dev2/src/sqlalchemy_cratedb.egg-info → sqlalchemy_cratedb-0.42.0}/PKG-INFO +18 -15
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/pyproject.toml +55 -74
- sqlalchemy_cratedb-0.42.0/setup.cfg +4 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/__init__.py +15 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/core14.py +1 -5
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/core20.py +24 -6
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compiler.py +3 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/dialect.py +38 -7
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/sa_version.py +1 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/support/polyfill.py +1 -2
- sqlalchemy_cratedb-0.42.0/src/sqlalchemy_cratedb/util.py +27 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0/src/sqlalchemy_cratedb.egg-info}/PKG-INFO +18 -15
- sqlalchemy_cratedb-0.42.0/src/sqlalchemy_cratedb.egg-info/SOURCES.txt +45 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb.egg-info/requires.txt +16 -15
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/tests/test_error_handling.py +5 -6
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/advanced-querying.rst.txt +0 -335
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/crud.rst.txt +0 -301
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/data-types.rst.txt +0 -87
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/dataframe.rst.txt +0 -258
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/getting-started.rst.txt +0 -211
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/index-all.rst.txt +0 -21
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/index.rst.txt +0 -253
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/inspection-reflection.rst.txt +0 -126
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/install.rst.txt +0 -50
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/migrate-from-crate-client.md.txt +0 -50
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/overview.rst.txt +0 -761
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/support.md.txt +0 -243
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_sources/working-with-types.rst.txt +0 -303
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_static/bundle/main.js.LICENSE.txt +0 -27
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/_static/vendor/furo/scripts/furo.js.LICENSE.txt +0 -7
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build/output.txt +0 -13
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/README.txt +0 -17
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamsa.txt +0 -162
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamsb.txt +0 -126
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamsc.txt +0 -29
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamsn.txt +0 -96
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamso.txt +0 -62
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isoamsr.txt +0 -191
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isobox.txt +0 -46
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isocyr1.txt +0 -73
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isocyr2.txt +0 -32
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isodia.txt +0 -20
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isogrk1.txt +0 -55
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isogrk2.txt +0 -26
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isogrk3.txt +0 -52
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isogrk4-wide.txt +0 -49
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isogrk4.txt +0 -8
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isolat1.txt +0 -68
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isolat2.txt +0 -128
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomfrk-wide.txt +0 -58
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomfrk.txt +0 -11
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomopf-wide.txt +0 -32
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomopf.txt +0 -13
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomscr-wide.txt +0 -58
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isomscr.txt +0 -17
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isonum.txt +0 -82
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isopub.txt +0 -90
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/isotech.txt +0 -168
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/mmlalias.txt +0 -554
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/mmlextra-wide.txt +0 -113
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/mmlextra.txt +0 -87
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/s5defs.txt +0 -68
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/xhtml1-lat1.txt +0 -102
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/xhtml1-special.txt +0 -37
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/parsers/rst/include/xhtml1-symbol.txt +0 -130
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/writers/html4css1/template.txt +0 -8
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/writers/html5_polyglot/template.txt +0 -8
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/writers/pep_html/template.txt +0 -25
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils/writers/s5_html/themes/README.txt +0 -6
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/docutils-0.19.dist-info/COPYING.txt +0 -157
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/pip/_vendor/vendor.txt +0 -18
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/sphinx_design/compiled/material-icons_VERSION.txt +0 -3
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/tornado/test/static/robots.txt +0 -2
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/tornado/test/static_foo.txt +0 -2
- 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
- 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
- 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
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.venv/lib/python3.9/site-packages/wheel/vendored/vendor.txt +0 -1
- 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
- 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
- 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
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/common-build/requirements.txt +0 -12
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/docs/_extra/robots.txt +0 -2
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/docs/requirements.txt +0 -2
- sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/helpers/preview/etc/requirements.txt +0 -3
- sqlalchemy_cratedb-0.41.0.dev2/docs/_extra/robots.txt +0 -4
- sqlalchemy_cratedb-0.41.0.dev2/setup.cfg +0 -7
- sqlalchemy_cratedb-0.41.0.dev2/src/sqlalchemy_cratedb.egg-info/SOURCES.txt +0 -166
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/CODE_OF_CONDUCT.md +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/CONTRIBUTING.md +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/DEVELOP.md +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/LICENSE +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/MANIFEST.in +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/NOTICE +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/README.md +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/backlog.md +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2/docs/.crate-docs/.build → sqlalchemy_cratedb-0.42.0/docs/_extra}/robots.txt +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/docs/requirements.txt +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/setup.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/__init__.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/api13.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/core10.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/predicate.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/support/__init__.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/support/pandas.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/support/util.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/type/__init__.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/type/array.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/type/geo.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/type/object.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/type/vector.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb.egg-info/dependency_links.txt +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb.egg-info/entry_points.txt +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb.egg-info/top_level.txt +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/tests/test_schema.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/tests/test_support_pandas.py +0 -0
- {sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/tests/test_support_polyfill.py +0 -0
- {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
|
-
##
|
|
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.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlalchemy-cratedb
|
|
3
|
-
Version: 0.
|
|
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
|
|
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.
|
|
71
|
-
Requires-Dist: verlib2
|
|
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.
|
|
76
|
-
Requires-Dist: poethepoet<
|
|
77
|
-
Requires-Dist: pyproject-fmt<
|
|
78
|
-
Requires-Dist: ruff<0.
|
|
79
|
-
Requires-Dist: validate-pyproject<
|
|
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<
|
|
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];
|
|
89
|
-
Requires-Dist: pandas<2.
|
|
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<
|
|
92
|
-
Requires-Dist: pytest-cov<
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
dynamic = [
|
|
82
|
+
"version",
|
|
83
|
+
]
|
|
84
84
|
dependencies = [
|
|
85
85
|
"backports.zoneinfo<1; python_version<'3.9'",
|
|
86
|
-
"crate>=2
|
|
87
|
-
"geojson
|
|
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
|
|
90
|
-
"verlib2
|
|
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.
|
|
97
|
-
"poethepoet<
|
|
98
|
-
"pyproject-fmt<
|
|
99
|
-
"ruff<0.
|
|
100
|
-
"validate-pyproject<
|
|
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,<
|
|
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]
|
|
113
|
-
"pandas<2.
|
|
113
|
+
"dask[dataframe]",
|
|
114
|
+
"pandas<2.4",
|
|
114
115
|
"pueblo>=0.0.7",
|
|
115
|
-
"pytest<
|
|
116
|
-
"pytest-cov<
|
|
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
|
-
"
|
|
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
|
|
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
|
|
226
|
-
branch = false
|
|
227
|
-
omit = [
|
|
214
|
+
[tool.coverage]
|
|
215
|
+
run.branch = false
|
|
216
|
+
run.omit = [
|
|
228
217
|
"tests/*",
|
|
229
218
|
]
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
[
|
|
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)$"
|
{sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/__init__.py
RENAMED
|
@@ -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,
|
{sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/core14.py
RENAMED
|
@@ -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
|
{sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/compat/core20.py
RENAMED
|
@@ -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
|
-
#
|
|
57
|
+
# CrateDB patch.
|
|
57
58
|
if not compile_state._dict_parameters and not hasattr(update_stmt, "_crate_specific"):
|
|
58
|
-
|
|
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
|
-
|
|
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:
|
{sqlalchemy_cratedb-0.41.0.dev2 → sqlalchemy_cratedb-0.42.0}/src/sqlalchemy_cratedb/dialect.py
RENAMED
|
@@ -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
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
"""
|
|
@@ -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]
|