danger-periphery 0.0.1 → 0.2.1
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 +94 -13
- data/lib/periphery/checkstyle_parser.rb +50 -0
- data/lib/periphery/runner.rb +12 -11
- data/lib/periphery/scan_result.rb +5 -0
- data/lib/periphery.rb +4 -0
- data/lib/version.rb +1 -1
- metadata +11 -36
- data/.github/workflows/lint.yml +0 -12
- data/.github/workflows/test.yml +0 -10
- data/.gitignore +0 -10
- data/.rspec +0 -3
- data/.rubocop.yml +0 -281
- data/Dangerfile +0 -10
- data/Gemfile +0 -18
- data/Guardfile +0 -21
- data/LICENSE.txt +0 -22
- data/README.md +0 -42
- data/Rakefile +0 -25
- data/bin/download_periphery +0 -7
- data/danger-periphery.gemspec +0 -24
- data/lib/periphery/scan_log_parser.rb +0 -20
- data/spec/danger_plugin_spec.rb +0 -88
- data/spec/periphery/runner_spec.rb +0 -78
- data/spec/periphery/scan_log_parser_spec.rb +0 -50
- data/spec/spec_helper.rb +0 -83
- data/spec/support/fixtures/github_pr.json +0 -381
- data/spec/support/fixtures/test/main.swift +0 -3
- data/spec/support/fixtures/test.xcodeproj/project.pbxproj +0 -286
data/Gemfile
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
# Specify your gem's dependencies in danger-periphery.gemspec
|
6
|
-
gemspec
|
7
|
-
|
8
|
-
gem "bundler", "~> 2.0"
|
9
|
-
gem "danger"
|
10
|
-
gem "danger-rubocop"
|
11
|
-
gem "guard", "~> 2.14"
|
12
|
-
gem "guard-rspec", "~> 4.7"
|
13
|
-
gem "listen", "3.0.7"
|
14
|
-
gem "pry"
|
15
|
-
gem "rake", "~> 10.0"
|
16
|
-
gem "rspec", "~> 3.4"
|
17
|
-
gem "rubocop"
|
18
|
-
gem "yard"
|
data/Guardfile
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# A guardfile for making Danger Plugins
|
4
|
-
# For more info see https://github.com/guard/guard#readme
|
5
|
-
|
6
|
-
# To run, use `bundle exec guard`.
|
7
|
-
|
8
|
-
guard :rspec, cmd: "bundle exec rspec" do
|
9
|
-
require "guard/rspec/dsl"
|
10
|
-
dsl = Guard::RSpec::Dsl.new(self)
|
11
|
-
|
12
|
-
# RSpec files
|
13
|
-
rspec = dsl.rspec
|
14
|
-
watch(rspec.spec_helper) { rspec.spec_dir }
|
15
|
-
watch(rspec.spec_support) { rspec.spec_dir }
|
16
|
-
watch(rspec.spec_files)
|
17
|
-
|
18
|
-
# Ruby files
|
19
|
-
ruby = dsl.ruby
|
20
|
-
dsl.watch_spec_files_for(ruby.lib_files)
|
21
|
-
end
|
data/LICENSE.txt
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
Copyright (c) 2021 Ryosuke Ito <rito.0305@gmail.com>
|
2
|
-
|
3
|
-
MIT License
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
-
a copy of this software and associated documentation files (the
|
7
|
-
"Software"), to deal in the Software without restriction, including
|
8
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
-
permit persons to whom the Software is furnished to do so, subject to
|
11
|
-
the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be
|
14
|
-
included in all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
# danger-periphery
|
2
|
-
|
3
|
-
A Danger plugin to detect unused codes.
|
4
|
-
|
5
|
-
## Installation
|
6
|
-
|
7
|
-
You need to install [Periphery](https://github.com/peripheryapp/periphery) beforehand.
|
8
|
-
|
9
|
-
Currently `danger-periphery` is in early development stage so it's not published to rubygems.org yet.
|
10
|
-
|
11
|
-
Write the following code in your Gemfile.
|
12
|
-
|
13
|
-
gem "danger-periphery", git: "https://github.com/manicmaniac/danger-periphery.git"
|
14
|
-
|
15
|
-
## Usage
|
16
|
-
|
17
|
-
If you already have `.periphery.yml`, the easiest way to use is just add this to your Dangerfile.
|
18
|
-
|
19
|
-
periphery.scan
|
20
|
-
|
21
|
-
You can specify the path to executable in this way.
|
22
|
-
|
23
|
-
periphery.binary_path = "bin/periphery"
|
24
|
-
|
25
|
-
You can pass command line options to `periphery.scan` like the following.
|
26
|
-
See `periphery scan -h` for available options.
|
27
|
-
|
28
|
-
periphery.scan(
|
29
|
-
project: "Foo.xcodeproj",
|
30
|
-
schemes: ["foo", "bar"],
|
31
|
-
targets: "foo",
|
32
|
-
clean_build: true
|
33
|
-
)
|
34
|
-
|
35
|
-
## Development
|
36
|
-
|
37
|
-
1. Clone this repo
|
38
|
-
2. Run `bundle install` to setup dependencies.
|
39
|
-
3. Run `bin/download_periphery` to install Periphery.
|
40
|
-
4. Run `bundle exec rake spec` to run the tests.
|
41
|
-
5. Use `bundle exec guard` to automatically have tests run as you make changes.
|
42
|
-
6. Make your changes.
|
data/Rakefile
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "bundler/gem_tasks"
|
4
|
-
require "rspec/core/rake_task"
|
5
|
-
require "rubocop/rake_task"
|
6
|
-
|
7
|
-
RSpec::Core::RakeTask.new(:specs)
|
8
|
-
|
9
|
-
task default: :specs
|
10
|
-
|
11
|
-
task :spec do
|
12
|
-
Rake::Task["specs"].invoke
|
13
|
-
Rake::Task["rubocop"].invoke
|
14
|
-
Rake::Task["spec_docs"].invoke
|
15
|
-
end
|
16
|
-
|
17
|
-
desc "Run RuboCop on the lib/specs directory"
|
18
|
-
RuboCop::RakeTask.new(:rubocop) do |task|
|
19
|
-
task.patterns = ["lib/**/*.rb", "spec/**/*.rb"]
|
20
|
-
end
|
21
|
-
|
22
|
-
desc "Ensure that the plugin passes `danger plugins lint`"
|
23
|
-
task :spec_docs do
|
24
|
-
sh "bundle exec danger plugins lint"
|
25
|
-
end
|
data/bin/download_periphery
DELETED
data/danger-periphery.gemspec
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
lib = File.expand_path("lib", __dir__)
|
4
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require "version"
|
6
|
-
|
7
|
-
Gem::Specification.new do |spec|
|
8
|
-
spec.name = "danger-periphery"
|
9
|
-
spec.version = DangerPeriphery::VERSION
|
10
|
-
spec.authors = ["Ryosuke Ito"]
|
11
|
-
spec.email = ["rito.0305@gmail.com"]
|
12
|
-
spec.description = "A Danger plugin to detect unused codes."
|
13
|
-
spec.summary = spec.description
|
14
|
-
spec.homepage = "https://github.com/manicmaniac/danger-periphery"
|
15
|
-
spec.license = "MIT"
|
16
|
-
spec.required_ruby_version = ">= 2.3.0"
|
17
|
-
|
18
|
-
spec.files = `git ls-files`.split($/)
|
19
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
|
-
spec.require_paths = ["lib"]
|
22
|
-
|
23
|
-
spec.add_dependency "danger-plugin-api", "~> 1.0"
|
24
|
-
end
|
@@ -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
|
data/spec/danger_plugin_spec.rb
DELETED
@@ -1,88 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require File.expand_path("spec_helper", __dir__)
|
4
|
-
|
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
|
9
|
-
end
|
10
|
-
|
11
|
-
context "with Dangerfile" do
|
12
|
-
let(:dangerfile) { testing_dangerfile }
|
13
|
-
let(:periphery) { dangerfile.periphery }
|
14
|
-
|
15
|
-
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
|
20
|
-
end
|
21
|
-
|
22
|
-
context "when periphery is not installed" do
|
23
|
-
before { periphery.binary_path = "not_installed" }
|
24
|
-
|
25
|
-
it "fails with error" do
|
26
|
-
expect { periphery.scan }.to raise_error Errno::ENOENT
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
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
|
37
|
-
|
38
|
-
it "reports nothing" do
|
39
|
-
periphery.scan(
|
40
|
-
project: fixture("test.xcodeproj"),
|
41
|
-
targets: "test",
|
42
|
-
schemes: "test"
|
43
|
-
)
|
44
|
-
|
45
|
-
expect(dangerfile.status_report[:warnings]).to be_empty
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
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"]
|
55
|
-
end
|
56
|
-
|
57
|
-
it "reports unused code" do
|
58
|
-
periphery.scan(
|
59
|
-
project: fixture("test.xcodeproj"),
|
60
|
-
targets: "test",
|
61
|
-
schemes: "test"
|
62
|
-
)
|
63
|
-
|
64
|
-
expect(dangerfile.status_report[:warnings]).to eq(["Enum 'UnusedEnum' is unused"])
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
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 []
|
74
|
-
end
|
75
|
-
|
76
|
-
it "reports unused code" do
|
77
|
-
periphery.scan(
|
78
|
-
project: fixture("test.xcodeproj"),
|
79
|
-
targets: "test",
|
80
|
-
schemes: "test"
|
81
|
-
)
|
82
|
-
|
83
|
-
expect(dangerfile.status_report[:warnings]).to eq(["Enum 'UnusedEnum' is unused"])
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "periphery/runner"
|
4
|
-
|
5
|
-
module Periphery
|
6
|
-
describe Runner do
|
7
|
-
subject(:runner) { described_class.new(binary_path) }
|
8
|
-
|
9
|
-
let(:binary_path) { binary("periphery") }
|
10
|
-
|
11
|
-
describe "#scan" do
|
12
|
-
subject { runner.scan(options) }
|
13
|
-
|
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
|
22
|
-
|
23
|
-
it "runs scan without args" do
|
24
|
-
expect(subject).to include "warning:"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe "#scan_arguments" do
|
30
|
-
subject { runner.scan_arguments(options) }
|
31
|
-
|
32
|
-
context "with empty options" do
|
33
|
-
let(:options) { {} }
|
34
|
-
|
35
|
-
it { is_expected.to be_empty }
|
36
|
-
end
|
37
|
-
|
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
|
49
|
-
end
|
50
|
-
|
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
|
62
|
-
end
|
63
|
-
|
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
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
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
|
data/spec/spec_helper.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "pathname"
|
4
|
-
ROOT = Pathname.new(File.expand_path("..", __dir__))
|
5
|
-
$:.unshift("#{ROOT}lib".to_s)
|
6
|
-
$:.unshift("#{ROOT}spec".to_s)
|
7
|
-
|
8
|
-
require "bundler/setup"
|
9
|
-
require "pry"
|
10
|
-
|
11
|
-
require "rspec"
|
12
|
-
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
|
-
require "danger_plugin"
|
28
|
-
|
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]
|
41
|
-
end
|
42
|
-
|
43
|
-
cork = Cork::Board.new(out: @output)
|
44
|
-
def cork.string
|
45
|
-
out.string.gsub(/\e\[([;\d]+)?m/, "")
|
46
|
-
end
|
47
|
-
cork
|
48
|
-
end
|
49
|
-
# rubocop:enable Lint/NestedMethodDefinition
|
50
|
-
|
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
|
62
|
-
|
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)
|
67
|
-
end
|
68
|
-
|
69
|
-
def fixtures_path
|
70
|
-
Pathname.new("../support/fixtures").expand_path(__FILE__)
|
71
|
-
end
|
72
|
-
|
73
|
-
def fixture(filename)
|
74
|
-
fixtures_path.join(filename).to_s
|
75
|
-
end
|
76
|
-
|
77
|
-
def binaries_path
|
78
|
-
Pathname.new("../../bin").expand_path(__FILE__)
|
79
|
-
end
|
80
|
-
|
81
|
-
def binary(filename)
|
82
|
-
binaries_path.join(filename).to_s
|
83
|
-
end
|