Skip to content

Delete claude.yml workflow#6688

Merged
vegaro merged 1 commit into
mainfrom
vegaro-patch-1
Apr 24, 2026
Merged

Delete claude.yml workflow#6688
vegaro merged 1 commit into
mainfrom
vegaro-patch-1

Conversation

@vegaro

@vegaro vegaro commented Apr 23, 2026

Copy link
Copy Markdown
Member

I have not seen anyone using this. It's been failing for some weeks now (since we pinned versions) and no one has complained, so I think we can remove it

https://github.com/RevenueCat/purchases-ios/actions/workflows/claude.yml?query=


Note

Low Risk
Low risk: this only removes an unused/failing GitHub Actions workflow and does not affect product code or runtime behavior.

Overview
Removes the claude.yml GitHub Actions workflow, disabling the Claude automation that previously ran on issue/PR comment and review events.

Reviewed by Cursor Bugbot for commit 9aed4d1. Bugbot is set up for automated code reviews on this repo. Configure here.

@vegaro vegaro requested a review from a team as a code owner April 23, 2026 18:14
@vegaro vegaro enabled auto-merge (squash) April 24, 2026 15:32
@vegaro vegaro merged commit 40d9a6f into main Apr 24, 2026
18 of 20 checks passed
@vegaro vegaro deleted the vegaro-patch-1 branch April 24, 2026 15:33
polmiro pushed a commit that referenced this pull request Apr 24, 2026
JZDesign pushed a commit that referenced this pull request Apr 24, 2026
* Replace print with Logger.error in ISODurationFormatter (#6691)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Decode reward payload in RewardVerification poll response (#6678)

* Decode reward payload in RewardVerification poll response

Plumbs the verified-reward payload from the backend response through the
internal `pollRewardVerificationStatus` SPI so RC ad adapters can dispatch
meaningful "verified" events with the granted reward.

* Adds `VirtualCurrencyReward` and `VerifiedReward` (`@_spi(Internal) public`)
  under `Sources/Ads/RewardVerification/`.
* Extends `RewardVerificationStatusResponse` to optionally decode a typed nested
  reward payload (`{ type, code, amount }`) on `verified` responses.
  - `reward` absent or null → `.noReward`
  - `type == "virtual_currency"` with valid `code`+`amount` → `.virtualCurrency`
  - any other `type` (or malformed `virtual_currency`) → `.unsupportedReward` + warn
* `RewardVerificationPollStatus.verified` now carries the `VerifiedReward`.
* `Purchases.pollRewardVerificationStatus` returns `.verified(reward)`.
* Test mocks injected via a new `BasePurchasesTests.MockBackend` convenience
  init so `backend.adsAPI` resolves to `MockAdsAPI`.

* Add unit tests for VerifiedReward and VirtualCurrencyReward

Co-locates the unit tests next to the types this PR introduces under
`Sources/Ads/RewardVerification/`:

- `Tests/UnitTests/Ads/RewardVerification/VirtualCurrencyRewardTests.swift`
  Covers field storage, equality (both fields must match), and decimal
  precision preservation.

- `Tests/UnitTests/Ads/RewardVerification/VerifiedRewardTests.swift`
  Covers `.virtualCurrency(_)` associated-value carrying, `.noReward`
  vs `.unsupportedReward` distinct-case identity, equality (matching
  associated reward required), and an exhaustive switch coverage test
  to guard against silently adding cases.

Both tests pass against the existing `Sources/Ads/RewardVerification/`
types and require no changes to them.

(Originally written on top of #6663; moved to this base PR so the type
and its tests ship together rather than splitting across PRs.)

* fix: warn when reward verification reward value is not a JSON object

Previously, `decodeVerifiedReward` silently returned `.noReward` for any
of: missing reward key, null reward, or non-object reward value (e.g. a
string/number/array). The first two are expected; the last indicates a
backend mismatch and should be surfaced.

Now distinguish:
- absent or null reward → `.noReward` (silent, expected)
- present but not a JSON object → `.unsupportedReward` + `Logger.warn`

This matches the existing convention in this file of logging warnings
when decoding unrecognized/malformed values into fallback cases.

* Fix virtual currency reward amount type to integer.

Align reward payload modeling with backend semantics by decoding `amount` as Int and updating tests to reject fractional values as malformed rewards.

* fix: address review — couple verified status to reward

Make the reward payload part of the verified status case so invalid state combinations are unrepresentable and remove the verified fallback mapping.

* fix: address review — reject non-positive reward amounts

Treat virtual-currency rewards with non-positive amounts as malformed payloads and return unsupported reward with warning logs.

* fix: address review — reject empty reward currency code

Validate virtual-currency payloads require a non-empty code and treat empty code values as malformed unsupported rewards.

* fix: address review — remove non-actionable enum switch test

Drop the exhaustive switch smoke test in VerifiedRewardTests since it did not validate behavior and duplicated compiler guarantees.

* fix: address review — remove synthesized equatable assertions

Drop VerifiedReward tests that only mirrored compiler-synthesized Equatable behavior and keep behavior-focused coverage.

* Delete claude.yml workflow (#6688)

* Add workflowTrigger to ButtonComponent.Action (#6693)

* Add workflowTrigger case to ButtonComponent.Action

Mirrors Android's rename of Action.Workflow → Action.WorkflowTrigger
(purchases-android#3380). Decodes backend "type": "workflow" into
.workflowTrigger so workflow buttons are rendered (previously decoded
as .unknown and hidden) and track as "workflow_trigger" in analytics.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add tests for workflowTrigger action decoding and analytics value

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Cache decoded images by file URL in `FileImageLoader`

`URL.asImageAndSize` (used by `FileImageLoader.loadFromCache`) previously
called `UIImage(contentsOfFile:)` / `NSImage(contentsOfFile:)` on every
access. A SwiftUI paywall with many `RemoteImage` instances (e.g. a looping
carousel that materialises multiple copies of each page) ends up hitting
this path hundreds of times because `StateObject(wrappedValue:)` evaluates
its closure on every host view re-init. UIKit/AppKit's internal caches
still cost ~0.5–1 ms per call, which adds up to ~100+ ms of main-thread
blocking for only a handful of unique URLs.

Introduce a process-wide `DecodedImageCache` backed by `NSCache<NSURL, _>`
so repeated lookups for the same URL become a dictionary hit. `NSCache`
evicts on memory pressure, so we don't pin images forever. Reads/writes
are serialised through a concurrent dispatch queue with a barrier on
writes to keep the cache thread-safe.

Made-with: Cursor

---------

Co-authored-by: Facundo Menzella <facumenzella@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Pol Miro <polmiro@gmail.com>
Co-authored-by: Cesar de la Vega <664544+vegaro@users.noreply.github.com>
This was referenced Apr 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants