MidnightRiders/MemberPortal

View on GitHub
app/controllers/matches_controller.rb

Summary

Maintainability
B
6 hrs
Test Coverage

Unprotected mass assignment
Open

    @match = Match.new(match_params)

Mass assignment is a feature of Rails which allows an application to create a record from the values of a hash.

Example:

User.new(params[:user])

Unfortunately, if there is a user field called admin which controls administrator access, now any user can make themselves an administrator.

attr_accessible and attr_protected can be used to limit mass assignment. However, Brakeman will warn unless attr_accessible is used, or mass assignment is completely disabled.

There are two different mass assignment warnings which can arise. The first is when mass assignment actually occurs, such as the example above. This results in a warning like

Unprotected mass assignment near line 61: User.new(params[:user])

The other warning is raised whenever a model is found which does not use attr_accessible. This produces generic warnings like

Mass assignment is not restricted using attr_accessible

with a list of affected models.

In Rails 3.1 and newer, mass assignment can easily be disabled:

config.active_record.whitelist_attributes = true

Unfortunately, it can also easily be bypassed:

User.new(params[:user], :without_protection => true)

Brakeman will warn on uses of without_protection.

Class has too many lines. [134/100]
Open

class MatchesController < ApplicationController
  authorize_resource
  before_action :set_match, only: %i(show edit update destroy)
  before_action :check_for_matches_to_update, only: %i(auto_update)

Checks if the length a class exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

You can set literals you want to fold with CountAsOne. Available are: 'array', 'hash', and 'heredoc'. Each literal will be counted as one line regardless of its actual size.

Example: CountAsOne: ['array', 'heredoc']

class Foo
  ARRAY = [         # +1
    1,
    2
  ]

  HASH = {          # +3
    key: 'value'
  }

  MSG = <<~HEREDOC  # +1
    Heredoc
    content.
  HEREDOC
end                 # 5 points

NOTE: This cop also applies for Struct definitions.

Method has too many lines. [31/10] (https://rubystyle.guide#short-methods)
Open

  def sync
    year = Date.current > Date.current.end_of_year - 15.days ? Date.current.year + 1 : Date.current.year
    uri = URI.parse("https://v3.football.api-sports.io/fixtures?league=253&season=#{year}")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true

Checks if the length of a method exceeds some maximum value. Comment lines can optionally be allowed. The maximum allowed length is configurable.

You can set literals you want to fold with CountAsOne. Available are: 'array', 'hash', and 'heredoc'. Each literal will be counted as one line regardless of its actual size.

NOTE: The ExcludedMethods and IgnoredMethods configuration is deprecated and only kept for backwards compatibility. Please use AllowedMethods and AllowedPatterns instead. By default, there are no methods to allowed.

Example: CountAsOne: ['array', 'heredoc']

def m
  array = [       # +1
    1,
    2
  ]

  hash = {        # +3
    key: 'value'
  }

  <<~HEREDOC      # +1
    Heredoc
    content.
  HEREDOC
end               # 5 points

Method has too many lines. [17/10] (https://rubystyle.guide#short-methods)
Open

  def index
    @start_date = (params[:date].try(:in_time_zone, Time.zone) || Time.current).beginning_of_week
    @matches = Match.unscoped.with_clubs.includes(:pick_ems).where(kickoff: (@start_date..@start_date + 7.days)).order(kickoff: :asc, location: :asc)
    @prev_link = "Previous #{'Game ' if @matches.empty?}Week"
    @next_link = "Next #{'Game ' if @matches.empty?}Week"

Checks if the length of a method exceeds some maximum value. Comment lines can optionally be allowed. The maximum allowed length is configurable.

You can set literals you want to fold with CountAsOne. Available are: 'array', 'hash', and 'heredoc'. Each literal will be counted as one line regardless of its actual size.

NOTE: The ExcludedMethods and IgnoredMethods configuration is deprecated and only kept for backwards compatibility. Please use AllowedMethods and AllowedPatterns instead. By default, there are no methods to allowed.

Example: CountAsOne: ['array', 'heredoc']

def m
  array = [       # +1
    1,
    2
  ]

  hash = {        # +3
    key: 'value'
  }

  <<~HEREDOC      # +1
    Heredoc
    content.
  HEREDOC
end               # 5 points

Cyclomatic complexity for sync is too high. [12/7]
Open

  def sync
    year = Date.current > Date.current.end_of_year - 15.days ? Date.current.year + 1 : Date.current.year
    uri = URI.parse("https://v3.football.api-sports.io/fixtures?league=253&season=#{year}")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true

Checks that the cyclomatic complexity of methods is not higher than the configured maximum. The cyclomatic complexity is the number of linearly independent paths through a method. The algorithm counts decision points and adds one.

An if statement (or unless or ?:) increases the complexity by one. An else branch does not, since it doesn't add a decision point. The && operator (or keyword and) can be converted to a nested if statement, and ||/or is shorthand for a sequence of ifs, so they also add one. Loops can be said to have an exit condition, so they add one. Blocks that are calls to builtin iteration methods (e.g. `ary.map{...}) also add one, others are ignored.

def each_child_node(*types)               # count begins: 1
  unless block_given?                     # unless: +1
    return to_enum(__method__, *types)

  children.each do |child|                # each{}: +1
    next unless child.is_a?(Node)         # unless: +1

    yield child if types.empty? ||        # if: +1, ||: +1
                   types.include?(child.type)
  end

  self
end                                       # total: 6

Perceived complexity for sync is too high. [12/8]
Open

  def sync
    year = Date.current > Date.current.end_of_year - 15.days ? Date.current.year + 1 : Date.current.year
    uri = URI.parse("https://v3.football.api-sports.io/fixtures?league=253&season=#{year}")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true

Tries to produce a complexity score that's a measure of the complexity the reader experiences when looking at a method. For that reason it considers when nodes as something that doesn't add as much complexity as an if or a &&. Except if it's one of those special case/when constructs where there's no expression after case. Then the cop treats it as an if/elsif/elsif... and lets all the when nodes count. In contrast to the CyclomaticComplexity cop, this cop considers else nodes as adding complexity.

Example:

def my_method                   # 1
  if cond                       # 1
    case var                    # 2 (0.8 + 4 * 0.2, rounded)
    when 1 then func_one
    when 2 then func_two
    when 3 then func_three
    when 4..10 then func_other
    end
  else                          # 1
    do_something until a && b   # 2
  end                           # ===
end                             # 7 complexity points

Method sync has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.
Open

  def sync
    year = Date.current > Date.current.end_of_year - 15.days ? Date.current.year + 1 : Date.current.year
    uri = URI.parse("https://v3.football.api-sports.io/fixtures?league=253&season=#{year}")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
Severity: Minor
Found in app/controllers/matches_controller.rb - About 1 hr to fix

Cognitive Complexity

Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

A method's cognitive complexity is based on a few simple rules:

  • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
  • Code is considered more complex for each "break in the linear flow of the code"
  • Code is considered more complex when "flow breaking structures are nested"

Further reading

Method index has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.
Open

  def index
    @start_date = (params[:date].try(:in_time_zone, Time.zone) || Time.current).beginning_of_week
    @matches = Match.unscoped.with_clubs.includes(:pick_ems).where(kickoff: (@start_date..@start_date + 7.days)).order(kickoff: :asc, location: :asc)
    @prev_link = "Previous #{'Game ' if @matches.empty?}Week"
    @next_link = "Next #{'Game ' if @matches.empty?}Week"
Severity: Minor
Found in app/controllers/matches_controller.rb - About 1 hr to fix

Cognitive Complexity

Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

A method's cognitive complexity is based on a few simple rules:

  • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
  • Code is considered more complex for each "break in the linear flow of the code"
  • Code is considered more complex when "flow breaking structures are nested"

Further reading

Method sync has 31 lines of code (exceeds 25 allowed). Consider refactoring.
Open

  def sync
    year = Date.current > Date.current.end_of_year - 15.days ? Date.current.year + 1 : Date.current.year
    uri = URI.parse("https://v3.football.api-sports.io/fixtures?league=253&season=#{year}")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
Severity: Minor
Found in app/controllers/matches_controller.rb - About 1 hr to fix

    Assignment Branch Condition size for sync is too high. [<29, 84, 12> 89.67/17] (http://c2.com/cgi/wiki?AbcMetric, https://en.wikipedia.org/wiki/ABC_Software_Metric)
    Open

      def sync
        year = Date.current > Date.current.end_of_year - 15.days ? Date.current.year + 1 : Date.current.year
        uri = URI.parse("https://v3.football.api-sports.io/fixtures?league=253&season=#{year}")
        http = Net::HTTP.new(uri.host, uri.port)
        http.use_ssl = true

    Checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric and https://en.wikipedia.org/wiki/ABC_Software_Metric.

    Interpreting ABC size:

    • <= 17 satisfactory
    • 18..30 unsatisfactory
    • > 30 dangerous

    You can have repeated "attributes" calls count as a single "branch". For this purpose, attributes are any method with no argument; no attempt is meant to distinguish actual attr_reader from other methods.

    Example: CountRepeatedAttributes: false (default is true)

    # `model` and `current_user`, referenced 3 times each,
     # are each counted as only 1 branch each if
     # `CountRepeatedAttributes` is set to 'false'
    
     def search
       @posts = model.active.visible_by(current_user)
                 .search(params[:q])
       @posts = model.some_process(@posts, current_user)
       @posts = model.another_process(@posts, current_user)
    
       render 'pages/search/page'
     end

    This cop also takes into account AllowedMethods (defaults to []) And AllowedPatterns (defaults to [])

    Assignment Branch Condition size for index is too high. [<10, 46, 7> 47.59/17] (http://c2.com/cgi/wiki?AbcMetric, https://en.wikipedia.org/wiki/ABC_Software_Metric)
    Open

      def index
        @start_date = (params[:date].try(:in_time_zone, Time.zone) || Time.current).beginning_of_week
        @matches = Match.unscoped.with_clubs.includes(:pick_ems).where(kickoff: (@start_date..@start_date + 7.days)).order(kickoff: :asc, location: :asc)
        @prev_link = "Previous #{'Game ' if @matches.empty?}Week"
        @next_link = "Next #{'Game ' if @matches.empty?}Week"

    Checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric and https://en.wikipedia.org/wiki/ABC_Software_Metric.

    Interpreting ABC size:

    • <= 17 satisfactory
    • 18..30 unsatisfactory
    • > 30 dangerous

    You can have repeated "attributes" calls count as a single "branch". For this purpose, attributes are any method with no argument; no attempt is meant to distinguish actual attr_reader from other methods.

    Example: CountRepeatedAttributes: false (default is true)

    # `model` and `current_user`, referenced 3 times each,
     # are each counted as only 1 branch each if
     # `CountRepeatedAttributes` is set to 'false'
    
     def search
       @posts = model.active.visible_by(current_user)
                 .search(params[:q])
       @posts = model.some_process(@posts, current_user)
       @posts = model.another_process(@posts, current_user)
    
       render 'pages/search/page'
     end

    This cop also takes into account AllowedMethods (defaults to []) And AllowedPatterns (defaults to [])

    Assignment Branch Condition size for scrape_single_result is too high. [<4, 17, 3> 17.72/17] (http://c2.com/cgi/wiki?AbcMetric, https://en.wikipedia.org/wiki/ABC_Software_Metric)
    Open

      def scrape_single_result(match)
        return {} unless match.at_css('.sb-match-date').try(:content).present?
        result = { date: match.at_css('.sb-match-date').content.to_date }
        %w(home away).each do |team|
          data = match.at_css(".sb-#{team}")

    Checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric and https://en.wikipedia.org/wiki/ABC_Software_Metric.

    Interpreting ABC size:

    • <= 17 satisfactory
    • 18..30 unsatisfactory
    • > 30 dangerous

    You can have repeated "attributes" calls count as a single "branch". For this purpose, attributes are any method with no argument; no attempt is meant to distinguish actual attr_reader from other methods.

    Example: CountRepeatedAttributes: false (default is true)

    # `model` and `current_user`, referenced 3 times each,
     # are each counted as only 1 branch each if
     # `CountRepeatedAttributes` is set to 'false'
    
     def search
       @posts = model.active.visible_by(current_user)
                 .search(params[:q])
       @posts = model.some_process(@posts, current_user)
       @posts = model.another_process(@posts, current_user)
    
       render 'pages/search/page'
     end

    This cop also takes into account AllowedMethods (defaults to []) And AllowedPatterns (defaults to [])

    Move locale texts to the locale files in the config/locales directory. (https://rails.rubystyle.guide/#locale-texts)
    Open

            format.html { redirect_to matches_path(date: @match.kickoff.to_date), notice: 'Match was successfully updated.' }

    auto_update is not explicitly defined on the class. (https://rails.rubystyle.guide#lexically-scoped-action-filter)
    Open

      before_action :check_for_matches_to_update, only: %i(auto_update)

    This cop checks that methods specified in the filter's only or except options are defined within the same class or module.

    You can technically specify methods of superclass or methods added by mixins on the filter, but these can confuse developers. If you specify methods that are defined in other classes or modules, you should define the filter in that class or module.

    If you rely on behaviour defined in the superclass actions, you must remember to invoke super in the subclass actions.

    Example:

    # bad
    class LoginController < ApplicationController
      before_action :require_login, only: %i[index settings logout]
    
      def index
      end
    end
    
    # good
    class LoginController < ApplicationController
      before_action :require_login, only: %i[index settings logout]
    
      def index
      end
    
      def settings
      end
    
      def logout
      end
    end

    Example:

    # bad
    module FooMixin
      extend ActiveSupport::Concern
    
      included do
        before_action proc { authenticate }, only: :foo
      end
    end
    
    # good
    module FooMixin
      extend ActiveSupport::Concern
    
      included do
        before_action proc { authenticate }, only: :foo
      end
    
      def foo
        # something
      end
    end

    Example:

    class ContentController < ApplicationController
      def update
        @content.update(content_attributes)
      end
    end
    
    class ArticlesController < ContentController
      before_action :load_article, only: [:update]
    
      # the cop requires this method, but it relies on behaviour defined
      # in the superclass, so needs to invoke `super`
      def update
        super
      end
    
      private
    
      def load_article
        @content = Article.find(params[:article_id])
      end
    end

    Move locale texts to the locale files in the config/locales directory. (https://rails.rubystyle.guide/#locale-texts)
    Open

            format.html { redirect_to @match, notice: 'Match was successfully created.' }

    Use if match.at_css('.sb-match-date').try(:content).blank? instead of unless match.at_css('.sb-match-date').try(:content).present?.
    Open

        return {} unless match.at_css('.sb-match-date').try(:content).present?

    This cop checks for code that can be written with simpler conditionals using Object#blank? defined by Active Support.

    Interaction with Style/UnlessElse: The configuration of NotPresent will not produce an offense in the context of unless else if Style/UnlessElse is inabled. This is to prevent interference between the auto-correction of the two cops.

    Example: NilOrEmpty: true (default)

    # Converts usages of `nil? || empty?` to `blank?`
    
    # bad
    foo.nil? || foo.empty?
    foo == nil || foo.empty?
    
    # good
    foo.blank?

    Example: NotPresent: true (default)

    # Converts usages of `!present?` to `blank?`
    
    # bad
    !foo.present?
    
    # good
    foo.blank?

    Example: UnlessPresent: true (default)

    # Converts usages of `unless present?` to `if blank?`
    
    # bad
    something unless foo.present?
    
    # good
    something if foo.blank?
    
    # bad
    unless foo.present?
      something
    end
    
    # good
    if foo.blank?
      something
    end
    
    # good
    def blank?
      !present?
    end

    Prefer index_by over map { ... }.to_h.
    Open

        clubs = Club.all.map { |c| [c.api_id, c] }.to_h

    Do not add or subtract duration. (https://rails.rubystyle.guide#duration-arithmetic)
    Open

        @finished_matches_to_update ||= Match.where('(home_goals IS NULL OR away_goals IS NULL) AND kickoff < ?', Time.current - 2.hours)

    Move locale texts to the locale files in the config/locales directory. (https://rails.rubystyle.guide/#locale-texts)
    Open

        redirect_to matches_path, flash: { notice: 'There were no matches to update.' } if matches_to_update.empty?

    Similar blocks of code found in 3 locations. Consider refactoring.
    Open

      def create
        @match = Match.new(match_params)
    
        respond_to do |format|
          if @match.save
    Severity: Major
    Found in app/controllers/matches_controller.rb and 2 other locations - About 1 hr to fix
    app/controllers/clubs_controller.rb on lines 27..36
    app/controllers/players_controller.rb on lines 27..36

    Duplicated Code

    Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

    Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

    When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

    Tuning

    This issue has a mass of 50.

    We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

    The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

    If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

    See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

    Refactorings

    Further Reading

    Similar blocks of code found in 2 locations. Consider refactoring.
    Open

      def update
        respond_to do |format|
          if @match.update(match_params)
            format.html { redirect_to matches_path(date: @match.kickoff.to_date), notice: 'Match was successfully updated.' }
            format.json { head :no_content }
    Severity: Minor
    Found in app/controllers/matches_controller.rb and 1 other location - About 55 mins to fix
    app/controllers/rev_guesses_controller.rb on lines 33..40

    Duplicated Code

    Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

    Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

    When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

    Tuning

    This issue has a mass of 46.

    We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

    The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

    If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

    See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

    Refactorings

    Further Reading

    Line is too long. [263/140] (https://rubystyle.guide#max-line-length)
    Open

        @mot_m_players = Player.includes(:mot_m_firsts, :mot_m_seconds, :mot_m_thirds).select { |x| x.mot_m_total(match_id: @match.id) && x.mot_m_total(match_id: @match.id) > 0 }.sort_by { |x| x.mot_m_total(match_id: @match.id) }.reverse if @match.teams.include? revs

    Checks the length of lines in the source code. The maximum length is configurable. The tab size is configured in the IndentationWidth of the Layout/IndentationStyle cop. It also ignores a shebang line by default.

    This cop has some autocorrection capabilities. It can programmatically shorten certain long lines by inserting line breaks into expressions that can be safely split across lines. These include arrays, hashes, and method calls with argument lists.

    If autocorrection is enabled, the following Layout cops are recommended to further format the broken lines. (Many of these are enabled by default.)

    • ArgumentAlignment
    • ArrayAlignment
    • BlockAlignment
    • BlockDelimiters
    • BlockEndNewline
    • ClosingParenthesisIndentation
    • FirstArgumentIndentation
    • FirstArrayElementIndentation
    • FirstHashElementIndentation
    • FirstParameterIndentation
    • HashAlignment
    • IndentationWidth
    • MultilineArrayLineBreaks
    • MultilineBlockLayout
    • MultilineHashBraceLayout
    • MultilineHashKeyLineBreaks
    • MultilineMethodArgumentLineBreaks
    • MultilineMethodParameterLineBreaks
    • ParameterAlignment

    Together, these cops will pretty print hashes, arrays, method calls, etc. For example, let's say the max columns is 25:

    Example:

    # bad
    {foo: "0000000000", bar: "0000000000", baz: "0000000000"}
    
    # good
    {foo: "0000000000",
    bar: "0000000000", baz: "0000000000"}
    
    # good (with recommended cops enabled)
    {
      foo: "0000000000",
      bar: "0000000000",
      baz: "0000000000",
    }

    Line is too long. [149/140] (https://rubystyle.guide#max-line-length)
    Open

        @matches = Match.unscoped.with_clubs.includes(:pick_ems).where(kickoff: (@start_date..@start_date + 7.days)).order(kickoff: :asc, location: :asc)

    Checks the length of lines in the source code. The maximum length is configurable. The tab size is configured in the IndentationWidth of the Layout/IndentationStyle cop. It also ignores a shebang line by default.

    This cop has some autocorrection capabilities. It can programmatically shorten certain long lines by inserting line breaks into expressions that can be safely split across lines. These include arrays, hashes, and method calls with argument lists.

    If autocorrection is enabled, the following Layout cops are recommended to further format the broken lines. (Many of these are enabled by default.)

    • ArgumentAlignment
    • ArrayAlignment
    • BlockAlignment
    • BlockDelimiters
    • BlockEndNewline
    • ClosingParenthesisIndentation
    • FirstArgumentIndentation
    • FirstArrayElementIndentation
    • FirstHashElementIndentation
    • FirstParameterIndentation
    • HashAlignment
    • IndentationWidth
    • MultilineArrayLineBreaks
    • MultilineBlockLayout
    • MultilineHashBraceLayout
    • MultilineHashKeyLineBreaks
    • MultilineMethodArgumentLineBreaks
    • MultilineMethodParameterLineBreaks
    • ParameterAlignment

    Together, these cops will pretty print hashes, arrays, method calls, etc. For example, let's say the max columns is 25:

    Example:

    # bad
    {foo: "0000000000", bar: "0000000000", baz: "0000000000"}
    
    # good
    {foo: "0000000000",
    bar: "0000000000", baz: "0000000000"}
    
    # good (with recommended cops enabled)
    {
      foo: "0000000000",
      bar: "0000000000",
      baz: "0000000000",
    }

    Line is too long. [148/140] (https://rubystyle.guide#max-line-length)
    Open

        @next_date = @matches.empty? ? Match.unscoped.where('kickoff > ?', Time.current).order(kickoff: :asc).first.try(:kickoff) : @start_date + 1.week

    Checks the length of lines in the source code. The maximum length is configurable. The tab size is configured in the IndentationWidth of the Layout/IndentationStyle cop. It also ignores a shebang line by default.

    This cop has some autocorrection capabilities. It can programmatically shorten certain long lines by inserting line breaks into expressions that can be safely split across lines. These include arrays, hashes, and method calls with argument lists.

    If autocorrection is enabled, the following Layout cops are recommended to further format the broken lines. (Many of these are enabled by default.)

    • ArgumentAlignment
    • ArrayAlignment
    • BlockAlignment
    • BlockDelimiters
    • BlockEndNewline
    • ClosingParenthesisIndentation
    • FirstArgumentIndentation
    • FirstArrayElementIndentation
    • FirstHashElementIndentation
    • FirstParameterIndentation
    • HashAlignment
    • IndentationWidth
    • MultilineArrayLineBreaks
    • MultilineBlockLayout
    • MultilineHashBraceLayout
    • MultilineHashKeyLineBreaks
    • MultilineMethodArgumentLineBreaks
    • MultilineMethodParameterLineBreaks
    • ParameterAlignment

    Together, these cops will pretty print hashes, arrays, method calls, etc. For example, let's say the max columns is 25:

    Example:

    # bad
    {foo: "0000000000", bar: "0000000000", baz: "0000000000"}
    
    # good
    {foo: "0000000000",
    bar: "0000000000", baz: "0000000000"}
    
    # good (with recommended cops enabled)
    {
      foo: "0000000000",
      bar: "0000000000",
      baz: "0000000000",
    }

    Line is too long. [147/140] (https://rubystyle.guide#max-line-length)
    Open

        @prev_date = @matches.empty? ? Match.unscoped.where('kickoff < ?', Time.current).order(kickoff: :asc).last.try(:kickoff) : @start_date - 1.week

    Checks the length of lines in the source code. The maximum length is configurable. The tab size is configured in the IndentationWidth of the Layout/IndentationStyle cop. It also ignores a shebang line by default.

    This cop has some autocorrection capabilities. It can programmatically shorten certain long lines by inserting line breaks into expressions that can be safely split across lines. These include arrays, hashes, and method calls with argument lists.

    If autocorrection is enabled, the following Layout cops are recommended to further format the broken lines. (Many of these are enabled by default.)

    • ArgumentAlignment
    • ArrayAlignment
    • BlockAlignment
    • BlockDelimiters
    • BlockEndNewline
    • ClosingParenthesisIndentation
    • FirstArgumentIndentation
    • FirstArrayElementIndentation
    • FirstHashElementIndentation
    • FirstParameterIndentation
    • HashAlignment
    • IndentationWidth
    • MultilineArrayLineBreaks
    • MultilineBlockLayout
    • MultilineHashBraceLayout
    • MultilineHashKeyLineBreaks
    • MultilineMethodArgumentLineBreaks
    • MultilineMethodParameterLineBreaks
    • ParameterAlignment

    Together, these cops will pretty print hashes, arrays, method calls, etc. For example, let's say the max columns is 25:

    Example:

    # bad
    {foo: "0000000000", bar: "0000000000", baz: "0000000000"}
    
    # good
    {foo: "0000000000",
    bar: "0000000000", baz: "0000000000"}
    
    # good (with recommended cops enabled)
    {
      foo: "0000000000",
      bar: "0000000000",
      baz: "0000000000",
    }

    Prefer do...end over {...} for procedural blocks. (https://rubystyle.guide#single-line-blocks)
    Open

          format.html { redirect_to matches_url }

    Check for uses of braces or do/end around single line or multi-line blocks.

    Methods that can be either procedural or functional and cannot be categorised from their usage alone is ignored. lambda, proc, and it are their defaults. Additional methods can be added to the AllowedMethods.

    Example: EnforcedStyle: linecountbased (default)

    # bad - single line block
    items.each do |item| item / 5 end
    
    # good - single line block
    items.each { |item| item / 5 }
    
    # bad - multi-line block
    things.map { |thing|
      something = thing.some_method
      process(something)
    }
    
    # good - multi-line block
    things.map do |thing|
      something = thing.some_method
      process(something)
    end

    Example: EnforcedStyle: semantic

    # Prefer `do...end` over `{...}` for procedural blocks.
    
    # return value is used/assigned
    # bad
    foo = map do |x|
      x
    end
    puts (map do |x|
      x
    end)
    
    # return value is not used out of scope
    # good
    map do |x|
      x
    end
    
    # Prefer `{...}` over `do...end` for functional blocks.
    
    # return value is not used out of scope
    # bad
    each { |x|
      x
    }
    
    # return value is used/assigned
    # good
    foo = map { |x|
      x
    }
    map { |x|
      x
    }.inspect
    
    # The AllowBracesOnProceduralOneLiners option is allowed unless the
    # EnforcedStyle is set to `semantic`. If so:
    
    # If the AllowBracesOnProceduralOneLiners option is unspecified, or
    # set to `false` or any other falsey value, then semantic purity is
    # maintained, so one-line procedural blocks must use do-end, not
    # braces.
    
    # bad
    collection.each { |element| puts element }
    
    # good
    collection.each do |element| puts element end
    
    # If the AllowBracesOnProceduralOneLiners option is set to `true`, or
    # any other truthy value, then one-line procedural blocks may use
    # either style. (There is no setting for requiring braces on them.)
    
    # good
    collection.each { |element| puts element }
    
    # also good
    collection.each do |element| puts element end

    Example: EnforcedStyle: bracesforchaining

    # bad
    words.each do |word|
      word.flip.flop
    end.join("-")
    
    # good
    words.each { |word|
      word.flip.flop
    }.join("-")

    Example: EnforcedStyle: always_braces

    # bad
    words.each do |word|
      word.flip.flop
    end
    
    # good
    words.each { |word|
      word.flip.flop
    }

    Example: BracesRequiredMethods: ['sig']

    # Methods listed in the BracesRequiredMethods list, such as 'sig'
    # in this example, will require `{...}` braces. This option takes
    # precedence over all other configurations except AllowedMethods.
    
    # bad
    sig do
      params(
        foo: string,
      ).void
    end
    def bar(foo)
      puts foo
    end
    
    # good
    sig {
      params(
        foo: string,
      ).void
    }
    def bar(foo)
      puts foo
    end

    Example: AllowedMethods: ['lambda', 'proc', 'it' ] (default)

    # good
    foo = lambda do |x|
      puts "Hello, #{x}"
    end
    
    foo = lambda do |x|
      x * 100
    end

    Example: AllowedPatterns: [] (default)

    # bad
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    Example: AllowedPatterns: ['map']

    # good
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    Prefer do...end over {...} for procedural blocks. (https://rubystyle.guide#single-line-blocks)
    Open

            format.html { render action: 'new' }

    Check for uses of braces or do/end around single line or multi-line blocks.

    Methods that can be either procedural or functional and cannot be categorised from their usage alone is ignored. lambda, proc, and it are their defaults. Additional methods can be added to the AllowedMethods.

    Example: EnforcedStyle: linecountbased (default)

    # bad - single line block
    items.each do |item| item / 5 end
    
    # good - single line block
    items.each { |item| item / 5 }
    
    # bad - multi-line block
    things.map { |thing|
      something = thing.some_method
      process(something)
    }
    
    # good - multi-line block
    things.map do |thing|
      something = thing.some_method
      process(something)
    end

    Example: EnforcedStyle: semantic

    # Prefer `do...end` over `{...}` for procedural blocks.
    
    # return value is used/assigned
    # bad
    foo = map do |x|
      x
    end
    puts (map do |x|
      x
    end)
    
    # return value is not used out of scope
    # good
    map do |x|
      x
    end
    
    # Prefer `{...}` over `do...end` for functional blocks.
    
    # return value is not used out of scope
    # bad
    each { |x|
      x
    }
    
    # return value is used/assigned
    # good
    foo = map { |x|
      x
    }
    map { |x|
      x
    }.inspect
    
    # The AllowBracesOnProceduralOneLiners option is allowed unless the
    # EnforcedStyle is set to `semantic`. If so:
    
    # If the AllowBracesOnProceduralOneLiners option is unspecified, or
    # set to `false` or any other falsey value, then semantic purity is
    # maintained, so one-line procedural blocks must use do-end, not
    # braces.
    
    # bad
    collection.each { |element| puts element }
    
    # good
    collection.each do |element| puts element end
    
    # If the AllowBracesOnProceduralOneLiners option is set to `true`, or
    # any other truthy value, then one-line procedural blocks may use
    # either style. (There is no setting for requiring braces on them.)
    
    # good
    collection.each { |element| puts element }
    
    # also good
    collection.each do |element| puts element end

    Example: EnforcedStyle: bracesforchaining

    # bad
    words.each do |word|
      word.flip.flop
    end.join("-")
    
    # good
    words.each { |word|
      word.flip.flop
    }.join("-")

    Example: EnforcedStyle: always_braces

    # bad
    words.each do |word|
      word.flip.flop
    end
    
    # good
    words.each { |word|
      word.flip.flop
    }

    Example: BracesRequiredMethods: ['sig']

    # Methods listed in the BracesRequiredMethods list, such as 'sig'
    # in this example, will require `{...}` braces. This option takes
    # precedence over all other configurations except AllowedMethods.
    
    # bad
    sig do
      params(
        foo: string,
      ).void
    end
    def bar(foo)
      puts foo
    end
    
    # good
    sig {
      params(
        foo: string,
      ).void
    }
    def bar(foo)
      puts foo
    end

    Example: AllowedMethods: ['lambda', 'proc', 'it' ] (default)

    # good
    foo = lambda do |x|
      puts "Hello, #{x}"
    end
    
    foo = lambda do |x|
      x * 100
    end

    Example: AllowedPatterns: [] (default)

    # bad
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    Example: AllowedPatterns: ['map']

    # good
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    %i-literals should be delimited by [ and ]. (https://rubystyle.guide#percent-literal-braces)
    Open

      before_action :check_for_matches_to_update, only: %i(auto_update)

    Enforces the consistent usage of %-literal delimiters.

    Specify the 'default' key to set all preferred delimiters at once. You can continue to specify individual preferred delimiters to override the default.

    Example:

    # Style/PercentLiteralDelimiters:
    #   PreferredDelimiters:
    #     default: '[]'
    #     '%i':    '()'
    
    # good
    %w[alpha beta] + %i(gamma delta)
    
    # bad
    %W(alpha #{beta})
    
    # bad
    %I(alpha beta)

    Use x.mot_m_total(match_id: @match.id).positive? instead of x.mot_m_total(match_id: @match.id) > 0. (https://rubystyle.guide#predicate-methods)
    Open

        @mot_m_players = Player.includes(:mot_m_firsts, :mot_m_seconds, :mot_m_thirds).select { |x| x.mot_m_total(match_id: @match.id) && x.mot_m_total(match_id: @match.id) > 0 }.sort_by { |x| x.mot_m_total(match_id: @match.id) }.reverse if @match.teams.include? revs

    Checks for usage of comparison operators (==, >, <) to test numbers as zero, positive, or negative. These can be replaced by their respective predicate methods. This cop can also be configured to do the reverse.

    This cop can be customized allowed methods with AllowedMethods. By default, there are no methods to allowed.

    This cop disregards #nonzero? as its value is truthy or falsey, but not true and false, and thus not always interchangeable with != 0.

    This cop allows comparisons to global variables, since they are often populated with objects which can be compared with integers, but are not themselves Integer polymorphic.

    Safety:

    This cop is unsafe because it cannot be guaranteed that the receiver defines the predicates or can be compared to a number, which may lead to a false positive for non-standard classes.

    Example: EnforcedStyle: predicate (default)

    # bad
    foo == 0
    0 > foo
    bar.baz > 0
    
    # good
    foo.zero?
    foo.negative?
    bar.baz.positive?

    Example: EnforcedStyle: comparison

    # bad
    foo.zero?
    foo.negative?
    bar.baz.positive?
    
    # good
    foo == 0
    0 > foo
    bar.baz > 0

    Example: AllowedMethods: [] (default) with EnforcedStyle: predicate

    # bad
    foo == 0
    0 > foo
    bar.baz > 0

    Example: AllowedMethods: [==] with EnforcedStyle: predicate

    # good
    foo == 0
    
    # bad
    0 > foo
    bar.baz > 0

    Example: AllowedPatterns: [] (default) with EnforcedStyle: comparison

    # bad
    foo.zero?
    foo.negative?
    bar.baz.positive?

    Example: AllowedPatterns: ['zero'] with EnforcedStyle: predicate

    # good
    # bad
    foo.zero?
    
    # bad
    foo.negative?
    bar.baz.positive?

    Memoized variable @finished_matches_to_update does not match method name matches_to_update. Use @matches_to_update instead.
    Open

        @finished_matches_to_update ||= Match.where('(home_goals IS NULL OR away_goals IS NULL) AND kickoff < ?', Time.current - 2.hours)

    Checks for memoized methods whose instance variable name does not match the method name. Applies to both regular methods (defined with def) and dynamic methods (defined with define_method or define_singleton_method).

    This cop can be configured with the EnforcedStyleForLeadingUnderscores directive. It can be configured to allow for memoized instance variables prefixed with an underscore. Prefixing ivars with an underscore is a convention that is used to implicitly indicate that an ivar should not be set or referenced outside of the memoization method.

    Safety:

    This cop relies on the pattern @instance_var ||= ..., but this is sometimes used for other purposes than memoization so this cop is considered unsafe.

    Example: EnforcedStyleForLeadingUnderscores: disallowed (default)

    # bad
    # Method foo is memoized using an instance variable that is
    # not `@foo`. This can cause confusion and bugs.
    def foo
      @something ||= calculate_expensive_thing
    end
    
    def foo
      return @something if defined?(@something)
      @something = calculate_expensive_thing
    end
    
    # good
    def _foo
      @foo ||= calculate_expensive_thing
    end
    
    # good
    def foo
      @foo ||= calculate_expensive_thing
    end
    
    # good
    def foo
      @foo ||= begin
        calculate_expensive_thing
      end
    end
    
    # good
    def foo
      helper_variable = something_we_need_to_calculate_foo
      @foo ||= calculate_expensive_thing(helper_variable)
    end
    
    # good
    define_method(:foo) do
      @foo ||= calculate_expensive_thing
    end
    
    # good
    define_method(:foo) do
      return @foo if defined?(@foo)
      @foo = calculate_expensive_thing
    end

    Example: EnforcedStyleForLeadingUnderscores: required

    # bad
    def foo
      @something ||= calculate_expensive_thing
    end
    
    # bad
    def foo
      @foo ||= calculate_expensive_thing
    end
    
    def foo
      return @foo if defined?(@foo)
      @foo = calculate_expensive_thing
    end
    
    # good
    def foo
      @_foo ||= calculate_expensive_thing
    end
    
    # good
    def _foo
      @_foo ||= calculate_expensive_thing
    end
    
    def foo
      return @_foo if defined?(@_foo)
      @_foo = calculate_expensive_thing
    end
    
    # good
    define_method(:foo) do
      @_foo ||= calculate_expensive_thing
    end
    
    # good
    define_method(:foo) do
      return @_foo if defined?(@_foo)
      @_foo = calculate_expensive_thing
    end

    Example: EnforcedStyleForLeadingUnderscores :optional

    # bad
    def foo
      @something ||= calculate_expensive_thing
    end
    
    # good
    def foo
      @foo ||= calculate_expensive_thing
    end
    
    # good
    def foo
      @_foo ||= calculate_expensive_thing
    end
    
    # good
    def _foo
      @_foo ||= calculate_expensive_thing
    end
    
    # good
    def foo
      return @_foo if defined?(@_foo)
      @_foo = calculate_expensive_thing
    end
    
    # good
    define_method(:foo) do
      @foo ||= calculate_expensive_thing
    end
    
    # good
    define_method(:foo) do
      @_foo ||= calculate_expensive_thing
    end

    Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||. (https://rubystyle.guide#if-as-a-modifier)
    Open

        if response.code_type.in? [Net::HTTPRedirection, Net::HTTPFound]

    Checks for if and unless statements that would fit on one line if written as modifier if/unless. The cop also checks for modifier if/unless lines that exceed the maximum line length.

    The maximum line length is configured in the Layout/LineLength cop. The tab size is configured in the IndentationWidth of the Layout/IndentationStyle cop.

    Example:

    # bad
    if condition
      do_stuff(bar)
    end
    
    unless qux.empty?
      Foo.do_something
    end
    
    do_something_with_a_long_name(arg) if long_condition_that_prevents_code_fit_on_single_line
    
    # good
    do_stuff(bar) if condition
    Foo.do_something unless qux.empty?
    
    if long_condition_that_prevents_code_fit_on_single_line
      do_something_with_a_long_name(arg)
    end
    
    if short_condition # a long comment that makes it too long if it were just a single line
      do_something
    end

    Prefer do...end over {...} for procedural blocks. (https://rubystyle.guide#single-line-blocks)
    Open

            format.html { render action: 'edit' }

    Check for uses of braces or do/end around single line or multi-line blocks.

    Methods that can be either procedural or functional and cannot be categorised from their usage alone is ignored. lambda, proc, and it are their defaults. Additional methods can be added to the AllowedMethods.

    Example: EnforcedStyle: linecountbased (default)

    # bad - single line block
    items.each do |item| item / 5 end
    
    # good - single line block
    items.each { |item| item / 5 }
    
    # bad - multi-line block
    things.map { |thing|
      something = thing.some_method
      process(something)
    }
    
    # good - multi-line block
    things.map do |thing|
      something = thing.some_method
      process(something)
    end

    Example: EnforcedStyle: semantic

    # Prefer `do...end` over `{...}` for procedural blocks.
    
    # return value is used/assigned
    # bad
    foo = map do |x|
      x
    end
    puts (map do |x|
      x
    end)
    
    # return value is not used out of scope
    # good
    map do |x|
      x
    end
    
    # Prefer `{...}` over `do...end` for functional blocks.
    
    # return value is not used out of scope
    # bad
    each { |x|
      x
    }
    
    # return value is used/assigned
    # good
    foo = map { |x|
      x
    }
    map { |x|
      x
    }.inspect
    
    # The AllowBracesOnProceduralOneLiners option is allowed unless the
    # EnforcedStyle is set to `semantic`. If so:
    
    # If the AllowBracesOnProceduralOneLiners option is unspecified, or
    # set to `false` or any other falsey value, then semantic purity is
    # maintained, so one-line procedural blocks must use do-end, not
    # braces.
    
    # bad
    collection.each { |element| puts element }
    
    # good
    collection.each do |element| puts element end
    
    # If the AllowBracesOnProceduralOneLiners option is set to `true`, or
    # any other truthy value, then one-line procedural blocks may use
    # either style. (There is no setting for requiring braces on them.)
    
    # good
    collection.each { |element| puts element }
    
    # also good
    collection.each do |element| puts element end

    Example: EnforcedStyle: bracesforchaining

    # bad
    words.each do |word|
      word.flip.flop
    end.join("-")
    
    # good
    words.each { |word|
      word.flip.flop
    }.join("-")

    Example: EnforcedStyle: always_braces

    # bad
    words.each do |word|
      word.flip.flop
    end
    
    # good
    words.each { |word|
      word.flip.flop
    }

    Example: BracesRequiredMethods: ['sig']

    # Methods listed in the BracesRequiredMethods list, such as 'sig'
    # in this example, will require `{...}` braces. This option takes
    # precedence over all other configurations except AllowedMethods.
    
    # bad
    sig do
      params(
        foo: string,
      ).void
    end
    def bar(foo)
      puts foo
    end
    
    # good
    sig {
      params(
        foo: string,
      ).void
    }
    def bar(foo)
      puts foo
    end

    Example: AllowedMethods: ['lambda', 'proc', 'it' ] (default)

    # good
    foo = lambda do |x|
      puts "Hello, #{x}"
    end
    
    foo = lambda do |x|
      x * 100
    end

    Example: AllowedPatterns: [] (default)

    # bad
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    Example: AllowedPatterns: ['map']

    # good
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    Prefer {...} over do...end for functional blocks. (https://rubystyle.guide#single-line-blocks)
    Open

          match = Match.find_or_initialize_by(uid: data[:fixture][:id]) do |m|

    Check for uses of braces or do/end around single line or multi-line blocks.

    Methods that can be either procedural or functional and cannot be categorised from their usage alone is ignored. lambda, proc, and it are their defaults. Additional methods can be added to the AllowedMethods.

    Example: EnforcedStyle: linecountbased (default)

    # bad - single line block
    items.each do |item| item / 5 end
    
    # good - single line block
    items.each { |item| item / 5 }
    
    # bad - multi-line block
    things.map { |thing|
      something = thing.some_method
      process(something)
    }
    
    # good - multi-line block
    things.map do |thing|
      something = thing.some_method
      process(something)
    end

    Example: EnforcedStyle: semantic

    # Prefer `do...end` over `{...}` for procedural blocks.
    
    # return value is used/assigned
    # bad
    foo = map do |x|
      x
    end
    puts (map do |x|
      x
    end)
    
    # return value is not used out of scope
    # good
    map do |x|
      x
    end
    
    # Prefer `{...}` over `do...end` for functional blocks.
    
    # return value is not used out of scope
    # bad
    each { |x|
      x
    }
    
    # return value is used/assigned
    # good
    foo = map { |x|
      x
    }
    map { |x|
      x
    }.inspect
    
    # The AllowBracesOnProceduralOneLiners option is allowed unless the
    # EnforcedStyle is set to `semantic`. If so:
    
    # If the AllowBracesOnProceduralOneLiners option is unspecified, or
    # set to `false` or any other falsey value, then semantic purity is
    # maintained, so one-line procedural blocks must use do-end, not
    # braces.
    
    # bad
    collection.each { |element| puts element }
    
    # good
    collection.each do |element| puts element end
    
    # If the AllowBracesOnProceduralOneLiners option is set to `true`, or
    # any other truthy value, then one-line procedural blocks may use
    # either style. (There is no setting for requiring braces on them.)
    
    # good
    collection.each { |element| puts element }
    
    # also good
    collection.each do |element| puts element end

    Example: EnforcedStyle: bracesforchaining

    # bad
    words.each do |word|
      word.flip.flop
    end.join("-")
    
    # good
    words.each { |word|
      word.flip.flop
    }.join("-")

    Example: EnforcedStyle: always_braces

    # bad
    words.each do |word|
      word.flip.flop
    end
    
    # good
    words.each { |word|
      word.flip.flop
    }

    Example: BracesRequiredMethods: ['sig']

    # Methods listed in the BracesRequiredMethods list, such as 'sig'
    # in this example, will require `{...}` braces. This option takes
    # precedence over all other configurations except AllowedMethods.
    
    # bad
    sig do
      params(
        foo: string,
      ).void
    end
    def bar(foo)
      puts foo
    end
    
    # good
    sig {
      params(
        foo: string,
      ).void
    }
    def bar(foo)
      puts foo
    end

    Example: AllowedMethods: ['lambda', 'proc', 'it' ] (default)

    # good
    foo = lambda do |x|
      puts "Hello, #{x}"
    end
    
    foo = lambda do |x|
      x * 100
    end

    Example: AllowedPatterns: [] (default)

    # bad
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    Example: AllowedPatterns: ['map']

    # good
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    Prefer do...end over {...} for procedural blocks. (https://rubystyle.guide#single-line-blocks)
    Open

            format.html { redirect_to @match, notice: 'Match was successfully created.' }

    Check for uses of braces or do/end around single line or multi-line blocks.

    Methods that can be either procedural or functional and cannot be categorised from their usage alone is ignored. lambda, proc, and it are their defaults. Additional methods can be added to the AllowedMethods.

    Example: EnforcedStyle: linecountbased (default)

    # bad - single line block
    items.each do |item| item / 5 end
    
    # good - single line block
    items.each { |item| item / 5 }
    
    # bad - multi-line block
    things.map { |thing|
      something = thing.some_method
      process(something)
    }
    
    # good - multi-line block
    things.map do |thing|
      something = thing.some_method
      process(something)
    end

    Example: EnforcedStyle: semantic

    # Prefer `do...end` over `{...}` for procedural blocks.
    
    # return value is used/assigned
    # bad
    foo = map do |x|
      x
    end
    puts (map do |x|
      x
    end)
    
    # return value is not used out of scope
    # good
    map do |x|
      x
    end
    
    # Prefer `{...}` over `do...end` for functional blocks.
    
    # return value is not used out of scope
    # bad
    each { |x|
      x
    }
    
    # return value is used/assigned
    # good
    foo = map { |x|
      x
    }
    map { |x|
      x
    }.inspect
    
    # The AllowBracesOnProceduralOneLiners option is allowed unless the
    # EnforcedStyle is set to `semantic`. If so:
    
    # If the AllowBracesOnProceduralOneLiners option is unspecified, or
    # set to `false` or any other falsey value, then semantic purity is
    # maintained, so one-line procedural blocks must use do-end, not
    # braces.
    
    # bad
    collection.each { |element| puts element }
    
    # good
    collection.each do |element| puts element end
    
    # If the AllowBracesOnProceduralOneLiners option is set to `true`, or
    # any other truthy value, then one-line procedural blocks may use
    # either style. (There is no setting for requiring braces on them.)
    
    # good
    collection.each { |element| puts element }
    
    # also good
    collection.each do |element| puts element end

    Example: EnforcedStyle: bracesforchaining

    # bad
    words.each do |word|
      word.flip.flop
    end.join("-")
    
    # good
    words.each { |word|
      word.flip.flop
    }.join("-")

    Example: EnforcedStyle: always_braces

    # bad
    words.each do |word|
      word.flip.flop
    end
    
    # good
    words.each { |word|
      word.flip.flop
    }

    Example: BracesRequiredMethods: ['sig']

    # Methods listed in the BracesRequiredMethods list, such as 'sig'
    # in this example, will require `{...}` braces. This option takes
    # precedence over all other configurations except AllowedMethods.
    
    # bad
    sig do
      params(
        foo: string,
      ).void
    end
    def bar(foo)
      puts foo
    end
    
    # good
    sig {
      params(
        foo: string,
      ).void
    }
    def bar(foo)
      puts foo
    end

    Example: AllowedMethods: ['lambda', 'proc', 'it' ] (default)

    # good
    foo = lambda do |x|
      puts "Hello, #{x}"
    end
    
    foo = lambda do |x|
      x * 100
    end

    Example: AllowedPatterns: [] (default)

    # bad
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    Example: AllowedPatterns: ['map']

    # good
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    Add empty line after guard clause.
    Open

        return {} unless match.at_css('.sb-match-date').try(:content).present?

    Enforces empty line after guard clause

    Example:

    # bad
    def foo
      return if need_return?
      bar
    end
    
    # good
    def foo
      return if need_return?
    
      bar
    end
    
    # good
    def foo
      return if something?
      return if something_different?
    
      bar
    end
    
    # also good
    def foo
      if something?
        do_something
        return if need_return?
      end
    end

    %i-literals should be delimited by [ and ]. (https://rubystyle.guide#percent-literal-braces)
    Open

      before_action :set_match, only: %i(show edit update destroy)

    Enforces the consistent usage of %-literal delimiters.

    Specify the 'default' key to set all preferred delimiters at once. You can continue to specify individual preferred delimiters to override the default.

    Example:

    # Style/PercentLiteralDelimiters:
    #   PreferredDelimiters:
    #     default: '[]'
    #     '%i':    '()'
    
    # good
    %w[alpha beta] + %i(gamma delta)
    
    # bad
    %W(alpha #{beta})
    
    # bad
    %I(alpha beta)

    Modifier form of if makes the line too long. (https://rubystyle.guide#if-as-a-modifier)
    Open

        @mot_m_players = Player.includes(:mot_m_firsts, :mot_m_seconds, :mot_m_thirds).select { |x| x.mot_m_total(match_id: @match.id) && x.mot_m_total(match_id: @match.id) > 0 }.sort_by { |x| x.mot_m_total(match_id: @match.id) }.reverse if @match.teams.include? revs

    Checks for if and unless statements that would fit on one line if written as modifier if/unless. The cop also checks for modifier if/unless lines that exceed the maximum line length.

    The maximum line length is configured in the Layout/LineLength cop. The tab size is configured in the IndentationWidth of the Layout/IndentationStyle cop.

    Example:

    # bad
    if condition
      do_stuff(bar)
    end
    
    unless qux.empty?
      Foo.do_something
    end
    
    do_something_with_a_long_name(arg) if long_condition_that_prevents_code_fit_on_single_line
    
    # good
    do_stuff(bar) if condition
    Foo.do_something unless qux.empty?
    
    if long_condition_that_prevents_code_fit_on_single_line
      do_something_with_a_long_name(arg)
    end
    
    if short_condition # a long comment that makes it too long if it were just a single line
      do_something
    end

    Pass a block to to_h instead of calling map.to_h.
    Open

        clubs = Club.all.map { |c| [c.api_id, c] }.to_h

    Looks for uses of map.to_h or collect.to_h that could be written with just to_h in Ruby >= 2.6.

    NOTE: Style/HashTransformKeys and Style/HashTransformValues will also change this pattern if only hash keys or hash values are being transformed.

    Safety:

    This cop is unsafe, as it can produce false positives if the receiver is not an Enumerable.

    Example:

    # bad
    something.map { |v| [v, v * 2] }.to_h
    
    # good
    something.to_h { |v| [v, v * 2] }
    
    # bad
    {foo: bar}.collect { |k, v| [k.to_s, v.do_something] }.to_h
    
    # good
    {foo: bar}.to_h { |k, v| [k.to_s, v.do_something] }

    %w-literals should be delimited by [ and ]. (https://rubystyle.guide#percent-literal-braces)
    Open

        %w(home away).each do |team|

    Enforces the consistent usage of %-literal delimiters.

    Specify the 'default' key to set all preferred delimiters at once. You can continue to specify individual preferred delimiters to override the default.

    Example:

    # Style/PercentLiteralDelimiters:
    #   PreferredDelimiters:
    #     default: '[]'
    #     '%i':    '()'
    
    # good
    %w[alpha beta] + %i(gamma delta)
    
    # bad
    %W(alpha #{beta})
    
    # bad
    %I(alpha beta)

    Prefer do...end over {...} for procedural blocks. (https://rubystyle.guide#single-line-blocks)
    Open

            format.html { redirect_to matches_path(date: @match.kickoff.to_date), notice: 'Match was successfully updated.' }

    Check for uses of braces or do/end around single line or multi-line blocks.

    Methods that can be either procedural or functional and cannot be categorised from their usage alone is ignored. lambda, proc, and it are their defaults. Additional methods can be added to the AllowedMethods.

    Example: EnforcedStyle: linecountbased (default)

    # bad - single line block
    items.each do |item| item / 5 end
    
    # good - single line block
    items.each { |item| item / 5 }
    
    # bad - multi-line block
    things.map { |thing|
      something = thing.some_method
      process(something)
    }
    
    # good - multi-line block
    things.map do |thing|
      something = thing.some_method
      process(something)
    end

    Example: EnforcedStyle: semantic

    # Prefer `do...end` over `{...}` for procedural blocks.
    
    # return value is used/assigned
    # bad
    foo = map do |x|
      x
    end
    puts (map do |x|
      x
    end)
    
    # return value is not used out of scope
    # good
    map do |x|
      x
    end
    
    # Prefer `{...}` over `do...end` for functional blocks.
    
    # return value is not used out of scope
    # bad
    each { |x|
      x
    }
    
    # return value is used/assigned
    # good
    foo = map { |x|
      x
    }
    map { |x|
      x
    }.inspect
    
    # The AllowBracesOnProceduralOneLiners option is allowed unless the
    # EnforcedStyle is set to `semantic`. If so:
    
    # If the AllowBracesOnProceduralOneLiners option is unspecified, or
    # set to `false` or any other falsey value, then semantic purity is
    # maintained, so one-line procedural blocks must use do-end, not
    # braces.
    
    # bad
    collection.each { |element| puts element }
    
    # good
    collection.each do |element| puts element end
    
    # If the AllowBracesOnProceduralOneLiners option is set to `true`, or
    # any other truthy value, then one-line procedural blocks may use
    # either style. (There is no setting for requiring braces on them.)
    
    # good
    collection.each { |element| puts element }
    
    # also good
    collection.each do |element| puts element end

    Example: EnforcedStyle: bracesforchaining

    # bad
    words.each do |word|
      word.flip.flop
    end.join("-")
    
    # good
    words.each { |word|
      word.flip.flop
    }.join("-")

    Example: EnforcedStyle: always_braces

    # bad
    words.each do |word|
      word.flip.flop
    end
    
    # good
    words.each { |word|
      word.flip.flop
    }

    Example: BracesRequiredMethods: ['sig']

    # Methods listed in the BracesRequiredMethods list, such as 'sig'
    # in this example, will require `{...}` braces. This option takes
    # precedence over all other configurations except AllowedMethods.
    
    # bad
    sig do
      params(
        foo: string,
      ).void
    end
    def bar(foo)
      puts foo
    end
    
    # good
    sig {
      params(
        foo: string,
      ).void
    }
    def bar(foo)
      puts foo
    end

    Example: AllowedMethods: ['lambda', 'proc', 'it' ] (default)

    # good
    foo = lambda do |x|
      puts "Hello, #{x}"
    end
    
    foo = lambda do |x|
      x * 100
    end

    Example: AllowedPatterns: [] (default)

    # bad
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    Example: AllowedPatterns: ['map']

    # good
    things.map { |thing|
      something = thing.some_method
      process(something)
    }

    Use ENV.fetch('API_FOOTBALL_KEY') or ENV.fetch('API_FOOTBALL_KEY', nil) instead of ENV['API_FOOTBALL_KEY']. (https://rubystyle.guide/#hash-fetch-defaults)
    Open

        request['x-apisports-key'] = ENV['API_FOOTBALL_KEY']

    Suggests ENV.fetch for the replacement of ENV[]. ENV[] silently fails and returns nil when the environment variable is unset, which may cause unexpected behaviors when the developer forgets to set it. On the other hand, ENV.fetch raises KeyError or returns the explicitly specified default value.

    Example:

    # bad
    ENV['X']
    x = ENV['X']
    
    # good
    ENV.fetch('X')
    x = ENV.fetch('X')
    
    # also good
    !ENV['X']
    ENV['X'].some_method # (e.g. `.nil?`)

    There are no issues that match your filters.

    Category
    Status