sqlalchemy-cratedb 0.38.0.dev0__py3-none-any.whl → 0.40.0__py3-none-any.whl

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.
@@ -19,8 +19,8 @@
19
19
  # with Crate these terms will supersede the license and you may use the
20
20
  # software solely pursuant to the terms of the relevant commercial agreement.
21
21
 
22
- from sqlalchemy.sql.expression import ColumnElement, literal
23
22
  from sqlalchemy.ext.compiler import compiles
23
+ from sqlalchemy.sql.expression import ColumnElement, literal
24
24
 
25
25
 
26
26
  class Match(ColumnElement):
@@ -35,9 +35,8 @@ class Match(ColumnElement):
35
35
 
36
36
  def compile_column(self, compiler):
37
37
  if isinstance(self.column, dict):
38
- column = ', '.join(
39
- sorted(["{0} {1}".format(compiler.process(k), v)
40
- for k, v in self.column.items()])
38
+ column = ", ".join(
39
+ sorted(["{0} {1}".format(compiler.process(k), v) for k, v in self.column.items()])
41
40
  )
42
41
  return "({0})".format(column)
43
42
  else:
@@ -51,21 +50,22 @@ class Match(ColumnElement):
51
50
  using = "using {0}".format(self.match_type)
52
51
  with_clause = self.with_clause()
53
52
  if with_clause:
54
- using = ' '.join([using, with_clause])
53
+ using = " ".join([using, with_clause])
55
54
  return using
56
55
  if self.options:
57
- raise ValueError("missing match_type. " +
58
- "It's not allowed to specify options " +
59
- "without match_type")
56
+ raise ValueError(
57
+ "missing match_type. "
58
+ + "It's not allowed to specify options "
59
+ + "without match_type"
60
+ )
61
+ return None
60
62
 
61
63
  def with_clause(self):
62
64
  if self.options:
63
- options = ', '.join(
64
- sorted(["{0}={1}".format(k, v)
65
- for k, v in self.options.items()])
66
- )
65
+ options = ", ".join(sorted(["{0}={1}".format(k, v) for k, v in self.options.items()]))
67
66
 
68
67
  return "with ({0})".format(options)
68
+ return None
69
69
 
70
70
 
71
71
  def match(column, term, match_type=None, options=None):
@@ -89,11 +89,8 @@ def match(column, term, match_type=None, options=None):
89
89
 
90
90
  @compiles(Match)
91
91
  def compile_match(match, compiler, **kwargs):
92
- func = "match(%s, %s)" % (
93
- match.compile_column(compiler),
94
- match.compile_term(compiler)
95
- )
92
+ func = "match(%s, %s)" % (match.compile_column(compiler), match.compile_term(compiler))
96
93
  using = match.compile_using(compiler)
97
94
  if using:
98
- func = ' '.join([func, using])
95
+ func = " ".join([func, using])
99
96
  return func
@@ -24,5 +24,5 @@ from verlib2 import Version
24
24
 
25
25
  SA_VERSION = Version(sa.__version__)
26
26
 
27
- SA_1_4 = Version('1.4.0b1')
28
- SA_2_0 = Version('2.0.0')
27
+ SA_1_4 = Version("1.4.0b1")
28
+ SA_2_0 = Version("2.0.0")
@@ -1,12 +1,16 @@
1
1
  from sqlalchemy_cratedb.support.pandas import insert_bulk, table_kwargs
2
- from sqlalchemy_cratedb.support.polyfill import check_uniqueness_factory, refresh_after_dml, \
3
- patch_autoincrement_timestamp
4
- from sqlalchemy_cratedb.support.util import refresh_table, refresh_dirty
2
+ from sqlalchemy_cratedb.support.polyfill import (
3
+ check_uniqueness_factory,
4
+ patch_autoincrement_timestamp,
5
+ refresh_after_dml,
6
+ )
7
+ from sqlalchemy_cratedb.support.util import quote_relation_name, refresh_dirty, refresh_table
5
8
 
6
9
  __all__ = [
7
10
  check_uniqueness_factory,
8
11
  insert_bulk,
9
12
  patch_autoincrement_timestamp,
13
+ quote_relation_name,
10
14
  refresh_after_dml,
11
15
  refresh_dirty,
12
16
  refresh_table,
@@ -18,15 +18,14 @@
18
18
  # However, if you have executed another commercial license agreement
19
19
  # with Crate these terms will supersede the license and you may use the
20
20
  # software solely pursuant to the terms of the relevant commercial agreement.
21
+ import logging
21
22
  from contextlib import contextmanager
22
23
  from typing import Any
23
24
  from unittest.mock import patch
24
25
 
25
- import logging
26
-
27
26
  import sqlalchemy as sa
28
27
 
29
- from sqlalchemy_cratedb import SA_VERSION, SA_2_0
28
+ from sqlalchemy_cratedb.sa_version import SA_2_0, SA_VERSION
30
29
 
31
30
  logger = logging.getLogger(__name__)
32
31
 
@@ -51,7 +50,7 @@ def insert_bulk(pd_table, conn, keys, data_iter):
51
50
  [1] https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_sql.html
52
51
  [2] https://cratedb.com/docs/crate/reference/en/latest/interfaces/http.html#bulk-operations
53
52
  [3] https://github.com/pandas-dev/pandas/blob/v2.0.1/pandas/io/sql.py#L1011-L1027
54
- """
53
+ """ # noqa: E501
55
54
 
56
55
  # Compile SQL statement and materialize batch.
57
56
  sql = str(pd_table.table.insert().compile(bind=conn))
@@ -61,7 +60,7 @@ def insert_bulk(pd_table, conn, keys, data_iter):
61
60
  if logger.level == logging.DEBUG:
62
61
  logger.debug(f"Bulk SQL: {sql}")
63
62
  logger.debug(f"Bulk records: {len(data)}")
64
- # logger.debug(f"Bulk data: {data}")
63
+ # logger.debug(f"Bulk data: {data}") # noqa: ERA001
65
64
 
66
65
  # Invoke bulk insert operation.
67
66
  cursor = conn._dbapi_connection.cursor()
@@ -1,6 +1,7 @@
1
+ import typing as t
2
+
1
3
  import sqlalchemy as sa
2
4
  from sqlalchemy.event import listen
3
- import typing as t
4
5
 
5
6
  from sqlalchemy_cratedb.support.util import refresh_dirty, refresh_table
6
7
 
@@ -39,7 +40,7 @@ def check_uniqueness_factory(sa_entity, *attribute_names):
39
40
  This is used by CrateDB's MLflow adapter.
40
41
 
41
42
  TODO: Maybe enable through a dialect parameter `crate_polyfill_unique` or such.
42
- """
43
+ """ # noqa: E501
43
44
 
44
45
  # Synthesize a canonical "name" for the constraint,
45
46
  # composed of all column names involved.
@@ -52,7 +53,9 @@ def check_uniqueness_factory(sa_entity, *attribute_names):
52
53
  # TODO: How to use `session.query(SqlExperiment)` here?
53
54
  stmt = mapper.selectable.select()
54
55
  for attribute_name in attribute_names:
55
- stmt = stmt.filter(getattr(sa_entity, attribute_name) == getattr(target, attribute_name))
56
+ stmt = stmt.filter(
57
+ getattr(sa_entity, attribute_name) == getattr(target, attribute_name)
58
+ )
56
59
  stmt = stmt.compile(bind=connection.engine)
57
60
  results = connection.execute(stmt)
58
61
  if results.rowcount > 0:
@@ -60,7 +63,8 @@ def check_uniqueness_factory(sa_entity, *attribute_names):
60
63
  statement=stmt,
61
64
  params=[],
62
65
  orig=Exception(
63
- f"DuplicateKeyException in table '{target.__tablename__}' " f"on constraint '{constraint_name}'"
66
+ f"DuplicateKeyException in table '{target.__tablename__}' "
67
+ f"on constraint '{constraint_name}'"
64
68
  ),
65
69
  )
66
70
 
@@ -103,15 +107,13 @@ def refresh_after_dml_engine(engine: sa.engine.Engine):
103
107
 
104
108
  This is used by CrateDB's Singer/Meltano and `rdflib-sqlalchemy` adapters.
105
109
  """
110
+
106
111
  def receive_after_execute(
107
112
  conn: sa.engine.Connection, clauseelement, multiparams, params, execution_options, result
108
113
  ):
109
114
  if isinstance(clauseelement, (sa.sql.Insert, sa.sql.Update, sa.sql.Delete)):
110
115
  if not isinstance(clauseelement.table, sa.sql.Join):
111
- full_table_name = f'"{clauseelement.table.name}"'
112
- if clauseelement.table.schema is not None:
113
- full_table_name = f'"{clauseelement.table.schema}".' + full_table_name
114
- refresh_table(conn, full_table_name)
116
+ refresh_table(conn, clauseelement.table)
115
117
 
116
118
  sa.event.listen(engine, "after_execute", receive_after_execute)
117
119
 
@@ -3,6 +3,8 @@ import typing as t
3
3
 
4
4
  import sqlalchemy as sa
5
5
 
6
+ from sqlalchemy_cratedb.dialect import CrateDialect
7
+
6
8
  if t.TYPE_CHECKING:
7
9
  try:
8
10
  from sqlalchemy.orm import DeclarativeBase
@@ -10,14 +12,27 @@ if t.TYPE_CHECKING:
10
12
  pass
11
13
 
12
14
 
13
- def refresh_table(connection, target: t.Union[str, "DeclarativeBase"]):
15
+ # An instance of the dialect used for quoting purposes.
16
+ identifier_preparer = CrateDialect().identifier_preparer
17
+
18
+
19
+ def refresh_table(
20
+ connection, target: t.Union[str, "DeclarativeBase", "sa.sql.selectable.TableClause"]
21
+ ):
14
22
  """
15
23
  Invoke a `REFRESH TABLE` statement.
16
24
  """
17
- if hasattr(target, "__tablename__"):
18
- sql = f"REFRESH TABLE {target.__tablename__}"
25
+
26
+ if isinstance(target, sa.sql.selectable.TableClause):
27
+ full_table_name = f'"{target.name}"'
28
+ if target.schema is not None:
29
+ full_table_name = f'"{target.schema}".' + full_table_name
30
+ elif hasattr(target, "__tablename__"):
31
+ full_table_name = target.__tablename__
19
32
  else:
20
- sql = f"REFRESH TABLE {target}"
33
+ full_table_name = target
34
+
35
+ sql = f"REFRESH TABLE {full_table_name}"
21
36
  connection.execute(sa.text(sql))
22
37
 
23
38
 
@@ -32,3 +47,36 @@ def refresh_dirty(session, flush_context=None):
32
47
  dirty_classes = {entity.__class__ for entity in dirty_entities}
33
48
  for class_ in dirty_classes:
34
49
  refresh_table(session, class_)
50
+
51
+
52
+ def quote_relation_name(ident: str) -> str:
53
+ """
54
+ Quote a simple or full-qualified table/relation name, when needed.
55
+
56
+ Simple: <table>
57
+ Full-qualified: <schema>.<table>
58
+
59
+ Happy path examples:
60
+
61
+ foo => foo
62
+ Foo => "Foo"
63
+ "Foo" => "Foo"
64
+ foo.bar => foo.bar
65
+ foo-bar.baz_qux => "foo-bar".baz_qux
66
+
67
+ Such input strings will not be modified:
68
+
69
+ "foo.bar" => "foo.bar"
70
+ """
71
+
72
+ # If a quote exists at the beginning or the end of the input string,
73
+ # let's consider that the relation name has been quoted already.
74
+ if ident.startswith('"') or ident.endswith('"'):
75
+ return ident
76
+
77
+ # If a dot is included, it's a full-qualified identifier like <schema>.<table>.
78
+ # It needs to be split, in order to apply identifier quoting properly.
79
+ parts = ident.split(".")
80
+ if len(parts) > 3:
81
+ raise ValueError(f"Invalid relation name, too many parts: {ident}")
82
+ return ".".join(map(identifier_preparer.quote, parts))
@@ -2,3 +2,12 @@ from .array import ObjectArray
2
2
  from .geo import Geopoint, Geoshape
3
3
  from .object import ObjectType
4
4
  from .vector import FloatVector, knn_match
5
+
6
+ __all__ = [
7
+ Geopoint,
8
+ Geoshape,
9
+ ObjectArray,
10
+ ObjectType,
11
+ FloatVector,
12
+ knn_match,
13
+ ]
@@ -20,16 +20,14 @@
20
20
  # software solely pursuant to the terms of the relevant commercial agreement.
21
21
 
22
22
  import sqlalchemy.types as sqltypes
23
- from sqlalchemy.sql import operators, expression
24
- from sqlalchemy.sql import default_comparator
25
23
  from sqlalchemy.ext.mutable import Mutable
24
+ from sqlalchemy.sql import default_comparator, expression, operators
26
25
 
27
26
 
28
27
  class MutableList(Mutable, list):
29
-
30
28
  @classmethod
31
29
  def coerce(cls, key, value):
32
- """ Convert plain list to MutableList """
30
+ """Convert plain list to MutableList"""
33
31
  if not isinstance(value, MutableList):
34
32
  if isinstance(value, list):
35
33
  return MutableList(value)
@@ -85,7 +83,8 @@ class Any(expression.ColumnElement):
85
83
  ARRAY-bound method
86
84
 
87
85
  """
88
- __visit_name__ = 'any'
86
+
87
+ __visit_name__ = "any"
89
88
  inherit_cache = True
90
89
 
91
90
  def __init__(self, left, right, operator=operators.eq):
@@ -100,9 +99,7 @@ class _ObjectArray(sqltypes.UserDefinedType):
100
99
 
101
100
  class Comparator(sqltypes.TypeEngine.Comparator):
102
101
  def __getitem__(self, key):
103
- return default_comparator._binary_operate(self.expr,
104
- operators.getitem,
105
- key)
102
+ return default_comparator._binary_operate(self.expr, operators.getitem, key)
106
103
 
107
104
  def any(self, other, operator=operators.eq):
108
105
  """Return ``other operator ANY (array)`` clause.
@@ -7,20 +7,18 @@ class Geopoint(sqltypes.UserDefinedType):
7
7
  cache_ok = True
8
8
 
9
9
  class Comparator(sqltypes.TypeEngine.Comparator):
10
-
11
10
  def __getitem__(self, key):
12
- return default_comparator._binary_operate(self.expr,
13
- operators.getitem,
14
- key)
11
+ return default_comparator._binary_operate(self.expr, operators.getitem, key)
15
12
 
16
13
  def get_col_spec(self):
17
- return 'GEO_POINT'
14
+ return "GEO_POINT"
18
15
 
19
16
  def bind_processor(self, dialect):
20
17
  def process(value):
21
18
  if isinstance(value, geojson.Point):
22
19
  return value.coordinates
23
20
  return value
21
+
24
22
  return process
25
23
 
26
24
  def result_processor(self, dialect, coltype):
@@ -33,14 +31,11 @@ class Geoshape(sqltypes.UserDefinedType):
33
31
  cache_ok = True
34
32
 
35
33
  class Comparator(sqltypes.TypeEngine.Comparator):
36
-
37
34
  def __getitem__(self, key):
38
- return default_comparator._binary_operate(self.expr,
39
- operators.getitem,
40
- key)
35
+ return default_comparator._binary_operate(self.expr, operators.getitem, key)
41
36
 
42
37
  def get_col_spec(self):
43
- return 'GEO_SHAPE'
38
+ return "GEO_SHAPE"
44
39
 
45
40
  def result_processor(self, dialect, coltype):
46
41
  return geojson.GeoJSON.to_instance
@@ -5,7 +5,6 @@ from sqlalchemy.ext.mutable import Mutable
5
5
 
6
6
 
7
7
  class MutableDict(Mutable, dict):
8
-
9
8
  @classmethod
10
9
  def coerce(cls, key, value):
11
10
  "Convert plain dictionaries to MutableDict."
@@ -26,17 +25,17 @@ class MutableDict(Mutable, dict):
26
25
  self._overwrite_key = root_change_key
27
26
  self.to_update = self if to_update is None else to_update
28
27
  for k in initval:
29
- initval[k] = self._convert_dict(initval[k],
30
- overwrite_key=k if self._overwrite_key is None else self._overwrite_key
31
- )
28
+ initval[k] = self._convert_dict(
29
+ initval[k], overwrite_key=k if self._overwrite_key is None else self._overwrite_key
30
+ )
32
31
  dict.__init__(self, initval)
33
32
 
34
33
  def __setitem__(self, key, value):
35
- value = self._convert_dict(value, key if self._overwrite_key is None else self._overwrite_key)
36
- dict.__setitem__(self, key, value)
37
- self.to_update.on_key_changed(
38
- key if self._overwrite_key is None else self._overwrite_key
34
+ value = self._convert_dict(
35
+ value, key if self._overwrite_key is None else self._overwrite_key
39
36
  )
37
+ dict.__setitem__(self, key, value)
38
+ self.to_update.on_key_changed(key if self._overwrite_key is None else self._overwrite_key)
40
39
 
41
40
  def __delitem__(self, key):
42
41
  dict.__delitem__(self, key)
@@ -63,7 +62,6 @@ class MutableDict(Mutable, dict):
63
62
 
64
63
 
65
64
  class ObjectTypeImpl(sqltypes.UserDefinedType, sqltypes.JSON):
66
-
67
65
  __visit_name__ = "OBJECT"
68
66
 
69
67
  cache_ok = False
@@ -83,8 +81,12 @@ deprecated_names = ["Craty", "Object"]
83
81
 
84
82
  def __getattr__(name):
85
83
  if name in deprecated_names:
86
- warnings.warn(f"{name} is deprecated and will be removed in future releases. "
87
- f"Please use ObjectType instead.", DeprecationWarning)
84
+ warnings.warn(
85
+ f"{name} is deprecated and will be removed in future releases. "
86
+ f"Please use ObjectType instead.",
87
+ category=DeprecationWarning,
88
+ stacklevel=2,
89
+ )
88
90
  return globals()[f"_deprecated_{name}"]
89
91
  raise AttributeError(f"module {__name__} has no attribute {name}")
90
92
 
@@ -33,15 +33,15 @@ The MIT License (MIT)
33
33
  Copyright (c) 2021-2023 Andrew Kane
34
34
  https://github.com/pgvector/pgvector-python
35
35
  """
36
+
36
37
  import typing as t
37
38
 
38
39
  if t.TYPE_CHECKING:
39
40
  import numpy.typing as npt # pragma: no cover
40
41
 
41
42
  import sqlalchemy as sa
42
- from sqlalchemy.sql.expression import ColumnElement, literal
43
43
  from sqlalchemy.ext.compiler import compiles
44
-
44
+ from sqlalchemy.sql.expression import ColumnElement, literal
45
45
 
46
46
  __all__ = [
47
47
  "from_db",
@@ -73,7 +73,9 @@ def to_db(value: t.Any, dim: t.Optional[int] = None) -> t.Optional[t.List]:
73
73
  if value.ndim != 1:
74
74
  raise ValueError("expected ndim to be 1")
75
75
 
76
- if not np.issubdtype(value.dtype, np.integer) and not np.issubdtype(value.dtype, np.floating):
76
+ if not np.issubdtype(value.dtype, np.integer) and not np.issubdtype(
77
+ value.dtype, np.floating
78
+ ):
77
79
  raise ValueError("dtype must be numeric")
78
80
 
79
81
  value = value.tolist()
@@ -128,6 +130,7 @@ class KnnMatch(ColumnElement):
128
130
 
129
131
  https://cratedb.com/docs/crate/reference/en/latest/general/builtins/scalar-functions.html#scalar-knn-match
130
132
  """
133
+
131
134
  inherit_cache = True
132
135
 
133
136
  def __init__(self, column, term, k=None):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlalchemy-cratedb
3
- Version: 0.38.0.dev0
3
+ Version: 0.40.0
4
4
  Summary: SQLAlchemy dialect for CrateDB.
5
5
  Author-email: "Crate.io" <office@crate.io>
6
6
  License: Apache License 2.0
@@ -62,7 +62,7 @@ Requires-Python: >=3.6
62
62
  Description-Content-Type: text/markdown
63
63
  License-File: LICENSE
64
64
  License-File: NOTICE
65
- Requires-Dist: crate ==1.0.0dev0
65
+ Requires-Dist: crate ==1.0.0.dev1
66
66
  Requires-Dist: geojson <4,>=2.5
67
67
  Requires-Dist: sqlalchemy <2.1,>=1
68
68
  Requires-Dist: verlib2 ==0.2
@@ -71,15 +71,14 @@ Requires-Dist: importlib-resources ; python_version < "3.9"
71
71
  Provides-Extra: all
72
72
  Requires-Dist: sqlalchemy-cratedb[vector] ; extra == 'all'
73
73
  Provides-Extra: develop
74
- Requires-Dist: black <25 ; extra == 'develop'
75
- Requires-Dist: mypy <1.11 ; extra == 'develop'
76
- Requires-Dist: poethepoet <0.27 ; extra == 'develop'
77
- Requires-Dist: pyproject-fmt <2.2 ; extra == 'develop'
78
- Requires-Dist: ruff <0.5 ; extra == 'develop'
79
- Requires-Dist: validate-pyproject <0.19 ; extra == 'develop'
74
+ Requires-Dist: mypy <1.12 ; extra == 'develop'
75
+ Requires-Dist: poethepoet <0.30 ; extra == 'develop'
76
+ Requires-Dist: pyproject-fmt <2.3 ; extra == 'develop'
77
+ Requires-Dist: ruff <0.7 ; extra == 'develop'
78
+ Requires-Dist: validate-pyproject <0.21 ; extra == 'develop'
80
79
  Provides-Extra: doc
81
80
  Requires-Dist: crate-docs-theme >=0.26.5 ; extra == 'doc'
82
- Requires-Dist: sphinx <8,>=3.5 ; extra == 'doc'
81
+ Requires-Dist: sphinx <9,>=3.5 ; extra == 'doc'
83
82
  Provides-Extra: release
84
83
  Requires-Dist: build <2 ; extra == 'release'
85
84
  Requires-Dist: twine <6 ; extra == 'release'
@@ -0,0 +1,26 @@
1
+ sqlalchemy_cratedb/__init__.py,sha256=1W1uYA3Ax7HJTQatj6UulvPEmetUICEx_S7C2bmp76Q,2326
2
+ sqlalchemy_cratedb/compiler.py,sha256=QoR0Kvn5d7BjRAq_y_DvIaInlajZsJfklvA2SJLhzBw,13147
3
+ sqlalchemy_cratedb/dialect.py,sha256=QED0DDy5AEePnwvHBwZZ4d82p8h0lndBxFBvR6OpRn0,15043
4
+ sqlalchemy_cratedb/predicate.py,sha256=mUIHwGv9tuNmN_BqRD5LC5Ll3Lxpb4WI_muZqbP6HRs,3568
5
+ sqlalchemy_cratedb/sa_version.py,sha256=sQtmUQEJcguJRRSlbkVpYcdEzPduA-sUHtmOtWSH8qI,1168
6
+ sqlalchemy_cratedb/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ sqlalchemy_cratedb/compat/api13.py,sha256=4wGljuAx4PtZmXbf3iADvxDHxhKIeIHQeWIMG0e7_-M,5625
8
+ sqlalchemy_cratedb/compat/core10.py,sha256=VDugi9u4wr5tSoxyD8C9kPmxXgtik0avNPUPnSmP4DI,8191
9
+ sqlalchemy_cratedb/compat/core14.py,sha256=qtL1UfvT7aZK2TafNi5KiXA1b0nO84PgoBMI0FgnXos,11144
10
+ sqlalchemy_cratedb/compat/core20.py,sha256=E4NzFuXdadaQVGksPt5VWaMeHQxTXs1oqvDw6L2McnA,14687
11
+ sqlalchemy_cratedb/support/__init__.py,sha256=zPXmiW2M5-yLZFfKZX78mZiL0T5MzD0IhUNEoRs9NuY,507
12
+ sqlalchemy_cratedb/support/pandas.py,sha256=yt5re_PmiwEv7nMK1A2xIufXbmxUjWXP_06pH3V2qyg,4397
13
+ sqlalchemy_cratedb/support/polyfill.py,sha256=yyqlXBvb6FfWpA3ChDF8XoiCImHsMD8NknZe4gTfvI0,5009
14
+ sqlalchemy_cratedb/support/util.py,sha256=HjZpOy8uTqkMwUrFYsL3JEDgjmAVSqk4zYMJAyNhpEE,2442
15
+ sqlalchemy_cratedb/type/__init__.py,sha256=qT3s2Dt83BPp0ZXCv5e1vHod7MKzDjVzSSV8Pcnl9JM,249
16
+ sqlalchemy_cratedb/type/array.py,sha256=X-GXAtyysya3Esoe-Rh692ySBskvKd_xf30pu9x3oFk,4260
17
+ sqlalchemy_cratedb/type/geo.py,sha256=8Z81m8wtpb0TBdSy_3v5FeXd0MTGZD3LxVguf9PzCZA,1160
18
+ sqlalchemy_cratedb/type/object.py,sha256=aAkmr55RYZUbJ2MVUDV1-5eQ7kKuATVy6oy2OFqmibU,3015
19
+ sqlalchemy_cratedb/type/vector.py,sha256=g8_C-ObDWEBoGz7u5QdljDCRWYNSRVafCAsmWJSxXiE,4746
20
+ sqlalchemy_cratedb-0.40.0.dist-info/LICENSE,sha256=s_w3FXmAYQuatqsgvyYLnGyC_13KOqp3W1DUEXO9RpY,10175
21
+ sqlalchemy_cratedb-0.40.0.dist-info/METADATA,sha256=1EYMw4lbSg4m4tED-Uz9PxzVfn_XaqOeIe85OAlIhyo,6540
22
+ sqlalchemy_cratedb-0.40.0.dist-info/NOTICE,sha256=yU9CWOf_XrVU7fpqGgM9tDjppoMyfHHBmFVMiINZk-k,1167
23
+ sqlalchemy_cratedb-0.40.0.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
24
+ sqlalchemy_cratedb-0.40.0.dist-info/entry_points.txt,sha256=c14wyCG3OeM64_DUbI_vLVUXR3e3GhDyO_PCjo6UQMU,57
25
+ sqlalchemy_cratedb-0.40.0.dist-info/top_level.txt,sha256=UjjXz0burl_-2MApzLzffHG_2RXm6KljZvoGJHISMPo,19
26
+ sqlalchemy_cratedb-0.40.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.1.0)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,26 +0,0 @@
1
- sqlalchemy_cratedb/__init__.py,sha256=HIsl7K75Yi2Z1rey-LXPiuonRVJ-Qj8TVWKmIk5d8g8,2289
2
- sqlalchemy_cratedb/compiler.py,sha256=ECzlBzegW8Ib1dq-bGKfhZxx7yfQCSj7wi9ozENRd7Y,12974
3
- sqlalchemy_cratedb/dialect.py,sha256=LTV4dicnHOdriKifZtnmXivl1RMFmqgj2A0E6uiX8jg,14288
4
- sqlalchemy_cratedb/predicate.py,sha256=HT7tHF7PxX71G8m91lqpH732iVQZtO8_NPZUIsllcys,3622
5
- sqlalchemy_cratedb/sa_version.py,sha256=NhNA5FUw0Sm5n-fSVo6CTcaioDRovUknFOslX31ir-I,1168
6
- sqlalchemy_cratedb/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- sqlalchemy_cratedb/compat/api13.py,sha256=1sf1kJycBSxLn7KJiWyTRkLacB-aCqhLu3TKKzL4g4w,5669
8
- sqlalchemy_cratedb/compat/core10.py,sha256=P46_ABaii-LQrzeeu8bkhCkoYLr2sVZB3TMGr2BSqD4,8636
9
- sqlalchemy_cratedb/compat/core14.py,sha256=xh_wnNkMUD8aE_VFQPnPeXWsPIFzPg0ZjkhfJBzo3IM,11606
10
- sqlalchemy_cratedb/compat/core20.py,sha256=QgNEA4z37ldFI4X9HapbTcga7KvsrdMkoMRjxvCJ4tE,15145
11
- sqlalchemy_cratedb/support/__init__.py,sha256=AwqsVVRBaoMaTZ0zNjcoY9HbLIQsP1vlu__ANL___vY,450
12
- sqlalchemy_cratedb/support/pandas.py,sha256=bEQTPJBvJepM5_GY5Jxewu26Fs6d8AKzizxgO4vw2PA,4357
13
- sqlalchemy_cratedb/support/polyfill.py,sha256=cGAVWkl1DisSuGamvee_Qxjvp_ss9uJGq_mM8nUh0lI,5143
14
- sqlalchemy_cratedb/support/util.py,sha256=Ll4ZNZBqtApRkzbTFLxT6MoAfWFBIlXBCZEnyyHLxto,986
15
- sqlalchemy_cratedb/type/__init__.py,sha256=8Bp0RKTFAx-3ETOcG4R4wjhL5rarN7tJLfrue7S6mH8,141
16
- sqlalchemy_cratedb/type/array.py,sha256=RrHkFoNmTKtk_6md0OtsR7xofRxdk0PbfO-JFfevBJI,4396
17
- sqlalchemy_cratedb/type/geo.py,sha256=9wFGxGMxxN-7_qZTlmWialzaPp_zzFj4U-yVqY_deA0,1377
18
- sqlalchemy_cratedb/type/object.py,sha256=-bebiW38vor3grD9qsomzJ_z3zRpNMb2XLLto2fFez4,3016
19
- sqlalchemy_cratedb/type/vector.py,sha256=5Q2v-RuiNKriSm-EX7tTb1PelqqoBvjDOFDB27Xxk5I,4723
20
- sqlalchemy_cratedb-0.38.0.dev0.dist-info/LICENSE,sha256=s_w3FXmAYQuatqsgvyYLnGyC_13KOqp3W1DUEXO9RpY,10175
21
- sqlalchemy_cratedb-0.38.0.dev0.dist-info/METADATA,sha256=trBbdmkXNPx969gGqt2JwR57kzZnwLqbJoWLi0g8eyE,6590
22
- sqlalchemy_cratedb-0.38.0.dev0.dist-info/NOTICE,sha256=yU9CWOf_XrVU7fpqGgM9tDjppoMyfHHBmFVMiINZk-k,1167
23
- sqlalchemy_cratedb-0.38.0.dev0.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
24
- sqlalchemy_cratedb-0.38.0.dev0.dist-info/entry_points.txt,sha256=c14wyCG3OeM64_DUbI_vLVUXR3e3GhDyO_PCjo6UQMU,57
25
- sqlalchemy_cratedb-0.38.0.dev0.dist-info/top_level.txt,sha256=UjjXz0burl_-2MApzLzffHG_2RXm6KljZvoGJHISMPo,19
26
- sqlalchemy_cratedb-0.38.0.dev0.dist-info/RECORD,,