Skip to content

First Full Release

Latest

Choose a tag to compare

@finnmglas finnmglas released this 23 Aug 21:35

Everything polished, and ready to be used by you.

✨ Opus 5 Summary

Many major fixes and polishes. C#, .NET and the single file components, every number saying which way it went, and a picture you can arrange by hand

C#, .NET and XAML

  • a using lands on the files that declare that namespace, since several folders fill one and no path rule can say which: on PowerToys that is 10.5k internal edges to 13.4k, and Microsoft.PowerToys stops reading as an outside package on 604 files
  • markup is read too: x:Class links a view to the file behind it, clr-namespace: and WinUI's using: to the controls it places, and a merged dictionary through a pack:// or ms-appx:/// uri
  • a member is told from the statement written the same way, so a constructor, an expression body and an interface member declare while return Compute(1); does not, and a class whose brace opens on the line below spans its own body
  • .csproj, central package management, packages.config and the nuget store give versions, licences and advisories, dotnet test counts its cases by the attribute each runner declares them with, and an ASP.NET route reads [controller] as the class it names

Vue, Svelte, and one map per language

  • a single file component is its script, so a template is never code and a line still says where it is: 15 files read to 35 on a vue app, and 51% call coverage to 92%
  • @/x is not a package, since nothing installs under a bare scope, so it resolves to src the way every bundler that offers it means
  • a name a factory hands back is a declaration other files can call, which is 33k more call edges on vscode
  • python packages found by their __init__.py and rust crates at the root their manifest declares: on ripgrep, 425 import edges to 801, and 46 "fix this import" tasks on code that compiles gone with them
  • dart and flutter resolve through package: names off every pubspec.yaml

Numbers that say which way they went

  • an arrow on every kpi, over a window you pick: none, 24h, 7d, a month, a rolling year or the year so far
  • lines and commits come off the log, and the other twenty off a throwaway checkout of the commit that window opens on
  • tests are counted in whatever language they were written in, pytest, go test, cargo test and dotnet test alike, with the command that would run them
  • a python dependency knows its version, its licence and its size, off the venv and the lockfiles

A picture you can arrange, and settings a link can name

  • drag a dot and it moves inside the module holding it, drag a module and its dots go with it, drag a repo and everything in it keeps its arrangement and travels: panning is what the background does
  • panels only move when asked, so dragging, reordering and hiding stay off until the settings turn them on
  • #dialog=settings and #dialog=export are linkable and survive a reload, and the ellipsis menu is three buttons in the header
  • the api graph is one more file the export panel hands you, and the timeline reads its shares back as lines on a second axis
  • .desprawlignore, one exclude a reader can write down for the folder no heuristic will ever know about

Fixes worth naming

  • a helper collected every call that shared its name, so one def lower took every x.lower() in the repo
  • somebody else's code was counted as this project's: a repo committing its node_modules read as 437k lines for a fifteen file project
  • dead code that was provably alive: a declaration where a value goes runs where it sits, a caller through a barrel is a caller, and a test's own declarations are never delete tasks
  • a route decorator was read twice, once as the endpoint it is and once as the request it is not
  • a document describing another repo's api stood as its server: code answers, a document describes
  • call sites with no readable path were dropped in silence, and are counted and reported now
  • every stage read and scrubbed the same file again: one bounded cache, 11% and 18% off the api view on two repos, byte identical output
  • smaller: a pdf read as a language, a flutter repo read as Kotlin, src/sources read as "Source sources", and svg path data outranked real copy in the repeated-text panel

Try it without installing anything: https://finnmglas.github.io/desprawl/ reads itself, vscode, and a backend with two frontends calling it.

https://www.npmjs.com/package/desprawl