rubocop_pr 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c3a96d6d64a42663f02991fcebdc005ec36ec3a9ea79e40d862842d657461cf1
4
- data.tar.gz: da47ce8f606b3a5e6a8777b645cd782a525876de45a1ea113db218a653e6054f
3
+ metadata.gz: 41140375dff6c844311e1bf2eea32974bdb78df0a703a117b0341eac7cb55928
4
+ data.tar.gz: b0bbd0edc7b6f6e9f084442630fa4dcc78e8212789207770fd83904241e08eb8
5
5
  SHA512:
6
- metadata.gz: 5febfb8ac1b8e32068c656da27f8ecbe742b6b5a6cd7f0806ede01a74528f4b2ef3629b425fd3ed7b144b4dea9bdfe4163e7732d17fe8fa174acf10e4133bd79
7
- data.tar.gz: 8284fdd08bb79621a6fafa7dec967ba1ea55f6ce1ba0250a8187dcede4ac61d28b59a1f8951ce40dbcfcdcb2e4e6536812aef5bdfa7eccc3ddca3dce580b740a
6
+ metadata.gz: 01dfc86addb40874e9620b21233082cb093c6dca661accd2a451833730a78659e7bb147b2bc05afbccd1d742bdc301a95f126da010167ca9ff3fc1dfdee7b6c6
7
+ data.tar.gz: 5bf1b5cfbda7db9805638583b6260124e846b1cd8b948eee499801b13bf9f0bf3ba1fba8a3fb6f7f2ba8bbeb927e9dd3a006a2371aa88cd423f81b63b9e1c31c
data/.gitignore CHANGED
@@ -9,3 +9,5 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+ Gemfile.lock
13
+ *.gem
data/.overcommit.yml ADDED
@@ -0,0 +1,93 @@
1
+ verify_signatures: false
2
+ CommitMsg:
3
+ ALL:
4
+ CapitalizedSubject:
5
+ enabled: true
6
+ description: 'Checking subject capitalization'
7
+ quiet: true
8
+ on_warn: fail
9
+ EmptyMessage:
10
+ enabled: true
11
+ description: 'Checking for empty commit message'
12
+ quiet: true
13
+ HardTabs:
14
+ enabled: true
15
+ description: 'Checking for hard tabs'
16
+ RussianNovel:
17
+ enabled: true
18
+ description: 'Checking length of commit message'
19
+ quiet: true
20
+ SingleLineSubject:
21
+ enabled: true
22
+ description: 'Checking subject line'
23
+ SpellCheck:
24
+ enabled: true
25
+ description: 'Checking for misspelled words'
26
+ required_executable: 'hunspell'
27
+ flags: ['-a']
28
+ on_fail: warn
29
+ TextWidth:
30
+ enabled: true
31
+ description: 'Checking text width'
32
+ max_subject_width: 60
33
+ max_body_width: 72
34
+ on_warn: fail
35
+ TrailingPeriod:
36
+ enabled: true
37
+ description: 'Checking for trailing periods in subject'
38
+ on_warn: fail
39
+ MessageFormat:
40
+ enabled: false
41
+ description: 'Message must be ended with task number'
42
+ expected_pattern_message: '<Commit Message Description> <Issue Id>'
43
+ sample_message: 'Refactored Onboarding flow FOO-1234'
44
+ pattern: '\s([A-Z]{1,4}-\d{1,4}|\d{1,6})$'
45
+ PreCommit:
46
+ ALL:
47
+ problem_on_unmodified_line: report
48
+ requires_files: true
49
+ required: false
50
+ quiet: false
51
+ AuthorEmail:
52
+ enabled: true
53
+ description: 'Checking author email'
54
+ requires_files: false
55
+ required: true
56
+ quiet: true
57
+ pattern: '^[^@]+@.*$'
58
+ AuthorName:
59
+ enabled: false
60
+ description: 'Checking for author name'
61
+ requires_files: false
62
+ required: true
63
+ quiet: true
64
+ BrokenSymlinks:
65
+ enabled: true
66
+ description: 'Checking for broken symlinks'
67
+ quiet: true
68
+ CaseConflicts:
69
+ enabled: true
70
+ description: 'Checking for case-insensitivity conflicts'
71
+ quiet: true
72
+ MergeConflicts:
73
+ enabled: true
74
+ description: 'Checking for merge conflicts'
75
+ quiet: true
76
+ required_executable: 'grep'
77
+ flags: ['-IHn', "^<<<<<<<[ \t]"]
78
+
79
+ RuboCop:
80
+ enabled: true
81
+ required: true
82
+ quiet: false
83
+ description: 'Analyzing with RuboCop'
84
+ command: ['bundle', 'exec', 'rubocop']
85
+ flags: ['--format=emacs', '--force-exclusion', '--display-cop-names']
86
+ install_command: 'gem install rubocop'
87
+ on_warn: fail
88
+ include:
89
+ - '**/*.gemspec'
90
+ - '**/*.rake'
91
+ - '**/*.rb'
92
+ - '**/Gemfile'
93
+ - '**/Rakefile'
data/.rubocop.yml ADDED
@@ -0,0 +1,11 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.1
3
+
4
+ Metrics/LineLength:
5
+ Max: 120
6
+
7
+ Metrics/BlockLength:
8
+ ExcludedMethods: ['describe', 'context']
9
+
10
+ Metrics/AbcSize:
11
+ Max: 20
data/.travis.yml CHANGED
@@ -3,5 +3,14 @@ sudo: false
3
3
  language: ruby
4
4
  cache: bundler
5
5
  rvm:
6
- - 2.6.3
7
- before_install: gem install bundler -v 1.17.3
6
+ - 2.1
7
+ - 2.2
8
+ - 2.3
9
+ - 2.4
10
+ - 2.5
11
+ - 2.6
12
+ before_install:
13
+ - gem install bundler -v 1.17.3
14
+ - sudo add-apt-repository ppa:cpick/hub -y
15
+ - sudo apt-get update
16
+ - sudo apt-get install hub
data/Gemfile CHANGED
@@ -1,6 +1,8 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ source 'https://rubygems.org'
4
+
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
6
 
5
7
  # Specify your gem's dependencies in rubocop_pr.gemspec
6
8
  gemspec
data/README.md CHANGED
@@ -1,15 +1,26 @@
1
1
  # RubocopPr
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/rubocop_pr`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ [![Version ][rubygems_badge]][rubygems]
4
+ [![Build Status ][travisci_badge]][travisci]
5
+ [![Codacy Badge ][codacy_badge]][codacy]
6
+ [![Reviewed by Hound ][hound_badge]][hound]
4
7
 
5
- TODO: Delete this and the text above, and describe your gem
8
+ CLI Issues and PR creator for Rubocop Cops. 1 linter == 1 issue == 1 PR.
9
+
10
+ With RubocopPr you can apply [Rubocop][rubocop_repo] clean and in a few minutes.
11
+
12
+ ## Requirements
13
+
14
+ * Ruby 2.1+
15
+ * Hub 2.12.3 (tested with this version only, but should work with older versions)
16
+ * Github
6
17
 
7
18
  ## Installation
8
19
 
9
20
  Add this line to your application's Gemfile:
10
21
 
11
22
  ```ruby
12
- gem 'rubocop_pr'
23
+ gem 'rubocop_pr', require: false
13
24
  ```
14
25
 
15
26
  And then execute:
@@ -22,22 +33,48 @@ Or install it yourself as:
22
33
 
23
34
  ## Usage
24
35
 
25
- TODO: Write usage instructions here
26
-
27
- ## Development
36
+ ```bash
37
+ Usage: rubocop_pr [options]
38
+ -u, --hub-version [version] Set manually minimum required version of 'hub' utility for github (default: 2.12.3)
39
+ -b, --branch [branch] internal branch with '.rubocop_todo.yml' (default: 'rubocop_todo_branch')
40
+ -m, --master [branch] branch which will be the base for all PR's (default: 'master')
41
+ -r, --post-checkout [command] Running after each git checkout (default: "")
42
+ -l, --limit [limit] Limit the PS's for one run (default: 10)
43
+ -g, --repository [name] Set repository host (default: github)
44
+ -o, --origin [origin] origin option for 'git push' (default: 'origin')
45
+ -c, --continue Continue previous session (default: false)
46
+ -v, --version Display version
47
+ -h, --help Display help
48
+ ```
28
49
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
50
+ #### Notes
30
51
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
52
+ * `brach` option is useful, if you want to prepare the `.rubocop-todo.yml` manually and feed it to `rubocop_pr`
53
+ * `post-checkout` handy for old Ruby versions, when shell may "forget" Ruby version.
32
54
 
33
55
  ## Contributing
34
56
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/rubocop_pr. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
57
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/rubocop_pr. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant][contributor_covenant_link] code of conduct.
36
58
 
37
59
  ## License
38
60
 
39
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
61
+ The gem is available as open source under the terms of the [MIT License][mit_link].
40
62
 
41
63
  ## Code of Conduct
42
64
 
43
- Everyone interacting in the RubocopPr project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/rubocop_pr/blob/master/CODE_OF_CONDUCT.md).
65
+ Everyone interacting in the RubocopPr project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct][code_of_conduct_link].
66
+
67
+
68
+ [rubocop_repo]: https://github.com/rubocop-hq/rubocop
69
+ [contributor_covenant_link]: http://contributor-covenant.org
70
+ [mit_link]: https://opensource.org/licenses/MIT
71
+ [code_of_conduct_link]: https://github.com/[USERNAME]/rubocop_pr/blob/master/CODE_OF_CONDUCT.md
72
+
73
+ [travisci_badge]: https://travis-ci.org/kvokka/rubocop_pr.svg?branch=master
74
+ [travisci]: https://travis-ci.org/kvokka/rubocop_pr
75
+ [rubygems]: https://rubygems.org/gems/rubocop_pr
76
+ [rubygems_badge]: http://img.shields.io/gem/v/rubocop_pr.svg
77
+ [codacy_badge]: https://api.codacy.com/project/badge/Grade/8be41ff90d294d7bb4c01fb3c98ebac9
78
+ [codacy]: https://app.codacy.com/app/kvokka/rubocop_pr?utm_source=github.com&utm_medium=referral&utm_content=kvokka/rubocop_pr&utm_campaign=Badge_Grade_Dashboard
79
+ [hound_badge]: https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg
80
+ [hound]: https://houndci.com
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
data/bin/console CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "rubocop_pr"
4
+ require 'bundler/setup'
5
+ require 'rubocop_pr'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +11,5 @@ require "rubocop_pr"
10
11
  # require "pry"
11
12
  # Pry.start
12
13
 
13
- require "irb"
14
+ require 'irb'
14
15
  IRB.start(__FILE__)
data/exe/rubocop_pr ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift("#{__dir__}/../lib")
5
+
6
+ require 'rubocop_pr'
7
+ require 'benchmark'
8
+
9
+ cli = RubocopPr::CLI.new(ARGV)
10
+ result = 0
11
+
12
+ time = Benchmark.realtime do
13
+ result = cli.run!
14
+ end
15
+
16
+ puts "Finished in #{time} seconds" if cli.options[:debug]
17
+ exit result
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubocopPr
4
+ # Cunner from CLI interface
5
+ class CLI
6
+ attr_reader :options, :repository, :rubocop, :git
7
+
8
+ def initialize(argv = [])
9
+ @options = Options.new(argv).parse
10
+ @git = Git.new(post_checkout: @options.post_checkout, origin: @options.git_origin)
11
+ @repository = Repository.all.fetch(@options.repository)
12
+ @rubocop = RubocopPr::Rubocop.new(branch: @options.rubocop_todo_branch, git: @git)
13
+ end
14
+
15
+ def run!
16
+ EnvironmentChecker.call(repository, options)
17
+ run
18
+ git.checkout(options.master_branch)
19
+ end
20
+
21
+ private
22
+
23
+ def run
24
+ rubocop.inject(0) do |counter, cop|
25
+ next counter if git.status.blank?
26
+ next counter if options.continue && git.branch =~ /#{branch_suffix(cop)}\s/
27
+ next counter unless rubocop.corrected?
28
+ process_cop(cop)
29
+
30
+ break if counter >= options.limit - 1
31
+ counter + 1
32
+ end
33
+ end
34
+
35
+ def process_cop(cop)
36
+ git.checkout(options.master_branch)
37
+ title = "Fix Rubocop #{cop} warnings"
38
+ issue_number = repository.create_issue(title: title)
39
+ git.checkout("#{issue_number}-#{branch_suffix(cop)}")
40
+ git.commit_all(title)
41
+ git.push
42
+ repository.create_pull_request(title: title, body: "Closes ##{issue_number}")
43
+ end
44
+
45
+ def branch_suffix(cop)
46
+ "rubocop-fix-#{cop.underscore.tr('/_', '-')}"
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubocopPr
4
+ # Service class, which only goal is to check that the system is suitable to run the script.
5
+ class EnvironmentChecker
6
+ def self.checks
7
+ @checks ||= [GitStatus]
8
+ end
9
+
10
+ def self.call(repository, options)
11
+ checks.each { |c| c.call options }
12
+ repository.checks.each { |c| c.call options }
13
+ end
14
+
15
+ # Check that we do not have any un-commited changes
16
+ module GitStatus
17
+ module_function
18
+
19
+ def call(*)
20
+ return true if git_status.empty?
21
+ raise 'You have un-commited changes in this branch'
22
+ end
23
+
24
+ def git_status
25
+ RubocopPr::Git.new.status
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,52 @@
1
+ module RubocopPr
2
+ # small helper for git commands, everything should be stubbed in tests
3
+ class Git
4
+ attr_reader :post_checkout, :origin
5
+
6
+ def initialize(post_checkout: '', origin: '', **_options)
7
+ @post_checkout = post_checkout
8
+ @origin = origin
9
+ end
10
+
11
+ def checkout(file_or_branch)
12
+ return process_post_checkout if exec_checkout(file_or_branch)
13
+ exec_checkout file_or_branch, flags: ['-b']
14
+ process_post_checkout
15
+ end
16
+
17
+ def commit_all(message)
18
+ system 'git add .'
19
+ system "git commit -m '#{message}'"
20
+ end
21
+
22
+ def push
23
+ system "git push --set-upstream #{origin} #{current_branch}"
24
+ end
25
+
26
+ def current_branch
27
+ `git branch --show-current`.chomp
28
+ end
29
+
30
+ def status
31
+ `git status -s`
32
+ end
33
+
34
+ def branch
35
+ `git branch`
36
+ end
37
+
38
+ private
39
+
40
+ def process_post_checkout
41
+ post_checkout.blank? ? true : exec_post_checkout
42
+ end
43
+
44
+ def exec_checkout(branch, flags: [])
45
+ system "git checkout #{flags.join(' ')} #{branch}"
46
+ end
47
+
48
+ def exec_post_checkout
49
+ system post_checkout.to_s
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubocopPr
4
+ # Parse the options from the command line
5
+ class Options
6
+ attr_reader :options, :args
7
+
8
+ def initialize(args)
9
+ @args = args
10
+ @options = OpenStruct.new
11
+ end
12
+
13
+ def parse
14
+ build_parser.parse!(args)
15
+ options
16
+ end
17
+
18
+ private
19
+
20
+ def build_parser # rubocop:disable Metrics/MethodLength
21
+ @parser = OptionParser.new do |opts|
22
+ opts.banner = 'Usage: rubocop_pr [options]'
23
+
24
+ add_hub_version_option(opts)
25
+ add_rubocop_todo_branch_option(opts)
26
+ add_master_branch_option(opts)
27
+ add_post_checkout_option(opts)
28
+ add_limit_option(opts)
29
+ add_repository_option(opts)
30
+ add_git_origin_option(opts)
31
+ add_continue_option(opts)
32
+ add_version_option(opts)
33
+ add_on_tail(opts)
34
+ end
35
+ end
36
+
37
+ def add_limit_option(opts)
38
+ @options.limit = 10
39
+ msg = "Limit the PS's for one run (default: 10)"
40
+ opts.on('-l [limit]', '--limit [limit]', Integer, msg) do |v|
41
+ @options.limit = v
42
+ end
43
+ end
44
+
45
+ def add_post_checkout_option(opts)
46
+ @options.post_checkout = ''
47
+ msg = 'Running after each git checkout (default: "")'
48
+ opts.on('-r [command]', '--post-checkout [command]', String, msg) do |v|
49
+ @options.post_checkout = v
50
+ end
51
+ end
52
+
53
+ def add_rubocop_todo_branch_option(opts)
54
+ @options.rubocop_todo_branch = 'rubocop_todo_branch'
55
+ msg = "internal branch with '.rubocop_todo.yml' (default: 'rubocop_todo_branch')"
56
+ opts.on('-b [branch]', '--branch [branch]', String, msg) do |v|
57
+ @options.rubocop_todo_branch = v
58
+ end
59
+ end
60
+
61
+ def add_master_branch_option(opts)
62
+ @options.master_branch = 'master'
63
+ msg = "branch which will be the base for all PR's (default: 'master')"
64
+ opts.on('-m [branch]', '--master [branch]', String, msg) do |v|
65
+ @options.master_branch = v
66
+ end
67
+ end
68
+
69
+ def add_git_origin_option(opts)
70
+ @options.git_origin = 'origin'
71
+ msg = "origin option for 'git push' (default: 'origin')"
72
+ opts.on('-o [origin]', '--origin [origin]', String, msg) do |v|
73
+ @options.git_origin = v
74
+ end
75
+ end
76
+
77
+ def add_hub_version_option(opts)
78
+ @options.hub_version = HUB_VERSION
79
+ msg = "Set manually minimum required version of 'hub' utility for github (default: #{HUB_VERSION})"
80
+ opts.on('-u [version] ', '--hub-version [version]', msg) do |v|
81
+ @options.hub_version = v
82
+ end
83
+ end
84
+
85
+ def add_repository_option(opts)
86
+ @options.repository = 'github'
87
+ msg = 'Set repository host (default: github)'
88
+ opts.on('-g [name] ', '--repository [name]', msg) do |v|
89
+ @options.repository = v
90
+ end
91
+ end
92
+
93
+ def add_continue_option(opts)
94
+ @options.continue = false
95
+ opts.on('-c', '--continue', 'Continue previous session (default: false)') do |_v|
96
+ @options.continue = true
97
+ end
98
+ end
99
+
100
+ def add_version_option(opts)
101
+ opts.on('-v', '--version', 'Display version') do
102
+ puts RubocopPr::VERSION
103
+ exit
104
+ end
105
+ end
106
+
107
+ def add_on_tail(opts)
108
+ opts.on_tail('-h', '--help', 'Display help') do
109
+ puts opts
110
+ exit
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,29 @@
1
+ module RubocopPr
2
+ module Repositories
3
+ class Github < RubocopPr::Repository
4
+ module Checks
5
+ # Check, if `hub` installed and have right version
6
+ module VerifyHubVersion
7
+ module_function
8
+
9
+ def call(options)
10
+ return true if system_hub_version >= Gem::Version.new(options.hub_version)
11
+ warn "Script was tested with hub version #{HUB_VERSION}, while you are using #{system_hub_version}"
12
+ true
13
+ end
14
+
15
+ def system_hub_version
16
+ matches = hub_version.match(/hub version (?<hub_version>(.*))/)
17
+ Gem::Version.new matches.captures.last
18
+ rescue StandardError
19
+ raise "Robopop requires https://github.com/github/hub version >= #{RubocopPr::HUB_VERSION}"
20
+ end
21
+
22
+ def hub_version
23
+ `hub --version`
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,55 @@
1
+ module RubocopPr
2
+ module Repositories
3
+ # Github repository
4
+ class Github < RubocopPr::Repository
5
+ # The representation of the Issue
6
+ class Issue
7
+ attr_reader :title, :body
8
+
9
+ def initialize(title:, **other)
10
+ @title = title
11
+ @body = other[:body] || default_body
12
+ end
13
+
14
+ def create
15
+ link = `hub issue create -m '#{title}' -m '#{body}'`
16
+ link.split('/').last.to_i
17
+ end
18
+
19
+ def default_body
20
+ 'This issue was created by [rubocop_pr](https://github.com/kvokka/rubocop_pr) for ' \
21
+ '[rubocop](https://github.com/rubocop-hq/rubocop)'
22
+ end
23
+ end
24
+
25
+ # The representation of the PR
26
+ class PullRequest
27
+ attr_reader :title, :body
28
+
29
+ def initialize(title:, **other)
30
+ @title = title
31
+ @body = other[:body] || ''
32
+ end
33
+
34
+ def create
35
+ link = `hub pull-request create -m '#{title}' -m '#{body}'`
36
+ link.split('/').last.to_i
37
+ end
38
+ end
39
+
40
+ class << self
41
+ def checks
42
+ super + [RubocopPr::Repositories::Github::Checks::VerifyHubVersion]
43
+ end
44
+
45
+ def create_issue(*args)
46
+ Issue.new(*args).create
47
+ end
48
+
49
+ def create_pull_request(*args)
50
+ PullRequest.new(*args).create
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,29 @@
1
+ module RubocopPr
2
+ # abstract repository class
3
+ class Repository
4
+ class << self
5
+ def all
6
+ @all ||= ::ActiveSupport::HashWithIndifferentAccess.new
7
+ end
8
+
9
+ def inherited(base)
10
+ all[base.name.demodulize.underscore] = base
11
+ end
12
+
13
+ # Array of Class which respond_to ::call and raise if check do not pass
14
+ def checks
15
+ []
16
+ end
17
+
18
+ # return Integer issue number
19
+ def create_issue(*)
20
+ raise NotImplemented, 'should be implemented on sub-class'
21
+ end
22
+
23
+ # return Integer pull_request number
24
+ def create_pull_request(*)
25
+ raise NotImplemented, 'should be implemented on sub-class'
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,48 @@
1
+ module RubocopPr
2
+ # small helper for rubocop commands, everything should be stubbed in tests
3
+ class Rubocop
4
+ include Enumerable
5
+
6
+ TODO_FILENAME = '.rubocop_todo.yml'.freeze
7
+
8
+ attr_reader :branch, :git
9
+
10
+ def initialize(**options)
11
+ @branch = options.delete(:branch)
12
+ @git = options.delete(:git)
13
+ end
14
+
15
+ def todo
16
+ YAML.safe_load(read_or_generate_todo)
17
+ end
18
+
19
+ def each
20
+ git.checkout(branch)
21
+ todos_backup = todo
22
+ todos_backup.each_key do |cop|
23
+ git.checkout(branch)
24
+ todos = todos_backup.dup
25
+ todos.delete cop
26
+ File.open(TODO_FILENAME, 'w') { |f| f.write todos.blank? ? '' : YAML.dump(todos) }
27
+ yield cop
28
+ end
29
+ end
30
+
31
+ def read_or_generate_todo
32
+ return File.read(TODO_FILENAME) if File.exist?(TODO_FILENAME)
33
+ generate_todo
34
+ git.commit_all('Generate initial Rubocop todo file')
35
+ File.read(TODO_FILENAME)
36
+ end
37
+
38
+ def generate_todo
39
+ `bundle exec rubocop --auto-gen-config`
40
+ end
41
+
42
+ def corrected?
43
+ `bundle exec rubocop -a`
44
+ git.checkout TODO_FILENAME
45
+ !git.status.blank?
46
+ end
47
+ end
48
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubocopPr
2
- VERSION = "0.1.0"
4
+ VERSION = '0.2.0'.freeze
3
5
  end
data/lib/rubocop_pr.rb CHANGED
@@ -1,6 +1,25 @@
1
- require "rubocop_pr/version"
1
+ # frozen_string_literal: true
2
2
 
3
+ require 'optparse'
4
+ require 'ostruct'
5
+ require 'active_support/core_ext/hash'
6
+ require 'yaml'
7
+
8
+ require 'pry'
9
+
10
+ require 'rubocop_pr/version'
11
+ require 'rubocop_pr/options'
12
+ require 'rubocop_pr/environment_checker'
13
+ require 'rubocop_pr/rubocop'
14
+ require 'rubocop_pr/git'
15
+ require 'rubocop_pr/repository'
16
+ require 'rubocop_pr/repositories/github'
17
+ require 'rubocop_pr/repositories/github/checks/verify_hub_version'
18
+ require 'rubocop_pr/cli'
19
+
20
+ # The entry point
3
21
  module RubocopPr
4
22
  class Error < StandardError; end
5
- # Your code goes here...
23
+
24
+ HUB_VERSION = '2.12.3'.freeze
6
25
  end
data/rubocop_pr.gemspec CHANGED
@@ -1,32 +1,38 @@
1
+ # frozen_string_literal: true
1
2
 
2
- lib = File.expand_path("../lib", __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "rubocop_pr/version"
5
+ require 'rubocop_pr/version'
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = "rubocop_pr"
8
+ spec.name = 'rubocop_pr'
8
9
  spec.version = RubocopPr::VERSION
9
- spec.authors = ["kvokka"]
10
- spec.email = ["kvokka@yahoo.com"]
10
+ spec.authors = ['kvokka']
11
+ spec.email = ['kvokka@yahoo.com']
11
12
 
12
- spec.summary = %q{ e a short summary, because RubyGems requires one.}
13
- spec.description = %q{ e a longer description or delete this line.}
14
- spec.homepage = "http://valid.url"
15
- spec.license = "MIT"
13
+ spec.summary = 'Quick & clean Rubocop introduction.'
14
+ spec.description = 'Create 1 PR per 1 Rubocop linter, which allow to do review rubocop changes smoothly.'
15
+ spec.homepage = 'https://github.com/kvokka/rubocop_pr'
16
+ spec.license = 'MIT'
16
17
 
17
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
- # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ spec.required_ruby_version = '~> 2.1'
19
19
 
20
20
  # Specify which files should be added to the gem when it is released.
21
21
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
23
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
24
  end
25
- spec.bindir = "exe"
25
+ spec.bindir = 'exe'
26
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
- spec.require_paths = ["lib"]
27
+ spec.require_paths = ['lib']
28
28
 
29
- spec.add_development_dependency "bundler", "~> 1.17"
30
- spec.add_development_dependency "rake", "~> 10.0"
31
- spec.add_development_dependency "rspec", "~> 3.0"
29
+ spec.add_dependency 'activesupport', '>= 4.2.0', '< 6.0'
30
+ spec.add_dependency 'rubocop', '~> 0.57.0'
31
+
32
+ spec.add_development_dependency 'bundler', '~> 1.16'
33
+ spec.add_development_dependency 'overcommit', '~> 0.44'
34
+ spec.add_development_dependency 'pry', '~> 0.12'
35
+ spec.add_development_dependency 'rake', '~> 10.0'
36
+ spec.add_development_dependency 'rspec', '~> 3.0'
37
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.27'
32
38
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop_pr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kvokka
@@ -10,20 +10,82 @@ bindir: exe
10
10
  cert_chain: []
11
11
  date: 2019-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 4.2.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rubocop
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 0.57.0
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.57.0
13
47
  - !ruby/object:Gem::Dependency
14
48
  name: bundler
15
49
  requirement: !ruby/object:Gem::Requirement
16
50
  requirements:
17
51
  - - "~>"
18
52
  - !ruby/object:Gem::Version
19
- version: '1.17'
53
+ version: '1.16'
20
54
  type: :development
21
55
  prerelease: false
22
56
  version_requirements: !ruby/object:Gem::Requirement
23
57
  requirements:
24
58
  - - "~>"
25
59
  - !ruby/object:Gem::Version
26
- version: '1.17'
60
+ version: '1.16'
61
+ - !ruby/object:Gem::Dependency
62
+ name: overcommit
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.44'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.44'
75
+ - !ruby/object:Gem::Dependency
76
+ name: pry
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.12'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.12'
27
89
  - !ruby/object:Gem::Dependency
28
90
  name: rake
29
91
  requirement: !ruby/object:Gem::Requirement
@@ -52,15 +114,33 @@ dependencies:
52
114
  - - "~>"
53
115
  - !ruby/object:Gem::Version
54
116
  version: '3.0'
55
- description: " e a longer description or delete this line."
117
+ - !ruby/object:Gem::Dependency
118
+ name: rubocop-rspec
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.27'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.27'
131
+ description: Create 1 PR per 1 Rubocop linter, which allow to do review rubocop changes
132
+ smoothly.
56
133
  email:
57
134
  - kvokka@yahoo.com
58
- executables: []
135
+ executables:
136
+ - rubocop_pr
59
137
  extensions: []
60
138
  extra_rdoc_files: []
61
139
  files:
62
140
  - ".gitignore"
141
+ - ".overcommit.yml"
63
142
  - ".rspec"
143
+ - ".rubocop.yml"
64
144
  - ".travis.yml"
65
145
  - CODE_OF_CONDUCT.md
66
146
  - Gemfile
@@ -69,10 +149,19 @@ files:
69
149
  - Rakefile
70
150
  - bin/console
71
151
  - bin/setup
152
+ - exe/rubocop_pr
72
153
  - lib/rubocop_pr.rb
154
+ - lib/rubocop_pr/cli.rb
155
+ - lib/rubocop_pr/environment_checker.rb
156
+ - lib/rubocop_pr/git.rb
157
+ - lib/rubocop_pr/options.rb
158
+ - lib/rubocop_pr/repositories/github.rb
159
+ - lib/rubocop_pr/repositories/github/checks/verify_hub_version.rb
160
+ - lib/rubocop_pr/repository.rb
161
+ - lib/rubocop_pr/rubocop.rb
73
162
  - lib/rubocop_pr/version.rb
74
163
  - rubocop_pr.gemspec
75
- homepage: http://valid.url
164
+ homepage: https://github.com/kvokka/rubocop_pr
76
165
  licenses:
77
166
  - MIT
78
167
  metadata: {}
@@ -82,9 +171,9 @@ require_paths:
82
171
  - lib
83
172
  required_ruby_version: !ruby/object:Gem::Requirement
84
173
  requirements:
85
- - - ">="
174
+ - - "~>"
86
175
  - !ruby/object:Gem::Version
87
- version: '0'
176
+ version: '2.1'
88
177
  required_rubygems_version: !ruby/object:Gem::Requirement
89
178
  requirements:
90
179
  - - ">="
@@ -94,5 +183,5 @@ requirements: []
94
183
  rubygems_version: 3.0.4
95
184
  signing_key:
96
185
  specification_version: 4
97
- summary: e a short summary, because RubyGems requires one.
186
+ summary: Quick & clean Rubocop introduction.
98
187
  test_files: []