Class: Fastlane::Actions::SwiftlintAction

Inherits:
Action
  • Object
show all
Defined in:
lib/fastlane/plugin/lizard/actions/swiftlint_example.rb

Documentation collapse

Class Method Summary collapse

Class Method Details

.authorsObject



122
123
124
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 122

def self.authors
  ["KrauseFx"]
end

.available_optionsObject



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 72

def self.available_options
  [
    FastlaneCore::ConfigItem.new(key: :mode,
                                 description: "SwiftLint mode: :lint or :autocorrect",
                                 is_string: false,
                                 default_value: :lint,
                                 optional: true),
    FastlaneCore::ConfigItem.new(key: :output_file,
                                 description: 'Path to output SwiftLint result',
                                 optional: true),
    FastlaneCore::ConfigItem.new(key: :config_file,
                                 description: 'Custom configuration file of SwiftLint',
                                 optional: true),
    FastlaneCore::ConfigItem.new(key: :strict,
                                 description: 'Fail on warnings? (true/false)',
                                 default_value: false,
                                 is_string: false,
                                 optional: true),
    FastlaneCore::ConfigItem.new(key: :files,
                                 description: 'List of files to process',
                                 is_string: false,
                                 optional: true),
    FastlaneCore::ConfigItem.new(key: :ignore_exit_status,
                                 description: "Ignore the exit status of the SwiftLint command, so that serious violations \
                                              don't fail the build (true/false)",
                                 default_value: false,
                                 is_string: false,
                                 optional: true),
    FastlaneCore::ConfigItem.new(key: :reporter,
                                 description: 'Choose output reporter',
                                 is_string: true,
                                 optional: true),
    FastlaneCore::ConfigItem.new(key: :quiet,
                                 description: "Don't print status logs like 'Linting <file>' & 'Done linting'",
                                 default_value: false,
                                 is_string: false,
                                 optional: true),
    FastlaneCore::ConfigItem.new(key: :executable,
                                 description: "Path to the `swiftlint` executable on your machine",
                                 is_string: true,
                                 optional: true)
  ]
end

.categoryObject



145
146
147
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 145

def self.category
  :testing
end

.descriptionObject



65
66
67
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 65

def self.description
  "Run swift code validation using Lizard"
end

.detailsObject



69
70
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 69

def self.details
end

.example_codeObject



130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 130

def self.example_code
  [
    'swiftlint(
      mode: :lint,                          # SwiftLint mode: :lint (default) or :autocorrect
      output_file: "swiftlint.result.json", # The path of the output file (optional)
      config_file: ".swiftlint-ci.yml",     # The path of the configuration file (optional)
      files: [                              # List of files to process (optional)
        "AppDelegate.swift",
        "path/to/project/Model.swift"
      ],
      ignore_exit_status: true              # Allow fastlane to continue even if SwiftLint returns a non-zero exit status
    )'
  ]
end

.handle_swiftlint_error(ignore_exit_status, exit_status) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 149

def self.handle_swiftlint_error(ignore_exit_status, exit_status)
  if ignore_exit_status
    failure_suffix = 'which would normally fail the build.'
    secondary_message = 'fastlane will continue because the `ignore_exit_status` option was used! ๐Ÿ™ˆ'
  else
    failure_suffix = 'which represents a failure.'
    secondary_message = 'If you want fastlane to continue anyway, use the `ignore_exit_status` option. ๐Ÿ™ˆ'
  end

  UI.important("")
  UI.important("SwiftLint finished with exit code #{exit_status}, #{failure_suffix}")
  UI.important(secondary_message)
  UI.important("")
  UI.user_error!("SwiftLint finished with errors (exit code: #{exit_status})") unless ignore_exit_status
end

.is_supported?(platform) ⇒ Boolean

Returns:

  • (Boolean)


126
127
128
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 126

def self.is_supported?(platform)
  [:ios, :mac].include?(platform)
end

.outputObject



116
117
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 116

def self.output
end

.return_valueObject



119
120
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 119

def self.return_value
end

.run(params) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 4

def self.run(params)
  if `which swiftlint`.to_s.length == 0 && params[:executable].nil? && !Helper.test?
    UI.user_error!("You have to install swiftlint using `brew install swiftlint` or specify the executable path with the `:executable` option.")
  end

  version = swiftlint_version(executable: params[:executable])
  if params[:mode] == :autocorrect and version < Gem::Version.new('0.5.0') and !Helper.test?
    UI.user_error!("Your version of swiftlint (#{version}) does not support autocorrect mode.\nUpdate swiftlint using `brew update && brew upgrade swiftlint`")
  end

  command = (params[:executable] || "swiftlint").dup
  command << " #{params[:mode]}"
  command << supported_option_switch(params, :strict, "0.9.2", true)
  command << " --config #{params[:config_file].shellescape}" if params[:config_file]
  command << " --reporter #{params[:reporter]}" if params[:reporter]
  command << supported_option_switch(params, :quiet, "0.9.0", true)

  if params[:files]
    if version < Gem::Version.new('0.5.1')
      UI.user_error!("Your version of swiftlint (#{version}) does not support list of files as input.\nUpdate swiftlint using `brew update && brew upgrade swiftlint`")
    end

    files = params[:files].map.with_index(0) { |f, i| "SCRIPT_INPUT_FILE_#{i}=#{f.shellescape}" }.join(" ")
    command = command.prepend("SCRIPT_INPUT_FILE_COUNT=#{params[:files].count} #{files} ")
    command << " --use-script-input-files"
  end

  command << " > #{params[:output_file].shellescape}" if params[:output_file]

  begin
    Actions.sh(command)
  rescue
    handle_swiftlint_error(params[:ignore_exit_status], $?.exitstatus)
  end
end

.supported_option_switch(params, option, min_version, can_ignore = false) ⇒ Object

Return โ€œโ€“optionโ€ switch if option is on and current SwiftLint version is greater or equal than min version. Return โ€œโ€ otherwise.



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 48

def self.supported_option_switch(params, option, min_version, can_ignore = false)
  return "" unless params[option]
  version = swiftlint_version(executable: params[:executable])
  if version < Gem::Version.new(min_version)
    message = "Your version of swiftlint (#{version}) does not support '--#{option}' option.\nUpdate swiftlint to #{min_version} or above using `brew update && brew upgrade swiftlint`"
    message += "\nThe option will be ignored." if can_ignore
    can_ignore ? UI.important(message) : UI.user_error!(message)
    ""
  else
    " --#{option}"
  end
end

.swiftlint_version(executable: nil) ⇒ Object

Get current SwiftLint version



41
42
43
44
# File 'lib/fastlane/plugin/lizard/actions/swiftlint_example.rb', line 41

def self.swiftlint_version(executable: nil)
  binary = executable || 'swiftlint'
  Gem::Version.new(`#{binary} version`.chomp)
end