Skip to content

csv: support multi-character lineterminator in writer #8321

Description

@jinmay

배경

csv.writer는 임의의 문자열을 lineterminator로 받을 수 있어야 한다 (CPython 호환). 현재 RustPython은 lineterminator를 단일 바이트(csv_core::Terminator)로만 저장하기 때문에 '\r\n', '\n', '\r', '\0' 등 단일/이중 바이트 케이스는 통과하지만 '!@#' 같은 멀티캐릭터 종결자는 저장·출력하지 못한다.

그 결과 Lib/test/test_csv.pytest_write_lineterminator@unittest.expectedFailure로 마킹되어 있다. (해당 테스트는 '!@#' 서브케이스에서만 실패)

import csv, io
s = io.StringIO()
csv.writer(s, lineterminator="!@#").writerow(["a", "b"])
# 기대: 'a,b!@#'

목표

  • writer가 멀티캐릭터 lineterminator를 온전히 저장하고 출력하도록 한다.
  • test_write_lineterminator(test_csv.py:266)의 @unittest.expectedFailure # TODO: RUSTPYTHON 마킹을 제거(언마크)한다.

스코프

멀티캐릭터 lineterminator에 한정한다. 아래는 이 이슈에서 제외하고 별도 후속으로 다룬다.

  • lineterminator 검증 파리티 (빈 종결자, delimiter/quotechar/escapechar 충돌 ValueError, None/int 에러 메시지)
  • delimiter/quotechar/escapechar의 비ASCII(Unicode) 문자 지원 ([RFC] csv: discuss the reader parser architecture for CPython compatibility #8310 관련)
  • reader 시맨틱 (CPython reader는 lineterminator를 무시하고 CR/LF만 인식) — 이번엔 현행 유지, 시맨틱 변경은 후속

수용 기준

  • cargo run --release -- -m test test_csv에서 test_write_lineterminator 통과 및 마킹 제거.
  • 기존 통과 케이스('\r\n', '\n', '\r', '\0') 회귀 없음.
  • test_lineterminator(1280), test_writer_dialect_attrs(175) 회귀 없음.
  • QUOTE_ALL / QUOTE_NONNUMERIC 경로에서도 멀티캐릭터 종결자가 절단되지 않음.

참고

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions