Skip to content

fix: Base#each, deprecate to_xls (returns XLSX), refresh TESTING.md (1.3.0) - #3

Merged
adz624 merged 3 commits into
masterfrom
fix/base-each-xlsx
Oct 27, 2026
Merged

adz624 merged 3 commits into
masterfrom
fix/base-each-xlsx

Conversation

@sensui624

Copy link
Copy Markdown
Contributor

問題

  1. Base#each 一呼叫就 NoMethodError (undefined method 'rows!'):內部呼叫不存在的 rows!(應為 each!)。
  2. to_xls 名叫 xls,實際回傳 XLSX(內部就是 Exporter::Xlsx,zip 開頭 PK\x03\x04,不是 OLE2 的 D0 CF 11 E0)。真正的 .xls 只有 ExportTo::Exporter::Xls。
  3. TESTING.md、bin/test_all 過期:只列 Ruby 2.7–3.1,與 CI matrix(2.7–3.4 × Rails 6.1–8.1)不符。

決策:選「最不破壞」的做法

選項 破壞性 採用
A. to_xls 改回傳真 .xls Breaking:現有呼叫端拿到的檔案格式變了(也要多一個 spreadsheet gem 依賴路徑) 否
B. 移除 to_xls Breaking:既有呼叫端 NoMethodError 否
C. to_xls 行為不變(仍回傳 XLSX),文件誠實標註 + 一次性 deprecation 警告 不破壞 是

理由:既然從 1.0.0 起就一直回傳 XLSX,下游很可能已經依賴(例如存成 .xlsx 或直接給 Excel 開)。靜默換格式風險比現狀更大。所以只「說實話 + 警告」,把真正換格式留給未來的 major 版本。

  • to_xls:回傳值不變;每個 process 第一次呼叫印一次 [DEPRECATION] 到 $stderr(含呼叫位置)。要真 .xls 請用 ExportTo::Exporter::Xls.new(export).to_xls。
  • Base#each:修好。無 block 回傳所有列的 Array(表頭在第一列,內容與 to_csv 一致);給 block 則逐列 yield 並回傳 self,因此 map / to_a 等 Enumerable 方法可用。each! 不變。
  • TESTING.md 重寫成指向 ci.yml / gemfiles/,不再抄版本清單;bin/test_all 的 TEST_MATRIX 與 CI 對齊,並用「該 minor 最新已安裝 patch」解析 rbenv 版本。

破壞性判斷

無 breaking change:沒有移除/改名任何公開方法,to_xls 回傳值不變。唯一行為差異:each 以前一定 raise,現在能用;to_xls 多一行 stderr 警告。
版本 1.2.1 → 1.3.0(minor:新增 each 的 block / Enumerable 支援與 deprecation)。Gemfile.lock 與 5 個 gemfiles/*.lock 的 export_to (x.y.z) 一併更新。CHANGELOG.md 新增 1.3.0(含 compare 連結)、README.md 更新。

測試(先紅後綠)

新增 to_xlsx / to_xls(magic bytes 為 XLSX)/ warn-once / Exporter::Xls(真 xls magic)/ each(無 block、block、Enumerable、each! 不變)。

  • 紅:只還原 lib/ 時,each 相關 4 errors + deprecation 測試 1 failure;相容性測試前後皆綠(證明沒改行為)。
  • 綠:本機 Ruby 3.0 / 3.1 / 3.2 / 3.3 / 3.4 × Rails 6.1–8.1(共 12 格)皆 27 runs, 0 failures。本機沒有 Ruby 2.7,該格交給 CI。

請 Eddy 決定

  1. to_xls 的 deprecation 警告要不要?(若不想吵,可只留文件。)
  2. to_xls 的終局:下個 major 改成真 .xls,還是直接移除?
  3. 版本用 minor 1.3.0 OK 嗎?

⚠️ 合併到 master 會觸發 publish.yml(發版到 RubyGems),請確認後再 merge。

…bump 1.3.0

- Base#each called an undefined rows! and always raised NoMethodError; it now returns all rows, or yields them with a block.
- Base#to_xls keeps returning XLSX data for compatibility, with a one-time deprecation warning.
- TESTING.md and bin/test_all now follow the CI matrix.
@adz624
adz624 merged commit ec3d189 into master Oct 27, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants