outo-models-cli 0.2.1__tar.gz → 0.2.2__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 (50) hide show
  1. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/PKG-INFO +1 -1
  2. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/pyproject.toml +1 -1
  3. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/api/lfs_upload.py +12 -2
  4. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_lfs_upload.py +35 -0
  5. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/uv.lock +1 -1
  6. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/.gitignore +0 -0
  7. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/LICENSE +0 -0
  8. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/README.md +0 -0
  9. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/__init__.py +0 -0
  10. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/__main__.py +0 -0
  11. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/api/__init__.py +0 -0
  12. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/api/auth.py +0 -0
  13. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/api/lfs.py +0 -0
  14. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/api/lfs_batch.py +0 -0
  15. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/api/repos.py +0 -0
  16. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/api/upload.py +0 -0
  17. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/commands/__init__.py +0 -0
  18. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/commands/_shared.py +0 -0
  19. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/commands/_upload_commit.py +0 -0
  20. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/commands/auth.py +0 -0
  21. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/commands/download.py +0 -0
  22. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/commands/ls.py +0 -0
  23. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/commands/repo.py +0 -0
  24. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/commands/upload.py +0 -0
  25. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/config.py +0 -0
  26. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/downloader/__init__.py +0 -0
  27. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/downloader/transfer.py +0 -0
  28. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/downloader/walk.py +0 -0
  29. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/errors.py +0 -0
  30. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/http.py +0 -0
  31. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/main.py +0 -0
  32. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/src/outo_models_cli/matchers.py +0 -0
  33. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/conftest.py +0 -0
  34. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_api_crud.py +0 -0
  35. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_api_upload.py +0 -0
  36. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_cli_auth.py +0 -0
  37. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_cli_errors.py +0 -0
  38. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_cli_help.py +0 -0
  39. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_cli_repo.py +0 -0
  40. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_cli_upload_lfs.py +0 -0
  41. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_cli_xfer.py +0 -0
  42. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_config.py +0 -0
  43. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_download_lfs.py +0 -0
  44. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_download_repo.py +0 -0
  45. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_download_transfer.py +0 -0
  46. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_download_walk.py +0 -0
  47. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_errors.py +0 -0
  48. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_lfs.py +0 -0
  49. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_matchers.py +0 -0
  50. {outo_models_cli-0.2.1 → outo_models_cli-0.2.2}/tests/test_upload_commit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: outo-models-cli
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Command-line client for self-hosted outo-models servers — auth, repo, download, and upload.
5
5
  Project-URL: Homepage, https://github.com/outo-models/outo-models
6
6
  Project-URL: Documentation, https://github.com/outo-models/outo-models/blob/main/omc/README.md
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "outo-models-cli"
3
- version = "0.2.1"
3
+ version = "0.2.2"
4
4
  description = "Command-line client for self-hosted outo-models servers — auth, repo, download, and upload."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12,<3.13"
@@ -84,7 +84,8 @@ def _put_stream(
84
84
  chunk = fp.read(PUT_CHUNK_BYTES)
85
85
  if not chunk:
86
86
  break
87
- progress.update(task_id, advance=len(chunk))
87
+ if progress is not None and task_id is not None:
88
+ progress.update(task_id, advance=len(chunk))
88
89
  yield chunk
89
90
 
90
91
  response = client.put(url, content=_chunk_iter(), headers=headers)
@@ -96,8 +97,17 @@ def _put_stream(
96
97
  "Check that the configured PAT matches the account owner.",
97
98
  )
98
99
  if response.status_code == 413:
100
+ # Prefer the server's reason: it names the configured limit and the
101
+ # env var that raises it (field failure: the generic line gave the
102
+ # operator nothing actionable).
103
+ detail = ""
104
+ try:
105
+ detail = str(response.json().get("error", ""))
106
+ except ValueError:
107
+ detail = response.text[:200]
108
+ suffix = f" ({detail})" if detail else ""
99
109
  raise FileTooLargeError(
100
- f"LFS object exceeds the server's per-object cap: {path.name}.",
110
+ f"{path.name} was rejected by the server as too large.{suffix}",
101
111
  )
102
112
  if response.status_code >= 400:
103
113
  raise map_response_error(response)
@@ -64,3 +64,38 @@ class TestPartitionHashingProgress:
64
64
  partition = partition_files([big, small], cap_bytes=512, show_progress=True)
65
65
  assert [f.name for f in partition.small] == ["small.txt"]
66
66
  assert partition.large and partition.large[0].path.name == "big.bin"
67
+
68
+
69
+ class Test413SurfacesServerReason:
70
+ def test_put_413_includes_server_detail(self, tmp_path):
71
+ import httpx
72
+ import pytest
73
+
74
+ from outo_models_cli.api.lfs_upload import _put_stream
75
+ from outo_models_cli.errors import FileTooLargeError
76
+
77
+ big = tmp_path / "shard-00001.safetensors"
78
+ big.write_bytes(b"z" * 32)
79
+ transport = httpx.MockTransport(
80
+ lambda req: httpx.Response(
81
+ 413,
82
+ json={
83
+ "error": (
84
+ "object exceeds per-object limit 107374182400 bytes "
85
+ "(raise OUTO_LFS_MAX_OBJECT_BYTES ...)"
86
+ )
87
+ },
88
+ )
89
+ )
90
+ client = httpx.Client(transport=transport)
91
+ with pytest.raises(FileTooLargeError) as excinfo:
92
+ _put_stream(
93
+ client,
94
+ url="http://srv/put",
95
+ path=big,
96
+ extra_headers={},
97
+ progress=None,
98
+ task_id=None,
99
+ )
100
+ assert "shard-00001.safetensors" in str(excinfo.value)
101
+ assert "OUTO_LFS_MAX_OBJECT_BYTES" in str(excinfo.value)
@@ -227,7 +227,7 @@ wheels = [
227
227
 
228
228
  [[package]]
229
229
  name = "outo-models-cli"
230
- version = "0.2.1"
230
+ version = "0.2.2"
231
231
  source = { editable = "." }
232
232
  dependencies = [
233
233
  { name = "httpx" },
File without changes