polars-runtime-compat 1.34.0b3__cp39-abi3-win_arm64.whl → 1.34.0b4__cp39-abi3-win_arm64.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.

Potentially problematic release.


This version of polars-runtime-compat might be problematic. Click here for more details.

Files changed (203) hide show
  1. _polars_runtime_compat/_polars_runtime_compat.pyd +0 -0
  2. {polars_runtime_compat-1.34.0b3.dist-info → polars_runtime_compat-1.34.0b4.dist-info}/METADATA +1 -1
  3. polars_runtime_compat-1.34.0b4.dist-info/RECORD +6 -0
  4. polars/__init__.py +0 -528
  5. polars/_cpu_check.py +0 -265
  6. polars/_dependencies.py +0 -355
  7. polars/_plr.py +0 -99
  8. polars/_plr.pyi +0 -2496
  9. polars/_reexport.py +0 -23
  10. polars/_typing.py +0 -478
  11. polars/_utils/__init__.py +0 -37
  12. polars/_utils/async_.py +0 -102
  13. polars/_utils/cache.py +0 -176
  14. polars/_utils/cloud.py +0 -40
  15. polars/_utils/constants.py +0 -29
  16. polars/_utils/construction/__init__.py +0 -46
  17. polars/_utils/construction/dataframe.py +0 -1397
  18. polars/_utils/construction/other.py +0 -72
  19. polars/_utils/construction/series.py +0 -560
  20. polars/_utils/construction/utils.py +0 -118
  21. polars/_utils/convert.py +0 -224
  22. polars/_utils/deprecation.py +0 -406
  23. polars/_utils/getitem.py +0 -457
  24. polars/_utils/logging.py +0 -11
  25. polars/_utils/nest_asyncio.py +0 -264
  26. polars/_utils/parquet.py +0 -15
  27. polars/_utils/parse/__init__.py +0 -12
  28. polars/_utils/parse/expr.py +0 -242
  29. polars/_utils/polars_version.py +0 -19
  30. polars/_utils/pycapsule.py +0 -53
  31. polars/_utils/scan.py +0 -27
  32. polars/_utils/serde.py +0 -63
  33. polars/_utils/slice.py +0 -215
  34. polars/_utils/udfs.py +0 -1251
  35. polars/_utils/unstable.py +0 -63
  36. polars/_utils/various.py +0 -782
  37. polars/_utils/wrap.py +0 -25
  38. polars/api.py +0 -370
  39. polars/catalog/__init__.py +0 -0
  40. polars/catalog/unity/__init__.py +0 -19
  41. polars/catalog/unity/client.py +0 -733
  42. polars/catalog/unity/models.py +0 -152
  43. polars/config.py +0 -1571
  44. polars/convert/__init__.py +0 -25
  45. polars/convert/general.py +0 -1046
  46. polars/convert/normalize.py +0 -261
  47. polars/dataframe/__init__.py +0 -5
  48. polars/dataframe/_html.py +0 -186
  49. polars/dataframe/frame.py +0 -12582
  50. polars/dataframe/group_by.py +0 -1067
  51. polars/dataframe/plotting.py +0 -257
  52. polars/datatype_expr/__init__.py +0 -5
  53. polars/datatype_expr/array.py +0 -56
  54. polars/datatype_expr/datatype_expr.py +0 -304
  55. polars/datatype_expr/list.py +0 -18
  56. polars/datatype_expr/struct.py +0 -69
  57. polars/datatypes/__init__.py +0 -122
  58. polars/datatypes/_parse.py +0 -195
  59. polars/datatypes/_utils.py +0 -48
  60. polars/datatypes/classes.py +0 -1213
  61. polars/datatypes/constants.py +0 -11
  62. polars/datatypes/constructor.py +0 -172
  63. polars/datatypes/convert.py +0 -366
  64. polars/datatypes/group.py +0 -130
  65. polars/exceptions.py +0 -230
  66. polars/expr/__init__.py +0 -7
  67. polars/expr/array.py +0 -964
  68. polars/expr/binary.py +0 -346
  69. polars/expr/categorical.py +0 -306
  70. polars/expr/datetime.py +0 -2620
  71. polars/expr/expr.py +0 -11272
  72. polars/expr/list.py +0 -1408
  73. polars/expr/meta.py +0 -444
  74. polars/expr/name.py +0 -321
  75. polars/expr/string.py +0 -3045
  76. polars/expr/struct.py +0 -357
  77. polars/expr/whenthen.py +0 -185
  78. polars/functions/__init__.py +0 -193
  79. polars/functions/aggregation/__init__.py +0 -33
  80. polars/functions/aggregation/horizontal.py +0 -298
  81. polars/functions/aggregation/vertical.py +0 -341
  82. polars/functions/as_datatype.py +0 -848
  83. polars/functions/business.py +0 -138
  84. polars/functions/col.py +0 -384
  85. polars/functions/datatype.py +0 -121
  86. polars/functions/eager.py +0 -524
  87. polars/functions/escape_regex.py +0 -29
  88. polars/functions/lazy.py +0 -2751
  89. polars/functions/len.py +0 -68
  90. polars/functions/lit.py +0 -210
  91. polars/functions/random.py +0 -22
  92. polars/functions/range/__init__.py +0 -19
  93. polars/functions/range/_utils.py +0 -15
  94. polars/functions/range/date_range.py +0 -303
  95. polars/functions/range/datetime_range.py +0 -370
  96. polars/functions/range/int_range.py +0 -348
  97. polars/functions/range/linear_space.py +0 -311
  98. polars/functions/range/time_range.py +0 -287
  99. polars/functions/repeat.py +0 -301
  100. polars/functions/whenthen.py +0 -353
  101. polars/interchange/__init__.py +0 -10
  102. polars/interchange/buffer.py +0 -77
  103. polars/interchange/column.py +0 -190
  104. polars/interchange/dataframe.py +0 -230
  105. polars/interchange/from_dataframe.py +0 -328
  106. polars/interchange/protocol.py +0 -303
  107. polars/interchange/utils.py +0 -170
  108. polars/io/__init__.py +0 -64
  109. polars/io/_utils.py +0 -317
  110. polars/io/avro.py +0 -49
  111. polars/io/clipboard.py +0 -36
  112. polars/io/cloud/__init__.py +0 -17
  113. polars/io/cloud/_utils.py +0 -80
  114. polars/io/cloud/credential_provider/__init__.py +0 -17
  115. polars/io/cloud/credential_provider/_builder.py +0 -520
  116. polars/io/cloud/credential_provider/_providers.py +0 -618
  117. polars/io/csv/__init__.py +0 -9
  118. polars/io/csv/_utils.py +0 -38
  119. polars/io/csv/batched_reader.py +0 -142
  120. polars/io/csv/functions.py +0 -1495
  121. polars/io/database/__init__.py +0 -6
  122. polars/io/database/_arrow_registry.py +0 -70
  123. polars/io/database/_cursor_proxies.py +0 -147
  124. polars/io/database/_executor.py +0 -578
  125. polars/io/database/_inference.py +0 -314
  126. polars/io/database/_utils.py +0 -144
  127. polars/io/database/functions.py +0 -516
  128. polars/io/delta.py +0 -499
  129. polars/io/iceberg/__init__.py +0 -3
  130. polars/io/iceberg/_utils.py +0 -697
  131. polars/io/iceberg/dataset.py +0 -556
  132. polars/io/iceberg/functions.py +0 -151
  133. polars/io/ipc/__init__.py +0 -8
  134. polars/io/ipc/functions.py +0 -514
  135. polars/io/json/__init__.py +0 -3
  136. polars/io/json/read.py +0 -101
  137. polars/io/ndjson.py +0 -332
  138. polars/io/parquet/__init__.py +0 -17
  139. polars/io/parquet/field_overwrites.py +0 -140
  140. polars/io/parquet/functions.py +0 -722
  141. polars/io/partition.py +0 -491
  142. polars/io/plugins.py +0 -187
  143. polars/io/pyarrow_dataset/__init__.py +0 -5
  144. polars/io/pyarrow_dataset/anonymous_scan.py +0 -109
  145. polars/io/pyarrow_dataset/functions.py +0 -79
  146. polars/io/scan_options/__init__.py +0 -5
  147. polars/io/scan_options/_options.py +0 -59
  148. polars/io/scan_options/cast_options.py +0 -126
  149. polars/io/spreadsheet/__init__.py +0 -6
  150. polars/io/spreadsheet/_utils.py +0 -52
  151. polars/io/spreadsheet/_write_utils.py +0 -647
  152. polars/io/spreadsheet/functions.py +0 -1323
  153. polars/lazyframe/__init__.py +0 -9
  154. polars/lazyframe/engine_config.py +0 -61
  155. polars/lazyframe/frame.py +0 -8564
  156. polars/lazyframe/group_by.py +0 -669
  157. polars/lazyframe/in_process.py +0 -42
  158. polars/lazyframe/opt_flags.py +0 -333
  159. polars/meta/__init__.py +0 -14
  160. polars/meta/build.py +0 -33
  161. polars/meta/index_type.py +0 -27
  162. polars/meta/thread_pool.py +0 -50
  163. polars/meta/versions.py +0 -120
  164. polars/ml/__init__.py +0 -0
  165. polars/ml/torch.py +0 -213
  166. polars/ml/utilities.py +0 -30
  167. polars/plugins.py +0 -155
  168. polars/py.typed +0 -0
  169. polars/pyproject.toml +0 -103
  170. polars/schema.py +0 -265
  171. polars/selectors.py +0 -3117
  172. polars/series/__init__.py +0 -5
  173. polars/series/array.py +0 -776
  174. polars/series/binary.py +0 -254
  175. polars/series/categorical.py +0 -246
  176. polars/series/datetime.py +0 -2275
  177. polars/series/list.py +0 -1087
  178. polars/series/plotting.py +0 -191
  179. polars/series/series.py +0 -9197
  180. polars/series/string.py +0 -2367
  181. polars/series/struct.py +0 -154
  182. polars/series/utils.py +0 -191
  183. polars/sql/__init__.py +0 -7
  184. polars/sql/context.py +0 -677
  185. polars/sql/functions.py +0 -139
  186. polars/string_cache.py +0 -185
  187. polars/testing/__init__.py +0 -13
  188. polars/testing/asserts/__init__.py +0 -9
  189. polars/testing/asserts/frame.py +0 -231
  190. polars/testing/asserts/series.py +0 -219
  191. polars/testing/asserts/utils.py +0 -12
  192. polars/testing/parametric/__init__.py +0 -33
  193. polars/testing/parametric/profiles.py +0 -107
  194. polars/testing/parametric/strategies/__init__.py +0 -22
  195. polars/testing/parametric/strategies/_utils.py +0 -14
  196. polars/testing/parametric/strategies/core.py +0 -615
  197. polars/testing/parametric/strategies/data.py +0 -452
  198. polars/testing/parametric/strategies/dtype.py +0 -436
  199. polars/testing/parametric/strategies/legacy.py +0 -169
  200. polars/type_aliases.py +0 -24
  201. polars_runtime_compat-1.34.0b3.dist-info/RECORD +0 -203
  202. {polars_runtime_compat-1.34.0b3.dist-info → polars_runtime_compat-1.34.0b4.dist-info}/WHEEL +0 -0
  203. {polars_runtime_compat-1.34.0b3.dist-info → polars_runtime_compat-1.34.0b4.dist-info}/licenses/LICENSE +0 -0
@@ -1,314 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import functools
4
- import re
5
- from contextlib import suppress
6
- from inspect import isclass
7
- from typing import TYPE_CHECKING, Any
8
-
9
- from polars.datatypes import (
10
- Binary,
11
- Boolean,
12
- Date,
13
- Datetime,
14
- Decimal,
15
- Duration,
16
- Float32,
17
- Float64,
18
- Int8,
19
- Int16,
20
- Int32,
21
- Int64,
22
- Int128,
23
- List,
24
- Null,
25
- String,
26
- Time,
27
- UInt8,
28
- UInt16,
29
- UInt32,
30
- UInt64,
31
- )
32
- from polars.datatypes._parse import parse_py_type_into_dtype
33
- from polars.datatypes.group import (
34
- INTEGER_DTYPES,
35
- UNSIGNED_INTEGER_DTYPES,
36
- )
37
-
38
- if TYPE_CHECKING:
39
- from polars._typing import PolarsDataType
40
-
41
-
42
- def dtype_from_database_typename(
43
- value: str,
44
- *,
45
- raise_unmatched: bool = True,
46
- ) -> PolarsDataType | None:
47
- """
48
- Attempt to infer Polars dtype from database cursor `type_code` string value.
49
-
50
- Examples
51
- --------
52
- >>> dtype_from_database_typename("INT2")
53
- Int16
54
- >>> dtype_from_database_typename("NVARCHAR")
55
- String
56
- >>> dtype_from_database_typename("NUMERIC(10,2)")
57
- Decimal(precision=10, scale=2)
58
- >>> dtype_from_database_typename("TIMESTAMP WITHOUT TZ")
59
- Datetime(time_unit='us', time_zone=None)
60
- """
61
- dtype: PolarsDataType | None = None
62
-
63
- # normalise string name/case (eg: 'IntegerType' -> 'INTEGER')
64
- original_value = value
65
- value = value.upper().replace("TYPE", "")
66
-
67
- # extract optional type modifier (eg: 'VARCHAR(64)' -> '64')
68
- if re.search(r"\([\w,: ]+\)$", value):
69
- modifier = value[value.find("(") + 1 : -1]
70
- value = value.split("(")[0]
71
- elif (
72
- not value.startswith(("<", ">")) and re.search(r"\[[\w,\]\[: ]+]$", value)
73
- ) or value.endswith(("[S]", "[MS]", "[US]", "[NS]")):
74
- modifier = value[value.find("[") + 1 : -1]
75
- value = value.split("[")[0]
76
- else:
77
- modifier = ""
78
-
79
- # array dtypes
80
- array_aliases = ("ARRAY", "LIST", "[]")
81
- if value.endswith(array_aliases) or value.startswith(array_aliases):
82
- for a in array_aliases:
83
- value = value.replace(a, "", 1) if value else ""
84
-
85
- nested: PolarsDataType | None = None
86
- if not value and modifier:
87
- nested = dtype_from_database_typename(
88
- value=modifier,
89
- raise_unmatched=False,
90
- )
91
- else:
92
- if inner_value := dtype_from_database_typename(
93
- value[1:-1]
94
- if (value[0], value[-1]) == ("<", ">")
95
- else re.sub(r"\W", "", re.sub(r"\WOF\W", "", value)),
96
- raise_unmatched=False,
97
- ):
98
- nested = inner_value
99
- elif modifier:
100
- nested = dtype_from_database_typename(
101
- value=modifier,
102
- raise_unmatched=False,
103
- )
104
- if nested:
105
- dtype = List(nested)
106
-
107
- # float dtypes
108
- elif value.startswith("FLOAT") or ("DOUBLE" in value) or (value == "REAL"):
109
- dtype = (
110
- Float32
111
- if value == "FLOAT4"
112
- or (value.endswith(("16", "32")) or (modifier in ("16", "32")))
113
- else Float64
114
- )
115
-
116
- # integer dtypes
117
- elif ("INTERVAL" not in value) and (
118
- value.startswith(("INT", "UINT", "UNSIGNED"))
119
- or value.endswith(("INT", "SERIAL"))
120
- or ("INTEGER" in value)
121
- or value in ("TINY", "SHORT", "LONG", "LONGLONG", "ROWID")
122
- ):
123
- sz: Any
124
- if "HUGEINT" in value:
125
- sz = 128
126
- elif (
127
- "LARGE" in value or value.startswith("BIG") or value in ("INT8", "LONGLONG")
128
- ):
129
- sz = 64
130
- elif "MEDIUM" in value or value in ("INT4", "UINT4", "LONG", "SERIAL"):
131
- sz = 32
132
- elif "SMALL" in value or value in ("INT2", "UINT2", "SHORT"):
133
- sz = 16
134
- elif "TINY" in value:
135
- sz = 8
136
- elif n := re.sub(r"^\D+", "", value):
137
- if (sz := int(n)) <= 8:
138
- sz = sz * 8
139
- else:
140
- sz = None
141
-
142
- sz = modifier if (not sz and modifier) else sz
143
- if not isinstance(sz, int):
144
- sz = int(sz) if isinstance(sz, str) and sz.isdigit() else None
145
- if (
146
- ("U" in value and "MEDIUM" not in value)
147
- or ("UNSIGNED" in value)
148
- or value == "ROWID"
149
- ):
150
- dtype = integer_dtype_from_nbits(sz, unsigned=True, default=UInt64)
151
- else:
152
- dtype = integer_dtype_from_nbits(sz, unsigned=False, default=Int64)
153
-
154
- # number types (note: 'number' alone is not that helpful and requires refinement)
155
- elif "NUMBER" in value and "CARDINAL" in value:
156
- dtype = UInt64
157
-
158
- # decimal dtypes
159
- elif (is_dec := ("DECIMAL" in value)) or ("NUMERIC" in value):
160
- if "," in modifier:
161
- prec, scale = modifier.split(",")
162
- dtype = Decimal(int(prec), int(scale))
163
- else:
164
- dtype = Decimal if is_dec else Float64
165
-
166
- # string dtypes
167
- elif (
168
- any(tp in value for tp in ("VARCHAR", "STRING", "TEXT", "UNICODE"))
169
- or value.startswith(("STR", "CHAR", "BPCHAR", "NCHAR", "UTF"))
170
- or value.endswith(("_UTF8", "_UTF16", "_UTF32"))
171
- ):
172
- dtype = String
173
-
174
- # binary dtypes
175
- elif value in ("BYTEA", "BYTES", "BLOB", "CLOB", "BINARY"):
176
- dtype = Binary
177
-
178
- # boolean dtypes
179
- elif value.startswith("BOOL"):
180
- dtype = Boolean
181
-
182
- # null dtype; odd, but valid
183
- elif value == "NULL":
184
- dtype = Null
185
-
186
- # temporal dtypes
187
- elif value.startswith(("DATETIME", "TIMESTAMP")) and not (value.endswith("[D]")):
188
- if any((tz in value.replace(" ", "")) for tz in ("TZ", "TIMEZONE")):
189
- if "WITHOUT" not in value:
190
- return None # there's a timezone, but we don't know what it is
191
- unit = timeunit_from_precision(modifier) if modifier else "us"
192
- dtype = Datetime(time_unit=(unit or "us")) # type: ignore[arg-type]
193
- else:
194
- value = re.sub(r"\d", "", value)
195
- if value in ("INTERVAL", "TIMEDELTA", "DURATION"):
196
- dtype = Duration
197
- elif value == "DATE":
198
- dtype = Date
199
- elif value == "TIME":
200
- dtype = Time
201
-
202
- if not dtype and raise_unmatched:
203
- msg = f"cannot infer dtype from {original_value!r} string value"
204
- raise ValueError(msg)
205
-
206
- return dtype
207
-
208
-
209
- def dtype_from_cursor_description(
210
- cursor: Any,
211
- description: tuple[Any, ...],
212
- ) -> PolarsDataType | None:
213
- """Attempt to infer Polars dtype from database cursor description `type_code`."""
214
- type_code, _disp_size, internal_size, precision, scale, *_ = description
215
- dtype: PolarsDataType | None = None
216
-
217
- if isclass(type_code):
218
- # python types, eg: int, float, str, etc
219
- with suppress(TypeError):
220
- dtype = parse_py_type_into_dtype(type_code) # type: ignore[arg-type]
221
-
222
- elif isinstance(type_code, str):
223
- # database/sql type names, eg: "VARCHAR", "NUMERIC", "BLOB", etc
224
- dtype = dtype_from_database_typename(
225
- value=type_code,
226
- raise_unmatched=False,
227
- )
228
-
229
- # check additional cursor attrs to refine dtype specification
230
- if dtype is not None:
231
- if dtype == Float64 and internal_size == 4:
232
- dtype = Float32
233
-
234
- elif dtype in INTEGER_DTYPES and internal_size in (2, 4, 8):
235
- bits = internal_size * 8
236
- dtype = integer_dtype_from_nbits(
237
- bits,
238
- unsigned=(dtype in UNSIGNED_INTEGER_DTYPES),
239
- default=dtype,
240
- )
241
- elif (
242
- dtype == Decimal
243
- and isinstance(precision, int)
244
- and isinstance(scale, int)
245
- and precision <= 38
246
- and scale <= 38
247
- ):
248
- dtype = Decimal(precision, scale)
249
-
250
- return dtype
251
-
252
-
253
- @functools.lru_cache(8)
254
- def integer_dtype_from_nbits(
255
- bits: int,
256
- *,
257
- unsigned: bool,
258
- default: PolarsDataType | None = None,
259
- ) -> PolarsDataType | None:
260
- """
261
- Return matching Polars integer dtype from num bits and signed/unsigned flag.
262
-
263
- Examples
264
- --------
265
- >>> integer_dtype_from_nbits(8, unsigned=False)
266
- Int8
267
- >>> integer_dtype_from_nbits(32, unsigned=True)
268
- UInt32
269
- """
270
- dtype = {
271
- (8, False): Int8,
272
- (8, True): UInt8,
273
- (16, False): Int16,
274
- (16, True): UInt16,
275
- (32, False): Int32,
276
- (32, True): UInt32,
277
- (64, False): Int64,
278
- (64, True): UInt64,
279
- (128, False): Int128,
280
- (128, True): Int128, # UInt128 not (yet?) supported
281
- }.get((bits, unsigned), None)
282
-
283
- if dtype is None and default is not None:
284
- return default
285
- return dtype
286
-
287
-
288
- def timeunit_from_precision(precision: int | str | None) -> str | None:
289
- """
290
- Return `time_unit` from integer precision value.
291
-
292
- Examples
293
- --------
294
- >>> timeunit_from_precision(3)
295
- 'ms'
296
- >>> timeunit_from_precision(5)
297
- 'us'
298
- >>> timeunit_from_precision(7)
299
- 'ns'
300
- """
301
- from math import ceil
302
-
303
- if not precision:
304
- return None
305
- elif isinstance(precision, str):
306
- if precision.isdigit():
307
- precision = int(precision)
308
- elif (precision := precision.lower()) in ("s", "ms", "us", "ns"):
309
- return "ms" if precision == "s" else precision
310
- try:
311
- n = min(max(3, int(ceil(precision / 3)) * 3), 9) # type: ignore[operator]
312
- return {3: "ms", 6: "us", 9: "ns"}.get(n)
313
- except TypeError:
314
- return None
@@ -1,144 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from importlib import import_module
5
- from typing import TYPE_CHECKING, Any
6
-
7
- from polars._dependencies import import_optional
8
- from polars._utils.various import parse_version
9
- from polars.convert import from_arrow
10
- from polars.exceptions import ModuleUpgradeRequiredError
11
-
12
- if TYPE_CHECKING:
13
- from collections.abc import Coroutine
14
-
15
- from polars import DataFrame
16
- from polars._typing import SchemaDict
17
-
18
-
19
- def _run_async(co: Coroutine[Any, Any, Any]) -> Any:
20
- """Run asynchronous code as if it was synchronous."""
21
- import asyncio
22
-
23
- import polars._utils.nest_asyncio
24
-
25
- polars._utils.nest_asyncio.apply() # type: ignore[attr-defined]
26
- return asyncio.run(co)
27
-
28
-
29
- def _read_sql_connectorx(
30
- query: str | list[str],
31
- connection_uri: str,
32
- partition_on: str | None = None,
33
- partition_range: tuple[int, int] | None = None,
34
- partition_num: int | None = None,
35
- protocol: str | None = None,
36
- schema_overrides: SchemaDict | None = None,
37
- pre_execution_query: str | list[str] | None = None,
38
- ) -> DataFrame:
39
- cx = import_optional("connectorx")
40
-
41
- if parse_version(cx.__version__) < (0, 4, 2):
42
- if pre_execution_query:
43
- msg = "'pre_execution_query' is only supported in connectorx version 0.4.2 or later"
44
- raise ValueError(msg)
45
- return_type = "arrow2"
46
- pre_execution_args = {}
47
- else:
48
- return_type = "arrow"
49
- pre_execution_args = {"pre_execution_query": pre_execution_query}
50
-
51
- try:
52
- tbl = cx.read_sql(
53
- conn=connection_uri,
54
- query=query,
55
- return_type=return_type,
56
- partition_on=partition_on,
57
- partition_range=partition_range,
58
- partition_num=partition_num,
59
- protocol=protocol,
60
- **pre_execution_args,
61
- )
62
- except BaseException as err:
63
- # basic sanitisation of /user:pass/ credentials exposed in connectorx errs
64
- errmsg = re.sub("://[^:]+:[^:]+@", "://***:***@", str(err))
65
- raise type(err)(errmsg) from err
66
-
67
- return from_arrow(tbl, schema_overrides=schema_overrides) # type: ignore[return-value]
68
-
69
-
70
- def _read_sql_adbc(
71
- query: str,
72
- connection_uri: str,
73
- schema_overrides: SchemaDict | None,
74
- execute_options: dict[str, Any] | None = None,
75
- ) -> DataFrame:
76
- with _open_adbc_connection(connection_uri) as conn, conn.cursor() as cursor:
77
- cursor.execute(query, **(execute_options or {}))
78
- tbl = cursor.fetch_arrow_table()
79
- return from_arrow(tbl, schema_overrides=schema_overrides) # type: ignore[return-value]
80
-
81
-
82
- def _get_adbc_driver_name_from_uri(connection_uri: str) -> str:
83
- driver_name = connection_uri.split(":", 1)[0].lower()
84
- # map uri prefix to ADBC name when not 1:1
85
- driver_suffix_map: dict[str, str] = {"postgres": "postgresql"}
86
- return driver_suffix_map.get(driver_name, driver_name)
87
-
88
-
89
- def _get_adbc_module_name_from_uri(connection_uri: str) -> str:
90
- driver_name = _get_adbc_driver_name_from_uri(connection_uri)
91
- return f"adbc_driver_{driver_name}"
92
-
93
-
94
- def _import_optional_adbc_driver(
95
- module_name: str,
96
- *,
97
- dbapi_submodule: bool = True,
98
- ) -> Any:
99
- # Always import top level module first. This will surface a better error for users
100
- # if the module does not exist. It doesn't negatively impact performance given the
101
- # dbapi submodule would also load it.
102
- adbc_driver = import_optional(
103
- module_name,
104
- err_prefix="ADBC",
105
- err_suffix="driver not detected",
106
- install_message=(
107
- "If ADBC supports this database, please run: pip install "
108
- f"{module_name.replace('_', '-')}"
109
- ),
110
- )
111
- if not dbapi_submodule:
112
- return adbc_driver
113
- # Importing the dbapi without pyarrow before adbc_driver_manager 1.6.0
114
- # raises ImportError: PyArrow is required for the DBAPI-compatible interface
115
- # Use importlib.import_module because Polars' import_optional clobbers this error
116
- try:
117
- adbc_driver_dbapi = import_module(f"{module_name}.dbapi")
118
- except ImportError as e:
119
- if "PyArrow is required for the DBAPI-compatible interface" in (str(e)):
120
- adbc_driver_manager = import_optional("adbc_driver_manager")
121
- adbc_str_version = getattr(adbc_driver_manager, "__version__", "0.0")
122
-
123
- msg = (
124
- "pyarrow is required for adbc-driver-manager < 1.6.0, found "
125
- f"{adbc_str_version}.\nEither upgrade `adbc-driver-manager` (suggested) or "
126
- "install `pyarrow`"
127
- )
128
- raise ModuleUpgradeRequiredError(msg) from None
129
- # if the error message was something different, re-raise it
130
- raise
131
- else:
132
- return adbc_driver_dbapi
133
-
134
-
135
- def _open_adbc_connection(connection_uri: str) -> Any:
136
- driver_name = _get_adbc_driver_name_from_uri(connection_uri)
137
- module_name = _get_adbc_module_name_from_uri(connection_uri)
138
- adbc_driver = _import_optional_adbc_driver(module_name)
139
-
140
- # some backends require the driver name to be stripped from the URI
141
- if driver_name in ("duckdb", "snowflake", "sqlite"):
142
- connection_uri = re.sub(f"^{driver_name}:/{{,3}}", "", connection_uri)
143
-
144
- return adbc_driver.connect(connection_uri)