rubocop_lineup 0.1.1 → 0.5.1

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
- SHA1:
3
- metadata.gz: 5cfa56198440d7781eaacc424900d3138531ce33
4
- data.tar.gz: 167f93d1795b139ea974f6a1c8f3a6ff16721fe4
2
+ SHA256:
3
+ metadata.gz: ef6cd25bb513449b7e8a8e4393667bcc3f14eb7e368a75a05ec51cbe74a3aeec
4
+ data.tar.gz: 1c8777485957331c3446e24f20c8d8e04e8dfe0f3ac5ec7f1382c9fecb639c56
5
5
  SHA512:
6
- metadata.gz: 625887be5c29eb398c84e41787a06a853fbdd96826fbac4d10eace54113eacf6071cdb8ab08bcc6859f6ab5a04b4f28da2957c422a31706d59bc96571a8f2bd0
7
- data.tar.gz: e15d9f1a333954e0cbb2e701b0b4424ef5446fec35378de6e052fb3af277905e4020554810ce0936fc76a17ba9ec38ff510eeecc549d577f40a11a3ce711ba34
6
+ metadata.gz: a5b99a93b516be211e3b1442d2727b46df48b8c6b972b93745983e555e3bacd5a8eb8b2eea034ec420f9a6a29ecdc36fff45fa46e87cdfe1d1379f254ed80302
7
+ data.tar.gz: 5f6bfa3a6808c1d4e95ee1f21f63749a33f3196c266698be650081fbb9ab64b760ed16da397c0e50c927ed0df820faf19a1e65265e1728e8b1f42f4cfc229886
data/.gitignore CHANGED
@@ -1,9 +1,10 @@
1
- /.bundle/
1
+ **/.bundle/
2
2
  /.yardoc
3
3
  /_yardoc/
4
4
  /bin/
5
5
  /coverage/
6
6
  /doc/
7
+ /gemfiles/*lock
7
8
  /pkg/
8
9
  /spec/reports/
9
10
  /tmp/
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: "2.1"
2
+ TargetRubyVersion: 2.3
3
3
  Exclude:
4
4
  - "bin/**"
5
5
 
@@ -1 +1 @@
1
- 2.4.4
1
+ 2.6.3
@@ -1,5 +1,19 @@
1
- sudo: false
2
1
  language: ruby
2
+
3
3
  rvm:
4
- - 2.4.4
5
- before_install: gem install bundler -v 1.16.1
4
+ - 2.3.8
5
+ - 2.4.6
6
+ - 2.5.5
7
+ - 2.6.3
8
+
9
+ gemfile:
10
+ - gemfiles/rubocop_latest.gemfile
11
+ - gemfiles/rubocop_0.69.0.gemfile
12
+ - gemfiles/rubocop_0.58.2.gemfile
13
+ - gemfiles/rubocop_0.56.0.gemfile
14
+ - gemfiles/rubocop_0.52.1.gemfile
15
+ - gemfiles/rubocop_0.46.0.gemfile
16
+ - gemfiles/rubocop_0.35.1.gemfile
17
+
18
+
19
+ before_install: gem install bundler -v 1.17.3
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ appraise "rubocop-latest" do
4
+ gem "rubocop"
5
+ end
6
+
7
+ appraise "rubocop-0.69.0" do
8
+ gem "rubocop", "0.69.0"
9
+ end
10
+
11
+ appraise "rubocop-0.58.2" do
12
+ gem "rubocop", "0.58.2"
13
+ end
14
+
15
+ appraise "rubocop-0.56.0" do
16
+ gem "rubocop", "0.56.0"
17
+ end
18
+
19
+ appraise "rubocop-0.52.1" do
20
+ gem "rubocop", "0.52.1"
21
+ end
22
+
23
+ appraise "rubocop-0.46.0" do
24
+ gem "rubocop", "0.46.0"
25
+ end
26
+
27
+ appraise "rubocop-0.35.1" do
28
+ gem "rubocop", "0.35.1"
29
+ end
data/Gemfile CHANGED
@@ -6,3 +6,7 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
6
 
7
7
  # Specify your gem's dependencies in rubocop_lineup.gemspec
8
8
  gemspec
9
+
10
+ group :development do
11
+ gem "appraisal"
12
+ end
data/README.md CHANGED
@@ -1,37 +1,66 @@
1
1
  # RubocopLineup
2
2
 
3
- TODO: Delete this and the text above, and describe your gem
3
+ [![Build Status](https://travis-ci.com/mysterysci/rubocop_lineup.svg?branch=master)](https://travis-ci.com/mysterysci/rubocop_lineup)
4
+
5
+ ![Image of Old-Timey Police Lineup](https://upload.wikimedia.org/wikipedia/commons/0/04/Oppstilling-2.jpg)
6
+
7
+ If yer trying to bring in a new sheriff to the wild, wild west of your legacy codebase,
8
+ there's gonna be some outlaws that are just too ornery to contend with. Better to just
9
+ leave those scoundrels be that aren't in your crosshairs and let yer deputies focus on
10
+ what's at hand.
11
+
12
+ This gem presumes yer a-usin' git for yer revisionin' purposes. For now, it also figgers
13
+ yer always branchin' from master, which, I know, I know, that ain't always how ever'body
14
+ out here on the frontier likes to operate, but hey, we're just gettin' started here.
15
+
16
+ Also, you should know goin' in that we're duck punchin' into a sweet spot of the Rubocop
17
+ underbelly, and well, we just may get to fightin' in the future if them Rubocop folk
18
+ get some fancy refactorin' ideas.
19
+
20
+ Not to mention that some o' yer tougher deputies may get sidelined if they need more than
21
+ a changed line to do thar job ... we'll just have to see about all that down the road.
22
+
23
+ I'm not sure how we fell into a old western theme here with a modern robot-type gem, but
24
+ sometimes ... well, sometimes, the bear eats you.
4
25
 
5
26
  ## Installation
6
27
 
7
- Add this line to your application's Gemfile:
28
+ Add this to yer Gemfile:
8
29
 
9
30
  ```ruby
10
31
  gem 'rubocop_lineup'
11
32
  ```
12
33
 
13
- And then execute:
34
+ And then bundle that up:
14
35
 
15
36
  $ bundle
16
37
 
17
- Or install it yourself as:
38
+ Or just put it in with all yer other gems if so inclined:
18
39
 
19
40
  $ gem install rubocop_lineup
20
41
 
21
42
  ## Usage
22
43
 
23
- TODO: Write usage instructions here
44
+ To use it regular-like, add this to the
45
+ [require section](https://github.com/bbatsov/rubocop/blob/master/manual/extensions.md#loading-extensions)
46
+ of .rubocop.yml:
24
47
 
25
- ## Development
26
-
27
- 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.
48
+ ```yaml
49
+ require:
50
+ - rubocop_lineup
51
+ ```
28
52
 
29
- 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).
53
+ If you only need to use it ever' now-n-again, inform yer rubocop with the
54
+ `-r rubocop_lineup` option.
30
55
 
31
56
  ## Contributing
32
57
 
33
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/rubocop_lineup.
58
+ We'd appreciate hearin' some of yer good ideas about our lil project here, and maybe
59
+ even if'in you have a problemo or two with it, you might could get some help here
60
+ with that. Mosey over to the project at https://github.com/mysterysci/rubocop_lineup
61
+ and have a shot or two with us.
34
62
 
35
63
  ## License
36
64
 
37
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
65
+ This gem is one o' them open source deals, and our danged lawyers told us we should
66
+ refer you to this here pronouncement: [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file was generated by Appraisal
4
+
5
+ source "https://rubygems.org"
6
+
7
+ gem "rubocop", "0.35.1"
8
+
9
+ group :development do
10
+ gem "appraisal"
11
+ end
12
+
13
+ gemspec path: "../"
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file was generated by Appraisal
4
+
5
+ source "https://rubygems.org"
6
+
7
+ gem "rubocop", "0.46.0"
8
+
9
+ group :development do
10
+ gem "appraisal"
11
+ end
12
+
13
+ gemspec path: "../"
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file was generated by Appraisal
4
+
5
+ source "https://rubygems.org"
6
+
7
+ gem "rubocop", "0.52.1"
8
+
9
+ group :development do
10
+ gem "appraisal"
11
+ end
12
+
13
+ gemspec path: "../"
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file was generated by Appraisal
4
+
5
+ source "https://rubygems.org"
6
+
7
+ gem "rubocop", "0.56.0"
8
+
9
+ group :development do
10
+ gem "appraisal"
11
+ end
12
+
13
+ gemspec path: "../"
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file was generated by Appraisal
4
+
5
+ source "https://rubygems.org"
6
+
7
+ gem "rubocop", "0.58.2"
8
+
9
+ group :development do
10
+ gem "appraisal"
11
+ end
12
+
13
+ gemspec path: "../"
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file was generated by Appraisal
4
+
5
+ source "https://rubygems.org"
6
+
7
+ gem "rubocop", "0.69.0"
8
+
9
+ group :development do
10
+ gem "appraisal"
11
+ end
12
+
13
+ gemspec path: "../"
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file was generated by Appraisal
4
+
5
+ source "https://rubygems.org"
6
+
7
+ gem "rubocop"
8
+
9
+ group :development do
10
+ gem "appraisal"
11
+ end
12
+
13
+ gemspec path: "../"
@@ -3,7 +3,8 @@
3
3
  require "rubocop_lineup/version"
4
4
  require "rubocop_lineup/line_number_calculator"
5
5
  require "rubocop_lineup/diff_liner"
6
- require "rubocop_lineup/monkey_patch_rubocop"
6
+ require "rubocop_lineup/duck_punch_rubocop"
7
+ require "yaml"
7
8
 
8
9
  module RubocopLineup
9
10
  # This defaults the parent branch to 'master'. This is a reasonable
@@ -12,18 +13,20 @@ module RubocopLineup
12
13
  # parent branch. There are ways to calculate the parent branch name
13
14
  # that cover common cases, but that's more complicated and may be added
14
15
  # in a future version.
15
- def self.line_em_up(directory, parent_branch = "master")
16
+ def self.line_em_up(directory, base_branch = nil)
17
+ base_branch ||= base_branch_from_config || "master"
18
+
16
19
  @line_em_up ||= begin
17
20
  Dir.chdir(directory) do
18
- uncommitted_changes = DiffLiner.diff_uncommitted.changed_line_numbers
19
- committed_changes_on_branch = DiffLiner.diff_branch(parent_branch).changed_line_numbers
21
+ uncommitted = DiffLiner.diff_uncommitted.file_line_changes
22
+ committed_on_branch = DiffLiner.diff_branch(base_branch).file_line_changes
20
23
 
21
24
  # When a file has committed changes AND uncommitted_changes,
22
25
  # we will only include the lines from the uncommitted changes
23
26
  # because the lines in the previous committed changes may not
24
27
  # be accurate anymore. See test suite for a sample case.
25
28
 
26
- committed_changes_on_branch.merge(uncommitted_changes)
29
+ committed_on_branch.merge(uncommitted)
27
30
  end
28
31
  end
29
32
  end
@@ -31,4 +34,16 @@ module RubocopLineup
31
34
  def self.reset
32
35
  @line_em_up = nil
33
36
  end
37
+
38
+ def self.rubocop_lineup_config_file
39
+ ".rubocop_lineup.yml"
40
+ end
41
+
42
+ def self.base_branch_from_config
43
+ return unless File.exist?(rubocop_lineup_config_file)
44
+
45
+ settings = YAML.load_file(rubocop_lineup_config_file)
46
+
47
+ settings[:base_branch]
48
+ end
34
49
  end
@@ -6,11 +6,11 @@ module RubocopLineup
6
6
  # This class depends on git diffs generated the with -U0 option.
7
7
  class DiffLiner
8
8
  def self.diff_uncommitted(dir = Dir.pwd)
9
- new(diff_from(dir, "HEAD"))
9
+ new(diff_from(dir, "HEAD"), dir)
10
10
  end
11
11
 
12
12
  def self.diff_branch(parent_branch, dir = Dir.pwd)
13
- new(diff_from(dir, "#{parent_branch}..."))
13
+ new(diff_from(dir, "#{parent_branch}..."), dir)
14
14
  end
15
15
 
16
16
  def self.diff_from(dir, obj)
@@ -22,26 +22,27 @@ module RubocopLineup
22
22
  end
23
23
 
24
24
  # Expects a Git::Diff instance, which handles parsing diff output into files.
25
- def initialize(diff)
26
- @data = process(diff)
25
+ def initialize(diff, dir)
26
+ @dir = dir
27
+ process(diff)
27
28
  end
28
29
 
29
- def files
30
- @data.keys
30
+ def filenames
31
+ @data_full_paths.keys
31
32
  end
32
33
 
33
- def changed_line_numbers
34
- @data
34
+ def file_line_changes
35
+ @data_full_paths
35
36
  end
36
37
 
37
38
  private
38
39
 
39
40
  def process(diff)
40
- Hash[diff.map { |diff_file| process_diff_file(diff_file) }]
41
+ @data_full_paths = Hash[diff.map { |diff_file| process_diff_file(diff_file) }]
41
42
  end
42
43
 
43
44
  def process_diff_file(diff_file)
44
- [diff_file.path,
45
+ [File.join(@dir, diff_file.path),
45
46
  calc_line_numbers(diff_file.patch.scan(/@@(.*)@@/).flatten)]
46
47
  end
47
48
 
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rubocop"
4
+
5
+ module DuckPunch
6
+ module CommentConfig
7
+ def cop_enabled_at_line?(cop, line_number)
8
+ source_file = processed_source.path
9
+ files_hash = RubocopLineup.line_em_up(Dir.pwd)
10
+ return false unless files_hash.key?(source_file)
11
+
12
+ changed_line_numbers = files_hash[source_file]
13
+ changed_line_numbers.include?(line_number) ? super : false
14
+
15
+ # Removing support for any line of a block where one or more lines were changed.
16
+ # It's too unpredictable. Linter cops should probably never do this, but I'm
17
+ # not sure how to go about that right now.
18
+ #
19
+ # offending_lines = (line_number..(last_line || line_number)).to_a
20
+ # changed_line_numbers = files_hash[source_file]
21
+ # (changed_line_numbers & offending_lines).empty? ? false : super
22
+ end
23
+
24
+ def last_line
25
+ # `loc_end` will be nil in cases like Parser::Source::Map::Collection
26
+ # https://www.rubydoc.info/github/whitequark/parser/Parser/Source/Map/Collection
27
+ # which point to the entire file, but presumably won't have any range
28
+ # cops analyzing it (e.g. Gemfile is like this).
29
+
30
+ loc_end = processed_source.ast.loc.end
31
+ loc_end ? loc_end.line : nil
32
+ end
33
+ end
34
+
35
+ module TargetFinder
36
+ def find(args)
37
+ # returns an array of full file paths that are the files to inspect.
38
+ files = super(args)
39
+ files_hash = RubocopLineup.line_em_up(Dir.pwd)
40
+ files & files_hash.keys
41
+ end
42
+ end
43
+ end
44
+
45
+ RuboCop::CommentConfig.prepend(DuckPunch::CommentConfig)
46
+ RuboCop::TargetFinder.prepend(DuckPunch::TargetFinder)
@@ -6,9 +6,7 @@ module RubocopLineup
6
6
  # presumes the text has been parsed already to just the -/+ bits
7
7
  # e.g. "-1 +1"
8
8
  def self.git_line_summary_to_numbers(text)
9
- # TODO: Ruby Golf this - a regex with proper grouping could probably be better.
10
- _changed, added = text.split(/ /).reject(&:empty?)
11
- start, count = added.sub(/^-/, "").split(/,/).map(&:to_i)
9
+ start, count = text.scan(/\+(.*)/).join.scan(/\d+/).flatten.map(&:to_i)
12
10
  count ||= 1
13
11
  (start..(start + count - 1)).to_a
14
12
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubocopLineup
4
- VERSION = "0.1.1".freeze
4
+ VERSION = "0.5.1"
5
5
  end
@@ -21,12 +21,13 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.required_ruby_version = "~> 2.1"
24
+ spec.required_ruby_version = "~> 2.3"
25
25
 
26
26
  spec.add_dependency "git", "~> 1.3"
27
- spec.add_dependency "rubocop", "~> 0.55"
27
+ spec.add_dependency "rubocop", "~> 0.35"
28
28
 
29
- spec.add_development_dependency "bundler", "~> 1.16"
30
- spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "bundler", "> 1.16"
30
+ spec.add_development_dependency "pry"
31
+ spec.add_development_dependency "rake", "~> 12.3"
31
32
  spec.add_development_dependency "rspec", "~> 3.0"
32
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop_lineup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - chrismo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-11 00:00:00.000000000 Z
11
+ date: 2020-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -30,42 +30,56 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.55'
33
+ version: '0.35'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.55'
40
+ version: '0.35'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.16'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.16'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '10.0'
75
+ version: '12.3'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '10.0'
82
+ version: '12.3'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rspec
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -92,16 +106,24 @@ files:
92
106
  - ".rubocop.yml"
93
107
  - ".ruby-version"
94
108
  - ".travis.yml"
109
+ - Appraisals
95
110
  - Gemfile
96
111
  - LICENSE.txt
97
112
  - README.md
98
113
  - Rakefile
99
114
  - bin/console
100
115
  - bin/setup
116
+ - gemfiles/rubocop_0.35.1.gemfile
117
+ - gemfiles/rubocop_0.46.0.gemfile
118
+ - gemfiles/rubocop_0.52.1.gemfile
119
+ - gemfiles/rubocop_0.56.0.gemfile
120
+ - gemfiles/rubocop_0.58.2.gemfile
121
+ - gemfiles/rubocop_0.69.0.gemfile
122
+ - gemfiles/rubocop_latest.gemfile
101
123
  - lib/rubocop_lineup.rb
102
124
  - lib/rubocop_lineup/diff_liner.rb
125
+ - lib/rubocop_lineup/duck_punch_rubocop.rb
103
126
  - lib/rubocop_lineup/line_number_calculator.rb
104
- - lib/rubocop_lineup/monkey_patch_rubocop.rb
105
127
  - lib/rubocop_lineup/version.rb
106
128
  - rubocop_lineup.gemspec
107
129
  homepage: https://github.com/mysterysci/rubocop_lineup
@@ -116,15 +138,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
138
  requirements:
117
139
  - - "~>"
118
140
  - !ruby/object:Gem::Version
119
- version: '2.1'
141
+ version: '2.3'
120
142
  required_rubygems_version: !ruby/object:Gem::Requirement
121
143
  requirements:
122
144
  - - ">="
123
145
  - !ruby/object:Gem::Version
124
146
  version: '0'
125
147
  requirements: []
126
- rubyforge_project:
127
- rubygems_version: 2.6.14.1
148
+ rubygems_version: 3.0.3
128
149
  signing_key:
129
150
  specification_version: 4
130
151
  summary: Rubocop plugin to restrict cops to only changed lines.
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rubocop"
4
-
5
- module DuckPunch
6
- module CommentConfig
7
- def cop_enabled_at_line?(cop, line_number)
8
- source_file = processed_source.path.sub("#{Dir.pwd}/", "")
9
- files_hash = RubocopLineup.line_em_up(Dir.pwd)
10
- return false unless files_hash.key?(source_file)
11
- changed_line_numbers = files_hash[source_file]
12
- changed_line_numbers.include?(line_number) ? super : false
13
- end
14
- end
15
- end
16
-
17
- RuboCop::CommentConfig.prepend(DuckPunch::CommentConfig)