From cb21c0ab0384ddfa5702c3ca36fd786cfb053a8a Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Mon, 23 Nov 2020 17:28:55 +0300 Subject: [PATCH 1/3] some fixes and improvements for multiple swiftlint --- xcode/.swiftlint.yml | 3 +- .../multiple_swiftlint/setting_option.rb | 91 +++++++++++-------- .../multiple_swiftlint/strategy_maker.rb | 70 +++++++------- .../multiple_swiftlint/swiftlint.rb | 5 +- 4 files changed, 92 insertions(+), 77 deletions(-) diff --git a/xcode/.swiftlint.yml b/xcode/.swiftlint.yml index a8c88c7..53f5a30 100644 --- a/xcode/.swiftlint.yml +++ b/xcode/.swiftlint.yml @@ -72,8 +72,7 @@ opt_in_rules: excluded: - Carthage - Pods - - Generated - - Localization + - "**/Generated" line_length: warning: 128 diff --git a/xcode/build_phases/multiple_swiftlint/setting_option.rb b/xcode/build_phases/multiple_swiftlint/setting_option.rb index 44b8d7e..4374b24 100644 --- a/xcode/build_phases/multiple_swiftlint/setting_option.rb +++ b/xcode/build_phases/multiple_swiftlint/setting_option.rb @@ -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 diff --git a/xcode/build_phases/multiple_swiftlint/strategy_maker.rb b/xcode/build_phases/multiple_swiftlint/strategy_maker.rb index a677892..eb82ae4 100644 --- a/xcode/build_phases/multiple_swiftlint/strategy_maker.rb +++ b/xcode/build_phases/multiple_swiftlint/strategy_maker.rb @@ -7,19 +7,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 +33,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 +75,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 +87,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 +122,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') diff --git a/xcode/build_phases/multiple_swiftlint/swiftlint.rb b/xcode/build_phases/multiple_swiftlint/swiftlint.rb index 17f8383..9638347 100644 --- a/xcode/build_phases/multiple_swiftlint/swiftlint.rb +++ b/xcode/build_phases/multiple_swiftlint/swiftlint.rb @@ -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) From 44d4e4175d16fafdb40f280f137c864d5a6eaab2 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Mon, 23 Nov 2020 17:41:18 +0300 Subject: [PATCH 2/3] fix undefined method mktmpdir --- xcode/build_phases/multiple_swiftlint/strategy_maker.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/xcode/build_phases/multiple_swiftlint/strategy_maker.rb b/xcode/build_phases/multiple_swiftlint/strategy_maker.rb index eb82ae4..d297dbf 100644 --- a/xcode/build_phases/multiple_swiftlint/strategy_maker.rb +++ b/xcode/build_phases/multiple_swiftlint/strategy_maker.rb @@ -1,4 +1,5 @@ require 'fileutils' +require 'tmpdir' require_relative 'array_extension.rb' require_relative 'git_caretaker.rb' From 1054ae4d3e71824958a74e4597896f18f226afb7 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Mon, 23 Nov 2020 17:53:13 +0300 Subject: [PATCH 3/3] add prefer_zero_over_explicit_init rule --- xcode/.swiftlint.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/xcode/.swiftlint.yml b/xcode/.swiftlint.yml index 53f5a30..9a86a55 100644 --- a/xcode/.swiftlint.yml +++ b/xcode/.swiftlint.yml @@ -32,6 +32,7 @@ opt_in_rules: - fatal_error_message - extension_access_modifier - explicit_init + - prefer_zero_over_explicit_init # style