floe-python 0.8.1__py3-none-any.whl → 0.8.2__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.
floe/config/validate.py CHANGED
@@ -330,6 +330,8 @@ def _check_iceberg(
330
330
  raise _fail(
331
331
  entity, f"sink.accepted.iceberg.catalog references unknown catalog {name}"
332
332
  )
333
+ if definition.type == "glue" and "{domain}" in (definition.database or "") and not (iceberg.namespace or entity.domain): # fmt: skip
334
+ raise _fail(entity, f"sink.accepted.iceberg.namespace or domain is required for catalog {name} database containing {{domain}}") # fmt: skip
333
335
  # Unity is rejected at parse (D1); the registry checked `warehouse_storage`.
334
336
  if definition.type == "glue" and entity.sink.write_mode.startswith("merge"):
335
337
  # ponytail: merges run through DuckDB, attached to REST catalogs only; attach Glue when a merge needs it
floe/iceberg/sink.py CHANGED
@@ -70,9 +70,12 @@ def resolve_target(storages: StoragesConfig | None, catalogs: CatalogsConfig | N
70
70
  catalog = next((c for c in (catalogs.definitions if catalogs else []) if c.name == name), None) # fmt: skip
71
71
  if catalog is None: # validated; kept for callers that skip validation
72
72
  raise FloeConfigError(f"entity.name={entity.name} sink.accepted.iceberg.catalog references unknown catalog {name}") # fmt: skip
73
- namespace = catalog_ident(
74
- sink.iceberg.namespace or entity.domain or catalog.database or "default"
75
- )
73
+ # what `{domain}` in the database stands for (validated: set when the database has the token)
74
+ scope = sink.iceberg.namespace or entity.domain
75
+ database = catalog.database
76
+ if database is not None:
77
+ database = database.replace("{domain}", catalog_ident(scope or ""))
78
+ namespace = catalog_ident(scope or database or "default")
76
79
  table = catalog_ident(sink.iceberg.table or entity.name)
77
80
  field = f"entity.name={entity.name} sink.accepted.storage"
78
81
  accepted_uri, storage = resolve_path(storages, config_dir, sink.storage, sink.path, field) # fmt: skip
@@ -85,8 +88,8 @@ def resolve_target(storages: StoragesConfig | None, catalogs: CatalogsConfig | N
85
88
  else:
86
89
  location = accepted_uri
87
90
  # Rust: the Glue database holds the table; the namespace only names its location
88
- if catalog.database is not None:
89
- namespace = catalog.database
91
+ if database is not None:
92
+ namespace = database
90
93
  return IcebergTarget(catalog, storage, namespace, table, location, accepted_uri) # fmt: skip
91
94
 
92
95
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: floe-python
3
- Version: 0.8.1
3
+ Version: 0.8.2
4
4
  Summary: Floe: a data-contract runtime for file ingestion
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.11
@@ -24,13 +24,13 @@ floe/config/profile.py,sha256=mYbyFse2pBUFuV5TMtl0RFrfyPUnJhdklbAX5eSAM88,15564
24
24
  floe/config/project.py,sha256=zgTOhTDlbMr1chViMEZyv0drozZdumTaIoKDL0vv9sw,14141
25
25
  floe/config/storage.py,sha256=BK3P65ukFqNgmbjCcuYmXR04OScf1yD8f19vGJq-aDI,6234
26
26
  floe/config/types.py,sha256=4eveoOlyGmNxyZpI1PSjli9lnXLPc1-jYj4fL8qHN_8,5038
27
- floe/config/validate.py,sha256=MRwGztx0xbcqGjpIKjfCMDMeyTz-pd4Mr9XrfyiW5CQ,35571
27
+ floe/config/validate.py,sha256=-cDn9CKfR1BmAATgYy1PWlTWSkpu4mjt4PMKNL7k2FE,35858
28
28
  floe/config/vars.py,sha256=7Bq0IU0KrFeRlyA8W9-F0gDSDKfXCfFpBrX08H8Flvw,4577
29
29
  floe/config/yaml.py,sha256=HeFGhKFxYkiqQOwljYOgUD5naJyxL_ZIX6hUIS36tzU,10071
30
30
  floe/iceberg/catalog.py,sha256=TeINK-jVZJAurROEeovVNK3s4PY-czeWih1y_KWohP8,14455
31
31
  floe/iceberg/compact.py,sha256=5O372vAIsvgRc2PGihryAsrQ0otn0F30AQu-cetRCP0,7123
32
32
  floe/iceberg/merge.py,sha256=VE1Odf2B34Gxj7ZcuhbrfbgTGM9AdiDz6_2BbcQ-kSQ,12448
33
- floe/iceberg/sink.py,sha256=854HAAz4UmsgBGR6TrBy3tcqWk-ss1RcuLK-ynQe0gA,11040
33
+ floe/iceberg/sink.py,sha256=uE0jLhhxRFOeKi7ChAzstKexy1ZrovE4EKATGTYn-Gk,11255
34
34
  floe/iceberg/unique.py,sha256=PKUFEcCkU71k66__KfUE7NTos73ZYlZbb8GJPn0yFoo,2958
35
35
  floe/iceberg/write.py,sha256=zrFeeJu-YT4Pxo9u-fRujUtFb1Epx1KFoq2qFyP1iGs,11036
36
36
  floe/lineage/events.py,sha256=4txd8bGUwKBZd-8Aw_ebTurhlxAYk8SVMgH8vSjC3bs,6682
@@ -59,8 +59,8 @@ floe/storage/s3.py,sha256=XcG1qJTEY3KLSMLT950mUdrAxuCA8-Gx3fpNSzyV_Xo,7508
59
59
  floe/storage/types.py,sha256=FvAEXWMdVdopRK276JyETRYGOva2-uR8pZvsWj6Xvy0,993
60
60
  floe/write/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
61
  floe/write/outputs.py,sha256=5LgN_8PMPPOgkRVZw_KvxYXmc02-meL7iZLeMKVtufQ,4932
62
- floe_python-0.8.1.dist-info/METADATA,sha256=t7zQL0mXQAhLksYIkXMkuuYolrQL3046WRDPjZurnQI,442
63
- floe_python-0.8.1.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
64
- floe_python-0.8.1.dist-info/entry_points.txt,sha256=DU75r-E3zcK0quvwg5iT5DeWbUJck_Tz80bEj1IIzHA,40
65
- floe_python-0.8.1.dist-info/licenses/LICENSE,sha256=dUhuoK-TCRQMpuLEAdfme-qPSJI0TlcH9jlNxeg9_EQ,1056
66
- floe_python-0.8.1.dist-info/RECORD,,
62
+ floe_python-0.8.2.dist-info/METADATA,sha256=O9qNqOIcnbGRrkwUAcPGKh35ayNq0bG4YwZMpQ-z90g,442
63
+ floe_python-0.8.2.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
64
+ floe_python-0.8.2.dist-info/entry_points.txt,sha256=DU75r-E3zcK0quvwg5iT5DeWbUJck_Tz80bEj1IIzHA,40
65
+ floe_python-0.8.2.dist-info/licenses/LICENSE,sha256=dUhuoK-TCRQMpuLEAdfme-qPSJI0TlcH9jlNxeg9_EQ,1056
66
+ floe_python-0.8.2.dist-info/RECORD,,