fast_xlsx 0.8.0-aarch64-linux → 1.0.0-aarch64-linux

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9d5b58aae6c81cae9ba4ae99174dd9c7308f607860dae332715370c0183666b
4
- data.tar.gz: 7a5ffc7c424376ac5357c223d2f7e6d908be8f1a97ede8e614814906d73af6d5
3
+ metadata.gz: ba21afc732e1edd388545b5c427f5aeb170be9fcb5eadf73da61df8ffca0dd3c
4
+ data.tar.gz: 77d783a5aa4ee4ad87937871559c6dc1589fa53fc78fd560ef0119741826e78e
5
5
  SHA512:
6
- metadata.gz: b9b1fd3f7b7f252de5bfaf2c29644cea20955e764e83b7dce77458743ef4063bb626c7815e4f09ec4eb99e63c13f71a89c21164db33464fd394d65beb3f13e49
7
- data.tar.gz: c379b6f0497b0803057730f0b5c3310a78f6d57455716c7749390d1eada6740d1afe8b8ec2596ed62f6de9675add9c776f28cc395d1ce2a425ae8e77af7c8f28
6
+ metadata.gz: f182d1a0b27c8cdf9e0beee826b5e25056f7b0c7d090b667c2c398c9a11ed77310954c012bca1dea679d728d88e4f44fd76dc9d5d47e86abeb25b55ca1f3e197
7
+ data.tar.gz: 8ea1468cad06b02183e5782309e0cb1515d1fa78a9c5a57f5c2a81774133dbfc8e85214e22349373664b2c2b48eeaff369ea06986ba1f0d695294f54a6e9747d
data/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.0.0] - 2026-10-18
4
+
5
+ The first stable release, with the same API as 0.8.1. From now on fast_xlsx follows Semantic Versioning: no breaking change before 2.0, and anything to be removed first prints a deprecation warning for at least one minor release.
6
+
7
+ ### Fixed
8
+
9
+ - Updated rust_xlsxwriter to 0.100, which brings zip 9.0 (RUSTSEC-2026-0367, -0368 and -0369; those affect extracting archives, which fast_xlsx never does).
10
+ - In `memory: :constant` and `:low` mode, a temporary file that can't be created (e.g. an unwritable temp directory) raises `FastXlsx::Error` instead of crashing the process. The file is also created only when the first row is flushed, not by `add_worksheet`.
11
+
12
+ ## [0.8.1] - 2026-10-03
13
+
14
+ ### Fixed
15
+
16
+ - Rails' `ActiveSupport::TimeWithZone` (e.g. `created_at`) and other objects that act like a `Time` without being one were written as text; they are dates now.
17
+
18
+ ### Changed
19
+
20
+ - Writing `Time` values is about 25% faster (read through Ruby's C API instead of method calls), and `Date` values a little faster.
21
+
3
22
  ## [0.8.0] - 2026-10-02
4
23
 
5
24
  ### Changed
data/README.md CHANGED
@@ -1,15 +1,17 @@
1
- # FastXlsx
1
+ # fast_xlsx
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/fast_xlsx.svg)](https://badge.fury.io/rb/fast_xlsx)
3
+ ![fast_xlsx: fast .xlsx writer for Ruby, powered by Rust](docs/social-preview.jpg)
4
+
5
+ [![Gem Version](https://img.shields.io/gem/v/fast_xlsx)](https://rubygems.org/gems/fast_xlsx)
4
6
  [![codecov](https://codecov.io/gh/7a6163/fast_xlsx/graph/badge.svg)](https://codecov.io/gh/7a6163/fast_xlsx)
5
7
 
6
- Fast `.xlsx` writer for Ruby, built on [rust_xlsxwriter](https://github.com/jmcnamara/rust_xlsxwriter) via [magnus](https://github.com/matsadler/magnus).
8
+ Write Excel `.xlsx` files from Ruby with a Rust engine ([rust_xlsxwriter](https://github.com/jmcnamara/rust_xlsxwriter), via [magnus](https://github.com/matsadler/magnus)): 20,000 rows in under 100 ms, with memory that stays flat for large exports.
7
9
 
8
- > **Status: release candidate.** The API is frozen as of 0.8: 0.8.x releases only fix bugs, and 1.0 follows once it has been in real use without needing changes.
10
+ > **Status: stable.** Since 1.0 the API follows [Semantic Versioning](https://semver.org): no breaking change before 2.0.
9
11
 
10
- **Roadmap:** [1.0.0](https://github.com/7a6163/fast_xlsx/milestone/1) (release plan) · [1.x](https://github.com/7a6163/fast_xlsx/milestone/2) (planned features)
12
+ **Roadmap:** [1.x](https://github.com/7a6163/fast_xlsx/milestone/2) (planned features)
11
13
 
12
- **Contents:** [Installation](#installation) · [Getting started](#getting-started) · [Guide](#guide) · [Performance](#performance) · [Support and versioning](#support-and-versioning) · [Development](#development)
14
+ **Contents:** [Installation](#installation) · [Getting started](#getting-started) · [Guide](#guide) · [Performance](#performance) · [Support and versioning](#support-and-versioning) · [Development](#development) · [Credits](#credits)
13
15
 
14
16
  ## Installation
15
17
 
@@ -81,7 +83,7 @@ The [Guide](#guide) below covers every feature; the [API docs](https://www.rubyd
81
83
 
82
84
  ## Guide
83
85
 
84
- [Writing cells](#writing-cells) · [Rails](#rails) · [Memory modes](#memory-modes) · [Formats](#formats) · [Columns and filters](#columns-and-filters) · [Sheet view and printing](#sheet-view-and-printing) · [Cell ranges](#cell-ranges) · [Layout](#layout) · [Outline groups](#outline-groups) · [Defined names](#defined-names) · [Protection](#protection) · [Conditional formats](#conditional-formats) · [Data validation](#data-validation) · [Comments](#comments) · [Images](#images) · [Tables](#tables) · [Charts](#charts) · [Errors](#errors)
86
+ [Writing cells](#writing-cells) · [Rails](#rails) · [Polars](#polars) · [Memory modes](#memory-modes) · [Formats](#formats) · [Columns and filters](#columns-and-filters) · [Sheet view and printing](#sheet-view-and-printing) · [Cell ranges](#cell-ranges) · [Layout](#layout) · [Outline groups](#outline-groups) · [Defined names](#defined-names) · [Protection](#protection) · [Conditional formats](#conditional-formats) · [Data validation](#data-validation) · [Comments](#comments) · [Images](#images) · [Tables](#tables) · [Charts](#charts) · [Errors](#errors)
85
87
 
86
88
  ### Writing cells
87
89
 
@@ -126,6 +128,23 @@ def export
126
128
  end
127
129
  ```
128
130
 
131
+ ### Polars
132
+
133
+ To write a [ruby-polars](https://github.com/ankane/ruby-polars) DataFrame (gem `polars-df`), hand its column names and rows to fast_xlsx:
134
+
135
+ ```ruby
136
+ df = Polars.read_csv("sales.csv")
137
+ summary = df.group_by("region").agg(Polars.col("amount").sum)
138
+
139
+ wb = FastXlsx::Workbook.new(memory: :constant)
140
+ ws = wb.add_worksheet("By region")
141
+ ws.append(summary.columns, format: { bold: true })
142
+ summary.iter_rows { |row| ws << row } # in batches of 512 rows, so memory stays flat
143
+ wb.save("by_region.xlsx")
144
+ ```
145
+
146
+ Polars `Date` and `Datetime` columns become dates (a `Datetime` with a time zone keeps its local time), `Decimal` numbers, and nulls empty cells.
147
+
129
148
  ### Memory modes
130
149
 
131
150
  By default every cell stays in memory until the file is saved. For large exports, two modes write each finished row to a temp file instead:
@@ -370,7 +389,7 @@ Values are mapped by type:
370
389
  |---|---|
371
390
  | `Integer`, `Float`, any `Numeric` | number |
372
391
  | `String` | string |
373
- | `Time`, `DateTime` | date and time (`yyyy-mm-dd hh:mm:ss` unless formatted), in its own offset |
392
+ | `Time`, `DateTime`, time-like objects such as Rails' `ActiveSupport::TimeWithZone` | date and time (`yyyy-mm-dd hh:mm:ss` unless formatted), in its own offset |
374
393
  | `Date` | date (`yyyy-mm-dd` unless formatted) |
375
394
  | `FastXlsx::Formula.new("SUM(A1:A9)")` | formula |
376
395
  | `FastXlsx::URL.new("https://…")`, `URL.new(url, text: "Title")` | hyperlink (optionally showing other text) |
@@ -402,15 +421,15 @@ Apple Silicon, Ruby 4.0.5. Each library uses its own idiomatic row-append API; x
402
421
 
403
422
  | Library | Time | vs fastest | Ruby objects allocated |
404
423
  |---|---:|---:|---:|
405
- | **fast_xlsx** (`memory: :constant`) | **77 ms** | 1.0x | 7 |
406
- | **fast_xlsx** (`memory: :low`) | **86 ms** | 1.1x | 7 |
407
- | **fast_xlsx** | **89 ms** | 1.1x | 10 |
408
- | [xlsxtream](https://github.com/felixbuenemann/xlsxtream) 3.1 | 183 ms | 2.4x | 561,728 |
409
- | [fast_excel](https://github.com/Paxa/fast_excel) 0.5 (constant_memory) | 200 ms | 2.6x | 20,079 |
410
- | [fast_excel](https://github.com/Paxa/fast_excel) 0.5 | 238 ms | 3.1x | 320,076 |
411
- | [write_xlsx](https://github.com/cxn03651/write_xlsx) 1.15 | 608 ms | 7.8x | 1,483,899 |
412
- | [caxlsx](https://github.com/caxlsx/caxlsx) 4.5 | 689 ms | 8.9x | 745,122 |
413
- | [rubyXL](https://github.com/weshatheleopard/rubyXL) 3.4 | 2755 ms | 35.6x | 8,700,448 |
424
+ | **fast_xlsx** (`memory: :constant`) | **75 ms** | 1.0x | 7 |
425
+ | **fast_xlsx** (`memory: :low`) | **81 ms** | 1.1x | 7 |
426
+ | **fast_xlsx** | **85 ms** | 1.1x | 10 |
427
+ | [xlsxtream](https://github.com/felixbuenemann/xlsxtream) 3.1 | 173 ms | 2.3x | 561,740 |
428
+ | [fast_excel](https://github.com/Paxa/fast_excel) 0.5 (constant_memory) | 204 ms | 2.7x | 20,079 |
429
+ | [fast_excel](https://github.com/Paxa/fast_excel) 0.5 | 238 ms | 3.2x | 320,076 |
430
+ | [write_xlsx](https://github.com/cxn03651/write_xlsx) 1.15 | 592 ms | 7.9x | 1,483,899 |
431
+ | [caxlsx](https://github.com/caxlsx/caxlsx) 4.5 | 671 ms | 8.9x | 745,122 |
432
+ | [rubyXL](https://github.com/weshatheleopard/rubyXL) 3.4 | 2571 ms | 34.1x | 8,700,448 |
414
433
 
415
434
  All outputs are 689–750 KB.
416
435
 
@@ -448,8 +467,8 @@ BUNDLE_GEMFILE=bench/Gemfile /usr/bin/time -l bundle exec ruby bench/memory.rb f
448
467
 
449
468
  - **Ruby:** CRuby 3.3 and later. A Ruby version is dropped only after it reaches its end of life, and only in a minor release. JRuby and TruffleRuby are not supported (this is a native extension).
450
469
  - **Precompiled gems:** Linux (x86_64 and aarch64, glibc and musl; ARM musl), macOS (arm64 and x86_64) and Windows (x64). Before each release the Linux x86_64, macOS arm64 and Windows gems are installed and loaded on Ruby 3.3, 3.4 and 4.0. Other platforms build from source and need a Rust toolchain.
451
- - **Versions:** from 1.0, [Semantic Versioning](https://semver.org): no breaking API change before 2.0. Until then a minor release (0.x.0) can change behaviour; the [changelog](CHANGELOG.md) lists every change under "Changed".
452
- - **Deprecations:** from 1.0, a method or option to be removed first prints a warning (with `warn`, so on by default) for at least one minor release, with the CHANGELOG naming its replacement; it goes only in the next major version.
470
+ - **Versions:** [Semantic Versioning](https://semver.org) since 1.0: no breaking API change before 2.0. The [changelog](CHANGELOG.md) lists every change.
471
+ - **Deprecations:** a method or option to be removed first prints a warning (with `warn`, so on by default) for at least one minor release, with the CHANGELOG naming its replacement; it goes only in the next major version.
453
472
  - **Output:** `.xlsx` files that open in Excel 2007 and later, LibreOffice and Google Sheets. Updating rust_xlsxwriter can change the bytes of the file but not what it contains.
454
473
 
455
474
  ## Development
@@ -498,6 +517,10 @@ git tag v0.1.0 && git push origin v0.1.0
498
517
 
499
518
  The `Build gems` workflow builds the source gem plus precompiled gems for each platform and pushes them to RubyGems (trusted publishing) and GitHub Packages. It refuses to publish if the tag and `VERSION` differ.
500
519
 
520
+ ## Credits
521
+
522
+ Inspired by [fast_excel](https://github.com/Paxa/fast_excel), whose API and approach fast_xlsx builds on, and made possible by [rust_xlsxwriter](https://github.com/jmcnamara/rust_xlsxwriter) and [magnus](https://github.com/matsadler/magnus).
523
+
501
524
  ## License
502
525
 
503
526
  MIT
data/SECURITY.md ADDED
@@ -0,0 +1,26 @@
1
+ # Security policy
2
+
3
+ ## Supported versions
4
+
5
+ Security fixes go into the latest release of the newest minor version. Until 1.0 that is 0.8.x; from 1.0, the latest 1.x.
6
+
7
+ | Version | Supported |
8
+ |---|---|
9
+ | 0.8.x | ✅ |
10
+ | < 0.8 | ❌ (upgrade to 0.8.x; the [changelog](CHANGELOG.md) lists every change) |
11
+
12
+ ## Reporting a vulnerability
13
+
14
+ Please don't open a public issue. Report it privately through GitHub: on the repository's **Security** tab, choose **Report a vulnerability** ([direct link](https://github.com/7a6163/fast_xlsx/security/advisories/new)).
15
+
16
+ Include what an attacker could do, the fast_xlsx, Ruby and platform versions, and a script or input that shows it, if you have one.
17
+
18
+ What to expect:
19
+
20
+ - An acknowledgement within a week.
21
+ - A fix in a patch release, and a GitHub security advisory crediting you (unless you'd rather not be named), once users can upgrade.
22
+ - If it turns out to be in a dependency (rust_xlsxwriter, magnus, rb-sys, the Rust zip crates), a report to that project as well.
23
+
24
+ ## Scope
25
+
26
+ fast_xlsx only writes `.xlsx` files: it doesn't read or parse spreadsheets. Issues of interest include memory-safety bugs in the native extension (a crash or corruption reachable from Ruby), and output that makes Excel or other readers misbehave from data an application would reasonably pass in (cell text, formulas, URLs, images). Formulas and hyperlinks are written as given: an application writing untrusted input as a `FastXlsx::Formula` or `FastXlsx::URL` should validate it first, as with CSV formula injection.
data/bench/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- fast_xlsx (0.8.0)
4
+ fast_xlsx (0.8.1)
5
5
  rb_sys (~> 0.9.130)
6
6
 
7
7
  GEM
@@ -77,7 +77,7 @@ DEPENDENCIES
77
77
  CHECKSUMS
78
78
  caxlsx (4.5.0) sha256=e3d98d859f148df05d5462086b5079b523f29c1766b569535f1d68629ce743ff
79
79
  fast_excel (0.5.0) sha256=59c418bdcf586a6030798d4e3a9f575742badaceaf7bb90f38eee5feb5bdc478
80
- fast_xlsx (0.8.0)
80
+ fast_xlsx (0.8.1)
81
81
  ffi (1.17.4-aarch64-linux-gnu) sha256=b208f06f91ffd8f5e1193da3cae3d2ccfc27fc36fba577baf698d26d91c080df
82
82
  ffi (1.17.4-aarch64-linux-musl) sha256=9286b7a615f2676245283aef0a0a3b475ae3aae2bb5448baace630bb77b91f39
83
83
  ffi (1.17.4-arm-linux-gnu) sha256=d6dbddf7cb77bf955411af5f187a65b8cd378cb003c15c05697f5feee1cb1564
@@ -4,7 +4,7 @@ fast_xlsx started as a rewrite of [fast_excel](https://github.com/Paxa/fast_exce
4
4
 
5
5
  **Why switch**
6
6
 
7
- - 2.8–3.3× faster on the [README benchmark](../README.md#speed), and `memory: :constant` adds about 1 MB however large the file.
7
+ - Faster writing (see the [README benchmark](../README.md#speed)), and `memory: :constant` adds about 1 MB however large the file.
8
8
  - Precompiled gems for Linux, macOS and Windows: no C compiler or FFI at install.
9
9
  - Dates show as dates without a format, every option is checked (a typo raises instead of being ignored), and saving doesn't block other threads.
10
10
  - Conditional formats, data validation, tables, charts, images, comments, protection and printing options as Ruby methods.
Binary file
Binary file
Binary file
@@ -2,5 +2,5 @@
2
2
 
3
3
  module FastXlsx
4
4
  # The gem version.
5
- VERSION = "0.8.0"
5
+ VERSION = "1.0.0"
6
6
  end
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_xlsx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 1.0.0
5
5
  platform: aarch64-linux
6
6
  authors:
7
7
  - Zac
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-10-02 00:00:00.000000000 Z
11
+ date: 2026-10-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: Writes Excel .xlsx files from Ruby through a native Rust extension (rust_xlsxwriter
14
- + magnus).
13
+ description: 'Writes Excel .xlsx files from Ruby through a native Rust extension (rust_xlsxwriter):
14
+ 20,000 rows in under 100 ms, and memory that stays flat for large exports. Formats,
15
+ formulas, tables, charts, conditional formats, data validation and more.'
15
16
  email:
16
17
  - 579103+7a6163@users.noreply.github.com
17
18
  executables: []
@@ -24,6 +25,7 @@ files:
24
25
  - LICENSE.txt
25
26
  - README.md
26
27
  - Rakefile
28
+ - SECURITY.md
27
29
  - bench/Gemfile
28
30
  - bench/Gemfile.lock
29
31
  - bench/compare.rb
@@ -68,5 +70,5 @@ requirements: []
68
70
  rubygems_version: 3.5.23
69
71
  signing_key:
70
72
  specification_version: 4
71
- summary: Fast xlsx writer for Ruby, powered by rust_xlsxwriter
73
+ summary: Excel .xlsx writer for Ruby with a Rust engine
72
74
  test_files: []