8.0.0
Major release: complexipy is now a native Rust implementation end to end. The Python CLI is retired in favor of a Rust binary exposed through a thin console-script shim, so the whole pipeline runs without a Python interpreter. The Python API is unchanged and gains diff comparison (compute_diff, has_regressions, DiffEntry, DiffStatus) backed by the same Rust engine as the CLI. Check the migration guide before upgrading.
Changed
- The Python CLI is retired:
complexipyis now a native Rust implementation exposed through a thin console-script shim, so the whole pipeline runs without a Python interpreter. The Python API is unchanged and now includes the diff comparison (compute_diff,has_regressions,DiffEntry,DiffStatus) backed by the same Rust engine as the CLI. The extension module keeps being distributed via maturin wheels. (#224, #243)
Removed
- Git-URL analysis (
complexipy <repository-url>) - local paths only. - Legacy cache migration - the previous
.complexipy_cache/<hash>.jsonlayout is no longer migrated; existing legacy files are ignored and the delta history starts fresh. - Legacy snapshot files - snapshots created with older versions are no longer detected; recreate them with
--snapshot-create. -mxshort flag for--max-complexity-allowed- carried over from the Python CLI but never ported to the clap-based parser; use--max-complexity-allowedinstead.
Fixed
- The C007 collapsible-if rule no longer suggests merging a nested
ifwhen a same-level statement with side effects precedes it - the merge would change program behavior. Comments in multiline headers and trailing comments are handled instead of being misplaceable by the replacement. (#228, #236) - The C007 preceding-statement guard no longer fails when blank or comment-only lines sit between the outer and inner
if: the indent step detection now skips such lines, so the merge is still rejected instead of producing a replacement that drops code. (#245) - The C002 loop-guards suggestion keeps statements that sit between the chained
ifs: they now appear in the replacement between the corresponding guards instead of being dropped. Guard conditions are now parenthesized (if not (<cond>):), so inverting conditions withandororno longer silently changes what the guard skips. - The C005 extract-predicate suggestion keeps the statement keyword:
whileconditions staywhileloops, andelifconditions get help text only instead of a broken standaloneifreplacement. The predicate body indent now follows the file's indent step. - C002 and C007 refuse machine suggestions when the shifted body holds a multi-line string literal: dedenting would change the string's value. The plans carry help text instead.
- C002 loop guards strip a redundant top-level
notfrom the guard condition (if not a:becomes guardif a:), and C005 predicate names get an underscore suffix when the source already defines the generated name. - C005 extract-predicate now emits a module-level helper whose parameters are the condition's free variables (attribute bases included, builtins excluded), so the helper is unit-testable. The snippet shows the enclosing context at the statement's real indentation. Conditions that bind a name (
:=) or contain a lambda/comprehension get help text only.
PRs
- fix(snapshot): keep analyzed entries in place on partial runs by @rohaquinlop in #227
- feat: add configurable cache directory location by @Louden7 in #229
- feat(cli): port config stack to rust (steps 1-3) by @rohaquinlop in #230
- feat(cli): port output path resolution to rust (step 4) by @rohaquinlop in #231
- feat(cli): port cache store to rust (step 5) by @rohaquinlop in #232
- feat(cli): extract shared export writers (steps 6-7) by @rohaquinlop in #233
- feat(cli): port sarif and gitlab reports to rust (steps 8-9) by @rohaquinlop in #234
- feat(cli): port snapshot evaluation to rust (step 10) by @rohaquinlop in #235
- fix(refactors): preserve preceding sibling side effects by @mikemikimike in #236
- feat(cli): port git diff computation to rust (step 11) by @rohaquinlop in #237
- feat(cli): port ignored locations orchestration to rust (step 12) by @rohaquinlop in #238
- feat(cli): port output display to rust (step 13) by @rohaquinlop in #239
- feat(cli): port public api to rust (step 14) by @rohaquinlop in #240
- feat(cli): add rust cli binary (step 15) by @rohaquinlop in #241
- feat(cli): mirror python api surface and document removals (step 16) by @rohaquinlop in #242
- feat(cli): retire the python cli in favor of the rust implementation by @rohaquinlop in #244
- chore(benchmarks): add rust vs python CLI benchmark by @rohaquinlop in #246
- fix(refactors): make machine suggestions faithful source replacements by @rohaquinlop in #247
- refactor(rust): split the codebase into a Cargo workspace by @rohaquinlop in #248
- docs: slim readme and docs home to landing funnel by @rohaquinlop in #249
- fix(cli): allow boolean flags before paths by @rohaquinlop in #250
- perf(rust): make the analysis engine linear and parallel by @rohaquinlop in #251
New Contributors
- @Louden7 made their first contribution in #229
- @mikemikimike made their first contribution in #236
Full Changelog: 7.0.1...8.0.0