Skip to content

Commit 2d16887

Browse files
committed
Simplify upload file
1 parent aaa0e0b commit 2d16887

File tree

3 files changed

+8
-99
lines changed

3 files changed

+8
-99
lines changed

src/fastapi_cloud_cli/commands/deploy.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from itertools import cycle
88
from pathlib import Path, PurePosixPath
99
from textwrap import dedent
10-
from typing import Annotated, Any
10+
from typing import Annotated, Any, BinaryIO, cast
1111

1212
import fastar
1313
import rignore
@@ -247,7 +247,7 @@ def progress_callback(bytes_read: int) -> None:
247247
upload_response = client.post(
248248
upload_data.url,
249249
data=upload_data.fields,
250-
files={"file": archive_file_with_progress},
250+
files={"file": cast(BinaryIO, archive_file_with_progress)},
251251
)
252252

253253
upload_response.raise_for_status()
Lines changed: 5 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from collections.abc import Callable, Iterator
1+
from collections.abc import Callable
22
from datetime import datetime
33
from typing import Any, BinaryIO
44

55

6-
class ProgressFile(BinaryIO):
7-
"""Wraps a file object to track read progress."""
6+
class ProgressFile:
7+
"""Wrap a binary file object and report upload progress as it is read."""
88

99
def __init__(
1010
self,
@@ -26,70 +26,5 @@ def read(self, n: int = -1) -> bytes:
2626
self._last_update_time = now_
2727
return data
2828

29-
def fileno(self) -> int:
30-
return self._file.fileno()
31-
32-
@property
33-
def name(self) -> str:
34-
return self._file.name
35-
36-
def seek(self, offset: int, whence: int = 0) -> int:
37-
return self._file.seek(offset, whence)
38-
39-
def tell(self) -> int:
40-
return self._file.tell()
41-
42-
def __iter__(self) -> Iterator[bytes]:
43-
return self._file.__iter__()
44-
45-
def __next__(self) -> bytes:
46-
return next(self._file) # pragma: no cover
47-
48-
@property
49-
def mode(self) -> str:
50-
return self._file.mode # pragma: no cover
51-
52-
def readable(self) -> bool:
53-
return self._file.readable() # pragma: no cover
54-
55-
def seekable(self) -> bool:
56-
return self._file.seekable() # pragma: no cover
57-
58-
# Methods below are just to satisfy the BinaryIO interface
59-
60-
def write(self, *_args: Any, **kwargs: Any) -> int:
61-
raise NotImplementedError() # pragma: no cover
62-
63-
def readline(self, *_args: Any, **kwargs: Any) -> bytes:
64-
raise NotImplementedError() # pragma: no cover
65-
66-
def readlines(self, *_args: Any, **kwargs: Any) -> list[bytes]:
67-
raise NotImplementedError() # pragma: no cover
68-
69-
def writelines(self, *_args: Any, **kwargs: Any) -> None:
70-
raise NotImplementedError() # pragma: no cover
71-
72-
def __enter__(self) -> BinaryIO:
73-
raise NotImplementedError() # pragma: no cover
74-
75-
def __exit__(self, *_args: Any) -> None:
76-
raise NotImplementedError() # pragma: no cover
77-
78-
def close(self) -> None:
79-
raise NotImplementedError() # pragma: no cover
80-
81-
@property
82-
def closed(self) -> bool:
83-
raise NotImplementedError() # pragma: no cover
84-
85-
def flush(self) -> None:
86-
raise NotImplementedError() # pragma: no cover
87-
88-
def isatty(self) -> bool:
89-
raise NotImplementedError() # pragma: no cover
90-
91-
def writable(self) -> bool:
92-
raise NotImplementedError() # pragma: no cover
93-
94-
def truncate(self, *_args: Any, **kwargs: Any) -> int:
95-
raise NotImplementedError() # pragma: no cover
29+
def __getattr__(self, name: str) -> Any:
30+
return getattr(self._file, name)

tests/test_progress_file.py

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,6 @@ def _make_file(
1515
return f
1616

1717

18-
def test_read_returns_data() -> None:
19-
file = _make_file(b"abc")
20-
pf = ProgressFile(file, progress_callback=lambda _: None)
21-
22-
assert pf.read() == b"abc"
23-
24-
2518
def test_read_with_size() -> None:
2619
file = _make_file(b"abcdef")
2720
pf = ProgressFile(file, progress_callback=lambda _: None)
@@ -94,18 +87,7 @@ def test_name_property() -> None:
9487
assert pf.name == "test.tar.gz"
9588

9689

97-
def test_seek_and_tell() -> None:
98-
file = _make_file(b"abcdef")
99-
pf = ProgressFile(file, progress_callback=lambda _: None)
100-
101-
pf.seek(3)
102-
assert pf.tell() == 3
103-
104-
pf.seek(0)
105-
assert pf.tell() == 0
106-
107-
108-
def test_seek_resets_bytes_read() -> None:
90+
def test_callback_uses_current_file_position_after_seek() -> None:
10991
file = _make_file(b"abcde")
11092
mock_callback = Mock()
11193

@@ -120,11 +102,3 @@ def test_seek_resets_bytes_read() -> None:
120102
pf.read(3)
121103

122104
mock_callback.assert_has_calls([call(3), call(5)])
123-
124-
125-
def test_iter_delegates() -> None:
126-
file = _make_file(b"line1\nline2\n")
127-
pf = ProgressFile(file, progress_callback=lambda _: None)
128-
129-
lines = list(pf)
130-
assert lines == [b"line1\n", b"line2\n"]

0 commit comments

Comments
 (0)