Merge pull request #234 from TouchInstinct/feature/multiple_swiftlint_fixes

some fixes and improvements for multiple swiftlint
This commit is contained in:
Ivan Smolin 2020-11-23 19:03:42 +03:00 committed by GitHub
commit 5669222c5c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 94 additions and 77 deletions

View File

@ -32,6 +32,7 @@ opt_in_rules:
- fatal_error_message
- extension_access_modifier
- explicit_init
- prefer_zero_over_explicit_init
# style
@ -72,8 +73,7 @@ opt_in_rules:
excluded:
- Carthage
- Pods
- Generated
- Localization
- "**/Generated"
line_length:
warning: 128

View File

@ -7,17 +7,50 @@ class SettingOption
def initialize
@options = OpenStruct.new
OptionParser.new do |opt|
opt.on('-p', '--project_root_path STRING', 'The path of project directory and contains *.xcodeproj file always. ' +
'Example: project_root_path=~/Projects/MyProject/Source/..') { |option| @options.project_root_path = option }
opt.on('-r', '--source_root_path STRING', 'The path of source directory and may not contains *.xcodeproj file in some cases. ' +
'Example: source_root_path=~/Projects/MyProject/') { |option| @options.source_root_path = option }
opt.on('-s', '--swiftlint_executable_path STRING', 'The executable path of swiftlint') { |option| @options.swiftlint_executable_path = option }
opt.on('-c', '--check_mode MODE', 'The mode of check is "fully" or "simplified"') { |option| @options.check_mode = option }
opt.on('-u', '--use_multiple BOOL', 'The flag indicates the use of multiple yaml swiftlint configurations') { |option| @options.use_multiple = option }
opt.on('-d', '--source_date DATE', 'The date of grouping files according touchin and old swiftlint rules') { |option| @options.source_date = option }
opt.on('-y', '--touchin_swiftlint_yaml_path STRING', 'The path to the touchin swiftlint yaml relative to the source directory') { |option| @options.touchin_swiftlint_yaml_path = option }
opt.on('-p',
'--project_root_path STRING',
'The path of project directory and contains *.xcodeproj file always. ' +
'Example: project_root_path=~/Projects/MyProject/Source/..') { |option|
@options.project_root_path = option
}
opt.on('-r',
'--source_root_path STRING',
'The path of source directory and may not contains *.xcodeproj file in some cases. ' +
'Example: source_root_path=~/Projects/MyProject/') { |option|
@options.source_root_path = option
}
opt.on('-s',
'--swiftlint_executable_path STRING',
'The executable path of swiftlint') { |option|
@options.swiftlint_executable_path = option
}
opt.on('-c',
'--check_mode MODE',
'The mode of check is "fully" or "simplified"') { |option|
@options.check_mode = option
}
opt.on('-u',
'--use_multiple BOOL',
'The flag indicates the use of multiple yaml swiftlint configurations') { |option|
@options.use_multiple = option
}
opt.on('-d',
'--source_date DATE',
'The date of grouping files according touchin and old swiftlint rules') { |option|
@options.source_date = option
}
opt.on('-tc',
'--touchin_swiftlint_yaml_path STRING',
'The path to the touchin swiftlint yaml relative to the source directory') { |option|
@options.touchin_swiftlint_yaml_path = option
}
opt.on('-oc',
'--old_swiftlint_yaml_path STRING',
'The path to the old swiftlint yaml relative to the source directory') { |option|
@options.old_swiftlint_yaml_path = option
}
end.parse!
if @options.check_mode.to_s.nilOrEmpty?
@options.check_mode = 'fully'
end
@ -29,37 +62,17 @@ class SettingOption
if @options.source_root_path.to_s.nilOrEmpty?
@options.source_root_path = @options.project_root_path
end
if @options.touchin_swiftlint_yaml_path.to_s.nilOrEmpty?
@options.touchin_swiftlint_yaml_path = '/build-scripts/xcode/.swiftlint.yml'
@options.touchin_swiftlint_yaml_path = File.join(project_root_path, 'build-scripts/xcode/.swiftlint.yml')
end
if @options.old_swiftlint_yaml_path.to_s.nilOrEmpty?
@options.old_swiftlint_yaml_path = File.join(project_root_path, '.swiftlint.yml')
end
end
def project_root_path
@options.project_root_path
end
def source_date
@options.source_date
end
def swiftlint_executable_path
@options.swiftlint_executable_path
end
def check_mode
@options.check_mode
end
def use_multiple
@options.use_multiple
end
def source_root_path
@options.source_root_path
end
def touchin_swiftlint_yaml_path
@options.touchin_swiftlint_yaml_path
def method_missing(method, *args, &block)
@options.send(method, *args, &block)
end
end

View File

@ -1,4 +1,5 @@
require 'fileutils'
require 'tmpdir'
require_relative 'array_extension.rb'
require_relative 'git_caretaker.rb'
@ -7,19 +8,19 @@ require_relative 'swift_file_manager.rb'
require_relative 'yaml_manager.rb'
class StrategyMaker
def initialize(project_root_path, swiftlint_executable_path, touchin_swiftlint_yaml_path)
@project_root_path = project_root_path
@touchin_swiftlint_yaml_path = project_root_path + touchin_swiftlint_yaml_path
@old_swiftlint_yaml_path = project_root_path + '/.swiftlint.yml'
@temporary_swiftlint_folder_name = project_root_path + '/temporary_swiftlint'
@touchin_swiftlint_yaml_temporary_path = @temporary_swiftlint_folder_name + '/.touchin_swiftlint.yml'
@old_swiftlint_yaml_temporary_path = @temporary_swiftlint_folder_name + '/.old_swiftlint.yml'
def initialize(project_root_path, swiftlint_executable_path, touchin_swiftlint_yaml_path, old_swiftlint_yaml_path)
@project_root_path = project_root_path
@touchin_swiftlint_yaml_path = touchin_swiftlint_yaml_path
@old_swiftlint_yaml_path = old_swiftlint_yaml_path
@temporary_swiftlint_folder_name = Dir.mktmpdir
@touchin_swiftlint_yaml_temporary_path = File.join(@temporary_swiftlint_folder_name, '.touchin_swiftlint.yml')
@old_swiftlint_yaml_temporary_path = File.join(@temporary_swiftlint_folder_name, '.old_swiftlint.yml')
@swiftlint_autocorrect_command = swiftlint_executable_path + ' autocorrect --path ' + @project_root_path + ' --config '
@swiftlint_lint_command = swiftlint_executable_path + ' --path ' + @project_root_path + ' --config '
end
def run_fully_multiple_strategy(source_date)
create_yaml_managers_and_copy_temporary_files
@ -33,38 +34,38 @@ class StrategyMaker
@touchin_swiftlint_yaml_manager.update('excluded', total_touchin_excluded_files)
@old_swiftlint_yaml_manager.update('excluded', total_old_excluded_files)
run_multiple_strategy(@touchin_swiftlint_yaml_temporary_path, @old_swiftlint_yaml_temporary_path)
end
def run_simplified_multiple_strategy(source_date, source_root_path)
included_files = GitСaretaker.get_modified_files
if included_files.nilOrEmpty?
puts 'Git did not found swift files to check'
return
end
create_yaml_managers_and_copy_temporary_files
exclude_files = unique_exclude_files(@touchin_swiftlint_yaml_manager, @old_swiftlint_yaml_manager)
included_files = included_files.map { |file_path| source_root_path + file_path }
swift_file_manager = SwiftFileManager.new(exclude_files, source_date)
swift_file_manager.find_list_file_paths_from(included_files)
total_touchin_included_files = swift_file_manager.new_files
total_old_included_files = swift_file_manager.old_files
@touchin_swiftlint_yaml_manager.update('excluded', [])
@old_swiftlint_yaml_manager.update('excluded', [])
@touchin_swiftlint_yaml_manager.update('included', total_touchin_included_files)
@old_swiftlint_yaml_manager.update('included', total_old_included_files)
is_exist_total_touchin_included_files = (not total_touchin_included_files.nilOrEmpty?)
is_exist_total_old_included_files = (not total_old_included_files.nilOrEmpty?)
if is_exist_total_touchin_included_files and is_exist_total_old_included_files
run_multiple_strategy(@touchin_swiftlint_yaml_temporary_path, @old_swiftlint_yaml_temporary_path)
elsif is_exist_total_touchin_included_files and not is_exist_total_old_included_files
@ -75,11 +76,11 @@ class StrategyMaker
puts 'Git did not found swift files to check'
end
end
def run_fully_single_strategy
run_single_strategy(@touchin_swiftlint_yaml_path)
end
def run_simplified_single_strategy(source_root_path)
included_files = GitСaretaker.get_modified_files
@ -87,34 +88,34 @@ class StrategyMaker
puts 'Git did not found swift files to check'
return
end
create_copy_temporary_touchin_files
touchin_swiftlint_yaml_manager = YamlManager.new(@touchin_swiftlint_yaml_temporary_path)
touchin_excluded_files = touchin_swiftlint_yaml_manager.get_configuration('excluded')
swift_files = SwiftFileManager.new(touchin_excluded_files, '')
included_files = included_files.select { |file_name| not swift_files.is_excluded_file(file_name) }
included_files = included_files.map { |file_path| source_root_path + file_path }
touchin_swiftlint_yaml_manager.update('excluded', [])
touchin_swiftlint_yaml_manager.update('included', included_files)
if not included_files.nilOrEmpty?
run_single_strategy(@touchin_swiftlint_yaml_temporary_path)
else
puts 'Git found the swift files to check, but they are excluded in yaml'
end
end
private
def run_single_strategy(swiftlint_yaml_path)
result_swiftlint_command = get_swiftlint_command(swiftlint_yaml_path)
puts result_swiftlint_command
run_bash_command(result_swiftlint_command)
end
def run_multiple_strategy(touchin_swiftlint_yaml_temporary_path, old_swiftlint_yaml_temporary_path)
touchin_swiftlint_command = get_swiftlint_command(touchin_swiftlint_yaml_temporary_path)
old_swiftlint_command = get_swiftlint_command(old_swiftlint_yaml_temporary_path)
@ -122,34 +123,34 @@ class StrategyMaker
puts result_swiftlint_command
run_bash_command(result_swiftlint_command)
end
def get_swiftlint_command(swiftlint_yaml_path)
autocorrect_command = @swiftlint_autocorrect_command + swiftlint_yaml_path
lint_command = @swiftlint_lint_command + swiftlint_yaml_path
return autocorrect_command + ' && ' + lint_command
end
def run_bash_command(bash_command)
exit (exec bash_command)
end
def create_yaml_managers_and_copy_temporary_files
create_copy_temporary_files
@touchin_swiftlint_yaml_manager = YamlManager.new(@touchin_swiftlint_yaml_temporary_path)
@old_swiftlint_yaml_manager = YamlManager.new(@old_swiftlint_yaml_temporary_path)
end
def create_copy_temporary_files
create_copy_temporary_touchin_files
FileUtils.cp @old_swiftlint_yaml_path, @old_swiftlint_yaml_temporary_path
end
def create_copy_temporary_touchin_files
Dir.mkdir(@temporary_swiftlint_folder_name) unless Dir.exist?(@temporary_swiftlint_folder_name)
FileUtils.cp @touchin_swiftlint_yaml_path, @touchin_swiftlint_yaml_temporary_path
end
def unique_exclude_files(touchin_swiftlint_yaml_manager, old_swiftlint_yaml_manager)
touchin_excluded_files = touchin_swiftlint_yaml_manager.get_configuration('excluded')
old_excluded_files = old_swiftlint_yaml_manager.get_configuration('excluded')

View File

@ -3,7 +3,10 @@ require_relative 'setting_option.rb'
require_relative 'strategy_maker.rb'
setting = SettingOption.new
strategy_maker = StrategyMaker.new(setting.project_root_path, setting.swiftlint_executable_path, setting.touchin_swiftlint_yaml_path)
strategy_maker = StrategyMaker.new(setting.project_root_path,
setting.swiftlint_executable_path,
setting.touchin_swiftlint_yaml_path,
setting.old_swiftlint_yaml_path)
if setting.check_mode.eql? 'fully' and setting.use_multiple.true?
strategy_maker.run_fully_multiple_strategy(setting.source_date)