danger-periphery 0.2.1 → 0.2.2

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: 15302ed92faf0a3230ddcb167fe3db0ae2e8c1a51d6551d85a4c2cc37c760dd4
4
- data.tar.gz: 18880214efa7cb5a29ee9b6872688a6eeb19d805e07cad6c445afeeb24f4cad2
3
+ metadata.gz: 1232912ce0ad696e3ea2b34b383fbc70831ccbf0a4294673a5a122c37909d677
4
+ data.tar.gz: 36c2fd6ab1f814f209cb0843db05e3d6c4bcad47360d6695db4968954048590e
5
5
  SHA512:
6
- metadata.gz: 5e33a6b9fa62d733004fb63337fdff4973dd3b38d40a096db0b84a1249bc7789a3612a99a88d31020e22dd6494c3b7d3c953fe721be16347e825a58e8900a177
7
- data.tar.gz: 47a37136e81dc9c4b6fc6b3331e476810e4520503c7fd062714363675926c51525502dc58ef2d610b890ee0d73d731d8ac87910bd8e6ab2f051f47c980b4ac88
6
+ metadata.gz: 67cbcfbbd827ab1f276d5f0f42728cea8a38a018495bbedefd62b441fae2b6e8fd92358269fde43d2d1c8d4e14494f5c3a510dc1c51473a8ac869375d4992f25
7
+ data.tar.gz: 68d40960394c7cba16e2ae6080803b493995641548bfaa31d3f5f0b32761cb47448863c063a7ae9be6b13283682ff6c5c9d4cece0fb200dd33bb0ca17c09dac8
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
- attr_accessor :postprocessor
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
- # ! violation.path.match(/.*\/generated\.swift/)
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(**options, &block)
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
- Periphery::CheckstyleParser.new.parse(output).each do |entry|
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,21 @@ 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
+ def postprocessor=(postprocessor)
106
+ deprecate_in_favor_of_scan
107
+ @postprocessor = postprocessor
108
+ end
109
+
100
110
  private
101
111
 
102
112
  def files_in_diff
@@ -132,5 +142,29 @@ module Danger
132
142
  raise 'Proc passed to postprocessor must return one of nil, true, false and Array that includes 4 elements.'
133
143
  end
134
144
  end
145
+
146
+ def deprecate_in_favor_of_scan
147
+ caller_method_name = caller(1, 1)[0].sub(/.*`(.*)'.*/, '\1')
148
+ caller_location = caller_locations(2, 1)[0]
149
+ message = [
150
+ "`#{self.class}##{caller_method_name}` is deprecated; use `#{self.class}#scan` with block instead. ",
151
+ 'It will be removed from future releases.'
152
+ ].join
153
+ location_message = "#{self.class}##{caller_method_name} called from #{caller_location}"
154
+ Kernel.warn("NOTE: #{message}\n#{location_message}")
155
+ issue_reference = 'See manicmaniac/danger-periphery#37 for detail.'
156
+ warn("#{message}\n#{issue_reference}", file: caller_location.path, line: caller_location.lineno)
157
+ end
158
+
159
+ def parser
160
+ case @format
161
+ when :checkstyle
162
+ Periphery::CheckstyleParser.new
163
+ when :json
164
+ Periphery::JsonParser.new
165
+ else
166
+ raise "#{@format} is unsupported"
167
+ end
168
+ end
135
169
  end
136
170
  end
@@ -0,0 +1,67 @@
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').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)
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)}"
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)
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
+ # FIXME: There's no information about the name of module in JSON output,
59
+ # unlike other formatters can output `outside of FooModule`.
60
+ # This is known problem and may be fixed in future Periphery's release.
61
+ # See the status of https://github.com/peripheryapp/periphery/pull/519
62
+ when 'redundantPublicAccessibility' then 'is declared public, but not used outside of the module'
63
+ else ''
64
+ end
65
+ end
66
+ end
67
+ end
data/lib/periphery.rb CHANGED
@@ -2,3 +2,4 @@
2
2
 
3
3
  require 'periphery/runner'
4
4
  require 'periphery/checkstyle_parser'
5
+ require 'periphery/json_parser'
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DangerPeriphery
4
- VERSION = '0.2.1'
4
+ VERSION = '0.2.2'
5
5
  end
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.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryosuke Ito
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-29 00:00:00.000000000 Z
11
+ date: 2022-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-plugin-api
@@ -34,6 +34,7 @@ files:
34
34
  - lib/danger_plugin.rb
35
35
  - lib/periphery.rb
36
36
  - lib/periphery/checkstyle_parser.rb
37
+ - lib/periphery/json_parser.rb
37
38
  - lib/periphery/runner.rb
38
39
  - lib/periphery/scan_result.rb
39
40
  - lib/version.rb
@@ -57,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
58
  - !ruby/object:Gem::Version
58
59
  version: '0'
59
60
  requirements: []
60
- rubygems_version: 3.0.3.1
61
+ rubygems_version: 3.1.2
61
62
  signing_key:
62
63
  specification_version: 4
63
64
  summary: A Danger plugin to detect unused codes.