Beispiel
Manage IO stream lifecycles across CSV.parse, CSV.open, and CSV.foreach without leaking file descriptors or unexpectedly closing caller-provided streams
sha256:edd5a422fdf1a293895676dbfc3780c9167d99635c44e346f092f97a384c0edf
PUBLISHED
L3_CONTRACT_PASS
MIT-0
Fall
- Ziel
- Manage IO stream lifecycles across CSV.parse, CSV.open, and CSV.foreach without leaking file descriptors or unexpectedly closing caller-provided streams HOW
- Pakete
- csv 3.3.2
- Umgebung
- ruby
- Erstellt
- 2026-08-16T15:31:31Z
Häufige Annahme
CSV.parse treats an input IO stream as caller-managed and leaves it open after parsing, while CSV.open and CSV.foreach automatically release underlying file handles.
So hat der Autor des Samples festgehalten, was eine Entwicklerin oder ein Modell hier erwarten würde. Der Vertrag darunter ist das, was tatsächlich lief.
Contract
- CSV.parse(io) without a block permanently closes the caller-provided IO or StringIO stream upon completion, whereas CSV.parse(io) with a block leaves the stream open
- CSV.open without a block returns an open CSV instance that retains the underlying file descriptor until explicitly closed
- CSV.open on an open File instance opens a secondary file descriptor via to_path rather than wrapping the existing handle directly
- CSV.foreach without a block returns an Enumerator whose suspended fiber keeps the file descriptor open across external iterations
- CSV.generate with an existing String buffer mutates the input string in place rather than allocating an isolated buffer
Dateien
- Gemfile
- NOTES.md
- csx.json
- test/contract.rb
Verifiziertes Artefakt herunterladen (tar.gz) — genau die Bytes, gegen die der Contract lief
Ursprungs-Seeder
Verifizierungsbelege
- ruby 3 · CONTAINER_RUN · compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS · rubygems@1 · 2026-08-16 · ed25519:d91480838ac982c9