sqlalchemy-cratedb 0.38.0.dev0__py3-none-any.whl → 0.39.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.
- sqlalchemy_cratedb/__init__.py +7 -4
- sqlalchemy_cratedb/compat/api13.py +5 -9
- sqlalchemy_cratedb/compat/core10.py +26 -37
- sqlalchemy_cratedb/compat/core14.py +30 -52
- sqlalchemy_cratedb/compat/core20.py +35 -58
- sqlalchemy_cratedb/compiler.py +80 -81
- sqlalchemy_cratedb/dialect.py +69 -65
- sqlalchemy_cratedb/predicate.py +14 -17
- sqlalchemy_cratedb/sa_version.py +2 -2
- sqlalchemy_cratedb/support/__init__.py +7 -3
- sqlalchemy_cratedb/support/pandas.py +4 -5
- sqlalchemy_cratedb/support/polyfill.py +10 -8
- sqlalchemy_cratedb/support/util.py +52 -4
- sqlalchemy_cratedb/type/__init__.py +9 -0
- sqlalchemy_cratedb/type/array.py +5 -8
- sqlalchemy_cratedb/type/geo.py +5 -10
- sqlalchemy_cratedb/type/object.py +13 -11
- sqlalchemy_cratedb/type/vector.py +6 -3
- {sqlalchemy_cratedb-0.38.0.dev0.dist-info → sqlalchemy_cratedb-0.39.0.dist-info}/METADATA +8 -9
- sqlalchemy_cratedb-0.39.0.dist-info/RECORD +26 -0
- {sqlalchemy_cratedb-0.38.0.dev0.dist-info → sqlalchemy_cratedb-0.39.0.dist-info}/WHEEL +1 -1
- sqlalchemy_cratedb-0.38.0.dev0.dist-info/RECORD +0 -26
- {sqlalchemy_cratedb-0.38.0.dev0.dist-info → sqlalchemy_cratedb-0.39.0.dist-info}/LICENSE +0 -0
- {sqlalchemy_cratedb-0.38.0.dev0.dist-info → sqlalchemy_cratedb-0.39.0.dist-info}/NOTICE +0 -0
- {sqlalchemy_cratedb-0.38.0.dev0.dist-info → sqlalchemy_cratedb-0.39.0.dist-info}/entry_points.txt +0 -0
- {sqlalchemy_cratedb-0.38.0.dev0.dist-info → sqlalchemy_cratedb-0.39.0.dist-info}/top_level.txt +0 -0
sqlalchemy_cratedb/predicate.py
CHANGED
@@ -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 =
|
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 =
|
53
|
+
using = " ".join([using, with_clause])
|
55
54
|
return using
|
56
55
|
if self.options:
|
57
|
-
raise ValueError(
|
58
|
-
|
59
|
-
|
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 =
|
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 =
|
95
|
+
func = " ".join([func, using])
|
99
96
|
return func
|
sqlalchemy_cratedb/sa_version.py
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
from sqlalchemy_cratedb.support.pandas import insert_bulk, table_kwargs
|
2
|
-
from sqlalchemy_cratedb.support.polyfill import
|
3
|
-
|
4
|
-
|
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
|
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(
|
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__}' "
|
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
|
-
|
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
|
-
|
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
|
-
|
18
|
-
|
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
|
-
|
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))
|
sqlalchemy_cratedb/type/array.py
CHANGED
@@ -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
|
-
"""
|
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
|
-
|
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.
|
sqlalchemy_cratedb/type/geo.py
CHANGED
@@ -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
|
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
|
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(
|
30
|
-
|
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(
|
36
|
-
|
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(
|
87
|
-
|
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(
|
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.
|
3
|
+
Version: 0.39.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.
|
65
|
+
Requires-Dist: crate ==1.0.0.dev0
|
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:
|
75
|
-
Requires-Dist:
|
76
|
-
Requires-Dist:
|
77
|
-
Requires-Dist:
|
78
|
-
Requires-Dist:
|
79
|
-
Requires-Dist: validate-pyproject <0.19 ; extra == 'develop'
|
74
|
+
Requires-Dist: mypy <1.12 ; extra == 'develop'
|
75
|
+
Requires-Dist: poethepoet <0.28 ; 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.20 ; extra == 'develop'
|
80
79
|
Provides-Extra: doc
|
81
80
|
Requires-Dist: crate-docs-theme >=0.26.5 ; extra == 'doc'
|
82
|
-
Requires-Dist: sphinx <
|
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=bboBk3d444a3C17j2hjUy6bOoLSCqnTUPLbC3-qY-dI,14131
|
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.39.0.dist-info/LICENSE,sha256=s_w3FXmAYQuatqsgvyYLnGyC_13KOqp3W1DUEXO9RpY,10175
|
21
|
+
sqlalchemy_cratedb-0.39.0.dist-info/METADATA,sha256=2YqzJI6s6PMnskd_J1wgOCK6r-nhgk56jf31KzlAO08,6540
|
22
|
+
sqlalchemy_cratedb-0.39.0.dist-info/NOTICE,sha256=yU9CWOf_XrVU7fpqGgM9tDjppoMyfHHBmFVMiINZk-k,1167
|
23
|
+
sqlalchemy_cratedb-0.39.0.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
|
24
|
+
sqlalchemy_cratedb-0.39.0.dist-info/entry_points.txt,sha256=c14wyCG3OeM64_DUbI_vLVUXR3e3GhDyO_PCjo6UQMU,57
|
25
|
+
sqlalchemy_cratedb-0.39.0.dist-info/top_level.txt,sha256=UjjXz0burl_-2MApzLzffHG_2RXm6KljZvoGJHISMPo,19
|
26
|
+
sqlalchemy_cratedb-0.39.0.dist-info/RECORD,,
|
@@ -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,,
|
File without changes
|
File without changes
|
{sqlalchemy_cratedb-0.38.0.dev0.dist-info → sqlalchemy_cratedb-0.39.0.dist-info}/entry_points.txt
RENAMED
File without changes
|
{sqlalchemy_cratedb-0.38.0.dev0.dist-info → sqlalchemy_cratedb-0.39.0.dist-info}/top_level.txt
RENAMED
File without changes
|