danger-swiftlint 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.ruby-version +1 -1
- data/Changelog.md +9 -1
- data/Gemfile.lock +11 -9
- data/README.md +7 -0
- data/Rakefile +1 -0
- data/bin/danger-swiftlint +21 -0
- data/danger-swiftlint.gemspec +8 -5
- data/ext/swiftlint/Rakefile +24 -0
- data/ext/swiftlint/swiftlint.rb +58 -0
- data/lib/danger_plugin.rb +101 -91
- data/lib/version.rb +2 -1
- data/spec/danger_plugin_spec.rb +45 -83
- data/spec/spec_helper.rb +4 -0
- data/spec/swiftlint_spec.rb +28 -0
- metadata +35 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45256bbc01984eff36a6cf720d67107645266af9
|
4
|
+
data.tar.gz: 240ceace20e2aa1fc123af81b818843c16dcf2ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b0169c3e7df727a1f5b00bc6199c95342ab4ab6aabc7662af24a3235074de8154624cf753260d9c191b2d2adc11cc0e873c6551562c54976315a53431768a46
|
7
|
+
data.tar.gz: 1471ed2849802043844808db74261b518dafe17cc76e82b240092751279b4ce9f5ca834526bc46020c790f24bf8ac1ba254670b93008643c833c74ff6bfa26cc
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.3.0
|
data/Changelog.md
CHANGED
@@ -2,7 +2,15 @@
|
|
2
2
|
|
3
3
|
## Current Master
|
4
4
|
|
5
|
-
|
5
|
+
## 0.4.0
|
6
|
+
|
7
|
+
- Support for inline comments. See [#29](https://github.com/ashfurrow/danger-swiftlint/issues/28)
|
8
|
+
|
9
|
+
- Adds SwiftLint installation as part of the gem install process, should make
|
10
|
+
it easier to track which upstream fixes should or shouldn't be done by
|
11
|
+
danger-swiftlint. See [#25](https://github.com/ashfurrow/danger-swiftlint/issues/25)
|
12
|
+
|
13
|
+
- Add `danger-swiftlint` CLI, with `swiftlint_version` command to print the version of the SwiftLint binary installed by the plugin. See [#32](https://github.com/ashfurrow/danger-swiftlint/pull/32)
|
6
14
|
|
7
15
|
## 0.3.0
|
8
16
|
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
danger-swiftlint (0.
|
4
|
+
danger-swiftlint (0.4.0)
|
5
5
|
danger
|
6
|
+
rake (~> 10.0)
|
7
|
+
thor (~> 0.19)
|
6
8
|
|
7
9
|
GEM
|
8
10
|
remote: https://rubygems.org/
|
@@ -17,12 +19,13 @@ GEM
|
|
17
19
|
open4 (~> 1.3)
|
18
20
|
coderay (1.1.1)
|
19
21
|
colored (1.2)
|
22
|
+
colored2 (3.1.2)
|
20
23
|
cork (0.2.0)
|
21
24
|
colored (~> 1.2)
|
22
|
-
danger (4.0
|
25
|
+
danger (4.3.0)
|
23
26
|
claide (~> 1.0)
|
24
27
|
claide-plugins (>= 0.9.2)
|
25
|
-
|
28
|
+
colored2 (~> 3.1)
|
26
29
|
cork (~> 0.1)
|
27
30
|
faraday (~> 0.9)
|
28
31
|
faraday-http-cache (~> 1.0)
|
@@ -31,7 +34,7 @@ GEM
|
|
31
34
|
octokit (~> 4.2)
|
32
35
|
terminal-table (~> 1)
|
33
36
|
diff-lcs (1.2.5)
|
34
|
-
faraday (0.
|
37
|
+
faraday (0.11.0)
|
35
38
|
multipart-post (>= 1.2, < 3)
|
36
39
|
faraday-http-cache (1.3.1)
|
37
40
|
faraday (~> 0.8)
|
@@ -52,7 +55,7 @@ GEM
|
|
52
55
|
guard (~> 2.1)
|
53
56
|
guard-compat (~> 1.1)
|
54
57
|
rspec (>= 2.99.0, < 4.0)
|
55
|
-
kramdown (1.13.
|
58
|
+
kramdown (1.13.2)
|
56
59
|
listen (3.0.7)
|
57
60
|
rb-fsevent (>= 0.9.3)
|
58
61
|
rb-inotify (>= 0.9.7)
|
@@ -78,7 +81,7 @@ GEM
|
|
78
81
|
coderay (~> 1.1.0)
|
79
82
|
method_source (~> 0.8.1)
|
80
83
|
slop (~> 3.4)
|
81
|
-
public_suffix (2.0.
|
84
|
+
public_suffix (2.0.5)
|
82
85
|
rake (10.5.0)
|
83
86
|
rb-fsevent (0.9.7)
|
84
87
|
rb-inotify (0.9.7)
|
@@ -104,7 +107,7 @@ GEM
|
|
104
107
|
terminal-table (1.7.3)
|
105
108
|
unicode-display_width (~> 1.1.1)
|
106
109
|
thor (0.19.1)
|
107
|
-
unicode-display_width (1.1.
|
110
|
+
unicode-display_width (1.1.3)
|
108
111
|
|
109
112
|
PLATFORMS
|
110
113
|
ruby
|
@@ -120,8 +123,7 @@ DEPENDENCIES
|
|
120
123
|
mocha-on-bacon
|
121
124
|
prettybacon
|
122
125
|
pry
|
123
|
-
rake (~> 10.0)
|
124
126
|
rspec (~> 3.4)
|
125
127
|
|
126
128
|
BUNDLED WITH
|
127
|
-
1.
|
129
|
+
1.14.6
|
data/README.md
CHANGED
@@ -29,6 +29,13 @@ swiftlint.config_file = '.swiftlint.yml'
|
|
29
29
|
swiftlint.lint_files
|
30
30
|
```
|
31
31
|
|
32
|
+
If you want the lint result shows in diff instead of comment, you can use `inline_mode` option. Violations that out of the diff will show in danger's fail or warn section.
|
33
|
+
|
34
|
+
```rb
|
35
|
+
swiftlint.lint_files inline_mode: true
|
36
|
+
```
|
37
|
+
|
38
|
+
|
32
39
|
## Attribution
|
33
40
|
|
34
41
|
Original structure, sequence, and organization of repo taken from [danger-prose](https://github.com/dbgrandi/danger-prose) by [David Grandinetti](https://github.com/dbgrandi/).
|
data/Rakefile
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
if $PROGRAM_NAME == __FILE__
|
4
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
5
|
+
end
|
6
|
+
require 'thor'
|
7
|
+
require 'version'
|
8
|
+
|
9
|
+
class DangerSwiftlintCLI < Thor
|
10
|
+
desc 'version', 'The version of the installed danger-swiftlint plugin'
|
11
|
+
def version
|
12
|
+
puts DangerSwiftlint::VERSION
|
13
|
+
end
|
14
|
+
|
15
|
+
desc 'swiftlint_version', 'The SwiftLint version used by the plugin'
|
16
|
+
def swiftlint_version
|
17
|
+
puts DangerSwiftlint::SWIFTLINT_VERSION
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
DangerSwiftlintCLI.start(ARGV)
|
data/danger-swiftlint.gemspec
CHANGED
@@ -6,8 +6,8 @@ require 'version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = 'danger-swiftlint'
|
8
8
|
spec.version = DangerSwiftlint::VERSION
|
9
|
-
spec.authors = ['Ash Furrow', 'David Grandinetti', 'Orta Therox']
|
10
|
-
spec.email = ['ash@ashfurrow.com', 'dbgrandi@gmail.com', 'orta.therox@gmail.com']
|
9
|
+
spec.authors = ['Ash Furrow', 'David Grandinetti', 'Orta Therox', 'Thiago Felix', 'Giovanni Lodi']
|
10
|
+
spec.email = ['ash@ashfurrow.com', 'dbgrandi@gmail.com', 'orta.therox@gmail.com', 'thiago@thiagofelix.com', 'gio@mokacoding.com']
|
11
11
|
spec.description = %q{A Danger plugin for linting Swift with SwiftLint.}
|
12
12
|
spec.summary = %q{A Danger plugin for linting Swift with SwiftLint.}
|
13
13
|
spec.homepage = 'https://github.com/ashfurrow/danger-swiftlint'
|
@@ -16,12 +16,15 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ['lib']
|
19
|
+
spec.extensions = %w(ext/swiftlint/Rakefile)
|
20
|
+
spec.executables = ['danger-swiftlint']
|
19
21
|
|
20
22
|
spec.add_dependency 'danger'
|
23
|
+
spec.add_dependency 'thor', '~> 0.19'
|
24
|
+
spec.add_dependency 'rake', '~> 10.0'
|
21
25
|
|
22
26
|
# General ruby development
|
23
27
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
24
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
25
28
|
|
26
29
|
# Testing support
|
27
30
|
spec.add_development_dependency "rspec", '~> 3.4'
|
@@ -29,12 +32,12 @@ Gem::Specification.new do |spec|
|
|
29
32
|
# Makes testing easy via `bundle exec guard`
|
30
33
|
spec.add_development_dependency "guard", '~> 2.14'
|
31
34
|
spec.add_development_dependency "guard-rspec", '~> 4.7'
|
32
|
-
|
35
|
+
|
33
36
|
# If you want to work on older builds of ruby
|
34
37
|
spec.add_development_dependency "listen", '3.0.7'
|
35
38
|
|
36
39
|
# This gives you the chance to run a REPL inside your test
|
37
|
-
# via
|
40
|
+
# via
|
38
41
|
# binding.pry
|
39
42
|
# This will stop test execution and let you inspect the results
|
40
43
|
spec.add_development_dependency "pry"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative '../../lib/version'
|
2
|
+
|
3
|
+
namespace :swiftlint do
|
4
|
+
|
5
|
+
desc "Download and install swiftlint tool"
|
6
|
+
task :install do
|
7
|
+
REPO = "https://github.com/realm/SwiftLint"
|
8
|
+
VERSION = DangerSwiftlint::SWIFTLINT_VERSION
|
9
|
+
ASSET = "portable_swiftlint.zip"
|
10
|
+
URL = "#{REPO}/releases/download/#{VERSION}/#{ASSET}"
|
11
|
+
DESTINATION = File.expand_path(File.join(File.dirname(__FILE__), 'bin'))
|
12
|
+
|
13
|
+
puts "Downloading swiftlint@#{VERSION}"
|
14
|
+
sh [
|
15
|
+
"mkdir -p #{DESTINATION}",
|
16
|
+
"curl -s -L #{URL} -o #{ASSET}",
|
17
|
+
"unzip -q #{ASSET} -d #{DESTINATION}",
|
18
|
+
"rm #{ASSET}"
|
19
|
+
].join(" && ")
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
task default: 'swiftlint:install'
|
@@ -0,0 +1,58 @@
|
|
1
|
+
|
2
|
+
class Swiftlint
|
3
|
+
class << self
|
4
|
+
# Runs swiftlint
|
5
|
+
# @param key (Symbol) the key which is used as command paramters or key in the fastlane tools
|
6
|
+
# @param env_name (String) the name of the environment variable, which is only used if no other values were found
|
7
|
+
# @param description (String) A description shown to the user
|
8
|
+
# @param sensitive (Boolean) Set if the variable is sensitive, such as a password or API token, to prevent echoing when prompted for the parameter
|
9
|
+
def run(cmd='lint', options={})
|
10
|
+
|
11
|
+
# change pwd before run swiftlint
|
12
|
+
if options.has_key? :pwd
|
13
|
+
Dir.chdir options.delete(:pwd)
|
14
|
+
end
|
15
|
+
|
16
|
+
# run swiftlint with provided options
|
17
|
+
`#{swiftlint_path} #{cmd} #{swiftlint_arguments(options)}`
|
18
|
+
end
|
19
|
+
|
20
|
+
# Shortcut for running the lint command
|
21
|
+
def lint(options)
|
22
|
+
run('lint', options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Return true if swiftlint is installed or false otherwise
|
26
|
+
def is_installed?
|
27
|
+
File.exist?(swiftlint_path)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# Parse options into shell arguments how swift expect it to be
|
33
|
+
# more information: https://github.com/Carthage/Commandant
|
34
|
+
# @param options (Hash) hash containing swiftlint options
|
35
|
+
def swiftlint_arguments options
|
36
|
+
options.
|
37
|
+
# filter not null
|
38
|
+
select {|key, value| !value.nil?}.
|
39
|
+
# map booleans arguments equal true
|
40
|
+
map { |key, value| value.is_a?(TrueClass) ? [key, ''] : [key, value] }.
|
41
|
+
# map booleans arguments equal false
|
42
|
+
map { |key, value| value.is_a?(FalseClass) ? ["no-#{key}", ''] : [key, value] }.
|
43
|
+
# replace underscore by hyphen
|
44
|
+
map { |key, value| [key.to_s.tr('_', '-'), value] }.
|
45
|
+
# prepend '--' into the argument
|
46
|
+
map { |key, value| ["--#{key}", value] }.
|
47
|
+
# reduce everything into a single string
|
48
|
+
reduce('') { |args, option| "#{args} #{option[0]} #{option[1]}" }.
|
49
|
+
# strip leading spaces
|
50
|
+
strip
|
51
|
+
end
|
52
|
+
|
53
|
+
# Path where swiftlint should be found
|
54
|
+
def swiftlint_path
|
55
|
+
File.expand_path(File.join(File.dirname(__FILE__), 'bin', 'swiftlint'))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/danger_plugin.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
require 'find'
|
2
|
+
require 'yaml'
|
3
|
+
require 'shellwords'
|
4
|
+
require_relative '../ext/swiftlint/swiftlint'
|
5
|
+
|
1
6
|
module Danger
|
2
7
|
|
3
8
|
# Lint Swift files inside your projects.
|
@@ -15,114 +20,115 @@ module Danger
|
|
15
20
|
#
|
16
21
|
class DangerSwiftlint < Plugin
|
17
22
|
|
18
|
-
#
|
23
|
+
# The path to SwiftLint's configuration file
|
19
24
|
attr_accessor :config_file
|
20
25
|
|
21
|
-
# Allows you to specify a directory from where swiftlint will be run.
|
26
|
+
# Allows you to specify a directory from where swiftlint will be run.
|
22
27
|
attr_accessor :directory
|
23
28
|
|
24
29
|
# Lints Swift files. Will fail if `swiftlint` cannot be installed correctly.
|
25
|
-
# Generates a `markdown` list of warnings for the prose in a corpus of .markdown and .md files.
|
30
|
+
# Generates a `markdown` list of warnings for the prose in a corpus of .markdown and .md files.
|
26
31
|
#
|
27
32
|
# @param [String] files
|
28
33
|
# A globbed string which should return the files that you want to lint, defaults to nil.
|
29
34
|
# if nil, modified and added files from the diff will be used.
|
30
35
|
# @return [void]
|
31
36
|
#
|
32
|
-
def lint_files(files=nil)
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
#
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
swiftlint_command += " --config #{on_the_fly_configuration_path}" if on_the_fly_configuration_path
|
64
|
-
|
65
|
-
require 'json'
|
66
|
-
|
67
|
-
if directory
|
68
|
-
swiftlint_command = "cd #{directory} && #{swiftlint_command}" if directory
|
69
|
-
|
70
|
-
result_json = JSON.parse(`(#{swiftlint_command})`).flatten
|
71
|
-
else
|
72
|
-
# Either use files provided, or use the modified + added
|
73
|
-
swift_files = files ? Dir.glob(files) : (git.modified_files + git.added_files)
|
74
|
-
|
75
|
-
swift_files.select! do |line| line.end_with?(".swift") end
|
76
|
-
|
77
|
-
require 'find'
|
78
|
-
swift_files = swift_files.reject do |file|
|
79
|
-
found = false
|
80
|
-
excluded_dirs.each do |excluded_dir|
|
81
|
-
found = Find.find(File.expand_path(excluded_dir)).include?(File.expand_path(file))
|
82
|
-
break if found
|
83
|
-
end
|
84
|
-
found
|
85
|
-
end
|
86
|
-
|
87
|
-
# Make sure we don't fail when paths have spaces
|
88
|
-
swift_files = swift_files.map { |file| "\"#{file}\"" }
|
89
|
-
|
90
|
-
result_json = swift_files
|
91
|
-
.uniq
|
92
|
-
.collect { |f| `(#{swiftlint_command} --path #{f})`.strip }
|
93
|
-
.reject { |s| s == '' }
|
94
|
-
.map { |s| JSON.parse(s).flatten }
|
95
|
-
.flatten
|
96
|
-
end
|
97
|
-
|
98
|
-
# Convert to swiftlint results
|
99
|
-
warnings = result_json.select do |results|
|
100
|
-
results['severity'] == 'Warning'
|
101
|
-
end
|
102
|
-
errors = result_json.select do |results|
|
103
|
-
results['severity'] == 'Error'
|
104
|
-
end
|
105
|
-
|
106
|
-
message = ''
|
107
|
-
|
108
|
-
# We got some error reports back from swiftlint
|
37
|
+
def lint_files(files=nil, inline_mode: false)
|
38
|
+
# Fails if swiftlint isn't installed
|
39
|
+
raise "swiftlint is not installed" unless Swiftlint.is_installed?
|
40
|
+
|
41
|
+
# Extract excluded paths
|
42
|
+
excluded_paths = excluded_files_from_config(config_file)
|
43
|
+
|
44
|
+
# Extract swift files (ignoring excluded ones)
|
45
|
+
files = find_swift_files(files, excluded_paths)
|
46
|
+
|
47
|
+
# Prepare swiftlint options
|
48
|
+
options = {
|
49
|
+
config: config_file,
|
50
|
+
reporter: 'json',
|
51
|
+
quiet: true,
|
52
|
+
pwd: directory || Dir.pwd
|
53
|
+
}
|
54
|
+
|
55
|
+
# Lint each file and collect the results
|
56
|
+
issues = run_swiftlint(files, options)
|
57
|
+
|
58
|
+
# Filter warnings and errors
|
59
|
+
warnings = issues.select { |issue| issue['severity'] == 'Warning' }
|
60
|
+
errors = issues.select { |issue| issue['severity'] == 'Error' }
|
61
|
+
|
62
|
+
if inline_mode
|
63
|
+
# Reprt with inline comment
|
64
|
+
send_inline_comment(warnings, "warn")
|
65
|
+
send_inline_comment(errors, "fail")
|
66
|
+
else
|
67
|
+
# Report if any warning or error
|
109
68
|
if warnings.count > 0 || errors.count > 0
|
110
69
|
message = "### SwiftLint found issues\n\n"
|
70
|
+
message << markdown_issues(warnings, 'Warnings') unless warnings.empty?
|
71
|
+
message << markdown_issues(errors, 'Errors') unless errors.empty?
|
72
|
+
markdown message
|
111
73
|
end
|
74
|
+
end
|
75
|
+
end
|
112
76
|
|
113
|
-
|
114
|
-
|
77
|
+
# Run swiftlint on each file and aggregate collect the issues
|
78
|
+
#
|
79
|
+
# @return [Array] swiftlint issues
|
80
|
+
def run_swiftlint(files, options)
|
81
|
+
files
|
82
|
+
.map { |file| options.merge({path: file})}
|
83
|
+
.map { |options| Swiftlint.lint(options)}
|
84
|
+
.reject { |s| s == '' }
|
85
|
+
.map { |s| JSON.parse(s).flatten }
|
86
|
+
.flatten
|
87
|
+
end
|
115
88
|
|
116
|
-
|
89
|
+
# Find swift files from the files glob
|
90
|
+
# If files are not provided it will use git modifield and added files
|
91
|
+
#
|
92
|
+
# @return [Array] swift files
|
93
|
+
def find_swift_files(files=nil, excluded_files=[])
|
94
|
+
# Assign files to lint
|
95
|
+
files = files ? Dir.glob(files) : git.modified_files + git.added_files
|
96
|
+
|
97
|
+
# Filter files to lint
|
98
|
+
return files.
|
99
|
+
# Ensure only swift files are selected
|
100
|
+
select { |file| file.end_with?('.swift') }.
|
101
|
+
# Make sure we don't fail when paths have spaces
|
102
|
+
map { |file| Shellwords.escape(file) }.
|
103
|
+
# Remove dups
|
104
|
+
uniq.
|
105
|
+
# Reject files excluded on configuration
|
106
|
+
reject { |file|
|
107
|
+
excluded_files.any? { |excluded| Find.find(excluded).include?(File.expand_path(file)) }
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
# Parses the configuration file and return the excluded files
|
112
|
+
#
|
113
|
+
# @return [Array] list of files excluded
|
114
|
+
def excluded_files_from_config(filepath)
|
115
|
+
config = if filepath
|
116
|
+
YAML.load_file(config_file)
|
117
|
+
else
|
118
|
+
{"excluded" => []}
|
117
119
|
end
|
120
|
+
|
121
|
+
# Extract excluded paths
|
122
|
+
return config['excluded'].
|
123
|
+
map { |path| File.join(File.dirname(config_file), path) }.
|
124
|
+
map { |path| File.expand_path(path) }.
|
125
|
+
select { |path| File.exists?(path) || Dir.exists?(path) }
|
118
126
|
end
|
119
127
|
|
120
|
-
#
|
121
|
-
# which is formatted as a markdown table.
|
128
|
+
# Create a markdown table from swiftlint issues
|
122
129
|
#
|
123
130
|
# @return [String]
|
124
|
-
|
125
|
-
def parse_results (results, heading)
|
131
|
+
def markdown_issues (results, heading)
|
126
132
|
message = "#### #{heading}\n\n"
|
127
133
|
|
128
134
|
message << "File | Line | Reason |\n"
|
@@ -139,11 +145,15 @@ module Danger
|
|
139
145
|
message
|
140
146
|
end
|
141
147
|
|
142
|
-
#
|
143
|
-
# @return [Bool]
|
148
|
+
# Send inline comment with danger's warn or fail method
|
144
149
|
#
|
145
|
-
|
146
|
-
|
150
|
+
# @return [void]
|
151
|
+
def send_inline_comment (results, method)
|
152
|
+
dir = "#{Dir.pwd}/"
|
153
|
+
results.each do |r|
|
154
|
+
filename = r['file'].gsub(dir, "")
|
155
|
+
send(method, r['reason'], file: filename, line: r['line'])
|
156
|
+
end
|
147
157
|
end
|
148
158
|
end
|
149
159
|
end
|
data/lib/version.rb
CHANGED
data/spec/danger_plugin_spec.rb
CHANGED
@@ -8,104 +8,64 @@ module Danger
|
|
8
8
|
|
9
9
|
describe 'with Dangerfile' do
|
10
10
|
before do
|
11
|
-
@dangerfile = testing_dangerfile
|
12
11
|
@swiftlint = testing_dangerfile.swiftlint
|
13
|
-
|
14
|
-
@swiftlint.config_file = nil
|
15
12
|
end
|
16
13
|
|
17
14
|
it "handles swiftlint not being installed" do
|
18
|
-
allow(
|
19
|
-
expect
|
20
|
-
end
|
21
|
-
|
22
|
-
it "handles swiftlint being installed" do
|
23
|
-
allow(@swiftlint).to receive(:`).with("which swiftlint").and_return("/bin/wherever/swiftlint")
|
24
|
-
expect(@swiftlint.swiftlint_installed?).to be_truthy
|
15
|
+
allow(Swiftlint).to receive(:is_installed?).and_return(false)
|
16
|
+
expect { @swiftlint.lint_files }.to raise_error("swiftlint is not installed")
|
25
17
|
end
|
26
18
|
|
27
19
|
it 'does not markdown an empty message' do
|
28
|
-
allow(
|
29
|
-
.with('swiftlint lint --quiet --reporter json --path "spec/fixtures/SwiftFile.swift"')
|
30
|
-
.and_return('[]')
|
31
|
-
|
20
|
+
allow(Swiftlint).to receive(:lint).and_return('[]')
|
32
21
|
expect(@swiftlint.status_report[:markdowns].first).to be_nil
|
33
22
|
end
|
34
23
|
|
35
24
|
describe :lint_files do
|
36
25
|
before do
|
37
|
-
|
38
|
-
allow(@swiftlint).to receive(
|
26
|
+
allow(Swiftlint).to receive(:is_installed?).and_return(true)
|
27
|
+
allow(@swiftlint.git).to receive(:added_files).and_return([])
|
28
|
+
allow(@swiftlint.git).to receive(:modified_files).and_return([])
|
39
29
|
|
40
|
-
# Set up our stubbed JSON response
|
41
30
|
@swiftlint_response = '[{ "rule_id" : "force_cast", "reason" : "Force casts should be avoided.", "character" : 19, "file" : "/Users/me/this_repo/spec//fixtures/SwiftFile.swift", "severity" : "Error", "type" : "Force Cast", "line" : 13 }]'
|
42
31
|
end
|
43
32
|
|
44
|
-
it '
|
45
|
-
|
33
|
+
it 'accept files as arguments' do
|
34
|
+
expect(Swiftlint).to receive(:lint)
|
35
|
+
.with(hash_including(:path => 'spec/fixtures/SwiftFile.swift'))
|
36
|
+
.and_return(@swiftlint_response)
|
46
37
|
|
47
|
-
# Do it
|
48
38
|
@swiftlint.lint_files("spec/fixtures/*.swift")
|
49
39
|
|
50
40
|
output = @swiftlint.status_report[:markdowns].first.to_s
|
51
|
-
|
52
|
-
expect(output).to_not be_empty
|
53
|
-
|
54
|
-
# A title
|
55
41
|
expect(output).to include("SwiftLint found issues")
|
56
|
-
# A warning
|
57
42
|
expect(output).to include("SwiftFile.swift | 13 | Force casts should be avoided.")
|
58
43
|
end
|
59
44
|
|
60
|
-
it '
|
45
|
+
it 'uses git diff when files are not provided' do
|
61
46
|
allow(@swiftlint.git).to receive(:modified_files).and_return(['spec/fixtures/SwiftFile.swift'])
|
62
47
|
allow(@swiftlint.git).to receive(:added_files).and_return([])
|
63
|
-
|
64
|
-
|
48
|
+
allow(Swiftlint).to receive(:lint)
|
49
|
+
.with(hash_including(:path => 'spec/fixtures/SwiftFile.swift'))
|
50
|
+
.and_return(@swiftlint_response)
|
65
51
|
|
66
52
|
@swiftlint.lint_files
|
67
53
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
it 'uses a config file generated on the fly by removing the "included" values from the given one' do
|
72
|
-
fake_temp_file = Tempfile.new('fake.yml')
|
73
|
-
|
74
|
-
begin
|
75
|
-
allow(Tempfile).to receive(:open) { |&block| block.call(fake_temp_file) }
|
76
|
-
|
77
|
-
@swiftlint.config_file = 'spec/fixtures/some_config.yml'
|
78
|
-
|
79
|
-
expect(YAML.load_file(@swiftlint.config_file)['included']).to_not be_nil
|
80
|
-
|
81
|
-
allow(@swiftlint).to receive(:`).with('(swiftlint lint --quiet --reporter json --config ' + fake_temp_file.path + ' --path "spec/fixtures/SwiftFile.swift")') do
|
82
|
-
# The tempfile lifetime is limited to the execution of the lint
|
83
|
-
# command, as such if we were to assert it after the command has
|
84
|
-
# run the file wouldn't exist anymore.
|
85
|
-
#
|
86
|
-
# By injecting the assertion here, whithin the method execution,
|
87
|
-
# we access the file while it still exists.
|
88
|
-
expect(YAML.load_file(fake_temp_file.path)['included']).to be_nil
|
89
|
-
|
90
|
-
@swiftlint_response
|
91
|
-
end
|
92
|
-
|
93
|
-
@swiftlint.lint_files("spec/fixtures/*.swift")
|
94
|
-
|
95
|
-
expect(@swiftlint.status_report[:markdowns].first.to_s).to_not be_empty
|
96
|
-
ensure
|
97
|
-
fake_temp_file.close
|
98
|
-
fake_temp_file.unlink
|
99
|
-
end
|
54
|
+
output = @swiftlint.status_report[:markdowns].first.to_s
|
55
|
+
expect(output).to_not be_empty
|
100
56
|
end
|
101
57
|
|
102
58
|
it 'uses a custom directory' do
|
103
59
|
@swiftlint.directory = 'some_dir'
|
104
|
-
allow(@swiftlint).to receive(:`).with('(cd some_dir && swiftlint lint --quiet --reporter json)').and_return(@swiftlint_response)
|
105
60
|
|
106
|
-
|
61
|
+
allow(Swiftlint).to receive(:lint)
|
62
|
+
.with(hash_including(:pwd => @swiftlint.directory))
|
63
|
+
.and_return(@swiftlint_response)
|
64
|
+
|
65
|
+
@swiftlint.lint_files("spec/fixtures/*.swift")
|
107
66
|
|
108
|
-
|
67
|
+
output = @swiftlint.status_report[:markdowns].first.to_s
|
68
|
+
expect(output).to_not be_empty
|
109
69
|
end
|
110
70
|
|
111
71
|
it 'does not crash if JSON reporter returns an empty string rather than an object' do
|
@@ -120,36 +80,38 @@ module Danger
|
|
120
80
|
# To our code this would simply look like an empty result, which
|
121
81
|
# would then become an empty string, which cannot be parsed into a
|
122
82
|
# JSON object.
|
123
|
-
response = ''
|
124
|
-
allow(@swiftlint).to receive(:`).with('(swiftlint lint --quiet --reporter json --path "spec/fixtures/SwiftFile.swift")').and_return(response)
|
125
|
-
|
126
|
-
@swiftlint.lint_files("spec/fixtures/*.swift")
|
127
83
|
|
128
|
-
|
84
|
+
allow(Swiftlint).to receive(:lint).and_return('')
|
129
85
|
|
130
|
-
|
131
|
-
expect(output).to be_empty
|
86
|
+
expect { @swiftlint.lint_files }.not_to raise_error
|
132
87
|
end
|
133
88
|
|
134
89
|
it 'does not lint files in the excluded paths' do
|
135
|
-
allow(@swiftlint.git).to receive(:modified_files).and_return(['spec/fixtures/SwiftFile.swift', 'spec/fixtures/excluded_dir/SwiftFileThatShouldNotBeIncluded.swift'])
|
136
90
|
allow(@swiftlint.git).to receive(:added_files).and_return([])
|
91
|
+
allow(@swiftlint.git).to receive(:modified_files).and_return([
|
92
|
+
'spec/fixtures/SwiftFile.swift',
|
93
|
+
'spec/fixtures/excluded_dir/SwiftFileThatShouldNotBeIncluded.swift'
|
94
|
+
])
|
137
95
|
|
138
|
-
|
96
|
+
expect(Swiftlint).to receive(:lint)
|
97
|
+
.with(hash_including(:path => 'spec/fixtures/SwiftFile.swift'))
|
98
|
+
.and_return(@swiftlint_response)
|
99
|
+
.once
|
100
|
+
|
101
|
+
@swiftlint.config_file = 'spec/fixtures/some_config.yml'
|
102
|
+
@swiftlint.lint_files
|
103
|
+
end
|
139
104
|
|
140
|
-
|
141
|
-
|
105
|
+
it 'generates errors instead of markdown when use inline mode' do
|
106
|
+
allow(Swiftlint).to receive(:lint)
|
107
|
+
.with(hash_including(:path => 'spec/fixtures/SwiftFile.swift'))
|
108
|
+
.and_return(@swiftlint_response)
|
142
109
|
|
143
|
-
|
144
|
-
# will be called with any other param the test will fail
|
145
|
-
allow(@swiftlint).to receive(:`).with('(swiftlint lint --quiet --reporter json --config ' + fake_temp_file.path + ' --path "spec/fixtures/SwiftFile.swift")').and_return(@swiftlint_response)
|
110
|
+
@swiftlint.lint_files("spec/fixtures/*.swift", inline_mode: true)
|
146
111
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
fake_temp_file.close
|
151
|
-
fake_temp_file.unlink
|
152
|
-
end
|
112
|
+
status = @swiftlint.status_report
|
113
|
+
expect(status[:errors]).to_not be_empty
|
114
|
+
expect(status[:markdowns]).to be_empty
|
153
115
|
end
|
154
116
|
end
|
155
117
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
require_relative '../ext/swiftlint/swiftlint'
|
3
|
+
|
4
|
+
describe Swiftlint do
|
5
|
+
it 'is_installed? works based on bin/swiftlint file' do
|
6
|
+
expect(File).to receive(:exist?).with(/bin\/swiftlint/).and_return(true)
|
7
|
+
expect(Swiftlint.is_installed?).to be_truthy
|
8
|
+
|
9
|
+
expect(File).to receive(:exist?).with(/bin\/swiftlint/).and_return(false)
|
10
|
+
expect(Swiftlint.is_installed?).to be_falsy
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'runs lint by default with options being optional' do
|
14
|
+
expect(Swiftlint).to receive(:`).with(including('swiftlint lint'))
|
15
|
+
Swiftlint.run()
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'runs accepting symbolized options' do
|
19
|
+
cmd = 'swiftlint lint --no-use-stdin --cache-path /path --enable-all-rules'
|
20
|
+
expect(Swiftlint).to receive(:`).with(including(cmd))
|
21
|
+
|
22
|
+
Swiftlint.run('lint',
|
23
|
+
use_stdin: false,
|
24
|
+
cache_path: '/path',
|
25
|
+
enable_all_rules: true)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
metadata
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: danger-swiftlint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ash Furrow
|
8
8
|
- David Grandinetti
|
9
9
|
- Orta Therox
|
10
|
+
- Thiago Felix
|
11
|
+
- Giovanni Lodi
|
10
12
|
autorequire:
|
11
13
|
bindir: bin
|
12
14
|
cert_chain: []
|
13
|
-
date: 2017-
|
15
|
+
date: 2017-03-14 00:00:00.000000000 Z
|
14
16
|
dependencies:
|
15
17
|
- !ruby/object:Gem::Dependency
|
16
18
|
name: danger
|
@@ -27,19 +29,19 @@ dependencies:
|
|
27
29
|
- !ruby/object:Gem::Version
|
28
30
|
version: '0'
|
29
31
|
- !ruby/object:Gem::Dependency
|
30
|
-
name:
|
32
|
+
name: thor
|
31
33
|
requirement: !ruby/object:Gem::Requirement
|
32
34
|
requirements:
|
33
35
|
- - "~>"
|
34
36
|
- !ruby/object:Gem::Version
|
35
|
-
version: '
|
36
|
-
type: :
|
37
|
+
version: '0.19'
|
38
|
+
type: :runtime
|
37
39
|
prerelease: false
|
38
40
|
version_requirements: !ruby/object:Gem::Requirement
|
39
41
|
requirements:
|
40
42
|
- - "~>"
|
41
43
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
44
|
+
version: '0.19'
|
43
45
|
- !ruby/object:Gem::Dependency
|
44
46
|
name: rake
|
45
47
|
requirement: !ruby/object:Gem::Requirement
|
@@ -47,13 +49,27 @@ dependencies:
|
|
47
49
|
- - "~>"
|
48
50
|
- !ruby/object:Gem::Version
|
49
51
|
version: '10.0'
|
50
|
-
type: :
|
52
|
+
type: :runtime
|
51
53
|
prerelease: false
|
52
54
|
version_requirements: !ruby/object:Gem::Requirement
|
53
55
|
requirements:
|
54
56
|
- - "~>"
|
55
57
|
- !ruby/object:Gem::Version
|
56
58
|
version: '10.0'
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: bundler
|
61
|
+
requirement: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - "~>"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '1.3'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - "~>"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '1.3'
|
57
73
|
- !ruby/object:Gem::Dependency
|
58
74
|
name: rspec
|
59
75
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,8 +145,12 @@ email:
|
|
129
145
|
- ash@ashfurrow.com
|
130
146
|
- dbgrandi@gmail.com
|
131
147
|
- orta.therox@gmail.com
|
132
|
-
|
133
|
-
|
148
|
+
- thiago@thiagofelix.com
|
149
|
+
- gio@mokacoding.com
|
150
|
+
executables:
|
151
|
+
- danger-swiftlint
|
152
|
+
extensions:
|
153
|
+
- ext/swiftlint/Rakefile
|
134
154
|
extra_rdoc_files: []
|
135
155
|
files:
|
136
156
|
- ".gitignore"
|
@@ -142,7 +162,10 @@ files:
|
|
142
162
|
- LICENSE
|
143
163
|
- README.md
|
144
164
|
- Rakefile
|
165
|
+
- bin/danger-swiftlint
|
145
166
|
- danger-swiftlint.gemspec
|
167
|
+
- ext/swiftlint/Rakefile
|
168
|
+
- ext/swiftlint/swiftlint.rb
|
146
169
|
- lib/danger_plugin.rb
|
147
170
|
- lib/version.rb
|
148
171
|
- spec/danger_plugin_spec.rb
|
@@ -150,6 +173,7 @@ files:
|
|
150
173
|
- spec/fixtures/excluded_dir/SwiftFileThatShouldNotBeIncluded.swift
|
151
174
|
- spec/fixtures/some_config.yml
|
152
175
|
- spec/spec_helper.rb
|
176
|
+
- spec/swiftlint_spec.rb
|
153
177
|
homepage: https://github.com/ashfurrow/danger-swiftlint
|
154
178
|
licenses:
|
155
179
|
- MIT
|
@@ -170,7 +194,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
170
194
|
version: '0'
|
171
195
|
requirements: []
|
172
196
|
rubyforge_project:
|
173
|
-
rubygems_version: 2.5.
|
197
|
+
rubygems_version: 2.5.1
|
174
198
|
signing_key:
|
175
199
|
specification_version: 4
|
176
200
|
summary: A Danger plugin for linting Swift with SwiftLint.
|
@@ -180,3 +204,4 @@ test_files:
|
|
180
204
|
- spec/fixtures/excluded_dir/SwiftFileThatShouldNotBeIncluded.swift
|
181
205
|
- spec/fixtures/some_config.yml
|
182
206
|
- spec/spec_helper.rb
|
207
|
+
- spec/swiftlint_spec.rb
|