seancribbs/neotoma
42.8
Weak · 23 September 2026
1.8k
lines of production code
Erlang
primary language
5
measurements over time
What this system is
Neotoma is an Erlang-based PEG (Parsing Expression Grammar) parser generator that converts .peg grammar files into standalone Erlang modules. It provides a suite of parser combinators, memoization utilities, and support functions to facilitate the creation of parsers for formats like JSON, CSV, and arithmetic expressions. The system includes comprehensive unit tests and a modernized build structure for continuous integration.
Features
Add PEG grammar and parser support functions
Added the core PEG grammar file (priv/neotoma\_parse.peg) and the header file (priv/peg\_includes.hrl) which defines the parsing functions (e.g., p\_seq, p\_choose, p\_optional) and memoization utilities required for the parser to function.
priv · high confidence
Add example parsers for arithmetic, CSV, and JSON
The \extra\ directory now includes new example parsers for arithmetic expressions, CSV files, and JSON documents. Each parser is implemented in Erlang with a corresponding PEG (Parsing Expression Grammar) file, providing reference implementations for parsing these data formats.
extra · high confidence
Behavioural changes
Migrate build system to Rebar3 and modernize project structure
The project has migrated its build system from a custom Makefile to Rebar3, as evidenced by the addition of rebar.config and the removal of the old Makefile. This change introduces support for generating escripts, running tests via eunit, and performing static analysis with dialyzer and xref. Additionally, the repository now includes a .travis.yml file for continuous integration, a LICENSE file for legal clarity, and a README for documentation, while removing legacy files like the cucumber and metagrammar PEG files.
(repo-wide) · high confidence
Neotoma parser generator refactored to standalone modules
The Neotoma parser generator has been refactored from a monolithic structure into distinct, standalone modules. The previous \peg\ and \peg\_transform\ modules, which provided parser combinators and parse transforms, have been removed in favor of a new \neotoma\ module that handles the generation of parsers directly from \.peg\ files. The metagrammar has been moved to \priv\ to support clean builds, and the generated parser code now includes line and column tracking for improved debugging output. This change simplifies the API by removing the need for separate parse transforms, allowing users to generate parsers via the \neotoma:file/1,2\ functions.
src · high confidence
Removal of legacy PEG parser header and macros
The file include/peg.hrl has been removed. This file previously defined the root/1 macro and compile directives for the PEG parser, including the setup\_memo/0 function. Users relying on these macros or the associated parse\_transform will need to update their code to use the new standalone parsers and renamed combinators introduced in this change.
include · high confidence
Test coverage
Added unit tests for parser combinators, memoization, and parsing
Added comprehensive test coverage for the PEG parser and its components. This includes unit tests for parser combinators (such as optional, not, assert, sequence, choice, and repetition operators) in test\_combinators.erl, verification of the memoization setup and release mechanisms in test\_memoization.erl, and integration tests for the main parser in test\_parse.erl. The test suite is orchestrated by test\_suite.erl.
test · 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
Score
- CAI 40 → 43 (+2.5)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 79 → 89 (+10.1)
- Architecture 100 → 100 (+0.0)
- Maturity 13 → 21 (+7.8)
- Readiness 41 → 46 (+5.2)
- Security 100 → 67 (-33.3)
Resolved (6)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- No exposed public API
- Test reliability not included
- complexity unreadable for .erl, .hrl — churn × complexity hotspots could not be measured
- dormant codebase — no living knowledge left to concentrate
New (20)
- Coverage not measured — no coverage collector is wired up
- Duplicated block (10 lines × 2) (extra/csv.erl)
- Duplicated block (10 lines × 3) (extra/arithmetic.erl)
- Duplicated block (11 lines × 2) (extra/csv.erl)
- Duplicated block (11 lines × 3) (extra/arithmetic.erl)
- Duplicated block (21 lines × 2) (extra/csv.erl)
- Duplicated block (5 lines × 2) (extra/csv.erl)
- Duplicated block (5 lines × 3) (extra/arithmetic.erl)
- Duplicated block (5 lines × 3) (extra/arithmetic.erl)
- Duplicated block (6 lines × 2) (extra/csv.erl)
- Duplicated block (6 lines × 3) (extra/arithmetic.erl)
- Duplicated block (7 lines × 3) (extra/arithmetic.erl)
- Duplicated block (7 lines × 3) (extra/arithmetic.erl)
- Duplicated block (8 lines × 3) (extra/arithmetic.erl)
- Duplicated block (9 lines × 2) (extra/csv.erl)
- Duplicated block (9 lines × 3) (extra/arithmetic.erl)
- FileTooLong: src/neotoma_parse.erl (src/neotoma_parse.erl)
- No SBOM
- No artifact signing
- No build provenance
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
seancribbs/neotoma 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 23 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 ca56a014be0338ac0f695645aed8042e4117efe6 — 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-955b9cee9818.