Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions hubspot/files/api_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -478,11 +478,19 @@ def files_parameters(self, files=None):
continue
file_names = v if type(v) is list else [v]
for n in file_names:
with open(n, "rb") as f:
filename = os.path.basename(f.name)
filedata = f.read()
mimetype = mimetypes.guess_type(filename)[0] or "application/octet-stream"
params.append(tuple([k, tuple([filename, filedata, mimetype])]))
if hasattr(n, "read"):
filedata = n.read()
raw_name = getattr(n, "name", None) or "upload"
filename = os.path.basename(str(raw_name)) or "upload"
elif isinstance(n, (bytes, bytearray)):
filedata = bytes(n)
filename = "upload"
else:
with open(n, "rb") as f:
filename = os.path.basename(f.name)
filedata = f.read()
mimetype = mimetypes.guess_type(filename)[0] or "application/octet-stream"
params.append(tuple([k, tuple([filename, filedata, mimetype])]))

return params

Expand Down
26 changes: 26 additions & 0 deletions tests/spec/files/test_files_parameters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import os
import tempfile
from io import BytesIO

from hubspot.files.api_client import ApiClient


def test_files_parameters_accepts_path_bytes_and_file_object():
client = ApiClient()
with tempfile.NamedTemporaryFile(suffix=".txt", delete=False) as handle:
handle.write(b"from disk")
path = handle.name
try:
from_path = client.files_parameters({"file": path})
assert from_path[0][1][1] == b"from disk"
assert from_path[0][1][0] == os.path.basename(path)
finally:
os.remove(path)

from_bytes = client.files_parameters({"file": b"from memory"})
assert from_bytes[0][1][1] == b"from memory"

named = BytesIO(b"from buffer")
named.name = "notes.txt"
from_buffer = client.files_parameters({"file": named})
assert from_buffer[0][1] == ("notes.txt", b"from buffer", "text/plain")