sdmxlib 0.28.2__tar.gz → 0.28.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/PKG-INFO +1 -1
  2. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/pyproject.toml +1 -1
  3. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/local/_data_store.py +22 -3
  4. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/README.md +0 -0
  5. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/__init__.py +0 -0
  6. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/api/__init__.py +0 -0
  7. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/api/client.py +0 -0
  8. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/api/federated.py +0 -0
  9. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/api/filters.py +0 -0
  10. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/api/policy.py +0 -0
  11. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/api/providers.py +0 -0
  12. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/api/query.py +0 -0
  13. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/api/registry.py +0 -0
  14. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/api/session.py +0 -0
  15. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/catalog.py +0 -0
  16. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/data_store.py +0 -0
  17. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/__init__.py +0 -0
  18. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_csv/__init__.py +0 -0
  19. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_csv/reader.py +0 -0
  20. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_csv/writer.py +0 -0
  21. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/__init__.py +0 -0
  22. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/metadata.py +0 -0
  23. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/reader.py +0 -0
  24. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/writer.py +0 -0
  25. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/__init__.py +0 -0
  26. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/namespaces.py +0 -0
  27. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/reader.py +0 -0
  28. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/writer.py +0 -0
  29. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/__init__.py +0 -0
  30. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/metadata.py +0 -0
  31. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/namespaces.py +0 -0
  32. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/reader.py +0 -0
  33. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/writer.py +0 -0
  34. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/local/__init__.py +0 -0
  35. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/local/_registry.py +0 -0
  36. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/__init__.py +0 -0
  37. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/annotations.py +0 -0
  38. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/base.py +0 -0
  39. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/binding.py +0 -0
  40. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/category.py +0 -0
  41. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/code_query.py +0 -0
  42. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/codelist.py +0 -0
  43. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/collections.py +0 -0
  44. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/concept.py +0 -0
  45. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/constraint.py +0 -0
  46. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/convert.py +0 -0
  47. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/dataflow.py +0 -0
  48. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/dataset.py +0 -0
  49. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/datastructure.py +0 -0
  50. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/expr.py +0 -0
  51. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/hierarchy.py +0 -0
  52. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/hierarchy_query.py +0 -0
  53. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/in_memory_registry.py +0 -0
  54. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/istring.py +0 -0
  55. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/mapping.py +0 -0
  56. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/message.py +0 -0
  57. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/metadataflow.py +0 -0
  58. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/metadataset.py +0 -0
  59. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/metadatastructure.py +0 -0
  60. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/organisation.py +0 -0
  61. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/provision.py +0 -0
  62. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/ref.py +0 -0
  63. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/registry.py +0 -0
  64. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/representation.py +0 -0
  65. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/urn.py +0 -0
  66. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/model/validation.py +0 -0
  67. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/polars.py +0 -0
  68. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/py.typed +0 -0
  69. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/rest.py +0 -0
  70. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/sql.py +0 -0
  71. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/storage/__init__.py +0 -0
  72. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/storage/lazy.py +0 -0
  73. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/storage/readers.py +0 -0
  74. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/storage/schema.py +0 -0
  75. {sdmxlib-0.28.2 → sdmxlib-0.28.3}/src/sdmxlib/storage/writers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sdmxlib
3
- Version: 0.28.2
3
+ Version: 0.28.3
4
4
  Summary: SDMX structural metadata library for Python
5
5
  Keywords: sdmx,statistics,metadata,datastructure
6
6
  Author: gabrielgellner
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sdmxlib"
3
- version = "0.28.2"
3
+ version = "0.28.3"
4
4
  description = "SDMX structural metadata library for Python"
5
5
  readme = "README.md"
6
6
  license = { text = "Apache-2.0" }
@@ -203,7 +203,15 @@ class DuckDBDataStore:
203
203
  # any image whose CA store is at a non-default path. The
204
204
  # ``curl`` adapter delegates to libcurl, which reads those
205
205
  # env vars at handshake time.
206
- self._conn.execute("SET azure_transport_option_type = 'curl'")
206
+ #
207
+ # ``SET GLOBAL`` (not bare ``SET``) is required because the
208
+ # data-plane uses per-thread cursors (Phase 5 of #75). A
209
+ # bare ``SET`` is session-scoped and bypassed by every cursor
210
+ # opened later, so the curl transport wouldn't take effect on
211
+ # the codepath where abfss reads actually happen — surfacing
212
+ # as "Problem with the SSL CA cert" on every data query. See
213
+ # issue #81.
214
+ self._conn.execute("SET GLOBAL azure_transport_option_type = 'curl'")
207
215
  if self._azure_credentials:
208
216
  sql = _azure_create_secret_sql(self._azure_credentials)
209
217
  self._conn.execute(sql)
@@ -217,13 +225,24 @@ class DuckDBDataStore:
217
225
  self._conn.execute("SET search_path = 'sdmx'")
218
226
 
219
227
  def _needs_azure(self) -> bool:
220
- """True if Azure secret/extension setup is required for this session."""
228
+ """True if Azure secret/extension setup is required for this session.
229
+
230
+ Matches against ATTACH specs that either (a) name an ``abfss://``
231
+ path directly or (b) ATTACH a DuckLake catalog (``ducklake:``)
232
+ whose ``data_path`` is stored inside the lake metadata file —
233
+ invisible to the ATTACH SQL but routed through the Azure backend
234
+ on first read. Catching ``ducklake:`` here is over-broad for
235
+ purely local lakes, but the cost of a spurious curl-transport SET
236
+ is zero (DuckDB ignores it until something talks to Azure); the
237
+ cost of a false negative is a TLS handshake failure on every data
238
+ query. See issue #81.
239
+ """
221
240
  if self._azure_credentials:
222
241
  return True
223
242
  if self._attach:
224
243
  for spec in self._attach.values():
225
244
  spec_text = spec if isinstance(spec, str) else " ".join(s for s in spec if s)
226
- if "abfss://" in spec_text:
245
+ if "abfss://" in spec_text or "ducklake:" in spec_text:
227
246
  return True
228
247
  return False
229
248
 
File without changes
File without changes
File without changes
File without changes
File without changes