# <img src='' height='60'>

Cortex is the intelligent coding assistant for Elixir.

- Compiles and reloads modified files
- Automatically runs the appropriate tests at the appropriate time
- Accepts pluggable adapters for custom builds

## Demo

# <img src=''>

## Installation

Getting started with Cortex is easy. Add the following to your `mix.exs` file:

def deps do
    {:cortex, "~> 0.1", only: [:dev, :test]},

### Umbrella Applications

If you're running an umbrella application, add Cortex to the dependencies of
each of the sub-apps that you would like Cortex to monitor. Do this instead
of adding it as a dependency in the root `mix.exs` file.

This is necessary because dependencies in the root `mix.exs` in umbrella
application are not automatically started, which is a process that Cortex
depends on.

## Usage

Cortex runs automatically along-side your mix app.

iex -S mix

This is enough to get live-reload on file change when editing your app.

### Commands

Some commands intended to be used via the shell are provided in the `Cortex`

- `Cortex.all` - run all stages (currently reload and test runner) on all files
  in the project

- `Cortex.focus` - filter test runs to only tests matching the given pattern.
  - a regular expression, which will filter to tests whose full test name
    matches that regular expression
  - a string, which will compile as a regular expression and behave like the
    above regular expression
  - an integer, which will filter by line number for tests
  - a keyword, which will pass through to the `include` option of
    `ExUnit.configure/1` unchanged

- `Cortex.unfocus` - clear the currently configured focus

### Test Runner

When you run your app with `MIX_ENV=test`,
Cortex will automatically run tests for saved `test` files,
as well as tests paired with saved files in `lib`.

MIX_ENV=test iex -S mix

## Enabling and Disabling

Whether cortex runs at all can be configured via the configuration of your
application. By default cortex does run.

config :cortex,
  enabled: false

Cortex also supports the Elixir / Erlang convention of a
`{:system, ENV_VAR_NAME, default_value}` in the config file.

For example, if you wanted to have cortex disabled in your project by default,
you could add the following to your `config.exs`:

config :cortex,
  enabled: {:system, "CORTEX_ENABLED", false}

Then, to run cortex you would start `iex` with the following options:

CORTEX_ENABLED=true iex -S mix

## Phoenix

If you are running a phoenix application,
make sure you are running the app in interactive mode:

iex -S mix phoenix.server

## Roadmap

 - [x] Reload Modules
 - [x] Rerun tests
 - [x] Reload all modules and run all tests from the IEx shell
 - [ ] Reload and run tests for a specific module from the IEx shell
 - [ ] [Credo]( runner
 - [ ] [Dialyzer]( runner
 - [ ] [ExDash]( runner
 - [ ] Custom mix task runner
 - [x] Cortex 'focus' mode
 - [ ] Broader OTP reload support
 - [ ] Autofetch dependencies when `mix.exs` changes `deps`

## License

This software is licensed under [the MIT license](