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.

Evaluación

Este issue todavía no se ha evaluado.

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
Lenguaje dominante
Python
Estrellas
109
Forks
85
Merge medio
1 d 21 h
PR fusionados (30 d)
1

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.

Más de nylas/nylas-python

Todos los issues de nylas/nylas-python

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.