fastlane-plugin-lizard 0.1.2 → 1.0.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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9de970de855b2210fbf9fb92295f5702084531ae
|
4
|
+
data.tar.gz: 0bce82b9a9c562a7c1b8d2abb09bdcbe5bbcc594
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bba85d449d509527f062e79bf433754eed0a803207ece49c12b64c404d557eb54ad4afce9aa9c331f8ea9e7acae1a61c4478c30c3bb4611ab8e2ce955ffc5a44
|
7
|
+
data.tar.gz: 8cca9c3904dc1f04e520cc83eb9113416d1e0d307460f2af75aed854c37327e8c99029c84135aa2531176a37b2705a3d0614236c2a11af6f8167bde9e6fc27ca
|
@@ -2,7 +2,29 @@ module Fastlane
|
|
2
2
|
module Actions
|
3
3
|
class LizardAction < Action
|
4
4
|
def self.run(params)
|
5
|
-
|
5
|
+
if `which lizard`.to_s.empty?
|
6
|
+
UI.user_error!("You have to install lizard using `[sudo] pip install lizard` or specify the executable path with the `:executable` option.")
|
7
|
+
end
|
8
|
+
|
9
|
+
command = forming_command(params)
|
10
|
+
|
11
|
+
if params[:show_warnings]
|
12
|
+
Fastlane::Actions.sh_control_output("lizard #{params[:source_folder]} | sed -n -e '/^$/,$p'", print_command: true, print_command_output: true)
|
13
|
+
end
|
14
|
+
|
15
|
+
begin
|
16
|
+
Actions.sh(command.join(" "), log: false)
|
17
|
+
rescue StandardError => e
|
18
|
+
puts e
|
19
|
+
handle_lizard_error(params[:ignore_exit_status], $CHILD_STATUS.exitstatus)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.forming_command(params)
|
24
|
+
command = []
|
25
|
+
command << 'lizard' unless params[:executable]
|
26
|
+
command << "python #{params[:executable]}" if params[:executable]
|
27
|
+
command << params[:source_folder].to_s if params[:source_folder]
|
6
28
|
command << "-l #{params[:language]}" if params[:language]
|
7
29
|
command << "--#{params[:export_type]}" if params[:export_type]
|
8
30
|
command << "-C #{params[:ccn]}" if params[:ccn] # stands for cyclomatic complexity number
|
@@ -14,21 +36,33 @@ module Fastlane
|
|
14
36
|
command << "-E #{params[:extensions]}" if params[:extensions]
|
15
37
|
command << "-s #{params[:sorting]}" if params[:sorting]
|
16
38
|
command << "-W #{params[:whitelist]}" if params[:whitelist]
|
17
|
-
command << ">
|
39
|
+
command << "> #{params[:report_file].shellescape}" if params[:report_file]
|
18
40
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
41
|
+
return command
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.handle_lizard_error(ignore_exit_status, exit_status)
|
45
|
+
if ignore_exit_status
|
46
|
+
failure_suffix = 'which would normally fail the build.'
|
47
|
+
secondary_message = 'fastlane will continue because the `ignore_exit_status` option was used! 🙈'
|
24
48
|
else
|
25
|
-
|
26
|
-
|
49
|
+
failure_suffix = 'which represents a failure.'
|
50
|
+
secondary_message = 'If you want fastlane to continue anyway, use the `ignore_exit_status` option. 🙈'
|
27
51
|
end
|
52
|
+
|
53
|
+
UI.important("")
|
54
|
+
UI.important("Lizard finished with exit code #{exit_status}, #{failure_suffix}")
|
55
|
+
UI.important(secondary_message)
|
56
|
+
UI.important("")
|
57
|
+
UI.user_error!("Lizard finished with errors (exit code: #{exit_status})") unless ignore_exit_status
|
28
58
|
end
|
29
59
|
|
60
|
+
#####################################################
|
61
|
+
# @!group Documentation
|
62
|
+
#####################################################
|
63
|
+
|
30
64
|
def self.description
|
31
|
-
"
|
65
|
+
"Run lizard code cyclomatic complexity analysis."
|
32
66
|
end
|
33
67
|
|
34
68
|
def self.authors
|
@@ -44,31 +78,34 @@ module Fastlane
|
|
44
78
|
FastlaneCore::ConfigItem.new(key: :source_folder,
|
45
79
|
env_name: "FL_LIZARD_SOURCE_FOLDER",
|
46
80
|
description: "The folders that contains the source code for lizard to scan",
|
47
|
-
|
48
|
-
UI.user_error!("No source folder specified") unless value and !value.empty?
|
49
|
-
end),
|
81
|
+
optional: true),
|
50
82
|
FastlaneCore::ConfigItem.new(key: :language,
|
51
83
|
env_name: "FL_LIZARD_LANGUAGE",
|
52
84
|
description: "List the programming languages you want to analyze",
|
53
|
-
default_value: "swift"
|
85
|
+
default_value: "swift",
|
86
|
+
optional: true),
|
54
87
|
FastlaneCore::ConfigItem.new(key: :export_type,
|
55
|
-
|
56
|
-
|
88
|
+
env_name: "FL_LIZARD_EXPORT_TYPE",
|
89
|
+
description: "The file extension of your export. E.g. xml, csv",
|
90
|
+
optional: true),
|
57
91
|
FastlaneCore::ConfigItem.new(key: :ccn,
|
58
92
|
env_name: "FL_LIZARD_CCN",
|
59
93
|
description: "Threshold of cyclomatic complexity number warning",
|
94
|
+
is_string: false,
|
60
95
|
optional: true),
|
61
96
|
FastlaneCore::ConfigItem.new(key: :length,
|
62
|
-
|
63
|
-
|
64
|
-
|
97
|
+
env_name: "FL_LIZARD_LENGTH",
|
98
|
+
description: "Threshold for maximum function length warning",
|
99
|
+
is_string: false,
|
100
|
+
optional: true),
|
65
101
|
FastlaneCore::ConfigItem.new(key: :arguments,
|
66
|
-
|
67
|
-
|
68
|
-
|
102
|
+
env_name: "FL_LIZARD_ARGUMENTS",
|
103
|
+
description: "Limit for number of parameters",
|
104
|
+
optional: true),
|
69
105
|
FastlaneCore::ConfigItem.new(key: :number,
|
70
106
|
env_name: "FL_LIZARD_NUMBER",
|
71
107
|
description: "If the number of warnings is equal or less than the number, the tool will exit normally, otherwise it will generate error. Useful in makefile for legacy code",
|
108
|
+
is_string: false,
|
72
109
|
optional: true),
|
73
110
|
FastlaneCore::ConfigItem.new(key: :exclude,
|
74
111
|
env_name: "FL_LIZARD_EXCLUDE",
|
@@ -82,6 +119,7 @@ module Fastlane
|
|
82
119
|
FastlaneCore::ConfigItem.new(key: :extensions,
|
83
120
|
env_name: "FL_LIZARD_EXTENSIONS",
|
84
121
|
description: "User the extensions. The available extensions are: -Ecpre: it will ignore code in the #else branch. -Ewordcount: count word frequencies and generate tag cloud. -Eoutside: include the global code as one function",
|
122
|
+
is_string: true,
|
85
123
|
optional: true),
|
86
124
|
FastlaneCore::ConfigItem.new(key: :sorting,
|
87
125
|
env_name: "FL_LIZARD_SORTING",
|
@@ -93,17 +131,27 @@ module Fastlane
|
|
93
131
|
optional: true),
|
94
132
|
FastlaneCore::ConfigItem.new(key: :report_file,
|
95
133
|
env_name: "FL_LIZARD_REPORT_FILE",
|
96
|
-
description: "The folder/file which lizard output to"
|
134
|
+
description: "The folder/file which lizard output to",
|
135
|
+
optional: true),
|
136
|
+
FastlaneCore::ConfigItem.new(key: :ignore_exit_status,
|
137
|
+
description: "Ignore the exit status of the lizard command, so that serious violations don't fail the build (true/false)",
|
138
|
+
default_value: false,
|
139
|
+
is_string: false,
|
140
|
+
optional: true),
|
97
141
|
FastlaneCore::ConfigItem.new(key: :show_warnings,
|
98
142
|
env_name: "FL_LIZARD_SHOW_WARNINGS",
|
99
143
|
description: "Show lizard warnings on console, on code that is too complex",
|
100
144
|
is_string: false,
|
101
|
-
default_value: false)
|
145
|
+
default_value: false),
|
146
|
+
FastlaneCore::ConfigItem.new(key: :executable,
|
147
|
+
description: "Path to the `lizard.py` executable on your machine",
|
148
|
+
is_string: true,
|
149
|
+
optional: true)
|
102
150
|
]
|
103
151
|
end
|
104
152
|
|
105
153
|
def self.is_supported?(platform)
|
106
|
-
|
154
|
+
[:ios, :android, :mac].include?(platform)
|
107
155
|
end
|
108
156
|
end
|
109
157
|
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
class SwiftlintAction < Action
|
4
|
+
def self.run(params)
|
5
|
+
if `which swiftlint`.to_s.length == 0 && params[:executable].nil? && !Helper.test?
|
6
|
+
UI.user_error!("You have to install swiftlint using `brew install swiftlint` or specify the executable path with the `:executable` option.")
|
7
|
+
end
|
8
|
+
|
9
|
+
version = swiftlint_version(executable: params[:executable])
|
10
|
+
if params[:mode] == :autocorrect and version < Gem::Version.new('0.5.0') and !Helper.test?
|
11
|
+
UI.user_error!("Your version of swiftlint (#{version}) does not support autocorrect mode.\nUpdate swiftlint using `brew update && brew upgrade swiftlint`")
|
12
|
+
end
|
13
|
+
|
14
|
+
command = (params[:executable] || "swiftlint").dup
|
15
|
+
command << " #{params[:mode]}"
|
16
|
+
command << supported_option_switch(params, :strict, "0.9.2", true)
|
17
|
+
command << " --config #{params[:config_file].shellescape}" if params[:config_file]
|
18
|
+
command << " --reporter #{params[:reporter]}" if params[:reporter]
|
19
|
+
command << supported_option_switch(params, :quiet, "0.9.0", true)
|
20
|
+
|
21
|
+
if params[:files]
|
22
|
+
if version < Gem::Version.new('0.5.1')
|
23
|
+
UI.user_error!("Your version of swiftlint (#{version}) does not support list of files as input.\nUpdate swiftlint using `brew update && brew upgrade swiftlint`")
|
24
|
+
end
|
25
|
+
|
26
|
+
files = params[:files].map.with_index(0) { |f, i| "SCRIPT_INPUT_FILE_#{i}=#{f.shellescape}" }.join(" ")
|
27
|
+
command = command.prepend("SCRIPT_INPUT_FILE_COUNT=#{params[:files].count} #{files} ")
|
28
|
+
command << " --use-script-input-files"
|
29
|
+
end
|
30
|
+
|
31
|
+
command << " > #{params[:output_file].shellescape}" if params[:output_file]
|
32
|
+
|
33
|
+
begin
|
34
|
+
Actions.sh(command)
|
35
|
+
rescue
|
36
|
+
handle_swiftlint_error(params[:ignore_exit_status], $?.exitstatus)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Get current SwiftLint version
|
41
|
+
def self.swiftlint_version(executable: nil)
|
42
|
+
binary = executable || 'swiftlint'
|
43
|
+
Gem::Version.new(`#{binary} version`.chomp)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Return "--option" switch if option is on and current SwiftLint version is greater or equal than min version.
|
47
|
+
# Return "" otherwise.
|
48
|
+
def self.supported_option_switch(params, option, min_version, can_ignore = false)
|
49
|
+
return "" unless params[option]
|
50
|
+
version = swiftlint_version(executable: params[:executable])
|
51
|
+
if version < Gem::Version.new(min_version)
|
52
|
+
message = "Your version of swiftlint (#{version}) does not support '--#{option}' option.\nUpdate swiftlint to #{min_version} or above using `brew update && brew upgrade swiftlint`"
|
53
|
+
message += "\nThe option will be ignored." if can_ignore
|
54
|
+
can_ignore ? UI.important(message) : UI.user_error!(message)
|
55
|
+
""
|
56
|
+
else
|
57
|
+
" --#{option}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
#####################################################
|
62
|
+
# @!group Documentation
|
63
|
+
#####################################################
|
64
|
+
|
65
|
+
def self.description
|
66
|
+
"Run swift code validation using Lizard"
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.details
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.available_options
|
73
|
+
[
|
74
|
+
FastlaneCore::ConfigItem.new(key: :mode,
|
75
|
+
description: "SwiftLint mode: :lint or :autocorrect",
|
76
|
+
is_string: false,
|
77
|
+
default_value: :lint,
|
78
|
+
optional: true),
|
79
|
+
FastlaneCore::ConfigItem.new(key: :output_file,
|
80
|
+
description: 'Path to output SwiftLint result',
|
81
|
+
optional: true),
|
82
|
+
FastlaneCore::ConfigItem.new(key: :config_file,
|
83
|
+
description: 'Custom configuration file of SwiftLint',
|
84
|
+
optional: true),
|
85
|
+
FastlaneCore::ConfigItem.new(key: :strict,
|
86
|
+
description: 'Fail on warnings? (true/false)',
|
87
|
+
default_value: false,
|
88
|
+
is_string: false,
|
89
|
+
optional: true),
|
90
|
+
FastlaneCore::ConfigItem.new(key: :files,
|
91
|
+
description: 'List of files to process',
|
92
|
+
is_string: false,
|
93
|
+
optional: true),
|
94
|
+
FastlaneCore::ConfigItem.new(key: :ignore_exit_status,
|
95
|
+
description: "Ignore the exit status of the SwiftLint command, so that serious violations \
|
96
|
+
don't fail the build (true/false)",
|
97
|
+
default_value: false,
|
98
|
+
is_string: false,
|
99
|
+
optional: true),
|
100
|
+
FastlaneCore::ConfigItem.new(key: :reporter,
|
101
|
+
description: 'Choose output reporter',
|
102
|
+
is_string: true,
|
103
|
+
optional: true),
|
104
|
+
FastlaneCore::ConfigItem.new(key: :quiet,
|
105
|
+
description: "Don't print status logs like 'Linting <file>' & 'Done linting'",
|
106
|
+
default_value: false,
|
107
|
+
is_string: false,
|
108
|
+
optional: true),
|
109
|
+
FastlaneCore::ConfigItem.new(key: :executable,
|
110
|
+
description: "Path to the `swiftlint` executable on your machine",
|
111
|
+
is_string: true,
|
112
|
+
optional: true)
|
113
|
+
]
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.output
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.return_value
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.authors
|
123
|
+
["KrauseFx"]
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.is_supported?(platform)
|
127
|
+
[:ios, :mac].include?(platform)
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.example_code
|
131
|
+
[
|
132
|
+
'swiftlint(
|
133
|
+
mode: :lint, # SwiftLint mode: :lint (default) or :autocorrect
|
134
|
+
output_file: "swiftlint.result.json", # The path of the output file (optional)
|
135
|
+
config_file: ".swiftlint-ci.yml", # The path of the configuration file (optional)
|
136
|
+
files: [ # List of files to process (optional)
|
137
|
+
"AppDelegate.swift",
|
138
|
+
"path/to/project/Model.swift"
|
139
|
+
],
|
140
|
+
ignore_exit_status: true # Allow fastlane to continue even if SwiftLint returns a non-zero exit status
|
141
|
+
)'
|
142
|
+
]
|
143
|
+
end
|
144
|
+
|
145
|
+
def self.category
|
146
|
+
:testing
|
147
|
+
end
|
148
|
+
|
149
|
+
def self.handle_swiftlint_error(ignore_exit_status, exit_status)
|
150
|
+
if ignore_exit_status
|
151
|
+
failure_suffix = 'which would normally fail the build.'
|
152
|
+
secondary_message = 'fastlane will continue because the `ignore_exit_status` option was used! 🙈'
|
153
|
+
else
|
154
|
+
failure_suffix = 'which represents a failure.'
|
155
|
+
secondary_message = 'If you want fastlane to continue anyway, use the `ignore_exit_status` option. 🙈'
|
156
|
+
end
|
157
|
+
|
158
|
+
UI.important("")
|
159
|
+
UI.important("SwiftLint finished with exit code #{exit_status}, #{failure_suffix}")
|
160
|
+
UI.important(secondary_message)
|
161
|
+
UI.important("")
|
162
|
+
UI.user_error!("SwiftLint finished with errors (exit code: #{exit_status})") unless ignore_exit_status
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-lizard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Moses Liao
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -17,7 +17,7 @@ dependencies:
|
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
|
-
type: :
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
@@ -31,7 +31,7 @@ dependencies:
|
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
|
-
type: :
|
34
|
+
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
@@ -45,7 +45,7 @@ dependencies:
|
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
|
-
type: :
|
48
|
+
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
@@ -59,7 +59,7 @@ dependencies:
|
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
-
type: :
|
62
|
+
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
@@ -73,7 +73,7 @@ dependencies:
|
|
73
73
|
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
|
-
type: :
|
76
|
+
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
|
-
type: :
|
90
|
+
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
@@ -101,7 +101,7 @@ dependencies:
|
|
101
101
|
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
|
-
type: :
|
104
|
+
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
@@ -115,7 +115,7 @@ dependencies:
|
|
115
115
|
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
|
-
type: :
|
118
|
+
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
@@ -132,6 +132,7 @@ files:
|
|
132
132
|
- README.md
|
133
133
|
- lib/fastlane/plugin/lizard.rb
|
134
134
|
- lib/fastlane/plugin/lizard/actions/lizard_action.rb
|
135
|
+
- lib/fastlane/plugin/lizard/actions/swiftlint_example.rb
|
135
136
|
- lib/fastlane/plugin/lizard/helper/lizard_helper.rb
|
136
137
|
- lib/fastlane/plugin/lizard/version.rb
|
137
138
|
homepage: https://github.com/liaogz82/fastlane-plugin-lizard
|
@@ -157,5 +158,5 @@ rubyforge_project:
|
|
157
158
|
rubygems_version: 2.6.13
|
158
159
|
signing_key:
|
159
160
|
specification_version: 4
|
160
|
-
summary:
|
161
|
+
summary: Run swift code complexity analytics using Lizard
|
161
162
|
test_files: []
|