Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .github/actions/ci-guard/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Guard
description: >
Loads the current PR title (not the stale event payload) and cancels the workflow when it
contains skip-ci, case-insensitive. No-op when the event is not pull_request.
inputs:
github_token:
description: Token with actions:write and pull-requests:read
required: true
runs:
using: composite
steps:
- run: |
set -euo pipefail
if [ "${{ github.event_name }}" != "pull_request" ]; then
exit 0
fi
PR_TITLE=$(gh pr view ${{ github.event.pull_request.number }} --repo "${{ github.repository }}" --json title --jq .title)
if printf '%s' "$PR_TITLE" | grep -Fqi 'skip-ci'; then
gh run cancel "${{ github.run_id }}" --repo "${{ github.repository }}"
fi
shell: bash
env:
GH_TOKEN: ${{ inputs.github_token }}
9 changes: 3 additions & 6 deletions .github/workflows/cron-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
strategy:
matrix:
include:
- ios: "26.1"
- ios: "26.2"
device: "iPhone 17 Pro"
setup_runtime: false
- ios: "18.5"
Expand All @@ -33,13 +33,10 @@ jobs:
- ios: "16.4"
device: "iPhone 14 Pro"
setup_runtime: true
- ios: "15.5"
device: "iPhone 13 Pro"
setup_runtime: true
fail-fast: false
runs-on: macos-15
env:
XCODE_VERSION: "26.1.1"
XCODE_VERSION: "26.2"
IOS_SIMULATOR_DEVICE: "${{ matrix.device }} (${{ matrix.ios }})"
steps:
- uses: actions/checkout@v4.1.1
Expand Down Expand Up @@ -74,7 +71,7 @@ jobs:
strategy:
matrix:
include:
- xcode: 26.1.1 # swift 6.2
- xcode: 26.2 # swift 6.2
os: macos-15
- xcode: 16.4 # swift 6.1
os: macos-15
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/sdk-size-metrics.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,22 @@ jobs:
sdk_size:
name: Metrics
runs-on: macos-15
if: github.event_name != 'pull_request' || github.event.pull_request.draft == false
env:
GITHUB_TOKEN: '${{ secrets.CI_BOT_GITHUB_TOKEN }}'
GITHUB_PR_NUM: ${{ github.event.pull_request.number }}
steps:
- uses: actions/checkout@v3.1.0

- uses: ./.github/actions/ci-guard
with:
github_token: ${{ secrets.GITHUB_TOKEN }}

- name: Connect Bot
uses: webfactory/ssh-agent@v0.7.0
with:
ssh-private-key: ${{ secrets.BOT_SSH_PRIVATE_KEY }}

- uses: actions/checkout@v3.1.0

- uses: ./.github/actions/bootstrap

- name: Run General SDK Size Metrics
Expand Down
15 changes: 14 additions & 1 deletion .github/workflows/smoke-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,24 @@

env:
HOMEBREW_NO_INSTALL_CLEANUP: 1 # Disable cleanup for homebrew, we don't need it on CI
IOS_SIMULATOR_DEVICE: "iPhone 17 Pro (26.1)"
IOS_SIMULATOR_DEVICE: "iPhone 17 Pro (26.2)"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_PR_NUM: ${{ github.event.pull_request.number }}

jobs:
guard:
name: Guard
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.1.1
- uses: ./.github/actions/ci-guard
with:
github_token: ${{ secrets.GITHUB_TOKEN }}

test-llc:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
name: Test LLC
runs-on: macos-15
needs: guard
steps:
- uses: actions/checkout@v4.1.1
with:
Expand Down Expand Up @@ -74,6 +84,7 @@
automated-code-review:
name: Automated Code Review
runs-on: macos-15
needs: guard
env:
XCODE_VERSION: "16.0"
steps:
Expand All @@ -89,6 +100,7 @@
build-apps:
name: Build Demo App
runs-on: macos-15
needs: guard
steps:
- uses: actions/checkout@v4.1.1
- uses: ./.github/actions/ruby-cache
Expand All @@ -99,6 +111,7 @@
build-spm-integration:
name: Build SPM Integration App
runs-on: macos-15
needs: guard
steps:
- uses: actions/checkout@v4.1.1
- uses: ./.github/actions/ruby-cache
Expand Down
5 changes: 4 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ DemoApp/ # The demo app for testing

Use the closest folder’s conventions when editing. Query actual target/product names from Package.swift before building.

Local setup (SPM)
### New files & target membership
• When creating new source or resource files, add them to the correct Xcode target(s). Update the project (e.g. project.pbxproj) so each new file is included in the appropriate target's "Compile Sources" (or "Copy Bundle Resources" for assets). Match the target(s) used by sibling files in the same directory (e.g. Sources/StreamFeeds/ → StreamFeeds; Tests/StreamFeedsTests/ → StreamFeedsTests). Omitting target membership will cause build failures or unused files.

### Local setup (SPM)
1. Clone the repository and open it in Xcode (root contains Package.swift).
2. Resolve packages.
3. Choose an iOS Simulator (e.g., iPhone 15) and Build.
Expand Down
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

### 🔄 Changed

# [0.5.3](https://github.com/GetStream/stream-feeds-swift/releases/tag/0.5.3)
_June 11, 2026_

### 🔄 Changed
- Update StreamCore to 0.7.0, which fixes `Sendable` errors when building with Xcode 27 [#68](https://github.com/GetStream/stream-feeds-swift/pull/68)

# [0.5.2](https://github.com/GetStream/stream-feeds-swift/releases/tag/0.5.2)
_February 09, 2026_

Expand Down
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ let package = Package(
)
],
dependencies: [
.package(url: "https://github.com/GetStream/stream-core-swift.git", exact: "0.6.2")
.package(url: "https://github.com/GetStream/stream-core-swift.git", from: "0.7.0")
],
targets: [
.target(
Expand Down
2 changes: 1 addition & 1 deletion Sources/StreamFeeds/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>0.5.2</string>
<string>0.5.3</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSHumanReadableCopyright</key>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ public struct ActivitiesSortField: SortField {
/// - Parameters:
/// - rawValue: The string value representing the field name in the API.
/// - localValue: A closure that extracts the comparable value from the model.
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ public struct ActivityReactionsSortField: SortField {
/// - Parameters:
/// - rawValue: The string value representing the field name in the API.
/// - localValue: A closure that extracts the comparable value from the model.
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ public struct BookmarkFoldersSortField: SortField {
/// - Parameters:
/// - rawValue: The string value representing the field name in the API.
/// - localValue: A closure that extracts the comparable value from the model.
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ public struct BookmarksSortField: SortField {
/// - Parameters:
/// - rawValue: The string value representing the field name in the API.
/// - localValue: A closure that extracts the comparable value from the model.
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ public struct CommentReactionsSortField: SortField {
/// - Parameters:
/// - rawValue: The string value representing the field name in the API.
/// - localValue: A closure that extracts the comparable value from the model.
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ public struct FeedsSortField: SortField {
/// The string value representing the field name in the API for remote sorting.
public let rawValue: String

public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ public struct FollowsSortField: SortField {
/// - Parameters:
/// - rawValue: The string value representing the field name in the API.
/// - localValue: A closure that extracts the comparable value from the model.
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ public struct MembersSortField: SortField {
/// - Parameters:
/// - rawValue: The string value representing the field name in the API.
/// - localValue: A closure that extracts the comparable value from the model.
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ public struct ModerationConfigsSortField: SortField {
/// - Parameters:
/// - rawValue: The string value representing the field name in the API.
/// - localValue: A closure that extracts the comparable value from the model.
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ public struct PollVotesSortField: SortField {
/// - Parameters:
/// - rawValue: The string value representing the field name in the API.
/// - localValue: A closure that extracts the comparable value from the model.
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ public struct PollsSortField: SortField {
/// - Parameters:
/// - rawValue: The string value representing the field name in the API.
/// - localValue: A closure that extracts the comparable value from the model.
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ import Foundation

extension SystemEnvironment {
/// A Stream Feeds version.
public static let version: String = "0.5.2"
public static let version: String = "0.5.3"
}
4 changes: 2 additions & 2 deletions StreamFeeds.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -863,8 +863,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/GetStream/stream-core-swift.git";
requirement = {
kind = exactVersion;
version = 0.6.2;
kind = upToNextMajorVersion;
minimumVersion = 0.7.0;
};
};
/* End XCRemoteSwiftPackageReference section */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ struct ArrayExtensions_Tests {
public let comparator: AnySortComparator<Model>
public let rawValue: String

public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable {
public init<Value>(_ rawValue: String, localValue: @escaping @Sendable (Model) -> Value) where Value: Comparable & Sendable {
comparator = AnySortComparator(localValue: localValue)
self.rawValue = rawValue
}
Expand Down
14 changes: 7 additions & 7 deletions fastlane/Fastfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require 'json'
require 'net/http'
import 'Sonarfile'

xcode_version = ENV['XCODE_VERSION'] || '26.1.1'
xcode_version = ENV['XCODE_VERSION'] || '26.2'
xcode_project = 'StreamFeeds.xcodeproj'
sdk_names = ['StreamFeeds']
github_repo = ENV['GITHUB_REPOSITORY'] || 'GetStream/stream-feeds-swift'
Expand Down Expand Up @@ -247,12 +247,12 @@ end

lane :sources_matrix do
{
llc: ['Sources/StreamFeeds', 'Tests/StreamFeedsTests', 'Tests/Shared', xcode_project],
sample_apps: ['Sources', 'DemoApp', xcode_project],
integration: ['Sources', 'Integration', xcode_project],
ruby: ['fastlane', 'Gemfile', 'Gemfile.lock'],
size: ['Sources', xcode_project],
public_interface: ['Sources']
llc: ['Sources/StreamFeeds', 'Tests/StreamFeedsTests', 'Tests/Shared', '.github/workflows/smoke-checks.yml', xcode_project],
sample_apps: ['Sources', 'DemoApp', '.github/workflows/smoke-checks.yml', xcode_project],
integration: ['Sources', 'Integration', '.github/workflows/smoke-checks.yml', xcode_project],
ruby: ['fastlane', 'Gemfile', 'Gemfile.lock', '.github/workflows/smoke-checks.yml'],
size: ['Sources', '.github/workflows/smoke-checks.yml', xcode_project],
public_interface: ['Sources', '.github/workflows/smoke-checks.yml']
}
end

Expand Down
Loading