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

オープン
#454 コメント 3 件 リアクション 0 件 担当者 1 名 GitHub で見る

まだ誰も着手していません。

評価

この issue はまだ評価されていません。

説明

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
主要言語
Python
スター
109
フォーク
85
平均マージ
1日 21時間
マージ済み PR(30日)
1

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

nylas/nylas-python のほかの issue

nylas/nylas-python の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。