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.
Files changed (89) hide show
  1. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/CHANGELOG.md +11 -0
  2. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/PKG-INFO +1 -1
  3. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/pyproject.toml +1 -1
  4. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/stores.py +15 -1
  5. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/test_http.py +15 -0
  6. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.github/workflows/docs.yml +0 -0
  7. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.github/workflows/publish.yml +0 -0
  8. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.github/workflows/release.yml +0 -0
  9. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.gitignore +0 -0
  10. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.node-version +0 -0
  11. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/.python-version +0 -0
  12. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/CLAUDE.md +0 -0
  13. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/CONTRIBUTING.md +0 -0
  14. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/LICENSE +0 -0
  15. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/README.md +0 -0
  16. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/blume.config.ts +0 -0
  17. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/concepts/meta.ts +0 -0
  18. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/concepts/repositories.md +0 -0
  19. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/concepts/versions-and-refs.md +0 -0
  20. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/concepts/working-catalogs.md +0 -0
  21. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/getting-started.md +0 -0
  22. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/building-a-host.md +0 -0
  23. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/meta.ts +0 -0
  24. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/mirrors.md +0 -0
  25. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/public-and-private.md +0 -0
  26. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/serving-over-http.md +0 -0
  27. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/guides/stores.md +0 -0
  28. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/index.md +0 -0
  29. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/internals/ducklake-formats.md +0 -0
  30. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/internals/inside-a-repository.md +0 -0
  31. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/internals/meta.ts +0 -0
  32. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/concepts/meta.ts +0 -0
  33. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/concepts/repositories.md +0 -0
  34. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/concepts/versions-and-refs.md +0 -0
  35. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/concepts/working-catalogs.md +0 -0
  36. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/getting-started.md +0 -0
  37. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/building-a-host.md +0 -0
  38. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/meta.ts +0 -0
  39. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/mirrors.md +0 -0
  40. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/public-and-private.md +0 -0
  41. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/serving-over-http.md +0 -0
  42. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/guides/stores.md +0 -0
  43. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/index.md +0 -0
  44. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/internals/ducklake-formats.md +0 -0
  45. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/internals/inside-a-repository.md +0 -0
  46. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/internals/meta.ts +0 -0
  47. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/reference/cli.md +0 -0
  48. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/reference/meta.ts +0 -0
  49. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/reference/python.md +0 -0
  50. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/data-files.md +0 -0
  51. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/http.md +0 -0
  52. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/index.md +0 -0
  53. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/layout.md +0 -0
  54. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/meta.ts +0 -0
  55. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/reading.md +0 -0
  56. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/refs.md +0 -0
  57. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/versions.md +0 -0
  58. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/ja/spec/writing.md +0 -0
  59. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/reference/cli.md +0 -0
  60. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/reference/meta.ts +0 -0
  61. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/reference/python.md +0 -0
  62. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/data-files.md +0 -0
  63. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/http.md +0 -0
  64. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/index.md +0 -0
  65. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/layout.md +0 -0
  66. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/meta.ts +0 -0
  67. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/reading.md +0 -0
  68. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/refs.md +0 -0
  69. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/versions.md +0 -0
  70. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/docs/spec/writing.md +0 -0
  71. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/package-lock.json +0 -0
  72. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/package.json +0 -0
  73. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/public/CNAME +0 -0
  74. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/__init__.py +0 -0
  75. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/catalog.py +0 -0
  76. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/cli.py +0 -0
  77. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/dataset.py +0 -0
  78. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/layout.py +0 -0
  79. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/py.typed +0 -0
  80. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/refs.py +0 -0
  81. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/repo.py +0 -0
  82. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/store.py +0 -0
  83. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/src/fdl/version.py +0 -0
  84. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/http_repo.py +0 -0
  85. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/test_cli.py +0 -0
  86. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/test_dataset.py +0 -0
  87. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/test_repo.py +0 -0
  88. {fdl_cli-0.14.0 → fdl_cli-0.14.1}/tests/test_stores.py +0 -0
  89. {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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: fdl-cli
3
- Version: 0.14.0
3
+ Version: 0.14.1
4
4
  Summary: Versions of a DuckLake catalog on object storage, kept the way Git keeps commits
5
5
  Project-URL: Homepage, https://fdl.flo8s.com/
6
6
  Project-URL: Documentation, https://fdl.flo8s.com/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fdl-cli"
3
- version = "0.14.0"
3
+ version = "0.14.1"
4
4
  description = "Versions of a DuckLake catalog on object storage, kept the way Git keeps commits"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -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(url, data=data, method=method, headers=dict(headers or {}))
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