sdmxlib 0.28.1__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.1 → sdmxlib-0.28.3}/PKG-INFO +1 -1
  2. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/pyproject.toml +1 -1
  3. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/local/_data_store.py +30 -2
  4. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/README.md +0 -0
  5. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/__init__.py +0 -0
  6. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/__init__.py +0 -0
  7. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/client.py +0 -0
  8. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/federated.py +0 -0
  9. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/filters.py +0 -0
  10. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/policy.py +0 -0
  11. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/providers.py +0 -0
  12. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/query.py +0 -0
  13. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/registry.py +0 -0
  14. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/session.py +0 -0
  15. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/catalog.py +0 -0
  16. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/data_store.py +0 -0
  17. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/__init__.py +0 -0
  18. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_csv/__init__.py +0 -0
  19. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_csv/reader.py +0 -0
  20. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_csv/writer.py +0 -0
  21. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/__init__.py +0 -0
  22. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/metadata.py +0 -0
  23. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/reader.py +0 -0
  24. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/writer.py +0 -0
  25. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/__init__.py +0 -0
  26. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/namespaces.py +0 -0
  27. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/reader.py +0 -0
  28. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/writer.py +0 -0
  29. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/__init__.py +0 -0
  30. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/metadata.py +0 -0
  31. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/namespaces.py +0 -0
  32. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/reader.py +0 -0
  33. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/writer.py +0 -0
  34. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/local/__init__.py +0 -0
  35. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/local/_registry.py +0 -0
  36. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/__init__.py +0 -0
  37. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/annotations.py +0 -0
  38. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/base.py +0 -0
  39. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/binding.py +0 -0
  40. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/category.py +0 -0
  41. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/code_query.py +0 -0
  42. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/codelist.py +0 -0
  43. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/collections.py +0 -0
  44. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/concept.py +0 -0
  45. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/constraint.py +0 -0
  46. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/convert.py +0 -0
  47. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/dataflow.py +0 -0
  48. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/dataset.py +0 -0
  49. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/datastructure.py +0 -0
  50. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/expr.py +0 -0
  51. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/hierarchy.py +0 -0
  52. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/hierarchy_query.py +0 -0
  53. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/in_memory_registry.py +0 -0
  54. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/istring.py +0 -0
  55. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/mapping.py +0 -0
  56. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/message.py +0 -0
  57. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/metadataflow.py +0 -0
  58. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/metadataset.py +0 -0
  59. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/metadatastructure.py +0 -0
  60. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/organisation.py +0 -0
  61. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/provision.py +0 -0
  62. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/ref.py +0 -0
  63. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/registry.py +0 -0
  64. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/representation.py +0 -0
  65. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/urn.py +0 -0
  66. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/validation.py +0 -0
  67. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/polars.py +0 -0
  68. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/py.typed +0 -0
  69. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/rest.py +0 -0
  70. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/sql.py +0 -0
  71. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/storage/__init__.py +0 -0
  72. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/storage/lazy.py +0 -0
  73. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/storage/readers.py +0 -0
  74. {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/storage/schema.py +0 -0
  75. {sdmxlib-0.28.1 → 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.1
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.1"
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" }
@@ -195,6 +195,23 @@ class DuckDBDataStore:
195
195
  # Loading extensions can change the search_path; reset to
196
196
  # ``sdmx`` so any colocated Registry's internal queries stay clean.
197
197
  self._conn.execute("SET search_path = 'sdmx'")
198
+ if self._needs_azure():
199
+ # Force the named curl transport adapter. The Azure SDK's
200
+ # default transport on Linux uses a statically-linked HTTP
201
+ # stack that doesn't honour the standard ``SSL_CERT_FILE`` /
202
+ # ``CURL_CA_BUNDLE`` environment variables, so it fails on
203
+ # any image whose CA store is at a non-default path. The
204
+ # ``curl`` adapter delegates to libcurl, which reads those
205
+ # env vars at handshake time.
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'")
198
215
  if self._azure_credentials:
199
216
  sql = _azure_create_secret_sql(self._azure_credentials)
200
217
  self._conn.execute(sql)
@@ -208,13 +225,24 @@ class DuckDBDataStore:
208
225
  self._conn.execute("SET search_path = 'sdmx'")
209
226
 
210
227
  def _needs_azure(self) -> bool:
211
- """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
+ """
212
240
  if self._azure_credentials:
213
241
  return True
214
242
  if self._attach:
215
243
  for spec in self._attach.values():
216
244
  spec_text = spec if isinstance(spec, str) else " ".join(s for s in spec if s)
217
- if "abfss://" in spec_text:
245
+ if "abfss://" in spec_text or "ducklake:" in spec_text:
218
246
  return True
219
247
  return False
220
248
 
File without changes
File without changes
File without changes
File without changes
File without changes