fdl-cli 0.14.0__tar.gz → 0.14.1__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.
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/CHANGELOG.md +11 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/PKG-INFO +1 -1
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/pyproject.toml +1 -1
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/stores.py +15 -1
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/test_http.py +15 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.github/workflows/docs.yml +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.github/workflows/publish.yml +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.github/workflows/release.yml +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.gitignore +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.node-version +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.python-version +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/CLAUDE.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/CONTRIBUTING.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/LICENSE +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/README.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/blume.config.ts +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/concepts/meta.ts +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/concepts/repositories.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/concepts/versions-and-refs.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/concepts/working-catalogs.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/getting-started.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/building-a-host.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/meta.ts +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/mirrors.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/public-and-private.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/serving-over-http.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/stores.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/index.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/internals/ducklake-formats.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/internals/inside-a-repository.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/internals/meta.ts +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/concepts/meta.ts +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/concepts/repositories.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/concepts/versions-and-refs.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/concepts/working-catalogs.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/getting-started.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/building-a-host.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/meta.ts +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/mirrors.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/public-and-private.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/serving-over-http.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/stores.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/index.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/internals/ducklake-formats.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/internals/inside-a-repository.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/internals/meta.ts +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/reference/cli.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/reference/meta.ts +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/reference/python.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/data-files.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/http.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/index.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/layout.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/meta.ts +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/reading.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/refs.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/versions.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/writing.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/reference/cli.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/reference/meta.ts +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/reference/python.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/data-files.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/http.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/index.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/layout.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/meta.ts +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/reading.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/refs.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/versions.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/writing.md +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/package-lock.json +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/package.json +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/public/CNAME +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/__init__.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/catalog.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/cli.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/dataset.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/layout.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/py.typed +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/refs.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/repo.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/store.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/version.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/http_repo.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/test_cli.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/test_dataset.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/test_repo.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/test_stores.py +0 -0
- {fdl_cli-0.14.0 → fdl_cli-0.14.1}/uv.lock +0 -0
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## v0.14.1 (2026-11-01)
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
- Name fdl in the User-Agent of HTTP requests
|
|
9
|
+
([`f1fa818`](https://github.com/queria-io/fdl/commit/f1fa818c02ff66ef50a6277d258719dc446bb129))
|
|
10
|
+
|
|
11
|
+
Cloudflare's browser integrity check refuses the default Python-urllib agent with 403 (error code
|
|
12
|
+
1010), so checkout from such a host failed.
|
|
13
|
+
|
|
14
|
+
|
|
4
15
|
## v0.14.0 (2026-11-01)
|
|
5
16
|
|
|
6
17
|
### Documentation
|
|
@@ -8,6 +8,7 @@ missing, 412 for a failed condition), which is all `fdl.store` looks at.
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
10
|
import hashlib
|
|
11
|
+
import importlib.metadata
|
|
11
12
|
import json
|
|
12
13
|
import os
|
|
13
14
|
import urllib.error
|
|
@@ -17,6 +18,17 @@ from typing import Iterator, Sequence
|
|
|
17
18
|
from urllib.parse import quote, urlencode, urlparse
|
|
18
19
|
|
|
19
20
|
|
|
21
|
+
def _version() -> str:
|
|
22
|
+
try:
|
|
23
|
+
return importlib.metadata.version("fdl-cli")
|
|
24
|
+
except importlib.metadata.PackageNotFoundError:
|
|
25
|
+
return "dev"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
#: Sent with every request. Some hosts refuse the default ``Python-urllib/x.y``.
|
|
29
|
+
USER_AGENT = f"fdl/{_version()}"
|
|
30
|
+
|
|
31
|
+
|
|
20
32
|
class StoreError(RuntimeError):
|
|
21
33
|
def __init__(self, message: str, *, status: int | None = None) -> None:
|
|
22
34
|
super().__init__(message)
|
|
@@ -215,7 +227,9 @@ class HttpStore:
|
|
|
215
227
|
headers: dict[str, str] | None = None,
|
|
216
228
|
):
|
|
217
229
|
url = self.root + quote(key) + ("?" + urlencode(query) if query else "")
|
|
218
|
-
request = urllib.request.Request(
|
|
230
|
+
request = urllib.request.Request(
|
|
231
|
+
url, data=data, method=method, headers={"User-Agent": USER_AGENT, **(headers or {})}
|
|
232
|
+
)
|
|
219
233
|
if self.token:
|
|
220
234
|
request.add_header("Authorization", f"Bearer {self.token}")
|
|
221
235
|
try:
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import json
|
|
6
|
+
import urllib.error
|
|
7
|
+
import urllib.request
|
|
6
8
|
from pathlib import Path
|
|
7
9
|
|
|
8
10
|
import duckdb
|
|
@@ -108,3 +110,16 @@ def test_the_round_trip_over_http(served, tmp_path: Path) -> None:
|
|
|
108
110
|
f"ATTACH 'ducklake:{frozen}' AS v (READ_ONLY, DATA_PATH '{repo.data_url(local)}', OVERRIDE_DATA_PATH true)"
|
|
109
111
|
)
|
|
110
112
|
assert con.execute("SELECT towns FROM v.main.roads").fetchone() == (1,)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_requests_name_fdl(monkeypatch) -> None:
|
|
116
|
+
sent = []
|
|
117
|
+
|
|
118
|
+
def urlopen(request):
|
|
119
|
+
sent.append(request)
|
|
120
|
+
raise urllib.error.URLError("offline")
|
|
121
|
+
|
|
122
|
+
monkeypatch.setattr(urllib.request, "urlopen", urlopen)
|
|
123
|
+
with pytest.raises(StoreError):
|
|
124
|
+
HttpStore("https://example.invalid/repo/").get("fdl.json")
|
|
125
|
+
assert sent[0].get_header("User-agent").startswith("fdl/")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|