danger-ktlint 0.0.1 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d6064a2a5865fbe5e26c05835cee98d7bee7ef27d23a0bc816bbd94ec23bf8d
4
- data.tar.gz: ec0b2666a05c67e0a6cd27f284df443a64bdede1bf55e7b68d1609a6a91cb5ea
3
+ metadata.gz: 6235a09ed16dd6946883104ff3263e082b2dd263abfac576e75e91b93c4d6570
4
+ data.tar.gz: 0411f44e31da07ef57984910168a321c6900477ac3c7813d814ff422b75957df
5
5
  SHA512:
6
- metadata.gz: c48682f515b4fc225ce08fc30c6e9b1d044f601a26c60d196a174b4304bc00ff0ed65c5a24f5bcbed78b1b92f2446dee91fa7553c0242b30dec2ba79fe631eef
7
- data.tar.gz: 9cbd237f26685542822fbb6da1e7e058507205acc74f72cf78538d5b7991b37080bce0b2b1aa678ce43603104aadaec9c067667fab9d3bf597f28b1e6c377cee
6
+ metadata.gz: 987202cb3498fa937f394f66ca841662d943bdcab5dda877a8024fc9b3f531de429b81442cb1cdfde66c39b407e631c3ed347c456239195a7f69aeac13a9d037
7
+ data.tar.gz: 0c5e9e33fe77801329fa9a0daba9261d59804887c3e40021fd85e9f2f2c99e95ad0acc95a50b919a0c4f3b600bfeecf77cb1c14173bb49c95f6a21b8947b319b
@@ -0,0 +1,19 @@
1
+ name: test
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ test:
7
+ name: Run spec
8
+ runs-on: ubuntu-latest
9
+
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - uses: ruby/setup-ruby@v1
13
+ with:
14
+ ruby-version: 3.0.1
15
+ bundler-cache: true
16
+ - name: Run spec
17
+ run: |
18
+ bundle exec rspec spec
19
+
data/CHANGELOG.md ADDED
@@ -0,0 +1,22 @@
1
+ ## 0.0.5
2
+
3
+ ### Fixed
4
+
5
+ - Fixed to not check ktlint binary even when skip_task is specified.
6
+
7
+ ## 0.0.4
8
+
9
+ ### Added
10
+ - ktlint task can be skipped by specifing `ktlint.skip_lint = true` and `ktlint.report_file = '...'`
11
+
12
+ ## 0.0.3
13
+ ### Added
14
+ - `limit` parameter to set the maximum number of comments of ktlint results.
15
+
16
+ ## 0.0.2
17
+ ### Added
18
+ - Inline comment feature (`inline_mode: true` with ktlint.lint)
19
+
20
+ ## 0.0.1
21
+ ### Added
22
+ - Run ktlint by ktlint.lint
data/README.md CHANGED
@@ -1,25 +1,60 @@
1
1
  # danger-ktlint
2
2
 
3
- Lint kotlin files using ktlint command lint interface.
3
+ Lint kotlin files only changed files in a pull request using ktlint command lint interface.
4
4
 
5
5
  ## Installation
6
6
 
7
7
  ```ruby
8
- $ gem install danger-ktlint
8
+ gem install danger-ktlint
9
9
  ```
10
10
 
11
11
  ## Usage
12
12
 
13
- You need to install `ktlint` command first, see: https://ktlint.github.io/#getting-started.
13
+ You need to install `ktlint` command and set as executable first, see: https://ktlint.github.io/#getting-started.
14
+
15
+ ```bash
16
+ # Example
17
+ curl --output /usr/local/bin/ktlint -sL https://github.com/pinterest/ktlint/releases/download/$KTLINT_VERSION/ktlint && chmod a+x /usr/local/bin/ktlint
18
+ ```
19
+
20
+ Add this to Dangerfile.
14
21
 
15
22
  ```ruby
16
- # Dangerfile
23
+ ktlint.lint
24
+
25
+ # If you want inline comments, specify `ktlint.lint` with `inline_mode: true`
26
+ # ktlint.lint(inline_mode: true)
27
+ ```
28
+
29
+ ### Options
30
+ #### Set maximum number of comments of ktlint results
31
+
32
+ Default is `nil`, all comments are sent.
33
+
34
+ ```shell
35
+ ktlint.limit = 3
36
+ ktlint.lint
37
+ ```
38
+
39
+ #### Skip ktlint task
40
+
41
+ Default is false.
42
+
43
+ ```shell
44
+ ktlint.skip_lint = true
45
+ # If skip_lint is specified, report_file must also be specified.
46
+ ktlint.report_file = 'result.json'
17
47
  ktlint.lint
18
48
  ```
19
49
 
50
+ ## CHANGELOG
51
+
52
+ See [CHANGELOG.md](https://github.com/mataku/danger-ktlint/blob/master/CHANGELOG.md).
53
+
20
54
  ## TODO
21
55
 
22
56
  - filtering: false (default: filtering: true behavior)
57
+ - Allow plain or html report_file (Currently only JSON is supported.)
23
58
 
24
59
  ## Development
25
60
 
@@ -21,29 +21,18 @@ Gem::Specification.new do |spec|
21
21
  spec.add_runtime_dependency 'danger-plugin-api', '~> 1.0'
22
22
 
23
23
  # General ruby development
24
- spec.add_development_dependency 'bundler', '~> 1.3'
25
- spec.add_development_dependency 'rake', '~> 10.0'
24
+ spec.add_development_dependency 'bundler', '~> 2.0'
25
+ spec.add_development_dependency 'rake'
26
26
 
27
27
  # Testing support
28
28
  spec.add_development_dependency 'rspec', '~> 3.4'
29
29
 
30
30
  # Linting code and docs
31
31
  spec.add_development_dependency "rubocop"
32
- spec.add_development_dependency "yard"
33
32
 
34
33
  # Makes testing easy via `bundle exec guard`
35
34
  spec.add_development_dependency 'guard', '~> 2.14'
36
35
  spec.add_development_dependency 'guard-rspec', '~> 4.7'
37
36
 
38
- # If you want to work on older builds of ruby
39
- spec.add_development_dependency 'listen', '3.0.7'
40
-
41
- # This gives you the chance to run a REPL inside your tests
42
- # via:
43
- #
44
- # require 'pry'
45
- # binding.pry
46
- #
47
- # This will stop test execution and let you inspect the results
48
37
  spec.add_development_dependency 'pry'
49
38
  end
@@ -1,3 +1,3 @@
1
1
  module Ktlint
2
- VERSION = "0.0.1".freeze
2
+ VERSION = "0.0.5".freeze
3
3
  end
data/lib/ktlint/plugin.rb CHANGED
@@ -2,40 +2,104 @@ require 'json'
2
2
 
3
3
  module Danger
4
4
  class DangerKtlint < Plugin
5
+
6
+ class UnexpectedLimitTypeError < StandardError
7
+ end
8
+
5
9
  # TODO: Lint all files if `filtering: false`
6
10
  attr_accessor :filtering
7
11
 
12
+ attr_accessor :skip_lint, :report_file
13
+
14
+ def limit
15
+ @limit ||= nil
16
+ end
17
+
18
+ def limit=(limit)
19
+ if limit != nil && limit.integer?
20
+ @limit = limit
21
+ else
22
+ raise UnexpectedLimitTypeError
23
+ end
24
+ end
25
+
8
26
  # Run ktlint task using command line interface
9
27
  # Will fail if `ktlint` is not installed
10
28
  # Skip lint task if files changed are empty
11
29
  # @return [void]
12
30
  # def lint(inline_mode: false)
13
- def lint
14
- unless ktlint_exists?
15
- fail("Couldn't find ktlint command. Install first.")
31
+ def lint(inline_mode: false)
32
+ targets = target_files(git.added_files + git.modified_files)
33
+
34
+ results = ktlint_results(targets)
35
+ if results.nil? || results.empty?
16
36
  return
17
37
  end
18
38
 
19
- targets = target_files(git.added_files + git.modified_files)
20
- return if targets.empty?
21
-
22
- results = JSON.parse(`ktlint #{targets.join(' ')} --reporter=json --relative`)
23
- return if results.empty?
39
+ if inline_mode
40
+ send_inline_comments(results, targets)
41
+ else
42
+ send_markdown_comment(results, targets)
43
+ end
44
+ end
24
45
 
25
- # if inline_mode
26
- # TODO: Send inline comment
27
- # else
28
- send_markdown_comment(results)
46
+ # Comment to a PR by ktlint result json
47
+ #
48
+ # // Sample ktlint result
49
+ # [
50
+ # {
51
+ # "file": "app/src/main/java/com/mataku/Model.kt",
52
+ # "errors": [
53
+ # {
54
+ # "line": 46,
55
+ # "column": 1,
56
+ # "message": "Unexpected blank line(s) before \"}\"",
57
+ # "rule": "no-blank-line-before-rbrace"
58
+ # }
59
+ # ]
60
+ # }
61
+ # ]
62
+ def send_markdown_comment(results, targets)
63
+ catch(:loop_break) do
64
+ count = 0
65
+ results.each do |result|
66
+ result['errors'].each do |error|
67
+ file_path = relative_file_path(result['file'])
68
+ next unless targets.include?(file_path)
69
+ file = "#{file_path}#L#{error['line']}"
70
+ message = "#{github.html_link(file)}: #{error['message']}"
71
+ fail(message)
72
+ unless limit.nil?
73
+ count += 1
74
+ if count >= limit
75
+ throw(:loop_break)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
29
81
  end
30
82
 
31
- def send_markdown_comment(results)
32
- results.each {|result|
33
- result['errors'].each {|error|
34
- file = "#{result['file']}#L#{error['line']}"
35
- message = "#{github.html_link(file)} has linter issue: #{error['message']}"
36
- fail(message)
37
- }
38
- }
83
+ def send_inline_comments(results, targets)
84
+ catch(:loop_break) do
85
+ count = 0
86
+ results.each do |result|
87
+ result['errors'].each do |error|
88
+ file_path = relative_file_path(result['file'])
89
+ next unless targets.include?(file_path)
90
+
91
+ message = error['message']
92
+ line = error['line']
93
+ fail(message, file: result['file'], line: line)
94
+ unless limit.nil?
95
+ count += 1
96
+ if count >= limit
97
+ throw(:loop_break)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
39
103
  end
40
104
 
41
105
  def target_files(changed_files)
@@ -44,10 +108,47 @@ module Danger
44
108
  end
45
109
  end
46
110
 
111
+ # Make it a relative path so it can compare it to git.added_files
112
+ def relative_file_path(file_path)
113
+ file_path.gsub(/#{pwd}\//, '')
114
+ end
115
+
47
116
  private
48
117
 
118
+ def pwd
119
+ @pwd ||= `pwd`.chomp
120
+ end
121
+
49
122
  def ktlint_exists?
50
123
  system 'which ktlint > /dev/null 2>&1'
51
124
  end
125
+
126
+ def ktlint_results(targets)
127
+ if skip_lint
128
+ # TODO: Allow XML
129
+ if report_file.nil? || report_file.empty?
130
+ fail("If skip_lint is specified, You must specify ktlint report json file with `ktlint.report_file=...` in your Dangerfile.")
131
+ return
132
+ end
133
+
134
+ unless File.exists?(report_file)
135
+ fail("Couldn't find ktlint result json file.\nYou must specify it with `ktlint.report_file=...` in your Dangerfile.")
136
+ return
137
+ end
138
+
139
+ File.open(report_file) do |f|
140
+ JSON.load(f)
141
+ end
142
+ else
143
+ unless ktlint_exists?
144
+ fail("Couldn't find ktlint command. Install first.")
145
+ return
146
+ end
147
+
148
+ return if targets.empty?
149
+
150
+ JSON.parse(`ktlint #{targets.join(' ')} --reporter=json --relative`)
151
+ end
152
+ end
52
153
  end
53
154
  end
@@ -7,6 +7,12 @@
7
7
  "column": 1,
8
8
  "message": "Unexpected blank line(s) before \"}\"",
9
9
  "rule": "no-blank-line-before-rbrace"
10
+ },
11
+ {
12
+ "line": 47,
13
+ "column": 1,
14
+ "message": "Unexpected blank line(s) before \"}\"",
15
+ "rule": "no-blank-line-before-rbrace"
10
16
  }
11
17
  ]
12
18
  }
data/spec/ktlint_spec.rb CHANGED
@@ -9,6 +9,10 @@ module Danger
9
9
  expect(Danger::DangerKtlint.new(nil)).to be_a Danger::Plugin
10
10
  end
11
11
 
12
+ before do
13
+ allow_any_instance_of(Kernel).to receive(:`).with('pwd').and_return('/home/mataku')
14
+ end
15
+
12
16
  describe '#lint' do
13
17
  before do
14
18
  allow_any_instance_of(Danger::DangerfileGitPlugin).to receive(:added_files).and_return(['app/src/main/java/com/mataku/Model.kt'])
@@ -31,11 +35,58 @@ module Danger
31
35
  allow_any_instance_of(Kernel).to receive(:system).with('which ktlint > /dev/null 2>&1').and_return(true)
32
36
  allow_any_instance_of(Kernel).to receive(:`).with('ktlint app/src/main/java/com/mataku/Model.kt --reporter=json --relative').and_return(dummy_ktlint_result)
33
37
  allow_any_instance_of(Danger::DangerfileGitHubPlugin).to receive(:html_link).with('app/src/main/java/com/mataku/Model.kt#L46').and_return("<a href='https://github.com/mataku/android/blob/561827e46167077b5e53515b4b7349b8ae04610b/Model.kt'>Model.kt</a>")
38
+ allow_any_instance_of(Danger::DangerfileGitHubPlugin).to receive(:html_link).with('app/src/main/java/com/mataku/Model.kt#L47').and_return("<a href='https://github.com/mataku/android/blob/561827e46167077b5e53515b4b7349b8ae04610b/Model.kt'>Model.kt</a>")
34
39
  end
35
40
 
36
41
  it 'Sends markdown comment' do
37
42
  plugin.lint
38
- expect(dangerfile.status_report[:errors].size).to eq(1)
43
+ expect(dangerfile.status_report[:errors].size).to eq(2)
44
+ end
45
+ end
46
+
47
+ context 'Ktlint issues were found with inline_mode: true' do
48
+ before do
49
+ allow_any_instance_of(Kernel).to receive(:system).with('which ktlint > /dev/null 2>&1').and_return(true)
50
+ allow_any_instance_of(Kernel).to receive(:`).with('ktlint app/src/main/java/com/mataku/Model.kt --reporter=json --relative').and_return(dummy_ktlint_result)
51
+ end
52
+
53
+ it 'Sends inline comment' do
54
+ plugin.lint(inline_mode: true)
55
+ expect(dangerfile.status_report[:errors].size).to eq(2)
56
+ end
57
+ end
58
+ end
59
+
60
+ describe '#limit' do
61
+ context 'expected limit value is set' do
62
+ it 'raises UnexpectedLimitTypeError' do
63
+ expect { plugin.limit = nil }.to raise_error(DangerKtlint::UnexpectedLimitTypeError)
64
+ end
65
+ end
66
+
67
+ context 'integer value is set to limit' do
68
+ it 'raises no errors' do
69
+ expect { plugin.limit = 1 }.not_to raise_error(DangerKtlint::UnexpectedLimitTypeError)
70
+ end
71
+ end
72
+ end
73
+
74
+ describe '#send_markdown_comment' do
75
+ let(:limit) { 1 }
76
+
77
+ before do
78
+ allow_any_instance_of(Danger::DangerfileGitPlugin).to receive(:added_files).and_return(['app/src/main/java/com/mataku/Model.kt'])
79
+ allow_any_instance_of(Danger::DangerfileGitPlugin).to receive(:modified_files).and_return([])
80
+
81
+ allow_any_instance_of(Kernel).to receive(:system).with('which ktlint > /dev/null 2>&1').and_return(true)
82
+ allow_any_instance_of(Kernel).to receive(:`).with('ktlint app/src/main/java/com/mataku/Model.kt --reporter=json --relative').and_return(dummy_ktlint_result)
83
+ plugin.limit = limit
84
+ end
85
+
86
+ context 'limit is set' do
87
+ it 'equals number of ktlint results to limit' do
88
+ plugin.lint(inline_mode: true)
89
+ expect(dangerfile.status_report[:errors].size).to eq(limit)
39
90
  end
40
91
  end
41
92
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger-ktlint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - mataku
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-12 00:00:00.000000000 Z
11
+ date: 2021-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-plugin-api
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: '2.0'
34
34
  type: :development
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: '1.3'
40
+ version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: '0'
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
- version: '10.0'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: yard
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: guard
99
85
  requirement: !ruby/object:Gem::Requirement
@@ -122,20 +108,6 @@ dependencies:
122
108
  - - "~>"
123
109
  - !ruby/object:Gem::Version
124
110
  version: '4.7'
125
- - !ruby/object:Gem::Dependency
126
- name: listen
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - '='
130
- - !ruby/object:Gem::Version
131
- version: 3.0.7
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - '='
137
- - !ruby/object:Gem::Version
138
- version: 3.0.7
139
111
  - !ruby/object:Gem::Dependency
140
112
  name: pry
141
113
  requirement: !ruby/object:Gem::Requirement
@@ -157,9 +129,10 @@ executables: []
157
129
  extensions: []
158
130
  extra_rdoc_files: []
159
131
  files:
160
- - ".circleci/config.yml"
132
+ - ".github/workflows/test.yml"
161
133
  - ".gitignore"
162
134
  - ".rubocop.yml"
135
+ - CHANGELOG.md
163
136
  - Gemfile
164
137
  - Guardfile
165
138
  - LICENSE.txt
@@ -177,7 +150,7 @@ homepage: https://github.com/mataku/danger-ktlint
177
150
  licenses:
178
151
  - MIT
179
152
  metadata: {}
180
- post_install_message:
153
+ post_install_message:
181
154
  rdoc_options: []
182
155
  require_paths:
183
156
  - lib
@@ -192,9 +165,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
192
165
  - !ruby/object:Gem::Version
193
166
  version: '0'
194
167
  requirements: []
195
- rubyforge_project:
196
- rubygems_version: 2.7.6
197
- signing_key:
168
+ rubygems_version: 3.2.15
169
+ signing_key:
198
170
  specification_version: 4
199
171
  summary: Lint kotlin files using ktlint command line interface.
200
172
  test_files:
data/.circleci/config.yml DELETED
@@ -1,27 +0,0 @@
1
- version: 2
2
- jobs:
3
- build:
4
- docker:
5
- - image: ruby:2.5.3
6
- steps:
7
- - checkout
8
- - restore_cache:
9
- keys:
10
- - v1-dependencies-{{ checksum "Gemfile.lock" }}
11
- # fallback to using the latest cache if no exact match is found
12
- - v1-dependencies-
13
-
14
- - run:
15
- name: Install Dependencies
16
- command: |
17
- bundle install --jobs=4 --path vendor/bundle
18
-
19
- - save_cache:
20
- paths:
21
- - vendor/bundle
22
- key: v1-dependencies-{{ checksum "Gemfile.lock" }}
23
-
24
- - run:
25
- name: Run RSpec
26
- command: |
27
- bundle exec rspec