packages feed

parochial-0.2.0.0: README.md

# Parochial

Parochial is a tool for managing local haddocks and hoogle databases. I work in cafes and
on the train plus I live in Australia where the internet speed is, err, somewhat
variable. The other significant benefit I found when learning Haskell (and I'm _very_
much still in that category) is knowing that I was reading the actual documentation of
the installed library. For example if I searched for a function on
[Hoogle](hoogle.haskell.org/) I wasn't sure if it was the correct function. In fact
I still find this really useful.

The whole point behind Parochial is to group the documentation on a project by project
basis. For the html documentation it simply builds a symlink farm to the installed
documentation in `$HOME/.cabal/...` (you will need to set the `-haddock` ghc option or
set it in `$HOME/.cabal/config` to ensure the documentation is built) to a directory
named after the current project in `$XDG_DATA_DIR/parochial`. For the hoogle database it
does much the same but instead of building a symlink farm it builds a hoogle database,
again named after the project.


# Benefits

* Fast.
* Works without an internet connection.
* Per project documentation.
* Indexes *all* project libraries (including transitive dependencies). Hoogle only
  indexes [Stackage](https://www.stackage.org/) which doesn't include everything on
  [Hackage](https://hackage.haskell.org).

Of course the downside is that if you don't have the library in your cabal file you won't
have any documentation for it.


# Limitations

This is still fairly raw and at an early stage of development but it's certainly usable
and I will be adding to it over time.

* Only works for Simple distributions.
* Only tested with nix-style local builds.
* Only works for projects that build a binary. You can work around this by specifying
  the state file with the `--state` option.
* It's tied to a specific hoogle version so if the docs in `$HOME/.cabal/...` were built
  with a different version parochial will fail with a version mismatch error.
* It's tied to a specific version of cabal. I _think_
  [cabal-helpr](https://hackage.haskell.org/package/cabal-helper) should fix this but
  I need to look into it more.
* If you want to access the hoogle database from a browser you will need to run `hoogle
  server` manually. This is probably fine if you mainly work on one project but would
  become annoying fairly quickly. The hoogle hrefs are `file:///</local/path>` which most
  browsers will refuse to render.
* I'm sure there are others as well!


# Usage

## Building the Documentation


```parochial --help``` displays a help message.


If the project contains a single binary the following will work:

for haddock:

```bash
parochial haddock
```

and hoogle:


```bash
parochial hoogle
```

If the project containes a single library then you will need to provide the `--state` option:

for haddock:

```bash
parochial haddock --state $(find . -name setup-config)
```

and hoogle:

```bash
parochial hoogle --state $(find . -name setup-config)
```

It there is more than one library you will need to build each one separately (I want to
fix this in the future):

for haddock:

```bash
find . -name setup-config | xargs -n1 parochial haddock --state
```

and hoogle:

```bash
find . -name setup-config | xargs -n1 parochial hoogle --state
```

## Reading the Documentation

### Serving up the html

I use caddy to serve up the target directory but you can choose whatever you like, it
just needs to be able to serve up some files. The following `Caddyfile` should do the job:

```
localhost:80 {
  file_server browse
}
```

Either change the port number to above 1024 or set the following capability on the `caddy`
binary. As root run:

```bash
setcap CAP_NET_BIND_SERVICE=ep $(which caddy)
```


### Command line hoogle

You can specify the database on the command line, like so:

```bash
hoogle --database=/$XDG_DATA_DIR/parochial/parochial.hoo Functor
```

or write a simple wrapper script that infers the name of the database from the CWD or
some other clue.


# TODO

* Work out a better way of locating the `setup-config` parent directory. I basically
  recurse the dist directory searching for `setup-config` which works but is pretty
  simplistic. I would have thought `Cabal` would have a way of doing this but I can't
  find it. If anyone knows how to do this please do let me know.
* Integrate the local hoogle database and the local haddocks.
* If the project has multiple local packages merge the results so the documentation is
  in a single place for the entire project.
* Make the index page less ugly.