danger-periphery 0.2.1 → 0.2.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/danger_plugin.rb +76 -11
- data/lib/periphery/installer.rb +46 -0
- data/lib/periphery/json_parser.rb +63 -0
- data/lib/periphery.rb +2 -0
- data/lib/version.rb +1 -1
- metadata +23 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c9c3f228ac9ddf39d67684faca46dfaf969f9576a566a045b2ef0d50a714473
|
4
|
+
data.tar.gz: 7c60528ef9459c67a57c74566f6c76beb8871e04557afde65c8d8a05ffc81db1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f51ab7485b787644820d4df9a87a4b9f2d52be587792c03271a9f2defe8710697f1bc10578fa6ecf49bd2bc596807e79606c6ec888851bf6a8833c9a18a24a5
|
7
|
+
data.tar.gz: 92db186ee32f74f37d38b99787338bfae9101b5b4971f41a051a3bf0e19f2b888db542a735ecb6c9fefe87d7bd88f40d33df1703b9b8782b08c8460bda9f103a
|
data/lib/danger_plugin.rb
CHANGED
@@ -23,6 +23,8 @@ module Danger
|
|
23
23
|
# @return [String]
|
24
24
|
attr_accessor :binary_path
|
25
25
|
|
26
|
+
# @deprecated Use {#scan} with block instead.
|
27
|
+
#
|
26
28
|
# Proc object to process each warnings just before showing them.
|
27
29
|
# The Proc must receive 4 arguments: path, line, column, message
|
28
30
|
# and return one of:
|
@@ -36,17 +38,22 @@ module Danger
|
|
36
38
|
#
|
37
39
|
# By default the Proc returns true.
|
38
40
|
# @return [Proc]
|
39
|
-
|
41
|
+
attr_reader :postprocessor
|
42
|
+
|
43
|
+
# For internal use only.
|
44
|
+
#
|
45
|
+
# @return [Symbol]
|
46
|
+
attr_writer :format
|
40
47
|
|
41
48
|
OPTION_OVERRIDES = {
|
42
49
|
disable_update_check: true,
|
43
|
-
format: 'checkstyle',
|
44
50
|
quiet: true
|
45
51
|
}.freeze
|
46
52
|
|
47
53
|
def initialize(dangerfile)
|
48
54
|
super(dangerfile)
|
49
55
|
@postprocessor = ->(_path, _line, _column, _message) { true }
|
56
|
+
@format = :checkstyle
|
50
57
|
end
|
51
58
|
|
52
59
|
# Scans Swift files.
|
@@ -54,7 +61,7 @@ module Danger
|
|
54
61
|
#
|
55
62
|
# @example Ignore all warnings from files matching regular expression
|
56
63
|
# periphery.scan do |violation|
|
57
|
-
# !
|
64
|
+
# !violation.path.match(/.*\/generated\.swift/)
|
58
65
|
# end
|
59
66
|
#
|
60
67
|
# @param [Hash] options Options passed to Periphery with the following translation rules.
|
@@ -71,10 +78,10 @@ module Danger
|
|
71
78
|
# suppressed, otherwise not.
|
72
79
|
#
|
73
80
|
# @return [void]
|
74
|
-
def scan(
|
75
|
-
output = Periphery::Runner.new(binary_path).scan(options.merge(OPTION_OVERRIDES))
|
81
|
+
def scan(options = {}, &block)
|
82
|
+
output = Periphery::Runner.new(binary_path).scan(options.merge(OPTION_OVERRIDES).merge(format: @format))
|
76
83
|
files = files_in_diff
|
77
|
-
|
84
|
+
parser.parse(output).each do |entry|
|
78
85
|
next unless files.include?(entry.path)
|
79
86
|
|
80
87
|
result = postprocess(entry, &block)
|
@@ -85,18 +92,52 @@ module Danger
|
|
85
92
|
end
|
86
93
|
end
|
87
94
|
|
95
|
+
# @deprecated Use {#scan} with block instead.
|
96
|
+
#
|
88
97
|
# Convenience method to set {#postprocessor} with block.
|
89
98
|
#
|
90
99
|
# @return [Proc]
|
91
|
-
#
|
92
|
-
# @example Ignore all warnings from files matching regular expression
|
93
|
-
# periphery.process_warnings do |path, line, column, message|
|
94
|
-
# ! path.match(/.*\/generated\.swift/)
|
95
|
-
# end
|
96
100
|
def process_warnings(&block)
|
101
|
+
deprecate_in_favor_of_scan
|
97
102
|
@postprocessor = block
|
98
103
|
end
|
99
104
|
|
105
|
+
# @deprecated Use {#scan} with block instead.
|
106
|
+
#
|
107
|
+
# A block to manipulate each warning before it is displayed.
|
108
|
+
#
|
109
|
+
# @param [Proc] postprocessor Block to process each warning just before showing it.
|
110
|
+
# The Proc is called like `postprocessor(path, line, column, message)`
|
111
|
+
# where `path` is a String that indicates the file path the warning points out,
|
112
|
+
# `line` and `column` are Integers that indicates the location in the file,
|
113
|
+
# `message` is a String message body of the warning.
|
114
|
+
# The Proc returns either of the following:
|
115
|
+
# 1. an Array contains `path`, `line`, `column`, `message` in this order.
|
116
|
+
# 2. true
|
117
|
+
# 3. false or nil
|
118
|
+
# If it returns falsy value, the warning will be suppressed.
|
119
|
+
# If it returns `true`, the warning will be displayed as-is.
|
120
|
+
# Otherwise it returns an Array, the warning is newly created by the returned array
|
121
|
+
# and displayed.
|
122
|
+
# @return [void]
|
123
|
+
def postprocessor=(postprocessor)
|
124
|
+
deprecate_in_favor_of_scan
|
125
|
+
@postprocessor = postprocessor
|
126
|
+
end
|
127
|
+
|
128
|
+
# Download and install Periphery executable binary.
|
129
|
+
#
|
130
|
+
# @param [String, Symbol] version The version of Periphery you want to install.
|
131
|
+
# `:latest` is treated as special keyword that specifies the latest version.
|
132
|
+
# @param [String] path The path to install Periphery including the filename itself.
|
133
|
+
# @param [Boolean] force If `true`, an existing file will be overwritten. Otherwise an error occurs.
|
134
|
+
# @return [void]
|
135
|
+
def install(version: :latest, path: 'periphery', force: false)
|
136
|
+
installer = Periphery::Installer.new(version)
|
137
|
+
installer.install(path, force: force)
|
138
|
+
self.binary_path = File.absolute_path(path)
|
139
|
+
end
|
140
|
+
|
100
141
|
private
|
101
142
|
|
102
143
|
def files_in_diff
|
@@ -132,5 +173,29 @@ module Danger
|
|
132
173
|
raise 'Proc passed to postprocessor must return one of nil, true, false and Array that includes 4 elements.'
|
133
174
|
end
|
134
175
|
end
|
176
|
+
|
177
|
+
def deprecate_in_favor_of_scan
|
178
|
+
caller_method_name = caller(1, 1)[0].sub(/.*`(.*)'.*/, '\1')
|
179
|
+
caller_location = caller_locations(2, 1)[0]
|
180
|
+
message = [
|
181
|
+
"`#{self.class}##{caller_method_name}` is deprecated; use `#{self.class}#scan` with block instead. ",
|
182
|
+
'It will be removed from future releases.'
|
183
|
+
].join
|
184
|
+
location_message = "#{self.class}##{caller_method_name} called from #{caller_location}"
|
185
|
+
Kernel.warn("NOTE: #{message}\n#{location_message}")
|
186
|
+
issue_reference = 'See manicmaniac/danger-periphery#37 for detail.'
|
187
|
+
warn("#{message}\n#{issue_reference}", file: caller_location.path, line: caller_location.lineno)
|
188
|
+
end
|
189
|
+
|
190
|
+
def parser
|
191
|
+
case @format
|
192
|
+
when :checkstyle
|
193
|
+
Periphery::CheckstyleParser.new
|
194
|
+
when :json
|
195
|
+
Periphery::JsonParser.new
|
196
|
+
else
|
197
|
+
raise "#{@format} is unsupported"
|
198
|
+
end
|
199
|
+
end
|
135
200
|
end
|
136
201
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'net/http'
|
5
|
+
require 'open-uri'
|
6
|
+
require 'rubygems/version'
|
7
|
+
require 'zip'
|
8
|
+
|
9
|
+
module Periphery
|
10
|
+
# Downloads Periphery binary executable and install it to the specified path.
|
11
|
+
class Installer
|
12
|
+
def initialize(version_spec)
|
13
|
+
@version_spec = version_spec
|
14
|
+
end
|
15
|
+
|
16
|
+
def install(dest_path, force: false)
|
17
|
+
URI.parse(download_url).open do |src|
|
18
|
+
entry = Zip::File.open_buffer(src).get_entry('periphery')
|
19
|
+
entry.restore_permissions = true
|
20
|
+
FileUtils.rm_f(dest_path) if force
|
21
|
+
entry.extract(dest_path)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def version
|
26
|
+
@version ||= @version_spec == :latest ? fetch_latest_version : @version_spec
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def download_url
|
32
|
+
if Gem::Version.new(version) >= Gem::Version.new('2.14.0')
|
33
|
+
"https://github.com/peripheryapp/periphery/releases/download/#{version}/periphery-#{version}.zip"
|
34
|
+
else
|
35
|
+
"https://github.com/peripheryapp/periphery/releases/download/#{version}/periphery-v#{version}.zip"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def fetch_latest_version
|
40
|
+
Net::HTTP.start('github.com', port: 443, use_ssl: true) do |http|
|
41
|
+
response = http.head('/peripheryapp/periphery/releases/latest')
|
42
|
+
URI.parse(response['location']).path.split('/').last
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'periphery/scan_result'
|
5
|
+
|
6
|
+
module Periphery
|
7
|
+
# Parses JSON formatted output produced by Periphery with +--format=json+ option.
|
8
|
+
class JsonParser
|
9
|
+
def parse(string)
|
10
|
+
JSON.parse(string).map do |entry|
|
11
|
+
path, line, column = parse_location(entry['location'])
|
12
|
+
message = compose_message(*entry.slice('name', 'kind', 'hints', 'modules').values)
|
13
|
+
ScanResult.new(path, line, column, message)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def relative_path(path, base = Pathname.getwd)
|
20
|
+
Pathname.new(path).relative_path_from(base).to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
# Parses a string like '/path/to/file.swift:19:10'
|
24
|
+
def parse_location(location)
|
25
|
+
location.scan(/^(.+):(\d+):(\d+)$/) do |path, line, column|
|
26
|
+
return [relative_path(path), line.to_i, column.to_i]
|
27
|
+
end
|
28
|
+
raise ArgumentError, "#{location} is not in a valid format"
|
29
|
+
end
|
30
|
+
|
31
|
+
def compose_message(name, kind, hints, modules = [])
|
32
|
+
return 'unused' unless name
|
33
|
+
|
34
|
+
# Assumes hints contains only one item.
|
35
|
+
# https://github.com/peripheryapp/periphery/blob/2.9.0/Sources/Frontend/Formatters/JsonFormatter.swift#L27
|
36
|
+
# https://github.com/peripheryapp/periphery/blob/2.9.0/Sources/Frontend/Formatters/JsonFormatter.swift#L42
|
37
|
+
hint = hints[0]
|
38
|
+
+"#{display_name(kind).capitalize} '#{name}' #{describe_hint(hint, modules)}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def display_name(kind)
|
42
|
+
case kind
|
43
|
+
when 'enumelement' then 'enum case'
|
44
|
+
when 'function.constructor' then 'initializer'
|
45
|
+
when 'var.parameter' then 'parameter'
|
46
|
+
when 'generic_type_param' then 'generic type parameter'
|
47
|
+
when nil then ''
|
48
|
+
else kind.start_with?('var') ? 'property' : kind.split('.', 2)[0]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def describe_hint(hint, modules)
|
53
|
+
case hint
|
54
|
+
when 'unused' then 'is unused'
|
55
|
+
when 'assignOnlyProperty' then 'is assigned, but never used'
|
56
|
+
when 'redundantProtocol' then "is redundant as it's never used as an existential type"
|
57
|
+
when 'redundantConformance' then 'conformance is redundant'
|
58
|
+
when 'redundantPublicAccessibility' then "is declared public, but not used outside of #{modules.join(', ')}"
|
59
|
+
else ''
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/periphery.rb
CHANGED
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: danger-periphery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryosuke Ito
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: danger-plugin-api
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubyzip
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
27
41
|
description: A Danger plugin to detect unused codes.
|
28
42
|
email:
|
29
43
|
- rito.0305@gmail.com
|
@@ -34,6 +48,8 @@ files:
|
|
34
48
|
- lib/danger_plugin.rb
|
35
49
|
- lib/periphery.rb
|
36
50
|
- lib/periphery/checkstyle_parser.rb
|
51
|
+
- lib/periphery/installer.rb
|
52
|
+
- lib/periphery/json_parser.rb
|
37
53
|
- lib/periphery/runner.rb
|
38
54
|
- lib/periphery/scan_result.rb
|
39
55
|
- lib/version.rb
|
@@ -42,7 +58,7 @@ licenses:
|
|
42
58
|
- MIT
|
43
59
|
metadata:
|
44
60
|
rubygems_mfa_required: 'true'
|
45
|
-
post_install_message:
|
61
|
+
post_install_message:
|
46
62
|
rdoc_options: []
|
47
63
|
require_paths:
|
48
64
|
- lib
|
@@ -50,15 +66,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
50
66
|
requirements:
|
51
67
|
- - ">="
|
52
68
|
- !ruby/object:Gem::Version
|
53
|
-
version: 2.
|
69
|
+
version: 2.7.0
|
54
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
71
|
requirements:
|
56
72
|
- - ">="
|
57
73
|
- !ruby/object:Gem::Version
|
58
74
|
version: '0'
|
59
75
|
requirements: []
|
60
|
-
rubygems_version: 3.
|
61
|
-
signing_key:
|
76
|
+
rubygems_version: 3.4.6
|
77
|
+
signing_key:
|
62
78
|
specification_version: 4
|
63
79
|
summary: A Danger plugin to detect unused codes.
|
64
80
|
test_files: []
|