# Our Open Food Network style guide.
#
# These are the rules we agreed upon and we work towards. Code Climate uses
# these rules to rate our code and detect new violations. But when you run
# rubocop locally, the default configuration file `.rubocop.yml` loads
# our "todo lists" to ignore all current violations.
AllCops:
  TargetRailsVersion: 3.2
  Exclude:
    - 'bin/**/*'
    - 'db/**/*'
    - 'config/**/*'
    - 'script/**/*'
    - 'vendor/**/*'
    - 'node_modules/**/*'
    # Excluding: inadequate Naming/FileName rule rejects GemFile name with camelcase
    - 'engines/web/Gemfile'

## OFN SETTINGS
#
# Cop settings that have been agreed upon by the OFN community

Rails:
  Enabled: true

Style/Documentation:
  Enabled: false

Style/StringLiterals:
  Enabled: false

Style/HashSyntax:
  Enabled: true
  EnforcedStyle: ruby19_no_mixed_keys

Style/Send:
  Enabled: true

Layout/MultilineMethodCallIndentation:
  Enabled: true
  EnforcedStyle: indented

Layout/LineLength:
  Max: 100

## TEMPORARY/CONTESTED SETTINGS
#
# These are still to be decided upon, but recommended for inclusion by
# oeoeaio after scrutinising offenses the codebase

# Don't think this is a big issue, mostly picking up RPSEC scope definitions
# with lamdas and RSpec '.to change{}' blocks
Lint/AmbiguousBlockAssociation:
  Enabled: false

# Heaps of offences (> 100) in specs, mostly in situations where two or more
# instances of a model are required, but only one is referenced. Difficult to
# fix without making the spec look messy or rewriting it.
# Should definitely fix at some point.
Lint/UselessAssignment:
  Exclude:
  - spec/**/*

# AFAIK, there is no good alternative to dynamic matchers until we upgrade
# to Rails 4 and can use #find_by. If there is a better approach, let's do it.
Rails/DynamicFindBy:
  Enabled: false

# Same as above, #find_by is not available until Rails 4
Rails/FindBy:
  Enabled: false

# Same as above, #update! is not available until Rails 4
Rails/ActiveRecordAliases:
  Enabled: false

# This should be the programmer's discretion, perhaps we should review all of
# the uses of it an make specific exceptions though.
Rails/SkipsModelValidations:
  Enabled: false

## Relaxed.Ruby.Style SETTINGS
#
# These styles are a starting point for the conversation around conventions
# They should be removed or tweaked and moved above as decisions are made
# NOTE: Cops which did not fail at the time of writing were removed

Layout/DotPosition:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#styledotposition

Layout/SpaceBeforeBlockBraces:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylespacebeforeblockbraces

Layout/SpaceInsideParens:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylespaceinsideparens

Style/Alias:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylealias

Style/BlockDelimiters:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#styleblockdelimiters

Style/CommentAnnotation:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylecommentannotation

Style/DoubleNegation:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#styledoublenegation

Style/FormatString:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#styleformatstring

Style/HashEachMethods:
  Enabled: false

Style/HashTransformKeys:
  Enabled: false

Style/HashTransformValues:
  Enabled: false

Style/IfUnlessModifier:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#styleifunlessmodifier

Style/Lambda:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylelambda

Style/MultilineBlockChain:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylemultilineblockchain

Style/NegatedIf:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylenegatedif

Style/NegatedWhile:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylenegatedwhile

Style/ParallelAssignment:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#styleparallelassignment

Style/PercentLiteralDelimiters:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylepercentliteraldelimiters

Style/Semicolon:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylesemicolon

Style/SingleLineMethods:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylesinglelinemethods

Style/TrailingCommaInArguments:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#styletrailingcommainarguments

Style/TrailingCommaInArrayLiteral:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#styletrailingcommainliteral

Style/TrailingCommaInHashLiteral:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#styletrailingcommainliteral

Style/WordArray:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#stylewordarray

Style/SymbolArray:
  Enabled: false
  StyleGuide: https://rubocop.readthedocs.io/en/latest/cops_style/#stylesymbolarray

Lint/AmbiguousRegexpLiteral:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#lintambiguousregexpliteral

Lint/AssignmentInCondition:
  Enabled: false
  StyleGuide: http://relaxed.ruby.style/#lintassignmentincondition

Metrics/AbcSize:
  Max: 15

Metrics/BlockLength:
  Max: 25
  ExcludedMethods: [
    "class_eval",
    "collection",
    "context",
    "describe",
    "feature",
    "it",
    "member",
    "namespace",
    "resource",
    "resources",
    "scenario"
  ]

Metrics/BlockNesting:
  Max: 3

Metrics/ClassLength:
  Max: 100

Metrics/ModuleLength:
  Max: 100

Metrics/CyclomaticComplexity:
  Max: 6

Metrics/MethodLength:
  Max: 10

Metrics/ParameterLists:
  Max: 5

Metrics/PerceivedComplexity:
  Max: 7
