danger-hlint 0.0.2 → 0.0.3
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 +4 -4
- data/lib/hlint/gem_version.rb +1 -1
- data/lib/hlint/plugin.rb +43 -45
- data/spec/hlint_spec.rb +3 -10
- data/spec/spec_helper.rb +4 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd14c1da49d7c97a0f54878aa2ad2e3f9d7b7485
|
4
|
+
data.tar.gz: 0e03a82a957390f5cef8b47b2e31559d684cbb8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ba752949ec302c3244e0417fc18739231e939cce135c4a77f0041208a9134a316382435634464bcd3c1d702ac9d1ccf6ad392cd5b006e3d0131097f2b045b09
|
7
|
+
data.tar.gz: 4cd241884902f3faa17c8c7764fdedcbbed6998f6d734f035995856a49723c3be76e58bdb4260c80525277e65ff19fe97961cba8dcaf88d943487eda6ab74809
|
data/lib/hlint/gem_version.rb
CHANGED
data/lib/hlint/plugin.rb
CHANGED
@@ -1,53 +1,53 @@
|
|
1
1
|
require 'shellwords'
|
2
2
|
|
3
3
|
module Danger
|
4
|
-
#
|
5
|
-
# be available from within your Dangerfile.
|
4
|
+
# Lint Haskell files inside your project using [HLint](https://github.com/ndmitchell/hlint)
|
6
5
|
#
|
7
|
-
#
|
8
|
-
# the public interface documented. Danger uses [YARD](http://yardoc.org/)
|
9
|
-
# for generating documentation from your plugin source, and you can verify
|
10
|
-
# by running `danger plugins lint` or `bundle exec rake spec`.
|
6
|
+
# @example Lint a list of files
|
11
7
|
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
# @example Ensure people are well warned about merging on Mondays
|
15
|
-
#
|
16
|
-
# danger_hlint.warn_on_mondays
|
8
|
+
# danger_hlint.lint(["Lib.hs"], inline_mode: true:
|
17
9
|
#
|
18
10
|
# @see blender/danger-hlint
|
19
|
-
# @tags
|
11
|
+
# @tags hlint, haskell
|
20
12
|
#
|
21
13
|
class DangerHlint < Plugin
|
22
|
-
|
23
|
-
# The path to the hint/ignore file used by hlint
|
14
|
+
# The list of suggestions found by hlint in JSON format
|
24
15
|
#
|
25
16
|
# @return [String]
|
26
|
-
attr_accessor :
|
17
|
+
attr_accessor :suggestions
|
18
|
+
|
19
|
+
# The list of warnings found by hlint in JSON format
|
20
|
+
#
|
21
|
+
# @return [String]
|
22
|
+
attr_accessor :warnings
|
23
|
+
|
24
|
+
# The list of errors found by hlint in JSON format
|
25
|
+
#
|
26
|
+
# @return [String]
|
27
|
+
attr_accessor :errors
|
27
28
|
|
28
29
|
# Runs hlint on a list of files
|
29
30
|
#
|
30
31
|
# @return [void]
|
31
|
-
def lint(files, inline_mode=false, options={})
|
32
|
-
|
33
|
-
final_options = options.merge({ json: true })
|
32
|
+
def lint(files, inline_mode = false, options = {})
|
33
|
+
final_options = options.merge(json: true)
|
34
34
|
|
35
35
|
issues = files
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
.map { |file| Shellwords.escape(file) }
|
37
|
+
.map { |file| `hlint lint #{file} #{to_hlint_options(final_options)} 2>/dev/null` }
|
38
|
+
.reject { |s| s == '' }
|
39
|
+
.map { |lint_result| JSON.parse(lint_result).flatten }
|
40
|
+
.flatten
|
41
41
|
|
42
|
-
suggestions = issues.select { |issue| issue['severity'] == 'Suggestion' }
|
43
|
-
warnings = issues.select { |issue| issue['severity'] == 'Warning' }
|
44
|
-
errors = issues.select { |issue| issue['severity'] == 'Error' }
|
42
|
+
self.suggestions = issues.select { |issue| issue['severity'] == 'Suggestion' }
|
43
|
+
self.warnings = issues.select { |issue| issue['severity'] == 'Warning' }
|
44
|
+
self.errors = issues.select { |issue| issue['severity'] == 'Error' }
|
45
45
|
|
46
46
|
if inline_mode
|
47
47
|
# Reprt with inline comment
|
48
|
-
send_inline_comment(suggestions,
|
49
|
-
send_inline_comment(warnings,
|
50
|
-
send_inline_comment(errors,
|
48
|
+
send_inline_comment(suggestions, 'warn')
|
49
|
+
send_inline_comment(warnings, 'warn')
|
50
|
+
send_inline_comment(errors, 'fail')
|
51
51
|
|
52
52
|
else
|
53
53
|
# Report if any suggestions, warnings or errors
|
@@ -59,10 +59,9 @@ module Danger
|
|
59
59
|
markdown message
|
60
60
|
end
|
61
61
|
end
|
62
|
-
|
63
62
|
end
|
64
63
|
|
65
|
-
def markdown_issues
|
64
|
+
def markdown_issues(results, heading)
|
66
65
|
message = "#### #{heading}\n\n"
|
67
66
|
|
68
67
|
message << "File | Line | Hint | Found | Suggested\n"
|
@@ -72,8 +71,8 @@ module Danger
|
|
72
71
|
filename = r['file'].split('/').last
|
73
72
|
line = r['startLine']
|
74
73
|
hint = r['hint']
|
75
|
-
from = r['from'].gsub("\n",
|
76
|
-
to = r['to'].gsub("\n",
|
74
|
+
from = r['from'].gsub("\n", '<br />')
|
75
|
+
to = r['to'].gsub("\n", '<br />')
|
77
76
|
|
78
77
|
message << "#{filename} | #{line} | #{hint} | #{from} | #{to}\n"
|
79
78
|
end
|
@@ -81,23 +80,23 @@ module Danger
|
|
81
80
|
message
|
82
81
|
end
|
83
82
|
|
84
|
-
def send_inline_comment
|
85
|
-
|
86
|
-
|
87
|
-
|
83
|
+
def send_inline_comment(results, method)
|
84
|
+
dir = "#{Dir.pwd}/"
|
85
|
+
results.each do |r|
|
86
|
+
filename = r['file'].gsub(dir, '')
|
88
87
|
|
89
|
-
|
90
|
-
|
88
|
+
prompt = r['severity'] == 'Suggestion' || r['severity'] == 'Warning' ? 'Why Not' : ''
|
89
|
+
prompt = r['severity'] == 'Error' ? 'Error description' : prompt
|
91
90
|
|
92
|
-
|
93
|
-
|
94
|
-
|
91
|
+
message = "Found #{r['hint']}\n\n```haskell\n#{r['from']}\n``` \n\n #{prompt} \n\n ```haskell\n#{r['to']}\n```"
|
92
|
+
send(method, message, file: filename, line: r['startLine'])
|
93
|
+
end
|
95
94
|
end
|
96
95
|
|
97
|
-
def to_hlint_options(options={})
|
96
|
+
def to_hlint_options(options = {})
|
98
97
|
options.
|
99
98
|
# filter not null
|
100
|
-
|
99
|
+
reject { |_key, value| value.nil? }.
|
101
100
|
# map booleans arguments equal true
|
102
101
|
map { |key, value| value.is_a?(TrueClass) ? [key, ''] : [key, value] }.
|
103
102
|
# map booleans arguments equal false
|
@@ -113,6 +112,5 @@ module Danger
|
|
113
112
|
end
|
114
113
|
|
115
114
|
private :send_inline_comment, :to_hlint_options, :markdown_issues
|
116
|
-
|
117
115
|
end
|
118
116
|
end
|
data/spec/hlint_spec.rb
CHANGED
@@ -15,22 +15,15 @@ module Danger
|
|
15
15
|
@hlint = @dangerfile.hlint
|
16
16
|
allow(@hlint.git).to receive(:added_files).and_return([])
|
17
17
|
allow(@hlint.git).to receive(:modified_files).and_return([])
|
18
|
-
|
19
|
-
@hlint_response = '[{"module":"HaskellTestFile","decl":"foo","severity":"Warning","hint":"Use concatMap","file":"./HaskellTestFile.hs","startLine":6,"startColumn":10,"endLine":6,"endColumn":28,"from":"concat (map id xs)","to":"concatMap id xs","note":[],"refactorings":"[Replace {rtype = Expr, pos = SrcSpan {startLine = 6, startCol = 10, endLine = 6, endCol = 28}, subts = [(\"f\",SrcSpan {startLine = 6, startCol = 22, endLine = 6, endCol = 24}),(\"x\",SrcSpan {startLine = 6, startCol = 25, endLine = 6, endCol = 27})], orig = \"concatMap f x\"}]"}
|
20
|
-
,{"module":"HaskellTestFile","decl":"foo","severity":"Warning","hint":"Use id","file":"./HaskellTestFile.hs","startLine":6,"startColumn":18,"endLine":6,"endColumn":24,"from":"map id","to":"id","note":[],"refactorings":"[Replace {rtype = Expr, pos = SrcSpan {startLine = 6, startCol = 18, endLine = 6, endCol = 24}, subts = [], orig = \"id\"}]"}]'
|
21
|
-
|
22
18
|
end
|
23
19
|
|
24
20
|
# Some examples for writing tests
|
25
21
|
# You should replace these with your own.
|
26
22
|
|
27
|
-
it
|
28
|
-
|
29
|
-
|
30
|
-
.and_return(@hlint_response)
|
31
|
-
|
23
|
+
it 'collects Warnings' do
|
24
|
+
@hlint.lint([File.expand_path('spec/fixtures/HaskellTestFile.hs')], inline_mode: true)
|
25
|
+
expect(@hlint.warnings).to all(include('severity' => 'Warning'))
|
32
26
|
end
|
33
|
-
|
34
27
|
end
|
35
28
|
end
|
36
29
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'pathname'
|
2
2
|
ROOT = Pathname.new(File.expand_path('../../', __FILE__))
|
3
|
-
|
4
|
-
|
3
|
+
$LOAD_PATH.unshift((ROOT + 'lib').to_s)
|
4
|
+
$LOAD_PATH.unshift((ROOT + 'spec').to_s)
|
5
5
|
|
6
6
|
require 'bundler/setup'
|
7
7
|
require 'pry'
|
@@ -11,7 +11,7 @@ require 'danger'
|
|
11
11
|
|
12
12
|
# Use coloured output, it's the best.
|
13
13
|
RSpec.configure do |config|
|
14
|
-
config.filter_gems_from_backtrace
|
14
|
+
config.filter_gems_from_backtrace 'bundler'
|
15
15
|
config.color = true
|
16
16
|
config.tty = true
|
17
17
|
end
|
@@ -34,7 +34,7 @@ def testing_ui
|
|
34
34
|
|
35
35
|
cork = Cork::Board.new(out: @output)
|
36
36
|
def cork.string
|
37
|
-
out.string.gsub(/\e\[([;\d]+)?m/,
|
37
|
+
out.string.gsub(/\e\[([;\d]+)?m/, '')
|
38
38
|
end
|
39
39
|
cork
|
40
40
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: danger-hlint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tommaso Piazza
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: danger-plugin-api
|