rubocop-git2 0.1.4
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 +7 -0
- data/.github/workflows/tests.yml +24 -0
- data/.gitignore +11 -0
- data/.rubocop.yml +20 -0
- data/CHANGELOG.md +34 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +26 -0
- data/README.md +24 -0
- data/Rakefile +16 -0
- data/bin/rubocop-git +5 -0
- data/hound.yml +254 -0
- data/lib/rubocop/git/cli.rb +76 -0
- data/lib/rubocop/git/commit.rb +22 -0
- data/lib/rubocop/git/commit_file.rb +47 -0
- data/lib/rubocop/git/diff_parser.rb +31 -0
- data/lib/rubocop/git/file_violation.rb +5 -0
- data/lib/rubocop/git/line.rb +8 -0
- data/lib/rubocop/git/options.rb +94 -0
- data/lib/rubocop/git/patch.rb +36 -0
- data/lib/rubocop/git/pseudo_pull_request.rb +36 -0
- data/lib/rubocop/git/pseudo_resource.rb +24 -0
- data/lib/rubocop/git/runner.rb +75 -0
- data/lib/rubocop/git/style_checker.rb +43 -0
- data/lib/rubocop/git/style_guide.rb +91 -0
- data/lib/rubocop/git/version.rb +5 -0
- data/lib/rubocop/git.rb +17 -0
- data/rubocop-git.gemspec +21 -0
- data/test/bad_ruby.txt +3 -0
- data/test/rubocop/git/cli_test.rb +12 -0
- data/test/rubocop/git/options_test.rb +18 -0
- data/test/rubocop/git/runner_test.rb +43 -0
- data/test/test_helper.rb +2 -0
- metadata +95 -0
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: 971494e62d00b8014fc19631734832640325d7cdda40489802c2fae1fd500004
         | 
| 4 | 
            +
              data.tar.gz: 27194c03771bd5855c83331fb25dfdd77e0e507be9f49af740a2021c5a97bcef
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: '009a9ab5e998a0e3e1e837ed28ad773c319f198233c6d7e447c4a09ae793af43297043441730df0b041ff17db35022ed9b6ab9f814cfdc444e1606c381a0ba8c'
         | 
| 7 | 
            +
              data.tar.gz: 2cc49969985c8ff0e9b98d51bf83a4897ef22d0acd224ac946bef250ca3d37280164d64b43f65347a2830739a532e635cd84e2f1c38708e3784008e8a73edecb
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            name: tests
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            on: [push, pull_request]
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            jobs:
         | 
| 6 | 
            +
              build:
         | 
| 7 | 
            +
                runs-on: ubuntu-latest
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                strategy:
         | 
| 10 | 
            +
                  matrix:
         | 
| 11 | 
            +
                    ruby: [ '2.6', '3.2' ]
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                steps:
         | 
| 14 | 
            +
                  - uses: actions/checkout@v3
         | 
| 15 | 
            +
                    with:
         | 
| 16 | 
            +
                      fetch-depth: 0 # i.e. full history, needed for tests
         | 
| 17 | 
            +
                  - name: Set up Ruby ${{ matrix.ruby }}
         | 
| 18 | 
            +
                    uses: ruby/setup-ruby@v1
         | 
| 19 | 
            +
                    with:
         | 
| 20 | 
            +
                      ruby-version: ${{ matrix.ruby }}
         | 
| 21 | 
            +
                  - name: Install dependencies
         | 
| 22 | 
            +
                    run: bundle install --jobs 4
         | 
| 23 | 
            +
                  - name: Test with Rake
         | 
| 24 | 
            +
                    run: bundle exec rake
         | 
    
        data/.gitignore
    ADDED
    
    
    
        data/.rubocop.yml
    ADDED
    
    | @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            AllCops:
         | 
| 2 | 
            +
              NewCops: enable
         | 
| 3 | 
            +
              TargetRubyVersion: 2.6 # really 2.4, but 2.6 is lowest supported by rubocop
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Layout/DotPosition:
         | 
| 6 | 
            +
              Enabled: false
         | 
| 7 | 
            +
            Metrics/BlockLength:
         | 
| 8 | 
            +
              Exclude: ['test/**/*.rb']
         | 
| 9 | 
            +
            Style/Documentation:
         | 
| 10 | 
            +
              Enabled: false
         | 
| 11 | 
            +
            Style/FrozenStringLiteralComment:
         | 
| 12 | 
            +
              Enabled: false
         | 
| 13 | 
            +
            Style/ClassAndModuleChildren:
         | 
| 14 | 
            +
              Enabled: false
         | 
| 15 | 
            +
            Style/IfUnlessModifier:
         | 
| 16 | 
            +
              Enabled: false
         | 
| 17 | 
            +
            Style/SelectByRegexp:
         | 
| 18 | 
            +
              Enabled: false
         | 
| 19 | 
            +
            Style/StringLiterals:
         | 
| 20 | 
            +
              Enabled: false
         | 
    
        data/CHANGELOG.md
    ADDED
    
    | @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            # Changelog
         | 
| 2 | 
            +
            All notable changes to this project will be documented in this file.
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
         | 
| 5 | 
            +
            and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ## [0.1.4] - 2023-03-24
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            First release as `rubocop-git2`.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            ### Added
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            - support for `--only` flag
         | 
| 14 | 
            +
            - support for `--format` flag
         | 
| 15 | 
            +
              - via https://github.com/m4i/rubocop-git/pull/45
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            ### Fixed
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            - fixed many cops erroring ("An error occurred while ... was inspecting ...")
         | 
| 20 | 
            +
            - incompatibility with some git configurations
         | 
| 21 | 
            +
              - c.f. https://github.com/m4i/rubocop-git/issues/20
         | 
| 22 | 
            +
              - via https://github.com/m4i/rubocop-git/pull/32
         | 
| 23 | 
            +
              - fix had been merged into the original repo but was never released
         | 
| 24 | 
            +
            - include and exclude behavior not matching rubocop's
         | 
| 25 | 
            +
              - c.f. https://github.com/m4i/rubocop-git/issues/30
         | 
| 26 | 
            +
              - partially via https://github.com/m4i/rubocop-git/pull/33
         | 
| 27 | 
            +
            - enabled/disabled cops not being respected
         | 
| 28 | 
            +
              - c.f. https://github.com/m4i/rubocop-git/issues/38
         | 
| 29 | 
            +
              - c.f. https://github.com/m4i/rubocop-git/issues/39
         | 
| 30 | 
            +
              - partially via https://github.com/m4i/rubocop-git/pull/47
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            ## [0.1.3] - 2017-04-08
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            Last release of the original `rubocop-git`.
         | 
    
        data/Gemfile
    ADDED
    
    
    
        data/LICENSE.txt
    ADDED
    
    | @@ -0,0 +1,26 @@ | |
| 1 | 
            +
            Copyright (c) 2014 Masaki Takeuchi
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            MIT License
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Permission is hereby granted, free of charge, to any person obtaining
         | 
| 6 | 
            +
            a copy of this software and associated documentation files (the
         | 
| 7 | 
            +
            "Software"), to deal in the Software without restriction, including
         | 
| 8 | 
            +
            without limitation the rights to use, copy, modify, merge, publish,
         | 
| 9 | 
            +
            distribute, sublicense, and/or sell copies of the Software, and to
         | 
| 10 | 
            +
            permit persons to whom the Software is furnished to do so, subject to
         | 
| 11 | 
            +
            the following conditions:
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            The above copyright notice and this permission notice shall be
         | 
| 14 | 
            +
            included in all copies or substantial portions of the Software.
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         | 
| 17 | 
            +
            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         | 
| 18 | 
            +
            MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         | 
| 19 | 
            +
            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
         | 
| 20 | 
            +
            LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
         | 
| 21 | 
            +
            OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
         | 
| 22 | 
            +
            WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            Some code is:
         | 
| 25 | 
            +
            Copyright (c) 2014 thoughtbot, inc.
         | 
| 26 | 
            +
            Released under the MIT License in Hound, https://github.com/thoughtbot/hound
         | 
    
        data/README.md
    ADDED
    
    | @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            **NOTE: this is a drop-in replacement for the unmaintained https://github.com/m4i/rubocop-git**
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            [](http://badge.fury.io/rb/rubocop-git2)
         | 
| 4 | 
            +
            [](https://github.com/jaynetics/rubocop-git2/actions)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            # RuboCop::Git
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            RuboCop for git diff.
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            ## Installation
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            Add or install `rubocop-git2`. NOT YET RELEASED - will happen soon!
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            ## Usage
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                Usage: rubocop-git [options] [[commit] commit]
         | 
| 17 | 
            +
                    -c, --config FILE                Specify configuration file
         | 
| 18 | 
            +
                    -r, --require FILE               Require Ruby file
         | 
| 19 | 
            +
                    -d, --debug                      Display debug info
         | 
| 20 | 
            +
                    -D, --display-cop-names          Display cop names in offense messages
         | 
| 21 | 
            +
                        --only COP1,COP2             Run only specific cops or departments
         | 
| 22 | 
            +
                        --cached                     git diff --cached
         | 
| 23 | 
            +
                        --staged                     synonym of --cached
         | 
| 24 | 
            +
                        --hound                      Hound compatibility mode
         | 
    
        data/Rakefile
    ADDED
    
    | @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            require 'bundler/gem_tasks'
         | 
| 2 | 
            +
            require 'rake/testtask'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            task default: %i[test selftest]
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            Rake::TestTask.new(:test) do |t|
         | 
| 7 | 
            +
              t.libs << 'test'
         | 
| 8 | 
            +
              t.libs << 'lib'
         | 
| 9 | 
            +
              t.test_files = FileList['test/**/*_test.rb']
         | 
| 10 | 
            +
            end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            desc 'Run RuboCop::Git over itself'
         | 
| 13 | 
            +
            task :selftest do
         | 
| 14 | 
            +
              require_relative 'lib/rubocop/git'
         | 
| 15 | 
            +
              RuboCop::Git::Runner.new.run(commits: ['v0.0.4'])
         | 
| 16 | 
            +
            end
         | 
    
        data/bin/rubocop-git
    ADDED
    
    
    
        data/hound.yml
    ADDED
    
    | @@ -0,0 +1,254 @@ | |
| 1 | 
            +
            AllCops:
         | 
| 2 | 
            +
              Exclude:
         | 
| 3 | 
            +
                - db/schema.rb
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            AccessorMethodName:
         | 
| 6 | 
            +
              Enabled: false
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            ActionFilter:
         | 
| 9 | 
            +
              Enabled: false
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            Alias:
         | 
| 12 | 
            +
              Enabled: false
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            ArrayJoin:
         | 
| 15 | 
            +
              Enabled: false
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            AsciiComments:
         | 
| 18 | 
            +
              Enabled: false
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            AsciiIdentifiers:
         | 
| 21 | 
            +
              Enabled: false
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            Attr:
         | 
| 24 | 
            +
              Enabled: false
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            BlockNesting:
         | 
| 27 | 
            +
              Enabled: false
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            CaseEquality:
         | 
| 30 | 
            +
              Enabled: false
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            CharacterLiteral:
         | 
| 33 | 
            +
              Enabled: false
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            ClassAndModuleChildren:
         | 
| 36 | 
            +
              Enabled: false
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            ClassLength:
         | 
| 39 | 
            +
              Enabled: false
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            ClassVars:
         | 
| 42 | 
            +
              Enabled: false
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            CollectionMethods:
         | 
| 45 | 
            +
              PreferredMethods:
         | 
| 46 | 
            +
                find: detect
         | 
| 47 | 
            +
                reduce: inject
         | 
| 48 | 
            +
                collect: map
         | 
| 49 | 
            +
                find_all: select
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            ColonMethodCall:
         | 
| 52 | 
            +
              Enabled: false
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            CommentAnnotation:
         | 
| 55 | 
            +
              Enabled: false
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            CyclomaticComplexity:
         | 
| 58 | 
            +
              Enabled: false
         | 
| 59 | 
            +
             | 
| 60 | 
            +
            Delegate:
         | 
| 61 | 
            +
              Enabled: false
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            DeprecatedHashMethods:
         | 
| 64 | 
            +
              Enabled: false
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            Documentation:
         | 
| 67 | 
            +
              Enabled: false
         | 
| 68 | 
            +
             | 
| 69 | 
            +
            DotPosition:
         | 
| 70 | 
            +
              EnforcedStyle: trailing
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            DoubleNegation:
         | 
| 73 | 
            +
              Enabled: false
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            EachWithObject:
         | 
| 76 | 
            +
              Enabled: false
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            EmptyLiteral:
         | 
| 79 | 
            +
              Enabled: false
         | 
| 80 | 
            +
             | 
| 81 | 
            +
            Encoding:
         | 
| 82 | 
            +
              Enabled: false
         | 
| 83 | 
            +
             | 
| 84 | 
            +
            EvenOdd:
         | 
| 85 | 
            +
              Enabled: false
         | 
| 86 | 
            +
             | 
| 87 | 
            +
            FileName:
         | 
| 88 | 
            +
              Enabled: false
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            FlipFlop:
         | 
| 91 | 
            +
              Enabled: false
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            FormatString:
         | 
| 94 | 
            +
              Enabled: false
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            GlobalVars:
         | 
| 97 | 
            +
              Enabled: false
         | 
| 98 | 
            +
             | 
| 99 | 
            +
            GuardClause:
         | 
| 100 | 
            +
              Enabled: false
         | 
| 101 | 
            +
             | 
| 102 | 
            +
            IfUnlessModifier:
         | 
| 103 | 
            +
              Enabled: false
         | 
| 104 | 
            +
             | 
| 105 | 
            +
            IfWithSemicolon:
         | 
| 106 | 
            +
              Enabled: false
         | 
| 107 | 
            +
             | 
| 108 | 
            +
            Lambda:
         | 
| 109 | 
            +
              Enabled: false
         | 
| 110 | 
            +
             | 
| 111 | 
            +
            LambdaCall:
         | 
| 112 | 
            +
              Enabled: false
         | 
| 113 | 
            +
             | 
| 114 | 
            +
            LineEndConcatenation:
         | 
| 115 | 
            +
              Enabled: false
         | 
| 116 | 
            +
             | 
| 117 | 
            +
            LineLength:
         | 
| 118 | 
            +
              Max: 80
         | 
| 119 | 
            +
             | 
| 120 | 
            +
            MethodLength:
         | 
| 121 | 
            +
              Enabled: false
         | 
| 122 | 
            +
             | 
| 123 | 
            +
            ModuleFunction:
         | 
| 124 | 
            +
              Enabled: false
         | 
| 125 | 
            +
             | 
| 126 | 
            +
            NegatedIf:
         | 
| 127 | 
            +
              Enabled: false
         | 
| 128 | 
            +
             | 
| 129 | 
            +
            NegatedWhile:
         | 
| 130 | 
            +
              Enabled: false
         | 
| 131 | 
            +
             | 
| 132 | 
            +
            NilComparison:
         | 
| 133 | 
            +
              Enabled: false
         | 
| 134 | 
            +
             | 
| 135 | 
            +
            Not:
         | 
| 136 | 
            +
              Enabled: false
         | 
| 137 | 
            +
             | 
| 138 | 
            +
            NumericLiterals:
         | 
| 139 | 
            +
              Enabled: false
         | 
| 140 | 
            +
             | 
| 141 | 
            +
            OneLineConditional:
         | 
| 142 | 
            +
              Enabled: false
         | 
| 143 | 
            +
             | 
| 144 | 
            +
            OpMethod:
         | 
| 145 | 
            +
              Enabled: false
         | 
| 146 | 
            +
             | 
| 147 | 
            +
            ParameterLists:
         | 
| 148 | 
            +
              Enabled: false
         | 
| 149 | 
            +
             | 
| 150 | 
            +
            PercentLiteralDelimiters:
         | 
| 151 | 
            +
              PreferredDelimiters:
         | 
| 152 | 
            +
                '%': '{}'
         | 
| 153 | 
            +
             | 
| 154 | 
            +
            PerlBackrefs:
         | 
| 155 | 
            +
              Enabled: false
         | 
| 156 | 
            +
             | 
| 157 | 
            +
            PredicateName:
         | 
| 158 | 
            +
              NamePrefixBlacklist:
         | 
| 159 | 
            +
                - is_
         | 
| 160 | 
            +
             | 
| 161 | 
            +
            Proc:
         | 
| 162 | 
            +
              Enabled: false
         | 
| 163 | 
            +
             | 
| 164 | 
            +
            RaiseArgs:
         | 
| 165 | 
            +
              Enabled: false
         | 
| 166 | 
            +
             | 
| 167 | 
            +
            RegexpLiteral:
         | 
| 168 | 
            +
              Enabled: false
         | 
| 169 | 
            +
             | 
| 170 | 
            +
            SelfAssignment:
         | 
| 171 | 
            +
              Enabled: false
         | 
| 172 | 
            +
             | 
| 173 | 
            +
            SingleLineBlockParams:
         | 
| 174 | 
            +
              Enabled: false
         | 
| 175 | 
            +
             | 
| 176 | 
            +
            SingleLineMethods:
         | 
| 177 | 
            +
              Enabled: false
         | 
| 178 | 
            +
             | 
| 179 | 
            +
            SignalException:
         | 
| 180 | 
            +
              Enabled: false
         | 
| 181 | 
            +
             | 
| 182 | 
            +
            SpecialGlobalVars:
         | 
| 183 | 
            +
              Enabled: false
         | 
| 184 | 
            +
             | 
| 185 | 
            +
            StringLiterals:
         | 
| 186 | 
            +
              EnforcedStyle: double_quotes
         | 
| 187 | 
            +
             | 
| 188 | 
            +
            VariableInterpolation:
         | 
| 189 | 
            +
              Enabled: false
         | 
| 190 | 
            +
             | 
| 191 | 
            +
            TrailingComma:
         | 
| 192 | 
            +
              Enabled: false
         | 
| 193 | 
            +
             | 
| 194 | 
            +
            TrivialAccessors:
         | 
| 195 | 
            +
              Enabled: false
         | 
| 196 | 
            +
             | 
| 197 | 
            +
            VariableInterpolation:
         | 
| 198 | 
            +
              Enabled: false
         | 
| 199 | 
            +
             | 
| 200 | 
            +
            WhenThen:
         | 
| 201 | 
            +
              Enabled: false
         | 
| 202 | 
            +
             | 
| 203 | 
            +
            WhileUntilModifier:
         | 
| 204 | 
            +
              Enabled: false
         | 
| 205 | 
            +
             | 
| 206 | 
            +
            WordArray:
         | 
| 207 | 
            +
              Enabled: false
         | 
| 208 | 
            +
             | 
| 209 | 
            +
            # Lint
         | 
| 210 | 
            +
             | 
| 211 | 
            +
            AmbiguousOperator:
         | 
| 212 | 
            +
              Enabled: false
         | 
| 213 | 
            +
             | 
| 214 | 
            +
            AmbiguousRegexpLiteral:
         | 
| 215 | 
            +
              Enabled: false
         | 
| 216 | 
            +
             | 
| 217 | 
            +
            AssignmentInCondition:
         | 
| 218 | 
            +
              Enabled: false
         | 
| 219 | 
            +
             | 
| 220 | 
            +
            ConditionPosition:
         | 
| 221 | 
            +
              Enabled: false
         | 
| 222 | 
            +
             | 
| 223 | 
            +
            DeprecatedClassMethods:
         | 
| 224 | 
            +
              Enabled: false
         | 
| 225 | 
            +
             | 
| 226 | 
            +
            ElseLayout:
         | 
| 227 | 
            +
              Enabled: false
         | 
| 228 | 
            +
             | 
| 229 | 
            +
            HandleExceptions:
         | 
| 230 | 
            +
              Enabled: false
         | 
| 231 | 
            +
             | 
| 232 | 
            +
            InvalidCharacterLiteral:
         | 
| 233 | 
            +
              Enabled: false
         | 
| 234 | 
            +
             | 
| 235 | 
            +
            LiteralInCondition:
         | 
| 236 | 
            +
              Enabled: false
         | 
| 237 | 
            +
             | 
| 238 | 
            +
            LiteralInInterpolation:
         | 
| 239 | 
            +
              Enabled: false
         | 
| 240 | 
            +
             | 
| 241 | 
            +
            Loop:
         | 
| 242 | 
            +
              Enabled: false
         | 
| 243 | 
            +
             | 
| 244 | 
            +
            ParenthesesAsGroupedExpression:
         | 
| 245 | 
            +
              Enabled: false
         | 
| 246 | 
            +
             | 
| 247 | 
            +
            RequireParentheses:
         | 
| 248 | 
            +
              Enabled: false
         | 
| 249 | 
            +
             | 
| 250 | 
            +
            UnderscorePrefixedVariableName:
         | 
| 251 | 
            +
              Enabled: false
         | 
| 252 | 
            +
             | 
| 253 | 
            +
            Void:
         | 
| 254 | 
            +
              Enabled: false
         | 
| @@ -0,0 +1,76 @@ | |
| 1 | 
            +
            require_relative '../git'
         | 
| 2 | 
            +
            require 'optparse'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module RuboCop
         | 
| 5 | 
            +
              module Git
         | 
| 6 | 
            +
                class CLI
         | 
| 7 | 
            +
                  def run(args = ARGV)
         | 
| 8 | 
            +
                    @options = Options.new
         | 
| 9 | 
            +
                    parse_arguments(args)
         | 
| 10 | 
            +
                    Runner.new.run(@options)
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  private
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def parse_arguments(args)
         | 
| 16 | 
            +
                    @options.commits = option_parser.parse(args)
         | 
| 17 | 
            +
                  rescue OptionParser::InvalidOption, Options::Invalid => ex
         | 
| 18 | 
            +
                    warn "ERROR: #{ex.message}"
         | 
| 19 | 
            +
                    $stderr.puts
         | 
| 20 | 
            +
                    warn option_parser
         | 
| 21 | 
            +
                    exit 1
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def option_parser
         | 
| 25 | 
            +
                    @option_parser ||= OptionParser.new do |opt|
         | 
| 26 | 
            +
                      opt.banner << ' [[commit] commit]'
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                      opt.on('-c', '--config FILE',
         | 
| 29 | 
            +
                             'Specify configuration file') do |config|
         | 
| 30 | 
            +
                        @options.config = config
         | 
| 31 | 
            +
                      end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                      opt.on('-r', '--require FILE',
         | 
| 34 | 
            +
                             'Require Ruby file') do |file|
         | 
| 35 | 
            +
                        require file
         | 
| 36 | 
            +
                      end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                      opt.on('-d', '--debug', 'Display debug info') do
         | 
| 39 | 
            +
                        @options.rubocop[:debug] = true
         | 
| 40 | 
            +
                      end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                      opt.on('-D', '--display-cop-names',
         | 
| 43 | 
            +
                             'Display cop names in offense messages') do
         | 
| 44 | 
            +
                        @options.rubocop[:display_cop_names] = true
         | 
| 45 | 
            +
                      end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                      opt.on('--only COP1,COP2', Array) do |args|
         | 
| 48 | 
            +
                        @options.rubocop[:only] = args
         | 
| 49 | 
            +
                      end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                      opt.on('--cached', 'git diff --cached') do
         | 
| 52 | 
            +
                        @options.cached = true
         | 
| 53 | 
            +
                      end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                      opt.on('--staged', 'synonym of --cached') do
         | 
| 56 | 
            +
                        @options.cached = true
         | 
| 57 | 
            +
                      end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                      opt.on('--hound', 'Hound compatibility mode') do
         | 
| 60 | 
            +
                        @options.hound = true
         | 
| 61 | 
            +
                      end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                      opt.on('-f', '--format FORMAT',
         | 
| 64 | 
            +
                             'Choose an output formatter') do |format|
         | 
| 65 | 
            +
                        @options.format = format
         | 
| 66 | 
            +
                      end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                      opt.on('--version', 'Display version') do
         | 
| 69 | 
            +
                        puts RuboCop::Git::VERSION
         | 
| 70 | 
            +
                        exit 0
         | 
| 71 | 
            +
                      end
         | 
| 72 | 
            +
                    end
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            require 'shellwords'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RuboCop
         | 
| 4 | 
            +
              module Git
         | 
| 5 | 
            +
                # ref. https://github.com/thoughtbot/hound/blob/d2f3933/app/models/commit.rb
         | 
| 6 | 
            +
                class Commit
         | 
| 7 | 
            +
                  def initialize(options)
         | 
| 8 | 
            +
                    @options = options
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def file_content(filename)
         | 
| 12 | 
            +
                    if @options.cached
         | 
| 13 | 
            +
                      `git show :#{filename.shellescape}`
         | 
| 14 | 
            +
                    elsif @options.commit_last
         | 
| 15 | 
            +
                      `git show #{@options.commit_last.shellescape}:#{filename.shellescape}`
         | 
| 16 | 
            +
                    else
         | 
| 17 | 
            +
                      File.read(filename)
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -0,0 +1,47 @@ | |
| 1 | 
            +
            module RuboCop::Git
         | 
| 2 | 
            +
            # c.f. https://github.com/thoughtbot/hound/blob/d2f3933/app/models/commit_file.rb
         | 
| 3 | 
            +
            class CommitFile
         | 
| 4 | 
            +
              def initialize(file, commit)
         | 
| 5 | 
            +
                @file = file
         | 
| 6 | 
            +
                @commit = commit
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              def absolute_path
         | 
| 10 | 
            +
                @file.absolute_path
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              def filename
         | 
| 14 | 
            +
                @file.filename
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              def content
         | 
| 18 | 
            +
                @content ||= begin
         | 
| 19 | 
            +
                  unless removed?
         | 
| 20 | 
            +
                    @commit.file_content(filename)
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              def relevant_line?(line_number)
         | 
| 26 | 
            +
                !modified_line_at(line_number).nil?
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              def removed?
         | 
| 30 | 
            +
                @file.status == 'removed'
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              def modified_lines
         | 
| 34 | 
            +
                @modified_lines ||= patch.changed_lines
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              def modified_line_at(line_number)
         | 
| 38 | 
            +
                modified_lines[line_number]
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              private
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              def patch
         | 
| 44 | 
            +
                Patch.new(@file.patch)
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
            end
         | 
| 47 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            module RuboCop
         | 
| 2 | 
            +
              module Git
         | 
| 3 | 
            +
                class DiffParser
         | 
| 4 | 
            +
                  class << self
         | 
| 5 | 
            +
                    def parse(diff)
         | 
| 6 | 
            +
                      new.parse(diff)
         | 
| 7 | 
            +
                    end
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def parse(diff)
         | 
| 11 | 
            +
                    files    = []
         | 
| 12 | 
            +
                    in_patch = false
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    diff.each_line do |line|
         | 
| 15 | 
            +
                      case line
         | 
| 16 | 
            +
                      when /^diff --git/
         | 
| 17 | 
            +
                        in_patch = false
         | 
| 18 | 
            +
                      when %r{^\+{3} b/(?<path>[^\t\n\r]+)}
         | 
| 19 | 
            +
                        files << PseudoResource.new(Regexp.last_match[:path])
         | 
| 20 | 
            +
                      when /^@@/
         | 
| 21 | 
            +
                        in_patch = true
         | 
| 22 | 
            +
                      end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                      files.last.patch << line if in_patch
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    files
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -0,0 +1,94 @@ | |
| 1 | 
            +
            module RuboCop
         | 
| 2 | 
            +
              module Git
         | 
| 3 | 
            +
                class Options
         | 
| 4 | 
            +
                  class Invalid < StandardError; end
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  HOUND_DEFAULT_CONFIG_FILE =
         | 
| 7 | 
            +
                    File.expand_path('../../../../hound.yml', __FILE__)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  attr_accessor :config
         | 
| 10 | 
            +
                  attr_reader   :cached, :hound, :rubocop, :format
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def initialize(hash_options = nil)
         | 
| 13 | 
            +
                    @config  = nil
         | 
| 14 | 
            +
                    @cached  = false
         | 
| 15 | 
            +
                    @hound   = false
         | 
| 16 | 
            +
                    @format = RuboCop::Formatter::ClangStyleFormatter
         | 
| 17 | 
            +
                    @rubocop = {}
         | 
| 18 | 
            +
                    @commits = []
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    from_hash(hash_options) if hash_options
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def cached=(cached_)
         | 
| 24 | 
            +
                    if cached_ && !@commits.empty?
         | 
| 25 | 
            +
                      fail Invalid, 'cached and commit cannot be specified together'
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                    @cached = !!cached_
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def hound=(hound_)
         | 
| 31 | 
            +
                    @hound = !!hound_
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def rubocop=(rubocop_)
         | 
| 35 | 
            +
                    unless rubocop_.nil? || rubocop_.is_a?(Hash)
         | 
| 36 | 
            +
                      fail Invalid, "invalid rubocop: #{rubocop_.inspect}"
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                    @rubocop = rubocop_.to_h
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  def commits=(commits)
         | 
| 42 | 
            +
                    unless commits.is_a?(Array) && commits.length <= 2
         | 
| 43 | 
            +
                      fail Invalid, "invalid commits: #{commits.inspect}"
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                    if !commits.empty? && cached
         | 
| 46 | 
            +
                      fail Invalid, 'cached and commit cannot be specified together'
         | 
| 47 | 
            +
                    end
         | 
| 48 | 
            +
                    @commits = commits
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  def format=(format)
         | 
| 52 | 
            +
                    formatters =
         | 
| 53 | 
            +
                      RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS
         | 
| 54 | 
            +
                    formatter_key = formatters.keys.find do |key|
         | 
| 55 | 
            +
                      key.start_with?(format)
         | 
| 56 | 
            +
                    end
         | 
| 57 | 
            +
                    @format = formatters[formatter_key] if formatter_key
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  def config_file
         | 
| 61 | 
            +
                    if hound
         | 
| 62 | 
            +
                      HOUND_DEFAULT_CONFIG_FILE
         | 
| 63 | 
            +
                    elsif config
         | 
| 64 | 
            +
                      config
         | 
| 65 | 
            +
                    elsif File.exist?(RuboCop::ConfigLoader::DOTFILE)
         | 
| 66 | 
            +
                      RuboCop::ConfigLoader::DOTFILE
         | 
| 67 | 
            +
                    else
         | 
| 68 | 
            +
                      RuboCop::ConfigLoader::DEFAULT_FILE
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  def commit_first
         | 
| 73 | 
            +
                    @commits.first
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  def commit_last
         | 
| 77 | 
            +
                    @commits.length == 1 ? false : @commits.last
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  private
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                  def from_hash(hash_options)
         | 
| 83 | 
            +
                    hash_options = hash_options.dup
         | 
| 84 | 
            +
                    %w(config cached hound rubocop commits).each do |key|
         | 
| 85 | 
            +
                      value = hash_options.delete(key) || hash_options.delete(key.to_sym)
         | 
| 86 | 
            +
                      public_send("#{key}=", value)
         | 
| 87 | 
            +
                    end
         | 
| 88 | 
            +
                    unless hash_options.empty?
         | 
| 89 | 
            +
                      fail Invalid, "invalid keys: #{hash_options.keys.join(' ')}"
         | 
| 90 | 
            +
                    end
         | 
| 91 | 
            +
                  end
         | 
| 92 | 
            +
                end
         | 
| 93 | 
            +
              end
         | 
| 94 | 
            +
            end
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            module RuboCop::Git
         | 
| 2 | 
            +
            # copy from https://github.com/thoughtbot/hound/blob/5269fa5/app/models/patch.rb
         | 
| 3 | 
            +
            class Patch
         | 
| 4 | 
            +
              RANGE_INFORMATION_LINE = /^@@ .+\+(?<line_number>\d+),/
         | 
| 5 | 
            +
              MODIFIED_LINE = /^\+(?!\+|\+)/
         | 
| 6 | 
            +
              NOT_REMOVED_LINE = /^[^-]/
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def initialize(body)
         | 
| 9 | 
            +
                @body = body || ''
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def changed_lines # rubocop:disable Metrics/MethodLength
         | 
| 13 | 
            +
                line_number = 0
         | 
| 14 | 
            +
                lines.
         | 
| 15 | 
            +
                  each_with_object({}).
         | 
| 16 | 
            +
                  with_index do |(content, hash), patch_position|
         | 
| 17 | 
            +
                  case content
         | 
| 18 | 
            +
                  when RANGE_INFORMATION_LINE
         | 
| 19 | 
            +
                    line_number = Regexp.last_match[:line_number].to_i
         | 
| 20 | 
            +
                  when MODIFIED_LINE
         | 
| 21 | 
            +
                    line = Line.new(content, line_number, patch_position)
         | 
| 22 | 
            +
                    hash[line_number] = line
         | 
| 23 | 
            +
                    line_number += 1
         | 
| 24 | 
            +
                  when NOT_REMOVED_LINE
         | 
| 25 | 
            +
                    line_number += 1
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              private
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              def lines
         | 
| 33 | 
            +
                @body.each_line
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| 36 | 
            +
            end
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            module RuboCop
         | 
| 2 | 
            +
              module Git
         | 
| 3 | 
            +
                # ref. https://github.com/thoughtbot/hound/blob/d2f3933/app/models/pull_request.rb
         | 
| 4 | 
            +
                class PseudoPullRequest
         | 
| 5 | 
            +
                  HOUND_CONFIG_FILE = '.hound.yml'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  def initialize(files, options)
         | 
| 8 | 
            +
                    @files = files
         | 
| 9 | 
            +
                    @options = options
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def pull_request_files
         | 
| 13 | 
            +
                    @files.map do |file|
         | 
| 14 | 
            +
                      build_commit_file(file)
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def config
         | 
| 19 | 
            +
                    return unless @options.hound
         | 
| 20 | 
            +
                    File.read(HOUND_CONFIG_FILE)
         | 
| 21 | 
            +
                  rescue Errno::ENOENT
         | 
| 22 | 
            +
                    nil
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  private
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  def build_commit_file(file)
         | 
| 28 | 
            +
                    CommitFile.new(file, head_commit)
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  def head_commit
         | 
| 32 | 
            +
                    @head_commit ||= Commit.new(@options)
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
            end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            module RuboCop
         | 
| 2 | 
            +
              module Git
         | 
| 3 | 
            +
                class PseudoResource
         | 
| 4 | 
            +
                  attr_reader :patch, :pwd, :file_relative_path
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  alias filename file_relative_path
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  def initialize(file_relative_path, pwd = Dir.pwd)
         | 
| 9 | 
            +
                    @file_relative_path = file_relative_path
         | 
| 10 | 
            +
                    @pwd = pwd
         | 
| 11 | 
            +
                    @patch = ''
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def absolute_path
         | 
| 15 | 
            +
                    filename
         | 
| 16 | 
            +
                    File.join(pwd, filename)
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def status
         | 
| 20 | 
            +
                    'modified'
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,75 @@ | |
| 1 | 
            +
            require 'shellwords'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RuboCop
         | 
| 4 | 
            +
              module Git
         | 
| 5 | 
            +
                # ref. https://github.com/thoughtbot/hound/blob/d2f3933/app/services/build_runner.rb
         | 
| 6 | 
            +
                class Runner
         | 
| 7 | 
            +
                  def initialize(exit_on_offence: true)
         | 
| 8 | 
            +
                    @exit_on_offence = exit_on_offence
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def run(options = {})
         | 
| 12 | 
            +
                    options = Options.new(options) unless options.is_a?(Options)
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    @options = options
         | 
| 15 | 
            +
                    @files = DiffParser.parse(git_diff(options))
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    display_violations($stdout)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    ok = violations_with_valid_offences.none?
         | 
| 20 | 
            +
                    exit(1) if @exit_on_offence && !ok
         | 
| 21 | 
            +
                    ok
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  private
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  def violations
         | 
| 27 | 
            +
                    @violations ||= style_checker.violations
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def violations_with_valid_offences
         | 
| 31 | 
            +
                    @violations_with_valid_offences ||= violations.select { |v| valid_offences(v).any? }
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def valid_offences(violation)
         | 
| 35 | 
            +
                    offenses = violation.offenses
         | 
| 36 | 
            +
                    offenses = offenses.reject(&:disabled?) if offenses.first.respond_to?(:disabled?)
         | 
| 37 | 
            +
                    offenses.compact.sort.freeze
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  def style_checker
         | 
| 41 | 
            +
                    StyleChecker.new(
         | 
| 42 | 
            +
                      pull_request.pull_request_files,
         | 
| 43 | 
            +
                      @options.rubocop,
         | 
| 44 | 
            +
                      @options.config_file,
         | 
| 45 | 
            +
                      pull_request.config
         | 
| 46 | 
            +
                    )
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  def pull_request
         | 
| 50 | 
            +
                    @pull_request ||= PseudoPullRequest.new(@files, @options)
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  def git_diff(options)
         | 
| 54 | 
            +
                    args = %w(diff --diff-filter=AMCR --find-renames --find-copies)
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                    args << '--cached' if options.cached
         | 
| 57 | 
            +
                    args << options.commit_first.shellescape if options.commit_first
         | 
| 58 | 
            +
                    args << options.commit_last.shellescape if options.commit_last
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    `git #{args.join(' ')}`
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  def display_violations(io)
         | 
| 64 | 
            +
                    formatter = @options.format.new(io)
         | 
| 65 | 
            +
                    formatter.started(@files)
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                    violations.map do |violation|
         | 
| 68 | 
            +
                      formatter.file_finished(violation.filename, valid_offences(violation))
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                    formatter.finished(@files.map(&:filename).freeze)
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
            end
         | 
| @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            module RuboCop::Git
         | 
| 2 | 
            +
            # ref. https://github.com/thoughtbot/hound/blob/d2f3933/app/models/style_checker.rb
         | 
| 3 | 
            +
            class StyleChecker
         | 
| 4 | 
            +
              def initialize(modified_files,
         | 
| 5 | 
            +
                             rubocop_options,
         | 
| 6 | 
            +
                             config_file,
         | 
| 7 | 
            +
                             custom_config = nil)
         | 
| 8 | 
            +
                @modified_files = modified_files
         | 
| 9 | 
            +
                @rubocop_options = rubocop_options
         | 
| 10 | 
            +
                @config_file = config_file
         | 
| 11 | 
            +
                @custom_config = custom_config
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              def violations
         | 
| 15 | 
            +
                file_violations = @modified_files.map do |modified_file|
         | 
| 16 | 
            +
                  FileViolation.new(modified_file.absolute_path, offenses(modified_file))
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                file_violations.select do |file_violation|
         | 
| 20 | 
            +
                  file_violation.offenses.any?
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              private
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def offenses(modified_file)
         | 
| 27 | 
            +
                violations = style_guide.violations(modified_file)
         | 
| 28 | 
            +
                violations_on_changed_lines(modified_file, violations)
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              def violations_on_changed_lines(modified_file, violations)
         | 
| 32 | 
            +
                violations.select do |violation|
         | 
| 33 | 
            +
                  modified_file.relevant_line?(violation.line)
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              def style_guide
         | 
| 38 | 
            +
                @style_guide ||= StyleGuide.new(@rubocop_options,
         | 
| 39 | 
            +
                                                @config_file,
         | 
| 40 | 
            +
                                                @custom_config)
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
| 43 | 
            +
            end
         | 
| @@ -0,0 +1,91 @@ | |
| 1 | 
            +
            module RuboCop::Git
         | 
| 2 | 
            +
            # ref. https://github.com/thoughtbot/hound/blob/d2f3933/app/models/style_guide.rb
         | 
| 3 | 
            +
            class StyleGuide
         | 
| 4 | 
            +
              def initialize(rubocop_options, config_file, override_config_content = nil)
         | 
| 5 | 
            +
                @rubocop_options = rubocop_options
         | 
| 6 | 
            +
                @config_file = config_file
         | 
| 7 | 
            +
                @override_config_content = override_config_content
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              def violations(file)
         | 
| 11 | 
            +
                if ignored_file?(file)
         | 
| 12 | 
            +
                  []
         | 
| 13 | 
            +
                else
         | 
| 14 | 
            +
                  parsed_source = parse_source(file)
         | 
| 15 | 
            +
                  team = RuboCop::Cop::Team.new(enabled_cops, config, rubocop_options)
         | 
| 16 | 
            +
                  team.inspect_file(parsed_source)
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              def inspect
         | 
| 21 | 
            +
                "#<#{self.class.name}>"
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              private
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def enabled_cops
         | 
| 27 | 
            +
                registry.enabled(config)
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              def registry
         | 
| 31 | 
            +
                @registry ||= begin
         | 
| 32 | 
            +
                  cops = RuboCop::Cop::Registry.all
         | 
| 33 | 
            +
                  if (only = rubocop_options[:only])
         | 
| 34 | 
            +
                    cops = cops.select { |c| c.match?(only) }
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                  RuboCop::Cop::Registry.new(cops, rubocop_options)
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              def ignored_file?(file)
         | 
| 41 | 
            +
                !included_file?(file) || file.removed? || excluded_file?(file)
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              def included_file?(file)
         | 
| 45 | 
            +
                config.file_to_include?(file.absolute_path)
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              def excluded_file?(file)
         | 
| 49 | 
            +
                config.file_to_exclude?(file.absolute_path)
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              def parse_source(file)
         | 
| 53 | 
            +
                source = RuboCop::ProcessedSource.new(
         | 
| 54 | 
            +
                  file.content,
         | 
| 55 | 
            +
                  config.target_ruby_version,
         | 
| 56 | 
            +
                  file.absolute_path
         | 
| 57 | 
            +
                )
         | 
| 58 | 
            +
                source.config = config
         | 
| 59 | 
            +
                source.registry = registry
         | 
| 60 | 
            +
                source
         | 
| 61 | 
            +
              end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
              def config
         | 
| 64 | 
            +
                @config ||= begin
         | 
| 65 | 
            +
                  config = RuboCop::ConfigLoader.configuration_from_file(@config_file)
         | 
| 66 | 
            +
                  combined_config = RuboCop::ConfigLoader.merge(config, override_config)
         | 
| 67 | 
            +
                  RuboCop::Config.new(combined_config, "")
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
              end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
              def rubocop_options
         | 
| 72 | 
            +
                if config["ShowCopNames"]
         | 
| 73 | 
            +
                  { debug: true }
         | 
| 74 | 
            +
                else
         | 
| 75 | 
            +
                  {}
         | 
| 76 | 
            +
                end.merge(@rubocop_options)
         | 
| 77 | 
            +
              end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
              def override_config
         | 
| 80 | 
            +
                if @override_config_content
         | 
| 81 | 
            +
                  config_content = YAML.load(@override_config_content)
         | 
| 82 | 
            +
                  override_config = RuboCop::Config.new(config_content, "")
         | 
| 83 | 
            +
                  override_config.add_missing_namespaces
         | 
| 84 | 
            +
                  override_config.make_excludes_absolute
         | 
| 85 | 
            +
                  override_config
         | 
| 86 | 
            +
                else
         | 
| 87 | 
            +
                  {}
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
            end
         | 
| 91 | 
            +
            end
         | 
    
        data/lib/rubocop/git.rb
    ADDED
    
    | @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            require_relative 'git/version'
         | 
| 2 | 
            +
            require 'rubocop'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module RuboCop::Git
         | 
| 5 | 
            +
              autoload :Commit,            "#{__dir__}/git/commit"
         | 
| 6 | 
            +
              autoload :CommitFile,        "#{__dir__}/git/commit_file"
         | 
| 7 | 
            +
              autoload :DiffParser,        "#{__dir__}/git/diff_parser"
         | 
| 8 | 
            +
              autoload :FileViolation,     "#{__dir__}/git/file_violation"
         | 
| 9 | 
            +
              autoload :Line,              "#{__dir__}/git/line"
         | 
| 10 | 
            +
              autoload :Options,           "#{__dir__}/git/options"
         | 
| 11 | 
            +
              autoload :Patch,             "#{__dir__}/git/patch"
         | 
| 12 | 
            +
              autoload :PseudoPullRequest, "#{__dir__}/git/pseudo_pull_request"
         | 
| 13 | 
            +
              autoload :PseudoResource,    "#{__dir__}/git/pseudo_resource"
         | 
| 14 | 
            +
              autoload :Runner,            "#{__dir__}/git/runner"
         | 
| 15 | 
            +
              autoload :StyleChecker,      "#{__dir__}/git/style_checker"
         | 
| 16 | 
            +
              autoload :StyleGuide,        "#{__dir__}/git/style_guide"
         | 
| 17 | 
            +
            end
         | 
    
        data/rubocop-git.gemspec
    ADDED
    
    | @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            require File.join(File.expand_path(__dir__), 'lib', 'rubocop', 'git', 'version')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            Gem::Specification.new do |spec|
         | 
| 4 | 
            +
              spec.name          = 'rubocop-git2'
         | 
| 5 | 
            +
              spec.version       = RuboCop::Git::VERSION
         | 
| 6 | 
            +
              spec.authors       = ['Masaki Takeuchi', 'Janosch Müller']
         | 
| 7 | 
            +
              spec.email         = ['janosch84@gmail.com']
         | 
| 8 | 
            +
              spec.summary       = %q{RuboCop for git diff.}
         | 
| 9 | 
            +
              spec.description   = %q{RuboCop for git diff.}
         | 
| 10 | 
            +
              spec.homepage      = 'https://github.com/jaynetics/rubocop-git2'
         | 
| 11 | 
            +
              spec.license       = 'MIT'
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              spec.files         = `git ls-files -z`.split("\x0")
         | 
| 14 | 
            +
              spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
         | 
| 15 | 
            +
              spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
         | 
| 16 | 
            +
              spec.require_paths = ['lib']
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              spec.required_ruby_version = '>= 2.6.0'
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              spec.add_dependency 'rubocop', '~> 1.0'
         | 
| 21 | 
            +
            end
         | 
    
        data/test/bad_ruby.txt
    ADDED
    
    
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            require_relative '../../test_helper'
         | 
| 2 | 
            +
            require 'rubocop/git/cli'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe RuboCop::Git::CLI do
         | 
| 5 | 
            +
              it 'fail with invalid options' do
         | 
| 6 | 
            +
                _ do
         | 
| 7 | 
            +
                  _out, _err = capture_io do
         | 
| 8 | 
            +
                    RuboCop::Git::CLI.new.run(['--gruß'])
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
                end.must_raise(SystemExit)
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
            end
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            require_relative '../../test_helper'
         | 
| 2 | 
            +
            require 'rubocop/git/options'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe RuboCop::Git::Options do
         | 
| 5 | 
            +
              it 'fail with no options' do
         | 
| 6 | 
            +
                _ do
         | 
| 7 | 
            +
                  RuboCop::Git::Options.new({})
         | 
| 8 | 
            +
                end.must_raise(RuboCop::Git::Options::Invalid)
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              it 'can pass string hash options' do
         | 
| 12 | 
            +
                RuboCop::Git::Options.new('rubocop' => {}, 'commits' => [])
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              it 'can pass symbol hash options' do
         | 
| 16 | 
            +
                RuboCop::Git::Options.new(rubocop: {}, commits: [])
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
| @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            require_relative '../../test_helper'
         | 
| 2 | 
            +
            require 'rubocop/git/runner'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe RuboCop::Git::Runner do
         | 
| 5 | 
            +
              it 'exit with violations' do
         | 
| 6 | 
            +
                options = RuboCop::Git::Options.new
         | 
| 7 | 
            +
                options.commits = ["v0.0.4", "v0.0.5"]
         | 
| 8 | 
            +
                _ do
         | 
| 9 | 
            +
                  capture_io do
         | 
| 10 | 
            +
                    RuboCop::Git::Runner.new.run(options)
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end.must_raise(SystemExit)
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              it 'enables cops passed via --only flag' do
         | 
| 16 | 
            +
                options = RuboCop::Git::Options.new
         | 
| 17 | 
            +
                options.commits = ["v0.0.0"]
         | 
| 18 | 
            +
                out, _err = capture_io do
         | 
| 19 | 
            +
                  res = RuboCop::Git::Runner.new(exit_on_offence: false).run(options)
         | 
| 20 | 
            +
                  res.must_equal(false)
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
                _(out).must_match('Style/MutableConstant')
         | 
| 23 | 
            +
                _(out).wont_match('Style/FrozenStringLiteralComment')
         | 
| 24 | 
            +
                _(out).wont_match('bad_ruby.txt') # check that default `Include:` applies
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                options.rubocop[:only] = ['Style/FrozenStringLiteralComment']
         | 
| 27 | 
            +
                out, _err = capture_io do
         | 
| 28 | 
            +
                  res = RuboCop::Git::Runner.new(exit_on_offence: false).run(options)
         | 
| 29 | 
            +
                  res.must_equal(false)
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
                _(out).wont_match('Style/MutableConstant')
         | 
| 32 | 
            +
                _(out).must_match('Style/FrozenStringLiteralComment')
         | 
| 33 | 
            +
                _(out).must_match('Rakefile') # check that default `Include:` applies
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              it 'fail with no options' do
         | 
| 37 | 
            +
                _ do
         | 
| 38 | 
            +
                  _out, _err = capture_io do
         | 
| 39 | 
            +
                    RuboCop::Git::Runner.new.run({})
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
                end.must_raise(RuboCop::Git::Options::Invalid)
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
            end
         | 
    
        data/test/test_helper.rb
    ADDED
    
    
    
        metadata
    ADDED
    
    | @@ -0,0 +1,95 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: rubocop-git2
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.1.4
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - Masaki Takeuchi
         | 
| 8 | 
            +
            - Janosch Müller
         | 
| 9 | 
            +
            autorequire:
         | 
| 10 | 
            +
            bindir: bin
         | 
| 11 | 
            +
            cert_chain: []
         | 
| 12 | 
            +
            date: 2023-03-24 00:00:00.000000000 Z
         | 
| 13 | 
            +
            dependencies:
         | 
| 14 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 15 | 
            +
              name: rubocop
         | 
| 16 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 17 | 
            +
                requirements:
         | 
| 18 | 
            +
                - - "~>"
         | 
| 19 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 20 | 
            +
                    version: '1.0'
         | 
| 21 | 
            +
              type: :runtime
         | 
| 22 | 
            +
              prerelease: false
         | 
| 23 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 24 | 
            +
                requirements:
         | 
| 25 | 
            +
                - - "~>"
         | 
| 26 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 27 | 
            +
                    version: '1.0'
         | 
| 28 | 
            +
            description: RuboCop for git diff.
         | 
| 29 | 
            +
            email:
         | 
| 30 | 
            +
            - janosch84@gmail.com
         | 
| 31 | 
            +
            executables:
         | 
| 32 | 
            +
            - rubocop-git
         | 
| 33 | 
            +
            extensions: []
         | 
| 34 | 
            +
            extra_rdoc_files: []
         | 
| 35 | 
            +
            files:
         | 
| 36 | 
            +
            - ".github/workflows/tests.yml"
         | 
| 37 | 
            +
            - ".gitignore"
         | 
| 38 | 
            +
            - ".rubocop.yml"
         | 
| 39 | 
            +
            - CHANGELOG.md
         | 
| 40 | 
            +
            - Gemfile
         | 
| 41 | 
            +
            - LICENSE.txt
         | 
| 42 | 
            +
            - README.md
         | 
| 43 | 
            +
            - Rakefile
         | 
| 44 | 
            +
            - bin/rubocop-git
         | 
| 45 | 
            +
            - hound.yml
         | 
| 46 | 
            +
            - lib/rubocop/git.rb
         | 
| 47 | 
            +
            - lib/rubocop/git/cli.rb
         | 
| 48 | 
            +
            - lib/rubocop/git/commit.rb
         | 
| 49 | 
            +
            - lib/rubocop/git/commit_file.rb
         | 
| 50 | 
            +
            - lib/rubocop/git/diff_parser.rb
         | 
| 51 | 
            +
            - lib/rubocop/git/file_violation.rb
         | 
| 52 | 
            +
            - lib/rubocop/git/line.rb
         | 
| 53 | 
            +
            - lib/rubocop/git/options.rb
         | 
| 54 | 
            +
            - lib/rubocop/git/patch.rb
         | 
| 55 | 
            +
            - lib/rubocop/git/pseudo_pull_request.rb
         | 
| 56 | 
            +
            - lib/rubocop/git/pseudo_resource.rb
         | 
| 57 | 
            +
            - lib/rubocop/git/runner.rb
         | 
| 58 | 
            +
            - lib/rubocop/git/style_checker.rb
         | 
| 59 | 
            +
            - lib/rubocop/git/style_guide.rb
         | 
| 60 | 
            +
            - lib/rubocop/git/version.rb
         | 
| 61 | 
            +
            - rubocop-git.gemspec
         | 
| 62 | 
            +
            - test/bad_ruby.txt
         | 
| 63 | 
            +
            - test/rubocop/git/cli_test.rb
         | 
| 64 | 
            +
            - test/rubocop/git/options_test.rb
         | 
| 65 | 
            +
            - test/rubocop/git/runner_test.rb
         | 
| 66 | 
            +
            - test/test_helper.rb
         | 
| 67 | 
            +
            homepage: https://github.com/jaynetics/rubocop-git2
         | 
| 68 | 
            +
            licenses:
         | 
| 69 | 
            +
            - MIT
         | 
| 70 | 
            +
            metadata: {}
         | 
| 71 | 
            +
            post_install_message:
         | 
| 72 | 
            +
            rdoc_options: []
         | 
| 73 | 
            +
            require_paths:
         | 
| 74 | 
            +
            - lib
         | 
| 75 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 76 | 
            +
              requirements:
         | 
| 77 | 
            +
              - - ">="
         | 
| 78 | 
            +
                - !ruby/object:Gem::Version
         | 
| 79 | 
            +
                  version: 2.6.0
         | 
| 80 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 81 | 
            +
              requirements:
         | 
| 82 | 
            +
              - - ">="
         | 
| 83 | 
            +
                - !ruby/object:Gem::Version
         | 
| 84 | 
            +
                  version: '0'
         | 
| 85 | 
            +
            requirements: []
         | 
| 86 | 
            +
            rubygems_version: 3.4.1
         | 
| 87 | 
            +
            signing_key:
         | 
| 88 | 
            +
            specification_version: 4
         | 
| 89 | 
            +
            summary: RuboCop for git diff.
         | 
| 90 | 
            +
            test_files:
         | 
| 91 | 
            +
            - test/bad_ruby.txt
         | 
| 92 | 
            +
            - test/rubocop/git/cli_test.rb
         | 
| 93 | 
            +
            - test/rubocop/git/options_test.rb
         | 
| 94 | 
            +
            - test/rubocop/git/runner_test.rb
         | 
| 95 | 
            +
            - test/test_helper.rb
         |