-
Notifications
You must be signed in to change notification settings - Fork 598
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Non-Metal based perceptual image comparison #666
Non-Metal based perceptual image comparison #666
Conversation
…o a missed compiler optimization
Replaces the CoreImage operations that require Metal with CPU-based calculations
Thank you! I spent a bunch of time recently trying to debug why we were having false positive on our CI/CD pipeline, I was able to narrow it down to trying to use perceptual precision on a virtualized MacOS and ended up putting some other bandaids in place to fix it temporarily. |
I just recently switched to the revision with this change and what I see in the CI logs is that every failing test is now taking 12 seconds and more where without using precision (or setting it to 1.0) it takes ~2s |
let failingPixelPercent = Float(failingPixelCount) / Float(deltaOutputImage.extent.width * deltaOutputImage.extent.height) | ||
let actualPixelPrecision = 1 - failingPixelPercent | ||
guard actualPixelPrecision < pixelPrecision else { return nil } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
couldn't this check (or rather the opposite) be inside the for loop for a quicker exist? we know the size of the deltaOutputImage
before the loop, so we can calculate the number of pixels that may fail (rather than computing precision every iteration after incrementing failed pixel count) and then the loop can be aborted as soon as this number is exceeded. Otherwise we are comparing all the pixels even when we know that snapshot is not precise enough.
I guess we don't have this problem when snapshots match since they would be compared for exact match before this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've tried that in my fork but it didn't give me any significant improvements
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, as the complexity would not change from O(n) (n = number of pixels) and unless you're comparing a very large images with huge custom frame sizes, the tests times will not improve significantly
@@ -169,83 +169,77 @@ private func diff(_ old: UIImage, _ new: UIImage) -> UIImage { | |||
#endif | |||
|
|||
#if os(iOS) || os(tvOS) || os(macOS) | |||
import CoreImage.CIKernel | |||
import MetalPerformanceShaders |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If there is a way to know if Metal is supported could we keep the previous implementation in case it is more performant than the alternative?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also if only metal backport of the threshold filter is the issue why to remove the use of all core image filters rather than using CIColorThreshold for iOS 14+ and fallback to CPU otherwise?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can check metal support like so:
MTLCreateSystemDefaultDevice() == nil
Having the same issue here using Xcode Cloud. It's outputting |
I don't think any more that my issue is related to Metal not being available. In that case I would expect 100% failures, yet some tests are still failing on CI as expected but some are not. |
With my investigations here, when this "No Metal renderer available" runs, it renders a completely blank image for any snapshot, either the newly taken or the reference one. So, the images will always match. It'll only fail when having different dimensions/frames. Maybe it's your case |
Yes, you are most likely right about that! |
@ejensen is there any changes you could get back to this? Since it's either false positives or degraded performance will have to revert to using intel machines for recording snapshots but don't want to do that if you have an idea how to solve this. |
Check for support before using and fallback to CPU computation if Metal is not supported
Commit 8d402bf adds the Metal-based method back. There is not a straightforward way to determine if the (virtualized) machine supports Metal, so there is a tricky bit of conditional logic that would benefit from testing on more machine configurations. |
@ejensen thanks for the update, although I don't think it will help with performance when Metal is not supported. Is there a way to use a similar filter from CoreImage? |
Hello, I am having the issue described here: #710, and this PR really fixed the problem. Great works! Is it possible to merge it as soon as possible? |
@ejensen In your original PR you had used the |
Sounds like we should be able to cover all bases if we add one more availability check:
|
# Conflicts: # Sources/SnapshotTesting/Snapshotting/NSImage.swift # Sources/SnapshotTesting/Snapshotting/UIImage.swift
* wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * fix * beta 6 * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * fix * wip * wip * wip * wip * wip * wip * wip * wip * wip * small things * wip * DocC + swift-format (#765) * DocC and swift-format support * wip * wip * wip --------- Co-authored-by: Brandon Williams <[email protected]>
Thanks for this! And sorry for the delay. Strategy-specific PRs tend to take on a lot of complexity due to all the branching and platforms involved. We finally took some time to look things over and take the branch for a spin and it looks like a definite improvement over the buggy behavior we previously had. |
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Type | Update | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---|---|---| | [dkk/WrappingHStack](https://togithub.com/dkk/WrappingHStack) | | minor | `from: "2.0.0"` -> `from: "2.2.11"` | [![age](https://developer.mend.io/api/mc/badges/age/git-tags/dkk%2fWrappingHStack/2.2.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/git-tags/dkk%2fWrappingHStack/2.2.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/git-tags/dkk%2fWrappingHStack/2.0.0/2.2.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/git-tags/dkk%2fWrappingHStack/2.0.0/2.2.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [fastlane](https://fastlane.tools) ([source](https://togithub.com/fastlane/fastlane), [changelog](https://togithub.com/fastlane/fastlane/releases)) | | minor | `"~> 2.216.0"` -> `"~> 2.219.0"` | [![age](https://developer.mend.io/api/mc/badges/age/rubygems/fastlane/2.219.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/rubygems/fastlane/2.219.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/rubygems/fastlane/2.216.0/2.219.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/rubygems/fastlane/2.216.0/2.219.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | json | | minor | `"~> 2.6.2"` -> `"~> 2.7.0"` | [![age](https://developer.mend.io/api/mc/badges/age/rubygems/json/2.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/rubygems/json/2.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/rubygems/json/2.6.3/2.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/rubygems/json/2.6.3/2.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [marmelroy/PhoneNumberKit](https://togithub.com/marmelroy/PhoneNumberKit) | | patch | `from: "3.7.5"` -> `from: "3.7.9"` | [![age](https://developer.mend.io/api/mc/badges/age/git-tags/marmelroy%2fPhoneNumberKit/3.7.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/git-tags/marmelroy%2fPhoneNumberKit/3.7.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/git-tags/marmelroy%2fPhoneNumberKit/3.7.5/3.7.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/git-tags/marmelroy%2fPhoneNumberKit/3.7.5/3.7.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [nicklockwood/SwiftFormat](https://togithub.com/nicklockwood/SwiftFormat) | repository | minor | `0.52.8` -> `0.53.5` | [![age](https://developer.mend.io/api/mc/badges/age/github-tags/nicklockwood%2fSwiftFormat/0.53.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/github-tags/nicklockwood%2fSwiftFormat/0.53.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/github-tags/nicklockwood%2fSwiftFormat/0.52.8/0.53.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/nicklockwood%2fSwiftFormat/0.52.8/0.53.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [pointfreeco/swift-snapshot-testing](https://togithub.com/pointfreeco/swift-snapshot-testing) | | minor | `from: "1.14.2"` -> `from: "1.15.4"` | [![age](https://developer.mend.io/api/mc/badges/age/git-tags/pointfreeco%2fswift-snapshot-testing/1.15.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/git-tags/pointfreeco%2fswift-snapshot-testing/1.15.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/git-tags/pointfreeco%2fswift-snapshot-testing/1.14.2/1.15.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/git-tags/pointfreeco%2fswift-snapshot-testing/1.14.2/1.15.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [realm/SwiftLint](https://togithub.com/realm/SwiftLint) | repository | minor | `0.53.0` -> `0.54.0` | [![age](https://developer.mend.io/api/mc/badges/age/github-tags/realm%2fSwiftLint/0.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/github-tags/realm%2fSwiftLint/0.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/github-tags/realm%2fSwiftLint/0.53.0/0.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/realm%2fSwiftLint/0.53.0/0.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [ruby](https://www.ruby-lang.org) ([source](https://togithub.com/ruby/ruby)) | | minor | `3.2.2` -> `3.3.0` | [![age](https://developer.mend.io/api/mc/badges/age/ruby-version/ruby/3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/ruby-version/ruby/3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/ruby-version/ruby/3.2.2/3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/ruby-version/ruby/3.2.2/3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | Note: The `pre-commit` manager in Renovate is not supported by the `pre-commit` maintainers or community. Please do not report any problems there, instead [create a Discussion in the Renovate repository](https://togithub.com/renovatebot/renovate/discussions/new) if you have any questions. --- ### Release Notes <details> <summary>dkk/WrappingHStack (dkk/WrappingHStack)</summary> ### [`v2.2.11`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.11) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.2.10...2.2.11) Updates for tvOS and VisionOS ### [`v2.2.10`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.10) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.2.9...2.2.10) Fixes [#​40](https://togithub.com/dkk/WrappingHStack/issues/40) ### [`v2.2.9`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.9) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.2.8...2.2.9) fix [#​37](https://togithub.com/dkk/WrappingHStack/issues/37) ### [`v2.2.8`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.8) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.2.7...2.2.8) Fixes performance issues by reusing content and line management calculations. Fixes [#​4](https://togithub.com/dkk/WrappingHStack/issues/4) Fixes [#​34](https://togithub.com/dkk/WrappingHStack/issues/34) ### [`v2.2.7`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.7) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.2.6...2.2.7) Added an action for automatic deploys to cocoapods. Fixes [#​35](https://togithub.com/dkk/WrappingHStack/issues/35). ### [`v2.2.6`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.6) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.2.5...2.2.6) minor performance update ### [`v2.2.5`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.5) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.2.4...2.2.5) fix [#​32](https://togithub.com/dkk/WrappingHStack/issues/32): "anyView" on MacOS in InternalWrappingHStack - add osx example app ### [`v2.2.4`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.4) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.2.3...2.2.4) fix [#​17](https://togithub.com/dkk/WrappingHStack/issues/17): Spacing always applied around conditional views ### [`v2.2.3`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.3) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.2.2...2.2.3) Fix for [#​27](https://togithub.com/dkk/WrappingHStack/issues/27), [#​28](https://togithub.com/dkk/WrappingHStack/issues/28), [#​29](https://togithub.com/dkk/WrappingHStack/issues/29) by [@​MikeMorawski](https://togithub.com/MikeMorawski) ### [`v2.2.2`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.2) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.2.1...2.2.2) Add Cocoapods support ### [`v2.2.1`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.1) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.2.0...2.2.1) Fixes "Bound preference CGFloatPreferenceKey tried to update multiple times per frame." when scrolling trough multiple WrappingHStack on a scrollview Thanks to [@​lucianohandal](https://togithub.com/lucianohandal) ### [`v2.2.0`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.2.0) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.1.3...2.2.0) Add lineSpacing functionality Thanks to [@​xcuYao](https://togithub.com/xcuYao) ### [`v2.1.3`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.1.3) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.1.2...2.1.3) Fix: Add missing [@​ViewBuilder](https://togithub.com/ViewBuilder) ### [`v2.1.2`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.1.2) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.1.1...2.1.2) Improved performance: stores the result of `InternalWrappingHStack.firstItemOfEachLane`, as it's indirectly referenced multiple times in the view body (thanks to [@​scottostler](https://togithub.com/scottostler)) ### [`v2.1.1`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.1.1) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.1.0...2.1.1) Fix: NewLine() Bug ### [`v2.1.0`](https://togithub.com/dkk/WrappingHStack/releases/tag/2.1.0) [Compare Source](https://togithub.com/dkk/WrappingHStack/compare/2.0.0...2.1.0) Fix alignments + additional spacing types </details> <details> <summary>fastlane/fastlane (fastlane)</summary> ### [`v2.219.0`](https://togithub.com/fastlane/fastlane/releases/tag/2.219.0): Improvements [Compare Source](https://togithub.com/fastlane/fastlane/compare/2.218.0...2.219.0) - \[fastlane]\[ci] Lock google-cloud-env < 2.0.0 for Ruby 2.6 and fix CI to use specified ruby versions ([#​21777](https://togithub.com/fastlane/fastlane/issues/21777)) via Josh Holtz ([@​joshdholtz](https://togithub.com/joshdholtz)) - \[sigh] prevent crashes in `fetch_profiles` when profiles have no `bundle_id` ([#​21758](https://togithub.com/fastlane/fastlane/issues/21758)) via jonas2808 ([@​jonas2808](https://togithub.com/jonas2808)) - \[scan] Fix device selection issue fallback scenario ([#​21772](https://togithub.com/fastlane/fastlane/issues/21772)) via arc-v2 ([@​arc-v2](https://togithub.com/arc-v2)) - \[sigh] fix cache parameters validation ([#​21766](https://togithub.com/fastlane/fastlane/issues/21766)) via Vitalii Budnik ([@​nekrich](https://togithub.com/nekrich)) - \[match] fix cache issues in read-only mode ([#​21767](https://togithub.com/fastlane/fastlane/issues/21767)) via Vitalii Budnik ([@​nekrich](https://togithub.com/nekrich)) ### [`v2.218.0`](https://togithub.com/fastlane/fastlane/releases/tag/2.218.0): Improvements [Compare Source](https://togithub.com/fastlane/fastlane/compare/2.217.0...2.218.0) Auto-generated by fastlane 🤖 **Changes since release '2.217.0':** - \[action]\[sonar] replace deprecated sonar.login parameter with sonar.token ([#​21736](https://togithub.com/fastlane/fastlane/issues/21736)) via Panajev ([@​Panajev](https://togithub.com/Panajev)) - \[action]\[spm] add simulator flag for swift compiler ([#​21707](https://togithub.com/fastlane/fastlane/issues/21707)) via Mohammad Gharari ([@​gharary](https://togithub.com/gharary)) - \[security] update `sinatra` dev dependency to resolve dependabot alert ([#​21709](https://togithub.com/fastlane/fastlane/issues/21709)) via Jerome Lacoste ([@​lacostej](https://togithub.com/lacostej)) - \[fastlane-core] recommends to retry uploading when AltoolTransporterExecutor crashes ([#​21536](https://togithub.com/fastlane/fastlane/issues/21536)) via Jason Hagglund ([@​TheMetalCode](https://togithub.com/TheMetalCode)) - \[Fastlane.swift] fix Unexpected duplicate tasks error message in Fastlane Swift ([#​21621](https://togithub.com/fastlane/fastlane/issues/21621)) via Daniel Jankowski ([@​mollyIV](https://togithub.com/mollyIV)) - \[scan] Filter simulators with version greater than SDK version of active Xcode installation when choosing default ([#​21677](https://togithub.com/fastlane/fastlane/issues/21677)) via wuaar1003 ([@​wuaar1003](https://togithub.com/wuaar1003)) - \[plugin_generator] move development dependencies from `*.gemspec.erb` to `Gemfile.erb` ([#​21726](https://togithub.com/fastlane/fastlane/issues/21726)) via Roger Oba ([@​rogerluan](https://togithub.com/rogerluan)) - \[match] add caching layer to significantly improve performance by up to 100x ([#​21694](https://togithub.com/fastlane/fastlane/issues/21694)) via Vitalii Budnik ([@​nekrich](https://togithub.com/nekrich)) - \[fastlane_core] add support to Ruby 3.3 ([#​21683](https://togithub.com/fastlane/fastlane/issues/21683)) via Jerome Lacoste ([@​lacostej](https://togithub.com/lacostej)) - \[fastlane] remove some unused method parameters ([#​21722](https://togithub.com/fastlane/fastlane/issues/21722)) via Jerome Lacoste ([@​lacostej](https://togithub.com/lacostej)) - \[action]\[spm] deprecate `build_path` option in favor of `scratch_path`, as recommended by Swift CLI ([#​20814](https://togithub.com/fastlane/fastlane/issues/20814)) via Victor Carvalho Tavernari ([@​Tavernari](https://togithub.com/Tavernari)) - \[match] git storage: allow simultaneous usage of clone_branch_directly and shallow_clone ([#​21716](https://togithub.com/fastlane/fastlane/issues/21716)) via Vitalii Budnik ([@​nekrich](https://togithub.com/nekrich)) - \[action]\[spm] add `parallel` option ([#​21665](https://togithub.com/fastlane/fastlane/issues/21665)) via Bram Schulting ([@​bramschulting](https://togithub.com/bramschulting)) - \[fastlane_core] remove expired WWDR G1 certificate from cert_checker ([#​21098](https://togithub.com/fastlane/fastlane/issues/21098)) via janwiebe-jump ([@​janwiebe-jump](https://togithub.com/janwiebe-jump)) - \[action]\[upload_symbols_to_crashlytics] allow '~' in binary path ([#​21032](https://togithub.com/fastlane/fastlane/issues/21032)) via GevaZeichner ([@​GevaZeichner](https://togithub.com/GevaZeichner)) - \[scan] replace the `simctl boot` command with `simctl bootstatus`, potentially fixing signal kill before running tests ([#​21026](https://togithub.com/fastlane/fastlane/issues/21026)) via Alexey Alter-Pesotskiy ([@​testableapple](https://togithub.com/testableapple)) - \[spaceship] add `Spaceship::ConnectAPI::AppPreviewSet::PreviewType::IPHONE_67` ([#​21710](https://togithub.com/fastlane/fastlane/issues/21710)) via Sergei Sevkovich ([@​drcreazy](https://togithub.com/drcreazy)) - \[action]\[ensure_no_debug_code] detect binding.irb in `ensure_no_debug_code` during build. ([#​21635](https://togithub.com/fastlane/fastlane/issues/21635)) via Takuma Homma ([@​mataku](https://togithub.com/mataku)) - CONTRIBUTING.md: remove Google CLA section ([#​21646](https://togithub.com/fastlane/fastlane/issues/21646)) via Jay Soffian ([@​jaysoffian](https://togithub.com/jaysoffian)) - \[fastlane_core] hide xcodebuild stderr to solve [#​21672](https://togithub.com/fastlane/fastlane/issues/21672) ([#​21673](https://togithub.com/fastlane/fastlane/issues/21673)) via Jerome Lacoste ([@​lacostej](https://togithub.com/lacostej)) - \[scan] fix misleading error message when no devices are found ([#​21650](https://togithub.com/fastlane/fastlane/issues/21650)) via Miles Thompson ([@​MagnificentMiles](https://togithub.com/MagnificentMiles)) - \[deliver]\[spaceship]\[scan] fix build warnings in rspec ([#​21660](https://togithub.com/fastlane/fastlane/issues/21660)) via Jerome Lacoste ([@​lacostej](https://togithub.com/lacostej)) - \[deliver] fix regression where changes made to the privacy URL fail to upload ([#​21657](https://togithub.com/fastlane/fastlane/issues/21657)) via Owen Hart ([@​owjsub](https://togithub.com/owjsub)) - \[fastlane_core] let FastlanePty detect when externally invoked programs crash, harden it when using popen, and expose process statuses. ([#​21618](https://togithub.com/fastlane/fastlane/issues/21618)) via Jerome Lacoste ([@​lacostej](https://togithub.com/lacostej)) ### [`v2.217.0`](https://togithub.com/fastlane/fastlane/releases/tag/2.217.0): Improvements [Compare Source](https://togithub.com/fastlane/fastlane/compare/2.216.0...2.217.0) - \[spaceship] work around deliver issue [#​21105](https://togithub.com/fastlane/fastlane/issues/21105) ([#​21633](https://togithub.com/fastlane/fastlane/issues/21633)) via Jerome Lacoste ([@​lacostej](https://togithub.com/lacostej)) - \[action]\[slather] add support for slather's new --ymlfile option ([#​21613](https://togithub.com/fastlane/fastlane/issues/21613)) via jarrodlombardo-EventBase ([@​jarrodlombardo-EventBase](https://togithub.com/jarrodlombardo-EventBase)) - \[action]\[notarize] printing log on error ([#​21609](https://togithub.com/fastlane/fastlane/issues/21609)) via Csaba Szigeti ([@​szigetics](https://togithub.com/szigetics)) - \[tests] fix test being potentially muddied by local ENV ([#​21586](https://togithub.com/fastlane/fastlane/issues/21586)) via Olivier Halligon ([@​AliSoftware](https://togithub.com/AliSoftware)) - \[match] remove redundant fetching of profile devices and certificates ([#​21409](https://togithub.com/fastlane/fastlane/issues/21409)) via Vitalii Budnik ([@​nekrich](https://togithub.com/nekrich)) - \[match] hide sensitive information in match output ([#​21603](https://togithub.com/fastlane/fastlane/issues/21603)) via Duncan MacDonald ([@​oct0f1sh](https://togithub.com/oct0f1sh)) - \[supple] fix issue with releases containing retained versions ([#​20997](https://togithub.com/fastlane/fastlane/issues/20997)) ([#​20998](https://togithub.com/fastlane/fastlane/issues/20998)) via Mariano Miani ([@​mmiani](https://togithub.com/mmiani)) - \[action]\[git_branch] add `FL_GIT_BRANCH_DONT_USE_ENV_VARS` env var to `git_branch` ([#​21597](https://togithub.com/fastlane/fastlane/issues/21597)) via Oguz Kocer ([@​oguzkocer](https://togithub.com/oguzkocer)) - \[tests] Make error message expectation more flexible in `runner_spec.rb` to support Ruby 2.6 error message format ([#​21591](https://togithub.com/fastlane/fastlane/issues/21591)) via Olivier Halligon ([@​AliSoftware](https://togithub.com/AliSoftware)) - \[docs] fix typo `practies` → `practices` based on feedback from fastlane/docs ([#​21589](https://togithub.com/fastlane/fastlane/issues/21589)) via Roger Oba ([@​rogerluan](https://togithub.com/rogerluan)) - \[fastlane] add support for keyword arguments for lanes in Ruby 3 ([#​21587](https://togithub.com/fastlane/fastlane/issues/21587)) via Olivier Halligon ([@​AliSoftware](https://togithub.com/AliSoftware)) - \[tests] update `fakefs` to fix test failures on Ruby 3.2.2 ([#​21588](https://togithub.com/fastlane/fastlane/issues/21588)) via Olivier Halligon ([@​AliSoftware](https://togithub.com/AliSoftware)) - \[deliver] Add Watch Ultra screen size ([#​21106](https://togithub.com/fastlane/fastlane/issues/21106)) via Aoi Takahashi ([@​xiii111](https://togithub.com/xiii111)) - \[docs] update a bit of the documentation of install_on_device.rb ([#​21196](https://togithub.com/fastlane/fastlane/issues/21196)) via ls-1N ([@​ls-1N](https://togithub.com/ls-1N)) - \[precheck] print the HTTP status as the failure reason when it's not 200 ([#​21051](https://togithub.com/fastlane/fastlane/issues/21051)) via Roger Oba ([@​rogerluan](https://togithub.com/rogerluan)) - \[supply] parallel uploads for meta per language ([#​21474](https://togithub.com/fastlane/fastlane/issues/21474)) via Cristian Caruceru ([@​ccaruceru](https://togithub.com/ccaruceru)) - \[action]\[nexus_upload] Mark Nexus password as a sensitive field ([#​21564](https://togithub.com/fastlane/fastlane/issues/21564)) via Liam Jones ([@​liamjones](https://togithub.com/liamjones)) - \[trainer] check specifically for file url in failure_message, fixing crash in Xcode 15 when running in Apple Silicon ([#​21493](https://togithub.com/fastlane/fastlane/issues/21493)) via Jason Hagglund ([@​TheMetalCode](https://togithub.com/TheMetalCode)) - \[gym] fix error message for catalyst_platform option ([#​21332](https://togithub.com/fastlane/fastlane/issues/21332)) via Sebastian Staudt ([@​koraktor](https://togithub.com/koraktor)) - \[deliver] show file type correctly in user_error ([#​21403](https://togithub.com/fastlane/fastlane/issues/21403)) via Aru Hyunseung Jeon ([@​Dogdriip](https://togithub.com/Dogdriip)) - \[gym] fix multiplatform iOS builds ([#​21319](https://togithub.com/fastlane/fastlane/issues/21319)) via Zach Waugh ([@​zachwaugh](https://togithub.com/zachwaugh)) - \[match] make git_private_key path absolute ([#​21360](https://togithub.com/fastlane/fastlane/issues/21360)) via Marko Samec ([@​msamec](https://togithub.com/msamec)) - \[snapshot] Add Missing Older iPhone & iPad models to Generated Snapshot Reports ([#​21557](https://togithub.com/fastlane/fastlane/issues/21557)) via Kyle Howells ([@​kylehowells](https://togithub.com/kylehowells)) - \[deliver] Capturing NoMethodError exception when fetching live app info ([#​21553](https://togithub.com/fastlane/fastlane/issues/21553)) via Ignacio Calderon ([@​kronenthaler](https://togithub.com/kronenthaler)) - \[snapshot] support Strict Concurrency for SnapshotHelper ([#​21400](https://togithub.com/fastlane/fastlane/issues/21400)) via Kohki Miki ([@​giginet](https://togithub.com/giginet)) - \[match] added selection of certificate and p12 key by certificate id ([#​21428](https://togithub.com/fastlane/fastlane/issues/21428)) via Ivan Sorokoletov ([@​slacklab](https://togithub.com/slacklab)) - \[spaceship] allow to specify fetched fields ([#​21528](https://togithub.com/fastlane/fastlane/issues/21528)) via Vitalii Budnik ([@​nekrich](https://togithub.com/nekrich)) - \[snapshot] add Support for New Apple Devices in Snapshot Generator ([#​21554](https://togithub.com/fastlane/fastlane/issues/21554)) via Sandeep Joshi ([@​isandeepj](https://togithub.com/isandeepj)) - \[deliver] fetch live app info if no edit info is present, fixing scenario of having both macOS and iOS apps present ([#​21472](https://togithub.com/fastlane/fastlane/issues/21472)) via Lorenzo Mattei ([@​loremattei](https://togithub.com/loremattei)) </details> <details> <summary>marmelroy/PhoneNumberKit (marmelroy/PhoneNumberKit)</summary> ### [`v3.7.9`](https://togithub.com/marmelroy/PhoneNumberKit/releases/tag/3.7.9) [Compare Source](https://togithub.com/marmelroy/PhoneNumberKit/compare/3.7.8...3.7.9) #### What's Changed - Updated metadata to version metadata/8.13.31 by [@​github-actions](https://togithub.com/github-actions) in [https://github.com/marmelroy/PhoneNumberKit/pull/747](https://togithub.com/marmelroy/PhoneNumberKit/pull/747) - Move privacy manifest from resources to resource bundle by [@​MariuszWisniewski](https://togithub.com/MariuszWisniewski) in [https://github.com/marmelroy/PhoneNumberKit/pull/748](https://togithub.com/marmelroy/PhoneNumberKit/pull/748) #### New Contributors - [@​MariuszWisniewski](https://togithub.com/MariuszWisniewski) made their first contribution in [https://github.com/marmelroy/PhoneNumberKit/pull/748](https://togithub.com/marmelroy/PhoneNumberKit/pull/748) **Full Changelog**: marmelroy/PhoneNumberKit@3.7.8...3.7.9 ### [`v3.7.8`](https://togithub.com/marmelroy/PhoneNumberKit/releases/tag/3.7.8) [Compare Source](https://togithub.com/marmelroy/PhoneNumberKit/compare/3.7.7...3.7.8) #### What's Changed - Adds privacy manifest by [@​bguidolim](https://togithub.com/bguidolim) in [https://github.com/marmelroy/PhoneNumberKit/pull/746](https://togithub.com/marmelroy/PhoneNumberKit/pull/746) **Full Changelog**: marmelroy/PhoneNumberKit@3.7.7...3.7.8 ### [`v3.7.7`](https://togithub.com/marmelroy/PhoneNumberKit/releases/tag/3.7.7) [Compare Source](https://togithub.com/marmelroy/PhoneNumberKit/compare/3.7.6...3.7.7) #### What's Changed - Updated metadata to version metadata/8.13.27 by [@​github-actions](https://togithub.com/github-actions) in [https://github.com/marmelroy/PhoneNumberKit/pull/731](https://togithub.com/marmelroy/PhoneNumberKit/pull/731) - Fix minor 'Patten' typo in `PhoneNumberPatterns.countryCodePatten` (renames to `countryCodePattern`) by [@​gleb-tregubov](https://togithub.com/gleb-tregubov) in [https://github.com/marmelroy/PhoneNumberKit/pull/733](https://togithub.com/marmelroy/PhoneNumberKit/pull/733) - Updated metadata to version metadata/8.13.28 by [@​github-actions](https://togithub.com/github-actions) in [https://github.com/marmelroy/PhoneNumberKit/pull/735](https://togithub.com/marmelroy/PhoneNumberKit/pull/735) - Updated metadata to version metadata/8.13.29 by [@​github-actions](https://togithub.com/github-actions) in [https://github.com/marmelroy/PhoneNumberKit/pull/738](https://togithub.com/marmelroy/PhoneNumberKit/pull/738) - Updated metadata to version metadata/8.13.30 by [@​github-actions](https://togithub.com/github-actions) in [https://github.com/marmelroy/PhoneNumberKit/pull/744](https://togithub.com/marmelroy/PhoneNumberKit/pull/744) #### New Contributors - [@​gleb-tregubov](https://togithub.com/gleb-tregubov) made their first contribution in [https://github.com/marmelroy/PhoneNumberKit/pull/733](https://togithub.com/marmelroy/PhoneNumberKit/pull/733) **Full Changelog**: marmelroy/PhoneNumberKit@3.7.6...3.7.7 ### [`v3.7.6`](https://togithub.com/marmelroy/PhoneNumberKit/releases/tag/3.7.6) [Compare Source](https://togithub.com/marmelroy/PhoneNumberKit/compare/3.7.5...3.7.6) #### What's Changed - Updated metadata to version metadata/8.13.26 by [@​github-actions](https://togithub.com/github-actions) in [https://github.com/marmelroy/PhoneNumberKit/pull/725](https://togithub.com/marmelroy/PhoneNumberKit/pull/725) - Improved code with SwiftFormat and removed empty catches by [@​bguidolim](https://togithub.com/bguidolim) in [https://github.com/marmelroy/PhoneNumberKit/pull/726](https://togithub.com/marmelroy/PhoneNumberKit/pull/726) - Checking minimum National Significant Number length before applying format by [@​bguidolim](https://togithub.com/bguidolim) in [https://github.com/marmelroy/PhoneNumberKit/pull/727](https://togithub.com/marmelroy/PhoneNumberKit/pull/727) **Full Changelog**: marmelroy/PhoneNumberKit@3.7.5...3.7.6 </details> <details> <summary>nicklockwood/SwiftFormat (nicklockwood/SwiftFormat)</summary> ### [`v0.53.5`](https://togithub.com/nicklockwood/SwiftFormat/blob/HEAD/CHANGELOG.md#0535-2024-03-17) [Compare Source](https://togithub.com/nicklockwood/SwiftFormat/compare/0.53.4...0.53.5) - Fixed bug with trailing comma being inserted into wrapped capture list - Fixed bugs with parsing `nonisolated(unsafe)` modifiers - Fixed bug with hoisting `try` or `async` after a string literal expression - Fixed issue with parsing expressions containing generic arguments - Lint warnings are now displayed as errors when not running in `--lenient` mode - Improved error message for unexpected `static`/`class` modifiers - Added Swift 6.0 to list of supported Swift versions ### [`v0.53.4`](https://togithub.com/nicklockwood/SwiftFormat/blob/HEAD/CHANGELOG.md#0534-2024-03-09) [Compare Source](https://togithub.com/nicklockwood/SwiftFormat/compare/0.53.3...0.53.4) - The `enumNamespaces` rule is no longer applied to structs with attributes or macros - The new `nonisolated(unsafe)` modifier is now handled correctly - Added support for `do throws(Type) { ... }` clauses ### [`v0.53.3`](https://togithub.com/nicklockwood/SwiftFormat/blob/HEAD/CHANGELOG.md#0533-2024-03-02) [Compare Source](https://togithub.com/nicklockwood/SwiftFormat/compare/0.53.2...0.53.3) - The `preferForLoop` rule now correctly singularizes loop conditions that end with "cases" - Fixed bug where `preferForLoop` mangled throwing or async `forEach` expressions - Fixed extension body not being sorted if `organizeDeclarations` was enabled but excluded declaration type - Fixed conditionalAssignment bugs with `@unknown default` cases - Fixed some unsafe applications of the `enumNamespaces` rule - Added preliminary support for typed `throws` ### [`v0.53.2`](https://togithub.com/nicklockwood/SwiftFormat/blob/HEAD/CHANGELOG.md#0532-2024-02-17) [Compare Source](https://togithub.com/nicklockwood/SwiftFormat/compare/0.53.1...0.53.2) - Fixed bug where `hoistAwait` rule could move `await` before `try` keyword - Fixed bug where `redundantSelf` rule was confused by `@MainActor` annotation - Fixed edge case where `unusedArguments` removed required argument inside `guard` ### [`v0.53.1`](https://togithub.com/nicklockwood/SwiftFormat/blob/HEAD/CHANGELOG.md#0531-2024-01-26) [Compare Source](https://togithub.com/nicklockwood/SwiftFormat/compare/0.53.0...0.53.1) - Fixed bug where `fileHeader` could duplicate headers containing a colon - The `redundantInternal` rule no longer strips `internal` from `import` statements - Fixed false positive with `unusedArguments` rule ### [`v0.53.0`](https://togithub.com/nicklockwood/SwiftFormat/blob/HEAD/CHANGELOG.md#0530-2024-01-07) [Compare Source](https://togithub.com/nicklockwood/SwiftFormat/compare/0.52.11...0.53.0) - Added `preferForLoop` rule to convert `forEach { ... }` calls to regular `for` loops - Added `wrapLoopBodies` rule to wrap single-line loop bodies over multiple lines - Added `noExplicitOwnership` rule to remove unwanted `borrowing` and `consuming` modifiers - Added `wrapMultilineConditionalAssignment` rule to wrap `if` or `switch` expressions to new line - The `wrapAttributes` rule no longer unwraps attributes if they would exceed `--maxwidth` - The `typeSugar` rule's `--shortoptionals` option now defaults to `except-properties` - Enabled `blankLinesBetweenChainedFunctions` rule by default - Enabled `blankLineAfterImports` rule by default - Fixed `self` being incorrectly inserted before `set` clause in computed properties - Fixed a bug in `parseType()` helper function where qualified types were not recognized - Fixed Xcode command plugin ### [`v0.52.11`](https://togithub.com/nicklockwood/SwiftFormat/blob/HEAD/CHANGELOG.md#05211-2023-12-05) [Compare Source](https://togithub.com/nicklockwood/SwiftFormat/compare/0.52.10...0.52.11) - Updated `if`/`switch` expression workaround for Swift 5.9 bug to handle `as!` casts - Fixed indent logic for wrapped conditional assignment expressions - Fixed assertion failure in `redundantSelf` rule - Fixed raw string parsing bug ### [`v0.52.10`](https://togithub.com/nicklockwood/SwiftFormat/blob/HEAD/CHANGELOG.md#05210-2023-11-14) [Compare Source](https://togithub.com/nicklockwood/SwiftFormat/compare/0.52.9...0.52.10) - Fixed `enumNamespaces` rule breaking `import struct`/`class` statements - Fixed unsafe application of `conditionalAssignment` rule to `switch` statements containing `#if` blocks ### [`v0.52.9`](https://togithub.com/nicklockwood/SwiftFormat/blob/HEAD/CHANGELOG.md#0529-2023-11-10) [Compare Source](https://togithub.com/nicklockwood/SwiftFormat/compare/0.52.8...0.52.9) - Fixed `redundantClosure` removing required closure around conditional statements - Fixed `redundantClosure` removing closure containing conditional expressions inside a method call - Fixed `redundantClosure` generating invalid code when the `redundantReturn` rule is disabled - Fixed issue where if/switch expressions with `as?` cast would break build in Swift 5.9 - Fixed `blankLineAfterImports` introducing spurious blank line before `@preconcurrency` attribute - Fixed bug where `enumNamespaces` rule wouldn't be applied immediately after an `import` statement - Fixed issue where `switch` case with multiple `where` clauses could be parsed incorrectly - The SwiftFormat SPM plugin now formats local dependencies, not just final product targets </details> <details> <summary>pointfreeco/swift-snapshot-testing (pointfreeco/swift-snapshot-testing)</summary> ### [`v1.15.4`](https://togithub.com/pointfreeco/swift-snapshot-testing/releases/tag/1.15.4) [Compare Source](https://togithub.com/pointfreeco/swift-snapshot-testing/compare/1.15.3...1.15.4) #### What's Changed - Fixed: Bump swift-syntax requirements to support 5.10.0 ([https://github.com/pointfreeco/swift-snapshot-testing/pull/836](https://togithub.com/pointfreeco/swift-snapshot-testing/pull/836)). **Full Changelog**: pointfreeco/swift-snapshot-testing@1.15.3...1.15.4 ### [`v1.15.3`](https://togithub.com/pointfreeco/swift-snapshot-testing/releases/tag/1.15.3) [Compare Source](https://togithub.com/pointfreeco/swift-snapshot-testing/compare/1.15.2...1.15.3) #### What's Changed - Fixed: Inline snapshots in test files containing a leading, whitespace-only line will no longer include this newline as leading trivia in the recording. **Full Changelog**: pointfreeco/swift-snapshot-testing@1.15.2...1.15.3 ### [`v1.15.2`](https://togithub.com/pointfreeco/swift-snapshot-testing/releases/tag/1.15.2) [Compare Source](https://togithub.com/pointfreeco/swift-snapshot-testing/compare/1.15.1...1.15.2) #### What's Changed - Fixed: Support perceptual comparisons on platforms that do not support metal (thanks [@​ejensen](https://togithub.com/ejensen), [https://github.com/pointfreeco/swift-snapshot-testing/pull/666](https://togithub.com/pointfreeco/swift-snapshot-testing/pull/666)). - Fixed: Better support for `WKWebView` in Xcode 14 and Xcode 15 (thanks [@​teameh](https://togithub.com/teameh), [https://github.com/pointfreeco/swift-snapshot-testing/pull/692](https://togithub.com/pointfreeco/swift-snapshot-testing/pull/692)). **Full Changelog**: pointfreeco/swift-snapshot-testing@1.15.1...1.15.2 ### [`v1.15.1`](https://togithub.com/pointfreeco/swift-snapshot-testing/releases/tag/1.15.1) [Compare Source](https://togithub.com/pointfreeco/swift-snapshot-testing/compare/1.15.0...1.15.1) #### What's Changed - Improve the speed of comparing memory buffers by [@​ejensen](https://togithub.com/ejensen) in [#​664](https://togithub.com/pointfreeco/swift-snapshot-testing/issues/664) **Full Changelog**: pointfreeco/swift-snapshot-testing@1.15.0...1.15.1 ### [`v1.15.0`](https://togithub.com/pointfreeco/swift-snapshot-testing/releases/tag/1.15.0) [Compare Source](https://togithub.com/pointfreeco/swift-snapshot-testing/compare/1.14.2...1.15.0) #### What's Changed - Added: `assertInlineSnapshot` now has `record` mode ([https://github.com/pointfreeco/swift-snapshot-testing/pull/809](https://togithub.com/pointfreeco/swift-snapshot-testing/pull/809)). - Fixed: `assertInlineSnapshot`'s failure difference now reads more correctly as the patch that would be applied were record mode to be on ([https://github.com/pointfreeco/swift-snapshot-testing/pull/809](https://togithub.com/pointfreeco/swift-snapshot-testing/pull/809)). **Full Changelog**: pointfreeco/swift-snapshot-testing@1.14.2...1.15.0 </details> <details> <summary>realm/SwiftLint (realm/SwiftLint)</summary> ### [`v0.54.0`](https://togithub.com/realm/SwiftLint/blob/HEAD/CHANGELOG.md#0540-Macro-Economic-Forces) [Compare Source](https://togithub.com/realm/SwiftLint/compare/0.53.0...0.54.0) ##### Breaking - SwiftLint now requires Swift 5.9 or higher to build.\ [SimplyDanny](https://togithub.com/SimplyDanny) [JP Simard](https://togithub.com/jpsim) ##### Experimental - None. ##### Enhancements - Add `only` configuration option to `todo` rule which allows to specify whether the rule shall trigger on `TODO`s, `FIXME`s or both.\ [gibachan](https://togithub.com/gibachan) [#​5233](https://togithub.com/realm/SwiftLint/pull/5233) - Make `unneeded_break_in_switch` auto correctable.\ [KS1019](https://togithub.com/KS1019/) - Speed up `closure_parameter_position` rule when there are no violations.\ [Marcelo Fabri](https://togithub.com/marcelofabri) - Rewrite `cyclomatic_complexity` rule using SwiftSyntax.\ [Marcelo Fabri](https://togithub.com/marcelofabri) - Rewrite `redundant_void_return` rule using SwiftSyntax. Also include redundant void return clauses for closures in addition to functions. This can be disabled by configuring the rule with `include_closures: false`.\ [Marcelo Fabri](https://togithub.com/marcelofabri) [JP Simard](https://togithub.com/jpsim) - Rewrite `discouraged_optional_collection` rule using SwiftSyntax, catching more violations.\ [JP Simard](https://togithub.com/jpsim) - Rewrite `duplicate_imports` rule using SwiftSyntax.\ [JP Simard](https://togithub.com/jpsim) - Handle `viewIsAppearing` in the `type_contents_order` rule.\ [u-abyss](https://togithub.com/u-abyss) [#​5259](https://togithub.com/realm/SwiftLint/issues/5259) - Rewrite `vertical_parameter_alignment_on_call` rule using SwiftSyntax, fixing some false positives.\ [Marcelo Fabri](https://togithub.com/marcelofabri) [#​3581](https://togithub.com/realm/SwiftLint/issues/3581) - Rewrite `no_grouping_extension` rule using SwiftSyntax.\ [Marcelo Fabri](https://togithub.com/marcelofabri) ##### Bug Fixes - Fix false positive in `implicit_getter` rule when using unknown accessors.\ [kabiroberai](https://togithub.com/kabiroberai) [#​5300](https://togithub.com/realm/SwiftLint/issues/5300) - Fix correction of `explicit_init` rule by keeping significant trivia.\ [BB9z](https://togithub.com/BB9z) [#​5289](https://togithub.com/realm/SwiftLint/issues/5289) - Fix invalid corrections for opaque and existential optionals in `syntactic_sugar` rule.\ [SimplyDanny](https://togithub.com/SimplyDanny) [#​5277](https://togithub.com/realm/SwiftLint/issues/5277) - Fix false positive in `unused_import` rule that triggered on `@_exported` imports which could break downstream modules if removed.\ [jszumski](https://togithub.com/jszumski) [#​5242](https://togithub.com/realm/SwiftLint/pull/5242) - Fix false positive in `unused_import` rule when using a constructor defined in a transitive module.\ [jszumski](https://togithub.com/jszumski) [#​5246](https://togithub.com/realm/SwiftLint/pull/5246) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://togithub.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/powerhome/playbook-swift). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMjEuMCIsInVwZGF0ZWRJblZlciI6IjM3LjI0NS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* main: Make ViewImageConfig Sendable (pointfreeco#850) Added mention of, and link to plugin SnapshotVision. (pointfreeco#848) Run swift-format Register test observer in main queue (pointfreeco#834) Ability to remove inline snapshots (pointfreeco#844) Bump swift-syntax to 5.10.0 (pointfreeco#836) Fix indentation parsing (pointfreeco#830) Fixing wkWebView.takeSnapshot with Xcode 14 & 15 (pointfreeco#692) Run swift-format Non-Metal based perceptual image comparison (pointfreeco#666)
* Improve the speed of comparing memory buffers by using a workaround to a missed compiler optimization * Remove Metal usage since some virtualized environments don’t support it Replaces the CoreImage operations that require Metal with CPU-based calculations * Re-add the Metal-based image comparison Check for support before using and fallback to CPU computation if Metal is not supported * Update logic to determine if a Metal kernel is supported on the device * Use the maintainers preferred method of using a while loop
Overview
Remove Metal usage since some virtualized environments don’t support it and silently fail (only logging something in the console). Replaces the CoreImage operations that require Metal with CPU-based calculation.
Context
Metal is supported by all iOS/tvOS devices (2013 models or later) and Macs (2012 models or later). Older devices that don't support Metal also do not support iOS/tvOS 13 and macOS 10.15 which are the minimum versions of swift-snapshot-testing. However, some virtualized Mac environments do not have a GPU and therefore do not support Metal. In this case, macOS falls back to a CPU-based OpenGL ES renderer that silently fails when Metal commands are issued. The output of the silent failure is a solid black image. And since the threshold filter returns black pixels when it passes, the solid black image from the silent failure causes false positives.
Related PRs