Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/mogulla3/rspec.nvim

RSpec runner for Neovim written in Lua.
https://github.com/mogulla3/rspec.nvim

lua neovim rspec

Last synced: about 11 hours ago
JSON representation

RSpec runner for Neovim written in Lua.

Awesome Lists containing this project

README

        

# rspec.nvim

RSpec runner for Neovim. Written in Lua.

## Demo

When spec passed:

rspec_nvim_success_demo

When spec failed:

rspec_nvim_fail_demo

## Features

- Asynchronous rspec execution. Does not block your editing
- Various rspec execution commands (inspired by test.vim)
- Smart selection of rspec command and execution path
- Automatically add failed examples to the quickfix list
- Quickly view last results with floating window
- Jump from product code file to spec file (or vice versa)

## Requirements

- Neovim >= 0.8.0
- RSpec >= 3.9.0

## Installation

[packer.nvim](https://github.com/wbthomason/packer.nvim)

```lua
use { "mogulla3/rspec.nvim" }
```

[vim-plug](https://github.com/junegunn/vim-plug)

```vim
Plug "mogulla3/rspec.nvim"
```

## Usage

### Setup

When using the default settings:

```lua
require('rspec').setup()
```

Or if you want to change some settings:

```lua
require('rspec').setup(
-- File format to allow rspec to run
allowed_file_format = function(filename)
return vim.endswith(filename, "_spec.rb")
end,

-- RSpec formatter. "progress", "p", "documentation" and "d" can be specified.
-- If none of the above, use "progress".
formatter = "progress",

-- Whether or not to focus on a window when `ShowLastSpecResult` command executed.
focus_on_last_spec_result_window = true,

-- Whether or not to open the quickfix window when the spec fails.
open_quickfix_when_spec_failed = true,

-- File path to save the last spec result.
last_result_path = vim.fn.stdpath("data") .. "/" .. "rspec_last_result",

-- File path to save the last failed spec result.
last_failed_result_path = vim.fn.stdpath("data") .. "/" .. "rspec_last_failed_result",

-- Command to open the file to jump to.
-- Examples of other alternatives: vsplit, split, tabedit
jump_command = "edit",

-- Directories to ignore when jumping with the RSpecJump command
--
-- For example, suppose you want to jump from "src/foo/bar.rb" to "spec/foo/bar_spec.rb".
--
-- However, rspec.nvim would by default try to find "spec/src/foo/bar_spec.rb" and return an error saying it cannot be found.
-- In this case, you would want to treat the "src/" directory as equivalent to the "app/" in Rails or the "lib/" directory in a gem.
--
-- So you can specify the following for the ignored_dirs_on_jump option, which will give you the expected jumps.
-- ```
-- ignored_dirs_on_jump = { "src" }
-- ```
ignored_dirs_on_jump = {},
)
```

### Commands

Then, you can use the following commands.

|Command|Description|
|:--|:--|
|`:RSpecCurrentFile`|Run rspec on the current file.|
|`:RSpecNearest`|Run rspec on the example nearest to the cursor position.|
|`:RSpecRerun`|Rerun rspec with the last command.|
|`:RSpecOnlyFailures`|Run rspec on the current file with `--only-failures` option. [^1]|
|`:RSpecShowLastResult`|Show last spec result on floating window.|
|`:RSpecAbort`|Abort running rspec.|
|`:RSpecJump`, `:RSpecJump!`|Jump from product code file to spec file (or vice versa). With `!`, if the file to jump to does not exist, attempt to create and then jump to it.|

Below is the recommended key mappings.

```lua
vim.keymap.set("n", "rn", ":RSpecNearest", { noremap = true, silent = true })
vim.keymap.set("n", "rf", ":RSpecCurrentFile", { noremap = true, silent = true })
vim.keymap.set("n", "rr", ":RSpecRerun", { noremap = true, silent = true })
vim.keymap.set("n", "rF", ":RSpecOnlyFailures", { noremap = true, silent = true })
vim.keymap.set("n", "rs", ":RSpecShowLastResult", { noremap = true, silent = true })
```

And below is the recommended user command.

```lua
local rspec = require("rspec")

-- This is a shortcut command for the RSpecJump and RSpecJump!.
vim.api.nvim_create_user_command('RJ', function(args)
rspec.jump({ force = args.bang })
end, { bang = true })
```

## Smart selection of rspec command and execution path

### `rspec` command

rspec.nvim selects rspec commands to run in the following order.

1. `bin/rspec`
1. `bundle exec rspec`
1. `rspec`

Search the parent directory from the current directory and determine if `bin/rspec` or `Gemfile` exists.

Assuming the development of Rails applications or the use of [Bundler](https://bundler.io/), the order of priority is considered the most natural.

### execution path

If `bin/rspec` or `bundle exec rspec` is selected, the current directory is automatically moved and then rspec is run.

- `bin/rspec` : Go to a directory in the same hierarchy as the `bin/`.
- `bundle exec rspec` : Go to the directory where `Gemfile` is located

So you can run rspec from neovim even if your current directory is somewhere deep.

## Asynchronous rspec execution

rspec.nvim runs `rspec` asynchronously, so it doesn't block your editing.

rspec_nvim_async_run

[^1]: Note that the `example_status_persistence_file_path` setting in `spec_helper.rb` must be enabled beforehand.