nylas / nylas/nylas-python

Bug: drafts.create() fails with TypeError for multipart requests (attachments > 3MB)

Abierto
#454 3 comentarios 0 reacciones 1 asignado Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Python
Estrellas
109
Forks
85
Merge medio
1 d 21 h
PR fusionados (30 d)
1

Descripción

Bug Description

When creating a draft with attachments larger than 3MB (which triggers multipart upload), the SDK throws a TypeError: tuple indices must be integers or slices, not str.

Root Cause

In nylas/resources/drafts.py, the create() method (lines 117-124) doesn't properly unpack the tuple returned by _execute():

# Current buggy code (line 117-124):
if attachment_size >= MAXIMUM_JSON_ATTACHMENT_SIZE:
    json_response = self._http_client._execute(  # Returns (json_response, headers) tuple!
        method="POST",
        path=path,
        data=_build_form_request(request_body),
        overrides=overrides,
    )
    return Response.from_dict(json_response, Draft)  # Fails - json_response is a tuple

Compare with the correct implementation in send() method (lines 222-228):

# Correct code in send():
json_response, headers = self._http_client._execute(  # Properly unpacks tuple
    method="POST",
    path=f"/v3/grants/{identifier}/drafts/{urllib.parse.quote(draft_id, safe='')}",
    overrides=overrides,
)
return Response.from_dict(json_response, Message, headers)  # Works correctly

Steps to Reproduce

import os
import tempfile
from nylas import Client
from nylas.utils.file_utils import attach_file_request_builder

client = Client(api_key="your_api_key", api_uri="https://api.us.nylas.com")

# Create a temp file > 3MB to trigger multipart
with tempfile.NamedTemporaryFile(delete=False, suffix=".bin") as f:
    f.write(b"x" * (4 * 1024 * 1024))  # 4MB file
    temp_path = f.name

try:
    attachment = attach_file_request_builder(temp_path)
    
    response = client.drafts.create(
        identifier="your_grant_id",
        request_body={
            "to": [{"email": "test@example.com"}],
            "subject": "Test with large attachment",
            "body": "Testing multipart upload",
            "attachments": [attachment],
        }
    )
except TypeError as e:
    print(f"Error: {e}")  # "tuple indices must be integers or slices, not str"
finally:
    os.remove(temp_path)

Expected Behavior

Draft should be created successfully and return a Response[Draft] object.

Actual Behavior

Throws TypeError: tuple indices must be integers or slices, not str

Suggested Fix

# In nylas/resources/drafts.py, change lines 117-124 to:
if attachment_size >= MAXIMUM_JSON_ATTACHMENT_SIZE:
    json_response, headers = self._http_client._execute(  # Unpack tuple
        method="POST",
        path=path,
        data=_build_form_request(request_body),
        overrides=overrides,
    )
    return Response.from_dict(json_response, Draft, headers)  # Pass headers

Environment

  • nylas-python version: 6.x (tested on latest)
  • Python version: 3.12

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.