Skip to content
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

Merged
merged 6 commits into from Jan 2, 2024

Conversation

ejensen
Copy link
Contributor

@ejensen ejensen commented Oct 22, 2022

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.

console-logs

Related PRs

Replaces the CoreImage operations that require Metal with CPU-based calculations
@christianflanders
Copy link

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.

@IlyaPuchkaTW
Copy link

IlyaPuchkaTW commented Nov 24, 2022

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

Comment on lines 202 to 204
let failingPixelPercent = Float(failingPixelCount) / Float(deltaOutputImage.extent.width * deltaOutputImage.extent.height)
let actualPixelPrecision = 1 - failingPixelPercent
guard actualPixelPrecision < pixelPrecision else { return nil }
Copy link

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.

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

Copy link

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

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?

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?

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

@jlcvp
Copy link

jlcvp commented Dec 1, 2022

Having the same issue here using Xcode Cloud.

It's outputting No Metal renderer available in the logs but all the tests passes.
Even when we break the UI completely, trying to force it to fail, it still passes, so I believe it's generating all-black images there as well.

@IlyaPuchkaTW
Copy link

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.

@jlcvp
Copy link

jlcvp commented Dec 7, 2022

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

@IlyaPuchkaTW
Copy link

It'll only fail when having different dimensions/frames

Yes, you are most likely right about that!

@IlyaPuchkaTW
Copy link

@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
@ejensen
Copy link
Contributor Author

ejensen commented Dec 21, 2022

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.

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.

@IlyaPuchkaTW
Copy link

@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?

@barrault01
Copy link

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?

@michaelmcguire
Copy link

@ejensen In your original PR you had used the CIColorThreshold filter for comparison and then switched to using Metal so you could target older versions of macOS. What do you think about going back to that? We're having this same problem in our CI environment, but it would be nice to retain the speed benefits since we use macOS 12.0 on CI.

@Alex-Ozun
Copy link

Alex-Ozun commented Mar 21, 2023

@ejensen In your #628 you had used the CIColorThreshold filter for comparison and then switched to using Metal so you could target older versions of macOS. What do you think about going back to that?

Sounds like we should be able to cover all bases if we add one more availability check:

  1. If MPS is available, use that.
  2. Otherwise, If macOS 11.0+ is available, use CIColorThreshold.
  3. Otherwise, fall back to vImage buffer iteration.

NachoSoto referenced this pull request Dec 19, 2023
* 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 <mbrandonw@hey.com>
@stephencelis stephencelis merged commit b30b3be into pointfreeco:main Jan 2, 2024
3 checks passed
@stephencelis
Copy link
Member

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.

isismsilva pushed a commit to powerhome/playbook-swift that referenced this pull request Mar 22, 2024
[![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 [#&#8203;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 [#&#8203;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 [#&#8203;4](https://togithub.com/dkk/WrappingHStack/issues/4)
Fixes [#&#8203;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
[#&#8203;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 [#&#8203;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 [#&#8203;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 [#&#8203;27](https://togithub.com/dkk/WrappingHStack/issues/27),
[#&#8203;28](https://togithub.com/dkk/WrappingHStack/issues/28),
[#&#8203;29](https://togithub.com/dkk/WrappingHStack/issues/29) by
[@&#8203;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 [@&#8203;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 [@&#8203;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 [@&#8203;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
[@&#8203;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
([#&#8203;21777](https://togithub.com/fastlane/fastlane/issues/21777))
via Josh Holtz ([@&#8203;joshdholtz](https://togithub.com/joshdholtz))
- \[sigh] prevent crashes in `fetch_profiles` when profiles have no
`bundle_id`
([#&#8203;21758](https://togithub.com/fastlane/fastlane/issues/21758))
via jonas2808 ([@&#8203;jonas2808](https://togithub.com/jonas2808))
- \[scan] Fix device selection issue fallback scenario
([#&#8203;21772](https://togithub.com/fastlane/fastlane/issues/21772))
via arc-v2 ([@&#8203;arc-v2](https://togithub.com/arc-v2))
- \[sigh] fix cache parameters validation
([#&#8203;21766](https://togithub.com/fastlane/fastlane/issues/21766))
via Vitalii Budnik ([@&#8203;nekrich](https://togithub.com/nekrich))
- \[match] fix cache issues in read-only mode
([#&#8203;21767](https://togithub.com/fastlane/fastlane/issues/21767))
via Vitalii Budnik ([@&#8203;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
([#&#8203;21736](https://togithub.com/fastlane/fastlane/issues/21736))
via Panajev ([@&#8203;Panajev](https://togithub.com/Panajev))
- \[action]\[spm] add simulator flag for swift compiler
([#&#8203;21707](https://togithub.com/fastlane/fastlane/issues/21707))
via Mohammad Gharari ([@&#8203;gharary](https://togithub.com/gharary))
- \[security] update `sinatra` dev dependency to resolve dependabot
alert
([#&#8203;21709](https://togithub.com/fastlane/fastlane/issues/21709))
via Jerome Lacoste ([@&#8203;lacostej](https://togithub.com/lacostej))
- \[fastlane-core] recommends to retry uploading when
AltoolTransporterExecutor crashes
([#&#8203;21536](https://togithub.com/fastlane/fastlane/issues/21536))
via Jason Hagglund
([@&#8203;TheMetalCode](https://togithub.com/TheMetalCode))
- \[Fastlane.swift] fix Unexpected duplicate tasks error message in
Fastlane Swift
([#&#8203;21621](https://togithub.com/fastlane/fastlane/issues/21621))
via Daniel Jankowski ([@&#8203;mollyIV](https://togithub.com/mollyIV))
- \[scan] Filter simulators with version greater than SDK version of
active Xcode installation when choosing default
([#&#8203;21677](https://togithub.com/fastlane/fastlane/issues/21677))
via wuaar1003 ([@&#8203;wuaar1003](https://togithub.com/wuaar1003))
- \[plugin_generator] move development dependencies from `*.gemspec.erb`
to `Gemfile.erb`
([#&#8203;21726](https://togithub.com/fastlane/fastlane/issues/21726))
via Roger Oba ([@&#8203;rogerluan](https://togithub.com/rogerluan))
- \[match] add caching layer to significantly improve performance by up
to 100x
([#&#8203;21694](https://togithub.com/fastlane/fastlane/issues/21694))
via Vitalii Budnik ([@&#8203;nekrich](https://togithub.com/nekrich))
- \[fastlane_core] add support to Ruby 3.3
([#&#8203;21683](https://togithub.com/fastlane/fastlane/issues/21683))
via Jerome Lacoste ([@&#8203;lacostej](https://togithub.com/lacostej))
- \[fastlane] remove some unused method parameters
([#&#8203;21722](https://togithub.com/fastlane/fastlane/issues/21722))
via Jerome Lacoste ([@&#8203;lacostej](https://togithub.com/lacostej))
- \[action]\[spm] deprecate `build_path` option in favor of
`scratch_path`, as recommended by Swift CLI
([#&#8203;20814](https://togithub.com/fastlane/fastlane/issues/20814))
via Victor Carvalho Tavernari
([@&#8203;Tavernari](https://togithub.com/Tavernari))
- \[match] git storage: allow simultaneous usage of
clone_branch_directly and shallow_clone
([#&#8203;21716](https://togithub.com/fastlane/fastlane/issues/21716))
via Vitalii Budnik ([@&#8203;nekrich](https://togithub.com/nekrich))
- \[action]\[spm] add `parallel` option
([#&#8203;21665](https://togithub.com/fastlane/fastlane/issues/21665))
via Bram Schulting
([@&#8203;bramschulting](https://togithub.com/bramschulting))
- \[fastlane_core] remove expired WWDR G1 certificate from cert_checker
([#&#8203;21098](https://togithub.com/fastlane/fastlane/issues/21098))
via janwiebe-jump
([@&#8203;janwiebe-jump](https://togithub.com/janwiebe-jump))
- \[action]\[upload_symbols_to_crashlytics] allow '~' in binary path
([#&#8203;21032](https://togithub.com/fastlane/fastlane/issues/21032))
via GevaZeichner
([@&#8203;GevaZeichner](https://togithub.com/GevaZeichner))
- \[scan] replace the `simctl boot` command with `simctl bootstatus`,
potentially fixing signal kill before running tests
([#&#8203;21026](https://togithub.com/fastlane/fastlane/issues/21026))
via Alexey Alter-Pesotskiy
([@&#8203;testableapple](https://togithub.com/testableapple))
- \[spaceship] add
`Spaceship::ConnectAPI::AppPreviewSet::PreviewType::IPHONE_67`
([#&#8203;21710](https://togithub.com/fastlane/fastlane/issues/21710))
via Sergei Sevkovich ([@&#8203;drcreazy](https://togithub.com/drcreazy))
- \[action]\[ensure_no_debug_code] detect binding.irb in
`ensure_no_debug_code` during build.
([#&#8203;21635](https://togithub.com/fastlane/fastlane/issues/21635))
via Takuma Homma ([@&#8203;mataku](https://togithub.com/mataku))
- CONTRIBUTING.md: remove Google CLA section
([#&#8203;21646](https://togithub.com/fastlane/fastlane/issues/21646))
via Jay Soffian ([@&#8203;jaysoffian](https://togithub.com/jaysoffian))
- \[fastlane_core] hide xcodebuild stderr to solve
[#&#8203;21672](https://togithub.com/fastlane/fastlane/issues/21672)
([#&#8203;21673](https://togithub.com/fastlane/fastlane/issues/21673))
via Jerome Lacoste ([@&#8203;lacostej](https://togithub.com/lacostej))
- \[scan] fix misleading error message when no devices are found
([#&#8203;21650](https://togithub.com/fastlane/fastlane/issues/21650))
via Miles Thompson
([@&#8203;MagnificentMiles](https://togithub.com/MagnificentMiles))
- \[deliver]\[spaceship]\[scan] fix build warnings in rspec
([#&#8203;21660](https://togithub.com/fastlane/fastlane/issues/21660))
via Jerome Lacoste ([@&#8203;lacostej](https://togithub.com/lacostej))
- \[deliver] fix regression where changes made to the privacy URL fail
to upload
([#&#8203;21657](https://togithub.com/fastlane/fastlane/issues/21657))
via Owen Hart ([@&#8203;owjsub](https://togithub.com/owjsub))
- \[fastlane_core] let FastlanePty detect when externally invoked
programs crash, harden it when using popen, and expose process statuses.
([#&#8203;21618](https://togithub.com/fastlane/fastlane/issues/21618))
via Jerome Lacoste ([@&#8203;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
[#&#8203;21105](https://togithub.com/fastlane/fastlane/issues/21105)
([#&#8203;21633](https://togithub.com/fastlane/fastlane/issues/21633))
via Jerome Lacoste ([@&#8203;lacostej](https://togithub.com/lacostej))
- \[action]\[slather] add support for slather's new --ymlfile option
([#&#8203;21613](https://togithub.com/fastlane/fastlane/issues/21613))
via jarrodlombardo-EventBase
([@&#8203;jarrodlombardo-EventBase](https://togithub.com/jarrodlombardo-EventBase))
- \[action]\[notarize] printing log on error
([#&#8203;21609](https://togithub.com/fastlane/fastlane/issues/21609))
via Csaba Szigeti ([@&#8203;szigetics](https://togithub.com/szigetics))
- \[tests] fix test being potentially muddied by local ENV
([#&#8203;21586](https://togithub.com/fastlane/fastlane/issues/21586))
via Olivier Halligon
([@&#8203;AliSoftware](https://togithub.com/AliSoftware))
- \[match] remove redundant fetching of profile devices and certificates
([#&#8203;21409](https://togithub.com/fastlane/fastlane/issues/21409))
via Vitalii Budnik ([@&#8203;nekrich](https://togithub.com/nekrich))
- \[match] hide sensitive information in match output
([#&#8203;21603](https://togithub.com/fastlane/fastlane/issues/21603))
via Duncan MacDonald ([@&#8203;oct0f1sh](https://togithub.com/oct0f1sh))
- \[supple] fix issue with releases containing retained versions
([#&#8203;20997](https://togithub.com/fastlane/fastlane/issues/20997))
([#&#8203;20998](https://togithub.com/fastlane/fastlane/issues/20998))
via Mariano Miani ([@&#8203;mmiani](https://togithub.com/mmiani))
- \[action]\[git_branch] add `FL_GIT_BRANCH_DONT_USE_ENV_VARS` env var
to `git_branch`
([#&#8203;21597](https://togithub.com/fastlane/fastlane/issues/21597))
via Oguz Kocer ([@&#8203;oguzkocer](https://togithub.com/oguzkocer))
- \[tests] Make error message expectation more flexible in
`runner_spec.rb` to support Ruby 2.6 error message format
([#&#8203;21591](https://togithub.com/fastlane/fastlane/issues/21591))
via Olivier Halligon
([@&#8203;AliSoftware](https://togithub.com/AliSoftware))
- \[docs] fix typo `practies` → `practices` based on feedback from
fastlane/docs
([#&#8203;21589](https://togithub.com/fastlane/fastlane/issues/21589))
via Roger Oba ([@&#8203;rogerluan](https://togithub.com/rogerluan))
- \[fastlane] add support for keyword arguments for lanes in Ruby 3
([#&#8203;21587](https://togithub.com/fastlane/fastlane/issues/21587))
via Olivier Halligon
([@&#8203;AliSoftware](https://togithub.com/AliSoftware))
- \[tests] update `fakefs` to fix test failures on Ruby 3.2.2
([#&#8203;21588](https://togithub.com/fastlane/fastlane/issues/21588))
via Olivier Halligon
([@&#8203;AliSoftware](https://togithub.com/AliSoftware))
- \[deliver] Add Watch Ultra screen size
([#&#8203;21106](https://togithub.com/fastlane/fastlane/issues/21106))
via Aoi Takahashi ([@&#8203;xiii111](https://togithub.com/xiii111))
- \[docs] update a bit of the documentation of install_on_device.rb
([#&#8203;21196](https://togithub.com/fastlane/fastlane/issues/21196))
via ls-1N ([@&#8203;ls-1N](https://togithub.com/ls-1N))
- \[precheck] print the HTTP status as the failure reason when it's not
200
([#&#8203;21051](https://togithub.com/fastlane/fastlane/issues/21051))
via Roger Oba ([@&#8203;rogerluan](https://togithub.com/rogerluan))
- \[supply] parallel uploads for meta per language
([#&#8203;21474](https://togithub.com/fastlane/fastlane/issues/21474))
via Cristian Caruceru
([@&#8203;ccaruceru](https://togithub.com/ccaruceru))
- \[action]\[nexus_upload] Mark Nexus password as a sensitive field
([#&#8203;21564](https://togithub.com/fastlane/fastlane/issues/21564))
via Liam Jones ([@&#8203;liamjones](https://togithub.com/liamjones))
- \[trainer] check specifically for file url in failure_message, fixing
crash in Xcode 15 when running in Apple Silicon
([#&#8203;21493](https://togithub.com/fastlane/fastlane/issues/21493))
via Jason Hagglund
([@&#8203;TheMetalCode](https://togithub.com/TheMetalCode))
- \[gym] fix error message for catalyst_platform option
([#&#8203;21332](https://togithub.com/fastlane/fastlane/issues/21332))
via Sebastian Staudt ([@&#8203;koraktor](https://togithub.com/koraktor))
- \[deliver] show file type correctly in user_error
([#&#8203;21403](https://togithub.com/fastlane/fastlane/issues/21403))
via Aru Hyunseung Jeon
([@&#8203;Dogdriip](https://togithub.com/Dogdriip))
- \[gym] fix multiplatform iOS builds
([#&#8203;21319](https://togithub.com/fastlane/fastlane/issues/21319))
via Zach Waugh ([@&#8203;zachwaugh](https://togithub.com/zachwaugh))
- \[match] make git_private_key path absolute
([#&#8203;21360](https://togithub.com/fastlane/fastlane/issues/21360))
via Marko Samec ([@&#8203;msamec](https://togithub.com/msamec))
- \[snapshot] Add Missing Older iPhone & iPad models to Generated
Snapshot Reports
([#&#8203;21557](https://togithub.com/fastlane/fastlane/issues/21557))
via Kyle Howells
([@&#8203;kylehowells](https://togithub.com/kylehowells))
- \[deliver] Capturing NoMethodError exception when fetching live app
info
([#&#8203;21553](https://togithub.com/fastlane/fastlane/issues/21553))
via Ignacio Calderon
([@&#8203;kronenthaler](https://togithub.com/kronenthaler))
- \[snapshot] support Strict Concurrency for SnapshotHelper
([#&#8203;21400](https://togithub.com/fastlane/fastlane/issues/21400))
via Kohki Miki ([@&#8203;giginet](https://togithub.com/giginet))
- \[match] added selection of certificate and p12 key by certificate id
([#&#8203;21428](https://togithub.com/fastlane/fastlane/issues/21428))
via Ivan Sorokoletov ([@&#8203;slacklab](https://togithub.com/slacklab))
- \[spaceship] allow to specify fetched fields
([#&#8203;21528](https://togithub.com/fastlane/fastlane/issues/21528))
via Vitalii Budnik ([@&#8203;nekrich](https://togithub.com/nekrich))
- \[snapshot] add Support for New Apple Devices in Snapshot Generator
([#&#8203;21554](https://togithub.com/fastlane/fastlane/issues/21554))
via Sandeep Joshi ([@&#8203;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
([#&#8203;21472](https://togithub.com/fastlane/fastlane/issues/21472))
via Lorenzo Mattei
([@&#8203;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
[@&#8203;github-actions](https://togithub.com/github-actions) in
[marmelroy/PhoneNumberKit#747
- Move privacy manifest from resources to resource bundle by
[@&#8203;MariuszWisniewski](https://togithub.com/MariuszWisniewski) in
[marmelroy/PhoneNumberKit#748

#### New Contributors

- [@&#8203;MariuszWisniewski](https://togithub.com/MariuszWisniewski)
made their first contribution in
[marmelroy/PhoneNumberKit#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
[@&#8203;bguidolim](https://togithub.com/bguidolim) in
[marmelroy/PhoneNumberKit#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
[@&#8203;github-actions](https://togithub.com/github-actions) in
[marmelroy/PhoneNumberKit#731
- Fix minor 'Patten' typo in `PhoneNumberPatterns.countryCodePatten`
(renames to `countryCodePattern`) by
[@&#8203;gleb-tregubov](https://togithub.com/gleb-tregubov) in
[marmelroy/PhoneNumberKit#733
- Updated metadata to version metadata/8.13.28 by
[@&#8203;github-actions](https://togithub.com/github-actions) in
[marmelroy/PhoneNumberKit#735
- Updated metadata to version metadata/8.13.29 by
[@&#8203;github-actions](https://togithub.com/github-actions) in
[marmelroy/PhoneNumberKit#738
- Updated metadata to version metadata/8.13.30 by
[@&#8203;github-actions](https://togithub.com/github-actions) in
[marmelroy/PhoneNumberKit#744

#### New Contributors

- [@&#8203;gleb-tregubov](https://togithub.com/gleb-tregubov) made their
first contribution in
[marmelroy/PhoneNumberKit#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
[@&#8203;github-actions](https://togithub.com/github-actions) in
[marmelroy/PhoneNumberKit#725
- Improved code with SwiftFormat and removed empty catches by
[@&#8203;bguidolim](https://togithub.com/bguidolim) in
[marmelroy/PhoneNumberKit#726
- Checking minimum National Significant Number length before applying
format by [@&#8203;bguidolim](https://togithub.com/bguidolim) in
[marmelroy/PhoneNumberKit#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
([pointfreeco/swift-snapshot-testing#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 [@&#8203;ejensen](https://togithub.com/ejensen),
[pointfreeco/swift-snapshot-testing#666).
- Fixed: Better support for `WKWebView` in Xcode 14 and Xcode 15 (thanks
[@&#8203;teameh](https://togithub.com/teameh),
[pointfreeco/swift-snapshot-testing#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
[@&#8203;ejensen](https://togithub.com/ejensen) in
[#&#8203;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
([pointfreeco/swift-snapshot-testing#809).
- Fixed: `assertInlineSnapshot`'s failure difference now reads more
correctly as the patch that would be applied were record mode to be on
([pointfreeco/swift-snapshot-testing#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)
    [#&#8203;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)
    [#&#8203;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)
    [#&#8203;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)
    [#&#8203;5300](https://togithub.com/realm/SwiftLint/issues/5300)

- Fix correction of `explicit_init` rule by keeping significant trivia.\
    [BB9z](https://togithub.com/BB9z)
    [#&#8203;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)
    [#&#8203;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)
    [#&#8203;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)
    [#&#8203;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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

9 participants