fga-gpp-mds/2017.1-OndeE-UnB

View on GitHub
darcyWeb/app/controllers/parser_controller.rb

Summary

Maintainability
A
3 hrs
Test Coverage

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

class ParserController < ApplicationController
  before_action :authenticate_admin!
  def index
    render plain: schedules
  end

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

Assignment Branch Condition size for schedules is too high. [38.72/15]
Open

  def schedules
    require 'nokogiri'
    require 'open-uri'

    courses.each do |course|

This cop 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

Method has too many lines. [36/25]
Open

  def schedules
    require 'nokogiri'
    require 'open-uri'

    courses.each do |course|

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

Assignment Branch Condition size for departments is too high. [18.41/15]
Open

  def departments
    require 'nokogiri'
    require 'open-uri'
    html = open('https://matriculaweb.unb.br/graduacao/oferta_dep.aspx?cod=1')
    html_tree = Nokogiri::HTML(html, nil, Encoding::UTF_8.to_s)

This cop 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

Cyclomatic complexity for set_day_of_week is too high. [8/5]
Open

  def set_day_of_week(day_of_week)
    case day_of_week
    when 'Segunda'
      :monday
    when 'Terça'

This cop 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.

Assignment Branch Condition size for courses is too high. [17.09/15]
Open

  def courses
    require 'nokogiri'
    require 'open-uri'

    courses = []

This cop 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

Cyclomatic complexity for valid_schedule_and_room? is too high. [6/5]
Open

  def valid_schedule_and_room?(day_of_week, start_time, end_time, room, classroom)
    valid_times = day_of_week.present? && start_time.present? && end_time.present?
    valid_room = room.present? && (room != 'Local a Designar') && classroom.present?
    valid_times && valid_room
  end

This cop 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.

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

  def schedules
    require 'nokogiri'
    require 'open-uri'

    courses.each do |course|
Severity: Minor
Found in darcyWeb/app/controllers/parser_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 schedules has 36 lines of code (exceeds 25 allowed). Consider refactoring.
Open

  def schedules
    require 'nokogiri'
    require 'open-uri'

    courses.each do |course|
Severity: Minor
Found in darcyWeb/app/controllers/parser_controller.rb - About 1 hr to fix

    Block has too many lines. [32/25]
    Open

        courses.each do |course|
          html = open(course[:url])
          html_tree = Nokogiri::HTML(html, nil, Encoding::UTF_8.to_s)
          schedules_rows = html_tree.css('.framecinza tr')
    
    

    This cop checks if the length of a block exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable. The cop can be configured to ignore blocks passed to certain methods.

    Method valid_schedule_and_room? has 5 arguments (exceeds 4 allowed). Consider refactoring.
    Open

      def valid_schedule_and_room?(day_of_week, start_time, end_time, room, classroom)
    Severity: Minor
    Found in darcyWeb/app/controllers/parser_controller.rb - About 35 mins to fix

      Block has too many lines. [27/25]
      Open

            schedules_rows.each do |schedule_row|
              if schedule_row.content.include? 'Total'
                classroom = schedule_row.at_css('td[1] b')
                schedule_row.css('td[4] div').each do |schedule|
                  day_of_week = schedule.at_css('b')

      This cop checks if the length of a block exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable. The cop can be configured to ignore blocks passed to certain methods.

      Line is too long. [157/100]
      Open

          Schedule.where(room: room, day_of_week: params[:day_of_week], start_time: params[:start_time], end_time: params[:end_time]).first_or_create do |schedule|

      Use next to skip iteration.
      Open

                  if valid_schedule_and_room?(day_of_week, start_time, end_time, room, classroom)

      Use next to skip iteration instead of a condition at the end.

      Example: EnforcedStyle: skipmodifierifs (default)

      # bad
      [1, 2].each do |a|
        if a == 1
          puts a
        end
      end
      
      # good
      [1, 2].each do |a|
        next unless a == 1
        puts a
      end
      
      # good
      [1, 2].each do |o|
        puts o unless o == 1
      end

      Example: EnforcedStyle: always

      # With `always` all conditions at the end of an iteration needs to be
      # replaced by next - with `skip_modifier_ifs` the modifier if like
      # this one are ignored: `[1, 2].each { |a| return 'yes' if a == 1 }`
      
      # bad
      [1, 2].each do |o|
        puts o unless o == 1
      end
      
      # bad
      [1, 2].each do |a|
        if a == 1
          puts a
        end
      end
      
      # good
      [1, 2].each do |a|
        next unless a == 1
        puts a
      end

      Use next to skip iteration.
      Open

            unless exclude_departments.include? acronym

      Use next to skip iteration instead of a condition at the end.

      Example: EnforcedStyle: skipmodifierifs (default)

      # bad
      [1, 2].each do |a|
        if a == 1
          puts a
        end
      end
      
      # good
      [1, 2].each do |a|
        next unless a == 1
        puts a
      end
      
      # good
      [1, 2].each do |o|
        puts o unless o == 1
      end

      Example: EnforcedStyle: always

      # With `always` all conditions at the end of an iteration needs to be
      # replaced by next - with `skip_modifier_ifs` the modifier if like
      # this one are ignored: `[1, 2].each { |a| return 'yes' if a == 1 }`
      
      # bad
      [1, 2].each do |o|
        puts o unless o == 1
      end
      
      # bad
      [1, 2].each do |a|
        if a == 1
          puts a
        end
      end
      
      # good
      [1, 2].each do |a|
        next unless a == 1
        puts a
      end

      end at 196, 3 is not aligned with Room.where(acronym: params[:room]).first_or_create do |room| at 188, 4.
      Open

         end

      This cop checks whether the end keywords are aligned properly for do end blocks.

      Three modes are supported through the EnforcedStyleAlignWith configuration parameter:

      start_of_block : the end shall be aligned with the start of the line where the do appeared.

      start_of_line : the end shall be aligned with the start of the line where the expression started.

      either (which is the default) : the end is allowed to be in either location. The autofixer will default to start_of_line.

      Example: EnforcedStyleAlignWith: either (default)

      # bad
      
      foo.bar
         .each do
           baz
             end
      
      # good
      
      variable = lambda do |i|
        i
      end

      Example: EnforcedStyleAlignWith: startofblock

      # bad
      
      foo.bar
         .each do
           baz
             end
      
      # good
      
      foo.bar
        .each do
           baz
         end

      Example: EnforcedStyleAlignWith: startofline

      # bad
      
      foo.bar
         .each do
           baz
             end
      
      # good
      
      foo.bar
        .each do
           baz
      end

      Do not use space inside array brackets.
      Open

          buildings = [ ['BSA N', 'BSAN'], ['BSA S', 'BSAS'] ]

      Checks that brackets used for array literals have or don't have surrounding space depending on configuration.

      Example: EnforcedStyle: space

      # The `space` style enforces that array literals have
      # surrounding space.
      
      # bad
      array = [a, b, c, d]
      
      # good
      array = [ a, b, c, d ]

      Example: EnforcedStyle: no_space

      # The `no_space` style enforces that array literals have
      # no surrounding space.
      
      # bad
      array = [ a, b, c, d ]
      
      # good
      array = [a, b, c, d]

      Example: EnforcedStyle: compact

      # The `compact` style normally requires a space inside
      # array brackets, with the exception that successive left
      # or right brackets are collapsed together in nested arrays.
      
      # bad
      array = [ a, [ b, c ] ]
      
      # good
      array = [ a, [ b, c ]]

      %w-literals should be delimited by [ and ].
      Open

          %w(ICC PAT PJC)

      This cop 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)

      Do not use space inside array brackets.
      Open

          buildings = [ ['BSA N', 'BSAN'], ['BSA S', 'BSAS'] ]

      Checks that brackets used for array literals have or don't have surrounding space depending on configuration.

      Example: EnforcedStyle: space

      # The `space` style enforces that array literals have
      # surrounding space.
      
      # bad
      array = [a, b, c, d]
      
      # good
      array = [ a, b, c, d ]

      Example: EnforcedStyle: no_space

      # The `no_space` style enforces that array literals have
      # no surrounding space.
      
      # bad
      array = [ a, b, c, d ]
      
      # good
      array = [a, b, c, d]

      Example: EnforcedStyle: compact

      # The `compact` style normally requires a space inside
      # array brackets, with the exception that successive left
      # or right brackets are collapsed together in nested arrays.
      
      # bad
      array = [ a, [ b, c ] ]
      
      # good
      array = [ a, [ b, c ]]

      end at 176, 1 is not aligned with def at 130, 2.
      Open

       end

      This cop checks whether the end keywords of method definitions are aligned properly.

      Two modes are supported through the EnforcedStyleAlignWith configuration parameter. If it's set to start_of_line (which is the default), the end shall be aligned with the start of the line where the def keyword is. If it's set to def, the end shall be aligned with the def keyword.

      Example: EnforcedStyleAlignWith: startofline (default)

      # bad
      
      private def foo
                  end
      
      # good
      
      private def foo
      end

      Example: EnforcedStyleAlignWith: def

      # bad
      
      private def foo
                  end
      
      # good
      
      private def foo
              end

      Line is too long. [337/100]
      Open

          '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-47.867375314235694,-15.762756116441665],[-47.86702126264573,-15.762497981882012],[-47.866597473621376,-15.763055552119592],[-47.8669622540474,-15.763303360622453],[-47.867375314235694,-15.762756116441665]]]}}]}'

      %w-literals should be delimited by [ and ].
      Open

          %w(FGA FCE FUP)

      This cop 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 2 (not 1) spaces for indentation.
      Open

          room.building = create_building(params)

      This cops checks for indentation that doesn't use the specified number of spaces.

      See also the IndentationConsistency cop which is the companion to this one.

      Example:

      # bad
      class A
       def test
        puts 'hello'
       end
      end
      
      # good
      class A
        def test
          puts 'hello'
        end
      end

      Example: IgnoredPatterns: ['^\s*module']

      # bad
      module A
      class B
        def test
        puts 'hello'
        end
      end
      end
      
      # good
      module A
      class B
        def test
          puts 'hello'
        end
      end
      end

      Do not prefix writer method names with set_.
      Open

        def set_day_of_week(day_of_week)

      This cop makes sure that accessor methods are named properly.

      Example:

      # bad
      def set_attribute(value)
      end
      
      # good
      def attribute=(value)
      end
      
      # bad
      def get_attribute
      end
      
      # good
      def attribute
      end

      Use next to skip iteration.
      Open

              if schedule_row.content.include? 'Total'

      Use next to skip iteration instead of a condition at the end.

      Example: EnforcedStyle: skipmodifierifs (default)

      # bad
      [1, 2].each do |a|
        if a == 1
          puts a
        end
      end
      
      # good
      [1, 2].each do |a|
        next unless a == 1
        puts a
      end
      
      # good
      [1, 2].each do |o|
        puts o unless o == 1
      end

      Example: EnforcedStyle: always

      # With `always` all conditions at the end of an iteration needs to be
      # replaced by next - with `skip_modifier_ifs` the modifier if like
      # this one are ignored: `[1, 2].each { |a| return 'yes' if a == 1 }`
      
      # bad
      [1, 2].each do |o|
        puts o unless o == 1
      end
      
      # bad
      [1, 2].each do |a|
        if a == 1
          puts a
        end
      end
      
      # good
      [1, 2].each do |a|
        next unless a == 1
        puts a
      end

      There are no issues that match your filters.

      Category
      Status