diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1103d6b9d..344736312 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,25 +8,106 @@ on: branches: - "**" env: - CI_XCODE_14: /Applications/Xcode_14.2.app/Contents/Developer CI_XCODE_15: /Applications/Xcode_15.4.0.app/Contents/Developer - CI_XCODE_16: /Applications/Xcode_16.0.app/Contents/Developer + CI_XCODE_16: /Applications/Xcode_16.1.0.app/Contents/Developer jobs: - tests: + test-xcode: env: GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} timeout-minutes: 45 strategy: matrix: - script: - - test:ios - - test:macos - - test:parse_live_query:all - - xcode14 # runs build:starters on Xcode 14 - - xcode15 # runs build:starters on Xcode 15 - - xcode16 # runs build:starters on Xcode 16 + include: + # Xcode + - name: Xcode 15 + script: build:starters + iosVersion: '18.1' + iosDeviceModel: iPhone 16 + watchOsVersion: '11.1' + watchDeviceModel: Apple Watch Series 10 (46mm) + tvOsVersion: '18.1' + tvDeviceModel: Apple TV + macosVersion: 14 + developerDir: CI_XCODE_15 + - name: Xcode 16 + script: build:starters + iosVersion: '18.1' + iosDeviceModel: iPhone 16 + watchOsVersion: '11.1' + watchDeviceModel: Apple Watch Series 10 (46mm) + tvOsVersion: '18.1' + tvDeviceModel: Apple TV + macosVersion: 14 + developerDir: CI_XCODE_16 + # Core Module + - name: Core Module, iOS 17 + script: test:ios + iosVersion: '17.5' + iosDeviceModel: iPhone 15 + macosVersion: 15 + developerDir: CI_XCODE_16 + - name: Core Module, iOS 18 + script: test:ios + iosVersion: '18.1' + iosDeviceModel: iPhone 16 + macosVersion: 15 + developerDir: CI_XCODE_16 + - name: Core Module, macOS 14 + script: test:macos + macosVersion: 14 + developerDir: CI_XCODE_16 + - name: Core Module, macOS 15 + script: test:macos + macosVersion: 15 + developerDir: CI_XCODE_16 + # LiveQuery Module + - name: LiveQuery Module, iOS 17 + script: test:parse_live_query:ios + iosVersion: '17.5' + iosDeviceModel: iPhone 15 + macosVersion: 15 + developerDir: CI_XCODE_16 + - name: LiveQuery Module, iOS 18 + script: test:parse_live_query:ios + iosVersion: '18.1' + iosDeviceModel: iPhone 16 + macosVersion: 15 + developerDir: CI_XCODE_16 + - name: LiveQuery Module, macOS 14 + script: test:parse_live_query:osx + macosVersion: 14 + developerDir: CI_XCODE_15 + - name: LiveQuery Module, macOS 15 + script: test:parse_live_query:osx + macosVersion: 15 + developerDir: CI_XCODE_16 + - name: LiveQuery Module, watchOS 10 + script: test:parse_live_query:watchos + watchOsVersion: '10.5' + watchDeviceModel: Apple Watch Series 9 (45mm) + macosVersion: 15 + developerDir: CI_XCODE_15 + - name: LiveQuery Module, watchOS 11 + script: test:parse_live_query:watchos + watchOsVersion: '11.1' + watchDeviceModel: Apple Watch Series 10 (46mm) + macosVersion: 15 + developerDir: CI_XCODE_16 + - name: LiveQuery Module, tvOS 17 + script: test:parse_live_query:tvos + tvOsVersion: '17.5' + tvDeviceModel: Apple TV + macosVersion: 15 + developerDir: CI_XCODE_16 + - name: LiveQuery Module, tvOS 18 + script: test:parse_live_query:tvos + tvOsVersion: '18.1' + tvDeviceModel: Apple TV + macosVersion: 15 + developerDir: CI_XCODE_16 fail-fast: false - runs-on: ${{ ((matrix.script == 'xcode15' || matrix.script == 'xcode16') && 'macos-14') || 'macos-13' }} + runs-on: macos-${{ matrix.macosVersion }} + name: ${{ matrix.name }} steps: - uses: actions/checkout@v4 - name: Cache SPM @@ -49,9 +130,9 @@ jobs: - name: Submodules run: git submodule update --init --recursive - name: Build-Test - run: set -o pipefail && env NSUnbufferedIO=YES bundle exec rake ${{ ((matrix.script == 'xcode14' || matrix.script == 'xcode15' || matrix.script == 'xcode16') && 'build:starters') || matrix.script }} + run: set -o pipefail && env NSUnbufferedIO=YES IOS_VERSION="${{ matrix.iosVersion }}" IOS_DEVICE_MODEL="${{ matrix.iosDeviceModel }}" WATCH_DEVICE_MODEL="${{ matrix.watchDeviceModel }}" WATCH_OS_VERSION="${{ matrix.watchOsVersion }}" TV_DEVICE_MODEL="${{ matrix.tvDeviceModel }}" TV_OS_VERSION="${{ matrix.tvOsVersion }}" bundle exec rake ${{ matrix.script }} env: - DEVELOPER_DIR: ${{ (matrix.script == 'xcode15' && env.CI_XCODE_15) || (matrix.script == 'xcode16' && env.CI_XCODE_16) || env.CI_XCODE_14 }} + DEVELOPER_DIR: ${{ env[matrix.developerDir] }} - name: Generate Environment Variables if: ${{ always() }} env: @@ -68,7 +149,7 @@ jobs: echo "Build Result Location: $BUILD_RESULTS" - name: Upload Artifact Logs if: ${{ failure() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} path: | @@ -103,7 +184,7 @@ jobs: plugin: xcode file: ${{ env.COVERAGE_PATH }} docs: - runs-on: macos-13 + runs-on: macos-14 timeout-minutes: 15 steps: - uses: actions/checkout@v4 @@ -117,7 +198,7 @@ jobs: run: | ./Scripts/jazzy.sh env: - DEVELOPER_DIR: ${{ env.CI_XCODE_14 }} + DEVELOPER_DIR: ${{ env.CI_XCODE_16 }} concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/release-automated.yml b/.github/workflows/release-automated.yml index 3c6083792..884501e3a 100644 --- a/.github/workflows/release-automated.yml +++ b/.github/workflows/release-automated.yml @@ -3,11 +3,11 @@ on: push: branches: [ master, release, alpha, beta ] env: - CI_XCODE_14: '/Applications/Xcode_14.2.app/Contents/Developer' + CI_XCODE_16: /Applications/Xcode_16.1.0.app/Contents/Developer jobs: release: - runs-on: macos-13 + runs-on: macos-14 outputs: current_tag: ${{ steps.tag.outputs.current_tag }} steps: @@ -46,7 +46,7 @@ jobs: publish-docs: needs: release if: needs.release.outputs.current_tag != '' - runs-on: macos-13 + runs-on: macos-14 steps: - name: Checkout repository uses: actions/checkout@v4 @@ -62,7 +62,7 @@ jobs: run: | ./Scripts/jazzy.sh env: - DEVELOPER_DIR: ${{ env.CI_XCODE_14 }} + DEVELOPER_DIR: ${{ env.CI_XCODE_16 }} - name: Deploy Jazzy Docs uses: peaceiris/actions-gh-pages@v3 with: diff --git a/.github/workflows/release-manual-docs.yml b/.github/workflows/release-manual-docs.yml index a88ef4faf..150763731 100644 --- a/.github/workflows/release-manual-docs.yml +++ b/.github/workflows/release-manual-docs.yml @@ -6,12 +6,12 @@ on: default: '' description: 'Version tag:' env: - CI_XCODE_14: '/Applications/Xcode_14.2.app/Contents/Developer' + CI_XCODE_16: /Applications/Xcode_16.1.0.app/Contents/Developer jobs: publish-docs: if: github.event.inputs.tag != '' - runs-on: macos-13 + runs-on: macos-14 steps: - name: Checkout repository uses: actions/checkout@v4 @@ -27,7 +27,7 @@ jobs: run: | ./Scripts/jazzy.sh env: - DEVELOPER_DIR: ${{ env.CI_XCODE_14 }} + DEVELOPER_DIR: ${{ env.CI_XCODE_16 }} - name: Deploy Jazzy Docs uses: peaceiris/actions-gh-pages@v3 with: diff --git a/Gemfile b/Gemfile index bcf060416..a22bf78f0 100644 --- a/Gemfile +++ b/Gemfile @@ -1,9 +1,9 @@ source 'https://rubygems.org' # Docs -gem 'jazzy', '~> 0.15.3' +gem 'jazzy', '0.15.3' # Development -gem 'xcpretty', '~> 0.4.0' -gem 'rake', '~> 13.2.1' -gem 'plist', '~> 3.7.1' +gem 'xcpretty', '0.3.0' +gem 'rake', '13.2.1' +gem 'plist', '3.7.1' diff --git a/Gemfile.lock b/Gemfile.lock index 255a43c70..7a0834d8f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -103,7 +103,7 @@ GEM rake (13.2.1) redcarpet (3.6.0) rexml (3.3.9) - rouge (3.28.0) + rouge (2.0.7) ruby-macho (2.5.1) sassc (2.4.0) ffi (~> 1.9) @@ -123,18 +123,18 @@ GEM colored2 (~> 3.1) nanaimo (~> 0.4.0) rexml (>= 3.3.6, < 4.0) - xcpretty (0.4.0) - rouge (~> 3.28.0) + xcpretty (0.3.0) + rouge (~> 2.0.7) PLATFORMS arm64-darwin x86_64-darwin DEPENDENCIES - jazzy (~> 0.15.3) - plist (~> 3.7.1) - rake (~> 13.2.1) - xcpretty (~> 0.4.0) + jazzy (= 0.15.3) + plist (= 3.7.1) + rake (= 13.2.1) + xcpretty (= 0.3.0) BUNDLED WITH 2.5.22 diff --git a/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme b/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme index c7e38565f..9e5527268 100644 --- a/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme +++ b/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-iOS.xcscheme @@ -81,6 +81,12 @@ + + + + @@ -90,6 +96,9 @@ + + diff --git a/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-macOS.xcscheme b/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-macOS.xcscheme index 2b3c0355f..f2a1764f4 100644 --- a/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-macOS.xcscheme +++ b/Parse/Parse.xcodeproj/xcshareddata/xcschemes/Parse-macOS.xcscheme @@ -62,6 +62,11 @@ BlueprintName = "ParseUnitTests-macOS" ReferencedContainer = "container:Parse.xcodeproj"> + + + + diff --git a/README.md b/README.md index 08243bb99..124696956 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,9 @@ A library that gives you access to the powerful Parse Server backend from your i --- - [Getting Started](#getting-started) +- [Compatibility](#compatibility) + - [Parse Server](#parse-server) + - [Xcode, iOS, macOS](#xcode-ios-macos) - [How Do I Contribute?](#how-do-i-contribute) - [Dependencies](#dependencies) @@ -49,6 +52,27 @@ The easiest way to install the SDK is via Swift Package Manager. Take a look at the public [documentation][docs] & [API][api] and start building. +## Compatibility + +### Parse Server + +Parse Apple SDK is compatible with the following versions of Parse Server. + +| Parse Apple SDK | Parse Server | +|-----------------|--------------| +| 1.0.0 | >= 1.0.0 | + +### Xcode, iOS, macOS + +The Parse Apple SDK is continuously tested with the most recent releases of Xcode to ensure compatibility. We follow the annual release schedule of Xcode to support the current and previous major Xcode version. + +| Xcode Version | iOS Version | macOS Version | macOS Version | Release Date | End-of-Support Date | Parse Apple SDK Support | +|---------------|-------------|---------------|---------------|----------------|---------------------|-------------------------| +| Xcode 13 | iOS 15 | macOS 12 | watchOS 8 | September 2021 | October 2023 | >= 1.19.3 <2.7.2 | +| Xcode 14 | iOS 16 | macOS 13 | watchOS 9 | September 2022 | October 2024 | >= 2.7.2 <= 5.0.0 | +| Xcode 15 | iOS 17 | macOS 14 | watchOS 10 | September 2023 | October 2025 | >= 3.0.0 | +| Xcode 16 | iOS 18 | macOS 15 | watchOS 11 | September 2024 | tbd | >= 4.2.0 | + ## How Do I Contribute? We want to make contributing to this project as easy and transparent as possible. Please refer to the [Contribution Guidelines][contributing]. diff --git a/Rakefile b/Rakefile index 7601b3812..1058d38c1 100644 --- a/Rakefile +++ b/Rakefile @@ -12,9 +12,23 @@ require_relative 'Vendor/xctoolchain/Scripts/xctask/build_task' SCRIPT_PATH = File.expand_path(File.dirname(__FILE__)) starters_path = File.join(SCRIPT_PATH, 'ParseStarterProject') -ios_simulator = 'platform="iOS Simulator",name="iPhone 14"' -tvos_simulator = 'platform="tvOS Simulator",name="Apple TV"' -watchos_simulator = 'platform="watchOS Simulator",name="Apple Watch Series 8 (45mm)"' +ios_version = ENV.fetch('IOS_VERSION') +ios_device_model = ENV.fetch('IOS_DEVICE_MODEL') +tvos_version = ENV.fetch('TV_OS_VERSION') +tv_device_model = ENV.fetch('TV_DEVICE_MODEL') +watchos_version = ENV.fetch('WATCH_OS_VERSION') +watch_device_model = ENV.fetch('WATCH_DEVICE_MODEL') + +puts "IOS_VERSION: #{ios_version}" +puts "IOS_DEVICE_MODEL: #{ios_device_model}" +puts "TV_OS_VERSION: #{tvos_version}" +puts "TV_DEVICE_MODEL: #{tv_device_model}" +puts "WATCH_OS_VERSION: #{watchos_version}" +puts "WATCH_DEVICE_MODEL: #{watch_device_model}" + +ios_simulator = "platform=\"iOS Simulator\",name=\"#{ios_device_model}\",OS=\"#{ios_version}\"" +tvos_simulator = "platform=\"tvOS Simulator\",name=\"#{tv_device_model}\",OS=\"#{tvos_version}\"" +watchos_simulator = "platform=\"watchOS Simulator\",name=\"#{watch_device_model}\",OS=\"#{watchos_version}\"" build_action = [XCTask::BuildAction::CLEAN, XCTask::BuildAction::BUILD]; @@ -82,6 +96,9 @@ namespace :build do end task :objc do + puts 'Running iOS ObjC Starter Project' + puts "IOS_VERSION: #{ios_version}" + puts "IOS_DEVICE_MODEL: #{ios_device_model}" project = 'ParseStarterProject' ios_starters_path = File.join(starters_path, 'iOS', project) task = XCTask::BuildTask.new do |t| @@ -101,6 +118,9 @@ namespace :build do end task :swift do + puts 'Running iOS Swift Starter Project' + puts "IOS_VERSION: #{ios_version}" + puts "IOS_DEVICE_MODEL: #{ios_device_model}" project = 'ParseStarterProject-Swift' ios_starters_path = File.join(starters_path, 'iOS', project) task = XCTask::BuildTask.new do |t| @@ -127,6 +147,7 @@ namespace :build do end task :objc do + puts 'Running macOS ObjC Starter Project' macos_starter_folder = File.join(starters_path, 'OSX', 'ParseOSXStarterProject') task = XCTask::BuildTask.new do |t| t.directory = macos_starter_folder @@ -144,6 +165,7 @@ namespace :build do end task :swift do + puts 'Running macOS Swift Starter Project' macos_starter_folder = File.join(starters_path, 'OSX', 'ParseOSXStarterProject-Swift') task = XCTask::BuildTask.new do |t| t.directory = macos_starter_folder @@ -169,6 +191,9 @@ namespace :build do end task :swift do + puts 'Running tvOS Swift Starter Project' + puts "TV_OS_VERSION: #{tvos_version}" + puts "TV_DEVICE_MODEL: #{tv_device_model}" tvos_starter_folder = File.join(starters_path, 'tvOS', 'ParseStarterProject-Swift') task = XCTask::BuildTask.new do |t| t.directory = tvos_starter_folder @@ -194,6 +219,9 @@ namespace :build do end task :swift do + puts 'Running watchOS Swift Starter Project' + puts "WATCH_OS_VERSION: #{watchos_version}" + puts "WATCH_DEVICE_MODEL: #{watch_device_model}" watchos_starter_folder = File.join(starters_path, 'watchOS', 'ParseStarterProject-Swift') task = XCTask::BuildTask.new do |t| t.directory = watchos_starter_folder @@ -218,6 +246,7 @@ namespace :build do end task :objc do + puts 'Running Live Query macOS ObjC Starter Project' live_query_starter_folder = File.join(SCRIPT_PATH, 'ParseLiveQuery', 'Examples') task = XCTask::BuildTask.new do |t| t.directory = live_query_starter_folder @@ -235,6 +264,7 @@ namespace :build do end task :swift do + puts 'Running Live Query macOS Swift Starter Project' live_query_starter_folder = File.join(SCRIPT_PATH, 'ParseLiveQuery', 'Examples') task = XCTask::BuildTask.new do |t| t.directory = live_query_starter_folder @@ -265,6 +295,9 @@ end namespace :test do desc 'Run iOS Tests' task :ios do |_, args| + puts 'Running iOS Tests' + puts "IOS_VERSION: #{ios_version}" + puts "IOS_DEVICE_MODEL: #{ios_device_model}" task = XCTask::BuildTask.new do |t| t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' @@ -283,6 +316,7 @@ namespace :test do desc 'Run macOS Tests' task :macos do |_, args| + puts 'Running macOS Tests' task = XCTask::BuildTask.new do |t| t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' @@ -307,6 +341,9 @@ namespace :test do end task :ios do + puts 'Running ParseLiveQuery iOS Tests' + puts "IOS_VERSION: #{ios_version}" + puts "IOS_DEVICE_MODEL: #{ios_device_model}" task = XCTask::BuildTask.new do |t| t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' @@ -324,6 +361,9 @@ namespace :test do end task :tvos do + puts 'Running ParseLiveQuery tvOS Tests' + puts "TV_OS_VERSION: #{tvos_version}" + puts "TV_DEVICE_MODEL: #{tv_device_model}" task = XCTask::BuildTask.new do |t| t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' @@ -340,6 +380,9 @@ namespace :test do end task :watchos do + puts 'Running ParseLiveQuery watchOS Tests' + puts "WATCH_OS_VERSION: #{watchos_version}" + puts "WATCH_DEVICE_MODEL: #{watch_device_model}" task = XCTask::BuildTask.new do |t| t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' @@ -356,6 +399,7 @@ namespace :test do end task :osx do + puts 'Running ParseLiveQuery macOS Tests' task = XCTask::BuildTask.new do |t| t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace'