Skip to content
CAI
Software that uses CAICheck a score

roo-rb/roo

63.5

Adequate · 19 September 2026

3.5k

lines of production code

Ruby

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is the Roo library, a Ruby tool for reading and parsing spreadsheet files in formats such as Excel (xlsx, xlsm), OpenDocument (ods), and CSV. It provides capabilities to extract cell data, handle various data types like dates and numbers, and export content to formats including CSV, XML, and YAML. The library is designed for modularity and memory efficiency, supporting large file processing through optimized parsing and weak reference caching.

How it got here

2009 — modularization and build modernization

8 changes.

The project underwent a significant architectural shift by splitting the monolithic Roo library into smaller, focused gems and migrating its XML parsing to Nokogiri. This period also involved modernizing the development workflow by replacing legacy build tools with bundler and release-please, updating the test suite to Minitest, and enforcing stricter Ruby version requirements.

2012–2015 — Excelx parser refactoring and test coverage

7 changes.

This period focused on refactoring the Excelx backend to improve memory efficiency and performance by introducing dedicated extractor classes and a modernized cell type hierarchy. Comprehensive RSpec test suites were added to verify core parsing behaviors, cell type handling, and new extraction capabilities such as embedded images and HTML formatting.

2016–2024 — test coverage and formatter refactoring

9 changes.

This period focused on significantly expanding test coverage across all supported spreadsheet formats and internal helper modules. The codebase was refactored to extract export logic into dedicated formatter modules, improving maintainability and adding support for specific data types. Additional improvements included introducing weak instance caching for memory efficiency and fixing specific parsing issues in Excel cell handling.

Features

Add default attribute readers and garbage-collectable instance caching

The library now supports defining attribute readers with fallback defaults via the new \DefaultAttrReader\ helper, allowing fields to return a specified value when not explicitly set. Additionally, a \WeakInstanceCache\ has been introduced to store object references using weak references with finalizers, enabling the Ruby garbage collector to reclaim cached objects when they are no longer strongly referenced elsewhere, which helps reduce memory usage during large file processing.

lib/roo/helpers · high confidence

Removals

Removal of the txt2html conversion script

The \scripts/txt2html\ utility, which previously converted text files into HTML using Ruby libraries like RedCloth and Syntax, has been removed from the project. Users relying on this standalone script for generating HTML documentation or website content from text sources will no longer have access to this tool.

scripts · high confidence

Removed the project website files

The static website assets for the project have been deleted from the repository. This includes the main HTML landing page (index.html), the text-based documentation (index.txt), the CSS stylesheet (screen.css), the JavaScript library for rounded corners (rounded\_corners\_lite.inc.js), and the RHTML template (template.rhtml). Users will no longer have access to the local documentation and demo pages previously served from the website directory.

website · high confidence

Behavioural changes

Excelx parser refactored for improved memory efficiency and new extraction capabilities

The Excelx backend has been restructured to significantly reduce memory usage and improve performance when reading large spreadsheets. The monolithic parsing logic has been extracted into dedicated classes (Extractors) for comments, relationships, and sheet documents, allowing shared data to be managed more efficiently. This refactor introduces new capabilities, including the extraction of embedded images and support for HTML formatting within cell values. Additionally, the cell handling has been modernized with a factory pattern and specific type classes, while deprecated methods and internal structures have been cleaned up.

lib/roo/excelx · high confidence

Extracted spreadsheet export formatters into dedicated modules

The \to\_csv\, \to\_matrix\, \to\_xml\, and \to\_yaml\ export methods have been moved from the base spreadsheet classes into new, dedicated formatter modules (\Roo::Formatters::CSV\, \Matrix\, \XML\, \YAML\). This refactoring centralizes export logic, making the codebase easier to maintain and extend. The CSV formatter now supports keyword arguments for separator and sheet selection, with deprecation warnings for the previous positional arguments. Additionally, the CSV formatter now correctly handles Date, TrueClass, and FalseClass types within formula cells.

lib/roo/formatters · high confidence

Migrate build tooling and release automation to release-please and bundler

The project replaces the legacy jeweler and hoe build systems with bundler's gem tasks and the release-please automation tool. This change introduces a new .rubocop.yml configuration for code style enforcement, updates the Rakefile to use bundler/gem\_tasks and RSpec, and adds release-please configuration files (.release-please-manifest.json, release-please-config.json) to manage versioning and changelog generation. Legacy files such as History.txt, Manifest.txt, and setup.rb are removed as part of this modernization.

(repo-wide) · high confidence

Refactored Excelx cell parsing and formatting logic

The Excelx cell handling has been refactored to improve type safety, performance, and formatting accuracy. A new class hierarchy (Base, Number, String, Boolean, Date, DateTime, Time, Empty) replaces the previous monolithic approach, allowing for distinct handling of each cell type. Number parsing now correctly supports scientific notation (e.g., '1E-2') and leading signs, while formatted values for percentages and scientific notation are rounded rather than truncated. The system also introduces support for various Excel number formats, including accounting styles, currency prefixes, and zero-padded integers. Additionally, memory usage is reduced by using a Set for error values and removing unnecessary caches, and deprecated methods like \hyperlink\ and \link\ have been updated to warn users to use \link?\ instead.

lib/roo/excelx/cell · high confidence

Roo library refactored for namespacing and modular architecture

The Roo library has been restructured to improve namespace cleanliness and modularity. All core classes are now strictly under the Roo module, with specific adapters like OpenOffice, LibreOffice, Excelx, and CSV loaded via autoload to optimize startup time. The previous generic spreadsheet implementation has been renamed to Roo::Base, and the library now enforces a strict mapping of file extensions (ods, xlsx, xlsm, csv) to their respective classes. Additionally, deprecated classes such as Excel, Excel2003XML, and Google have been removed from the main distribution; attempting to use them now raises specific notices directing users to install separate gems (roo-xls, roo-google), effectively splitting the monolithic library into smaller, focused components.

lib · high confidence

Roo library restructured with extracted dependencies and new base class

The Roo spreadsheet parsing library has been refactored to improve modularity and reduce dependencies. The core \Roo::Base\ class now serves as the foundation for all spreadsheet formats, replacing the previous \GenericSpreadsheet\. Support for legacy Excel (.xls) and Google Spreadsheets has been removed from the main gem and is now available in separate packages (\roo-xls\ and \roo-google\), as indicated by the new \Roo::Constants\ notices. The library has also migrated its XML parsing from REXML to Nokogiri for better performance and stability, and updated its temporary file handling to use Ruby's standard \tmpdir\ with proper finalization to prevent resource leaks.

lib/roo · high confidence

Update example scripts for Ruby 1.9+ syntax and OpenOffice naming

The example scripts have been updated to remove the dependency on the 'rubygems' require statement, making them compatible with modern Ruby versions. The code style has been modernized to use single quotes for strings and standard spacing, and the 'Openoffice' class reference in the SOAP server example has been renamed to 'OpenOffice' to match the library's current constant naming.

examples · high confidence

Test coverage

Added RSpec test suite for Roo core components; Added and organized test fixture files; Added comprehensive test suites for Roo base, CSV, Excelx, and OpenOffice formats; Added test coverage for CSV, Matrix, XML, and YAML formatters; Added test coverage for Excelx format, relationships, and sheet parsing; Added test helpers for spreadsheet features; Added test suite for Roo versioning; Added tests for Excel cell number and time parsing; Added tests for Roo::Excelx::Coordinate; Added unit tests for Excelx cell type behaviors; Migrate test suite to Minitest and modularize helpers; Test infrastructure updates and helper modules.

Dependencies

Added SHA-512 checksum for roo 2.10.1

A new SHA-512 checksum file has been added for the roo 2.10.1 gem release, enabling verification of the gem's integrity during installation or distribution.

checksums · high confidence

Update gemspec for Ruby 3.1+ and modernize dependencies

The gemspec now requires Ruby 3.1.0 or higher and updates the rubyzip dependency to version 3.x (\>= 3.0.0, \< 4.0.0). For Ruby 3.4+, it explicitly adds dependencies on base64 (\~\> 0.2), csv (\~\> 3), and logger (\~\> 1). Development dependencies have been updated to include rack \>= 3.0.0 and rackup \>= 2.2.1, and a Gemfile has been added to manage these development and testing dependencies.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 63.

Lenses

  • Code Health 89
  • Architecture 100
  • Maturity 54
  • Readiness 60
  • Security 76

Changes since last survey

  • 300 commits — 251 feature/other, 49 fixes

By area

  • lib/roo — 89 commits
  • (repo) — 87 commits
  • (root) — 84 commits
  • .github/workflows — 10 commits
  • test/files — 8 commits
  • test/roo — 7 commits
  • test/test_roo.rb — 4 commits
  • test/excelx — 2 commits
  • .github/ISSUE_TEMPLATE — 1 commit
  • .github/pull_request_template.md — 1 commit
  • lib/roo.rb — 1 commit
  • spec/lib — 1 commit
  • spec/spec_helper.rb — 1 commit
  • test/.DS_Store — 1 commit
  • test/formatters — 1 commit
  • test/helpers — 1 commit
  • test/test_helper.rb — 1 commit

Notable commits

  • fix: Avoid warnings in Ruby 3.1 when finalizer is called twice [fix #585]
  • fix: Closes #491 fixes issue with empty hyperlinks
  • fix: Final fixes to get disable_html_wrapper to work.
  • fix: Fix CI status badge
  • fix: Fix Jruby spec
  • fix: Fix Roo::Base#each_with_pagename degraded at #576
  • fix: Fix TestRooCSV#test_download_uri_with_query_string
  • fix: Fix broken link in README
  • fix: Fix changelog links & PR numbers
  • fix: Fix crash on invalid style generated by unoconv
  • fix: Fix error on zero padded format
  • fix: Fix incorrect parse for Excelx with inline rich text
  • fix: Fix invalid encoding error for CSV
  • fix: Fix issue with spreadsheets containing filters
  • fix: Fix open office using gsub! on a frozen string
  • fix: Fix reading of a comment with an author in xlsx.
  • fix: Fix ruby instance variable not initialized warning
  • fix: Fix test_finalize test
  • fix: Fixed failed tests for older ruby versions
  • fix: Fixes #62
  • …and 280 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

roo-rb/roo was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 19 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit f3e67741f5f13422e9231a9923579ff0067bdfd1 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-13a154b7f5d1.