Skip to content

Commit dddda72

Browse files
Merge pull request #5 from Joab0/improve-file
Melhoria no objeto File
2 parents 35fc348 + f99704d commit dddda72

File tree

3 files changed

+33
-16
lines changed

3 files changed

+33
-16
lines changed

squarecloud/client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,8 @@ async def upload_app(self, file: File,
386386
if not isinstance(file, File):
387387
raise InvalidFile(
388388
f'you need provide an {File.__name__} object')
389-
if file.name.split('.')[-1] != 'zip':
389+
# Se for io.BytesIO o file.filename é nulo.
390+
if (file.filename is not None) and (file.filename.split('.')[-1] != 'zip'):
390391
raise InvalidFile('the file must be a .zip file')
391392
response: Response = await self._http.upload(file)
392393
if not kwargs.get('avoid_listener'):

squarecloud/http/http_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ async def request(self, route: Router,
5454
if route.endpoint in (Endpoint.commit(), Endpoint.upload()):
5555
file = kwargs.pop('file')
5656
form = aiohttp.FormData()
57-
form.add_field('file', file.bytes, filename=file.name)
57+
form.add_field('file', file.bytes, filename=file.filename)
5858
kwargs['data'] = form
5959
async with self.__session(headers=headers) as session:
6060
async with session.request(url=route.url, method=route.method,

squarecloud/square.py

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,35 @@
44
import io
55
import os
66

7+
from typing import Any
8+
79

810
class File:
9-
"""File object"""
10-
__slots__ = (
11-
'path',
12-
'name',
13-
'bytes',
14-
)
15-
16-
def __init__(self, path: str):
17-
self.bytes = io.open(path, 'rb')
18-
self.path = path
19-
self.name = os.path.basename(path)
20-
21-
def __repr__(self):
22-
return f'<{self.__class__.__name__}(name={self.name}, path={self.path})'
11+
"""
12+
File object
13+
14+
You can use a file already opened or pass the file path.
15+
NOTE: To pass binary data, consider usage of `io.BytesIO`.
16+
"""
17+
18+
__slots__ = ('bytes', 'filename')
19+
20+
def __init__(
21+
self,
22+
fp: str | bytes | os.PathLike[Any] | io.BufferedIOBase,
23+
filename: str | None = None
24+
):
25+
if isinstance(fp, io.IOBase):
26+
if not (fp.seekable() and fp.readable()):
27+
raise ValueError(f'File buffer {fp!r} must be seekable and readable')
28+
self.bytes: io.BufferedIOBase = fp
29+
else:
30+
self.bytes = open(fp, 'rb')
31+
32+
if filename is None:
33+
if isinstance(fp, str):
34+
_, filename = os.path.split(fp)
35+
else:
36+
filename = getattr(fp, 'name', None)
37+
38+
self.filename: str | None = filename

0 commit comments

Comments
 (0)