danger-ktlint 0.0.1 → 0.0.5

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 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