dblock/fui
65.0
Adequate · 19 September 2026
225
lines of production code
Ruby
primary language
1
measurement over time
What this system is
This system is a command-line tool designed to detect and remove unused header imports in Objective-C and Objective-C++ projects. It supports mixed-language environments by scanning Swift bridging headers, XIB/storyboard files, and precompiled headers, while allowing users to ignore specific paths or import styles. The tool provides both a 'find' command to report unused headers and a 'delete' command to remove them, including a simulation mode for safe previewing.
How it got here
2014 — CI migration and test expansion
8 changes.
The project migrated its continuous integration from Travis CI to GitHub Actions and introduced RuboCop linting to enforce code quality. Concurrently, the test suite was significantly expanded with comprehensive RSpec coverage for core CLI features, including support for mixed-language files and XIB scanning, alongside the addition of necessary test fixtures.
2017–2026 — test fixture expansion
5 changes.
This period focused on expanding the test suite by adding specific fixtures for Objective-C++ files, global imports, path ignoring, bridging headers, and non-UTF-8 file handling. These additions provided the necessary test data to validate new coverage capabilities and edge cases within the project's specification environment.
Behavioural changes
Migrate CI to GitHub Actions and add RuboCop linting
The project has moved its continuous integration from Travis CI to GitHub Actions, removing the \.travis.yml\ configuration and adding a \Dangerfile\ that integrates the \danger-pr-comment\ gem for pull request comments. Additionally, RuboCop has been added to the development workflow via \.rubocop.yml\ and \.rubocop\_todo.yml\, with the default Rake task now running both the linter and the test suite.
(repo-wide) · high confidence
New ignore flags, deletion simulation mode, and .mm file support
The fui CLI now supports ignoring specific paths and import styles (global angle-bracket or local quote) via new flags, and the delete command can operate in simulation mode to preview changes without removing files. Additionally, the delete command now removes both .m and .mm implementation files, and the find command displays a summary count of unused headers along with the exit code reflecting that count.
bin · high confidence
Support for bridging headers, Swift/Objective-C++ files, and XIB/storyboard scanning
The tool now scans Swift bridging headers (SWIFT\_OBJC\_BRIDGING\_HEADER) to correctly identify headers used via Objective-C++ interop, and extends file scanning to include .mm (Objective-C++) and .xib/.storyboard files for customClass references. It also introduces options to ignore specific paths, local imports, global imports, and XIB files, allowing users to refine unused header detection in mixed-language projects.
lib/fui · high confidence
Test coverage
Added Objective-C++ test fixtures; Added comprehensive test suite for Fui's unused import detection and deletion features; Added test fixture for NIB loading with custom UIView subclasses; Added test fixture for bridging header support; Added test fixtures for .pch include handling; Added test fixtures for global import scenarios; Added test fixtures for non-UTF-8 file handling; Added test fixtures for path ignore functionality; Updated test configuration for RSpec 3 and Ruby standards.
Dependencies
Update Ruby dependencies and add CI linting tools
The project updates its Ruby dependencies, upgrading RSpec to version 3.13 and RuboCop to 1.86.1, while adding new development gems for code quality and pull request automation: Danger, danger-changelog, danger-pr-comment (0.1.0), and danger-toc. The gemspec also explicitly sets the minimum required Ruby version to 1.9.3.
(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 65.
Lenses
- Code Health 100
- Architecture 69
- Maturity 56
- Readiness 65
- Security 93
Changes since last survey
- 67 commits — 58 feature/other, 9 fixes
By area
- (root) — 38 commits
- (repo) — 9 commits
- spec/fixtures — 7 commits
- lib/fui — 6 commits
- spec/fui — 4 commits
- .github/FUNDING.yml — 1 commit
- bin/fui — 1 commit
- spec/spec_helper.rb — 1 commit
Notable commits
- fix: Fix ArgumentError: invalid byte sequence in UTF-8 when processing non-UTF-8 files
- fix: Fix NameError: undefined local variable or method 'project_path' in verbose mode
- fix: Fix delete command to also remove .mm implementation files
- fix: Fix: RSpec 3 syntax deprecations.
- fix: Fix: build, English is case-sensitive on Linux.
- fix: Fix: make spec predictable.
- fix: Fix: properly handle .pch includes.
- fix: Merge pull request #47 from dblock/fix/invalid-byte-sequence-utf8
- fix: Revert "Bump development version to 0.4.2."
- change: "excludeselfxib" option (#20)
- change: Add Ruby 4.x to CI test matrix
- change: Add summary output to find command
- change: Add syntax highlighting to readme.
- change: Added Danger, PR linter.
- change: Added RuboCop, ruby style linter.
- change: Added note on XCFui.
- change: Added note on contributing and known issues.
- change: Added required Ruby version to Gemspec
- change: Added sponsor button.
- change: Added support for .storyboard and .xib customClass references.
- …and 47 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
dblock/fui 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 e4e67fd5940bb38dbf19746b4585bc932a52b517 — 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.