= RuboCop RSpec

https://rspec.info/[RSpec]-specific analysis for your projects, as an extension to
https://github.com/rubocop/rubocop[RuboCop].

RuboCop RSpec follows the https://docs.rubocop.org/rubocop/versioning.html[RuboCop versioning guide].
In a nutshell, between major versions new cops are introduced in a special `pending` status.
That means that they won't be run unless explicitly told otherwise.
RuboCop will warn on start that certain cops are neither explicitly enabled and disabled.
On a major version release, all `pending` cops are enabled.

== Project Goals

* Enforce the guidelines and best practices outlined in the community https://rspec.rubystyle.guide[RSpec style guide]
* Simplify the process of adopting new RSpec functionality

== Non-goals of RuboCop RSpec

=== Enforcing `should` vs. `expect` syntax

Enforcing

[source,ruby]
----
expect(calculator.compute(line_item)).to eq(5)
----

over

[source,ruby]
----
calculator.compute(line_item).should == 5
----

is a feature of RSpec itself - you can read about it in the "Disable should syntax" section of https://rspec.info/features/3-12/rspec-expectations/syntax-configuration[RSpec Documentation].

=== Enforcing an explicit RSpec receiver for top-level methods (disabling monkey patching)

Enforcing

[source,ruby]
----
RSpec.describe MyClass do
  ...
end
----

over

[source,ruby]
----
describe MyClass do
  ...
end
----

can be achieved using RSpec's `disable_monkey_patching!` method, which you can read more about in the https://rspec.info/features/3-12/rspec-core/configuration/zero-monkey-patching-mode[RSpec Documentation]. This will also prevent `should` from being defined on every object in your system.

Before disabling `should` you will need all your specs to use the `expect` syntax. You can use http://yujinakayama.me/transpec/[Transpec], which will do the conversion for you.
