From a648c570c547c69a7a4cc54ec80d3ba68d701a5e Mon Sep 17 00:00:00 2001 From: Christopher Fuller Date: Thu, 5 Mar 2026 20:39:29 -0800 Subject: [PATCH 1/4] Apply standard Swift package configuration --- .github/workflows/swift.yml | 5 +- .swiftlint-rules.yml | 222 ------------------------------------ Package.swift | 5 +- 3 files changed, 6 insertions(+), 226 deletions(-) diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index ffc50fda..dc08695a 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -20,11 +20,11 @@ jobs: steps: - name: Checkout source uses: actions/checkout@v6 - - name: Download swiftlint binary + - name: Resolve package dependencies run: swift package resolve - name: Lint run: > - "$(find ".build/artifacts/swiftlint" -path "*macos*" -type f -name swiftlint -perm +111 -print -quit)" + swift package plugin --allow-writing-to-package-directory swiftlint -- lint --strict --reporter github-actions-logging - name: Resolve package dependencies run: xcodebuild -resolvePackageDependencies @@ -41,3 +41,4 @@ jobs: test-without-building -scheme "Layout-Package" -destination "name=$SIMULATOR,OS=latest" + run: swift test -v diff --git a/.swiftlint-rules.yml b/.swiftlint-rules.yml index 2ab21c99..8df27b40 100644 --- a/.swiftlint-rules.yml +++ b/.swiftlint-rules.yml @@ -1,248 +1,26 @@ analyzer_rules: -- capture_variable # - explicit_self -- typesafe_array_init # - unused_declaration -- unused_import only_rules: -- accessibility_label_for_image -- accessibility_trait_for_button -- anonymous_argument_in_multiline_closure -- array_init -- async_without_await -- attribute_name_spacing # - attributes -- balanced_xctest_lifecycle -- blanket_disable_command -- block_based_kvo -- class_delegate_protocol -- closing_brace -- closure_body_length -- closure_end_indentation -- closure_parameter_position -- closure_spacing -- collection_alignment -- colon -- comma -- comma_inheritance -- comment_spacing -- compiler_protocol_init -- computed_accessors_order -- conditional_returns_on_newline -- contains_over_filter_count -- contains_over_filter_is_empty -- contains_over_first_not_nil -- contains_over_range_nil_comparison # - contrasted_opening_brace -- control_statement -- convenience_type -- custom_rules -- cyclomatic_complexity -- deployment_target -- direct_return -- discarded_notification_center_observer -- discouraged_assert -- discouraged_direct_init -- discouraged_none_name -- discouraged_object_literal -- discouraged_optional_boolean -- discouraged_optional_collection -- duplicate_conditions -- duplicate_enum_cases -- duplicate_imports -- duplicated_key_in_dictionary_literal -- dynamic_inline -- empty_collection_literal -- empty_count -- empty_enum_arguments -- empty_parameters -- empty_parentheses_with_trailing_closure -- empty_string -- empty_xctest_method -- enum_case_associated_values_count -- expiring_todo -- explicit_acl -- explicit_enum_raw_value -- explicit_init -- explicit_top_level_acl -- explicit_type_interface # - extension_access_modifier -- fallthrough -- fatal_error_message -- file_header -- file_length -- file_name -- file_name_no_space -- file_types_order -- final_test_case -- first_where -- flatmap_over_map_reduce -- for_where -- force_cast -- force_try -- force_unwrapping -- function_body_length -- function_default_parameter_at_end -- function_parameter_count -- generic_type_name - given_when_then # custom_rule -- ibinspectable_in_extension -- identical_operands -- identifier_name -- implicit_getter -- implicit_return -- implicitly_unwrapped_optional -- inclusive_language # - indentation_width -- invalid_swiftlint_command -- is_disjoint -- joined_default_parameter -- large_tuple -- last_where -- leading_whitespace -- legacy_cggeometry_functions -- legacy_constant -- legacy_constructor -- legacy_hashing -- legacy_multiple -- legacy_nsgeometry_functions -- legacy_objc_type -- legacy_random -- let_var_whitespace -- line_length -- literal_expression_end_indentation -- local_doc_comment -- lower_acl_than_parent -- mark # - missing_docs -- modifier_order -- multiline_arguments # - multiline_arguments_brackets -- multiline_function_chains -- multiline_literal_brackets -- multiline_parameters -- multiline_parameters_brackets -- multiple_closures_with_trailing_closure -- nesting -- nimble_operator # - no_empty_block -- no_extension_access_modifier -- no_fallthrough_only -- no_grouping_extension # - no_magic_numbers -- no_space_in_method_call -- non_optional_string_data_conversion -- non_overridable_class_declaration -- notification_center_detachment -- ns_number_init_as_function_reference -- nslocalizedstring_key -- nslocalizedstring_require_bundle -- nsobject_prefer_isequal -- number_separator # - object_literal # - one_declaration_per_file -- opening_brace -- operator_usage_whitespace -- operator_whitespace -- optional_data_string_conversion -- optional_enum_case_matching -- orphaned_doc_comment -- overridden_super_call -- override_in_extension -- pattern_matching_keywords -- period_spacing -- prefer_key_path -- prefer_nimble -- prefer_self_in_static_references -- prefer_self_type_over_type_of_self -- prefer_type_checking -- prefer_zero_over_explicit_init # - prefixed_toplevel_constant -- private_action -- private_outlet -- private_over_fileprivate -- private_subject -- private_swiftui_state -- private_unit_test -- prohibited_interface_builder -- prohibited_super_call -- protocol_property_accessors_order -- quick_discouraged_call -- quick_discouraged_focused_test -- quick_discouraged_pending_test -- raw_value_for_camel_cased_codable_enum -- reduce_boolean -- reduce_into -- redundant_discardable_let -- redundant_nil_coalescing -- redundant_objc_attribute -- redundant_optional_initialization -- redundant_self_in_closure -- redundant_sendable -- redundant_set_access_control # - redundant_string_enum_value -- redundant_type_annotation -- redundant_void_return # - required_deinit -- required_enum_case -- return_arrow_whitespace # - return_value_from_void_function -- self_binding -- self_in_property_initialization # - shorthand_argument -- shorthand_operator -- shorthand_optional_binding -- single_test_class # - sorted_enum_cases -- sorted_first_last -- sorted_imports -- statement_position -- static_operator -- static_over_final_class -- strict_fileprivate -- strong_iboutlet -- superfluous_disable_command -- superfluous_else -- switch_case_alignment -- switch_case_on_newline -- syntactic_sugar -- test_case_accessibility -- todo -- toggle_bool -- trailing_closure -- trailing_comma -- trailing_newline -- trailing_semicolon -- trailing_whitespace -- type_body_length -- type_contents_order -- type_name -- unavailable_condition -- unavailable_function -- unhandled_throwing_task -- unneeded_break_in_switch # - unneeded_override -- unneeded_parentheses_in_closure_argument -- unneeded_synthesized_initializer -- unowned_variable_capture -- untyped_error_in_catch -- unused_closure_parameter -- unused_control_flow_label -- unused_enumerated -- unused_optional_binding -- unused_parameter -- unused_setter_value -- valid_ibinspectable -- vertical_parameter_alignment -- vertical_parameter_alignment_on_call -- vertical_whitespace # - vertical_whitespace_between_cases # - vertical_whitespace_closing_braces # - vertical_whitespace_opening_braces -- void_function_in_ternary -- void_return -- weak_delegate -- xct_specific_matcher -- xctfail_message -- yoda_condition diff --git a/Package.swift b/Package.swift index 509ea380..fb519b74 100644 --- a/Package.swift +++ b/Package.swift @@ -24,7 +24,7 @@ let package = Package( ], dependencies: [ .package( - url: "https://github.com/realm/SwiftLint.git", + url: "https://github.com/SimplyDanny/SwiftLintPlugins.git", exact: "0.59.1"), .package( url: "https://github.com/Quick/Nimble.git", @@ -62,6 +62,7 @@ package.targets.forEach { target in .regular, .test, .executable, + .macro, ] guard types.contains(target.type) @@ -78,7 +79,7 @@ package.targets.forEach { target in if enableSwiftLintBuildToolPlugin { target.plugins = (target.plugins ?? []) + [ - .plugin(name: "SwiftLintBuildToolPlugin", package: "SwiftLint"), + .plugin(name: "SwiftLintBuildToolPlugin", package: "SwiftLintPlugins"), ] } } From ef32cad997135f6e2650f2281681a388a9d55737 Mon Sep 17 00:00:00 2001 From: Christopher Fuller Date: Thu, 5 Mar 2026 20:40:43 -0800 Subject: [PATCH 2/4] Update package dependencies --- Package.resolved | 75 ++++-------------------------------------------- 1 file changed, 6 insertions(+), 69 deletions(-) diff --git a/Package.resolved b/Package.resolved index 3c9078a4..24c14c3e 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,24 +1,6 @@ { - "originHash" : "482120020e0c33c80672ad054160f25e8d048b7c522a512981c661db6c277c8c", + "originHash" : "e4ddefc032ee230495f1d14c0e8ceddbba8da8cb5d5e0b91491112b534bd8679", "pins" : [ - { - "identity" : "collectionconcurrencykit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/JohnSundell/CollectionConcurrencyKit.git", - "state" : { - "revision" : "b4f23e24b5a1bff301efc5e70871083ca029ff95", - "version" : "0.2.0" - } - }, - { - "identity" : "cryptoswift", - "kind" : "remoteSourceControl", - "location" : "https://github.com/krzyzanowskim/CryptoSwift.git", - "state" : { - "revision" : "e45a26384239e028ec87fbcc788f513b67e10d8f", - "version" : "1.9.0" - } - }, { "identity" : "cwlcatchexception", "kind" : "remoteSourceControl", @@ -46,24 +28,6 @@ "version" : "14.0.0" } }, - { - "identity" : "sourcekitten", - "kind" : "remoteSourceControl", - "location" : "https://github.com/jpsim/SourceKitten.git", - "state" : { - "revision" : "453f75b8a3bb2c3596c0d2dd422c289788233a22", - "version" : "0.37.1" - } - }, - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "c5d11a805e765f52ba34ec7284bd4fcd6ba68615", - "version" : "1.7.0" - } - }, { "identity" : "swift-custom-dump", "kind" : "remoteSourceControl", @@ -87,37 +51,19 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swiftlang/swift-syntax", "state" : { - "revision" : "1103c45ece4f7fe160b8f75b4ea1ee2e5fac1841", - "version" : "601.0.0" + "revision" : "4799286537280063c85a32f09884cfbca301b1a1", + "version" : "602.0.0" } }, { - "identity" : "swiftlint", + "identity" : "swiftlintplugins", "kind" : "remoteSourceControl", - "location" : "https://github.com/realm/SwiftLint.git", + "location" : "https://github.com/SimplyDanny/SwiftLintPlugins.git", "state" : { - "revision" : "625792423014cc49b0a1e5a1a5c0d6b8b3de10f9", + "revision" : "8545ddf4de043e6f2051c5cf204f39ef778ebf6b", "version" : "0.59.1" } }, - { - "identity" : "swiftytexttable", - "kind" : "remoteSourceControl", - "location" : "https://github.com/scottrhoyt/SwiftyTextTable.git", - "state" : { - "revision" : "c6df6cf533d120716bff38f8ff9885e1ce2a4ac3", - "version" : "0.9.0" - } - }, - { - "identity" : "swxmlhash", - "kind" : "remoteSourceControl", - "location" : "https://github.com/drmohundro/SWXMLHash.git", - "state" : { - "revision" : "a853604c9e9a83ad9954c7e3d2a565273982471f", - "version" : "7.0.2" - } - }, { "identity" : "xctest-dynamic-overlay", "kind" : "remoteSourceControl", @@ -126,15 +72,6 @@ "revision" : "dfd70507def84cb5fb821278448a262c6ff2bbad", "version" : "1.9.0" } - }, - { - "identity" : "yams", - "kind" : "remoteSourceControl", - "location" : "https://github.com/jpsim/Yams.git", - "state" : { - "revision" : "3d6871d5b4a5cd519adf233fbb576e0a2af71c17", - "version" : "5.4.0" - } } ], "version" : 3 From 3d026c840658b79b0d6b8ff6f3210f794ed891db Mon Sep 17 00:00:00 2001 From: Christopher Fuller Date: Thu, 5 Mar 2026 20:41:02 -0800 Subject: [PATCH 3/4] Update lint rules --- .swiftlint-rules.yml | 222 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) diff --git a/.swiftlint-rules.yml b/.swiftlint-rules.yml index 8df27b40..2ab21c99 100644 --- a/.swiftlint-rules.yml +++ b/.swiftlint-rules.yml @@ -1,26 +1,248 @@ analyzer_rules: +- capture_variable # - explicit_self +- typesafe_array_init # - unused_declaration +- unused_import only_rules: +- accessibility_label_for_image +- accessibility_trait_for_button +- anonymous_argument_in_multiline_closure +- array_init +- async_without_await +- attribute_name_spacing # - attributes +- balanced_xctest_lifecycle +- blanket_disable_command +- block_based_kvo +- class_delegate_protocol +- closing_brace +- closure_body_length +- closure_end_indentation +- closure_parameter_position +- closure_spacing +- collection_alignment +- colon +- comma +- comma_inheritance +- comment_spacing +- compiler_protocol_init +- computed_accessors_order +- conditional_returns_on_newline +- contains_over_filter_count +- contains_over_filter_is_empty +- contains_over_first_not_nil +- contains_over_range_nil_comparison # - contrasted_opening_brace +- control_statement +- convenience_type +- custom_rules +- cyclomatic_complexity +- deployment_target +- direct_return +- discarded_notification_center_observer +- discouraged_assert +- discouraged_direct_init +- discouraged_none_name +- discouraged_object_literal +- discouraged_optional_boolean +- discouraged_optional_collection +- duplicate_conditions +- duplicate_enum_cases +- duplicate_imports +- duplicated_key_in_dictionary_literal +- dynamic_inline +- empty_collection_literal +- empty_count +- empty_enum_arguments +- empty_parameters +- empty_parentheses_with_trailing_closure +- empty_string +- empty_xctest_method +- enum_case_associated_values_count +- expiring_todo +- explicit_acl +- explicit_enum_raw_value +- explicit_init +- explicit_top_level_acl +- explicit_type_interface # - extension_access_modifier +- fallthrough +- fatal_error_message +- file_header +- file_length +- file_name +- file_name_no_space +- file_types_order +- final_test_case +- first_where +- flatmap_over_map_reduce +- for_where +- force_cast +- force_try +- force_unwrapping +- function_body_length +- function_default_parameter_at_end +- function_parameter_count +- generic_type_name - given_when_then # custom_rule +- ibinspectable_in_extension +- identical_operands +- identifier_name +- implicit_getter +- implicit_return +- implicitly_unwrapped_optional +- inclusive_language # - indentation_width +- invalid_swiftlint_command +- is_disjoint +- joined_default_parameter +- large_tuple +- last_where +- leading_whitespace +- legacy_cggeometry_functions +- legacy_constant +- legacy_constructor +- legacy_hashing +- legacy_multiple +- legacy_nsgeometry_functions +- legacy_objc_type +- legacy_random +- let_var_whitespace +- line_length +- literal_expression_end_indentation +- local_doc_comment +- lower_acl_than_parent +- mark # - missing_docs +- modifier_order +- multiline_arguments # - multiline_arguments_brackets +- multiline_function_chains +- multiline_literal_brackets +- multiline_parameters +- multiline_parameters_brackets +- multiple_closures_with_trailing_closure +- nesting +- nimble_operator # - no_empty_block +- no_extension_access_modifier +- no_fallthrough_only +- no_grouping_extension # - no_magic_numbers +- no_space_in_method_call +- non_optional_string_data_conversion +- non_overridable_class_declaration +- notification_center_detachment +- ns_number_init_as_function_reference +- nslocalizedstring_key +- nslocalizedstring_require_bundle +- nsobject_prefer_isequal +- number_separator # - object_literal # - one_declaration_per_file +- opening_brace +- operator_usage_whitespace +- operator_whitespace +- optional_data_string_conversion +- optional_enum_case_matching +- orphaned_doc_comment +- overridden_super_call +- override_in_extension +- pattern_matching_keywords +- period_spacing +- prefer_key_path +- prefer_nimble +- prefer_self_in_static_references +- prefer_self_type_over_type_of_self +- prefer_type_checking +- prefer_zero_over_explicit_init # - prefixed_toplevel_constant +- private_action +- private_outlet +- private_over_fileprivate +- private_subject +- private_swiftui_state +- private_unit_test +- prohibited_interface_builder +- prohibited_super_call +- protocol_property_accessors_order +- quick_discouraged_call +- quick_discouraged_focused_test +- quick_discouraged_pending_test +- raw_value_for_camel_cased_codable_enum +- reduce_boolean +- reduce_into +- redundant_discardable_let +- redundant_nil_coalescing +- redundant_objc_attribute +- redundant_optional_initialization +- redundant_self_in_closure +- redundant_sendable +- redundant_set_access_control # - redundant_string_enum_value +- redundant_type_annotation +- redundant_void_return # - required_deinit +- required_enum_case +- return_arrow_whitespace # - return_value_from_void_function +- self_binding +- self_in_property_initialization # - shorthand_argument +- shorthand_operator +- shorthand_optional_binding +- single_test_class # - sorted_enum_cases +- sorted_first_last +- sorted_imports +- statement_position +- static_operator +- static_over_final_class +- strict_fileprivate +- strong_iboutlet +- superfluous_disable_command +- superfluous_else +- switch_case_alignment +- switch_case_on_newline +- syntactic_sugar +- test_case_accessibility +- todo +- toggle_bool +- trailing_closure +- trailing_comma +- trailing_newline +- trailing_semicolon +- trailing_whitespace +- type_body_length +- type_contents_order +- type_name +- unavailable_condition +- unavailable_function +- unhandled_throwing_task +- unneeded_break_in_switch # - unneeded_override +- unneeded_parentheses_in_closure_argument +- unneeded_synthesized_initializer +- unowned_variable_capture +- untyped_error_in_catch +- unused_closure_parameter +- unused_control_flow_label +- unused_enumerated +- unused_optional_binding +- unused_parameter +- unused_setter_value +- valid_ibinspectable +- vertical_parameter_alignment +- vertical_parameter_alignment_on_call +- vertical_whitespace # - vertical_whitespace_between_cases # - vertical_whitespace_closing_braces # - vertical_whitespace_opening_braces +- void_function_in_ternary +- void_return +- weak_delegate +- xct_specific_matcher +- xctfail_message +- yoda_condition From 1a0d5f20b8724e63208935cf1b68d59334e13aa0 Mon Sep 17 00:00:00 2001 From: Christopher Fuller Date: Thu, 5 Mar 2026 20:42:26 -0800 Subject: [PATCH 4/4] Fix --- .github/workflows/swift.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index dc08695a..f8e1a7a3 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -41,4 +41,3 @@ jobs: test-without-building -scheme "Layout-Package" -destination "name=$SIMULATOR,OS=latest" - run: swift test -v