3scale/porta

View on GitHub
app/lib/pdf/report.rb

Summary

Maintainability
B
5 hrs
Test Coverage

Class Report has 28 methods (exceeds 20 allowed). Consider refactoring.
Open

  class Report
    include Printer

    attr_accessor :account, :period, :pdf, :service, :report

Severity: Minor
Found in app/lib/pdf/report.rb - About 3 hrs to fix

    File report.rb has 286 lines of code (exceeds 250 allowed). Consider refactoring.
    Wontfix

    require 'SVG/Graph/DataPoint'
    require 'SVG/Graph/Line'
    
    # REFACTOR: extract abstract Report class, and DRY functionality with InvoiceReporter
    module Pdf
    Severity: Minor
    Found in app/lib/pdf/report.rb - About 2 hrs to fix

      Method traffic_graph has 28 lines of code (exceeds 25 allowed). Consider refactoring.
      Open

          def traffic_graph
            usage = @data.usage
      
            return unless usage
      
      
      Severity: Minor
      Found in app/lib/pdf/report.rb - About 1 hr to fix

        Method graph_key_formatter has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.
        Open

            def graph_key_formatter(usage)
              if @period == :day
                ->(point) { (point % 4).zero? ? sprintf("%02d:00", point) : "" }
              else
                since = usage.dig(:period, :since)
        Severity: Minor
        Found in app/lib/pdf/report.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

        Pdf::Report#traffic_graph refers to 'usage' more than self (maybe move it to another class?)
        Open

                graph_title: "Traffic - #{usage.dig(:metric, :name)}",
                show_graph_title: true,
                key: false,
                area_fill: false,
                show_data_values: false,
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Feature Envy occurs when a code fragment references another object more often than it references itself, or when several clients do the same series of manipulations on a particular type of object.

        Feature Envy reduces the code's ability to communicate intent: code that "belongs" on one class but which is located in another can be hard to find, and may upset the "System of Names" in the host class.

        Feature Envy also affects the design's flexibility: A code fragment that is in the wrong class creates couplings that may not be natural within the application's domain, and creates a loss of cohesion in the unwilling host class.

        Feature Envy often arises because it must manipulate other objects (usually its arguments) to get them into a useful form, and one force preventing them (the arguments) doing this themselves is that the common knowledge lives outside the arguments, or the arguments are of too basic a type to justify extending that type. Therefore there must be something which 'knows' about the contents or purposes of the arguments. That thing would have to be more than just a basic type, because the basic types are either containers which don't know about their contents, or they are single objects which can't capture their relationship with their fellows of the same type. So, this thing with the extra knowledge should be reified into a class, and the utility method will most likely belong there.

        Example

        Running Reek on:

        class Warehouse
          def sale_price(item)
            (item.price - item.rebate) * @vat
          end
        end

        would report:

        Warehouse#total_price refers to item more than self (FeatureEnvy)

        since this:

        (item.price - item.rebate)

        belongs to the Item class, not the Warehouse.

        Pdf::Report#generate has approx 14 statements
        Open

            def generate
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A method with Too Many Statements is any method that has a large number of lines.

        Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

        So the following method would score +6 in Reek's statement-counting algorithm:

        def parse(arg, argv, &error)
          if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
            return nil, block, nil                                         # +1
          end
          opt = (val = parse_arg(val, &error))[1]                          # +2
          val = conv_arg(*val)                                             # +3
          if opt and !arg
            argv.shift                                                     # +4
          else
            val[0] = nil                                                   # +5
          end
          val                                                              # +6
        end

        (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

        Pdf::Report#deliver_notification? refers to 'user' more than self (maybe move it to another class?)
        Open

              user.notification_preferences.include?(notification_name) && user.admin?
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Feature Envy occurs when a code fragment references another object more often than it references itself, or when several clients do the same series of manipulations on a particular type of object.

        Feature Envy reduces the code's ability to communicate intent: code that "belongs" on one class but which is located in another can be hard to find, and may upset the "System of Names" in the host class.

        Feature Envy also affects the design's flexibility: A code fragment that is in the wrong class creates couplings that may not be natural within the application's domain, and creates a loss of cohesion in the unwilling host class.

        Feature Envy often arises because it must manipulate other objects (usually its arguments) to get them into a useful form, and one force preventing them (the arguments) doing this themselves is that the common knowledge lives outside the arguments, or the arguments are of too basic a type to justify extending that type. Therefore there must be something which 'knows' about the contents or purposes of the arguments. That thing would have to be more than just a basic type, because the basic types are either containers which don't know about their contents, or they are single objects which can't capture their relationship with their fellows of the same type. So, this thing with the extra knowledge should be reified into a class, and the utility method will most likely belong there.

        Example

        Running Reek on:

        class Warehouse
          def sale_price(item)
            (item.price - item.rebate) * @vat
          end
        end

        would report:

        Warehouse#total_price refers to item more than self (FeatureEnvy)

        since this:

        (item.price - item.rebate)

        belongs to the Item class, not the Warehouse.

        Pdf::Report#traffic_graph_style_clean_up contains iterators nested 2 deep
        Open

                %w[line fill key dataPoint].each do |type|
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A Nested Iterator occurs when a block contains another block.

        Example

        Given

        class Duck
          class << self
            def duck_names
              %i!tick trick track!.each do |surname|
                %i!duck!.each do |last_name|
                  puts "full name is #{surname} #{last_name}"
                end
              end
            end
          end
        end

        Reek would report the following warning:

        test.rb -- 1 warning:
          [5]:Duck#duck_names contains iterators nested 2 deep (NestedIterators)

        Pdf::Report#graph_key_formatter refers to 'point' more than self (maybe move it to another class?)
        Open

                ->(point) { (point % 4).zero? ? sprintf("%02d:00", point) : "" }
              else
                since = usage.dig(:period, :since)
                granularity = usage.dig(:period, :granularity)
                ->(point) { (point % 4).zero? ? (since + point * granularity).strftime("%d %b") : "" }
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Feature Envy occurs when a code fragment references another object more often than it references itself, or when several clients do the same series of manipulations on a particular type of object.

        Feature Envy reduces the code's ability to communicate intent: code that "belongs" on one class but which is located in another can be hard to find, and may upset the "System of Names" in the host class.

        Feature Envy also affects the design's flexibility: A code fragment that is in the wrong class creates couplings that may not be natural within the application's domain, and creates a loss of cohesion in the unwilling host class.

        Feature Envy often arises because it must manipulate other objects (usually its arguments) to get them into a useful form, and one force preventing them (the arguments) doing this themselves is that the common knowledge lives outside the arguments, or the arguments are of too basic a type to justify extending that type. Therefore there must be something which 'knows' about the contents or purposes of the arguments. That thing would have to be more than just a basic type, because the basic types are either containers which don't know about their contents, or they are single objects which can't capture their relationship with their fellows of the same type. So, this thing with the extra knowledge should be reified into a class, and the utility method will most likely belong there.

        Example

        Running Reek on:

        class Warehouse
          def sale_price(item)
            (item.price - item.rebate) * @vat
          end
        end

        would report:

        Warehouse#total_price refers to item more than self (FeatureEnvy)

        since this:

        (item.price - item.rebate)

        belongs to the Item class, not the Warehouse.

        Pdf::Report has at least 6 instance variables
        Open

          class Report
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Too Many Instance Variables is a special case of LargeClass.

        Example

        Given this configuration

        TooManyInstanceVariables:
          max_instance_variables: 3

        and this code:

        class TooManyInstanceVariables
          def initialize
            @arg_1 = :dummy
            @arg_2 = :dummy
            @arg_3 = :dummy
            @arg_4 = :dummy
          end
        end

        Reek would emit the following warning:

        test.rb -- 5 warnings:
          [1]:TooManyInstanceVariables has at least 4 instance variables (TooManyInstanceVariables)

        Pdf::Report has at least 28 methods
        Open

          class Report
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Too Many Methods is a special case of LargeClass.

        Example

        Given this configuration

        TooManyMethods:
          max_methods: 3

        and this code:

        class TooManyMethods
          def one; end
          def two; end
          def three; end
          def four; end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [1]:TooManyMethods has at least 4 methods (TooManyMethods)

        Pdf::Report#graph_key_formatter has approx 8 statements
        Open

            def graph_key_formatter(usage)
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A method with Too Many Statements is any method that has a large number of lines.

        Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

        So the following method would score +6 in Reek's statement-counting algorithm:

        def parse(arg, argv, &error)
          if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
            return nil, block, nil                                         # +1
          end
          opt = (val = parse_arg(val, &error))[1]                          # +2
          val = conv_arg(*val)                                             # +3
          if opt and !arg
            argv.shift                                                     # +4
          else
            val[0] = nil                                                   # +5
          end
          val                                                              # +6
        end

        (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

        Pdf::Report#traffic_graph_style has approx 14 statements
        Open

            def traffic_graph_style(svg)
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A method with Too Many Statements is any method that has a large number of lines.

        Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

        So the following method would score +6 in Reek's statement-counting algorithm:

        def parse(arg, argv, &error)
          if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
            return nil, block, nil                                         # +1
          end
          opt = (val = parse_arg(val, &error))[1]                          # +2
          val = conv_arg(*val)                                             # +3
          if opt and !arg
            argv.shift                                                     # +4
          else
            val[0] = nil                                                   # +5
          end
          val                                                              # +6
        end

        (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

        Pdf::Report tests '@period == :day' at least 3 times
        Open

              if @period == :day
                ->(point) { (point % 4).zero? ? sprintf("%02d:00", point) : "" }
              else
                since = usage.dig(:period, :since)
                granularity = usage.dig(:period, :granularity)
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Repeated Conditional is a special case of Simulated Polymorphism. Basically it means you are checking the same value throughout a single class and take decisions based on this.

        Example

        Given

        class RepeatedConditionals
          attr_accessor :switch
        
          def repeat_1
            puts "Repeat 1!" if switch
          end
        
          def repeat_2
            puts "Repeat 2!" if switch
          end
        
          def repeat_3
            puts "Repeat 3!" if switch
          end
        end

        Reek would emit the following warning:

        test.rb -- 4 warnings:
          [5, 9, 13]:RepeatedConditionals tests switch at least 3 times (RepeatedConditional)

        If you get this warning then you are probably not using the right abstraction or even more probable, missing an additional abstraction.

        Pdf::Report#graph_key_formatter calls '(point % 4).zero?' 2 times
        Invalid

                ->(point) { (point % 4).zero? ? sprintf("%02d:00", point) : "" }
              else
                since = usage.dig(:period, :since)
                granularity = usage.dig(:period, :granularity)
                ->(point) { (point % 4).zero? ? (since + point * granularity).strftime("%d %b") : "" }
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#header_text calls '{ text: 1.day.ago.to_date.to_s }.merge!(format)' 2 times
        Wontfix

                [{ text: 1.day.ago.to_date.to_s }.merge!(format)]
              else
                [
                  { text: 1.week.ago.to_date.to_s }.merge!(format),
                  { text: " - " },
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#traffic_graph calls 'usage[:values]' 4 times
        Open

                fields: usage[:values].each_index.map(&graph_key_formatter(usage)),
                show_x_title: false,
                x_title: @period == :day ? "Hour" : "Week Days",
                show_y_guidelines: true,
                scale_integers: true,
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#header_text calls '1.day' 2 times
        Open

                [{ text: 1.day.ago.to_date.to_s }.merge!(format)]
              else
                [
                  { text: 1.week.ago.to_date.to_s }.merge!(format),
                  { text: " - " },
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#three_scale_logo calls '@pdf.bounds' 4 times
        Wontfix

                @pdf.bounds.absolute_left,
                @pdf.bounds.absolute_top - image.scaled_height,
                @pdf.bounds.absolute_left + image.scaled_width,
                @pdf.bounds.absolute_top
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#traffic_graph calls 'usage.dig(:metric, :name)' 2 times
        Invalid

                graph_title: "Traffic - #{usage.dig(:metric, :name)}",
                show_graph_title: true,
                key: false,
                area_fill: false,
                show_data_values: false,
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#generate calls 'move_down 3' 5 times
        Open

              move_down 3
              traffic_graph
              move_down 3
        
              traffic_and_users
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#three_scale_logo calls '@pdf.bounds.absolute_top' 2 times
        Wontfix

                @pdf.bounds.absolute_top - image.scaled_height,
                @pdf.bounds.absolute_left + image.scaled_width,
                @pdf.bounds.absolute_top
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#graph_key_formatter calls 'point % 4' 2 times
        Invalid

                ->(point) { (point % 4).zero? ? sprintf("%02d:00", point) : "" }
              else
                since = usage.dig(:period, :since)
                granularity = usage.dig(:period, :granularity)
                ->(point) { (point % 4).zero? ? (since + point * granularity).strftime("%d %b") : "" }
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#header calls '@style[:period][:size]' 2 times
        Wontfix

                                    { text: " (", size: @style[:period][:size] },
                                    { text: "#{account.external_domain} - #{@service.name}", **@style[:domain] },
                                    { text: ")", size: @style[:period][:size] },
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#three_scale_logo calls '@pdf.bounds.absolute_left' 2 times
        Wontfix

                @pdf.bounds.absolute_left,
                @pdf.bounds.absolute_top - image.scaled_height,
                @pdf.bounds.absolute_left + image.scaled_width,
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#header_text calls '1.day.ago' 2 times
        Open

                [{ text: 1.day.ago.to_date.to_s }.merge!(format)]
              else
                [
                  { text: 1.week.ago.to_date.to_s }.merge!(format),
                  { text: " - " },
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#header_text calls '1.day.ago.to_date.to_s' 2 times
        Wontfix

                [{ text: 1.day.ago.to_date.to_s }.merge!(format)]
              else
                [
                  { text: 1.week.ago.to_date.to_s }.merge!(format),
                  { text: " - " },
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#header calls '@pdf.margin_box' 2 times
        Wontfix

                                       at: [@pdf.margin_box.left, @pdf.margin_box.top + header_height],
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#traffic_graph_style_text calls '@style[:font]' 2 times
        Open

                  font-family: "#{@style[:font]}", sans-serif; font-weight: normal;
                }
                .mainTitle {
                  fill:#505050;
                  font-family: "#{@style[:font]}", sans-serif; font-weight: normal;
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#header calls '@style[:period]' 3 times
        Wontfix

                                    { text: print_period.to_s, **@style[:period] },
                                    { text: " (", size: @style[:period][:size] },
                                    { text: "#{account.external_domain} - #{@service.name}", **@style[:domain] },
                                    { text: ")", size: @style[:period][:size] },
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#header_text calls '1.day.ago.to_date' 2 times
        Open

                [{ text: 1.day.ago.to_date.to_s }.merge!(format)]
              else
                [
                  { text: 1.week.ago.to_date.to_s }.merge!(format),
                  { text: " - " },
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

        Reek implements a check for Duplicate Method Call.

        Example

        Here's a very much simplified and contrived example. The following method will report a warning:

        def double_thing()
          @other.thing + @other.thing
        end

        One quick approach to silence Reek would be to refactor the code thus:

        def double_thing()
          thing = @other.thing
          thing + thing
        end

        A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

        class Other
          def double_thing()
            thing + thing
          end
        end

        The approach you take will depend on balancing other factors in your code.

        Pdf::Report#traffic_graph_style_guide_lines doesn't depend on instance state (maybe move it to another class?)
        Open

            def traffic_graph_style_guide_lines(css)
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        Pdf::Report has missing safe method 'send_notification!'
        Open

            def send_notification!
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A candidate method for the Missing Safe Method smell are methods whose names end with an exclamation mark.

        An exclamation mark in method names means (the explanation below is taken from here ):

        The ! in method names that end with ! means, “This method is dangerous”—or, more precisely, this method is the “dangerous” version of an otherwise equivalent method, with the same name minus the !. “Danger” is relative; the ! doesn’t mean anything at all unless the method name it’s in corresponds to a similar but bang-less method name. So, for example, gsub! is the dangerous version of gsub. exit! is the dangerous version of exit. flatten! is the dangerous version of flatten. And so forth.

        Such a method is called Missing Safe Method if and only if her non-bang version does not exist and this method is reported as a smell.

        Example

        Given

        class C
          def foo; end
          def foo!; end
          def bar!; end
        end

        Reek would report bar! as Missing Safe Method smell but not foo!.

        Reek reports this smell only in a class context, not in a module context in order to allow perfectly legit code like this:

        class Parent
          def foo; end
        end
        
        module Dangerous
          def foo!; end
        end
        
        class Son < Parent
          include Dangerous
        end
        
        class Daughter < Parent
        end

        In this example, Reek would not report the Missing Safe Method smell for the method foo of the Dangerous module.

        Pdf::Report#traffic_graph_first_data_point doesn't depend on instance state (maybe move it to another class?)
        Open

            def traffic_graph_first_data_point(xml)
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        Pdf::Report#traffic_graph_style_background doesn't depend on instance state (maybe move it to another class?)
        Open

            def traffic_graph_style_background(css)
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        Pdf::Report#service is a writable attribute
        Open

            attr_accessor :account, :period, :pdf, :service, :report
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A class that publishes a setter for an instance variable invites client classes to become too intimate with its inner workings, and in particular with its representation of state.

        The same holds to a lesser extent for getters, but Reek doesn't flag those.

        Example

        Given:

        class Klass
          attr_accessor :dummy
        end

        Reek would emit the following warning:

        reek test.rb
        
        test.rb -- 1 warning:
          [2]:Klass declares the writable attribute dummy (Attribute)

        Pdf::Report#traffic_graph_y_align doesn't depend on instance state (maybe move it to another class?)
        Open

            def traffic_graph_y_align(xml)
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        Pdf::Report#report is a writable attribute
        Open

            attr_accessor :account, :period, :pdf, :service, :report
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A class that publishes a setter for an instance variable invites client classes to become too intimate with its inner workings, and in particular with its representation of state.

        The same holds to a lesser extent for getters, but Reek doesn't flag those.

        Example

        Given:

        class Klass
          attr_accessor :dummy
        end

        Reek would emit the following warning:

        reek test.rb
        
        test.rb -- 1 warning:
          [2]:Klass declares the writable attribute dummy (Attribute)

        Pdf::Report#account is a writable attribute
        Open

            attr_accessor :account, :period, :pdf, :service, :report
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A class that publishes a setter for an instance variable invites client classes to become too intimate with its inner workings, and in particular with its representation of state.

        The same holds to a lesser extent for getters, but Reek doesn't flag those.

        Example

        Given:

        class Klass
          attr_accessor :dummy
        end

        Reek would emit the following warning:

        reek test.rb
        
        test.rb -- 1 warning:
          [2]:Klass declares the writable attribute dummy (Attribute)

        Pdf::Report#pdf is a writable attribute
        Open

            attr_accessor :account, :period, :pdf, :service, :report
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A class that publishes a setter for an instance variable invites client classes to become too intimate with its inner workings, and in particular with its representation of state.

        The same holds to a lesser extent for getters, but Reek doesn't flag those.

        Example

        Given:

        class Klass
          attr_accessor :dummy
        end

        Reek would emit the following warning:

        reek test.rb
        
        test.rb -- 1 warning:
          [2]:Klass declares the writable attribute dummy (Attribute)

        Pdf::Report#traffic_graph_style_clean_up doesn't depend on instance state (maybe move it to another class?)
        Open

            def traffic_graph_style_clean_up(css)
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        Pdf::Report#traffic_graph_style_line_width doesn't depend on instance state (maybe move it to another class?)
        Open

            def traffic_graph_style_line_width(css)
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        Pdf::Report#period is a writable attribute
        Open

            attr_accessor :account, :period, :pdf, :service, :report
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A class that publishes a setter for an instance variable invites client classes to become too intimate with its inner workings, and in particular with its representation of state.

        The same holds to a lesser extent for getters, but Reek doesn't flag those.

        Example

        Given:

        class Klass
          attr_accessor :dummy
        end

        Reek would emit the following warning:

        reek test.rb
        
        test.rb -- 1 warning:
          [2]:Klass declares the writable attribute dummy (Attribute)

        Pdf::Report#traffic_graph_style_axes doesn't depend on instance state (maybe move it to another class?)
        Open

            def traffic_graph_style_axes(css)
        Severity: Minor
        Found in app/lib/pdf/report.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        There are no issues that match your filters.

        Category
        Status