fyntech/fyntech

View on GitHub
_plugins/meetupFetcher.rb

Summary

Maintainability
A
50 mins
Test Coverage

Assignment Branch Condition size for generateEventDocument is too high. [33.3/15]
Open

    def generateEventDocument(event)
        doc = Jekyll::Document.new('', :site => @site, :collection => @collection)
        doc.data['title'] = event['name']
        doc.data['dateStart'] = convertDate(event['time'],event['utc_offset'])
        if event['duration']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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. [17/10]
Open

    def getMeetUpGroupEvents(group)
        maxRetryTimeout = 50
        initialRetries = 5
        begin
            retries ||= initialRetries
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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.

Method has too many lines. [15/10]
Open

    def generate(site)
        @site = site
        @collection = @site.collections["events"]

        MeetupClient.configure do |config|
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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.

Method has too many lines. [14/10]
Open

    def generateEventDocument(event)
        doc = Jekyll::Document.new('', :site => @site, :collection => @collection)
        doc.data['title'] = event['name']
        doc.data['dateStart'] = convertDate(event['time'],event['utc_offset'])
        if event['duration']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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.

Complex method MeetupFetcher::Generator#generateEventDocument (41.0)
Open

    def generateEventDocument(event)
        doc = Jekyll::Document.new('', :site => @site, :collection => @collection)
        doc.data['title'] = event['name']
        doc.data['dateStart'] = convertDate(event['time'],event['utc_offset'])
        if event['duration']
Severity: Minor
Found in _plugins/meetupFetcher.rb by flog

Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

You can read more about ABC metrics or the flog tool

Assignment Branch Condition size for generate is too high. [18.81/15]
Open

    def generate(site)
        @site = site
        @collection = @site.collections["events"]

        MeetupClient.configure do |config|
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Complex method MeetupFetcher::Generator#generate (26.4)
Open

    def generate(site)
        @site = site
        @collection = @site.collections["events"]

        MeetupClient.configure do |config|
Severity: Minor
Found in _plugins/meetupFetcher.rb by flog

Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

You can read more about ABC metrics or the flog tool

MeetupFetcher::Generator#getMeetUpGroupEvents has approx 12 statements
Open

    def getMeetUpGroupEvents(group)
Severity: Minor
Found in _plugins/meetupFetcher.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.)

MeetupFetcher::Generator#generateEventDocument refers to 'event' more than self (maybe move it to another class?)
Open

        doc.data['title'] = event['name']
        doc.data['dateStart'] = convertDate(event['time'],event['utc_offset'])
        if event['duration']
            doc.data['dateEnd'] = convertDate(event['time']+event['duration'],event['utc_offset'])
        end
Severity: Minor
Found in _plugins/meetupFetcher.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.

MeetupFetcher::Generator#generate has approx 12 statements
Open

    def generate(site)
Severity: Minor
Found in _plugins/meetupFetcher.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.)

MeetupFetcher::Generator#generateEventDocument has approx 10 statements
Open

    def generateEventDocument(event)
Severity: Minor
Found in _plugins/meetupFetcher.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.)

MeetupFetcher::Generator#generate contains iterators nested 2 deep
Open

            events['results'].each do |event|
Severity: Minor
Found in _plugins/meetupFetcher.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)

MeetupFetcher::Generator assumes too much for instance variable '@site'
Open

 class Generator < Jekyll::Generator
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

Classes should not assume that instance variables are set or present outside of the current class definition.

Good:

class Foo
  def initialize
    @bar = :foo
  end

  def foo?
    @bar == :foo
  end
end

Good as well:

class Foo
  def foo?
    bar == :foo
  end

  def bar
    @bar ||= :foo
  end
end

Bad:

class Foo
  def go_foo!
    @bar = :foo
  end

  def foo?
    @bar == :foo
  end
end

Example

Running Reek on:

class Dummy
  def test
    @ivar
  end
end

would report:

[1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

Note that this example would trigger this smell warning as well:

class Parent
  def initialize(omg)
    @omg = omg
  end
end

class Child < Parent
  def foo
    @omg
  end
end

The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

class Parent
  attr_reader :omg

  def initialize(omg)
    @omg = omg
  end
end

class Child < Parent
  def foo
    omg
  end
end

Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

If you don't want to expose those methods as public API just make them private like this:

class Parent
  def initialize(omg)
    @omg = omg
  end

  private
  attr_reader :omg
end

class Child < Parent
  def foo
    omg
  end
end

Current Support in Reek

An instance variable must:

  • be set in the constructor
  • or be accessed through a method with lazy initialization / memoization.

If not, Instance Variable Assumption will be reported.

MeetupFetcher::Generator declares the class variable '@@meetup_groups'
Open

        @@meetup_groups.each do |organizer|
            events = getMeetUpGroupEvents(organizer)
            next if !events.has_key?('results')
                
            events['results'].each do |event|
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

Class variables form part of the global runtime state, and as such make it easy for one part of the system to accidentally or inadvertently depend on another part of the system. So the system becomes more prone to problems where changing something over here breaks something over there. In particular, class variables can make it hard to set up tests (because the context of the test includes all global state).

For a detailed explanation, check out this article

Example

Given

class Dummy
  @@class_variable = :whatever
end

Reek would emit the following warning:

reek test.rb

test.rb -- 1 warning:
  [2]:Dummy declares the class variable @@class_variable (ClassVariable)

Getting rid of the smell

You can use class-instance variable to mitigate the problem (as also suggested in the linked article above):

class Dummy
  @class_variable = :whatever
end

MeetupFetcher::Generator assumes too much for instance variable '@meetup_api'
Open

 class Generator < Jekyll::Generator
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

Classes should not assume that instance variables are set or present outside of the current class definition.

Good:

class Foo
  def initialize
    @bar = :foo
  end

  def foo?
    @bar == :foo
  end
end

Good as well:

class Foo
  def foo?
    bar == :foo
  end

  def bar
    @bar ||= :foo
  end
end

Bad:

class Foo
  def go_foo!
    @bar = :foo
  end

  def foo?
    @bar == :foo
  end
end

Example

Running Reek on:

class Dummy
  def test
    @ivar
  end
end

would report:

[1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

Note that this example would trigger this smell warning as well:

class Parent
  def initialize(omg)
    @omg = omg
  end
end

class Child < Parent
  def foo
    @omg
  end
end

The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

class Parent
  attr_reader :omg

  def initialize(omg)
    @omg = omg
  end
end

class Child < Parent
  def foo
    omg
  end
end

Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

If you don't want to expose those methods as public API just make them private like this:

class Parent
  def initialize(omg)
    @omg = omg
  end

  private
  attr_reader :omg
end

class Child < Parent
  def foo
    omg
  end
end

Current Support in Reek

An instance variable must:

  • be set in the constructor
  • or be accessed through a method with lazy initialization / memoization.

If not, Instance Variable Assumption will be reported.

MeetupFetcher::Generator assumes too much for instance variable '@collection'
Open

 class Generator < Jekyll::Generator
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

Classes should not assume that instance variables are set or present outside of the current class definition.

Good:

class Foo
  def initialize
    @bar = :foo
  end

  def foo?
    @bar == :foo
  end
end

Good as well:

class Foo
  def foo?
    bar == :foo
  end

  def bar
    @bar ||= :foo
  end
end

Bad:

class Foo
  def go_foo!
    @bar = :foo
  end

  def foo?
    @bar == :foo
  end
end

Example

Running Reek on:

class Dummy
  def test
    @ivar
  end
end

would report:

[1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

Note that this example would trigger this smell warning as well:

class Parent
  def initialize(omg)
    @omg = omg
  end
end

class Child < Parent
  def foo
    @omg
  end
end

The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

class Parent
  attr_reader :omg

  def initialize(omg)
    @omg = omg
  end
end

class Child < Parent
  def foo
    omg
  end
end

Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

If you don't want to expose those methods as public API just make them private like this:

class Parent
  def initialize(omg)
    @omg = omg
  end

  private
  attr_reader :omg
end

class Child < Parent
  def foo
    omg
  end
end

Current Support in Reek

An instance variable must:

  • be set in the constructor
  • or be accessed through a method with lazy initialization / memoization.

If not, Instance Variable Assumption will be reported.

MeetupFetcher::Generator has no descriptive comment
Open

 class Generator < Jekyll::Generator
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

Classes and modules are the units of reuse and release. It is therefore considered good practice to annotate every class and module with a brief comment outlining its responsibilities.

Example

Given

class Dummy
  # Do things...
end

Reek would emit the following warning:

test.rb -- 1 warning:
  [1]:Dummy has no descriptive comment (IrresponsibleModule)

Fixing this is simple - just an explaining comment:

# The Dummy class is responsible for ...
class Dummy
  # Do things...
end

MeetupFetcher::Generator declares the class variable '@@timezone'
Open

        convertedDate = "#{DateTime.strptime(dateWithOffset.to_s,'%Q').strftime('%Y-%m-%d %H:%M:%S')} #{@@timezone}"
        return convertedDate
    end

    def getMeetUpGroupEvents(group)
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

Class variables form part of the global runtime state, and as such make it easy for one part of the system to accidentally or inadvertently depend on another part of the system. So the system becomes more prone to problems where changing something over here breaks something over there. In particular, class variables can make it hard to set up tests (because the context of the test includes all global state).

For a detailed explanation, check out this article

Example

Given

class Dummy
  @@class_variable = :whatever
end

Reek would emit the following warning:

reek test.rb

test.rb -- 1 warning:
  [2]:Dummy declares the class variable @@class_variable (ClassVariable)

Getting rid of the smell

You can use class-instance variable to mitigate the problem (as also suggested in the linked article above):

class Dummy
  @class_variable = :whatever
end

MeetupFetcher::Generator#generateEventDocument calls 'doc.data' 8 times
Open

        doc.data['title'] = event['name']
        doc.data['dateStart'] = convertDate(event['time'],event['utc_offset'])
        if event['duration']
            doc.data['dateEnd'] = convertDate(event['time']+event['duration'],event['utc_offset'])
        end
Severity: Minor
Found in _plugins/meetupFetcher.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.

MeetupFetcher::Generator#generateEventDocument calls 'event['group']['name']' 2 times
Open

        doc.data['organizer'] = event['group']['name']
        doc.data['category'] = event['group']['name'].downcase.gsub(/\s+|[():]/, "")
Severity: Minor
Found in _plugins/meetupFetcher.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.

MeetupFetcher::Generator#generateEventDocument calls 'event['utc_offset']' 2 times
Open

        doc.data['dateStart'] = convertDate(event['time'],event['utc_offset'])
        if event['duration']
            doc.data['dateEnd'] = convertDate(event['time']+event['duration'],event['utc_offset'])
Severity: Minor
Found in _plugins/meetupFetcher.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.

MeetupFetcher::Generator#generateEventDocument calls 'event['duration']' 2 times
Open

        if event['duration']
            doc.data['dateEnd'] = convertDate(event['time']+event['duration'],event['utc_offset'])
Severity: Minor
Found in _plugins/meetupFetcher.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.

MeetupFetcher::Generator#getMeetUpGroupEvents calls 'Jekyll.logger' 2 times
Open

                Jekyll.logger.warn("Warning:", "The MeetupApi failed for \"#{group}\" retrying #{retries} times before giving up… Sleeping for #{sleepTimeout} seconds")
                sleep(sleepTimeout)
                retries -= 1
                retry
            else
Severity: Minor
Found in _plugins/meetupFetcher.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.

MeetupFetcher::Generator#generateEventDocument calls 'event['group']' 2 times
Open

        doc.data['organizer'] = event['group']['name']
        doc.data['category'] = event['group']['name'].downcase.gsub(/\s+|[():]/, "")
Severity: Minor
Found in _plugins/meetupFetcher.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.

MeetupFetcher::Generator#generateEventDocument calls 'event['time']' 2 times
Open

        doc.data['dateStart'] = convertDate(event['time'],event['utc_offset'])
        if event['duration']
            doc.data['dateEnd'] = convertDate(event['time']+event['duration'],event['utc_offset'])
Severity: Minor
Found in _plugins/meetupFetcher.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.

MeetupFetcher::Generator#generateEventDocument calls 'event['venue']' 3 times
Open

        if event['venue']
            doc.data['location'] = "#{event['venue']['name']}<br>#{event['venue']['address_1']}"
Severity: Minor
Found in _plugins/meetupFetcher.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.

Method getMeetUpGroupEvents has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
Open

    def getMeetUpGroupEvents(group)
        maxRetryTimeout = 50
        initialRetries = 5
        begin
            retries ||= initialRetries
Severity: Minor
Found in _plugins/meetupFetcher.rb - About 25 mins 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

MeetupFetcher::Generator#convertDate doesn't depend on instance state (maybe move it to another class?)
Open

    def convertDate(date, offset)
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

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

Method generate has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
Open

    def generate(site)
        @site = site
        @collection = @site.collections["events"]

        MeetupClient.configure do |config|
Severity: Minor
Found in _plugins/meetupFetcher.rb - About 25 mins 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

Complex method MeetupFetcher::Generator#getMeetUpGroupEvents (20.0)
Open

    def getMeetUpGroupEvents(group)
        maxRetryTimeout = 50
        initialRetries = 5
        begin
            retries ||= initialRetries
Severity: Minor
Found in _plugins/meetupFetcher.rb by flog

Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

You can read more about ABC metrics or the flog tool

MeetupFetcher::Generator#generateEventDocument has the name 'generateEventDocument'
Open

    def generateEventDocument(event)
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

An Uncommunicative Method Name is a method name that doesn't communicate its intent well enough.

Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

MeetupFetcher::Generator#getMeetUpGroupEvents has the variable name 'maxRetryTimeout'
Open

        maxRetryTimeout = 50
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

MeetupFetcher::Generator#getMeetUpGroupEvents has the variable name 'initialRetries'
Open

        initialRetries = 5
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

MeetupFetcher::Generator#getMeetUpGroupEvents has the variable name 'e'
Open

        rescue Exception => e
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

MeetupFetcher::Generator#convertDate has the variable name 'convertedDate'
Open

        convertedDate = "#{DateTime.strptime(dateWithOffset.to_s,'%Q').strftime('%Y-%m-%d %H:%M:%S')} #{@@timezone}"
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

MeetupFetcher::Generator#generate has the variable name 'keyPath'
Open

          keyPath = "#{@site.source}/meetup_api_key"
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

MeetupFetcher::Generator#getMeetUpGroupEvents has the variable name 'sleepTimeout'
Open

                sleepTimeout = maxRetryTimeout - (maxRetryTimeout / initialRetries * retries)
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

MeetupFetcher::Generator#convertDate has the variable name 'dateWithOffset'
Open

        dateWithOffset = date + offset
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

MeetupFetcher::Generator#convertDate has the name 'convertDate'
Open

    def convertDate(date, offset)
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

An Uncommunicative Method Name is a method name that doesn't communicate its intent well enough.

Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

MeetupFetcher::Generator#getMeetUpGroupEvents has the name 'getMeetUpGroupEvents'
Open

    def getMeetUpGroupEvents(group)
Severity: Minor
Found in _plugins/meetupFetcher.rb by reek

An Uncommunicative Method Name is a method name that doesn't communicate its intent well enough.

Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

Use 2 (not 1) spaces for indentation.
Open

        maxRetryTimeout = 50
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Use 2 (not 1) spaces for indentation.
Open

                doc = generateEventDocument(event)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Tab detected.
Open

            if retries > 0
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

                
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Use 2 (not 1) spaces for indentation.
Open

        doc = Jekyll::Document.new('', :site => @site, :collection => @collection)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Space missing after comma.
Open

        convertedDate = "#{DateTime.strptime(dateWithOffset.to_s,'%Q').strftime('%Y-%m-%d %H:%M:%S')} #{@@timezone}"
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Checks for comma (,) not followed by some kind of space.

Example:

# bad
[1,2]
{ foo:bar,}

# good
[1, 2]
{ foo:bar, }

Space missing after comma.
Open

            doc.data['dateEnd'] = convertDate(event['time']+event['duration'],event['utc_offset'])
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Checks for comma (,) not followed by some kind of space.

Example:

# bad
[1,2]
{ foo:bar,}

# good
[1, 2]
{ foo:bar, }

Tab detected.
Open

        dateWithOffset = date + offset
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        convertedDate = "#{DateTime.strptime(dateWithOffset.to_s,'%Q').strftime('%Y-%m-%d %H:%M:%S')} #{@@timezone}"
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

            doc.data['location'] = "#{event['venue']['name']}<br>#{event['venue']['address_1']}"
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

    def generate(site)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Use 2 (not 1) spaces for indentation.
Open

            doc.data['dateEnd'] = convertDate(event['time']+event['duration'],event['utc_offset'])
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Tab detected.
Open

        initialRetries = 5
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Use 2 (not 1) spaces for indentation.
Open

                sleepTimeout = maxRetryTimeout - (maxRetryTimeout / initialRetries * retries)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Use 2 (not 1) spaces for indentation.
Open

            doc.data['location'] = "#{event['venue']['name']}<br>#{event['venue']['address_1']}"
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Use 2 (not 1) spaces for indentation.
Open

        @site = site
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Tab detected.
Open

                sleepTimeout = maxRetryTimeout - (maxRetryTimeout / initialRetries * retries)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

            doc.data['dateEnd'] = convertDate(event['time']+event['duration'],event['utc_offset'])
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        return doc
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

                doc = generateEventDocument(event)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

            end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Use 2 (not 1) spaces for indentation.
Open

            events = getMeetUpGroupEvents(organizer)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Tab detected.
Open

        return convertedDate
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        if event['duration']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

    end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

            events['results'].each do |event|
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

    def getMeetUpGroupEvents(group)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

    def generateEventDocument(event)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        doc.data['category'] = event['group']['name'].downcase.gsub(/\s+|[():]/, "")
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        @site = site
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Surrounding space missing for operator +.
Open

            doc.data['dateEnd'] = convertDate(event['time']+event['duration'],event['utc_offset'])
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Checks that operators have space around them, except for ** which should not have surrounding space.

Example:

# bad
total = 3*4
"apple"+"juice"
my_number = 38/4
a ** b

# good
total = 3 * 4
"apple" + "juice"
my_number = 38 / 4
a**b

Tab detected.
Open

            retries ||= initialRetries
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        @meetup_api = MeetupApi.new
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

            return @meetup_api.events({ group_urlname: group })
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        rescue Exception => e
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

                Jekyll.logger.error("Error:", "No more retries left, we're going down 💥")
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        doc.data['dateStart'] = convertDate(event['time'],event['utc_offset'])
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

                sleep(sleepTimeout)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

                retry
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        if event['venue']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

          config.api_key = ENV['MEETUP_API_KEY'] || File.file?(keyPath) && File.read(keyPath) || return
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Use 2 (not 1) spaces for indentation.
Open

        dateWithOffset = date + offset
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Tab detected.
Open

    def convertDate(date, offset)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

            end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        doc.data['organizer'] = event['group']['name']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

    end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Use 2 (not 0) spaces for indentation.
Open

    def convertDate(date, offset)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Tab detected.
Open

                Jekyll.logger.warn("Warning:", "The MeetupApi failed for \"#{group}\" retrying #{retries} times before giving up… Sleeping for #{sleepTimeout} seconds")
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Use 2 (not 1) spaces for indentation.
Open

            retries ||= initialRetries
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Space missing after comma.
Open

        doc.data['dateStart'] = convertDate(event['time'],event['utc_offset'])
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Checks for comma (,) not followed by some kind of space.

Example:

# bad
[1,2]
{ foo:bar,}

# good
[1, 2]
{ foo:bar, }

Tab detected.
Open

    end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        begin
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

            else
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

                raise
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

                @collection.docs << doc
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Use 2 (not 1) spaces for indentation.
Open

            if retries > 0
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Tab detected.
Open

        maxRetryTimeout = 50
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        doc.data['link'] = event['event_url']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        MeetupClient.configure do |config|
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

    @@timezone = Jekyll.configuration({})['timezone']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

                retries -= 1
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

    end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

            events = getMeetUpGroupEvents(organizer)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Final newline missing.
Open

end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Use 2 (not 1) spaces for indentation.
Open

 class Generator < Jekyll::Generator
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Tab detected.
Open

        doc = Jekyll::Document.new('', :site => @site, :collection => @collection)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        doc.data['title'] = event['name']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        @collection = @site.collections["events"]
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

          keyPath = "#{@site.source}/meetup_api_key"
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

        @@meetup_groups.each do |organizer|
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Use 2 (not 1) spaces for indentation.
Open

                Jekyll.logger.error("Error:", "No more retries left, we're going down 💥")
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

Tab detected.
Open

        doc.data['excerpt'] = event['description']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

            next if !events.has_key?('results')
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Tab detected.
Open

    @@meetup_groups = Jekyll.configuration({})['meetup_groups']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Useless assignment to variable - e.
Open

        rescue Exception => e
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks for every useless assignment to local variable in every scope. The basic idea for this cop was from the warning of ruby -cw:

assigned but unused variable - foo

Currently this cop has advanced logic that detects unreferenced reassignments and properly handles varied cases such as branch, loop, rescue, ensure, etc.

Example:

# bad

def some_method
  some_var = 1
  do_something
end

Example:

# good

def some_method
  some_var = 1
  do_something(some_var)
end

Favor unless over if for negative conditions.
Open

            next if !events.has_key?('results')
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

- both
- prefix
- postfix

Example: EnforcedStyle: both (default)

# enforces `unless` for `prefix` and `postfix` conditionals

# bad

if !foo
  bar
end

# good

unless foo
  bar
end

# bad

bar if !foo

# good

bar unless foo

Example: EnforcedStyle: prefix

# enforces `unless` for just `prefix` conditionals

# bad

if !foo
  bar
end

# good

unless foo
  bar
end

# good

bar if !foo

Example: EnforcedStyle: postfix

# enforces `unless` for just `postfix` conditionals

# bad

bar if !foo

# good

bar unless foo

# good

if !foo
  bar
end

Redundant return detected.
Open

        return convertedDate
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks for redundant return expressions.

Example:

def test
  return something
end

def test
  one
  two
  three
  return something
end

It should be extended to handle methods whose body is if/else or a case expression with a default branch.

Use snake_case for method names.
Open

    def getMeetUpGroupEvents(group)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop makes sure that all methods use the configured style, snake_case or camelCase, for their names.

Example: EnforcedStyle: snake_case (default)

# bad
def fooBar; end

# good
def foo_bar; end

Example: EnforcedStyle: camelCase

# bad
def foo_bar; end

# good
def fooBar; end

Use snake_case for variable names.
Open

        dateWithOffset = date + offset
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop makes sure that all variables use the configured style, snake_case or camelCase, for their names.

Example: EnforcedStyle: snake_case (default)

# bad
fooBar = 1

# good
foo_bar = 1

Example: EnforcedStyle: camelCase

# bad
foo_bar = 1

# good
fooBar = 1

Replace class var @@meetup_groups with a class instance var.
Open

    @@meetup_groups = Jekyll.configuration({})['meetup_groups']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks for uses of class variables. Offenses are signaled only on assignment to class variables to reduce the number of offenses that would be reported.

Use Hash#key? instead of Hash#has_key?.
Open

            next if !events.has_key?('results')
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop (by default) checks for uses of methods Hash#haskey? and Hash#hasvalue? where it enforces Hash#key? and Hash#value? It is configurable to enforce the inverse, using verbose method names also.

Example: EnforcedStyle: short (default)

# bad Hash#haskey? Hash#hasvalue?

# good Hash#key? Hash#value?

Example: EnforcedStyle: verbose

# bad Hash#key? Hash#value?

# good Hash#haskey? Hash#hasvalue?

The name of this source file (meetupFetcher.rb) should use snake_case.
Open

require 'meetup_client'
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop makes sure that Ruby source files have snake_case names. Ruby scripts (i.e. source files with a shebang in the first line) are ignored.

Example:

# bad
lib/layoutManager.rb

anything/usingCamelCase

# good
lib/layout_manager.rb

anything/using_snake_case.rake

Prefer Date or Time over DateTime.
Open

        convertedDate = "#{DateTime.strptime(dateWithOffset.to_s,'%Q').strftime('%Y-%m-%d %H:%M:%S')} #{@@timezone}"
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks for uses of DateTime that should be replaced by Date or Time.

Example:

# bad - uses `DateTime` for current time
DateTime.now

# good - uses `Time` for current time
Time.now

# bad - uses `DateTime` for modern date
DateTime.iso8601('2016-06-29')

# good - uses `Date` for modern date
Date.iso8601('2016-06-29')

# good - uses `DateTime` with start argument for historical date
DateTime.iso8601('1751-04-23', Date::ENGLAND)

Prefer single-quoted strings when you don't need string interpolation or special symbols.
Open

        @collection = @site.collections["events"]
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Checks if uses of quotes match the configured preference.

Example: EnforcedStyle: single_quotes (default)

# bad
"No special symbols"
"No string interpolation"
"Just text"

# good
'No special symbols'
'No string interpolation'
'Just text'
"Wait! What's #{this}!"

Example: EnforcedStyle: double_quotes

# bad
'Just some text'
'No special chars or interpolation'

# good
"Just some text"
"No special chars or interpolation"
"Every string in #{project} uses double_quotes"

Use snake_case for variable names.
Open

        maxRetryTimeout = 50
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop makes sure that all variables use the configured style, snake_case or camelCase, for their names.

Example: EnforcedStyle: snake_case (default)

# bad
fooBar = 1

# good
foo_bar = 1

Example: EnforcedStyle: camelCase

# bad
foo_bar = 1

# good
fooBar = 1

Use snake_case for method names.
Open

    def convertDate(date, offset)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop makes sure that all methods use the configured style, snake_case or camelCase, for their names.

Example: EnforcedStyle: snake_case (default)

# bad
def fooBar; end

# good
def foo_bar; end

Example: EnforcedStyle: camelCase

# bad
def foo_bar; end

# good
def fooBar; end

Missing magic comment # frozen_string_literal: true.
Open

require 'meetup_client'
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop is designed to help upgrade to Ruby 3.0. It will add the comment # frozen_string_literal: true to the top of files to enable frozen string literals. Frozen string literals may be default in Ruby 3.0. The comment will be added below a shebang and encoding comment. The frozen string literal comment is only valid in Ruby 2.3+.

Example: EnforcedStyle: when_needed (default)

# The `when_needed` style will add the frozen string literal comment
# to files only when the `TargetRubyVersion` is set to 2.3+.
# bad
module Foo
  # ...
end

# good
# frozen_string_literal: true

module Foo
  # ...
end

Example: EnforcedStyle: always

# The `always` style will always add the frozen string literal comment
# to a file, regardless of the Ruby version or if `freeze` or `<<` are
# called on a string literal.
# bad
module Bar
  # ...
end

# good
# frozen_string_literal: true

module Bar
  # ...
end

Example: EnforcedStyle: never

# The `never` will enforce that the frozen string literal comment does
# not exist in a file.
# bad
# frozen_string_literal: true

module Baz
  # ...
end

# good
module Baz
  # ...
end

Non-local exit from iterator, without return value. next, break, Array#find, Array#any?, etc. is preferred.
Open

          config.api_key = ENV['MEETUP_API_KEY'] || File.file?(keyPath) && File.read(keyPath) || return
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks for non-local exits from iterators without a return value. It registers an offense under these conditions:

  • No value is returned,
  • the block is preceded by a method chain,
  • the block has arguments,
  • the method which receives the block is not define_method or define_singleton_method,
  • the return is not contained in an inner scope, e.g. a lambda or a method definition.

Example:

class ItemApi
  rescue_from ValidationError do |e| # non-iteration block with arg
    return { message: 'validation error' } unless e.errors # allowed
    error_array = e.errors.map do |error| # block with method chain
      return if error.suppress? # warned
      return "#{error.param}: invalid" unless error.message # allowed
      "#{error.param}: #{error.message}"
    end
    { message: 'validation error', errors: error_array }
  end

  def update_items
    transaction do # block without arguments
      return unless update_necessary? # allowed
      find_each do |item| # block without method chain
        return if item.stock == 0 # false-negative...
        item.update!(foobar: true)
      end
    end
  end
end

Prefer single-quoted strings when you don't need string interpolation or special symbols.
Open

                Jekyll.logger.error("Error:", "No more retries left, we're going down 💥")
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Checks if uses of quotes match the configured preference.

Example: EnforcedStyle: single_quotes (default)

# bad
"No special symbols"
"No string interpolation"
"Just text"

# good
'No special symbols'
'No string interpolation'
'Just text'
"Wait! What's #{this}!"

Example: EnforcedStyle: double_quotes

# bad
'Just some text'
'No special chars or interpolation'

# good
"Just some text"
"No special chars or interpolation"
"Every string in #{project} uses double_quotes"

Use snake_case for variable names.
Open

        convertedDate = "#{DateTime.strptime(dateWithOffset.to_s,'%Q').strftime('%Y-%m-%d %H:%M:%S')} #{@@timezone}"
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop makes sure that all variables use the configured style, snake_case or camelCase, for their names.

Example: EnforcedStyle: snake_case (default)

# bad
fooBar = 1

# good
foo_bar = 1

Example: EnforcedStyle: camelCase

# bad
foo_bar = 1

# good
fooBar = 1

Use snake_case for variable names.
Open

          keyPath = "#{@site.source}/meetup_api_key"
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop makes sure that all variables use the configured style, snake_case or camelCase, for their names.

Example: EnforcedStyle: snake_case (default)

# bad
fooBar = 1

# good
foo_bar = 1

Example: EnforcedStyle: camelCase

# bad
foo_bar = 1

# good
fooBar = 1

end at 71, 2 is not aligned with class at 4, 1.
Open

  end
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks whether the end keywords are aligned properly.

Three modes are supported through the EnforcedStyleAlignWith configuration parameter:

If it's set to keyword (which is the default), the end shall be aligned with the start of the keyword (if, class, etc.).

If it's set to variable the end shall be aligned with the left-hand-side of the variable assignment, if there is one.

If it's set to start_of_line, the end shall be aligned with the start of the line where the matching keyword appears.

Example: EnforcedStyleAlignWith: keyword (default)

# bad

variable = if true
    end

# good

variable = if true
           end

Example: EnforcedStyleAlignWith: variable

# bad

variable = if true
    end

# good

variable = if true
end

Example: EnforcedStyleAlignWith: startofline

# bad

variable = if true
    end

# good

puts(if true
end)

Use snake_case for method names.
Open

    def generateEventDocument(event)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop makes sure that all methods use the configured style, snake_case or camelCase, for their names.

Example: EnforcedStyle: snake_case (default)

# bad
def fooBar; end

# good
def foo_bar; end

Example: EnforcedStyle: camelCase

# bad
def foo_bar; end

# good
def fooBar; end

Prefer single-quoted strings when you don't need string interpolation or special symbols.
Open

        doc.data['category'] = event['group']['name'].downcase.gsub(/\s+|[():]/, "")
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Checks if uses of quotes match the configured preference.

Example: EnforcedStyle: single_quotes (default)

# bad
"No special symbols"
"No string interpolation"
"Just text"

# good
'No special symbols'
'No string interpolation'
'Just text'
"Wait! What's #{this}!"

Example: EnforcedStyle: double_quotes

# bad
'Just some text'
'No special chars or interpolation'

# good
"Just some text"
"No special chars or interpolation"
"Every string in #{project} uses double_quotes"

Avoid rescuing the Exception class. Perhaps you meant to rescue StandardError?
Open

        rescue Exception => e
            if retries > 0
                sleepTimeout = maxRetryTimeout - (maxRetryTimeout / initialRetries * retries)
                Jekyll.logger.warn("Warning:", "The MeetupApi failed for \"#{group}\" retrying #{retries} times before giving up… Sleeping for #{sleepTimeout} seconds")
                sleep(sleepTimeout)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks for rescue blocks targeting the Exception class.

Example:

# bad

begin
  do_something
rescue Exception
  handle_exception
end

Example:

# good

begin
  do_something
rescue ArgumentError
  handle_exception
end

Use snake_case for variable names.
Open

                sleepTimeout = maxRetryTimeout - (maxRetryTimeout / initialRetries * retries)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop makes sure that all variables use the configured style, snake_case or camelCase, for their names.

Example: EnforcedStyle: snake_case (default)

# bad
fooBar = 1

# good
foo_bar = 1

Example: EnforcedStyle: camelCase

# bad
foo_bar = 1

# good
fooBar = 1

Missing top-level class documentation comment.
Open

 class Generator < Jekyll::Generator
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks for missing top-level documentation of classes and modules. Classes with no body are exempt from the check and so are namespace modules - modules that have nothing in their bodies except classes, other modules, or constant definitions.

The documentation requirement is annulled if the class or module has a "#:nodoc:" comment next to it. Likewise, "#:nodoc: all" does the same for all its children.

Example:

# bad
class Person
  # ...
end

# good
# Description/Explanation of Person class
class Person
  # ...
end

Redundant return detected.
Open

        return doc
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks for redundant return expressions.

Example:

def test
  return something
end

def test
  one
  two
  three
  return something
end

It should be extended to handle methods whose body is if/else or a case expression with a default branch.

Use the new Ruby 1.9 hash syntax.
Open

        doc = Jekyll::Document.new('', :site => @site, :collection => @collection)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks hash literal syntax.

It can enforce either the use of the class hash rocket syntax or the use of the newer Ruby 1.9 syntax (when applicable).

A separate offense is registered for each problematic pair.

The supported styles are:

  • ruby19 - forces use of the 1.9 syntax (e.g. {a: 1}) when hashes have all symbols for keys
  • hash_rockets - forces use of hash rockets for all hashes
  • nomixedkeys - simply checks for hashes with mixed syntaxes
  • ruby19nomixed_keys - forces use of ruby 1.9 syntax and forbids mixed syntax hashes

Example: EnforcedStyle: ruby19 (default)

# bad
{:a => 2}
{b: 1, :c => 2}

# good
{a: 2, b: 1}
{:c => 2, 'd' => 2} # acceptable since 'd' isn't a symbol
{d: 1, 'e' => 2} # technically not forbidden

Example: EnforcedStyle: hash_rockets

# bad
{a: 1, b: 2}
{c: 1, 'd' => 5}

# good
{:a => 1, :b => 2}

Example: EnforcedStyle: nomixedkeys

# bad
{:a => 1, b: 2}
{c: 1, 'd' => 2}

# good
{:a => 1, :b => 2}
{c: 1, d: 2}

Example: EnforcedStyle: ruby19nomixed_keys

# bad
{:a => 1, :b => 2}
{c: 2, 'd' => 3} # should just use hash rockets

# good
{a: 1, b: 2}
{:c => 3, 'd' => 4}

Replace class var @@timezone with a class instance var.
Open

    @@timezone = Jekyll.configuration({})['timezone']
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks for uses of class variables. Offenses are signaled only on assignment to class variables to reduce the number of offenses that would be reported.

Trailing whitespace detected.
Open

                
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Use snake_case for variable names.
Open

        initialRetries = 5
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop makes sure that all variables use the configured style, snake_case or camelCase, for their names.

Example: EnforcedStyle: snake_case (default)

# bad
fooBar = 1

# good
foo_bar = 1

Example: EnforcedStyle: camelCase

# bad
foo_bar = 1

# good
fooBar = 1

Redundant curly braces around a hash parameter.
Open

            return @meetup_api.events({ group_urlname: group })
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks for braces around the last parameter in a method call if the last parameter is a hash. It supports braces, no_braces and context_dependent styles.

Example: EnforcedStyle: braces

# The `braces` style enforces braces around all method
# parameters that are hashes.

# bad
some_method(x, y, a: 1, b: 2)

# good
some_method(x, y, {a: 1, b: 2})

Example: EnforcedStyle: no_braces (default)

# The `no_braces` style checks that the last parameter doesn't
# have braces around it.

# bad
some_method(x, y, {a: 1, b: 2})

# good
some_method(x, y, a: 1, b: 2)

Example: EnforcedStyle: context_dependent

# The `context_dependent` style checks that the last parameter
# doesn't have braces around it, but requires braces if the
# second to last parameter is also a hash literal.

# bad
some_method(x, y, {a: 1, b: 2})
some_method(x, y, {a: 1, b: 2}, a: 1, b: 2)

# good
some_method(x, y, a: 1, b: 2)
some_method(x, y, {a: 1, b: 2}, {a: 1, b: 2})

Use the new Ruby 1.9 hash syntax.
Open

        doc = Jekyll::Document.new('', :site => @site, :collection => @collection)
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

This cop checks hash literal syntax.

It can enforce either the use of the class hash rocket syntax or the use of the newer Ruby 1.9 syntax (when applicable).

A separate offense is registered for each problematic pair.

The supported styles are:

  • ruby19 - forces use of the 1.9 syntax (e.g. {a: 1}) when hashes have all symbols for keys
  • hash_rockets - forces use of hash rockets for all hashes
  • nomixedkeys - simply checks for hashes with mixed syntaxes
  • ruby19nomixed_keys - forces use of ruby 1.9 syntax and forbids mixed syntax hashes

Example: EnforcedStyle: ruby19 (default)

# bad
{:a => 2}
{b: 1, :c => 2}

# good
{a: 2, b: 1}
{:c => 2, 'd' => 2} # acceptable since 'd' isn't a symbol
{d: 1, 'e' => 2} # technically not forbidden

Example: EnforcedStyle: hash_rockets

# bad
{a: 1, b: 2}
{c: 1, 'd' => 5}

# good
{:a => 1, :b => 2}

Example: EnforcedStyle: nomixedkeys

# bad
{:a => 1, b: 2}
{c: 1, 'd' => 2}

# good
{:a => 1, :b => 2}
{c: 1, d: 2}

Example: EnforcedStyle: ruby19nomixed_keys

# bad
{:a => 1, :b => 2}
{c: 2, 'd' => 3} # should just use hash rockets

# good
{a: 1, b: 2}
{:c => 3, 'd' => 4}

Use retries.positive? instead of retries > 0.
Open

            if retries > 0
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

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

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

The cop ignores comparisons to global variables, since they are often populated with objects which can be compared with integers, but are not themselves Interger polymorphic.

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

Prefer single-quoted strings when you don't need string interpolation or special symbols.
Open

                Jekyll.logger.warn("Warning:", "The MeetupApi failed for \"#{group}\" retrying #{retries} times before giving up… Sleeping for #{sleepTimeout} seconds")
Severity: Minor
Found in _plugins/meetupFetcher.rb by rubocop

Checks if uses of quotes match the configured preference.

Example: EnforcedStyle: single_quotes (default)

# bad
"No special symbols"
"No string interpolation"
"Just text"

# good
'No special symbols'
'No string interpolation'
'Just text'
"Wait! What's #{this}!"

Example: EnforcedStyle: double_quotes

# bad
'Just some text'
'No special chars or interpolation'

# good
"Just some text"
"No special chars or interpolation"
"Every string in #{project} uses double_quotes"

There are no issues that match your filters.

Category
Status