diff --git a/hubspot/files/api_client.py b/hubspot/files/api_client.py index 1be493c8..06be5252 100644 --- a/hubspot/files/api_client.py +++ b/hubspot/files/api_client.py @@ -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 diff --git a/tests/spec/files/test_files_parameters.py b/tests/spec/files/test_files_parameters.py new file mode 100644 index 00000000..37b889a3 --- /dev/null +++ b/tests/spec/files/test_files_parameters.py @@ -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")