https://github.com/venantius/yagni
A Leiningen plugin for finding dead code
https://github.com/venantius/yagni
Last synced: about 1 year ago
JSON representation
A Leiningen plugin for finding dead code
- Host: GitHub
- URL: https://github.com/venantius/yagni
- Owner: venantius
- License: epl-1.0
- Created: 2015-03-15T21:05:12.000Z (about 11 years ago)
- Default Branch: master
- Last Pushed: 2021-09-30T13:07:31.000Z (over 4 years ago)
- Last Synced: 2025-04-02T13:11:37.320Z (about 1 year ago)
- Language: Clojure
- Homepage:
- Size: 63.5 KB
- Stars: 219
- Watchers: 5
- Forks: 10
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
- awesome-clojure - yagni
README
# Yagni
[](https://travis-ci.org/venantius/yagni)
[](https://www.versioneye.com/user/projects/5585e7f0363861001b000215)
[](https://clojars.org/venantius/yagni)
[Yagni](http://martinfowler.com/bliki/Yagni.html) - You Aren't Gonna Need It.
Yagni is a static code analyzer that helps you find unused code in your
applications and libraries.
I've written a blog post describing Yagni in greater depth [here](http://blog.venanti.us/yagni/).
## Background
No matter how it happens, sooner or later an application is going to end up
with unused code. It's time to call Yagni, the exterminator.
Yagni works by identifying all of the interned vars and declared Java classes
in the namespaces findable within your `:source-paths`, and then walking the
forms of those vars and declarations.
As it walks the forms, it builds a graph of references to other vars and
declarations. It then searches the graph from a set of entrypoints (by default
your project's `:main` method), and emits warnings for anything that it
couldn't find in the graph's search.
## Installation
Merge the following into your `~/.lein/profiles.clj`:
```clojure
{:user {:plugins [[venantius/yagni "0.1.7"]]}}
```
## Usage
To have Yagni search for dead code, just run:
$ lein yagni
## Usage from `deps.edn`
You can also use Yagni via a `deps.edn` alias. Merge this with your `deps.edn`:
```clojure
{:aliases {:yagni
{:extra-deps {venantius/yagni {:mvn/version "0.1.7"}}
:exec-fn yagni.core/run-yagni
:exec-args {:source-paths ["src/clj"]
:main your.project}}}
```
And then run:
$ clj -X:yagni
## Configuration
Yagni works by searching your codebase from an initial set of entrypoints.
By default, Yagni assumes that the only entrypoint for your project is the one
listed in your project.clj's `:main` key. Obviously, this is only useful for
applications and tools with CLI invocations.
As libraries, multi-main programs, and certain other types of projects either
tend to have no `:main` or many entrypoint methods, you can instead enumerate
a list of entrypoints for your project in a `.lein-yagni` file in the root
directory of your project. Feel free to take a look at the one in this project
as an example.
## Examples
Running `lein yagni` on the sample project located [here](https://github.com/venantius/yagni-test) will emit the following output:
```
$ lein yagni
=================== WARNING: Parents ======================
== Could not find any references to the following vars. ===
===========================================================
secondns/func-the-second
================== WARNING: Children ======================
== The following vars have references to them, but their ==
== parents do not. ==
===========================================================
secondns/notafunc
```
## Contributing
In general, bug reports, fixes, and code cleanup are always appreciated.
Feature requests are liable to be subject to a bit more discussion.
When filing issues, please include the following:
* The operating system
* The JDK version
* The Leiningen version
* The Clojure version
* Any plugins and dependencies in your `project.clj` and your `~/.lein/profiles.clj`
## License
Copyright © 2018 W. David Jarvis
Distributed under the Eclipse Public License, the same as Clojure.