rubobot 0.63.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 102e7ba880145df220b257dfe5c2c46625ad28ec89b6095884c3277ec509685e
4
+ data.tar.gz: e487cbae1579463f3e9ab7c3af5f9e139ac5ab7e0dd300f7e7d2492a9a0818ac
5
+ SHA512:
6
+ metadata.gz: b385727eb0f625c1e58978395ceb4dbb95d8852445d7dbc8aa192c7eb31f9416073bbfa1d89bdcbdf44a12c3a526c9f7d2ecbc72b47249bd6959c683eb5cdcad
7
+ data.tar.gz: 14d59b4aebe2f05af1c5abec2f39805063788bda04a3274f192ee0a8c3c5e94fa76512b99b97873d2b1651c214eff62fd2b805cbdea8d0babf3c2b3d52008909
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format progress
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,6 @@
1
+ Layout/DotPosition:
2
+ EnforcedStyle: trailing
3
+
4
+ Metrics/BlockLength:
5
+ Exclude:
6
+ - 'spec/**/*'
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.6.2
7
+ before_install: gem install bundler -v 2.0.1
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in rubobot.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,53 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rubobot (0.63.1)
5
+ rubocop (= 0.63.1)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ ast (2.4.0)
11
+ diff-lcs (1.3)
12
+ jaro_winkler (1.5.4)
13
+ parallel (1.19.1)
14
+ parser (2.7.0.0)
15
+ ast (~> 2.4.0)
16
+ powerpack (0.1.2)
17
+ rainbow (3.0.0)
18
+ rake (10.5.0)
19
+ rspec (3.8.0)
20
+ rspec-core (~> 3.8.0)
21
+ rspec-expectations (~> 3.8.0)
22
+ rspec-mocks (~> 3.8.0)
23
+ rspec-core (3.8.2)
24
+ rspec-support (~> 3.8.0)
25
+ rspec-expectations (3.8.4)
26
+ diff-lcs (>= 1.2.0, < 2.0)
27
+ rspec-support (~> 3.8.0)
28
+ rspec-mocks (3.8.1)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.8.0)
31
+ rspec-support (3.8.2)
32
+ rubocop (0.63.1)
33
+ jaro_winkler (~> 1.5.1)
34
+ parallel (~> 1.10)
35
+ parser (>= 2.5, != 2.5.1.1)
36
+ powerpack (~> 0.1)
37
+ rainbow (>= 2.2.2, < 4.0)
38
+ ruby-progressbar (~> 1.7)
39
+ unicode-display_width (~> 1.4.0)
40
+ ruby-progressbar (1.10.1)
41
+ unicode-display_width (1.4.1)
42
+
43
+ PLATFORMS
44
+ ruby
45
+
46
+ DEPENDENCIES
47
+ bundler (~> 2.0)
48
+ rake (~> 10.0)
49
+ rspec (~> 3.0)
50
+ rubobot!
51
+
52
+ BUNDLED WITH
53
+ 2.1.2
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # RuboBot
2
+
3
+ RuboBot runs RuboCop Auto-correct for the cop with the lowest offense count, making it easier to incrementally improve your codebase.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'rubobot'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install rubobot
20
+
21
+ ## Usage
22
+
23
+ ```sh
24
+ msg=`bundle exec rubobot` && git commit -am "$msg"
25
+ ```
26
+
27
+ ## Contributing
28
+
29
+ Bug reports and pull requests are welcome on GitHub at https://github.com/garethrees/rubobot.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'rubobot'
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require 'irb'
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/rubobot ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift("#{__dir__}/../lib")
5
+
6
+ require 'rubobot'
7
+ exit RuboBot::CLI.run(ARGV)
data/lib/rubobot.rb ADDED
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubocop'
4
+
5
+ require 'rubobot/bot'
6
+ require 'rubobot/cli'
7
+ require 'rubobot/configuration'
8
+ require 'rubobot/options'
9
+ require 'rubobot/version'
10
+
11
+ require 'rubobot/git/commit_message'
12
+
13
+ require 'rubobot/rubocop/auto_correct'
14
+ require 'rubobot/rubocop/offense'
15
+ require 'rubobot/rubocop/offenses'
16
+
17
+ require 'rubobot/rubocop/formatter/clang_style_formatter'
18
+ require 'rubobot/rubocop/formatter/offense_count_formatter'
19
+
20
+ # Automate RuboCop Auto-correct
21
+ module RuboBot
22
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboBot
4
+ # Run rubobot
5
+ class Bot
6
+ def initialize(configuration = Configuration.new)
7
+ @configuration = configuration
8
+ end
9
+
10
+ def autocorrect(paths)
11
+ loop do
12
+ ac = RuboBot::RuboCop::AutoCorrect.new(next_cop(paths), paths)
13
+
14
+ if ac.run
15
+ configuration.stdout.puts(ac.commit_message)
16
+ break
17
+ end
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :configuration
24
+
25
+ def next_cop(paths)
26
+ offenses(paths).next.name
27
+ end
28
+
29
+ def offenses(paths)
30
+ @offenses ||= offenses!(paths)
31
+ end
32
+
33
+ def offenses!(paths)
34
+ RuboBot::RuboCop::Offenses.new(paths)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboBot
4
+ # Entrypoint for running RuboBot from the CLI
5
+ class CLI
6
+ STATUS_SUCCESS = 0
7
+ STATUS_FAILURE = 1
8
+
9
+ def self.run(argv)
10
+ options = Options.new(argv)
11
+ new(options[:paths], Configuration.new(options)).run
12
+ end
13
+
14
+ def initialize(paths, configuration)
15
+ @paths = paths
16
+ @configuration = configuration
17
+ end
18
+
19
+ def run
20
+ return output(VERSION) if configuration.version?
21
+
22
+ commit_message = Bot.new(configuration).autocorrect(paths)
23
+ output(commit_message) if configuration.commit_message?
24
+ STATUS_SUCCESS
25
+ rescue RuboBot::RuboCop::NoOffensesError
26
+ STATUS_FAILURE
27
+ end
28
+
29
+ private
30
+
31
+ def output(string)
32
+ configuration.stdout.puts(string)
33
+ STATUS_SUCCESS
34
+ end
35
+
36
+ attr_reader :configuration
37
+ attr_reader :paths
38
+ end
39
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboBot
4
+ # Configuration options
5
+ class Configuration
6
+ DEFAULTS = { verbose: false,
7
+ commit_message: false,
8
+ version: false,
9
+ stdout: $stdout,
10
+ stderr: $stderr,
11
+ ctime: Time.now }.freeze
12
+
13
+ def initialize(options = {})
14
+ @options = options
15
+ end
16
+
17
+ %i[verbose commit_message version].each do |option|
18
+ define_method("#{option}?") { parsed_options[option] }
19
+ end
20
+
21
+ %i[stdout stderr ctime].each do |option|
22
+ define_method(option) { parsed_options[option] }
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :options
28
+
29
+ def parsed_options
30
+ @parsed_options ||= DEFAULTS.merge(options)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboBot
4
+ module Git
5
+ # A Git commit message
6
+ class CommitMessage
7
+ def initialize(cop, command, stdout)
8
+ @cop = cop
9
+ @command = command
10
+ @stdout = stdout
11
+ end
12
+
13
+ def subject
14
+ "Auto-correct #{cop}"
15
+ end
16
+
17
+ def body
18
+ <<~MSG
19
+ #{command}
20
+
21
+ #{stdout}
22
+ MSG
23
+ end
24
+
25
+ def to_s
26
+ <<~MSG.chomp
27
+ #{subject}
28
+
29
+ #{body}
30
+ MSG
31
+ end
32
+
33
+ def ==(other)
34
+ to_h == other.to_h
35
+ end
36
+
37
+ protected
38
+
39
+ def to_h
40
+ { cop: cop,
41
+ command: command,
42
+ stdout: stdout }
43
+ end
44
+
45
+ private
46
+
47
+ attr_reader :cop
48
+ attr_reader :command
49
+ attr_reader :stdout
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'optparse'
4
+
5
+ module RuboBot
6
+ # Parse options passed from the CLI
7
+ class Options
8
+ def initialize(args)
9
+ @args = args
10
+ end
11
+
12
+ def [](key)
13
+ parse[key]
14
+ end
15
+
16
+ def to_hash
17
+ parse
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :args
23
+
24
+ def parse
25
+ options = {}
26
+ option_parser.parse!(args, into: options)
27
+ options[:paths] = args
28
+ options
29
+ end
30
+
31
+ def option_parser
32
+ OptionParser.new do |opts|
33
+ opts.banner = 'Usage: rubobot [options] [paths]'
34
+ opts.on('--commit-message', 'Print commit message')
35
+ opts.on('-v', '--version', 'Print version')
36
+ opts.on('--verbose', 'Print debug info')
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboBot
4
+ module RuboCop
5
+ # Run rubocop to auto-correct a cop
6
+ class AutoCorrect
7
+ # Error for calling methods on an AutoCorrect if the given Cop is not
8
+ # able to Auto-Correct
9
+ class NotAutoCorrectableError < StandardError; end
10
+
11
+ def initialize(cop, paths)
12
+ @cop = cop
13
+ @paths = paths
14
+
15
+ formatter = 'RuboBot::RuboCop::Formatter::ClangStyleFormatter'
16
+ options = { safe_auto_correct: true,
17
+ auto_correct: true,
18
+ format: formatter,
19
+ formatters: [[formatter]],
20
+ only: [cop.name] }
21
+
22
+ @runner = ::RuboCop::Runner.new(options, ::RuboCop::ConfigStore.new)
23
+ end
24
+
25
+ def run
26
+ files_changed?
27
+ end
28
+
29
+ def files_changed?
30
+ status
31
+ end
32
+
33
+ def commit_message
34
+ raise NotAutoCorrectableError unless autocorrect?
35
+ Git::CommitMessage.new(cop.name, command, stdout_str)
36
+ end
37
+
38
+ private
39
+
40
+ attr_reader :cop
41
+ attr_reader :paths
42
+ attr_reader :runner
43
+
44
+ def autocorrect?
45
+ cop.support_autocorrect? && cop.autocorrect_enabled?
46
+ end
47
+
48
+ def status
49
+ @status ||= run!
50
+ end
51
+
52
+ def stdout_str
53
+ return @stdout_str if @stdout_str
54
+ run!
55
+ @stdout_str = runner.send(:formatter_set).first.output.string
56
+ end
57
+
58
+ def run!
59
+ return false unless autocorrect?
60
+ runner.run(paths)
61
+ end
62
+
63
+ # The command we would have run if shelling out, so that we can record it
64
+ # in the commit message for manual reproduction.
65
+ def command
66
+ 'rubocop --safe-auto-correct --format clang ' \
67
+ "--only #{cop.name} #{paths.join(' ')}"
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'stringio'
4
+
5
+ module RuboBot
6
+ module RuboCop
7
+ module Formatter
8
+ # This formatter collects the list of offended cops with a count of how
9
+ # many offenses of their kind were found. Ordered by desc offense count.
10
+ # Does not print output.
11
+ class ClangStyleFormatter < ::RuboCop::Formatter::ClangStyleFormatter
12
+ attr_reader :offense_counts
13
+
14
+ def initialize(output, options = {})
15
+ @output = StringIO.new
16
+ @options = options
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'stringio'
4
+
5
+ module RuboBot
6
+ module RuboCop
7
+ module Formatter
8
+ # This formatter collects the list of offended cops with a count of how
9
+ # many offenses of their kind were found. Ordered by desc offense count.
10
+ # Does not print output.
11
+ class OffenseCountFormatter < ::RuboCop::Formatter::OffenseCountFormatter
12
+ attr_reader :offense_counts
13
+
14
+ def initialize(output, options = {})
15
+ @output = StringIO.new
16
+ @options = options
17
+ end
18
+
19
+ def started(target_files)
20
+ super
21
+ @offense_counts = Hash.new(0)
22
+
23
+ return unless output.tty?
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboBot
4
+ module RuboCop
5
+ # An offense found by RuboCop
6
+ class Offense
7
+ def initialize(offense_data)
8
+ @offense_data = offense_data
9
+ end
10
+
11
+ def name
12
+ offense.name
13
+ end
14
+
15
+ def count
16
+ offense.count
17
+ end
18
+
19
+ def ==(other)
20
+ offense_data == other.offense_data
21
+ end
22
+
23
+ protected
24
+
25
+ attr_reader :offense_data
26
+
27
+ private
28
+
29
+ def offense
30
+ data = Struct.new(:name, :count)
31
+ data.new(*offense_data.first)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboBot
4
+ module RuboCop
5
+ # Raised when we've iterated through all offenses
6
+ class NoOffensesError < StandardError; end
7
+
8
+ # Offenses found by a RuboCop run
9
+ class Offenses
10
+ def initialize(paths)
11
+ formatter = 'RuboBot::RuboCop::Formatter::OffenseCountFormatter'
12
+ options = { format: formatter,
13
+ formatters: [[formatter]] }
14
+
15
+ @paths = Array(paths)
16
+ @runner = ::RuboCop::Runner.new(options, ::RuboCop::ConfigStore.new)
17
+ end
18
+
19
+ def next
20
+ Offense.new([offenses.shift].to_h)
21
+ rescue TypeError
22
+ raise NoOffensesError
23
+ end
24
+
25
+ def size
26
+ offenses.size
27
+ end
28
+
29
+ def ==(other)
30
+ to_h == other.to_h
31
+ end
32
+
33
+ def to_h
34
+ offenses.each_with_object({}) do |(cop, count), memo|
35
+ memo[cop.name] = count
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ attr_reader :paths
42
+ attr_reader :runner
43
+
44
+ def offenses
45
+ @offenses ||= offenses!
46
+ end
47
+
48
+ def offenses!
49
+ sorted_offenses.
50
+ each_with_object({}) do |(name, count), memo|
51
+ cop = ::RuboCop::Cop::Cop.registry.find_by_cop_name(name).new
52
+ memo[cop] = count
53
+ end
54
+ end
55
+
56
+ def sorted_offenses
57
+ runner.run(paths)
58
+ formatter = runner.send(:formatter_set).first
59
+ formatter.offense_counts.sort_by(&:last)
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboBot
4
+ VERSION = '0.63.1'
5
+ end
data/rubobot.gemspec ADDED
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'rubobot/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'rubobot'
9
+ spec.version = RuboBot::VERSION
10
+ spec.authors = ['Gareth Rees']
11
+ spec.email = ['gareth@garethrees.co.uk']
12
+
13
+ spec.summary = 'Automate code cleanup, one cop at a time'
14
+ spec.description = 'Runs RuboCop Auto-correct for the cop with the ' \
15
+ 'lowest offense count, making it easier to ' \
16
+ 'incrementally improve your codebase.'
17
+
18
+ spec.homepage = 'https://github.com/garethrees/rubobot'
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added
22
+ # into git.
23
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
+ `git ls-files -z`.split("\x0").reject do |f|
25
+ f.match(%r{^(spec)/})
26
+ end
27
+ end
28
+
29
+ spec.bindir = 'exe'
30
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ['lib']
32
+
33
+ spec.add_runtime_dependency 'rubocop', '0.63.1'
34
+
35
+ spec.add_development_dependency 'bundler', '~> 2.0'
36
+ spec.add_development_dependency 'rake', '~> 10.0'
37
+ spec.add_development_dependency 'rspec', '~> 3.0'
38
+ end
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubobot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.63.1
5
+ platform: ruby
6
+ authors:
7
+ - Gareth Rees
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-03-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rubocop
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.63.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.63.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ description: Runs RuboCop Auto-correct for the cop with the lowest offense count,
70
+ making it easier to incrementally improve your codebase.
71
+ email:
72
+ - gareth@garethrees.co.uk
73
+ executables:
74
+ - rubobot
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - ".gitignore"
79
+ - ".rspec"
80
+ - ".rubocop.yml"
81
+ - ".travis.yml"
82
+ - Gemfile
83
+ - Gemfile.lock
84
+ - README.md
85
+ - Rakefile
86
+ - bin/console
87
+ - bin/setup
88
+ - exe/rubobot
89
+ - lib/rubobot.rb
90
+ - lib/rubobot/bot.rb
91
+ - lib/rubobot/cli.rb
92
+ - lib/rubobot/configuration.rb
93
+ - lib/rubobot/git/commit_message.rb
94
+ - lib/rubobot/options.rb
95
+ - lib/rubobot/rubocop/auto_correct.rb
96
+ - lib/rubobot/rubocop/formatter/clang_style_formatter.rb
97
+ - lib/rubobot/rubocop/formatter/offense_count_formatter.rb
98
+ - lib/rubobot/rubocop/offense.rb
99
+ - lib/rubobot/rubocop/offenses.rb
100
+ - lib/rubobot/version.rb
101
+ - rubobot.gemspec
102
+ homepage: https://github.com/garethrees/rubobot
103
+ licenses: []
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubygems_version: 3.0.6
121
+ signing_key:
122
+ specification_version: 4
123
+ summary: Automate code cleanup, one cop at a time
124
+ test_files: []