danger-periphery 0.0.1 → 0.1.0

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: 8478fb86f4d5952f88ee7772f352049288bbc5c21f2f5d452ab7b37389b561ec
4
- data.tar.gz: 63c976e46da5ad41bd5797adb3f1ddc83edd5c09f8d607c043757924b3b32cad
3
+ metadata.gz: 151988044c8bd6c18f36c5c44952bea6cba9443defbdbab19b309058b37c50fd
4
+ data.tar.gz: f67a5ec28410926edbd3efd022730fb0f8db0d1a07e77f8319a6c3cfdc241e4c
5
5
  SHA512:
6
- metadata.gz: aeae221bc8e42918a500eb3050b3bd44451a4fa4af5e2e42a77e252a64cfc17ca7213b455af830d26c1c001a0250a2af4e532303b1bce8c5e45dd2b02c817dfb
7
- data.tar.gz: d07fd15ea7105b6fbb875d628771a70c557bbd4066246712e26e5f1599d80d6d42e078d61b22e3c0c30c677105c0da317596a2d3a60595b3f16355193a8bed48
6
+ metadata.gz: 5804a836bd9ea4ac4564fba40e207440b62fd135eb0474d54c9a5c539719e3e9cc1a1e119e1c096c6a08f49a9af59c4aec70bdcfaba4982f54a2e853a413cafa
7
+ data.tar.gz: e22a91d942805d7abc7d4228b27c1caf0926f8a0ce8a5b16048c30c1bae1e42141522b7a13cd63af7598f3c499ed973b608f4a68b6d40193429f2ead4da0c11c
data/.gitignore CHANGED
@@ -2,7 +2,6 @@
2
2
  .idea/
3
3
  .yardoc
4
4
  /tmp
5
- Gemfile.lock
6
5
  bin/lib_InternalSwiftSyntaxParser.dylib
7
6
  bin/periphery
8
7
  pkg
data/Dangerfile CHANGED
@@ -3,6 +3,10 @@
3
3
  rubocop.lint inline_comment: true
4
4
 
5
5
  periphery.binary_path = "bin/periphery"
6
+ periphery.process_warnings do |path, line, column, message|
7
+ !message.match(/unused/i)
8
+ end
9
+
6
10
  periphery.scan(
7
11
  project: "spec/support/fixtures/test.xcodeproj",
8
12
  schemes: "test",
data/Gemfile CHANGED
@@ -2,17 +2,16 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- # Specify your gem's dependencies in danger-periphery.gemspec
6
5
  gemspec
7
6
 
8
7
  gem "bundler", "~> 2.0"
9
8
  gem "danger"
10
9
  gem "danger-rubocop"
11
- gem "guard", "~> 2.14"
12
- gem "guard-rspec", "~> 4.7"
13
- gem "listen", "3.0.7"
10
+ gem "guard"
11
+ gem "guard-rspec"
12
+ gem "listen"
14
13
  gem "pry"
15
- gem "rake", "~> 10.0"
16
- gem "rspec", "~> 3.4"
14
+ gem "rake"
15
+ gem "rspec"
17
16
  gem "rubocop"
18
17
  gem "yard"
data/Gemfile.lock ADDED
@@ -0,0 +1,170 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ danger-periphery (0.1.0)
5
+ danger-plugin-api (~> 1.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ addressable (2.8.0)
11
+ public_suffix (>= 2.0.2, < 5.0)
12
+ ast (2.4.2)
13
+ claide (1.0.3)
14
+ claide-plugins (0.9.2)
15
+ cork
16
+ nap
17
+ open4 (~> 1.3)
18
+ coderay (1.1.3)
19
+ colored2 (3.1.2)
20
+ cork (0.3.0)
21
+ colored2 (~> 3.1)
22
+ danger (8.4.0)
23
+ claide (~> 1.0)
24
+ claide-plugins (>= 0.9.2)
25
+ colored2 (~> 3.1)
26
+ cork (~> 0.1)
27
+ faraday (>= 0.9.0, < 2.0)
28
+ faraday-http-cache (~> 2.0)
29
+ git (~> 1.7)
30
+ kramdown (~> 2.3)
31
+ kramdown-parser-gfm (~> 1.0)
32
+ no_proxy_fix
33
+ octokit (~> 4.7)
34
+ terminal-table (>= 1, < 4)
35
+ danger-plugin-api (1.0.0)
36
+ danger (> 2.0)
37
+ danger-rubocop (0.9.5)
38
+ danger
39
+ rubocop (~> 1.0)
40
+ diff-lcs (1.5.0)
41
+ faraday (1.8.0)
42
+ faraday-em_http (~> 1.0)
43
+ faraday-em_synchrony (~> 1.0)
44
+ faraday-excon (~> 1.1)
45
+ faraday-httpclient (~> 1.0.1)
46
+ faraday-net_http (~> 1.0)
47
+ faraday-net_http_persistent (~> 1.1)
48
+ faraday-patron (~> 1.0)
49
+ faraday-rack (~> 1.0)
50
+ multipart-post (>= 1.2, < 3)
51
+ ruby2_keywords (>= 0.0.4)
52
+ faraday-em_http (1.0.0)
53
+ faraday-em_synchrony (1.0.0)
54
+ faraday-excon (1.1.0)
55
+ faraday-http-cache (2.2.0)
56
+ faraday (>= 0.8)
57
+ faraday-httpclient (1.0.1)
58
+ faraday-net_http (1.0.1)
59
+ faraday-net_http_persistent (1.2.0)
60
+ faraday-patron (1.0.0)
61
+ faraday-rack (1.0.0)
62
+ ffi (1.15.5)
63
+ formatador (1.1.0)
64
+ git (1.9.1)
65
+ rchardet (~> 1.8)
66
+ guard (2.18.0)
67
+ formatador (>= 0.2.4)
68
+ listen (>= 2.7, < 4.0)
69
+ lumberjack (>= 1.0.12, < 2.0)
70
+ nenv (~> 0.1)
71
+ notiffany (~> 0.0)
72
+ pry (>= 0.13.0)
73
+ shellany (~> 0.0)
74
+ thor (>= 0.18.1)
75
+ guard-compat (1.2.1)
76
+ guard-rspec (4.7.3)
77
+ guard (~> 2.1)
78
+ guard-compat (~> 1.1)
79
+ rspec (>= 2.99.0, < 4.0)
80
+ kramdown (2.3.1)
81
+ rexml
82
+ kramdown-parser-gfm (1.1.0)
83
+ kramdown (~> 2.0)
84
+ listen (3.7.1)
85
+ rb-fsevent (~> 0.10, >= 0.10.3)
86
+ rb-inotify (~> 0.9, >= 0.9.10)
87
+ lumberjack (1.2.8)
88
+ method_source (1.0.0)
89
+ multipart-post (2.1.1)
90
+ nap (1.1.0)
91
+ nenv (0.3.0)
92
+ no_proxy_fix (0.1.2)
93
+ notiffany (0.1.3)
94
+ nenv (~> 0.1)
95
+ shellany (~> 0.0)
96
+ octokit (4.21.0)
97
+ faraday (>= 0.9)
98
+ sawyer (~> 0.8.0, >= 0.5.3)
99
+ open4 (1.3.4)
100
+ parallel (1.21.0)
101
+ parser (3.0.2.0)
102
+ ast (~> 2.4.1)
103
+ pry (0.14.1)
104
+ coderay (~> 1.1)
105
+ method_source (~> 1.0)
106
+ public_suffix (4.0.6)
107
+ rainbow (3.0.0)
108
+ rake (13.0.6)
109
+ rb-fsevent (0.11.0)
110
+ rb-inotify (0.10.1)
111
+ ffi (~> 1.0)
112
+ rchardet (1.8.0)
113
+ regexp_parser (2.1.1)
114
+ rexml (3.2.5)
115
+ rspec (3.10.0)
116
+ rspec-core (~> 3.10.0)
117
+ rspec-expectations (~> 3.10.0)
118
+ rspec-mocks (~> 3.10.0)
119
+ rspec-core (3.10.2)
120
+ rspec-support (~> 3.10.0)
121
+ rspec-expectations (3.10.2)
122
+ diff-lcs (>= 1.2.0, < 2.0)
123
+ rspec-support (~> 3.10.0)
124
+ rspec-mocks (3.10.3)
125
+ diff-lcs (>= 1.2.0, < 2.0)
126
+ rspec-support (~> 3.10.0)
127
+ rspec-support (3.10.3)
128
+ rubocop (1.22.1)
129
+ parallel (~> 1.10)
130
+ parser (>= 3.0.0.0)
131
+ rainbow (>= 2.2.2, < 4.0)
132
+ regexp_parser (>= 1.8, < 3.0)
133
+ rexml
134
+ rubocop-ast (>= 1.12.0, < 2.0)
135
+ ruby-progressbar (~> 1.7)
136
+ unicode-display_width (>= 1.4.0, < 3.0)
137
+ rubocop-ast (1.12.0)
138
+ parser (>= 3.0.1.1)
139
+ ruby-progressbar (1.11.0)
140
+ ruby2_keywords (0.0.5)
141
+ sawyer (0.8.2)
142
+ addressable (>= 2.3.5)
143
+ faraday (> 0.8, < 2.0)
144
+ shellany (0.0.1)
145
+ terminal-table (3.0.2)
146
+ unicode-display_width (>= 1.1.1, < 3)
147
+ thor (1.2.1)
148
+ unicode-display_width (2.1.0)
149
+ yard (0.9.26)
150
+
151
+ PLATFORMS
152
+ ruby
153
+ universal-darwin-20
154
+
155
+ DEPENDENCIES
156
+ bundler (~> 2.0)
157
+ danger
158
+ danger-periphery!
159
+ danger-rubocop
160
+ guard
161
+ guard-rspec
162
+ listen
163
+ pry
164
+ rake
165
+ rspec
166
+ rubocop
167
+ yard
168
+
169
+ BUNDLED WITH
170
+ 2.3.6
data/Guardfile CHANGED
@@ -1,21 +1,42 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # A guardfile for making Danger Plugins
4
- # For more info see https://github.com/guard/guard#readme
3
+ module ::Guard
4
+ class Periphery < Plugin
5
+ def initialize(options = {})
6
+ opts = options.dup
7
+ @project = opts.delete(:project)
8
+ @targets = opts.delete(:targets)
9
+ @schemes = opts.delete(:schemes)
10
+ super(opts)
11
+ end
5
12
 
6
- # To run, use `bundle exec guard`.
13
+ def run_on_modifications(_paths)
14
+ command = %W(
15
+ bin/periphery scan
16
+ --project '#{@project}'
17
+ --targets '#{@targets}'
18
+ --schemes '#{@schemes}'
19
+ --format checkstyle
20
+ ).join(" ")
21
+ puts(command)
22
+ system(command)
23
+ end
24
+ end
25
+ end
7
26
 
8
27
  guard :rspec, cmd: "bundle exec rspec" do
9
28
  require "guard/rspec/dsl"
10
29
  dsl = Guard::RSpec::Dsl.new(self)
11
30
 
12
- # RSpec files
13
31
  rspec = dsl.rspec
14
32
  watch(rspec.spec_helper) { rspec.spec_dir }
15
33
  watch(rspec.spec_support) { rspec.spec_dir }
16
34
  watch(rspec.spec_files)
17
35
 
18
- # Ruby files
19
36
  ruby = dsl.ruby
20
37
  dsl.watch_spec_files_for(ruby.lib_files)
21
38
  end
39
+
40
+ guard :periphery, project: "spec/support/fixtures/test.xcodeproj", targets: "test", schemes: "test" do
41
+ watch("spec/support/fixtures/test/main.swift")
42
+ end
data/README.md CHANGED
@@ -1,36 +1,75 @@
1
1
  # danger-periphery
2
2
 
3
+ [![Test](https://github.com/manicmaniac/danger-periphery/actions/workflows/test.yml/badge.svg)](https://github.com/manicmaniac/danger-periphery/actions/workflows/test.yml)
4
+
3
5
  A Danger plugin to detect unused codes.
4
6
 
5
7
  ## Installation
6
8
 
7
9
  You need to install [Periphery](https://github.com/peripheryapp/periphery) beforehand.
8
10
 
9
- Currently `danger-periphery` is in early development stage so it's not published to rubygems.org yet.
10
-
11
11
  Write the following code in your Gemfile.
12
12
 
13
- gem "danger-periphery", git: "https://github.com/manicmaniac/danger-periphery.git"
13
+ ```ruby
14
+ gem "danger-periphery"
15
+ ```
14
16
 
15
17
  ## Usage
16
18
 
17
19
  If you already have `.periphery.yml`, the easiest way to use is just add this to your Dangerfile.
18
20
 
19
- periphery.scan
21
+ ```ruby
22
+ periphery.scan
23
+ ```
20
24
 
21
25
  You can specify the path to executable in this way.
22
26
 
23
- periphery.binary_path = "bin/periphery"
27
+ ```ruby
28
+ periphery.binary_path = "bin/periphery"
29
+ ```
24
30
 
25
31
  You can pass command line options to `periphery.scan` like the following.
26
32
  See `periphery scan -h` for available options.
27
33
 
28
- periphery.scan(
29
- project: "Foo.xcodeproj",
30
- schemes: ["foo", "bar"],
31
- targets: "foo",
32
- clean_build: true
33
- )
34
+ ```ruby
35
+ periphery.scan(
36
+ project: "Foo.xcodeproj",
37
+ schemes: ["foo", "bar"],
38
+ targets: "foo",
39
+ clean_build: true
40
+ )
41
+ ```
42
+
43
+ ## Advanced Usage
44
+
45
+ You can modify warnings as you like by passing a block to `process_warnings`.
46
+ `process_warnings` takes a block that receives `[path, line, column, message]` as arguments and returns one of the following types.
47
+
48
+ - `Array` that exactly contains `[path, line, column, message]`
49
+ - `true`
50
+ - `false`
51
+ - `nil`
52
+
53
+ If an `Array` is returned, danger-periphery uses the values in an array instead of the raw result produced by Periphery.
54
+ `true` has the same meaning as `[path, line, column, message]`, the argument array as-is.
55
+
56
+ If it returns `false` or `nil`, the processing warning will be suppressed.
57
+
58
+ For example, if you want your team members to be careful with warnings, the following code may work.
59
+
60
+ ```ruby
61
+ periphery.process_warnings do |path, line, column, message|
62
+ [path, line, column, "Pay attention please! #{message}"]
63
+ end
64
+ ```
65
+
66
+ Or if you want to suppress all `unused` warnings, to return `nil` or `false` in the block works.
67
+
68
+ ```ruby
69
+ periphery.process_warnings do |path, line, column, message|
70
+ !message.match(/unused/i)
71
+ end
72
+ ```
34
73
 
35
74
  ## Development
36
75
 
data/Rakefile CHANGED
@@ -8,16 +8,10 @@ RSpec::Core::RakeTask.new(:specs)
8
8
 
9
9
  task default: :specs
10
10
 
11
- task :spec do
12
- Rake::Task["specs"].invoke
13
- Rake::Task["rubocop"].invoke
14
- Rake::Task["spec_docs"].invoke
15
- end
11
+ task spec: %i(specs rubocop spec_docs)
16
12
 
17
13
  desc "Run RuboCop on the lib/specs directory"
18
- RuboCop::RakeTask.new(:rubocop) do |task|
19
- task.patterns = ["lib/**/*.rb", "spec/**/*.rb"]
20
- end
14
+ RuboCop::RakeTask.new(:rubocop)
21
15
 
22
16
  desc "Ensure that the plugin passes `danger plugins lint`"
23
17
  task :spec_docs do
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.summary = spec.description
14
14
  spec.homepage = "https://github.com/manicmaniac/danger-periphery"
15
15
  spec.license = "MIT"
16
- spec.required_ruby_version = ">= 2.3.0"
16
+ spec.required_ruby_version = ">= 2.6.0"
17
17
 
18
18
  spec.files = `git ls-files`.split($/)
19
19
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
data/lib/danger_plugin.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "periphery/runner"
4
- require "periphery/scan_log_parser"
3
+ require "periphery"
5
4
 
6
5
  module Danger
7
6
  # Analyze Swift files and detect unused codes in your project.
@@ -24,6 +23,32 @@ module Danger
24
23
  # @return [String]
25
24
  attr_accessor :binary_path
26
25
 
26
+ # Proc object to process each warnings just before showing them.
27
+ # The Proc must receive 4 arguments: path, line, column, message
28
+ # and return one of:
29
+ # - an array that contains 4 elements [path, line, column, message]
30
+ # - true
31
+ # - false
32
+ # - nil
33
+ # If Proc returns an array, the warning will be raised based on returned elements.
34
+ # If Proc returns true, the warning will not be modified.
35
+ # If Proc returns false or nil, the warning will be ignored.
36
+ #
37
+ # By default the Proc returns true.
38
+ # @return [Proc]
39
+ attr_accessor :postprocessor
40
+
41
+ OPTION_OVERRIDES = {
42
+ disable_update_check: true,
43
+ format: "checkstyle",
44
+ quiet: true
45
+ }.freeze
46
+
47
+ def initialize(dangerfile)
48
+ super(dangerfile)
49
+ @postprocessor = ->(path, line, column, message) { true }
50
+ end
51
+
27
52
  # Scans Swift files.
28
53
  # Raises an error when Periphery executable is not found.
29
54
  #
@@ -35,12 +60,27 @@ module Danger
35
60
  # 5. Override some options like --disable-update-check, --format, --quiet and so.
36
61
  # @return [void]
37
62
  def scan(**options)
38
- output = Periphery::Runner.new(binary_path).scan(options.merge(disable_update_check: true, format: "xcode", quiet: true))
39
- entries = Periphery::ScanLogParser.new.parse(output)
63
+ output = Periphery::Runner.new(binary_path).scan(options.merge(OPTION_OVERRIDES))
40
64
  files = files_in_diff
41
- entries.
65
+ Periphery::CheckstyleParser.new.parse(output).
66
+ lazy.
42
67
  select { |entry| files.include?(entry.path) }.
43
- each { |entry| warn(entry.message, file: entry.path, line: entry.line) }
68
+ map { |entry| postprocess(entry) }.
69
+ force.
70
+ compact.
71
+ each { |path, line, column, message| warn(message, file: path, line: line) }
72
+ end
73
+
74
+ # Convenience method to set `postprocessor` with block.
75
+ #
76
+ # @return [Proc]
77
+ #
78
+ # @example Ignore all warnings from files matching regular expression
79
+ # periphery.process_warnings do |path, line, column, message|
80
+ # !path.match(/.*\/generated\.swift/)
81
+ # end
82
+ def process_warnings(&block)
83
+ @postprocessor = block
44
84
  end
45
85
 
46
86
  private
@@ -51,5 +91,18 @@ module Danger
51
91
  post_rename_modified_files = git.modified_files.map { |modified_file| renamed_files_hash[modified_file] || modified_file }
52
92
  (post_rename_modified_files - git.deleted_files) + git.added_files
53
93
  end
94
+
95
+ def postprocess(entry)
96
+ result = @postprocessor.call(entry.path, entry.line, entry.column, entry.message)
97
+ if !result
98
+ nil
99
+ elsif result.kind_of?(TrueClass)
100
+ [entry.path, entry.line, entry.column, entry.message]
101
+ elsif result.kind_of?(Array) && result.size == 4
102
+ result
103
+ else
104
+ raise "Proc passed to postprocessor must return one of nil, true, false and Array that includes 4 elements."
105
+ end
106
+ end
54
107
  end
55
108
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+ require "periphery/scan_result"
5
+ require "rexml/parsers/baseparser"
6
+ require "rexml/parsers/streamparser"
7
+ require "rexml/streamlistener"
8
+
9
+ module Periphery
10
+ class CheckstyleParser
11
+ class Listener
12
+ include REXML::StreamListener
13
+
14
+ attr_reader :results
15
+
16
+ def initialize
17
+ @current_file = nil
18
+ @results = []
19
+ end
20
+
21
+ def tag_start(name, attrs)
22
+ case name
23
+ when "file"
24
+ @current_file = relative_path(attrs["name"])
25
+ when "error"
26
+ if @current_file
27
+ @results << ScanResult.new(
28
+ @current_file,
29
+ attrs["line"].to_i,
30
+ attrs["column"].to_i,
31
+ attrs["message"]
32
+ )
33
+ end
34
+ end
35
+ end
36
+
37
+ def tag_end(name)
38
+ @current_file = nil if name == "file"
39
+ end
40
+
41
+ private
42
+
43
+ def relative_path(path, base = Pathname.getwd)
44
+ Pathname.new(path).relative_path_from(base).to_s
45
+ end
46
+ end
47
+
48
+ def parse(string)
49
+ listener = Listener.new
50
+ REXML::Parsers::StreamParser.new(string, listener).parse
51
+ listener.results
52
+ end
53
+ end
54
+ end
@@ -13,17 +13,21 @@ module Periphery
13
13
  def scan(options)
14
14
  arguments = [binary_path, "scan"] + scan_arguments(options)
15
15
  stdout, stderr, status = Open3.capture3(*arguments)
16
- raise "error: #{arguments} exited with status code #{status.exitstatus}. #{stderr}" unless status.success?
17
-
18
- stdout
16
+ if status.success?
17
+ stdout
18
+ else
19
+ raise "error: #{arguments} exited with status code #{status.exitstatus}. #{stderr}" unless status.success?
20
+ end
19
21
  end
20
22
 
21
23
  def scan_arguments(options)
22
24
  options.
25
+ lazy.
23
26
  select { |_key, value| value }.
24
27
  map { |key, value| value.kind_of?(TrueClass) ? [key, nil] : [key, value] }.
25
28
  map { |key, value| value.kind_of?(Array) ? [key, value.join(",")] : [key, value] }.
26
- map { |key, value| ["--#{key.to_s.tr('_', '-')}", value] }.
29
+ map { |key, value| ["--#{key.to_s.tr('_', '-')}", value&.to_s] }.
30
+ force.
27
31
  flatten.
28
32
  compact
29
33
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Periphery
4
+ ScanResult = Struct.new(:path, :line, :column, :message)
5
+ end
data/lib/periphery.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "periphery/runner"
4
+ require "periphery/checkstyle_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.0.1"
4
+ VERSION = "0.1.0"
5
5
  end
@@ -1,87 +1,145 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path("spec_helper", __dir__)
3
+ describe Danger::DangerPeriphery do
4
+ include DangerPluginHelper
4
5
 
5
- module Danger
6
- describe Danger::DangerPeriphery do
7
- it "should be a plugin" do
8
- expect(Danger::DangerPeriphery.new(nil)).to be_a Danger::Plugin
6
+ it "should be a plugin" do
7
+ expect(Danger::DangerPeriphery.new(nil)).to be_a Danger::Plugin
8
+ end
9
+
10
+ context "with Dangerfile" do
11
+ let(:dangerfile) { testing_dangerfile }
12
+ let(:periphery) { dangerfile.periphery }
13
+
14
+ before do
15
+ periphery.binary_path = binary("periphery")
16
+ json = File.read("#{File.dirname(__FILE__)}/support/fixtures/github_pr.json") # example json: `curl https://api.github.com/repos/danger/danger-plugin-template/pulls/18 > github_pr.json`
17
+ allow(periphery.github).to receive(:pr_json).and_return(json)
18
+ allow(Pathname).to receive(:getwd).and_return fixtures_path
9
19
  end
10
20
 
11
- context "with Dangerfile" do
12
- let(:dangerfile) { testing_dangerfile }
13
- let(:periphery) { dangerfile.periphery }
21
+ context "when periphery is not installed" do
22
+ before { periphery.binary_path = "not_installed" }
23
+
24
+ it "fails with error" do
25
+ expect { periphery.scan }.to raise_error Errno::ENOENT
26
+ end
27
+ end
14
28
 
29
+ context "when .swift files not in diff" do
15
30
  before do
16
- periphery.binary_path = binary("periphery")
17
- json = File.read("#{File.dirname(__FILE__)}/support/fixtures/github_pr.json") # example json: `curl https://api.github.com/repos/danger/danger-plugin-template/pulls/18 > github_pr.json`
18
- allow(periphery.github).to receive(:pr_json).and_return(json)
19
- allow(Pathname).to receive(:getwd).and_return fixtures_path
31
+ allow(periphery.git).to receive(:renamed_files).and_return []
32
+ allow(periphery.git).to receive(:modified_files).and_return []
33
+ allow(periphery.git).to receive(:deleted_files).and_return []
34
+ allow(periphery.git).to receive(:added_files).and_return []
20
35
  end
21
36
 
22
- context "when periphery is not installed" do
23
- before { periphery.binary_path = "not_installed" }
37
+ it "reports nothing" do
38
+ periphery.scan(
39
+ project: fixture("test.xcodeproj"),
40
+ targets: "test",
41
+ schemes: "test"
42
+ )
24
43
 
25
- it "fails with error" do
26
- expect { periphery.scan }.to raise_error Errno::ENOENT
27
- end
44
+ expect(dangerfile.status_report[:warnings]).to be_empty
45
+ end
46
+ end
47
+
48
+ context "when .swift files were added" do
49
+ before do
50
+ allow(periphery.git).to receive(:renamed_files).and_return []
51
+ allow(periphery.git).to receive(:modified_files).and_return []
52
+ allow(periphery.git).to receive(:deleted_files).and_return []
53
+ allow(periphery.git).to receive(:added_files).and_return ["test/main.swift"]
28
54
  end
29
55
 
30
- context "when .swift files not in diff" do
31
- before do
32
- allow(periphery.git).to receive(:renamed_files).and_return []
33
- allow(periphery.git).to receive(:modified_files).and_return []
34
- allow(periphery.git).to receive(:deleted_files).and_return []
35
- allow(periphery.git).to receive(:added_files).and_return []
36
- end
56
+ it "reports unused code" do
57
+ periphery.scan(
58
+ project: fixture("test.xcodeproj"),
59
+ targets: "test",
60
+ schemes: "test"
61
+ )
37
62
 
38
- it "reports nothing" do
39
- periphery.scan(
40
- project: fixture("test.xcodeproj"),
41
- targets: "test",
42
- schemes: "test"
43
- )
63
+ expect(dangerfile.status_report[:warnings]).to include "Function 'unusedMethod()' is unused"
64
+ end
65
+ end
44
66
 
45
- expect(dangerfile.status_report[:warnings]).to be_empty
67
+ context "when .swift files were modified" do
68
+ before do
69
+ allow(periphery.git).to receive(:renamed_files).and_return []
70
+ allow(periphery.git).to receive(:modified_files).and_return ["test/main.swift"]
71
+ allow(periphery.git).to receive(:deleted_files).and_return []
72
+ allow(periphery.git).to receive(:added_files).and_return []
73
+ end
74
+
75
+ it "reports unused code" do
76
+ periphery.scan(
77
+ project: fixture("test.xcodeproj"),
78
+ targets: "test",
79
+ schemes: "test"
80
+ )
81
+
82
+ expect(dangerfile.status_report[:warnings]).to include "Function 'unusedMethod()' is unused"
83
+ end
84
+ end
85
+
86
+ describe "#postprocessor" do
87
+ subject { dangerfile.status_report[:warnings] }
88
+
89
+ before do
90
+ allow(periphery.git).to receive(:renamed_files).and_return []
91
+ allow(periphery.git).to receive(:modified_files).and_return ["test/main.swift"]
92
+ allow(periphery.git).to receive(:deleted_files).and_return []
93
+ allow(periphery.git).to receive(:added_files).and_return []
94
+ periphery.postprocessor = postprocessor
95
+ periphery.scan(
96
+ project: fixture("test.xcodeproj"),
97
+ targets: "test",
98
+ schemes: "test"
99
+ )
100
+ end
101
+
102
+ context "when returns nil" do
103
+ let(:postprocessor) { ->(path, line, column, message) {} }
104
+
105
+ it "does not report warnings" do
106
+ expect(subject).to be_empty
46
107
  end
47
108
  end
48
109
 
49
- context "when .swift files were added" do
50
- before do
51
- allow(periphery.git).to receive(:renamed_files).and_return []
52
- allow(periphery.git).to receive(:modified_files).and_return []
53
- allow(periphery.git).to receive(:deleted_files).and_return []
54
- allow(periphery.git).to receive(:added_files).and_return ["test/main.swift"]
110
+ context "when returns false" do
111
+ let(:postprocessor) { ->(path, line, column, message) { false } }
112
+
113
+ it "does not report warnings" do
114
+ expect(subject).to be_empty
55
115
  end
116
+ end
56
117
 
57
- it "reports unused code" do
58
- periphery.scan(
59
- project: fixture("test.xcodeproj"),
60
- targets: "test",
61
- schemes: "test"
62
- )
118
+ context "when returns true" do
119
+ let(:postprocessor) { ->(path, line, column, message) { true } }
63
120
 
64
- expect(dangerfile.status_report[:warnings]).to eq(["Enum 'UnusedEnum' is unused"])
121
+ it "reports warnings" do
122
+ expect(subject).to include "Function 'unusedMethod()' is unused"
65
123
  end
66
124
  end
67
125
 
68
- context "when .swift files were modified" do
69
- before do
70
- allow(periphery.git).to receive(:renamed_files).and_return []
71
- allow(periphery.git).to receive(:modified_files).and_return ["test/main.swift"]
72
- allow(periphery.git).to receive(:deleted_files).and_return []
73
- allow(periphery.git).to receive(:added_files).and_return []
126
+ context "when returns a modified array" do
127
+ let(:postprocessor) do
128
+ ->(path, line, column, message) { [path, line, column, message.gsub(/Function/, "Foobar")] }
74
129
  end
75
130
 
76
- it "reports unused code" do
77
- periphery.scan(
78
- project: fixture("test.xcodeproj"),
79
- targets: "test",
80
- schemes: "test"
81
- )
131
+ it "reports modified warnings" do
132
+ expect(subject).to include "Foobar 'unusedMethod()' is unused"
133
+ end
134
+ end
135
+ end
82
136
 
83
- expect(dangerfile.status_report[:warnings]).to eq(["Enum 'UnusedEnum' is unused"])
137
+ describe "#process_warnings" do
138
+ it "sets postprocessor" do
139
+ periphery.process_warnings do |path, line, column, message|
140
+ nil
84
141
  end
142
+ expect { periphery.process_warnings { |*args| nil } }.to(change { periphery.postprocessor })
85
143
  end
86
144
  end
87
145
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe Periphery::CheckstyleParser do
4
+ subject(:parser) { described_class.new }
5
+
6
+ describe "#parse" do
7
+ subject { parser.parse(string) }
8
+
9
+ context "with vaild checkstyle xml" do
10
+ let(:string) do
11
+ <<~LOG
12
+ <?xml version="1.0" encoding="utf-8"?>
13
+ <checkstyle version="4.3">
14
+ <file name="/Users/manicmaniac/danger-periphery/main.swift">
15
+ <error line="1" column="1" severity="warning" message="Typealias &apos;UnusedTypeAlias&apos; is unused"/>
16
+ <error line="2" column="1" severity="warning" message="Class &apos;UnusedClass&apos; is unused"/>
17
+ <error line="3" column="1" severity="warning" message="Protocol &apos;UnusedProtocol&apos; is unused"/>
18
+ </file>
19
+ </checkstyle>
20
+ LOG
21
+ end
22
+
23
+ before { allow(Pathname).to receive(:getwd).and_return Pathname.new("/Users/manicmaniac/danger-periphery") }
24
+
25
+ it "parses all warnings" do
26
+ expect(subject).to eq [
27
+ Periphery::ScanResult.new("main.swift", 1, 1, "Typealias 'UnusedTypeAlias' is unused"),
28
+ Periphery::ScanResult.new("main.swift", 2, 1, "Class 'UnusedClass' is unused"),
29
+ Periphery::ScanResult.new("main.swift", 3, 1, "Protocol 'UnusedProtocol' is unused")
30
+ ]
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,77 +1,115 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "periphery/runner"
3
+ describe Periphery::Runner do
4
+ subject(:runner) { described_class.new(binary_path) }
4
5
 
5
- module Periphery
6
- describe Runner do
7
- subject(:runner) { described_class.new(binary_path) }
6
+ let(:binary_path) { binary("periphery") }
8
7
 
9
- let(:binary_path) { binary("periphery") }
8
+ describe "#scan" do
9
+ subject { runner.scan(options) }
10
10
 
11
- describe "#scan" do
12
- subject { runner.scan(options) }
11
+ context "with valid args" do
12
+ let(:options) do
13
+ {
14
+ project: fixture("test.xcodeproj"),
15
+ targets: "test",
16
+ "schemes" => "test"
17
+ }
18
+ end
13
19
 
14
- context "with valid args" do
15
- let(:options) do
16
- {
17
- project: fixture("test.xcodeproj"),
18
- targets: "test",
19
- schemes: "test"
20
- }
21
- end
20
+ let(:command) do
21
+ [
22
+ binary_path,
23
+ "scan",
24
+ "--project",
25
+ fixture("test.xcodeproj"),
26
+ "--targets",
27
+ "test",
28
+ "--schemes",
29
+ "test"
30
+ ]
31
+ end
22
32
 
23
- it "runs scan without args" do
24
- expect(subject).to include "warning:"
25
- end
33
+ it "runs scan without args" do
34
+ status = double(Process::Status, success?: true)
35
+ expect(Open3).to receive(:capture3).once.with(*command).and_return ["warning:", "", status]
36
+ expect(subject).to include "warning:"
26
37
  end
27
38
  end
39
+ end
28
40
 
29
- describe "#scan_arguments" do
30
- subject { runner.scan_arguments(options) }
41
+ describe "#scan_arguments" do
42
+ subject { runner.scan_arguments(options) }
31
43
 
32
- context "with empty options" do
33
- let(:options) { {} }
44
+ context "with empty options" do
45
+ let(:options) { {} }
34
46
 
35
- it { is_expected.to be_empty }
47
+ it { is_expected.to be_empty }
48
+ end
49
+
50
+ context "with options that takes no argument" do
51
+ let(:options) do
52
+ {
53
+ clean_build: true,
54
+ skip_build: true
55
+ }
36
56
  end
37
57
 
38
- context "with options that takes no argument" do
39
- let(:options) do
40
- {
41
- clean_build: true,
42
- skip_build: true
43
- }
44
- end
45
-
46
- it "returns correct arguments" do
47
- expect(subject).to eq %w(--clean-build --skip-build)
48
- end
58
+ it "returns correct arguments" do
59
+ expect(subject).to eq %w(--clean-build --skip-build)
49
60
  end
61
+ end
62
+
63
+ context "with options that takes an argument" do
64
+ let(:options) do
65
+ {
66
+ project: "test.xcodeproj",
67
+ targets: "test1,test2"
68
+ }
69
+ end
70
+
71
+ it "returns correct arguments" do
72
+ expect(subject).to eq %w(--project test.xcodeproj --targets test1,test2)
73
+ end
74
+ end
75
+
76
+ context "with options that takes an array as argument" do
77
+ let(:options) do
78
+ {
79
+ project: "test.xcodeproj",
80
+ targets: %w(test1 test2)
81
+ }
82
+ end
83
+
84
+ it "returns correct arguments" do
85
+ expect(subject).to eq %w(--project test.xcodeproj --targets test1,test2)
86
+ end
87
+ end
88
+
89
+ context "with options passed as symbol" do
90
+ let(:options) do
91
+ {
92
+ project: "test.xcodeproj",
93
+ targets: :test
94
+ }
95
+ end
96
+
97
+ it "returns correct arguments" do
98
+ expect(subject).to eq %w(--project test.xcodeproj --targets test)
99
+ end
100
+ end
50
101
 
51
- context "with options that takes an argument" do
52
- let(:options) do
53
- {
54
- project: "test.xcodeproj",
55
- targets: "test1,test2"
56
- }
57
- end
58
-
59
- it "returns correct arguments" do
60
- expect(subject).to eq %w(--project test.xcodeproj --targets test1,test2)
61
- end
102
+ context "with options passed as boolean" do
103
+ let(:options) do
104
+ {
105
+ project: "test.xcodeproj",
106
+ targets: "test",
107
+ clean_build: true
108
+ }
62
109
  end
63
110
 
64
- context "with options that takes an array as argument" do
65
- let(:options) do
66
- {
67
- project: "test.xcodeproj",
68
- targets: %w(test1 test2)
69
- }
70
- end
71
-
72
- it "returns correct arguments" do
73
- expect(subject).to eq %w(--project test.xcodeproj --targets test1,test2)
74
- end
111
+ it "returns correct arguments" do
112
+ expect(subject).to eq %w(--project test.xcodeproj --targets test --clean-build)
75
113
  end
76
114
  end
77
115
  end
data/spec/spec_helper.rb CHANGED
@@ -1,83 +1,83 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pathname"
4
3
  ROOT = Pathname.new(File.expand_path("..", __dir__))
5
- $:.unshift("#{ROOT}lib".to_s)
6
- $:.unshift("#{ROOT}spec".to_s)
4
+ $:.unshift("#{ROOT}lib".to_s, "#{ROOT}spec".to_s)
7
5
 
8
6
  require "bundler/setup"
9
- require "pry"
10
-
11
- require "rspec"
12
7
  require "danger"
13
-
14
- if `git remote -v` == ""
15
- puts "You cannot run tests without setting a local git remote on this repo"
16
- puts "It's a weird side-effect of Danger's internals."
17
- exit(0)
18
- end
19
-
20
- # Use coloured output, it's the best.
21
- RSpec.configure do |config|
22
- config.filter_gems_from_backtrace "bundler"
23
- config.color = true
24
- config.tty = true
25
- end
26
-
27
8
  require "danger_plugin"
9
+ require "pry"
10
+ require "rspec"
28
11
 
29
- # These functions are a subset of https://github.com/danger/danger/blob/master/spec/spec_helper.rb
30
- # If you are expanding these files, see if it's already been done ^.
31
-
32
- # A silent version of the user interface,
33
- # it comes with an extra function `.string` which will
34
- # strip all ANSI colours from the string.
35
-
36
- # rubocop:disable Lint/NestedMethodDefinition
37
- def testing_ui
38
- @output = StringIO.new
39
- def @output.winsize
40
- [20, 9999]
12
+ module FixtureHelper
13
+ def fixtures_path
14
+ Pathname.new("../support/fixtures").expand_path(__FILE__)
41
15
  end
42
16
 
43
- cork = Cork::Board.new(out: @output)
44
- def cork.string
45
- out.string.gsub(/\e\[([;\d]+)?m/, "")
17
+ def fixture(filename)
18
+ fixtures_path.join(filename).to_s
46
19
  end
47
- cork
48
- end
49
- # rubocop:enable Lint/NestedMethodDefinition
50
20
 
51
- # Example environment (ENV) that would come from
52
- # running a PR on TravisCI
53
- def testing_env
54
- {
55
- "HAS_JOSH_K_SEAL_OF_APPROVAL" => "true",
56
- "TRAVIS_PULL_REQUEST" => "800",
57
- "TRAVIS_REPO_SLUG" => "artsy/eigen",
58
- "TRAVIS_COMMIT_RANGE" => "759adcbd0d8f...13c4dc8bb61d",
59
- "DANGER_GITHUB_API_TOKEN" => "123sbdq54erfsd3422gdfio"
60
- }
61
- end
21
+ def binaries_path
22
+ Pathname.new("../../bin").expand_path(__FILE__)
23
+ end
62
24
 
63
- # A stubbed out Dangerfile for use in tests
64
- def testing_dangerfile
65
- env = Danger::EnvironmentManager.new(testing_env)
66
- Danger::Dangerfile.new(env, testing_ui)
25
+ def binary(filename)
26
+ binaries_path.join(filename).to_s
27
+ end
67
28
  end
68
29
 
69
- def fixtures_path
70
- Pathname.new("../support/fixtures").expand_path(__FILE__)
71
- end
30
+ module DangerPluginHelper
31
+ def self.included(_module)
32
+ if `git remote -v` == ""
33
+ puts "You cannot run tests without setting a local git remote on this repo"
34
+ puts "It's a weird side-effect of Danger's internals."
35
+ exit(0)
36
+ end
37
+ end
72
38
 
73
- def fixture(filename)
74
- fixtures_path.join(filename).to_s
75
- end
39
+ # These functions are a subset of https://github.com/danger/danger/blob/master/spec/spec_helper.rb
40
+ # If you are expanding these files, see if it's already been done ^.
41
+
42
+ # A silent version of the user interface,
43
+ # it comes with an extra function `.string` which will
44
+ # strip all ANSI colours from the string.
45
+
46
+ # rubocop:disable Lint/NestedMethodDefinition
47
+ def testing_ui
48
+ @output = StringIO.new
49
+ def @output.winsize
50
+ [20, 9999]
51
+ end
52
+
53
+ cork = Cork::Board.new(out: @output)
54
+ def cork.string
55
+ out.string.gsub(/\e\[([;\d]+)?m/, "")
56
+ end
57
+ cork
58
+ end
59
+ # rubocop:enable Lint/NestedMethodDefinition
60
+
61
+ # Example environment (ENV) that would come from
62
+ # running a PR on TravisCI
63
+ def testing_env
64
+ {
65
+ "HAS_JOSH_K_SEAL_OF_APPROVAL" => "true",
66
+ "TRAVIS_PULL_REQUEST" => "800",
67
+ "TRAVIS_REPO_SLUG" => "artsy/eigen",
68
+ "TRAVIS_COMMIT_RANGE" => "759adcbd0d8f...13c4dc8bb61d",
69
+ "DANGER_GITHUB_API_TOKEN" => "123sbdq54erfsd3422gdfio"
70
+ }
71
+ end
76
72
 
77
- def binaries_path
78
- Pathname.new("../../bin").expand_path(__FILE__)
73
+ # A stubbed out Dangerfile for use in tests
74
+ def testing_dangerfile
75
+ env = Danger::EnvironmentManager.new(testing_env)
76
+ Danger::Dangerfile.new(env, testing_ui)
77
+ end
79
78
  end
80
79
 
81
- def binary(filename)
82
- binaries_path.join(filename).to_s
80
+ RSpec.configure do |config|
81
+ config.filter_gems_from_backtrace "bundler"
82
+ config.include FixtureHelper
83
83
  end
@@ -1,3 +1,23 @@
1
- enum UnusedEnum {
2
- case unused
1
+ protocol RedundantProtocol {
3
2
  }
3
+
4
+ class SomeClass: RedundantProtocol {
5
+ enum SomeEnum {
6
+ case usedCase
7
+ case unusedCase
8
+ }
9
+
10
+ var unusedProperty = 0
11
+ private var assignOnlyProperty = 0
12
+
13
+
14
+ public func methodWithRedundantPublicAccessibility(_ unusedParameter: Int) {
15
+ assignOnlyProperty = 0
16
+ _ = SomeEnum.usedCase
17
+ }
18
+
19
+ func unusedMethod() {
20
+ }
21
+ }
22
+
23
+ SomeClass().methodWithRedundantPublicAccessibility(0)
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.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryosuke Ito
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-24 00:00:00.000000000 Z
11
+ date: 2022-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-plugin-api
@@ -39,6 +39,7 @@ files:
39
39
  - ".rubocop.yml"
40
40
  - Dangerfile
41
41
  - Gemfile
42
+ - Gemfile.lock
42
43
  - Guardfile
43
44
  - LICENSE.txt
44
45
  - README.md
@@ -46,12 +47,14 @@ files:
46
47
  - bin/download_periphery
47
48
  - danger-periphery.gemspec
48
49
  - lib/danger_plugin.rb
50
+ - lib/periphery.rb
51
+ - lib/periphery/checkstyle_parser.rb
49
52
  - lib/periphery/runner.rb
50
- - lib/periphery/scan_log_parser.rb
53
+ - lib/periphery/scan_result.rb
51
54
  - lib/version.rb
52
55
  - spec/danger_plugin_spec.rb
56
+ - spec/periphery/checkstyle_parser_spec.rb
53
57
  - spec/periphery/runner_spec.rb
54
- - spec/periphery/scan_log_parser_spec.rb
55
58
  - spec/spec_helper.rb
56
59
  - spec/support/fixtures/github_pr.json
57
60
  - spec/support/fixtures/test.xcodeproj/project.pbxproj
@@ -68,21 +71,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
68
71
  requirements:
69
72
  - - ">="
70
73
  - !ruby/object:Gem::Version
71
- version: 2.3.0
74
+ version: 2.6.0
72
75
  required_rubygems_version: !ruby/object:Gem::Requirement
73
76
  requirements:
74
77
  - - ">="
75
78
  - !ruby/object:Gem::Version
76
79
  version: '0'
77
80
  requirements: []
78
- rubygems_version: 3.0.3
81
+ rubygems_version: 3.0.3.1
79
82
  signing_key:
80
83
  specification_version: 4
81
84
  summary: A Danger plugin to detect unused codes.
82
85
  test_files:
83
86
  - spec/danger_plugin_spec.rb
87
+ - spec/periphery/checkstyle_parser_spec.rb
84
88
  - spec/periphery/runner_spec.rb
85
- - spec/periphery/scan_log_parser_spec.rb
86
89
  - spec/spec_helper.rb
87
90
  - spec/support/fixtures/github_pr.json
88
91
  - spec/support/fixtures/test.xcodeproj/project.pbxproj
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Periphery
4
- class ScanLogParser
5
- def parse(string)
6
- string.lines.map do |line|
7
- match = line.match(/^(?<path>.+):(?<line>\d+):(?<column>\d+): warning: (?<message>.*)\n?$/)
8
- ScanLogEntry.new(relative_path(match[:path]), match[:line].to_i, match[:column].to_i, match[:message]) if match
9
- end.compact
10
- end
11
-
12
- private
13
-
14
- def relative_path(path, base = Pathname.getwd)
15
- Pathname.new(path).relative_path_from(base).to_s
16
- end
17
- end
18
-
19
- ScanLogEntry = Struct.new(:path, :line, :column, :message)
20
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "periphery/scan_log_parser"
4
-
5
- module Periphery
6
- describe ScanLogParser do
7
- describe "#parse" do
8
- subject { described_class.new.parse(string) }
9
-
10
- context "with empty string" do
11
- let(:string) { "" }
12
-
13
- it { is_expected.to be_empty }
14
- end
15
-
16
- context "with a valid string" do
17
- let(:string) do
18
- <<~LOG
19
- * Inspecting project...
20
- * Building danger-periphery...
21
- * Indexing...
22
- * Analyzing...
23
-
24
- /Users/manicmaniac/danger-periphery/main.swift:1:1: warning: Typealias 'UnusedTypeAlias' is unused
25
- /Users/manicmaniac/danger-periphery/main.swift:2:1: warning: Class 'UnusedClass' is unused
26
- /Users/manicmaniac/danger-periphery/main.swift:3:1: warning: Protocol 'UnusedProtocol' is unused
27
-
28
- * Seeing false positives?
29
- - Periphery only analyzes files that are members of the targets you specify.
30
- References to declarations identified as unused may reside in files that are members of other targets, e.g test targets.
31
- - By default, Periphery does not assume that all public declarations are in use.
32
- You can instruct it to do so with the --retain-public option.
33
- - Periphery is a very precise tool, false positives often turn out to be correct after further investigation.
34
- - If it really is a false positive, please report it - https://github.com/peripheryapp/periphery/issues.
35
- LOG
36
- end
37
-
38
- before { allow(Pathname).to receive(:getwd).and_return Pathname.new("/Users/manicmaniac/danger-periphery") }
39
-
40
- it "parses all warnings without garbages" do
41
- expect(subject).to eq [
42
- ScanLogEntry.new("main.swift", 1, 1, "Typealias 'UnusedTypeAlias' is unused"),
43
- ScanLogEntry.new("main.swift", 2, 1, "Class 'UnusedClass' is unused"),
44
- ScanLogEntry.new("main.swift", 3, 1, "Protocol 'UnusedProtocol' is unused")
45
- ]
46
- end
47
- end
48
- end
49
- end
50
- end