# lein-nsorg 

Leiningen plugin for organizing `ns` form in a way that whitespace and comments are preserved.

Rules to apply are fully customizable; the default implementation

* sorts `:require`, `:require-macros`, `:use` and `:use-macros` libspecs alphabetically and removes duplicates
* sorts `:import` class names alphabetically and removes duplicates
* sorts `:exclude`, `:only`, `:refer`, `:refer-macros` and `:rename` options alphabetically and removes duplicates

Also available as Clojure library [nsorg](https://github.com/immoh/nsorg/)
and command line tool [nsorg-cli](https://github.com/immoh/nsorg-cli/).


## Installation

Dependency information:

```clj
[lein-nsorg "0.3.0"]
```

## Usage

```
lein nsorg
```

Example output:
```
...
in ./src/perf/clojure/clojure/java/perf_jdbc.clj:
   These test compare the raw performance (against an in-memory H2 database)
   for hand-crafted Java JDBC calls and various `query` and `reducible-query`
   calls."
-  (:require [criterium.core :as cc]
-            [clojure.java.jdbc :as sql])
-  (:import (java.sql Connection PreparedStatement ResultSet Statement ResultSetMetaData)))
+  (:require [clojure.java.jdbc :as sql]
+            [criterium.core :as cc])
+  (:import (java.sql Connection PreparedStatement ResultSet ResultSetMetaData Statement)))

 (defn calibrate []
   ;; 840ms
...

Checked 5 files, found problems in 3 files
```

### Paths

Paths to check can be given as arguments to the plugin:

```
lein nsorg src dev/src
```

If no locations are given default location is:

* `:source-paths` and `:test-paths` if plugin is run inside Leiningen project
* current directory if plugin is run outside Leiningen project


### Ignoring files

You can ignore a specific file or directory by excluding it from command-line:

```
lein nsorg --exclude src/my-project/broken_file.clj --exclude test
```

### Apply changes automatically

By default lein-nsorg prints diffs for suggested changes. Changes can be applied automatically to source files with the
following option:

```
lein nsorg --replace
```

### Interactive mode

Instead of applying changes automatically interactive mode asks for each file if suggestions should be applied or not:

```
lein nsorg --replace --interactive
```

## License

Copyright © 2018 Immo Heikkinen

Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.