= Integration with Other Tools

== Speeding up integrations

RuboCop integrates with quite a number of other tools, including editors which may attempt
to do autocorrection for you. In these cases, `rubocop` ends up getting called repeatedly,
which may result in some slowness, as `rubocop` has to require its entire environment on
each call.

You can alleviate some of that boot time by using xref:usage/server.adoc["Server"] or
https://github.com/fohte/rubocop-daemon[rubocop-daemon]. `rubocop-daemon` is a
wrapper around `rubocop` that loads everything into a daemonized process so that
subsequent runs save on that boot time after the first execution. Please see the
rubocop-daemon documentation for setup instructions and examples of how to use it
with some editors and other tools.

NOTE: RuboCop's built-in xref:usage/caching.adoc[caching] should also be used to ensure
that source files that have not been changed are not being re-evaluated unnecessarily.

== Editor integration

All popular editors provide some form of linter integration. Typically this is done
either via LSP (if supported by the underlying server) or by shelling out to a linter and processing its output so it could be displayed inside the editor.

As noted above, the `rubocop` binary starts relatively slowly which makes it problematic in the shelling out case. The RuboCop xref:usage/server.adoc["Server"] functionality
has designed to address this problem and provide lightning fast editor integration.

=== LSP

https://microsoft.github.io/language-server-protocol/[The Language Server Protocol] is the modern standard for providing cross-editor support for various programming languages. The following Ruby LSP servers are using RuboCop internally to provide
code linting functionality:

- https://github.com/Shopify/ruby-lsp[ruby-lsp]
- https://solargraph.org/[Solargraph]

=== Emacs

https://github.com/rubocop/rubocop-emacs[rubocop.el] is a simple
Emacs interface for RuboCop. It allows you to run RuboCop inside Emacs
and quickly jump between problems in your code.

https://github.com/flycheck/flycheck[flycheck] > 0.9 also supports
RuboCop and uses it by default when available.

=== Vim

RuboCop is supported by
https://github.com/scrooloose/syntastic[syntastic],
https://github.com/neomake/neomake[neomake],
and https://github.com/w0rp/ale[ale].

There is also the https://github.com/ngmy/vim-rubocop[vim-rubocop] plugin.

=== Sublime Text

If you're a ST user you might find the
https://github.com/pderichs/sublime_rubocop[Sublime RuboCop plugin]
useful.

=== Brackets

The https://github.com/smockle-archive/brackets-rubocop[brackets-rubocop]
extension displays RuboCop results in Brackets.
It can be installed via the extension manager in Brackets.

=== TextMate2

The https://github.com/mrdougal/textmate2-rubocop[textmate2-rubocop]
bundle displays formatted RuboCop results in a new window.
Installation instructions can be found https://github.com/mrdougal/textmate2-rubocop#installation[here].

=== Atom

The https://github.com/AtomLinter/linter-rubocop[linter-rubocop] plugin for Atom's
https://github.com/AtomLinter/Linter[linter] runs RuboCop and highlights the offenses in Atom.

=== LightTable

The https://github.com/seancaffery/lt-rubocop[lt-rubocop] plugin
provides LightTable integration.

=== RubyMine / Intellij IDEA

RuboCop support is https://www.jetbrains.com/help/idea/2017.1/rubocop.html[available] as of the 2017.1 releases.

=== Visual Studio Code

The https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby[ruby] extension
provides RuboCop integration for Visual Studio Code. RuboCop is also used for the formatting
capabilities of this extension.

=== Other Editors

Here's one great opportunity to contribute to RuboCop - implement
RuboCop integration for your favorite editor.

== Git pre-commit hook integration with overcommit

https://github.com/brigade/overcommit[overcommit] is a fully configurable and
extendable Git commit hook manager. To use RuboCop with overcommit, add the
following to your `.overcommit.yml` file:

[source,yaml]
----
PreCommit:
  RuboCop:
    enabled: true
----

== Git pre-commit hook integration with pre-commit

https://pre-commit.com/[pre-commit] is a framework for managing and maintaining
multi-language pre-commit hooks. To use RuboCop with pre-commit, add the
following to your `.pre-commit-config.yaml` file:

[source,yaml]
----
- repo: https://github.com/rubocop/rubocop
  rev: v1.8.1
  hooks:
    - id: rubocop
----

If your RuboCop configuration uses extensions, be sure to include the gems as
entries in `additional_dependencies`:

[source,yaml]
----
- repo: https://github.com/rubocop/rubocop
  rev: v1.8.1
  hooks:
    - id: rubocop
      additional_dependencies:
        - rubocop-rails
        - rubocop-rspec
----

== Guard integration

If you're fond of https://github.com/guard/guard[Guard] you might
like
https://github.com/yujinakayama/guard-rubocop[guard-rubocop]. It
allows you to automatically check Ruby code style with RuboCop when
files are modified.

== Mega-Linter integration

You can use https://nvuillam.github.io/mega-linter/[Mega-Linter]
to run RuboCop automatically on every PR, and also lint all file
types detected in your repository.

Please follow the
https://nvuillam.github.io/mega-linter/installation[installation instructions]
to activate RuboCop without any additional configuration.

https://nvuillam.github.io/mega-linter/flavors/ruby/[Mega-Linter's Ruby flavor]
is optimized for Ruby linting.

== Rake integration

To use RuboCop in your `Rakefile` add the following:

[source,ruby]
----
require 'rubocop/rake_task'

RuboCop::RakeTask.new
----

If you run `rake -T`, the following two RuboCop tasks should show up:

[source,sh]
----
$ rake rubocop                                 # Run RuboCop
$ rake rubocop:autocorrect                     # Autocorrect RuboCop offenses
----

The above will use default values

[source,ruby]
----
require 'rubocop/rake_task'

desc 'Run RuboCop on the lib directory'
RuboCop::RakeTask.new(:rubocop) do |task|
  task.patterns = ['lib/**/*.rb']
  # only show the files with failures
  task.formatters = ['files']
  # don't abort rake on failure
  task.fail_on_error = false
end
----
