From 6a49953e59f5114289691de5806d85069d107a90 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Tue, 15 Aug 2023 10:56:15 -0400 Subject: [PATCH 01/35] Fix Xcode 15 warnings by using Int instead of NSString for KVO context. --- Sources/UIKit/TextAlignmentConstraint.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Sources/UIKit/TextAlignmentConstraint.swift b/Sources/UIKit/TextAlignmentConstraint.swift index 8617b978..b7ee13ec 100644 --- a/Sources/UIKit/TextAlignmentConstraint.swift +++ b/Sources/UIKit/TextAlignmentConstraint.swift @@ -14,8 +14,6 @@ import UIKit #endif -private var TextAlignmentConstraintKVOContext = "BonMotTextAlignmentConstraintKVOContext" as NSString - /// Used to align various UI controls (anything with a font or attribute text) /// by properties that are not available with stock constraints: /// - cap height (the tops of capital letters) @@ -97,6 +95,8 @@ public class TextAlignmentConstraint: NSLayoutConstraint { private var item1: AnyObject! private var item2: AnyObject! + private static var kvoContext = 0 + // The class part of these selectors are ignored; it is there simply to satisfy Xcode's selector syntax. private static let fontSelector = #selector(getter: BONTextField.font) @@ -150,13 +150,13 @@ public class TextAlignmentConstraint: NSLayoutConstraint { private func setupObservers() { for keyPath in fontKeyPaths { - addObserver(self, forKeyPath: keyPath, options: [], context: &TextAlignmentConstraintKVOContext) + addObserver(self, forKeyPath: keyPath, options: [], context: &Self.kvoContext) } } private func tearDownObservers() { for keyPath in fontKeyPaths { - removeObserver(self, forKeyPath: keyPath, context: &TextAlignmentConstraintKVOContext) + removeObserver(self, forKeyPath: keyPath, context: &Self.kvoContext) } } @@ -175,7 +175,7 @@ public class TextAlignmentConstraint: NSLayoutConstraint { // Can't use block-based KVO until we can use \NSLayoutConstraint.firstItem // swiftlint:disable:next block_based_kvo public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) { - guard context == &TextAlignmentConstraintKVOContext else { + guard context == &Self.kvoContext else { super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) return } From 35de049fccec685418d4e9fda0714a0d311023e9 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Tue, 15 Aug 2023 10:56:34 -0400 Subject: [PATCH 02/35] Stop using conditional compilation where the true and false branches are identical. --- Sources/UIKit/TextAlignmentConstraint.swift | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Sources/UIKit/TextAlignmentConstraint.swift b/Sources/UIKit/TextAlignmentConstraint.swift index b7ee13ec..adc383d8 100644 --- a/Sources/UIKit/TextAlignmentConstraint.swift +++ b/Sources/UIKit/TextAlignmentConstraint.swift @@ -184,12 +184,7 @@ public class TextAlignmentConstraint: NSLayoutConstraint { } private func updateConstant() { - #if os(OSX) - let distanceFromTop1 = distanceFromTop(of: firstItem!, with: firstItemAttribute) - #else - let distanceFromTop1 = distanceFromTop(of: firstItem!, with: firstItemAttribute) - #endif - + let distanceFromTop1 = distanceFromTop(of: firstItem!, with: firstItemAttribute) let distanceFromTop2 = distanceFromTop(of: secondItem!, with: secondItemAttribute) let difference = distanceFromTop2 - distanceFromTop1 constant = difference From 7b990e24b5902de6f0cc93fcd2fd9f182e1dc5ef Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 15:32:33 -0500 Subject: [PATCH 03/35] Bump to Xcode 14 and 15. Drop Carthage build. --- .circleci/config.yml | 44 +++++++++++++------------------------------- README.md | 9 --------- 2 files changed, 13 insertions(+), 40 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 95631e6b..cc8c54f5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2.1 jobs: danger: - executor: xcode-12 + executor: xcode-14 steps: - setup - run: @@ -55,61 +55,48 @@ jobs: command: bash <(curl -s https://codecov.io/bash) -f build/BonMot-iOS/slather/cobertura.xml -X coveragepy -X gcov -X xcode swift-package: - executor: xcode-12 + executor: xcode-14 steps: - setup - run: swift build - run: swift test lint-pod: - executor: xcode-12 + executor: xcode-14 steps: - setup - lint-pod fastlane-tests: - executor: xcode-12 + executor: xcode-14 steps: - setup - run: bundle exec fastlane test_all - fastlane-tests-xcode-13: - executor: xcode-13 + fastlane-tests-xcode-15: + executor: xcode-15 steps: - setup - run: bundle exec fastlane test_all - carthage-build: - executor: xcode-12 - steps: - - checkout - - run: - name: Update homebrew dependencies - command: brew update 1> /dev/null 2> /dev/null - - run: - name: Update Carthage - command: brew outdated carthage || (brew uninstall carthage --force; brew install carthage --force-bottle) - # Carthage does not work on Xcode 12 https://github.com/Carthage/Carthage/issues/3019 - # - run: carthage build --no-skip-current && for platform in Mac iOS tvOS watchOS; do test -d Carthage/Build/${platform}/BonMot.framework || exit 1; done - deploy-to-cocoapods: - executor: xcode-12 + executor: xcode-14 steps: - setup - run: bundle exec pod trunk push executors: - xcode-12: + xcode-14: macos: - xcode: "12.5.1" + xcode: "14.3.1" environment: LC_ALL: en_US.UTF-8 LANG: en_US.UTF-8 HOMEBREW_NO_AUTO_UPDATE: 1 shell: /bin/bash --login -eo pipefail - xcode-13: + xcode-15: macos: - xcode: "13.0.0" + xcode: "15.1.0" environment: LC_ALL: en_US.UTF-8 LANG: en_US.UTF-8 @@ -162,7 +149,7 @@ workflows: filters: tags: only: /.*/ - - fastlane-tests-xcode-13: + - fastlane-tests-xcode-15: filters: tags: only: /.*/ @@ -170,19 +157,14 @@ workflows: filters: tags: only: /.*/ - - carthage-build: - filters: - tags: - only: /.*/ - deploy-to-cocoapods: context: CocoaPods requires: - danger - swift-package - fastlane-tests - - fastlane-tests-xcode-13 + - fastlane-tests-xcode-15 - lint-pod - - carthage-build filters: tags: only: /\d+(\.\d+)*(-.*)*/ diff --git a/README.md b/README.md index c77fbe12..5ccda8bb 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ [![Version](https://img.shields.io/cocoapods/v/BonMot.svg?style=flat)](http://cocoapods.org/pods/BonMot) [![License](https://img.shields.io/cocoapods/l/BonMot.svg?style=flat)](http://cocoapods.org/pods/BonMot) [![Platform](https://img.shields.io/cocoapods/p/BonMot.svg?style=flat)](http://cocoapods.org/pods/BonMot) -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Swift Package Manager compatible](https://img.shields.io/badge/Swift_Package_Manager-compatible-orange?style=flat)](https://swift.org/package-manager/) [![codecov](https://codecov.io/gh/Rightpoint/BonMot/branch/master/graph/badge.svg)](https://codecov.io/gh/Rightpoint/BonMot) BonMot (pronounced *Bon Mo*, French for *good word*) is a Swift attributed string library. It abstracts away the complexities of the iOS, macOS, tvOS, and watchOS typography tools, freeing you to focus on making your text beautiful. @@ -369,14 +368,6 @@ it, simply add the following line to your Podfile: pod 'BonMot' ``` -## Carthage - -BonMot is also compatible with [Carthage](https://github.com/Carthage/Carthage). To install it, simply add the following line to your Cartfile: - -```ogdl -github "Rightpoint/BonMot" -``` - # Contributing Issues and pull requests are welcome! Please ensure that you have the latest [SwiftLint](https://github.com/realm/SwiftLint) installed before committing and that there are no style warnings generated when building. From 1c7030e8cdb72a85102ffd176fd831c7d6f7bd56 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 15:43:40 -0500 Subject: [PATCH 04/35] Update ruby version and gems. --- .circleci/config.yml | 2 +- Gemfile.lock | 139 +++++++++++++++++++++++-------------------- 2 files changed, 74 insertions(+), 67 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cc8c54f5..82e18525 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -115,7 +115,7 @@ commands: steps: - run: name: Set Ruby Version - command: echo "ruby-2.5" > ~/.ruby-version + command: echo "ruby-3.0.6" > ~/.ruby-version - restore_cache: key: 1-gems-{{ checksum "Gemfile.lock" }} - run: bundle check || bundle install --path vendor/bundle diff --git a/Gemfile.lock b/Gemfile.lock index 978dfa6b..d2db9170 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,35 +3,42 @@ GEM specs: CFPropertyList (3.0.6) rexml - activesupport (7.0.5) + activesupport (7.1.2) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) minitest (>= 5.1) + mutex_m tzinfo (~> 2.0) - addressable (2.8.4) + addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) artifactory (3.0.15) atomos (0.1.3) - aws-eventstream (1.2.0) - aws-partitions (1.777.0) - aws-sdk-core (3.174.0) - aws-eventstream (~> 1, >= 1.0.2) + aws-eventstream (1.3.0) + aws-partitions (1.873.0) + aws-sdk-core (3.190.1) + aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.5) + aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.66.0) - aws-sdk-core (~> 3, >= 3.174.0) + aws-sdk-kms (1.75.0) + aws-sdk-core (~> 3, >= 3.188.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.123.1) - aws-sdk-core (~> 3, >= 3.174.0) + aws-sdk-s3 (1.142.0) + aws-sdk-core (~> 3, >= 3.189.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.4) - aws-sigv4 (1.5.2) + aws-sigv4 (~> 1.8) + aws-sigv4 (1.8.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) + base64 (0.2.0) + bigdecimal (3.1.5) circleci (2.1.0) circleci_artifact (0.1.0) circleci (~> 2.0) @@ -41,12 +48,12 @@ GEM nap open4 (~> 1.3) clamp (1.3.2) - cocoapods (1.12.1) + cocoapods (1.14.3) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.12.1) + cocoapods-core (= 1.14.3) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.6.0, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) cocoapods-trunk (>= 1.6.0, < 2.0) @@ -58,8 +65,8 @@ GEM molinillo (~> 0.8.0) nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) - xcodeproj (>= 1.21.0, < 2.0) - cocoapods-core (1.12.1) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.14.3) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -70,7 +77,7 @@ GEM public_suffix (~> 4.0) typhoeus (~> 1.0) cocoapods-deintegrate (1.0.5) - cocoapods-downloader (1.6.3) + cocoapods-downloader (2.1) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.1) @@ -83,9 +90,10 @@ GEM commander (4.6.0) highline (~> 2.0.0) concurrent-ruby (1.2.2) + connection_pool (2.4.1) cork (0.3.0) colored2 (~> 3.1) - danger (9.3.1) + danger (9.4.2) claide (~> 1.0) claide-plugins (>= 0.9.2) colored2 (~> 3.1) @@ -96,12 +104,12 @@ GEM kramdown (~> 2.3) kramdown-parser-gfm (~> 1.0) no_proxy_fix - octokit (~> 6.0) + octokit (>= 4.0) terminal-table (>= 1, < 4) danger-junit (1.0.2) danger (> 2.0) ox (~> 2.0) - danger-swiftlint (0.33.0) + danger-swiftlint (0.34.0) danger rake (> 10) thor (~> 0.19) @@ -109,16 +117,17 @@ GEM danger (>= 2.1) xcov (>= 1.7.3) declarative (0.0.20) - digest-crc (0.6.4) + digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) + domain_name (0.6.20231109) dotenv (2.8.1) + drb (2.2.0) + ruby2_keywords emoji_regex (3.2.3) escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - excon (0.100.0) + excon (0.108.0) faraday (1.10.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) @@ -149,8 +158,8 @@ GEM faraday-retry (1.0.3) faraday_middleware (1.2.0) faraday (~> 1.0) - fastimage (2.2.7) - fastlane (2.213.0) + fastimage (2.3.0) + fastlane (2.217.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -171,6 +180,7 @@ GEM google-apis-playcustomapp_v1 (~> 0.1) google-cloud-storage (~> 1.31) highline (~> 2.0) + http-cookie (~> 1.0.5) json (< 3.0.0) jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) @@ -182,23 +192,23 @@ GEM security (= 0.1.3) simctl (~> 1.6.3) terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) + terminal-table (~> 3) tty-screen (>= 0.6.3, < 1.0.0) tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) - ffi (1.15.5) + ffi (1.16.3) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) git (1.18.0) addressable (~> 2.8) rchardet (~> 1.8) - google-apis-androidpublisher_v3 (0.43.0) + google-apis-androidpublisher_v3 (0.54.0) google-apis-core (>= 0.11.0, < 2.a) - google-apis-core (0.11.0) + google-apis-core (0.11.2) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -211,26 +221,26 @@ GEM google-apis-core (>= 0.11.0, < 2.a) google-apis-playcustomapp_v1 (0.13.0) google-apis-core (>= 0.11.0, < 2.a) - google-apis-storage_v1 (0.19.0) - google-apis-core (>= 0.9.0, < 2.a) - google-cloud-core (1.6.0) - google-cloud-env (~> 1.0) + google-apis-storage_v1 (0.29.0) + google-apis-core (>= 0.11.0, < 2.a) + google-cloud-core (1.6.1) + google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) - google-cloud-env (1.6.0) - faraday (>= 0.17.3, < 3.0) + google-cloud-env (2.1.0) + faraday (>= 1.0, < 3.a) google-cloud-errors (1.3.1) - google-cloud-storage (1.44.0) + google-cloud-storage (1.45.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.19.0) + google-apis-storage_v1 (~> 0.29.0) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.5.2) - faraday (>= 0.17.3, < 3.a) + googleauth (1.9.1) + faraday (>= 1.0, < 3.a) + google-cloud-env (~> 2.1) jwt (>= 1.4, < 3.0) - memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) @@ -241,46 +251,46 @@ GEM i18n (1.14.1) concurrent-ruby (~> 1.0) jmespath (1.6.2) - json (2.6.3) + json (2.7.1) jwt (2.7.1) kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - memoist (0.16.2) mini_magick (4.12.0) - mini_mime (1.1.2) - mini_portile2 (2.8.2) - minitest (5.18.0) + mini_mime (1.1.5) + mini_portile2 (2.8.5) + minitest (5.20.0) molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.3.0) + mutex_m (0.2.0) nanaimo (0.3.0) nap (1.1.0) naturally (2.2.1) netrc (0.11.0) no_proxy_fix (0.1.2) - nokogiri (1.15.2) + nokogiri (1.15.5) mini_portile2 (~> 2.8.2) racc (~> 1.4) - octokit (6.1.1) + octokit (8.0.0) faraday (>= 1, < 3) sawyer (~> 0.9) open4 (1.3.4) optparse (0.1.1) os (1.1.4) - ox (2.14.16) + ox (2.14.17) plist (3.7.0) public_suffix (4.0.7) - racc (1.7.0) - rake (13.0.6) + racc (1.7.3) + rake (13.1.0) rchardet (1.8.0) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.5) + rexml (3.2.6) rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) @@ -289,7 +299,7 @@ GEM addressable (>= 2.3.5) faraday (>= 0.17.3, < 3) security (0.1.3) - signet (0.17.0) + signet (0.18.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) @@ -298,33 +308,30 @@ GEM CFPropertyList naturally slack-notifier (2.4.0) - slather (2.7.4) + slather (2.8.0) CFPropertyList (>= 2.2, < 4) activesupport clamp (~> 1.3) - nokogiri (>= 1.13.9) + nokogiri (>= 1.14.3) xcodeproj (~> 1.21) terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) thor (0.20.3) trailblazer-option (0.1.2) tty-cursor (0.7.1) - tty-screen (0.8.1) + tty-screen (0.8.2) tty-spinner (0.9.3) tty-cursor (~> 0.7) - typhoeus (1.4.0) + typhoeus (1.4.1) ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.8.2) - unicode-display_width (1.8.0) + unicode-display_width (2.5.0) webrick (1.8.1) word_wrap (1.0.0) - xcodeproj (1.22.0) + xcodeproj (1.23.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) From 84d0b942fdd62d52d741ad78c3afb57a5eaa8f9d Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 15:53:16 -0500 Subject: [PATCH 05/35] Build on Apple Silicon. --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 82e18525..e9953637 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -89,6 +89,7 @@ executors: xcode-14: macos: xcode: "14.3.1" + resource_class: macos.m1.large.gen1 environment: LC_ALL: en_US.UTF-8 LANG: en_US.UTF-8 @@ -97,6 +98,7 @@ executors: xcode-15: macos: xcode: "15.1.0" + resource_class: macos.m1.large.gen1 environment: LC_ALL: en_US.UTF-8 LANG: en_US.UTF-8 From 4857ad3211d99af6e9e2c425a9692d20ae86276c Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 16:08:49 -0500 Subject: [PATCH 06/35] Use updated method of configuring bundler path. --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e9953637..c5f68055 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -120,7 +120,7 @@ commands: command: echo "ruby-3.0.6" > ~/.ruby-version - restore_cache: key: 1-gems-{{ checksum "Gemfile.lock" }} - - run: bundle check || bundle install --path vendor/bundle + - run: bundle check || bundle config set --local path 'vendor/bundle' && bundle install - save_cache: key: 1-gems-{{ checksum "Gemfile.lock" }} paths: From d0a7abc41684f3bb48a0b7514d255c9dfe9fc6b6 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 16:34:40 -0500 Subject: [PATCH 07/35] Stop gathering coverage and running danger because I did not set it up and do not have the time or energy to maintain it. If there is a simpler way to do this in future, we could consider adding it back. --- .circleci/config.yml | 58 ----------------------- Dangerfile | 84 --------------------------------- Gemfile | 16 +------ Gemfile.lock | 80 ------------------------------- fastlane/Fastfile | 110 ------------------------------------------- 5 files changed, 1 insertion(+), 347 deletions(-) delete mode 100644 Dangerfile diff --git a/.circleci/config.yml b/.circleci/config.yml index c5f68055..93c80f12 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,59 +1,6 @@ version: 2.1 jobs: - danger: - executor: xcode-14 - steps: - - setup - - run: - name: Install xchtmlreport - command: | - curl -O https://raw.githubusercontent.com/TitouanVanBelle/XCTestHTMLReport/develop/xchtmlreport.rb - brew install --HEAD --build-from-source xchtmlreport.rb - - run: - name: Install xcparse - when: always - command: | - brew install chargepoint/xcparse/xcparse - - run: - name: Tests & Code Coverage - when: always - command: | - bundle exec fastlane coverage_all - # Store xcov Code Coverage HTML report artifact - - store_artifacts: - path: build/BonMot-iOS/xcov - destination: xcov - - store_artifacts: - path: build/BonMot-iOS/slather - destination: slather - - store_artifacts: - path: build/BonMot-iOS/scan - destination: scan - - run: - name: Rename CircleCI JUnit XML - when: always - command: | - mkdir -p build/test-results/danger - cp build/BonMot-iOS/scan/BonMot-iOS.xcresult/report.junit build/test-results/danger/results.xml - - store_test_results: - path: build/test-results - # Install SwiftLint only before Danger because otherwise it fails the build - - run: - name: Install SwiftLint - when: always - command: | - brew install swiftlint - - run: - name: Danger - when: always - command: | - if [ -n "$DANGER_GITHUB_API_TOKEN" ]; then bundle exec danger; else echo "Skipping Danger for forked pull request."; fi - - run: - name: Upload to Codecov - when: always - command: bash <(curl -s https://codecov.io/bash) -f build/BonMot-iOS/slather/cobertura.xml -X coveragepy -X gcov -X xcode - swift-package: executor: xcode-14 steps: @@ -139,10 +86,6 @@ workflows: version: 2 build-test-deploy: jobs: - - danger: - filters: - tags: - only: /.*/ - swift-package: filters: tags: @@ -162,7 +105,6 @@ workflows: - deploy-to-cocoapods: context: CocoaPods requires: - - danger - swift-package - fastlane-tests - fastlane-tests-xcode-15 diff --git a/Dangerfile b/Dangerfile deleted file mode 100644 index ae2debef..00000000 --- a/Dangerfile +++ /dev/null @@ -1,84 +0,0 @@ -require 'circleci_artifact' - -# Make it more obvious that a PR is a work in progress and shouldn't be merged yet. -has_wip_label = github.pr_labels.any? { |label| label.include? "WIP" } -has_wip_title = github.pr_title.include? "[WIP]" - -if has_wip_label || has_wip_title - warn("PR is classed as Work in Progress") -end - -# Warn when there is a big PR. -warn("Big PR") if git.lines_of_code > 500 - -# Mainly to encourage writing up some reasoning about the PR, rather than just leaving a title. -if github.pr_body.length < 3 && git.lines_of_code > 10 - warn("Please provide a summary in the Pull Request description") -end - -src_root = File.expand_path('../', __FILE__) - -SCHEME = "BonMot-iOS" - -result_bundle_path = "#{src_root}/build/#{SCHEME}/scan/#{SCHEME}.xcresult-coverage" -xccoverage_files = Dir.glob("#{result_bundle_path}/**/action.xccovreport").sort_by { |filename| File.mtime(filename) }.reverse -xccov_file_direct_path = xccoverage_files.first - -xcov.report( - project: "#{src_root}/BonMot.xcodeproj", - scheme: SCHEME, - output_directory: "#{src_root}/build/#{SCHEME}/xcov", - xccov_file_direct_path: xccov_file_direct_path -) - -## ** SwiftLint *** -swiftlint.binary_path = "/usr/local/bin/swiftlint" -swiftlint.config_file = "#{src_root}/.swiftlint.yml" - -# Run SwiftLint and warn us if anything fails it -swiftlint.directory = src_root -swiftlint.lint_files inline_mode: true - -# Getting artifact URLs from CircleCI - -# You must set up the CIRCLE_API_TOKEN manually using these instructions -# https://github.com/Rightpoint/ios-template/tree/master/PRODUCTNAME#danger -token = ENV['CIRCLE_API_TOKEN'] -# These are already in the Circle environment -# https://circleci.com/docs/2.0/env-vars/#build-specific-environment-variables -username = ENV['CIRCLE_PROJECT_USERNAME'] -reponame = ENV['CIRCLE_PROJECT_REPONAME'] -build = ENV['CIRCLE_BUILD_NUM'] - -if !(token.nil? or username.nil? or reponame.nil? or build.nil?) - fetcher = CircleciArtifact::Fetcher.new(token: token, username: username, reponame: reponame, build: build) - - xcov = CircleciArtifact::Query.new(url_substring: 'xcov/index.html') - slather = CircleciArtifact::Query.new(url_substring: 'slather/index.html') - xcpretty = CircleciArtifact::Query.new(url_substring: 'scan/report.html') - xchtmlreport = CircleciArtifact::Query.new(url_substring: 'scan/index.html') - queries = [xcov, slather, xcpretty, xchtmlreport] - results = fetcher.fetch_queries(queries) - - xcov_url = results.url_for_query(xcov) - slather_url = results.url_for_query(slather) - xcpretty_url = results.url_for_query(xcpretty) - xchtmlreport_url = results.url_for_query(xchtmlreport) - - if !xchtmlreport_url.nil? - message "[Test Results](#{xchtmlreport_url})" - else - message "Tests in progress..." - end - - if !slather_url.nil? - message "[Code Coverage](#{slather_url})" - end -else - warn "Missing CircleCI artifacts. Most likely the [CIRCLE_API_TOKEN](https://github.com/Rightpoint/circleci_artifact#getting-started) is not set, or Danger is not running on CircleCI." -end - -# Test Reporting - -junit.parse "#{src_root}/build/BonMot-iOS/scan/BonMot-iOS.xcresult/report.junit" -junit.report diff --git a/Gemfile b/Gemfile index fee24252..3983193e 100644 --- a/Gemfile +++ b/Gemfile @@ -1,22 +1,8 @@ source 'https://rubygems.org' gem 'cocoapods' +gem 'fastlane' gem 'xcpretty' -# Danger -group :test, :danger do - gem 'slather' - gem 'circleci_artifact' - gem 'xcov' - gem 'fastlane' -end - -group :danger do - gem 'danger' - gem 'danger-swiftlint' - gem 'danger-xcov' - gem 'danger-junit' -end - plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') eval_gemfile(plugins_path) if File.exist?(plugins_path) diff --git a/Gemfile.lock b/Gemfile.lock index d2db9170..b858c4bd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -39,15 +39,7 @@ GEM babosa (1.0.4) base64 (0.2.0) bigdecimal (3.1.5) - circleci (2.1.0) - circleci_artifact (0.1.0) - circleci (~> 2.0) claide (1.1.0) - claide-plugins (0.9.2) - cork - nap - open4 (~> 1.3) - clamp (1.3.2) cocoapods (1.14.3) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) @@ -91,31 +83,6 @@ GEM highline (~> 2.0.0) concurrent-ruby (1.2.2) connection_pool (2.4.1) - cork (0.3.0) - colored2 (~> 3.1) - danger (9.4.2) - claide (~> 1.0) - claide-plugins (>= 0.9.2) - colored2 (~> 3.1) - cork (~> 0.1) - faraday (>= 0.9.0, < 3.0) - faraday-http-cache (~> 2.0) - git (~> 1.13) - kramdown (~> 2.3) - kramdown-parser-gfm (~> 1.0) - no_proxy_fix - octokit (>= 4.0) - terminal-table (>= 1, < 4) - danger-junit (1.0.2) - danger (> 2.0) - ox (~> 2.0) - danger-swiftlint (0.34.0) - danger - rake (> 10) - thor (~> 0.19) - danger-xcov (0.5.0) - danger (>= 2.1) - xcov (>= 1.7.3) declarative (0.0.20) digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) @@ -146,8 +113,6 @@ GEM faraday-em_http (1.0.0) faraday-em_synchrony (1.0.0) faraday-excon (1.1.0) - faraday-http-cache (2.5.0) - faraday (>= 0.8) faraday-httpclient (1.0.1) faraday-multipart (1.0.4) multipart-post (~> 2) @@ -203,9 +168,6 @@ GEM fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - git (1.18.0) - addressable (~> 2.8) - rchardet (~> 1.8) google-apis-androidpublisher_v3 (0.54.0) google-apis-core (>= 0.11.0, < 2.a) google-apis-core (0.11.2) @@ -253,13 +215,8 @@ GEM jmespath (1.6.2) json (2.7.1) jwt (2.7.1) - kramdown (2.4.0) - rexml - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) mini_magick (4.12.0) mini_mime (1.1.5) - mini_portile2 (2.8.5) minitest (5.20.0) molinillo (0.8.0) multi_json (1.15.0) @@ -269,22 +226,11 @@ GEM nap (1.1.0) naturally (2.2.1) netrc (0.11.0) - no_proxy_fix (0.1.2) - nokogiri (1.15.5) - mini_portile2 (~> 2.8.2) - racc (~> 1.4) - octokit (8.0.0) - faraday (>= 1, < 3) - sawyer (~> 0.9) - open4 (1.3.4) optparse (0.1.1) os (1.1.4) - ox (2.14.17) plist (3.7.0) public_suffix (4.0.7) - racc (1.7.3) rake (13.1.0) - rchardet (1.8.0) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) @@ -295,9 +241,6 @@ GEM ruby-macho (2.5.1) ruby2_keywords (0.0.5) rubyzip (2.3.2) - sawyer (0.9.2) - addressable (>= 2.3.5) - faraday (>= 0.17.3, < 3) security (0.1.3) signet (0.18.0) addressable (~> 2.8) @@ -307,17 +250,9 @@ GEM simctl (1.6.10) CFPropertyList naturally - slack-notifier (2.4.0) - slather (2.8.0) - CFPropertyList (>= 2.2, < 4) - activesupport - clamp (~> 1.3) - nokogiri (>= 1.14.3) - xcodeproj (~> 1.21) terminal-notifier (2.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - thor (0.20.3) trailblazer-option (0.1.2) tty-cursor (0.7.1) tty-screen (0.8.2) @@ -338,32 +273,17 @@ GEM colored2 (~> 3.1) nanaimo (~> 0.3.0) rexml (~> 3.2.4) - xcov (1.8.1) - fastlane (>= 2.141.0, < 3.0.0) - multipart-post - slack-notifier - terminal-table - xcodeproj - xcresult (~> 0.2.0) xcpretty (0.3.0) rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) - xcresult (0.2.1) PLATFORMS ruby DEPENDENCIES - circleci_artifact cocoapods - danger - danger-junit - danger-swiftlint - danger-xcov fastlane - slather - xcov xcpretty BUNDLED WITH diff --git a/fastlane/Fastfile b/fastlane/Fastfile index a3747128..da4f9f74 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -17,20 +17,6 @@ BUILD_PATH="./build" DERIVED_DATA_PATH = "#{BUILD_PATH}/derived_data" PROJECT_NAME='BonMot.xcodeproj' -desc "Tests & Coverage: iOS, tvOS, macOS. Builds: watchOS." -lane :coverage_all do - bundle_ios = coverage(scheme: "BonMot-iOS", devices: get_devices()) - bundle_tvos = coverage(scheme: "BonMot-tvOS") - # For some reason fastlane tries to build for tvOS simulator unless destination is manually set - bundle_macos = coverage(scheme: "BonMot-OSX", destination: "platform=macOS") - - xchtmlreport(result_bundle_paths: [bundle_ios, bundle_tvos, bundle_macos], - enable_junit: true) - # Unit testing is not available on watchOS - xcodebuild(scheme: "BonMot-watchOS", - derivedDataPath: DERIVED_DATA_PATH) -end - desc "Tests: iOS, tvOS, macOS. Builds: watchOS." lane :test_all do test(scheme: "BonMot-iOS", devices: get_devices()) @@ -42,11 +28,6 @@ lane :test_all do end platform :mac do - desc "Runs Tests & Generates Code Coverage Reports for macOS" - lane :coverage_macos do - coverage(scheme: "BonMot-OSX") - end - desc "Runs Tests for macOS" lane :test_macos do test(scheme: "BonMot-OSX", destination: "platform=macOS") @@ -54,13 +35,6 @@ platform :mac do end platform :ios do - desc "Runs Tests & Generates Code Coverage Reports for latest iOS" - lane :coverage_ios do - devices = get_devices() - coverage(scheme: "BonMot-iOS", - devices: devices) - end - desc "Runs Tests for latest iOS" lane :test_ios do devices = get_devices() @@ -68,11 +42,6 @@ platform :ios do devices: devices) end - desc "Runs Tests & Generates Code Coverage Reports for tvOS" - lane :coverage_tvos do - coverage(scheme: "BonMot-tvOS") - end - desc "Runs Tests for tvOS" lane :test_tvos do test(scheme: "BonMot-tvOS") @@ -113,85 +82,6 @@ def test(scheme:, devices: nil, destination: nil) end end -def coverage(scheme:, devices: nil, destination: nil) - scan_output_path = "#{BUILD_PATH}/#{scheme}/scan" - - # NOTE: Running too many devices concurrently breaks CircleCI resource limits - disable_concurrent_testing = false - if ENV['CIRCLE_BUILD_NUM'] - disable_concurrent_testing = true - end - - begin - scan( - output_types: 'junit,html', - devices: devices, - destination: destination, - scheme: scheme, - output_directory: scan_output_path, - code_coverage: true, - derived_data_path: DERIVED_DATA_PATH, - result_bundle: true, - disable_concurrent_testing: disable_concurrent_testing - ) - rescue => ex - # Don't fail the entire lane when running tests, but print failure to STDERR - STDERR.puts ex - end - - result_bundle_path = Scan.cache[:result_bundle_path] - - # Extract coverage from Xcode 11 xcresult bundle - absolute_result_bundle_path = "#{Dir.pwd}/../#{result_bundle_path}" - absolute_coverage_path = "#{absolute_result_bundle_path}-coverage" - sh("xcparse codecov #{absolute_result_bundle_path} #{absolute_coverage_path}") - xccoverage_files = Dir.glob("#{absolute_coverage_path}/**/action.xccovreport").sort_by { |filename| File.mtime(filename) }.reverse - xccov_file_direct_path = xccoverage_files.first - - slather_use_circleci = "false" - - if ENV['CIRCLE_BUILD_NUM'] - slather_use_circleci = "true" - end - - xcov( - project: PROJECT_NAME, - scheme: scheme, - output_directory: "#{BUILD_PATH}/#{scheme}/xcov", - xccov_file_direct_path: xccov_file_direct_path - ) - - # Add binaries here as you create internal frameworks - slather_binaries = ['BonMot'] - slather_output_directory = "#{BUILD_PATH}/#{scheme}/slather" - - # html and cobertura_xml output must be run separately - slather( - proj: PROJECT_NAME, - scheme: scheme, - binary_basename: slather_binaries, - output_directory: slather_output_directory, - html: "true", - build_directory: DERIVED_DATA_PATH - ) - # Using Cobertura XML allows us to upload to Codecov.io - # Uploading to codecov is handled separately in the .circleci/config.yml - slather( - proj: PROJECT_NAME, - scheme: scheme, - binary_basename: slather_binaries, - output_directory: slather_output_directory, - circleci: slather_use_circleci, - cobertura_xml: "true", - build_directory: DERIVED_DATA_PATH - ) - - xchtmlreport(result_bundle_path: result_bundle_path, - enable_junit: true) - - result_bundle_path -end - def get_devices() # The full list of iOS simulators available on CircleCI # https://circleci.com/docs/2.0/testing-ios/#supported-xcode-versions From f84ac6066504f61eb354985386e95fc7e63e64eb Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 16:38:20 -0500 Subject: [PATCH 08/35] Simplify ruby setup per latest CircleCI docs at https://circleci.com/docs/testing-ios/. --- .circleci/config.yml | 24 ++++++++++-------------- .ruby-version | 1 + 2 files changed, 11 insertions(+), 14 deletions(-) create mode 100644 .ruby-version diff --git a/.circleci/config.yml b/.circleci/config.yml index 93c80f12..3dbab311 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,8 @@ version: 2.1 +orbs: + macos: circleci/macos@2 + jobs: swift-package: executor: xcode-14 @@ -57,28 +60,21 @@ commands: description: "Shared setup" steps: - checkout - - restore-gems + - switch-ruby - restore-gems: - description: "Restore Ruby Gems" + switch-ruby: + description: "Switch Ruby" steps: - - run: - name: Set Ruby Version - command: echo "ruby-3.0.6" > ~/.ruby-version - - restore_cache: - key: 1-gems-{{ checksum "Gemfile.lock" }} - - run: bundle check || bundle config set --local path 'vendor/bundle' && bundle install - - save_cache: - key: 1-gems-{{ checksum "Gemfile.lock" }} - paths: - - vendor/bundle + - macos/switch-ruby: + version: "3.0.6" + - run: bundle install lint-pod: description: "Lints podspec with specified Swift version" parameters: swift-version: type: string - default: "5.0" + default: "5.8" steps: - run: bundle exec pod lib lint --swift-version=<< parameters.swift-version >> diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 00000000..818bd47a --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +3.0.6 From 34db0e0403d25c6d7f2846ecfd9aa47bcee9e2dc Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 16:44:05 -0500 Subject: [PATCH 09/35] Bump supported Swift versions. --- BonMot.podspec | 2 +- Package.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BonMot.podspec b/BonMot.podspec index f1f18ad2..8ef841d9 100644 --- a/BonMot.podspec +++ b/BonMot.podspec @@ -2,7 +2,7 @@ Pod::Spec.new do |s| s.name = "BonMot" s.version = "6.1.3" s.summary = "Beautiful, easy attributed strings in Swift" - s.swift_versions = ["5.0"] + s.swift_versions = ["5.8", "5.9"] s.description = <<-DESC BonMot removes all the mystery from creating beautiful, powerful attributed strings in Swift. DESC diff --git a/Package.swift b/Package.swift index 7c884f76..3ad87223 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.3 +// swift-tools-version:5.8 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription From fe1c7f2f1298882d69e8986008243d046c27b5a0 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 16:46:16 -0500 Subject: [PATCH 10/35] Stop requiring circleci_artifact in Fastfile. --- fastlane/Fastfile | 1 - 1 file changed, 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index da4f9f74..82062d8d 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -10,7 +10,6 @@ # update_fastlane # default_platform(:ios) -fastlane_require 'circleci_artifact' fastlane_version "2.93.1" BUILD_PATH="./build" From 40c2f084658b835c9926433c59aa51aa088aa953 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 16:50:05 -0500 Subject: [PATCH 11/35] Update Ruby. --- .circleci/config.yml | 2 +- .ruby-version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3dbab311..ffe4239c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -66,7 +66,7 @@ commands: description: "Switch Ruby" steps: - macos/switch-ruby: - version: "3.0.6" + version: "3.1.4" # must match version in .ruby-version - run: bundle install lint-pod: diff --git a/.ruby-version b/.ruby-version index 818bd47a..0aec50e6 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.0.6 +3.1.4 From e0831a959da4523ef65eec9a580232e7b0ad2843 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 16:51:01 -0500 Subject: [PATCH 12/35] Update Bundler. --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index b858c4bd..19e7790e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -287,4 +287,4 @@ DEPENDENCIES xcpretty BUNDLED WITH - 2.1.4 + 2.5.3 From 47dc8a3b8bbc64193d5744e342009fdcfbf21aad Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 16:51:12 -0500 Subject: [PATCH 13/35] Update fastlane readme. --- fastlane/README.md | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/fastlane/README.md b/fastlane/README.md index d77f5f4e..4980f499 100644 --- a/fastlane/README.md +++ b/fastlane/README.md @@ -13,14 +13,6 @@ For _fastlane_ installation instructions, see [Installing _fastlane_](https://do # Available Actions -### coverage_all - -```sh -[bundle exec] fastlane coverage_all -``` - -Tests & Coverage: iOS, tvOS, macOS. Builds: watchOS. - ### test_all ```sh @@ -34,14 +26,6 @@ Tests: iOS, tvOS, macOS. Builds: watchOS. ## Mac -### mac coverage_macos - -```sh -[bundle exec] fastlane mac coverage_macos -``` - -Runs Tests & Generates Code Coverage Reports for macOS - ### mac test_macos ```sh @@ -55,14 +39,6 @@ Runs Tests for macOS ## iOS -### ios coverage_ios - -```sh -[bundle exec] fastlane ios coverage_ios -``` - -Runs Tests & Generates Code Coverage Reports for latest iOS - ### ios test_ios ```sh @@ -71,14 +47,6 @@ Runs Tests & Generates Code Coverage Reports for latest iOS Runs Tests for latest iOS -### ios coverage_tvos - -```sh -[bundle exec] fastlane ios coverage_tvos -``` - -Runs Tests & Generates Code Coverage Reports for tvOS - ### ios test_tvos ```sh From 0123bdcabf051fcbf1cd4af5e44cefa8d3f208fe Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 16:54:17 -0500 Subject: [PATCH 14/35] Update simulators to match ones installed on CircleCI by default. --- fastlane/Fastfile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 82062d8d..13d47560 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -85,11 +85,9 @@ def get_devices() # The full list of iOS simulators available on CircleCI # https://circleci.com/docs/2.0/testing-ios/#supported-xcode-versions devices = [] - devices.push("iPhone SE") - devices.push("iPhone X") - devices.push("iPhone 11 Pro Max") - devices.push("iPhone 8") - devices.push("iPhone 8 Plus") - devices.push("iPad Pro (10.5-inch)") + devices.push("iPhone SE (3rd generation)") + devices.push("iPhone 14") + devices.push("iPhone 14 Pro Max") + devices.push("iPad Pro (11-inch) (4th generation)") devices end From de3acfebadce590ae252640ab994307d1d8e4d46 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 16:56:24 -0500 Subject: [PATCH 15/35] Add nkf to Gemfile. --- Gemfile | 1 + Gemfile.lock | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Gemfile b/Gemfile index 3983193e..1b0cf454 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,7 @@ source 'https://rubygems.org' gem 'cocoapods' gem 'fastlane' +gem 'nkf' # added this because a warning told me to. It is a dependency of CFPropertyList which is a dependency of something else, maybe fastlane? gem 'xcpretty' plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') diff --git a/Gemfile.lock b/Gemfile.lock index 19e7790e..c3b805d4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -226,6 +226,7 @@ GEM nap (1.1.0) naturally (2.2.1) netrc (0.11.0) + nkf (0.1.3) optparse (0.1.1) os (1.1.4) plist (3.7.0) @@ -284,6 +285,7 @@ PLATFORMS DEPENDENCIES cocoapods fastlane + nkf xcpretty BUNDLED WITH From 4970a4dfb36e1de7ab4b4e0387faab8780f2ae84 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 16:57:21 -0500 Subject: [PATCH 16/35] Add abbrev to Gemfile. --- Gemfile | 1 + Gemfile.lock | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Gemfile b/Gemfile index 1b0cf454..43dea460 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,6 @@ source 'https://rubygems.org' +gem 'abbrev' # added this because a warning told me to. It is a dependency of highline which is a dependency of something else, maybe fastlane? gem 'cocoapods' gem 'fastlane' gem 'nkf' # added this because a warning told me to. It is a dependency of CFPropertyList which is a dependency of something else, maybe fastlane? diff --git a/Gemfile.lock b/Gemfile.lock index c3b805d4..8f5ab679 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,6 +3,7 @@ GEM specs: CFPropertyList (3.0.6) rexml + abbrev (0.1.2) activesupport (7.1.2) base64 bigdecimal @@ -283,6 +284,7 @@ PLATFORMS ruby DEPENDENCIES + abbrev cocoapods fastlane nkf From 0478b4df3d917231e8a017bdc4150c251c740832 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 17:12:00 -0500 Subject: [PATCH 17/35] Update destination devices. Stop generating asset catalog images. --- BonMot.xcodeproj/project.pbxproj | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/BonMot.xcodeproj/project.pbxproj b/BonMot.xcodeproj/project.pbxproj index cec10636..c65533f2 100644 --- a/BonMot.xcodeproj/project.pbxproj +++ b/BonMot.xcodeproj/project.pbxproj @@ -938,7 +938,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "xcodebuild build-for-testing test-without-building -project BonMot.xcodeproj -scheme \"BonMot-OSX\" -sdk \"macosx\" -destination \"arch=x86_64\" CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\n"; + shellScript = "xcodebuild build-for-testing test-without-building -project BonMot.xcodeproj -scheme \"BonMot-OSX\" -sdk \"macosx\" -destination \"arch=arm64\" CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\n"; }; CD15C4071DBE660700B6FF7A /* Build and test iOS */ = { isa = PBXShellScriptBuildPhase; @@ -952,7 +952,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "xcodebuild build-for-testing test-without-building -project BonMot.xcodeproj -scheme \"BonMot-iOS\" -sdk \"iphonesimulator\" -destination \"name=iPhone 6s\" CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\n"; + shellScript = "xcodebuild build-for-testing test-without-building -project BonMot.xcodeproj -scheme \"BonMot-iOS\" -sdk \"iphonesimulator\" -destination \"name=iPhone 14\" CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\n"; }; CD15C4081DBE660800B6FF7A /* Build and test tvOS */ = { isa = PBXShellScriptBuildPhase; @@ -994,7 +994,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ -d /opt/homebrew/bin ]; then\n export PATH=\"$PATH:/opt/homebrew/bin\"\nfi\n\nif [ \"${CARTHAGE}\" == \"YES\" ]; then\n echo \"warning: Detected Carthage. Will not run SwiftLint\"\nelif which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; CD4B2FCD1D9B0ADF007CF808 /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; @@ -1008,7 +1008,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ -d /opt/homebrew/bin ]; then\n export PATH=\"$PATH:/opt/homebrew/bin\"\nfi\n\nif [ \"${CARTHAGE}\" == \"YES\" ]; then\n echo \"warning: Detected Carthage. Will not run SwiftLint\"\nelif which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; CD4B2FCE1D9B0AF2007CF808 /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; @@ -1022,7 +1022,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ -d /opt/homebrew/bin ]; then\n export PATH=\"$PATH:/opt/homebrew/bin\"\nfi\n\nif [ \"${CARTHAGE}\" == \"YES\" ]; then\n echo \"warning: Detected Carthage. Will not run SwiftLint\"\nelif which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; CD4B2FCF1D9B0B12007CF808 /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; @@ -1036,7 +1036,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ -d /opt/homebrew/bin ]; then\n export PATH=\"$PATH:/opt/homebrew/bin\"\nfi\n\nif [ \"${CARTHAGE}\" == \"YES\" ]; then\n echo \"warning: Detected Carthage. Will not run SwiftLint\"\nelif which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; CD4B2FD01D9B0B1F007CF808 /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; @@ -1050,7 +1050,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ -d /opt/homebrew/bin ]; then\n export PATH=\"$PATH:/opt/homebrew/bin\"\nfi\n\nif [ \"${CARTHAGE}\" == \"YES\" ]; then\n echo \"warning: Detected Carthage. Will not run SwiftLint\"\nelif which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; CD4B2FD11D9B0B2E007CF808 /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; @@ -1064,7 +1064,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ -d /opt/homebrew/bin ]; then\n export PATH=\"$PATH:/opt/homebrew/bin\"\nfi\n\nif [ \"${CARTHAGE}\" == \"YES\" ]; then\n echo \"warning: Detected Carthage. Will not run SwiftLint\"\nelif which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; CD4B2FD21D9B0B3D007CF808 /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; @@ -1078,7 +1078,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ -d /opt/homebrew/bin ]; then\n export PATH=\"$PATH:/opt/homebrew/bin\"\nfi\n\nif [ \"${CARTHAGE}\" == \"YES\" ]; then\n echo \"warning: Detected Carthage. Will not run SwiftLint\"\nelif which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; CDC513361F36B1FA00EA1712 /* Build iOS example project */ = { isa = PBXShellScriptBuildPhase; @@ -1092,7 +1092,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "xcodebuild build -project BonMot.xcodeproj -scheme \"Example-iOS\" -sdk \"iphonesimulator\" -destination \"name=iPhone 6s\" CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\n"; + shellScript = "xcodebuild build -project BonMot.xcodeproj -scheme \"Example-iOS\" -sdk \"iphonesimulator\" -destination \"name=iPhone 14\" CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -1463,6 +1463,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_ASSET_SYMBOLS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -1527,6 +1528,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_ASSET_SYMBOLS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; From 31e75ee0e8e1a6ffaac7936fdaea395a3e3fcfa7 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 17:39:06 -0500 Subject: [PATCH 18/35] Update things. Bump versions. --- .swiftlint.yml | 2 - BonMot.podspec | 8 +-- BonMot.xcodeproj/project.pbxproj | 63 +++++++++++++------ .../xcschemes/AllTheThings.xcscheme | 2 +- .../xcschemes/BonMot-OSX.xcscheme | 2 +- .../xcschemes/BonMot-OSXTests.xcscheme | 2 +- .../xcschemes/BonMot-iOS.xcscheme | 2 +- .../xcschemes/BonMot-iOSTests.xcscheme | 2 +- .../xcschemes/BonMot-tvOS.xcscheme | 2 +- .../xcschemes/BonMot-tvOSTests.xcscheme | 2 +- .../xcschemes/BonMot-watchOS.xcscheme | 2 +- .../xcschemes/Example-iOS.xcscheme | 2 +- Package.swift | 8 +-- 13 files changed, 62 insertions(+), 37 deletions(-) diff --git a/.swiftlint.yml b/.swiftlint.yml index 38fc812d..e492845e 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -3,7 +3,6 @@ disabled_rules: # rule identifiers to exclude from running - file_length - function_body_length - identifier_name - - implicit_return # Re-enable when we drop support for Swift 4.2 - large_tuple - line_length - nesting @@ -13,7 +12,6 @@ statement_position: statement_mode: uncuddled_else opt_in_rules: - - anyobject_protocol - identical_operands - implicit_return - last_where diff --git a/BonMot.podspec b/BonMot.podspec index 8ef841d9..d325f1ee 100644 --- a/BonMot.podspec +++ b/BonMot.podspec @@ -14,16 +14,16 @@ Pod::Spec.new do |s| # s.social_media_url = 'https://twitter.com/ZevEisenberg' s.requires_arc = true - s.ios.deployment_target = '11.0' + s.ios.deployment_target = '12.0' s.ios.source_files = 'Sources/**/*.swift' - s.tvos.deployment_target = '11.0' + s.tvos.deployment_target = '12.0' s.tvos.source_files = 'Sources/**/*.swift' - s.osx.deployment_target = '10.11' + s.osx.deployment_target = '10.15' s.osx.source_files = 'Sources/*.swift' - s.watchos.deployment_target = '2.2' + s.watchos.deployment_target = '4.0' s.watchos.source_files = 'Sources/*.swift' end diff --git a/BonMot.xcodeproj/project.pbxproj b/BonMot.xcodeproj/project.pbxproj index c65533f2..a506688f 100644 --- a/BonMot.xcodeproj/project.pbxproj +++ b/BonMot.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXAggregateTarget section */ @@ -793,8 +793,9 @@ ABCBFD2F1D96E41D00FAD37A /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 1250; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = Rightpoint; TargetAttributes = { AB8497DA1DA45B9C00FE3414 = { @@ -1354,6 +1355,7 @@ AB8497DB1DA45B9C00FE3414 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + DEAD_CODE_STRIPPING = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -1361,6 +1363,7 @@ AB8497DC1DA45B9C00FE3414 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + DEAD_CODE_STRIPPING = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -1374,6 +1377,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; INFOPLIST_FILE = Sources/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( @@ -1381,11 +1385,12 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-watchOS"; PRODUCT_NAME = BonMot; SDKROOT = watchos; SKIP_INSTALL = YES; - WATCHOS_DEPLOYMENT_TARGET = 2.2; }; name = Debug; }; @@ -1398,6 +1403,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; INFOPLIST_FILE = Sources/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( @@ -1405,11 +1411,12 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-watchOS"; PRODUCT_NAME = BonMot; SDKROOT = watchos; SKIP_INSTALL = YES; - WATCHOS_DEPLOYMENT_TARGET = 2.2; }; name = Release; }; @@ -1423,7 +1430,6 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "Example-iOS/Resources/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1446,7 +1452,6 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "Example-iOS/Resources/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1495,9 +1500,11 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1513,14 +1520,18 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = 10.13; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_SWIFT3_OBJC_INFERENCE = Off; SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 12.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 4.0; }; name = Debug; }; @@ -1560,9 +1571,11 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1572,14 +1585,18 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = 10.13; MTL_ENABLE_DEBUG_INFO = NO; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_SWIFT3_OBJC_INFERENCE = Off; SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 12.0; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 4.0; }; name = Release; }; @@ -1594,14 +1611,16 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; INFOPLIST_FILE = Sources/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-iOS"; PRODUCT_NAME = BonMot; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1623,14 +1642,16 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; INFOPLIST_FILE = Sources/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-iOS"; PRODUCT_NAME = BonMot; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1646,7 +1667,6 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1663,7 +1683,6 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1684,6 +1703,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; INFOPLIST_FILE = Sources/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( @@ -1691,11 +1711,12 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-tvOS"; PRODUCT_NAME = BonMot; SDKROOT = appletvos; SKIP_INSTALL = YES; - TVOS_DEPLOYMENT_TARGET = 10.0; }; name = Debug; }; @@ -1708,6 +1729,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; INFOPLIST_FILE = Sources/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( @@ -1715,11 +1737,12 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-tvOS"; PRODUCT_NAME = BonMot; SDKROOT = appletvos; SKIP_INSTALL = YES; - TVOS_DEPLOYMENT_TARGET = 10.0; }; name = Release; }; @@ -1736,7 +1759,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 10.0; }; name = Debug; }; @@ -1753,7 +1775,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 10.0; }; name = Release; }; @@ -1762,10 +1783,12 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; INFOPLIST_FILE = Sources/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( @@ -1773,7 +1796,8 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.11; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-OSX"; PRODUCT_NAME = BonMot; SDKROOT = macosx; @@ -1786,10 +1810,12 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; INFOPLIST_FILE = Sources/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( @@ -1797,7 +1823,8 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.11; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-OSX"; PRODUCT_NAME = BonMot; SDKROOT = macosx; @@ -1809,13 +1836,13 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; INFOPLIST_FILE = Tests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", "@loader_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.11; PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-OSXTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; @@ -1826,13 +1853,13 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; INFOPLIST_FILE = Tests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", "@loader_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.11; PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-OSXTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; diff --git a/BonMot.xcodeproj/xcshareddata/xcschemes/AllTheThings.xcscheme b/BonMot.xcodeproj/xcshareddata/xcschemes/AllTheThings.xcscheme index 6b59f3c4..5c65d6bd 100644 --- a/BonMot.xcodeproj/xcshareddata/xcschemes/AllTheThings.xcscheme +++ b/BonMot.xcodeproj/xcshareddata/xcschemes/AllTheThings.xcscheme @@ -1,6 +1,6 @@ Date: Mon, 25 Dec 2023 22:39:05 -0500 Subject: [PATCH 19/35] Refine platform-specific stuff and enable testing on watchOS. --- .../xcshareddata/xcschemes/BonMot.xcscheme | 92 +++++++++++++++++++ BonMot.xcodeproj/project.pbxproj | 2 - Sources/Compatibility.swift | 7 +- Sources/Composable.swift | 10 +- Sources/ContextualAlternates.swift | 4 +- Sources/Emphasis.swift | 4 +- Sources/FontFeatures.swift | 6 +- Sources/FontInspector.swift | 3 +- Sources/Image+Tinting.swift | 11 ++- Sources/Ligatures.swift | 2 +- Sources/NSAttributedString+BonMot.swift | 4 +- Sources/Platform.swift | 4 +- Sources/StringStyle+Part.swift | 4 +- Sources/StringStyle.swift | 4 +- Sources/StylisticAlternates.swift | 4 +- Sources/Tab.swift | 4 +- Sources/Transform.swift | 4 +- Sources/UIKit/TextAlignmentConstraint.swift | 6 +- Sources/XMLBuilder.swift | 4 +- Tests/AssertHelpers.swift | 4 +- Tests/AttributedStringStyleTests.swift | 4 + Tests/BONFontBehaviorTests.swift | 6 +- Tests/Compatibility+Tests.swift | 9 +- Tests/ComposableTests.swift | 10 +- Tests/FontInspectorTests.swift | 2 + Tests/Helpers.swift | 28 +----- Tests/ImageTintingTests.swift | 30 +++--- Tests/NSAttributedStringDebugTests.swift | 6 +- Tests/TextAlignmentConstraintTests.swift | 10 +- Tests/UIKitBehaviorTests.swift | 2 +- Tests/UIKitBonMotTests.swift | 2 +- 31 files changed, 194 insertions(+), 98 deletions(-) create mode 100644 .swiftpm/xcode/xcshareddata/xcschemes/BonMot.xcscheme diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/BonMot.xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/BonMot.xcscheme new file mode 100644 index 00000000..c344e125 --- /dev/null +++ b/.swiftpm/xcode/xcshareddata/xcschemes/BonMot.xcscheme @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BonMot.xcodeproj/project.pbxproj b/BonMot.xcodeproj/project.pbxproj index a506688f..0dd74f93 100644 --- a/BonMot.xcodeproj/project.pbxproj +++ b/BonMot.xcodeproj/project.pbxproj @@ -1504,7 +1504,6 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1575,7 +1574,6 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; diff --git a/Sources/Compatibility.swift b/Sources/Compatibility.swift index d13e580f..7410df53 100644 --- a/Sources/Compatibility.swift +++ b/Sources/Compatibility.swift @@ -6,17 +6,16 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif // This file declares extensions to system types to provide a compatible API // between Swift iOS, macOS, watchOS, and tvOS. -#if os(OSX) -#else +#if !canImport(AppKit) public extension NSParagraphStyle { typealias LineBreakMode = NSLineBreakMode diff --git a/Sources/Composable.swift b/Sources/Composable.swift index a8019366..31f2e8e6 100644 --- a/Sources/Composable.swift +++ b/Sources/Composable.swift @@ -6,14 +6,14 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif /// Describes types which know how to append themselves to an attributed string. -/// Used to provide a flexible, extensible chaning API for BonMot. +/// Used to provide a flexible, extensible chaining API for BonMot. public protocol Composable { /// Append the receiver to a given attributed string. It is up to the @@ -210,7 +210,7 @@ extension String: Composable { } -#if os(iOS) || os(tvOS) || os(OSX) +#if !os(watchOS) extension BONImage: Composable { /// Append the receiver to `attributedString`, with `baseStyle` applied as @@ -231,7 +231,7 @@ extension BONImage: Composable { let baselinesOffsetForAttachment = baseStyle.baselineOffset ?? 0 let attachment = NSTextAttachment() - #if os(OSX) + #if canImport(AppKit) let imageIsTemplate = isTemplate #else let imageIsTemplate = (renderingMode != .alwaysOriginal) diff --git a/Sources/ContextualAlternates.swift b/Sources/ContextualAlternates.swift index 823a69d8..7ec717cd 100644 --- a/Sources/ContextualAlternates.swift +++ b/Sources/ContextualAlternates.swift @@ -6,9 +6,9 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif diff --git a/Sources/Emphasis.swift b/Sources/Emphasis.swift index 9e66a464..9fe91d92 100644 --- a/Sources/Emphasis.swift +++ b/Sources/Emphasis.swift @@ -6,9 +6,9 @@ // Copyright © 2018 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif diff --git a/Sources/FontFeatures.swift b/Sources/FontFeatures.swift index 458e877e..caef9b19 100644 --- a/Sources/FontFeatures.swift +++ b/Sources/FontFeatures.swift @@ -6,9 +6,9 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif @@ -48,7 +48,7 @@ fontAttributes[BONFontDescriptorFeatureSettingsAttribute] = features let descriptor = BONFontDescriptor(fontAttributes: fontAttributes) - #if os(OSX) + #if canImport(AppKit) return BONFont(descriptor: descriptor, size: pointSize)! #else return BONFont(descriptor: descriptor, size: pointSize) diff --git a/Sources/FontInspector.swift b/Sources/FontInspector.swift index 6d968241..145bf26f 100644 --- a/Sources/FontInspector.swift +++ b/Sources/FontInspector.swift @@ -6,8 +6,7 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -// This is not supported on watchOS -#if os(iOS) || os(tvOS) || os(OSX) +#if !os(watchOS) import CoreText import Foundation diff --git a/Sources/Image+Tinting.swift b/Sources/Image+Tinting.swift index 7882fe3d..98b4fd0e 100644 --- a/Sources/Image+Tinting.swift +++ b/Sources/Image+Tinting.swift @@ -6,17 +6,19 @@ // Copyright © 2016 Rightpoint. All rights reserved. // +#if !os(watchOS) + import Foundation -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif public extension BONImage { - #if os(OSX) + #if canImport(AppKit) /// Returns a copy of the receiver where the alpha channel is maintained, /// but every pixel's color is replaced with `color`. /// @@ -69,7 +71,7 @@ public extension BONImage { return image } - #else + #elseif canImport(UIKit) /// Returns a copy of the receiver where the alpha channel is maintained, /// but every pixel's color is replaced with `color`. /// @@ -126,3 +128,4 @@ public extension BONImage { #endif } +#endif diff --git a/Sources/Ligatures.swift b/Sources/Ligatures.swift index f4b54b15..7cbb5f8f 100644 --- a/Sources/Ligatures.swift +++ b/Sources/Ligatures.swift @@ -15,7 +15,7 @@ public enum Ligatures: Int { /// Default ligatures. case defaults = 1 - #if os(OSX) + #if canImport(AppKit) /// All ligatures. case all = 2 #endif diff --git a/Sources/NSAttributedString+BonMot.swift b/Sources/NSAttributedString+BonMot.swift index 225e8e03..103e842b 100644 --- a/Sources/NSAttributedString+BonMot.swift +++ b/Sources/NSAttributedString+BonMot.swift @@ -6,9 +6,9 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif diff --git a/Sources/Platform.swift b/Sources/Platform.swift index 129fa73b..c5a5b49b 100644 --- a/Sources/Platform.swift +++ b/Sources/Platform.swift @@ -6,7 +6,7 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit public typealias BONColor = NSColor public typealias BONImage = NSImage @@ -18,7 +18,7 @@ let BONFontDescriptorFeatureSettingsAttribute = NSFontDescriptor.AttributeName.featureSettings let BONFontFeatureTypeIdentifierKey = NSFontDescriptor.FeatureKey.typeIdentifier let BONFontFeatureSelectorIdentifierKey = NSFontDescriptor.FeatureKey.selectorIdentifier -#else +#elseif canImport(UIKit) import UIKit public typealias BONColor = UIColor public typealias BONImage = UIImage diff --git a/Sources/StringStyle+Part.swift b/Sources/StringStyle+Part.swift index 18189391..69867bf6 100644 --- a/Sources/StringStyle+Part.swift +++ b/Sources/StringStyle+Part.swift @@ -6,9 +6,9 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif diff --git a/Sources/StringStyle.swift b/Sources/StringStyle.swift index c52828bf..d07a2cc8 100644 --- a/Sources/StringStyle.swift +++ b/Sources/StringStyle.swift @@ -7,9 +7,9 @@ // // NOTE: Keep attributes in order to help reviewability. -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif diff --git a/Sources/StylisticAlternates.swift b/Sources/StylisticAlternates.swift index fe642d97..f3b7c727 100644 --- a/Sources/StylisticAlternates.swift +++ b/Sources/StylisticAlternates.swift @@ -6,9 +6,9 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif diff --git a/Sources/Tab.swift b/Sources/Tab.swift index 6f419621..eaa182ae 100644 --- a/Sources/Tab.swift +++ b/Sources/Tab.swift @@ -6,9 +6,9 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif diff --git a/Sources/Transform.swift b/Sources/Transform.swift index 914f9bc0..4500bb0c 100644 --- a/Sources/Transform.swift +++ b/Sources/Transform.swift @@ -6,9 +6,9 @@ // Copyright © 2017 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif diff --git a/Sources/UIKit/TextAlignmentConstraint.swift b/Sources/UIKit/TextAlignmentConstraint.swift index adc383d8..68234bee 100644 --- a/Sources/UIKit/TextAlignmentConstraint.swift +++ b/Sources/UIKit/TextAlignmentConstraint.swift @@ -8,9 +8,9 @@ #if !os(watchOS) -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif @@ -100,7 +100,7 @@ public class TextAlignmentConstraint: NSLayoutConstraint { // The class part of these selectors are ignored; it is there simply to satisfy Xcode's selector syntax. private static let fontSelector = #selector(getter: BONTextField.font) - #if os(OSX) + #if canImport(AppKit) private static let attributedTextSelector = #selector(getter: NSTextField.attributedStringValue) #else private static let attributedTextSelector = #selector(getter: UITextField.attributedText) diff --git a/Sources/XMLBuilder.swift b/Sources/XMLBuilder.swift index 5d33de46..df7602e5 100644 --- a/Sources/XMLBuilder.swift +++ b/Sources/XMLBuilder.swift @@ -6,9 +6,9 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif diff --git a/Tests/AssertHelpers.swift b/Tests/AssertHelpers.swift index 38741b8c..4c941ef2 100644 --- a/Tests/AssertHelpers.swift +++ b/Tests/AssertHelpers.swift @@ -11,12 +11,12 @@ import XCTest func dataFromImage(image theImage: BONImage) -> Data { assert(theImage.size != .zero) - #if os(OSX) + #if canImport(AppKit) let cgImageRef = theImage.cgImage(forProposedRect: nil, context: nil, hints: nil) let bitmapImageRep = NSBitmapImageRep(cgImage: cgImageRef!) let pngData = bitmapImageRep.representation(using: .png, properties: [:])! return pngData - #else + #elseif canImport(UIKit) return theImage.pngData()! #endif } diff --git a/Tests/AttributedStringStyleTests.swift b/Tests/AttributedStringStyleTests.swift index fbe5dbc4..6544662d 100644 --- a/Tests/AttributedStringStyleTests.swift +++ b/Tests/AttributedStringStyleTests.swift @@ -217,6 +217,8 @@ class StringStyleTests: XCTestCase { checkKerningValues(customRangesToValues, startingOnLine: customRangesToValuesLine, in: customStyled) } + #if !os(watchOS) + func testNumberSpacingStyle() { let style = StringStyle(.font(BONFont(name: "EBGaramond12-Regular", size: 24)!), .numberSpacing(.monospaced)) for (style, fullStyle) in additivePermutations(for: style) { @@ -553,6 +555,8 @@ class StringStyleTests: XCTestCase { XCTAssertFalse(stillHasAltSixDict) } + #endif + func testStyleBlockRules() throws { let string = #"012"# diff --git a/Tests/BONFontBehaviorTests.swift b/Tests/BONFontBehaviorTests.swift index e1cd25d8..1789858c 100644 --- a/Tests/BONFontBehaviorTests.swift +++ b/Tests/BONFontBehaviorTests.swift @@ -31,9 +31,9 @@ class BONFontBehaviorTests: XCTestCase { BONFontFeatureSelectorIdentifierKey: 1, ], ] - #if os(OSX) + #if canImport(AppKit) let newAttributes = BONFont(descriptor: BONFontDescriptor(fontAttributes: attributes), size: 0)?.fontDescriptor.fontAttributes ?? [:] - #else + #elseif canImport(UIKit) let newAttributes = BONFont(descriptor: BONFontDescriptor(fontAttributes: attributes), size: 0).fontDescriptor.fontAttributes #endif XCTAssertEqual(newAttributes.count, 2) @@ -70,7 +70,9 @@ class BONFontBehaviorTests: XCTestCase { else { XCTAssertEqual(newAttributes.count, 2) } + #if !os(watchOS) XCTAssertEqual(newAttributes["NSCTFontUIUsageAttribute"] as? BonMotTextStyle, testTextStyle) + #endif XCTAssertEqual(newAttributes["NSFontSizeAttribute"] as? Int, 10) } #endif diff --git a/Tests/Compatibility+Tests.swift b/Tests/Compatibility+Tests.swift index 5e39d65d..7eec4d61 100644 --- a/Tests/Compatibility+Tests.swift +++ b/Tests/Compatibility+Tests.swift @@ -8,18 +8,21 @@ import BonMot -#if os(OSX) +#if canImport(AppKit) import AppKit let BONFontDescriptorFeatureSettingsAttribute = NSFontDescriptor.AttributeName.featureSettings let BONFontFeatureTypeIdentifierKey = NSFontDescriptor.FeatureKey.typeIdentifier let BONFontFeatureSelectorIdentifierKey = NSFontDescriptor.FeatureKey.selectorIdentifier typealias BONView = NSView -#else +#elseif canImport(UIKit) import UIKit let BONFontDescriptorFeatureSettingsAttribute = UIFontDescriptor.AttributeName.featureSettings let BONFontFeatureTypeIdentifierKey = UIFontDescriptor.FeatureKey.featureIdentifier let BONFontFeatureSelectorIdentifierKey = UIFontDescriptor.FeatureKey.typeIdentifier - typealias BONView = UIView +#endif + +#if os(iOS) +typealias BONView = UIView #endif extension NSAttributedString.Key: ExpressibleByStringLiteral { diff --git a/Tests/ComposableTests.swift b/Tests/ComposableTests.swift index 81cfb5e2..2b029b1c 100644 --- a/Tests/ComposableTests.swift +++ b/Tests/ComposableTests.swift @@ -18,21 +18,25 @@ import AppKit #if canImport(UIKit) || canImport(AppKit) class ComposableTests: XCTestCase { + #if !os(watchOS) func robotImage() throws -> BONImage { - #if os(OSX) + #if canImport(AppKit) let imageForTest = testBundle.image(forResource: "robot") - #else + #elseif canImport(UIKit) let imageForTest = UIImage(named: "robot", in: testBundle, compatibleWith: nil) #endif return try XCTUnwrap(imageForTest) } + #endif + #if !os(watchOS) func testImageConstructor() throws { let imageForTest = try robotImage() let imageString = imageForTest.attributedString() let string = "\(Special.objectReplacementCharacter)" XCTAssertEqual(imageString.string, string) } + #endif func testBasicJoin() { let string = NSAttributedString.composed(of: ["A", "B", "C"], separator: NSAttributedString(string: "-")) @@ -44,6 +48,7 @@ class ComposableTests: XCTestCase { XCTAssertEqual("A-B-C", string.string) } + #if !os(watchOS) func testAttributesArePassedAlongExtend() throws { let imageForTest = try robotImage() @@ -105,6 +110,7 @@ class ComposableTests: XCTestCase { XCTAssertEqual(expectedWidth, width, accuracy: 1.0, line: line) } } + #endif func testBaseStyleIsOverridden() { func check(forPart thePart: StringStyle.Part, _ attribute: NSAttributedString.Key, _ expected: T, line: UInt = #line) { diff --git a/Tests/FontInspectorTests.swift b/Tests/FontInspectorTests.swift index 2574477f..1b9054f3 100644 --- a/Tests/FontInspectorTests.swift +++ b/Tests/FontInspectorTests.swift @@ -9,6 +9,7 @@ @testable import BonMot import XCTest +#if !os(watchOS) class FontInspectorTests: XCTestCase { let systemFont = BONFont.systemFont(ofSize: 24) @@ -123,3 +124,4 @@ class FontInspectorTests: XCTestCase { XCTAssertEqual(garamond.availableFontFeatures(includeIdentifiers: false), garamondControlString) } } +#endif diff --git a/Tests/Helpers.swift b/Tests/Helpers.swift index 028bc92a..5e849b6a 100644 --- a/Tests/Helpers.swift +++ b/Tests/Helpers.swift @@ -13,8 +13,7 @@ import XCTest // Override Foundation's StringStyle from iOS 15+, macOS 12+, tvOS 15+, watchOS 8+. typealias StringStyle = BonMot.StringStyle -#if os(OSX) -#else +#if os(iOS) || os(tvOS) import UIKit let titleTextStyle = UIFont.TextStyle.title1 let differentTextStyle = UIFont.TextStyle.title2 @@ -81,8 +80,7 @@ let styleB = StringStyle( .tailIndent(10) ) -#if os(OSX) -#else +#if os(iOS) || os(tvOS) let adaptiveStyle = StringStyle( .font(.fontA), .color(.colorA), @@ -215,7 +213,7 @@ extension NSAttributedString { return nil } - #if os(OSX) + #if canImport(AppKit) let image = NSImage(size: rect.size) let rep = NSBitmapImageRep( @@ -239,7 +237,7 @@ extension NSAttributedString { image.unlockFocus() return image - #else + #elseif canImport(UIKit) UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) draw(with: rect, options: .usesLineFragmentOrigin, context: nil) let image = UIGraphicsGetImageFromCurrentImageContext()! @@ -249,21 +247,3 @@ extension NSAttributedString { } } - -extension BONView { - - func testingSnapshot() -> BONImage { - #if os(OSX) - let dataOfView = dataWithPDF(inside: bounds) - let image = NSImage(data: dataOfView)! - return image - #else - UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0.0) - layer.render(in: UIGraphicsGetCurrentContext()!) - let image = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - return image - #endif - } - -} diff --git a/Tests/ImageTintingTests.swift b/Tests/ImageTintingTests.swift index 36afce72..1c6fd024 100644 --- a/Tests/ImageTintingTests.swift +++ b/Tests/ImageTintingTests.swift @@ -6,30 +6,31 @@ // Copyright © 2016 Rightpoint. All rights reserved. // -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif @testable import BonMot import XCTest +#if !os(watchOS) class ImageTintingTests: XCTestCase { func logoImage() throws -> BONImage { - #if os(OSX) + #if canImport(AppKit) let imageForTest = testBundle.image(forResource: "rz-logo-black") - #else + #elseif canImport(UIKit) let imageForTest = UIImage(named: "rz-logo-black", in: testBundle, compatibleWith: nil) #endif return try XCTUnwrap(imageForTest) } var raizlabsRed: BONColor { - #if os(OSX) + #if canImport(AppKit) NSColor(deviceRed: 0.92549, green: 0.352941, blue: 0.301961, alpha: 1.0) - #else + #elseif canImport(UIKit) UIColor(red: 0.92549, green: 0.352941, blue: 0.301961, alpha: 1.0) #endif } @@ -37,18 +38,18 @@ class ImageTintingTests: XCTestCase { let accessibilityDescription = "I’m the very model of a modern accessible image." func testImageTinting() throws { - #if SWIFT_PACKAGE && os(OSX) + #if SWIFT_PACKAGE && canImport(AppKit) try XCTSkipIf(true, "Doesn't work on macOS SPM targets") #endif let blackImageName = "rz-logo-black" let redImageName = "rz-logo-red" - #if os(OSX) + #if canImport(AppKit) let sourceImage = try XCTUnwrap(testBundle.image(forResource: blackImageName)) let controlTintedImage = try XCTUnwrap(testBundle.image(forResource: redImageName)) let testTintedImage = sourceImage.tintedImage(color: raizlabsRed) - #else + #elseif canImport(UIKit) let sourceImage = try XCTUnwrap(UIImage(named: blackImageName, in: testBundle, compatibleWith: nil)) let controlTintedImage = try XCTUnwrap(UIImage(named: redImageName, in: testBundle, compatibleWith: nil)) let testTintedImage = sourceImage.tintedImage(color: raizlabsRed) @@ -68,10 +69,10 @@ class ImageTintingTests: XCTestCase { imageForTest.styled(with: .color(raizlabsRed)), ]) - #if os(OSX) + #if canImport(AppKit) let tintableImage = imageForTest tintableImage.isTemplate = true - #else + #elseif canImport(UIKit) let tintableImage = imageForTest.withRenderingMode(.alwaysTemplate) #endif @@ -123,14 +124,15 @@ class ImageTintingTests: XCTestCase { #endif } - func testAccessibilityOSX() throws { + #if canImport(AppKit) + func testAccessibilityMacOS() throws { let imageForTest = try logoImage() - #if os(OSX) imageForTest.accessibilityDescription = accessibilityDescription let tintedImage = imageForTest.tintedImage(color: raizlabsRed) XCTAssertEqual(tintedImage.accessibilityDescription, accessibilityDescription) XCTAssertEqual(tintedImage.accessibilityDescription, tintedImage.accessibilityDescription) - #endif } + #endif } +#endif diff --git a/Tests/NSAttributedStringDebugTests.swift b/Tests/NSAttributedStringDebugTests.swift index cce44ba9..db4fe7a9 100644 --- a/Tests/NSAttributedStringDebugTests.swift +++ b/Tests/NSAttributedStringDebugTests.swift @@ -14,8 +14,10 @@ class NSAttributedStringDebugTests: XCTestCase { func robotImage() throws -> BONImage { #if os(OSX) let imageForTest = testBundle.image(forResource: "robot") - #else + #elseif os(iOS) || os(tvOS) let imageForTest = UIImage(named: "robot", in: testBundle, compatibleWith: nil) + #else + let imageForTest = UIImage(named: "robot", in: testBundle, with: nil) #endif return try XCTUnwrap(imageForTest) } @@ -50,6 +52,7 @@ class NSAttributedStringDebugTests: XCTestCase { } } + #if !os(watchOS) func testComposedDebugRepresentation() throws { let imageForTest = try robotImage() @@ -67,6 +70,7 @@ class NSAttributedStringDebugTests: XCTestCase { XCTAssertEqual(testCase.1, debugString, line: testCase.2) } } + #endif func testThatNSAttributedStringSpeaksUTF16() { // We don't actually need to test this - just demonstrating how it works diff --git a/Tests/TextAlignmentConstraintTests.swift b/Tests/TextAlignmentConstraintTests.swift index 10bbefba..cb21dadc 100644 --- a/Tests/TextAlignmentConstraintTests.swift +++ b/Tests/TextAlignmentConstraintTests.swift @@ -8,15 +8,16 @@ import Foundation -#if os(OSX) +#if canImport(AppKit) import AppKit -#else +#elseif canImport(UIKit) import UIKit #endif @testable import BonMot import XCTest +#if !os(watchOS) class TextAlignmentConstraintTests: XCTestCase { private func field(withText text: String, fontSize: CGFloat) -> BONTextField { @@ -25,9 +26,9 @@ class TextAlignmentConstraintTests: XCTestCase { field.font = BONFont(name: "Avenir-Roman", size: fontSize) - #if os(OSX) + #if canImport(AppKit) field.stringValue = text - #else + #elseif canImport(UIKit) field.text = text #endif @@ -186,3 +187,4 @@ class TextAlignmentConstraintTests: XCTestCase { } } +#endif diff --git a/Tests/UIKitBehaviorTests.swift b/Tests/UIKitBehaviorTests.swift index 9d50c880..3e371455 100644 --- a/Tests/UIKitBehaviorTests.swift +++ b/Tests/UIKitBehaviorTests.swift @@ -16,7 +16,7 @@ let defaultTextFieldFontSize: CGFloat = 38 let defaultTextViewFontSize: CGFloat = 38 #endif -#if canImport(UIKit) +#if canImport(UIKit) && !os(watchOS) import UIKit class UIKitBehaviorTests: XCTestCase { diff --git a/Tests/UIKitBonMotTests.swift b/Tests/UIKitBonMotTests.swift index d8ca6db8..048349db 100644 --- a/Tests/UIKitBonMotTests.swift +++ b/Tests/UIKitBonMotTests.swift @@ -9,7 +9,7 @@ import BonMot import XCTest -#if canImport(UIKit) +#if canImport(UIKit) && !os(watchOS) import UIKit class UIKitBonMotTests: XCTestCase { From 19ee372afbcf422f2734710fe67c18fec90b2a8c Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 23:44:16 -0500 Subject: [PATCH 20/35] Eschew fastlane in favor of a Makefile. Restructure project to emphasize package while keeping example project usable. --- .circleci/config.yml | 16 +- BonMot.xcodeproj/project.pbxproj | 1963 ----------------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../xcschemes/AllTheThings.xcscheme | 77 - .../xcschemes/BonMot-OSX.xcscheme | 147 -- .../xcschemes/BonMot-OSXTests.xcscheme | 66 - .../xcschemes/BonMot-iOS.xcscheme | 104 - .../xcschemes/BonMot-iOSTests.xcscheme | 66 - .../xcschemes/BonMot-tvOS.xcscheme | 118 - .../xcschemes/BonMot-tvOSTests.xcscheme | 66 - .../xcschemes/BonMot-watchOS.xcscheme | 98 - .../xcschemes/Example-iOS.xcscheme | 88 - {Example-iOS => Example}/AppDelegate.swift | 0 .../CatalogViewController.swift | 0 {Example-iOS => Example}/DemoStrings.swift | 2 +- .../Example-iOS.entitlements | 0 .../AppIcon.appiconset/Contents.json | 0 .../BonMot-logo.imageset/BonMot-logo.pdf | Bin .../BonMot-logo.imageset/Contents.json | 0 .../Resources/Images.xcassets/Contents.json | 0 .../LaunchImage.launchimage/Contents.json | 0 .../Tennis Racket.imageset/Contents.json | 0 .../Tennis Racket.imageset/Tennis Racket.pdf | Bin .../barn.imageset/Contents.json | 0 .../Images.xcassets/barn.imageset/barn.pdf | Bin .../bee.imageset/Contents.json | 0 .../Images.xcassets/bee.imageset/bee.pdf | Bin .../boat.imageset/Contents.json | 0 .../Images.xcassets/boat.imageset/boat.pdf | Bin .../bug.imageset/Contents.json | 0 .../Images.xcassets/bug.imageset/bug.pdf | Bin .../circuit.imageset/Contents.json | 0 .../circuit.imageset/circuit.pdf | Bin .../cut.imageset/Contents.json | 0 .../Images.xcassets/cut.imageset/cut.pdf | Bin .../discount.imageset/Contents.json | 0 .../discount.imageset/discount.pdf | Bin .../gift.imageset/Contents.json | 0 .../Images.xcassets/gift.imageset/gift.pdf | Bin .../knot.imageset/Contents.json | 0 .../Images.xcassets/knot.imageset/knot.pdf | Bin .../oar.imageset/Contents.json | 0 .../Images.xcassets/oar.imageset/oar.pdf | Bin .../pin.imageset/Contents.json | 0 .../Images.xcassets/pin.imageset/pin.pdf | Bin .../robot.imageset/Contents.json | 0 .../Images.xcassets/robot.imageset/robot.pdf | Bin {Example-iOS => Example}/Resources/Info.plist | 0 .../Resources/Launch Screen.xib | 0 .../Resources/Main.storyboard | 0 .../Resources/en.lproj/InfoPlist.strings | 0 .../StyleViewController.swift | 6 +- Gemfile | 4 - Gemfile.lock | 187 -- Makefile | 18 + Package.swift | 9 +- README.md | 2 +- Sources/BonMot.h | 19 - Sources/Info.plist | 26 - Tests/AdaptiveStyleTests.swift | 5 +- Tests/BonMot-OSXTests.xctestplan | 28 - Tests/BonMot-iOSTests.xctestplan | 28 - Tests/BonMot-tvOSTests.xctestplan | 28 - Tests/Info.plist | 22 - fastlane/Fastfile | 93 - fastlane/Pluginfile | 4 - fastlane/README.md | 72 - fastlane/actions/xchtmlreport.rb | 118 - 70 files changed, 34 insertions(+), 3469 deletions(-) delete mode 100644 BonMot.xcodeproj/project.pbxproj delete mode 100644 BonMot.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 BonMot.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 BonMot.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 BonMot.xcodeproj/xcshareddata/xcschemes/AllTheThings.xcscheme delete mode 100644 BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-OSX.xcscheme delete mode 100644 BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-OSXTests.xcscheme delete mode 100644 BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-iOS.xcscheme delete mode 100644 BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-iOSTests.xcscheme delete mode 100644 BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-tvOS.xcscheme delete mode 100644 BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-tvOSTests.xcscheme delete mode 100644 BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-watchOS.xcscheme delete mode 100644 BonMot.xcodeproj/xcshareddata/xcschemes/Example-iOS.xcscheme rename {Example-iOS => Example}/AppDelegate.swift (100%) rename {Example-iOS => Example}/CatalogViewController.swift (100%) rename {Example-iOS => Example}/DemoStrings.swift (99%) rename {Example-iOS => Example}/Example-iOS.entitlements (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/AppIcon.appiconset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/BonMot-logo.imageset/BonMot-logo.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/BonMot-logo.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/Tennis Racket.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/Tennis Racket.imageset/Tennis Racket.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/barn.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/barn.imageset/barn.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/bee.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/bee.imageset/bee.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/boat.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/boat.imageset/boat.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/bug.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/bug.imageset/bug.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/circuit.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/circuit.imageset/circuit.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/cut.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/cut.imageset/cut.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/discount.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/discount.imageset/discount.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/gift.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/gift.imageset/gift.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/knot.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/knot.imageset/knot.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/oar.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/oar.imageset/oar.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/pin.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/pin.imageset/pin.pdf (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/robot.imageset/Contents.json (100%) rename {Example-iOS => Example}/Resources/Images.xcassets/robot.imageset/robot.pdf (100%) rename {Example-iOS => Example}/Resources/Info.plist (100%) rename {Example-iOS => Example}/Resources/Launch Screen.xib (100%) rename {Example-iOS => Example}/Resources/Main.storyboard (100%) rename {Example-iOS => Example}/Resources/en.lproj/InfoPlist.strings (100%) rename {Example-iOS => Example}/StyleViewController.swift (89%) create mode 100644 Makefile delete mode 100644 Sources/BonMot.h delete mode 100644 Sources/Info.plist delete mode 100644 Tests/BonMot-OSXTests.xctestplan delete mode 100644 Tests/BonMot-iOSTests.xctestplan delete mode 100644 Tests/BonMot-tvOSTests.xctestplan delete mode 100644 Tests/Info.plist delete mode 100644 fastlane/Fastfile delete mode 100644 fastlane/Pluginfile delete mode 100644 fastlane/README.md delete mode 100644 fastlane/actions/xchtmlreport.rb diff --git a/.circleci/config.yml b/.circleci/config.yml index ffe4239c..8c6258f5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -17,17 +17,17 @@ jobs: - setup - lint-pod - fastlane-tests: + tests: executor: xcode-14 steps: - setup - - run: bundle exec fastlane test_all + - run: make test_all - fastlane-tests-xcode-15: + tests-xcode-15: executor: xcode-15 steps: - setup - - run: bundle exec fastlane test_all + - run: make test_all deploy-to-cocoapods: executor: xcode-14 @@ -86,11 +86,11 @@ workflows: filters: tags: only: /.*/ - - fastlane-tests: + - tests: filters: tags: only: /.*/ - - fastlane-tests-xcode-15: + - tests-xcode-15: filters: tags: only: /.*/ @@ -102,8 +102,8 @@ workflows: context: CocoaPods requires: - swift-package - - fastlane-tests - - fastlane-tests-xcode-15 + - tests + - tests-xcode-15 - lint-pod filters: tags: diff --git a/BonMot.xcodeproj/project.pbxproj b/BonMot.xcodeproj/project.pbxproj deleted file mode 100644 index 0dd74f93..00000000 --- a/BonMot.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1963 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXAggregateTarget section */ - AB8497DA1DA45B9C00FE3414 /* AllTheThings */ = { - isa = PBXAggregateTarget; - buildConfigurationList = AB8497DD1DA45B9C00FE3414 /* Build configuration list for PBXAggregateTarget "AllTheThings" */; - buildPhases = ( - ABBD124E1DA469BB0084FBCC /* Build and test macOS */, - CD15C4071DBE660700B6FF7A /* Build and test iOS */, - CDC513361F36B1FA00EA1712 /* Build iOS example project */, - CD15C4081DBE660800B6FF7A /* Build and test tvOS */, - CD15C4091DBE660A00B6FF7A /* Build watchOS */, - ); - dependencies = ( - ); - name = AllTheThings; - productName = AllTheThings; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 1E7B10EC1DA41F9300C668A4 /* TextAlignmentConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E7B10EB1DA41F9300C668A4 /* TextAlignmentConstraint.swift */; }; - 1E7B10ED1DA41F9300C668A4 /* TextAlignmentConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E7B10EB1DA41F9300C668A4 /* TextAlignmentConstraint.swift */; }; - 1E7B10EE1DA41F9300C668A4 /* TextAlignmentConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E7B10EB1DA41F9300C668A4 /* TextAlignmentConstraint.swift */; }; - 1E902AB41DA6915F00BD154D /* TextAlignmentConstraintTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E902AB31DA6915F00BD154D /* TextAlignmentConstraintTests.swift */; }; - 1E902AB51DA6915F00BD154D /* TextAlignmentConstraintTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E902AB31DA6915F00BD154D /* TextAlignmentConstraintTests.swift */; }; - 1E902AB61DA6915F00BD154D /* TextAlignmentConstraintTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E902AB31DA6915F00BD154D /* TextAlignmentConstraintTests.swift */; }; - 526C7050268BCC61002C0C71 /* EBGaramond12-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 526C704D268BCC61002C0C71 /* EBGaramond12-Regular.otf */; }; - 526C7051268BCC61002C0C71 /* EBGaramond12-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 526C704D268BCC61002C0C71 /* EBGaramond12-Regular.otf */; }; - 526C7052268BCC61002C0C71 /* EBGaramond12-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 526C704D268BCC61002C0C71 /* EBGaramond12-Regular.otf */; }; - 526C7053268BCC61002C0C71 /* rz-logo-black.png in Resources */ = {isa = PBXBuildFile; fileRef = 526C704E268BCC61002C0C71 /* rz-logo-black.png */; }; - 526C7054268BCC61002C0C71 /* rz-logo-black.png in Resources */ = {isa = PBXBuildFile; fileRef = 526C704E268BCC61002C0C71 /* rz-logo-black.png */; }; - 526C7055268BCC61002C0C71 /* rz-logo-black.png in Resources */ = {isa = PBXBuildFile; fileRef = 526C704E268BCC61002C0C71 /* rz-logo-black.png */; }; - 526C7056268BCC61002C0C71 /* rz-logo-red.png in Resources */ = {isa = PBXBuildFile; fileRef = 526C704F268BCC61002C0C71 /* rz-logo-red.png */; }; - 526C7057268BCC61002C0C71 /* rz-logo-red.png in Resources */ = {isa = PBXBuildFile; fileRef = 526C704F268BCC61002C0C71 /* rz-logo-red.png */; }; - 526C7058268BCC61002C0C71 /* rz-logo-red.png in Resources */ = {isa = PBXBuildFile; fileRef = 526C704F268BCC61002C0C71 /* rz-logo-red.png */; }; - 526C7059268BCC86002C0C71 /* EBGaramond12-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 526C704D268BCC61002C0C71 /* EBGaramond12-Regular.otf */; }; - AB30D4FF1D9C1EEC006ADC9D /* Composable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB30D4FE1D9C1EEC006ADC9D /* Composable.swift */; }; - AB30D50C1D9CB4FE006ADC9D /* Tab.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB30D50B1D9CB4FE006ADC9D /* Tab.swift */; }; - AB30D50D1D9CB4FE006ADC9D /* Tab.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB30D50B1D9CB4FE006ADC9D /* Tab.swift */; }; - AB30D50E1D9CB4FE006ADC9D /* Tab.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB30D50B1D9CB4FE006ADC9D /* Tab.swift */; }; - AB30D50F1D9CB4FE006ADC9D /* Tab.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB30D50B1D9CB4FE006ADC9D /* Tab.swift */; }; - AB30D5101D9D9438006ADC9D /* Composable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB30D4FE1D9C1EEC006ADC9D /* Composable.swift */; }; - AB30D5111D9D9438006ADC9D /* Composable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB30D4FE1D9C1EEC006ADC9D /* Composable.swift */; }; - AB30D5121D9D9439006ADC9D /* Composable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB30D4FE1D9C1EEC006ADC9D /* Composable.swift */; }; - AB30D51D1D9D95F5006ADC9D /* EmbeddedTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB30D51C1D9D95F5006ADC9D /* EmbeddedTransformation.swift */; }; - AB560A061D9F692000100D15 /* AttributedStringTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB560A051D9F692000100D15 /* AttributedStringTransformation.swift */; }; - AB560A081DA0C14000100D15 /* Tab+Adaptive.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB560A071DA0C14000100D15 /* Tab+Adaptive.swift */; }; - AB560A0A1DA0C17800100D15 /* Tracking+Adaptive.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB560A091DA0C17800100D15 /* Tracking+Adaptive.swift */; }; - AB6633091DA5C5F90007F301 /* BONFontBehaviorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DAC1D96F06800273936 /* BONFontBehaviorTests.swift */; }; - AB8497B01DA16DAE00FE3414 /* NSAttributedString+Adaptive.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D651D96F02F00273936 /* NSAttributedString+Adaptive.swift */; }; - AB8497B11DA16DAE00FE3414 /* AdaptiveStyleTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D631D96F02F00273936 /* AdaptiveStyleTransformation.swift */; }; - AB8497B21DA16DAE00FE3414 /* AttributedStringTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB560A051D9F692000100D15 /* AttributedStringTransformation.swift */; }; - AB8497B31DA16DAE00FE3414 /* EmbeddedTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB30D51C1D9D95F5006ADC9D /* EmbeddedTransformation.swift */; }; - AB8497B41DA16DAE00FE3414 /* AdaptiveStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D621D96F02F00273936 /* AdaptiveStyle.swift */; }; - AB8497B51DA16DAE00FE3414 /* Tab+Adaptive.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB560A071DA0C14000100D15 /* Tab+Adaptive.swift */; }; - AB8497B61DA16DAE00FE3414 /* Tracking+Adaptive.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB560A091DA0C17800100D15 /* Tracking+Adaptive.swift */; }; - AB86628E1D9B060D00DEE3E3 /* FontFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D561D96F02F00273936 /* FontFeatures.swift */; }; - AB9C18D91D9975FD00A54787 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AB9C18D51D9975EE00A54787 /* Images.xcassets */; }; - AB9C18DB1D9975FD00A54787 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AB9C18D51D9975EE00A54787 /* Images.xcassets */; }; - AB9C18DD1D9975FE00A54787 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AB9C18D51D9975EE00A54787 /* Images.xcassets */; }; - ABA75DD21D99E10400B64705 /* Platform.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D581D96F02F00273936 /* Platform.swift */; }; - ABA75DD61D99E10400B64705 /* StringStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D521D96F02F00273936 /* StringStyle.swift */; }; - ABA75DD81D99E10400B64705 /* Special.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D5B1D96F02F00273936 /* Special.swift */; }; - ABA75DD91D99E10400B64705 /* NamedStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D5E1D96F02F00273936 /* NamedStyles.swift */; }; - ABA75DDB1D99E10400B64705 /* StringStyle+Part.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D531D96F02F00273936 /* StringStyle+Part.swift */; }; - ABA75DDD1D99E10400B64705 /* XMLBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D6A1D96F02F00273936 /* XMLBuilder.swift */; }; - ABA75DDE1D99E10400B64705 /* NSAttributedString+BonMot.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D571D96F02F00273936 /* NSAttributedString+BonMot.swift */; }; - ABA75DDF1D99E10400B64705 /* Compatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D551D96F02F00273936 /* Compatibility.swift */; }; - ABA75DE41D99E10400B64705 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABCBFD9F1D96E7F300FAD37A /* UIKit.framework */; }; - ABA75E0A1D99E43300B64705 /* Tracking.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABA75E091D99E43300B64705 /* Tracking.swift */; }; - ABA75E0B1D99E45C00B64705 /* Tracking.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABA75E091D99E43300B64705 /* Tracking.swift */; }; - ABA75E0D1D99E45E00B64705 /* Tracking.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABA75E091D99E43300B64705 /* Tracking.swift */; }; - ABA75E0E1D99F9D500B64705 /* Tracking.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABA75E091D99E43300B64705 /* Tracking.swift */; }; - ABC7774E1DC29F3000815FB9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABC7774D1DC29F3000815FB9 /* AppDelegate.swift */; }; - ABC777661DC29F7700815FB9 /* CatalogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABC7775D1DC29F7700815FB9 /* CatalogViewController.swift */; }; - ABC777671DC29F7700815FB9 /* DemoStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABC7775E1DC29F7700815FB9 /* DemoStrings.swift */; }; - ABC777691DC29F7700815FB9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = ABC777611DC29F7700815FB9 /* InfoPlist.strings */; }; - ABC7776C1DC29F7700815FB9 /* StyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABC777651DC29F7700815FB9 /* StyleViewController.swift */; }; - ABC7776F1DC2A02B00815FB9 /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = ABC7776D1DC2A02B00815FB9 /* Launch Screen.xib */; }; - ABC777701DC2A02B00815FB9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = ABC7776E1DC2A02B00815FB9 /* Main.storyboard */; }; - ABC777711DC2A07400815FB9 /* BonMot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABCBFD571D96E61000FAD37A /* BonMot.framework */; }; - ABC777731DC2A0AB00815FB9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC777721DC2A0AB00815FB9 /* UIKit.framework */; }; - ABC777741DC2A12600815FB9 /* Compatibility+Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA41D96F06800273936 /* Compatibility+Tests.swift */; }; - ABC777761DC2A16E00815FB9 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AB9C18D51D9975EE00A54787 /* Images.xcassets */; }; - ABCBFD601D96E61100FAD37A /* BonMot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABCBFD571D96E61000FAD37A /* BonMot.framework */; }; - ABCBFDA01D96E7F300FAD37A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABCBFD9F1D96E7F300FAD37A /* UIKit.framework */; }; - ABCD3D6B1D96F02F00273936 /* StringStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D521D96F02F00273936 /* StringStyle.swift */; }; - ABCD3D6C1D96F02F00273936 /* StringStyle+Part.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D531D96F02F00273936 /* StringStyle+Part.swift */; }; - ABCD3D6E1D96F02F00273936 /* Compatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D551D96F02F00273936 /* Compatibility.swift */; }; - ABCD3D6F1D96F02F00273936 /* FontFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D561D96F02F00273936 /* FontFeatures.swift */; }; - ABCD3D701D96F02F00273936 /* NSAttributedString+BonMot.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D571D96F02F00273936 /* NSAttributedString+BonMot.swift */; }; - ABCD3D711D96F02F00273936 /* Platform.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D581D96F02F00273936 /* Platform.swift */; }; - ABCD3D731D96F02F00273936 /* Special.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D5B1D96F02F00273936 /* Special.swift */; }; - ABCD3D761D96F02F00273936 /* NamedStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D5E1D96F02F00273936 /* NamedStyles.swift */; }; - ABCD3D771D96F02F00273936 /* AdaptableTextContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D601D96F02F00273936 /* AdaptableTextContainer.swift */; }; - ABCD3D791D96F02F00273936 /* AdaptiveStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D621D96F02F00273936 /* AdaptiveStyle.swift */; }; - ABCD3D7A1D96F02F00273936 /* AdaptiveStyleTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D631D96F02F00273936 /* AdaptiveStyleTransformation.swift */; }; - ABCD3D7C1D96F02F00273936 /* NSAttributedString+Adaptive.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D651D96F02F00273936 /* NSAttributedString+Adaptive.swift */; }; - ABCD3D7D1D96F02F00273936 /* StyleableUIElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D661D96F02F00273936 /* StyleableUIElement.swift */; }; - ABCD3D7F1D96F02F00273936 /* UIKit+AdaptableTextContainerSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D681D96F02F00273936 /* UIKit+AdaptableTextContainerSupport.swift */; }; - ABCD3D801D96F02F00273936 /* UIKit+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D691D96F02F00273936 /* UIKit+Helpers.swift */; }; - ABCD3D811D96F02F00273936 /* XMLBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D6A1D96F02F00273936 /* XMLBuilder.swift */; }; - ABCD3DB01D96F06800273936 /* AdaptiveStyleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA11D96F06800273936 /* AdaptiveStyleTests.swift */; }; - ABCD3DB11D96F06800273936 /* AssertHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA21D96F06800273936 /* AssertHelpers.swift */; }; - ABCD3DB21D96F06800273936 /* AttributedStringStyleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA31D96F06800273936 /* AttributedStringStyleTests.swift */; }; - ABCD3DB31D96F06800273936 /* Compatibility+Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA41D96F06800273936 /* Compatibility+Tests.swift */; }; - ABCD3DB41D96F06800273936 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA51D96F06800273936 /* Helpers.swift */; }; - ABCD3DB51D96F06800273936 /* ComposableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA61D96F06800273936 /* ComposableTests.swift */; }; - ABCD3DB61D96F06800273936 /* NSAttributedStringDebugTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA71D96F06800273936 /* NSAttributedStringDebugTests.swift */; }; - ABCD3DBA1D96F06800273936 /* BONFontBehaviorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DAC1D96F06800273936 /* BONFontBehaviorTests.swift */; }; - ABCD3DBB1D96F06800273936 /* UIKitBehaviorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DAD1D96F06800273936 /* UIKitBehaviorTests.swift */; }; - ABCD3DBC1D96F06800273936 /* UIKitBonMotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DAE1D96F06800273936 /* UIKitBonMotTests.swift */; }; - ABCD3DBD1D96F06800273936 /* XMLTagStyleBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DAF1D96F06800273936 /* XMLTagStyleBuilderTests.swift */; }; - ABCD3DCE1D96F6A500273936 /* UIKit+AdaptableTextContainerSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D681D96F02F00273936 /* UIKit+AdaptableTextContainerSupport.swift */; }; - ABCD3DD11D96F6A500273936 /* Platform.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D581D96F02F00273936 /* Platform.swift */; }; - ABCD3DD31D96F6A500273936 /* StyleableUIElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D661D96F02F00273936 /* StyleableUIElement.swift */; }; - ABCD3DD41D96F6A500273936 /* AdaptableTextContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D601D96F02F00273936 /* AdaptableTextContainer.swift */; }; - ABCD3DD51D96F6A500273936 /* StringStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D521D96F02F00273936 /* StringStyle.swift */; }; - ABCD3DD71D96F6A500273936 /* Special.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D5B1D96F02F00273936 /* Special.swift */; }; - ABCD3DD81D96F6A500273936 /* NamedStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D5E1D96F02F00273936 /* NamedStyles.swift */; }; - ABCD3DDA1D96F6A500273936 /* StringStyle+Part.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D531D96F02F00273936 /* StringStyle+Part.swift */; }; - ABCD3DDB1D96F6A500273936 /* UIKit+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D691D96F02F00273936 /* UIKit+Helpers.swift */; }; - ABCD3DDC1D96F6A500273936 /* XMLBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D6A1D96F02F00273936 /* XMLBuilder.swift */; }; - ABCD3DDD1D96F6A500273936 /* NSAttributedString+BonMot.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D571D96F02F00273936 /* NSAttributedString+BonMot.swift */; }; - ABCD3DDE1D96F6A500273936 /* Compatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D551D96F02F00273936 /* Compatibility.swift */; }; - ABCD3DE21D96F6A500273936 /* FontFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D561D96F02F00273936 /* FontFeatures.swift */; }; - ABCD3DE41D96F6A500273936 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABCBFD9F1D96E7F300FAD37A /* UIKit.framework */; }; - ABCD3DF21D96F6E200273936 /* Compatibility+Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA41D96F06800273936 /* Compatibility+Tests.swift */; }; - ABCD3DF31D96F6E200273936 /* UIKitBehaviorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DAD1D96F06800273936 /* UIKitBehaviorTests.swift */; }; - ABCD3DF41D96F6E200273936 /* AdaptiveStyleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA11D96F06800273936 /* AdaptiveStyleTests.swift */; }; - ABCD3DF51D96F6E200273936 /* XMLTagStyleBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DAF1D96F06800273936 /* XMLTagStyleBuilderTests.swift */; }; - ABCD3DF61D96F6E200273936 /* NSAttributedStringDebugTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA71D96F06800273936 /* NSAttributedStringDebugTests.swift */; }; - ABCD3DF71D96F6E200273936 /* AssertHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA21D96F06800273936 /* AssertHelpers.swift */; }; - ABCD3DF81D96F6E200273936 /* BONFontBehaviorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DAC1D96F06800273936 /* BONFontBehaviorTests.swift */; }; - ABCD3DF91D96F6E200273936 /* ComposableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA61D96F06800273936 /* ComposableTests.swift */; }; - ABCD3DFA1D96F6E200273936 /* UIKitBonMotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DAE1D96F06800273936 /* UIKitBonMotTests.swift */; }; - ABCD3DFB1D96F6E200273936 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA51D96F06800273936 /* Helpers.swift */; }; - ABCD3DFC1D96F6E200273936 /* AttributedStringStyleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA31D96F06800273936 /* AttributedStringStyleTests.swift */; }; - ABCD3DFE1D96F6E200273936 /* BonMot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABCBFD571D96E61000FAD37A /* BonMot.framework */; }; - ABCD3E0D1D980E4900273936 /* Platform.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D581D96F02F00273936 /* Platform.swift */; }; - ABCD3E111D980E4900273936 /* StringStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D521D96F02F00273936 /* StringStyle.swift */; }; - ABCD3E131D980E4900273936 /* Special.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D5B1D96F02F00273936 /* Special.swift */; }; - ABCD3E141D980E4900273936 /* NamedStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D5E1D96F02F00273936 /* NamedStyles.swift */; }; - ABCD3E161D980E4900273936 /* StringStyle+Part.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D531D96F02F00273936 /* StringStyle+Part.swift */; }; - ABCD3E181D980E4900273936 /* XMLBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D6A1D96F02F00273936 /* XMLBuilder.swift */; }; - ABCD3E191D980E4900273936 /* NSAttributedString+BonMot.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D571D96F02F00273936 /* NSAttributedString+BonMot.swift */; }; - ABCD3E1A1D980E4900273936 /* Compatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D551D96F02F00273936 /* Compatibility.swift */; }; - ABCD3E1D1D980E4900273936 /* FontFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3D561D96F02F00273936 /* FontFeatures.swift */; }; - ABCD3E2B1D980E5500273936 /* Compatibility+Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA41D96F06800273936 /* Compatibility+Tests.swift */; }; - ABCD3E2E1D980E5500273936 /* XMLTagStyleBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DAF1D96F06800273936 /* XMLTagStyleBuilderTests.swift */; }; - ABCD3E2F1D980E5500273936 /* NSAttributedStringDebugTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA71D96F06800273936 /* NSAttributedStringDebugTests.swift */; }; - ABCD3E301D980E5500273936 /* AssertHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA21D96F06800273936 /* AssertHelpers.swift */; }; - ABCD3E321D980E5500273936 /* ComposableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA61D96F06800273936 /* ComposableTests.swift */; }; - ABCD3E341D980E5500273936 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA51D96F06800273936 /* Helpers.swift */; }; - ABCD3E351D980E5500273936 /* AttributedStringStyleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCD3DA31D96F06800273936 /* AttributedStringStyleTests.swift */; }; - ABCD3E371D980E5500273936 /* BonMot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABCBFD571D96E61000FAD37A /* BonMot.framework */; }; - CD3EEE681DC92CF6002C41BB /* Ligatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEE661DC92CF0002C41BB /* Ligatures.swift */; }; - CD3EEE691DC92CF6002C41BB /* Ligatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEE661DC92CF0002C41BB /* Ligatures.swift */; }; - CD3EEE6A1DC92CF7002C41BB /* Ligatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEE661DC92CF0002C41BB /* Ligatures.swift */; }; - CD3EEE6B1DC92CF8002C41BB /* Ligatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEE661DC92CF0002C41BB /* Ligatures.swift */; }; - CD3EEE6E1DCA68ED002C41BB /* FontInspector.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEE6C1DCA68E1002C41BB /* FontInspector.swift */; }; - CD3EEE6F1DCA68ED002C41BB /* FontInspector.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEE6C1DCA68E1002C41BB /* FontInspector.swift */; }; - CD3EEE701DCA68EF002C41BB /* FontInspector.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEE6C1DCA68E1002C41BB /* FontInspector.swift */; }; - CD3EEE711DCA68FB002C41BB /* FontInspector.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEE6C1DCA68E1002C41BB /* FontInspector.swift */; }; - CD3EEE731DCA6BCB002C41BB /* FontInspectorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEE721DCA6BCB002C41BB /* FontInspectorTests.swift */; }; - CD3EEE741DCA6BCB002C41BB /* FontInspectorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEE721DCA6BCB002C41BB /* FontInspectorTests.swift */; }; - CD3EEE751DCA6BCB002C41BB /* FontInspectorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3EEE721DCA6BCB002C41BB /* FontInspectorTests.swift */; }; - CD6BE30A1E8590F900FB308F /* Transform.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6BE3081E8590E900FB308F /* Transform.swift */; }; - CD6BE30B1E8590FA00FB308F /* Transform.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6BE3081E8590E900FB308F /* Transform.swift */; }; - CD6BE30C1E8590FA00FB308F /* Transform.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6BE3081E8590E900FB308F /* Transform.swift */; }; - CD6BE30D1E8590FB00FB308F /* Transform.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6BE3081E8590E900FB308F /* Transform.swift */; }; - CD6BE30F1E85924800FB308F /* TransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6BE30E1E85924800FB308F /* TransformTests.swift */; }; - CD6BE3101E85924800FB308F /* TransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6BE30E1E85924800FB308F /* TransformTests.swift */; }; - CD6BE3111E85924800FB308F /* TransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6BE30E1E85924800FB308F /* TransformTests.swift */; }; - CD70C54E1DCD22A7003C063A /* StylisticAlternates.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD70C54C1DCD22A1003C063A /* StylisticAlternates.swift */; }; - CD70C54F1DCD22A8003C063A /* StylisticAlternates.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD70C54C1DCD22A1003C063A /* StylisticAlternates.swift */; }; - CD70C5501DCD22A8003C063A /* StylisticAlternates.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD70C54C1DCD22A1003C063A /* StylisticAlternates.swift */; }; - CD70C5511DCD22A9003C063A /* StylisticAlternates.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD70C54C1DCD22A1003C063A /* StylisticAlternates.swift */; }; - CDB366BC20325AE1002C256E /* Emphasis.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB366BB20325AE1002C256E /* Emphasis.swift */; }; - CDB366BD20325AE1002C256E /* Emphasis.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB366BB20325AE1002C256E /* Emphasis.swift */; }; - CDB366C1203264DE002C256E /* Emphasis.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB366BB20325AE1002C256E /* Emphasis.swift */; }; - CDB366C2203264DF002C256E /* Emphasis.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB366BB20325AE1002C256E /* Emphasis.swift */; }; - CDB366C620326FCD002C256E /* EmphasisTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB366C320326FC9002C256E /* EmphasisTests.swift */; }; - CDB366C720326FCE002C256E /* EmphasisTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB366C320326FC9002C256E /* EmphasisTests.swift */; }; - CDB366C820326FCE002C256E /* EmphasisTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB366C320326FC9002C256E /* EmphasisTests.swift */; }; - CDC0CE361F90730700E144F7 /* AccessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC0CE351F90730700E144F7 /* AccessTests.swift */; }; - CDC0CE371F90730700E144F7 /* AccessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC0CE351F90730700E144F7 /* AccessTests.swift */; }; - CDC0CE381F90730700E144F7 /* AccessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC0CE351F90730700E144F7 /* AccessTests.swift */; }; - CDC49D8D1F74AD8F0067FC86 /* AccessibilityHeadingLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC49D8C1F74AD8F0067FC86 /* AccessibilityHeadingLevel.swift */; }; - CDC49D8E1F74AD8F0067FC86 /* AccessibilityHeadingLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC49D8C1F74AD8F0067FC86 /* AccessibilityHeadingLevel.swift */; }; - CDC49D8F1F74AD8F0067FC86 /* AccessibilityHeadingLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC49D8C1F74AD8F0067FC86 /* AccessibilityHeadingLevel.swift */; }; - CDCF0F1F1DCE5B9B00727AAE /* ContextualAlternates.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCF0F1E1DCE5B9B00727AAE /* ContextualAlternates.swift */; }; - CDCF0F201DCE5B9B00727AAE /* ContextualAlternates.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCF0F1E1DCE5B9B00727AAE /* ContextualAlternates.swift */; }; - CDCF0F211DCE5B9B00727AAE /* ContextualAlternates.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCF0F1E1DCE5B9B00727AAE /* ContextualAlternates.swift */; }; - CDCF0F221DCE5B9B00727AAE /* ContextualAlternates.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCF0F1E1DCE5B9B00727AAE /* ContextualAlternates.swift */; }; - CDE292971E15D55600EA4A32 /* BonMot.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = ABCBFD571D96E61000FAD37A /* BonMot.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - CDEA84311D9EEC390099BD73 /* Image+Tinting.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDEA84301D9EEC390099BD73 /* Image+Tinting.swift */; }; - CDEA84321D9EEC390099BD73 /* Image+Tinting.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDEA84301D9EEC390099BD73 /* Image+Tinting.swift */; }; - CDEA84331D9EEC390099BD73 /* Image+Tinting.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDEA84301D9EEC390099BD73 /* Image+Tinting.swift */; }; - CDEA84341D9EEC390099BD73 /* Image+Tinting.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDEA84301D9EEC390099BD73 /* Image+Tinting.swift */; }; - CDEA84361D9EEC490099BD73 /* ImageTintingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDEA84351D9EEC490099BD73 /* ImageTintingTests.swift */; }; - CDEA84371D9EEC490099BD73 /* ImageTintingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDEA84351D9EEC490099BD73 /* ImageTintingTests.swift */; }; - CDEA84381D9EEC490099BD73 /* ImageTintingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDEA84351D9EEC490099BD73 /* ImageTintingTests.swift */; }; - CDF7E97F1D9C612800FF46BF /* MutableCopying.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDF7E97E1D9C612800FF46BF /* MutableCopying.swift */; }; - CDF7E9801D9C613100FF46BF /* MutableCopying.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDF7E97E1D9C612800FF46BF /* MutableCopying.swift */; }; - CDF7E9811D9C613400FF46BF /* MutableCopying.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDF7E97E1D9C612800FF46BF /* MutableCopying.swift */; }; - CDF7E9821D9C613500FF46BF /* MutableCopying.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDF7E97E1D9C612800FF46BF /* MutableCopying.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - AB9C18CD1D9965A900A54787 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = ABCBFD2F1D96E41D00FAD37A /* Project object */; - proxyType = 1; - remoteGlobalIDString = ABCD3E071D980E4900273936; - remoteInfo = "BonMot-OSX"; - }; - AB9C18CF1D9965B100A54787 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = ABCBFD2F1D96E41D00FAD37A /* Project object */; - proxyType = 1; - remoteGlobalIDString = ABCD3DCB1D96F6A500273936; - remoteInfo = "BonMot-tvOS"; - }; - ABCBFD611D96E61100FAD37A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = ABCBFD2F1D96E41D00FAD37A /* Project object */; - proxyType = 1; - remoteGlobalIDString = ABCBFD561D96E61000FAD37A; - remoteInfo = "BonMot-iOS"; - }; - CDE292981E15D55600EA4A32 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = ABCBFD2F1D96E41D00FAD37A /* Project object */; - proxyType = 1; - remoteGlobalIDString = ABCBFD561D96E61000FAD37A; - remoteInfo = "BonMot-iOS"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - CDE2929A1E15D55600EA4A32 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - CDE292971E15D55600EA4A32 /* BonMot.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 1E7B10EB1DA41F9300C668A4 /* TextAlignmentConstraint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextAlignmentConstraint.swift; sourceTree = ""; }; - 1E902AB31DA6915F00BD154D /* TextAlignmentConstraintTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextAlignmentConstraintTests.swift; sourceTree = ""; }; - 526C704D268BCC61002C0C71 /* EBGaramond12-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "EBGaramond12-Regular.otf"; sourceTree = ""; }; - 526C704E268BCC61002C0C71 /* rz-logo-black.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "rz-logo-black.png"; sourceTree = ""; }; - 526C704F268BCC61002C0C71 /* rz-logo-red.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "rz-logo-red.png"; sourceTree = ""; }; - 5B8FFE322326F79900372DC0 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; - AB167C8F1D997A2C0084808D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AB30D4FE1D9C1EEC006ADC9D /* Composable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Composable.swift; sourceTree = ""; }; - AB30D50B1D9CB4FE006ADC9D /* Tab.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tab.swift; sourceTree = ""; }; - AB30D51C1D9D95F5006ADC9D /* EmbeddedTransformation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EmbeddedTransformation.swift; path = UIKit/EmbeddedTransformation.swift; sourceTree = ""; }; - AB560A051D9F692000100D15 /* AttributedStringTransformation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AttributedStringTransformation.swift; path = UIKit/AttributedStringTransformation.swift; sourceTree = ""; }; - AB560A071DA0C14000100D15 /* Tab+Adaptive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Tab+Adaptive.swift"; path = "UIKit/Tab+Adaptive.swift"; sourceTree = ""; }; - AB560A091DA0C17800100D15 /* Tracking+Adaptive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Tracking+Adaptive.swift"; path = "UIKit/Tracking+Adaptive.swift"; sourceTree = ""; }; - AB9C18D11D9975CE00A54787 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AB9C18D51D9975EE00A54787 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - ABA75DEA1D99E10400B64705 /* BonMot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BonMot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - ABA75E091D99E43300B64705 /* Tracking.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tracking.swift; sourceTree = ""; }; - ABC7774B1DC29F3000815FB9 /* Example-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - ABC7774D1DC29F3000815FB9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - ABC7775D1DC29F7700815FB9 /* CatalogViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CatalogViewController.swift; sourceTree = ""; }; - ABC7775E1DC29F7700815FB9 /* DemoStrings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoStrings.swift; sourceTree = ""; }; - ABC777601DC29F7700815FB9 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - ABC777621DC29F7700815FB9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - ABC777651DC29F7700815FB9 /* StyleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyleViewController.swift; sourceTree = ""; }; - ABC7776D1DC2A02B00815FB9 /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = ""; }; - ABC7776E1DC2A02B00815FB9 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; - ABC777721DC2A0AB00815FB9 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - ABCBFD571D96E61000FAD37A /* BonMot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BonMot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - ABCBFD5F1D96E61100FAD37A /* BonMot-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "BonMot-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - ABCBFD9F1D96E7F300FAD37A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - ABCD3D521D96F02F00273936 /* StringStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringStyle.swift; sourceTree = ""; }; - ABCD3D531D96F02F00273936 /* StringStyle+Part.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "StringStyle+Part.swift"; sourceTree = ""; }; - ABCD3D541D96F02F00273936 /* BonMot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BonMot.h; sourceTree = ""; }; - ABCD3D551D96F02F00273936 /* Compatibility.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Compatibility.swift; sourceTree = ""; }; - ABCD3D561D96F02F00273936 /* FontFeatures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FontFeatures.swift; sourceTree = ""; }; - ABCD3D571D96F02F00273936 /* NSAttributedString+BonMot.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSAttributedString+BonMot.swift"; sourceTree = ""; }; - ABCD3D581D96F02F00273936 /* Platform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Platform.swift; sourceTree = ""; }; - ABCD3D5B1D96F02F00273936 /* Special.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Special.swift; sourceTree = ""; }; - ABCD3D5E1D96F02F00273936 /* NamedStyles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NamedStyles.swift; sourceTree = ""; }; - ABCD3D601D96F02F00273936 /* AdaptableTextContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdaptableTextContainer.swift; sourceTree = ""; }; - ABCD3D621D96F02F00273936 /* AdaptiveStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AdaptiveStyle.swift; path = UIKit/AdaptiveStyle.swift; sourceTree = ""; }; - ABCD3D631D96F02F00273936 /* AdaptiveStyleTransformation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AdaptiveStyleTransformation.swift; path = UIKit/AdaptiveStyleTransformation.swift; sourceTree = ""; }; - ABCD3D651D96F02F00273936 /* NSAttributedString+Adaptive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NSAttributedString+Adaptive.swift"; path = "UIKit/NSAttributedString+Adaptive.swift"; sourceTree = ""; }; - ABCD3D661D96F02F00273936 /* StyleableUIElement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyleableUIElement.swift; sourceTree = ""; }; - ABCD3D681D96F02F00273936 /* UIKit+AdaptableTextContainerSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIKit+AdaptableTextContainerSupport.swift"; sourceTree = ""; }; - ABCD3D691D96F02F00273936 /* UIKit+Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIKit+Helpers.swift"; sourceTree = ""; }; - ABCD3D6A1D96F02F00273936 /* XMLBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLBuilder.swift; sourceTree = ""; }; - ABCD3DA11D96F06800273936 /* AdaptiveStyleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdaptiveStyleTests.swift; sourceTree = ""; }; - ABCD3DA21D96F06800273936 /* AssertHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertHelpers.swift; sourceTree = ""; }; - ABCD3DA31D96F06800273936 /* AttributedStringStyleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedStringStyleTests.swift; sourceTree = ""; }; - ABCD3DA41D96F06800273936 /* Compatibility+Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Compatibility+Tests.swift"; sourceTree = ""; }; - ABCD3DA51D96F06800273936 /* Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; }; - ABCD3DA61D96F06800273936 /* ComposableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComposableTests.swift; sourceTree = ""; }; - ABCD3DA71D96F06800273936 /* NSAttributedStringDebugTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSAttributedStringDebugTests.swift; sourceTree = ""; }; - ABCD3DAC1D96F06800273936 /* BONFontBehaviorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BONFontBehaviorTests.swift; sourceTree = ""; }; - ABCD3DAD1D96F06800273936 /* UIKitBehaviorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIKitBehaviorTests.swift; sourceTree = ""; }; - ABCD3DAE1D96F06800273936 /* UIKitBonMotTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIKitBonMotTests.swift; sourceTree = ""; }; - ABCD3DAF1D96F06800273936 /* XMLTagStyleBuilderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLTagStyleBuilderTests.swift; sourceTree = ""; }; - ABCD3DC51D96F56400273936 /* BonMot.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = BonMot.podspec; sourceTree = ""; }; - ABCD3DC61D96F56400273936 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - ABCD3DC71D96F56400273936 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - ABCD3DEC1D96F6A500273936 /* BonMot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BonMot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - ABCD3E051D96F6E200273936 /* BonMot-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "BonMot-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - ABCD3E251D980E4900273936 /* BonMot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BonMot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - ABCD3E3E1D980E5500273936 /* BonMot-OSXTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "BonMot-OSXTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - ABCD3E401D99558000273936 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/AppKit.framework; sourceTree = DEVELOPER_DIR; }; - CD3EEE661DC92CF0002C41BB /* Ligatures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Ligatures.swift; sourceTree = ""; }; - CD3EEE6C1DCA68E1002C41BB /* FontInspector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FontInspector.swift; sourceTree = ""; }; - CD3EEE721DCA6BCB002C41BB /* FontInspectorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FontInspectorTests.swift; sourceTree = ""; }; - CD6BE3081E8590E900FB308F /* Transform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Transform.swift; sourceTree = ""; }; - CD6BE30E1E85924800FB308F /* TransformTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransformTests.swift; sourceTree = ""; }; - CD70C54C1DCD22A1003C063A /* StylisticAlternates.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StylisticAlternates.swift; sourceTree = ""; }; - CDB366BB20325AE1002C256E /* Emphasis.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Emphasis.swift; sourceTree = ""; }; - CDB366C320326FC9002C256E /* EmphasisTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmphasisTests.swift; sourceTree = ""; }; - CDC0CE351F90730700E144F7 /* AccessTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessTests.swift; sourceTree = ""; }; - CDC49D8C1F74AD8F0067FC86 /* AccessibilityHeadingLevel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityHeadingLevel.swift; sourceTree = ""; }; - CDCF0F1E1DCE5B9B00727AAE /* ContextualAlternates.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContextualAlternates.swift; sourceTree = ""; }; - CDEA84301D9EEC390099BD73 /* Image+Tinting.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Image+Tinting.swift"; sourceTree = ""; }; - CDEA84351D9EEC490099BD73 /* ImageTintingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageTintingTests.swift; sourceTree = ""; }; - CDF7E97E1D9C612800FF46BF /* MutableCopying.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MutableCopying.swift; sourceTree = ""; }; - D915E01024944361009F455B /* Example-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Example-iOS.entitlements"; sourceTree = ""; }; - D9C5521023D24796001D7504 /* BonMot-iOSTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = "BonMot-iOSTests.xctestplan"; path = "Tests/BonMot-iOSTests.xctestplan"; sourceTree = ""; }; - D9C5521123D24872001D7504 /* BonMot-OSXTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = "BonMot-OSXTests.xctestplan"; path = "Tests/BonMot-OSXTests.xctestplan"; sourceTree = ""; }; - D9C5521223D248A0001D7504 /* BonMot-tvOSTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = "BonMot-tvOSTests.xctestplan"; path = "Tests/BonMot-tvOSTests.xctestplan"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - ABA75DE31D99E10400B64705 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ABA75DE41D99E10400B64705 /* UIKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABC777481DC29F3000815FB9 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ABC777731DC2A0AB00815FB9 /* UIKit.framework in Frameworks */, - ABC777711DC2A07400815FB9 /* BonMot.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCBFD531D96E61000FAD37A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ABCBFDA01D96E7F300FAD37A /* UIKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCBFD5C1D96E61100FAD37A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ABCBFD601D96E61100FAD37A /* BonMot.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3DE31D96F6A500273936 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ABCD3DE41D96F6A500273936 /* UIKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3DFD1D96F6E200273936 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ABCD3DFE1D96F6E200273936 /* BonMot.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3E1E1D980E4900273936 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3E361D980E5500273936 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ABCD3E371D980E5500273936 /* BonMot.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 526C704C268BCC61002C0C71 /* Resources */ = { - isa = PBXGroup; - children = ( - 526C704D268BCC61002C0C71 /* EBGaramond12-Regular.otf */, - 526C704E268BCC61002C0C71 /* rz-logo-black.png */, - 526C704F268BCC61002C0C71 /* rz-logo-red.png */, - ); - name = Resources; - path = Tests/Resources; - sourceTree = ""; - }; - AB30D5021D9CB2D4006ADC9D /* Style */ = { - isa = PBXGroup; - children = ( - ABCD3D521D96F02F00273936 /* StringStyle.swift */, - ABCD3D531D96F02F00273936 /* StringStyle+Part.swift */, - ABCD3D5E1D96F02F00273936 /* NamedStyles.swift */, - ABCD3D561D96F02F00273936 /* FontFeatures.swift */, - CDB366BB20325AE1002C256E /* Emphasis.swift */, - CDC49D8C1F74AD8F0067FC86 /* AccessibilityHeadingLevel.swift */, - ABA75E091D99E43300B64705 /* Tracking.swift */, - CD3EEE661DC92CF0002C41BB /* Ligatures.swift */, - CD70C54C1DCD22A1003C063A /* StylisticAlternates.swift */, - CDCF0F1E1DCE5B9B00727AAE /* ContextualAlternates.swift */, - CD6BE3081E8590E900FB308F /* Transform.swift */, - ); - name = Style; - sourceTree = ""; - }; - AB30D5031D9CB2F2006ADC9D /* Composable */ = { - isa = PBXGroup; - children = ( - AB30D4FE1D9C1EEC006ADC9D /* Composable.swift */, - ABCD3D6A1D96F02F00273936 /* XMLBuilder.swift */, - ABCD3D5B1D96F02F00273936 /* Special.swift */, - AB30D50B1D9CB4FE006ADC9D /* Tab.swift */, - ); - name = Composable; - sourceTree = ""; - }; - AB30D5041D9CB33B006ADC9D /* Helpers */ = { - isa = PBXGroup; - children = ( - ABCD3D581D96F02F00273936 /* Platform.swift */, - ABCD3D551D96F02F00273936 /* Compatibility.swift */, - ABCD3D571D96F02F00273936 /* NSAttributedString+BonMot.swift */, - CDF7E97E1D9C612800FF46BF /* MutableCopying.swift */, - CDEA84301D9EEC390099BD73 /* Image+Tinting.swift */, - CD3EEE6C1DCA68E1002C41BB /* FontInspector.swift */, - ); - name = Helpers; - sourceTree = ""; - }; - AB30D5051D9CB3D2006ADC9D /* Adaptive */ = { - isa = PBXGroup; - children = ( - ABCD3D651D96F02F00273936 /* NSAttributedString+Adaptive.swift */, - ABCD3D631D96F02F00273936 /* AdaptiveStyleTransformation.swift */, - AB560A051D9F692000100D15 /* AttributedStringTransformation.swift */, - AB30D51C1D9D95F5006ADC9D /* EmbeddedTransformation.swift */, - ABCD3D621D96F02F00273936 /* AdaptiveStyle.swift */, - AB560A071DA0C14000100D15 /* Tab+Adaptive.swift */, - AB560A091DA0C17800100D15 /* Tracking+Adaptive.swift */, - ); - name = Adaptive; - sourceTree = ""; - }; - ABC7774C1DC29F3000815FB9 /* Example-iOS */ = { - isa = PBXGroup; - children = ( - D915E01024944361009F455B /* Example-iOS.entitlements */, - ABC7775E1DC29F7700815FB9 /* DemoStrings.swift */, - ABC777651DC29F7700815FB9 /* StyleViewController.swift */, - ABC7775D1DC29F7700815FB9 /* CatalogViewController.swift */, - ABC7774D1DC29F3000815FB9 /* AppDelegate.swift */, - ABC7775F1DC29F7700815FB9 /* Resources */, - ); - path = "Example-iOS"; - sourceTree = ""; - }; - ABC7775F1DC29F7700815FB9 /* Resources */ = { - isa = PBXGroup; - children = ( - AB9C18D51D9975EE00A54787 /* Images.xcassets */, - ABC7776D1DC2A02B00815FB9 /* Launch Screen.xib */, - ABC7776E1DC2A02B00815FB9 /* Main.storyboard */, - ABC777601DC29F7700815FB9 /* Info.plist */, - ABC777611DC29F7700815FB9 /* InfoPlist.strings */, - ); - path = Resources; - sourceTree = ""; - }; - ABCBFD2E1D96E41D00FAD37A = { - isa = PBXGroup; - children = ( - D9C5521123D24872001D7504 /* BonMot-OSXTests.xctestplan */, - D9C5521023D24796001D7504 /* BonMot-iOSTests.xctestplan */, - D9C5521223D248A0001D7504 /* BonMot-tvOSTests.xctestplan */, - 5B8FFE322326F79900372DC0 /* Package.swift */, - ABCD3D511D96F02F00273936 /* Sources */, - ABCD3DA01D96F06800273936 /* Tests */, - 526C704C268BCC61002C0C71 /* Resources */, - ABCD3DC61D96F56400273936 /* README.md */, - ABCD3DC51D96F56400273936 /* BonMot.podspec */, - ABCD3DC71D96F56400273936 /* LICENSE */, - ABC7774C1DC29F3000815FB9 /* Example-iOS */, - ABCBFD391D96E41D00FAD37A /* Products */, - ABCBFD9E1D96E7F200FAD37A /* Frameworks */, - ); - sourceTree = ""; - }; - ABCBFD391D96E41D00FAD37A /* Products */ = { - isa = PBXGroup; - children = ( - ABCBFD571D96E61000FAD37A /* BonMot.framework */, - ABCBFD5F1D96E61100FAD37A /* BonMot-iOSTests.xctest */, - ABCD3DEC1D96F6A500273936 /* BonMot.framework */, - ABCD3E051D96F6E200273936 /* BonMot-tvOSTests.xctest */, - ABCD3E251D980E4900273936 /* BonMot.framework */, - ABCD3E3E1D980E5500273936 /* BonMot-OSXTests.xctest */, - ABA75DEA1D99E10400B64705 /* BonMot.framework */, - ABC7774B1DC29F3000815FB9 /* Example-iOS.app */, - ); - name = Products; - sourceTree = ""; - }; - ABCBFD9E1D96E7F200FAD37A /* Frameworks */ = { - isa = PBXGroup; - children = ( - ABC777721DC2A0AB00815FB9 /* UIKit.framework */, - ABCD3E401D99558000273936 /* AppKit.framework */, - ABCBFD9F1D96E7F300FAD37A /* UIKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - ABCD3D511D96F02F00273936 /* Sources */ = { - isa = PBXGroup; - children = ( - ABCD3D541D96F02F00273936 /* BonMot.h */, - AB30D5021D9CB2D4006ADC9D /* Style */, - AB30D5031D9CB2F2006ADC9D /* Composable */, - AB30D5051D9CB3D2006ADC9D /* Adaptive */, - AB30D5041D9CB33B006ADC9D /* Helpers */, - ABCD3D5F1D96F02F00273936 /* UIKit */, - AB9C18D11D9975CE00A54787 /* Info.plist */, - ); - path = Sources; - sourceTree = ""; - }; - ABCD3D5F1D96F02F00273936 /* UIKit */ = { - isa = PBXGroup; - children = ( - ABCD3D601D96F02F00273936 /* AdaptableTextContainer.swift */, - ABCD3D661D96F02F00273936 /* StyleableUIElement.swift */, - ABCD3D681D96F02F00273936 /* UIKit+AdaptableTextContainerSupport.swift */, - ABCD3D691D96F02F00273936 /* UIKit+Helpers.swift */, - 1E7B10EB1DA41F9300C668A4 /* TextAlignmentConstraint.swift */, - ); - path = UIKit; - sourceTree = ""; - }; - ABCD3DA01D96F06800273936 /* Tests */ = { - isa = PBXGroup; - children = ( - ABCD3DA11D96F06800273936 /* AdaptiveStyleTests.swift */, - ABCD3DA31D96F06800273936 /* AttributedStringStyleTests.swift */, - ABCD3DA61D96F06800273936 /* ComposableTests.swift */, - ABCD3DA71D96F06800273936 /* NSAttributedStringDebugTests.swift */, - ABCD3DAE1D96F06800273936 /* UIKitBonMotTests.swift */, - ABCD3DAF1D96F06800273936 /* XMLTagStyleBuilderTests.swift */, - ABCD3DA21D96F06800273936 /* AssertHelpers.swift */, - ABCD3DA41D96F06800273936 /* Compatibility+Tests.swift */, - ABCD3DA51D96F06800273936 /* Helpers.swift */, - ABCD3DAC1D96F06800273936 /* BONFontBehaviorTests.swift */, - ABCD3DAD1D96F06800273936 /* UIKitBehaviorTests.swift */, - CDEA84351D9EEC490099BD73 /* ImageTintingTests.swift */, - 1E902AB31DA6915F00BD154D /* TextAlignmentConstraintTests.swift */, - CDB366C320326FC9002C256E /* EmphasisTests.swift */, - CD3EEE721DCA6BCB002C41BB /* FontInspectorTests.swift */, - CD6BE30E1E85924800FB308F /* TransformTests.swift */, - CDC0CE351F90730700E144F7 /* AccessTests.swift */, - AB167C8F1D997A2C0084808D /* Info.plist */, - ); - path = Tests; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - ABA75DE51D99E10400B64705 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCBFD541D96E61000FAD37A /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3DE51D96F6A500273936 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3E201D980E4900273936 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - ABA75DCC1D99E10400B64705 /* BonMot-watchOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = ABA75DE71D99E10400B64705 /* Build configuration list for PBXNativeTarget "BonMot-watchOS" */; - buildPhases = ( - ABA75DCD1D99E10400B64705 /* Sources */, - CD4B2FD21D9B0B3D007CF808 /* SwiftLint */, - ABA75DE31D99E10400B64705 /* Frameworks */, - ABA75DE51D99E10400B64705 /* Headers */, - ABA75DE61D99E10400B64705 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "BonMot-watchOS"; - productName = "BonMot-iOS"; - productReference = ABA75DEA1D99E10400B64705 /* BonMot.framework */; - productType = "com.apple.product-type.framework"; - }; - ABC7774A1DC29F3000815FB9 /* Example-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = ABC7775C1DC29F3000815FB9 /* Build configuration list for PBXNativeTarget "Example-iOS" */; - buildPhases = ( - ABC777471DC29F3000815FB9 /* Sources */, - ABC777481DC29F3000815FB9 /* Frameworks */, - ABC777491DC29F3000815FB9 /* Resources */, - CDE2929A1E15D55600EA4A32 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - CDE292991E15D55600EA4A32 /* PBXTargetDependency */, - ); - name = "Example-iOS"; - productName = "Example-iOS"; - productReference = ABC7774B1DC29F3000815FB9 /* Example-iOS.app */; - productType = "com.apple.product-type.application"; - }; - ABCBFD561D96E61000FAD37A /* BonMot-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = ABCBFD681D96E61100FAD37A /* Build configuration list for PBXNativeTarget "BonMot-iOS" */; - buildPhases = ( - ABCBFD521D96E61000FAD37A /* Sources */, - CD4B2FCC1D9B0AB0007CF808 /* SwiftLint */, - ABCBFD531D96E61000FAD37A /* Frameworks */, - ABCBFD541D96E61000FAD37A /* Headers */, - ABCBFD551D96E61000FAD37A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "BonMot-iOS"; - productName = "BonMot-iOS"; - productReference = ABCBFD571D96E61000FAD37A /* BonMot.framework */; - productType = "com.apple.product-type.framework"; - }; - ABCBFD5E1D96E61100FAD37A /* BonMot-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = ABCBFD6B1D96E61100FAD37A /* Build configuration list for PBXNativeTarget "BonMot-iOSTests" */; - buildPhases = ( - ABCBFD5B1D96E61100FAD37A /* Sources */, - CD4B2FCD1D9B0ADF007CF808 /* SwiftLint */, - ABCBFD5C1D96E61100FAD37A /* Frameworks */, - ABCBFD5D1D96E61100FAD37A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ABCBFD621D96E61100FAD37A /* PBXTargetDependency */, - ); - name = "BonMot-iOSTests"; - productName = "BonMot-iOSTests"; - productReference = ABCBFD5F1D96E61100FAD37A /* BonMot-iOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - ABCD3DCB1D96F6A500273936 /* BonMot-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = ABCD3DE91D96F6A500273936 /* Build configuration list for PBXNativeTarget "BonMot-tvOS" */; - buildPhases = ( - ABCD3DCC1D96F6A500273936 /* Sources */, - CD4B2FCE1D9B0AF2007CF808 /* SwiftLint */, - ABCD3DE31D96F6A500273936 /* Frameworks */, - ABCD3DE51D96F6A500273936 /* Headers */, - ABCD3DE61D96F6A500273936 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "BonMot-tvOS"; - productName = "BonMot-iOS"; - productReference = ABCD3DEC1D96F6A500273936 /* BonMot.framework */; - productType = "com.apple.product-type.framework"; - }; - ABCD3DEE1D96F6E200273936 /* BonMot-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = ABCD3E021D96F6E200273936 /* Build configuration list for PBXNativeTarget "BonMot-tvOSTests" */; - buildPhases = ( - ABCD3DF11D96F6E200273936 /* Sources */, - CD4B2FCF1D9B0B12007CF808 /* SwiftLint */, - ABCD3DFD1D96F6E200273936 /* Frameworks */, - ABCD3DFF1D96F6E200273936 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - AB9C18D01D9965B100A54787 /* PBXTargetDependency */, - ); - name = "BonMot-tvOSTests"; - productName = "BonMot-iOSTests"; - productReference = ABCD3E051D96F6E200273936 /* BonMot-tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - ABCD3E071D980E4900273936 /* BonMot-OSX */ = { - isa = PBXNativeTarget; - buildConfigurationList = ABCD3E221D980E4900273936 /* Build configuration list for PBXNativeTarget "BonMot-OSX" */; - buildPhases = ( - ABCD3E081D980E4900273936 /* Sources */, - CD4B2FD01D9B0B1F007CF808 /* SwiftLint */, - ABCD3E1E1D980E4900273936 /* Frameworks */, - ABCD3E201D980E4900273936 /* Headers */, - ABCD3E211D980E4900273936 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "BonMot-OSX"; - productName = "BonMot-iOS"; - productReference = ABCD3E251D980E4900273936 /* BonMot.framework */; - productType = "com.apple.product-type.framework"; - }; - ABCD3E271D980E5500273936 /* BonMot-OSXTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = ABCD3E3B1D980E5500273936 /* Build configuration list for PBXNativeTarget "BonMot-OSXTests" */; - buildPhases = ( - ABCD3E2A1D980E5500273936 /* Sources */, - CD4B2FD11D9B0B2E007CF808 /* SwiftLint */, - ABCD3E361D980E5500273936 /* Frameworks */, - ABCD3E381D980E5500273936 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - AB9C18CE1D9965A900A54787 /* PBXTargetDependency */, - ); - name = "BonMot-OSXTests"; - productName = "BonMot-iOSTests"; - productReference = ABCD3E3E1D980E5500273936 /* BonMot-OSXTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - ABCBFD2F1D96E41D00FAD37A /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = YES; - LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = Rightpoint; - TargetAttributes = { - AB8497DA1DA45B9C00FE3414 = { - CreatedOnToolsVersion = 8.0; - ProvisioningStyle = Automatic; - }; - ABC7774A1DC29F3000815FB9 = { - CreatedOnToolsVersion = 8.0; - LastSwiftMigration = 1020; - ProvisioningStyle = Automatic; - }; - ABCBFD561D96E61000FAD37A = { - CreatedOnToolsVersion = 8.0; - LastSwiftMigration = 1020; - }; - ABCBFD5E1D96E61100FAD37A = { - CreatedOnToolsVersion = 8.0; - LastSwiftMigration = 0900; - ProvisioningStyle = Automatic; - }; - ABCD3E071D980E4900273936 = { - LastSwiftMigration = 1020; - }; - ABCD3E271D980E5500273936 = { - LastSwiftMigration = 1020; - }; - }; - }; - buildConfigurationList = ABCBFD321D96E41D00FAD37A /* Build configuration list for PBXProject "BonMot" */; - compatibilityVersion = "Xcode 11.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = ABCBFD2E1D96E41D00FAD37A; - productRefGroup = ABCBFD391D96E41D00FAD37A /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - ABC7774A1DC29F3000815FB9 /* Example-iOS */, - ABCBFD561D96E61000FAD37A /* BonMot-iOS */, - ABCBFD5E1D96E61100FAD37A /* BonMot-iOSTests */, - ABCD3DCB1D96F6A500273936 /* BonMot-tvOS */, - ABCD3DEE1D96F6E200273936 /* BonMot-tvOSTests */, - ABCD3E071D980E4900273936 /* BonMot-OSX */, - ABCD3E271D980E5500273936 /* BonMot-OSXTests */, - ABA75DCC1D99E10400B64705 /* BonMot-watchOS */, - AB8497DA1DA45B9C00FE3414 /* AllTheThings */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - ABA75DE61D99E10400B64705 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABC777491DC29F3000815FB9 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ABC777691DC29F7700815FB9 /* InfoPlist.strings in Resources */, - 526C7059268BCC86002C0C71 /* EBGaramond12-Regular.otf in Resources */, - ABC777761DC2A16E00815FB9 /* Images.xcassets in Resources */, - ABC7776F1DC2A02B00815FB9 /* Launch Screen.xib in Resources */, - ABC777701DC2A02B00815FB9 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCBFD551D96E61000FAD37A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCBFD5D1D96E61100FAD37A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 526C7056268BCC61002C0C71 /* rz-logo-red.png in Resources */, - 526C7053268BCC61002C0C71 /* rz-logo-black.png in Resources */, - AB9C18D91D9975FD00A54787 /* Images.xcassets in Resources */, - 526C7050268BCC61002C0C71 /* EBGaramond12-Regular.otf in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3DE61D96F6A500273936 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3DFF1D96F6E200273936 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 526C7057268BCC61002C0C71 /* rz-logo-red.png in Resources */, - 526C7054268BCC61002C0C71 /* rz-logo-black.png in Resources */, - AB9C18DB1D9975FD00A54787 /* Images.xcassets in Resources */, - 526C7051268BCC61002C0C71 /* EBGaramond12-Regular.otf in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3E211D980E4900273936 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3E381D980E5500273936 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 526C7058268BCC61002C0C71 /* rz-logo-red.png in Resources */, - 526C7055268BCC61002C0C71 /* rz-logo-black.png in Resources */, - AB9C18DD1D9975FE00A54787 /* Images.xcassets in Resources */, - 526C7052268BCC61002C0C71 /* EBGaramond12-Regular.otf in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - ABBD124E1DA469BB0084FBCC /* Build and test macOS */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Build and test macOS"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "xcodebuild build-for-testing test-without-building -project BonMot.xcodeproj -scheme \"BonMot-OSX\" -sdk \"macosx\" -destination \"arch=arm64\" CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\n"; - }; - CD15C4071DBE660700B6FF7A /* Build and test iOS */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Build and test iOS"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "xcodebuild build-for-testing test-without-building -project BonMot.xcodeproj -scheme \"BonMot-iOS\" -sdk \"iphonesimulator\" -destination \"name=iPhone 14\" CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\n"; - }; - CD15C4081DBE660800B6FF7A /* Build and test tvOS */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Build and test tvOS"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "xcodebuild build-for-testing test-without-building -project BonMot.xcodeproj -scheme \"BonMot-tvOS\" -sdk \"appletvsimulator\" -destination \"name=Apple TV\" CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\n"; - }; - CD15C4091DBE660A00B6FF7A /* Build watchOS */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Build watchOS"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "xcodebuild build -project BonMot.xcodeproj -scheme \"BonMot-watchOS\" -sdk \"watchsimulator\" -destination \"name=Apple Watch Series 4 - 44mm\" CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\n"; - }; - CD4B2FCC1D9B0AB0007CF808 /* SwiftLint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = SwiftLint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; - CD4B2FCD1D9B0ADF007CF808 /* SwiftLint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = SwiftLint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; - CD4B2FCE1D9B0AF2007CF808 /* SwiftLint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = SwiftLint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; - CD4B2FCF1D9B0B12007CF808 /* SwiftLint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = SwiftLint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; - CD4B2FD01D9B0B1F007CF808 /* SwiftLint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = SwiftLint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; - CD4B2FD11D9B0B2E007CF808 /* SwiftLint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = SwiftLint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; - CD4B2FD21D9B0B3D007CF808 /* SwiftLint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = SwiftLint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; - CDC513361F36B1FA00EA1712 /* Build iOS example project */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Build iOS example project"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "xcodebuild build -project BonMot.xcodeproj -scheme \"Example-iOS\" -sdk \"iphonesimulator\" -destination \"name=iPhone 14\" CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - ABA75DCD1D99E10400B64705 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ABA75DDF1D99E10400B64705 /* Compatibility.swift in Sources */, - AB30D5121D9D9439006ADC9D /* Composable.swift in Sources */, - ABA75E0D1D99E45E00B64705 /* Tracking.swift in Sources */, - CDC49D8F1F74AD8F0067FC86 /* AccessibilityHeadingLevel.swift in Sources */, - ABA75DD21D99E10400B64705 /* Platform.swift in Sources */, - AB30D50F1D9CB4FE006ADC9D /* Tab.swift in Sources */, - CD3EEE6B1DC92CF8002C41BB /* Ligatures.swift in Sources */, - ABA75DD61D99E10400B64705 /* StringStyle.swift in Sources */, - ABA75DD81D99E10400B64705 /* Special.swift in Sources */, - ABA75DD91D99E10400B64705 /* NamedStyles.swift in Sources */, - CDEA84341D9EEC390099BD73 /* Image+Tinting.swift in Sources */, - ABA75DDB1D99E10400B64705 /* StringStyle+Part.swift in Sources */, - CD6BE30D1E8590FB00FB308F /* Transform.swift in Sources */, - ABA75DDD1D99E10400B64705 /* XMLBuilder.swift in Sources */, - ABA75DDE1D99E10400B64705 /* NSAttributedString+BonMot.swift in Sources */, - CD3EEE711DCA68FB002C41BB /* FontInspector.swift in Sources */, - CDF7E9821D9C613500FF46BF /* MutableCopying.swift in Sources */, - CDCF0F221DCE5B9B00727AAE /* ContextualAlternates.swift in Sources */, - AB86628E1D9B060D00DEE3E3 /* FontFeatures.swift in Sources */, - CDB366C2203264DF002C256E /* Emphasis.swift in Sources */, - CD70C54E1DCD22A7003C063A /* StylisticAlternates.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABC777471DC29F3000815FB9 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ABC7776C1DC29F7700815FB9 /* StyleViewController.swift in Sources */, - ABC777671DC29F7700815FB9 /* DemoStrings.swift in Sources */, - ABC777661DC29F7700815FB9 /* CatalogViewController.swift in Sources */, - ABC7774E1DC29F3000815FB9 /* AppDelegate.swift in Sources */, - ABC777741DC2A12600815FB9 /* Compatibility+Tests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCBFD521D96E61000FAD37A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ABCD3D6E1D96F02F00273936 /* Compatibility.swift in Sources */, - ABCD3D7A1D96F02F00273936 /* AdaptiveStyleTransformation.swift in Sources */, - CDB366BC20325AE1002C256E /* Emphasis.swift in Sources */, - ABCD3D7F1D96F02F00273936 /* UIKit+AdaptableTextContainerSupport.swift in Sources */, - AB30D4FF1D9C1EEC006ADC9D /* Composable.swift in Sources */, - ABCD3D791D96F02F00273936 /* AdaptiveStyle.swift in Sources */, - CD3EEE6E1DCA68ED002C41BB /* FontInspector.swift in Sources */, - ABCD3D711D96F02F00273936 /* Platform.swift in Sources */, - CDF7E97F1D9C612800FF46BF /* MutableCopying.swift in Sources */, - AB560A0A1DA0C17800100D15 /* Tracking+Adaptive.swift in Sources */, - ABCD3D7D1D96F02F00273936 /* StyleableUIElement.swift in Sources */, - ABCD3D771D96F02F00273936 /* AdaptableTextContainer.swift in Sources */, - CDC49D8D1F74AD8F0067FC86 /* AccessibilityHeadingLevel.swift in Sources */, - ABCD3D6B1D96F02F00273936 /* StringStyle.swift in Sources */, - CD70C5511DCD22A9003C063A /* StylisticAlternates.swift in Sources */, - ABCD3D731D96F02F00273936 /* Special.swift in Sources */, - ABCD3D761D96F02F00273936 /* NamedStyles.swift in Sources */, - AB560A081DA0C14000100D15 /* Tab+Adaptive.swift in Sources */, - CDCF0F1F1DCE5B9B00727AAE /* ContextualAlternates.swift in Sources */, - ABA75E0A1D99E43300B64705 /* Tracking.swift in Sources */, - ABCD3D6C1D96F02F00273936 /* StringStyle+Part.swift in Sources */, - ABCD3D801D96F02F00273936 /* UIKit+Helpers.swift in Sources */, - CD3EEE681DC92CF6002C41BB /* Ligatures.swift in Sources */, - ABCD3D811D96F02F00273936 /* XMLBuilder.swift in Sources */, - ABCD3D701D96F02F00273936 /* NSAttributedString+BonMot.swift in Sources */, - AB560A061D9F692000100D15 /* AttributedStringTransformation.swift in Sources */, - CD6BE30A1E8590F900FB308F /* Transform.swift in Sources */, - AB30D51D1D9D95F5006ADC9D /* EmbeddedTransformation.swift in Sources */, - ABCD3D7C1D96F02F00273936 /* NSAttributedString+Adaptive.swift in Sources */, - ABCD3D6F1D96F02F00273936 /* FontFeatures.swift in Sources */, - AB30D50C1D9CB4FE006ADC9D /* Tab.swift in Sources */, - CDEA84311D9EEC390099BD73 /* Image+Tinting.swift in Sources */, - 1E7B10EC1DA41F9300C668A4 /* TextAlignmentConstraint.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCBFD5B1D96E61100FAD37A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ABCD3DB31D96F06800273936 /* Compatibility+Tests.swift in Sources */, - CDC0CE361F90730700E144F7 /* AccessTests.swift in Sources */, - ABCD3DBB1D96F06800273936 /* UIKitBehaviorTests.swift in Sources */, - CD3EEE731DCA6BCB002C41BB /* FontInspectorTests.swift in Sources */, - CDB366C620326FCD002C256E /* EmphasisTests.swift in Sources */, - CD6BE30F1E85924800FB308F /* TransformTests.swift in Sources */, - ABCD3DB01D96F06800273936 /* AdaptiveStyleTests.swift in Sources */, - ABCD3DBD1D96F06800273936 /* XMLTagStyleBuilderTests.swift in Sources */, - ABCD3DB61D96F06800273936 /* NSAttributedStringDebugTests.swift in Sources */, - ABCD3DB11D96F06800273936 /* AssertHelpers.swift in Sources */, - 1E902AB41DA6915F00BD154D /* TextAlignmentConstraintTests.swift in Sources */, - ABCD3DBA1D96F06800273936 /* BONFontBehaviorTests.swift in Sources */, - ABCD3DB51D96F06800273936 /* ComposableTests.swift in Sources */, - ABCD3DBC1D96F06800273936 /* UIKitBonMotTests.swift in Sources */, - CDEA84361D9EEC490099BD73 /* ImageTintingTests.swift in Sources */, - ABCD3DB41D96F06800273936 /* Helpers.swift in Sources */, - ABCD3DB21D96F06800273936 /* AttributedStringStyleTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3DCC1D96F6A500273936 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ABCD3DDE1D96F6A500273936 /* Compatibility.swift in Sources */, - ABCD3DCE1D96F6A500273936 /* UIKit+AdaptableTextContainerSupport.swift in Sources */, - CDB366BD20325AE1002C256E /* Emphasis.swift in Sources */, - ABCD3DD11D96F6A500273936 /* Platform.swift in Sources */, - CDF7E9801D9C613100FF46BF /* MutableCopying.swift in Sources */, - ABCD3DD31D96F6A500273936 /* StyleableUIElement.swift in Sources */, - CD3EEE6F1DCA68ED002C41BB /* FontInspector.swift in Sources */, - AB30D5101D9D9438006ADC9D /* Composable.swift in Sources */, - ABCD3DD41D96F6A500273936 /* AdaptableTextContainer.swift in Sources */, - AB8497B61DA16DAE00FE3414 /* Tracking+Adaptive.swift in Sources */, - ABCD3DD51D96F6A500273936 /* StringStyle.swift in Sources */, - ABCD3DD71D96F6A500273936 /* Special.swift in Sources */, - CDC49D8E1F74AD8F0067FC86 /* AccessibilityHeadingLevel.swift in Sources */, - AB8497B31DA16DAE00FE3414 /* EmbeddedTransformation.swift in Sources */, - CD70C5501DCD22A8003C063A /* StylisticAlternates.swift in Sources */, - AB8497B21DA16DAE00FE3414 /* AttributedStringTransformation.swift in Sources */, - ABCD3DD81D96F6A500273936 /* NamedStyles.swift in Sources */, - AB8497B11DA16DAE00FE3414 /* AdaptiveStyleTransformation.swift in Sources */, - CDCF0F201DCE5B9B00727AAE /* ContextualAlternates.swift in Sources */, - AB8497B51DA16DAE00FE3414 /* Tab+Adaptive.swift in Sources */, - ABA75E0B1D99E45C00B64705 /* Tracking.swift in Sources */, - ABCD3DDA1D96F6A500273936 /* StringStyle+Part.swift in Sources */, - CD3EEE691DC92CF6002C41BB /* Ligatures.swift in Sources */, - ABCD3DDB1D96F6A500273936 /* UIKit+Helpers.swift in Sources */, - ABCD3DDC1D96F6A500273936 /* XMLBuilder.swift in Sources */, - AB8497B01DA16DAE00FE3414 /* NSAttributedString+Adaptive.swift in Sources */, - CD6BE30B1E8590FA00FB308F /* Transform.swift in Sources */, - ABCD3DDD1D96F6A500273936 /* NSAttributedString+BonMot.swift in Sources */, - AB8497B41DA16DAE00FE3414 /* AdaptiveStyle.swift in Sources */, - AB30D50D1D9CB4FE006ADC9D /* Tab.swift in Sources */, - ABCD3DE21D96F6A500273936 /* FontFeatures.swift in Sources */, - CDEA84321D9EEC390099BD73 /* Image+Tinting.swift in Sources */, - 1E7B10ED1DA41F9300C668A4 /* TextAlignmentConstraint.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3DF11D96F6E200273936 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ABCD3DF21D96F6E200273936 /* Compatibility+Tests.swift in Sources */, - CDC0CE371F90730700E144F7 /* AccessTests.swift in Sources */, - ABCD3DF31D96F6E200273936 /* UIKitBehaviorTests.swift in Sources */, - CD3EEE741DCA6BCB002C41BB /* FontInspectorTests.swift in Sources */, - CDB366C720326FCE002C256E /* EmphasisTests.swift in Sources */, - CD6BE3101E85924800FB308F /* TransformTests.swift in Sources */, - ABCD3DF41D96F6E200273936 /* AdaptiveStyleTests.swift in Sources */, - ABCD3DF51D96F6E200273936 /* XMLTagStyleBuilderTests.swift in Sources */, - ABCD3DF61D96F6E200273936 /* NSAttributedStringDebugTests.swift in Sources */, - ABCD3DF71D96F6E200273936 /* AssertHelpers.swift in Sources */, - 1E902AB51DA6915F00BD154D /* TextAlignmentConstraintTests.swift in Sources */, - ABCD3DF81D96F6E200273936 /* BONFontBehaviorTests.swift in Sources */, - ABCD3DF91D96F6E200273936 /* ComposableTests.swift in Sources */, - ABCD3DFA1D96F6E200273936 /* UIKitBonMotTests.swift in Sources */, - CDEA84371D9EEC490099BD73 /* ImageTintingTests.swift in Sources */, - ABCD3DFB1D96F6E200273936 /* Helpers.swift in Sources */, - ABCD3DFC1D96F6E200273936 /* AttributedStringStyleTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3E081D980E4900273936 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ABCD3E1A1D980E4900273936 /* Compatibility.swift in Sources */, - AB30D5111D9D9438006ADC9D /* Composable.swift in Sources */, - ABA75E0E1D99F9D500B64705 /* Tracking.swift in Sources */, - CD6BE30C1E8590FA00FB308F /* Transform.swift in Sources */, - 1E7B10EE1DA41F9300C668A4 /* TextAlignmentConstraint.swift in Sources */, - CDCF0F211DCE5B9B00727AAE /* ContextualAlternates.swift in Sources */, - ABCD3E0D1D980E4900273936 /* Platform.swift in Sources */, - AB30D50E1D9CB4FE006ADC9D /* Tab.swift in Sources */, - ABCD3E111D980E4900273936 /* StringStyle.swift in Sources */, - ABCD3E131D980E4900273936 /* Special.swift in Sources */, - CD3EEE701DCA68EF002C41BB /* FontInspector.swift in Sources */, - ABCD3E141D980E4900273936 /* NamedStyles.swift in Sources */, - CD70C54F1DCD22A8003C063A /* StylisticAlternates.swift in Sources */, - CDEA84331D9EEC390099BD73 /* Image+Tinting.swift in Sources */, - ABCD3E161D980E4900273936 /* StringStyle+Part.swift in Sources */, - CD3EEE6A1DC92CF7002C41BB /* Ligatures.swift in Sources */, - ABCD3E181D980E4900273936 /* XMLBuilder.swift in Sources */, - ABCD3E191D980E4900273936 /* NSAttributedString+BonMot.swift in Sources */, - CDF7E9811D9C613400FF46BF /* MutableCopying.swift in Sources */, - CDB366C1203264DE002C256E /* Emphasis.swift in Sources */, - ABCD3E1D1D980E4900273936 /* FontFeatures.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ABCD3E2A1D980E5500273936 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ABCD3E2B1D980E5500273936 /* Compatibility+Tests.swift in Sources */, - CDB366C820326FCE002C256E /* EmphasisTests.swift in Sources */, - ABCD3E2E1D980E5500273936 /* XMLTagStyleBuilderTests.swift in Sources */, - ABCD3E2F1D980E5500273936 /* NSAttributedStringDebugTests.swift in Sources */, - CDC0CE381F90730700E144F7 /* AccessTests.swift in Sources */, - AB6633091DA5C5F90007F301 /* BONFontBehaviorTests.swift in Sources */, - ABCD3E301D980E5500273936 /* AssertHelpers.swift in Sources */, - CD3EEE751DCA6BCB002C41BB /* FontInspectorTests.swift in Sources */, - CD6BE3111E85924800FB308F /* TransformTests.swift in Sources */, - ABCD3E321D980E5500273936 /* ComposableTests.swift in Sources */, - CDEA84381D9EEC490099BD73 /* ImageTintingTests.swift in Sources */, - 1E902AB61DA6915F00BD154D /* TextAlignmentConstraintTests.swift in Sources */, - ABCD3E341D980E5500273936 /* Helpers.swift in Sources */, - ABCD3E351D980E5500273936 /* AttributedStringStyleTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - AB9C18CE1D9965A900A54787 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = ABCD3E071D980E4900273936 /* BonMot-OSX */; - targetProxy = AB9C18CD1D9965A900A54787 /* PBXContainerItemProxy */; - }; - AB9C18D01D9965B100A54787 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = ABCD3DCB1D96F6A500273936 /* BonMot-tvOS */; - targetProxy = AB9C18CF1D9965B100A54787 /* PBXContainerItemProxy */; - }; - ABCBFD621D96E61100FAD37A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = ABCBFD561D96E61000FAD37A /* BonMot-iOS */; - targetProxy = ABCBFD611D96E61100FAD37A /* PBXContainerItemProxy */; - }; - CDE292991E15D55600EA4A32 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = ABCBFD561D96E61000FAD37A /* BonMot-iOS */; - targetProxy = CDE292981E15D55600EA4A32 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - ABC777611DC29F7700815FB9 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - ABC777621DC29F7700815FB9 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - AB8497DB1DA45B9C00FE3414 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEAD_CODE_STRIPPING = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - AB8497DC1DA45B9C00FE3414 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEAD_CODE_STRIPPING = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - ABA75DE81D99E10400B64705 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - INFOPLIST_FILE = Sources/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-watchOS"; - PRODUCT_NAME = BonMot; - SDKROOT = watchos; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - ABA75DE91D99E10400B64705 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - INFOPLIST_FILE = Sources/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-watchOS"; - PRODUCT_NAME = BonMot; - SDKROOT = watchos; - SKIP_INSTALL = YES; - }; - name = Release; - }; - ABC7775A1DC29F3000815FB9 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = "Example-iOS/Example-iOS.entitlements"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = "Example-iOS/Resources/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.Example-iOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SUPPORTS_MACCATALYST = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - ABC7775B1DC29F3000815FB9 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = "Example-iOS/Example-iOS.entitlements"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = "Example-iOS/Resources/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.Example-iOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SUPPORTS_MACCATALYST = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - ABCBFD4A1D96E41D00FAD37A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_ASSET_SYMBOLS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_SUSPICIOUS_MOVES = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_SHADOW = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 12.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 4.0; - }; - name = Debug; - }; - ABCBFD4B1D96E41D00FAD37A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_ASSET_SYMBOLS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_SUSPICIOUS_MOVES = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_SHADOW = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 12.0; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 4.0; - }; - name = Release; - }; - ABCBFD691D96E61100FAD37A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - INFOPLIST_FILE = Sources/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-iOS"; - PRODUCT_NAME = BonMot; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - ABCBFD6A1D96E61100FAD37A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - INFOPLIST_FILE = Sources/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-iOS"; - PRODUCT_NAME = BonMot; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - ABCBFD6C1D96E61100FAD37A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-iOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - }; - name = Debug; - }; - ABCBFD6D1D96E61100FAD37A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-iOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - }; - name = Release; - }; - ABCD3DEA1D96F6A500273936 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - INFOPLIST_FILE = Sources/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-tvOS"; - PRODUCT_NAME = BonMot; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - ABCD3DEB1D96F6A500273936 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - INFOPLIST_FILE = Sources/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-tvOS"; - PRODUCT_NAME = BonMot; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - }; - name = Release; - }; - ABCD3E031D96F6E200273936 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - }; - name = Debug; - }; - ABCD3E041D96F6E200273936 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - }; - name = Release; - }; - ABCD3E231D980E4900273936 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - COMBINE_HIDPI_IMAGES = YES; - DEAD_CODE_STRIPPING = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - INFOPLIST_FILE = Sources/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-OSX"; - PRODUCT_NAME = BonMot; - SDKROOT = macosx; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - ABCD3E241D980E4900273936 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - COMBINE_HIDPI_IMAGES = YES; - DEAD_CODE_STRIPPING = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - INFOPLIST_FILE = Sources/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-OSX"; - PRODUCT_NAME = BonMot; - SDKROOT = macosx; - SKIP_INSTALL = YES; - }; - name = Release; - }; - ABCD3E3C1D980E5500273936 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - DEAD_CODE_STRIPPING = YES; - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-OSXTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - ABCD3E3D1D980E5500273936 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - DEAD_CODE_STRIPPING = YES; - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.rightpoint.BonMot-OSXTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - AB8497DD1DA45B9C00FE3414 /* Build configuration list for PBXAggregateTarget "AllTheThings" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AB8497DB1DA45B9C00FE3414 /* Debug */, - AB8497DC1DA45B9C00FE3414 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - ABA75DE71D99E10400B64705 /* Build configuration list for PBXNativeTarget "BonMot-watchOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - ABA75DE81D99E10400B64705 /* Debug */, - ABA75DE91D99E10400B64705 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - ABC7775C1DC29F3000815FB9 /* Build configuration list for PBXNativeTarget "Example-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - ABC7775A1DC29F3000815FB9 /* Debug */, - ABC7775B1DC29F3000815FB9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - ABCBFD321D96E41D00FAD37A /* Build configuration list for PBXProject "BonMot" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - ABCBFD4A1D96E41D00FAD37A /* Debug */, - ABCBFD4B1D96E41D00FAD37A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - ABCBFD681D96E61100FAD37A /* Build configuration list for PBXNativeTarget "BonMot-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - ABCBFD691D96E61100FAD37A /* Debug */, - ABCBFD6A1D96E61100FAD37A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - ABCBFD6B1D96E61100FAD37A /* Build configuration list for PBXNativeTarget "BonMot-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - ABCBFD6C1D96E61100FAD37A /* Debug */, - ABCBFD6D1D96E61100FAD37A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - ABCD3DE91D96F6A500273936 /* Build configuration list for PBXNativeTarget "BonMot-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - ABCD3DEA1D96F6A500273936 /* Debug */, - ABCD3DEB1D96F6A500273936 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - ABCD3E021D96F6E200273936 /* Build configuration list for PBXNativeTarget "BonMot-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - ABCD3E031D96F6E200273936 /* Debug */, - ABCD3E041D96F6E200273936 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - ABCD3E221D980E4900273936 /* Build configuration list for PBXNativeTarget "BonMot-OSX" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - ABCD3E231D980E4900273936 /* Debug */, - ABCD3E241D980E4900273936 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - ABCD3E3B1D980E5500273936 /* Build configuration list for PBXNativeTarget "BonMot-OSXTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - ABCD3E3C1D980E5500273936 /* Debug */, - ABCD3E3D1D980E5500273936 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = ABCBFD2F1D96E41D00FAD37A /* Project object */; -} diff --git a/BonMot.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/BonMot.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index fe1aa713..00000000 --- a/BonMot.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/BonMot.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/BonMot.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/BonMot.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/BonMot.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/BonMot.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index a72dc2b4..00000000 --- a/BonMot.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded - - - \ No newline at end of file diff --git a/BonMot.xcodeproj/xcshareddata/xcschemes/AllTheThings.xcscheme b/BonMot.xcodeproj/xcshareddata/xcschemes/AllTheThings.xcscheme deleted file mode 100644 index 5c65d6bd..00000000 --- a/BonMot.xcodeproj/xcshareddata/xcschemes/AllTheThings.xcscheme +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-OSX.xcscheme b/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-OSX.xcscheme deleted file mode 100644 index 67774da4..00000000 --- a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-OSX.xcscheme +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-OSXTests.xcscheme b/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-OSXTests.xcscheme deleted file mode 100644 index ff8b0ce7..00000000 --- a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-OSXTests.xcscheme +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-iOS.xcscheme b/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-iOS.xcscheme deleted file mode 100644 index f16be553..00000000 --- a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-iOS.xcscheme +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-iOSTests.xcscheme b/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-iOSTests.xcscheme deleted file mode 100644 index 500c71bf..00000000 --- a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-iOSTests.xcscheme +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-tvOS.xcscheme b/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-tvOS.xcscheme deleted file mode 100644 index b0739f5e..00000000 --- a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-tvOS.xcscheme +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-tvOSTests.xcscheme b/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-tvOSTests.xcscheme deleted file mode 100644 index 4105a311..00000000 --- a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-tvOSTests.xcscheme +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-watchOS.xcscheme b/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-watchOS.xcscheme deleted file mode 100644 index b5953e7d..00000000 --- a/BonMot.xcodeproj/xcshareddata/xcschemes/BonMot-watchOS.xcscheme +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BonMot.xcodeproj/xcshareddata/xcschemes/Example-iOS.xcscheme b/BonMot.xcodeproj/xcshareddata/xcschemes/Example-iOS.xcscheme deleted file mode 100644 index 810cb8a3..00000000 --- a/BonMot.xcodeproj/xcshareddata/xcschemes/Example-iOS.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example-iOS/AppDelegate.swift b/Example/AppDelegate.swift similarity index 100% rename from Example-iOS/AppDelegate.swift rename to Example/AppDelegate.swift diff --git a/Example-iOS/CatalogViewController.swift b/Example/CatalogViewController.swift similarity index 100% rename from Example-iOS/CatalogViewController.swift rename to Example/CatalogViewController.swift diff --git a/Example-iOS/DemoStrings.swift b/Example/DemoStrings.swift similarity index 99% rename from Example-iOS/DemoStrings.swift rename to Example/DemoStrings.swift index 5fc87488..8c05f603 100644 --- a/Example-iOS/DemoStrings.swift +++ b/Example/DemoStrings.swift @@ -445,7 +445,7 @@ extension DemoStrings { /// - Parameter theIdentifier: The identifier of the storyboard in question. /// - Returns: A string style that contains the extra storyboard attribute. static func customStoryboard(identifier theIdentifier: String) -> StringStyle { - return StringStyle(.extraAttributes(["Storyboard": theIdentifier])) + return StringStyle(.extraAttributes([NSAttributedString.Key("Storyboard"): theIdentifier])) } } diff --git a/Example-iOS/Example-iOS.entitlements b/Example/Example-iOS.entitlements similarity index 100% rename from Example-iOS/Example-iOS.entitlements rename to Example/Example-iOS.entitlements diff --git a/Example-iOS/Resources/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/Resources/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/AppIcon.appiconset/Contents.json rename to Example/Resources/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/BonMot-logo.imageset/BonMot-logo.pdf b/Example/Resources/Images.xcassets/BonMot-logo.imageset/BonMot-logo.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/BonMot-logo.imageset/BonMot-logo.pdf rename to Example/Resources/Images.xcassets/BonMot-logo.imageset/BonMot-logo.pdf diff --git a/Example-iOS/Resources/Images.xcassets/BonMot-logo.imageset/Contents.json b/Example/Resources/Images.xcassets/BonMot-logo.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/BonMot-logo.imageset/Contents.json rename to Example/Resources/Images.xcassets/BonMot-logo.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/Contents.json b/Example/Resources/Images.xcassets/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/Contents.json rename to Example/Resources/Images.xcassets/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json b/Example/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json rename to Example/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/Tennis Racket.imageset/Contents.json b/Example/Resources/Images.xcassets/Tennis Racket.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/Tennis Racket.imageset/Contents.json rename to Example/Resources/Images.xcassets/Tennis Racket.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/Tennis Racket.imageset/Tennis Racket.pdf b/Example/Resources/Images.xcassets/Tennis Racket.imageset/Tennis Racket.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/Tennis Racket.imageset/Tennis Racket.pdf rename to Example/Resources/Images.xcassets/Tennis Racket.imageset/Tennis Racket.pdf diff --git a/Example-iOS/Resources/Images.xcassets/barn.imageset/Contents.json b/Example/Resources/Images.xcassets/barn.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/barn.imageset/Contents.json rename to Example/Resources/Images.xcassets/barn.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/barn.imageset/barn.pdf b/Example/Resources/Images.xcassets/barn.imageset/barn.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/barn.imageset/barn.pdf rename to Example/Resources/Images.xcassets/barn.imageset/barn.pdf diff --git a/Example-iOS/Resources/Images.xcassets/bee.imageset/Contents.json b/Example/Resources/Images.xcassets/bee.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/bee.imageset/Contents.json rename to Example/Resources/Images.xcassets/bee.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/bee.imageset/bee.pdf b/Example/Resources/Images.xcassets/bee.imageset/bee.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/bee.imageset/bee.pdf rename to Example/Resources/Images.xcassets/bee.imageset/bee.pdf diff --git a/Example-iOS/Resources/Images.xcassets/boat.imageset/Contents.json b/Example/Resources/Images.xcassets/boat.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/boat.imageset/Contents.json rename to Example/Resources/Images.xcassets/boat.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/boat.imageset/boat.pdf b/Example/Resources/Images.xcassets/boat.imageset/boat.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/boat.imageset/boat.pdf rename to Example/Resources/Images.xcassets/boat.imageset/boat.pdf diff --git a/Example-iOS/Resources/Images.xcassets/bug.imageset/Contents.json b/Example/Resources/Images.xcassets/bug.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/bug.imageset/Contents.json rename to Example/Resources/Images.xcassets/bug.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/bug.imageset/bug.pdf b/Example/Resources/Images.xcassets/bug.imageset/bug.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/bug.imageset/bug.pdf rename to Example/Resources/Images.xcassets/bug.imageset/bug.pdf diff --git a/Example-iOS/Resources/Images.xcassets/circuit.imageset/Contents.json b/Example/Resources/Images.xcassets/circuit.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/circuit.imageset/Contents.json rename to Example/Resources/Images.xcassets/circuit.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/circuit.imageset/circuit.pdf b/Example/Resources/Images.xcassets/circuit.imageset/circuit.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/circuit.imageset/circuit.pdf rename to Example/Resources/Images.xcassets/circuit.imageset/circuit.pdf diff --git a/Example-iOS/Resources/Images.xcassets/cut.imageset/Contents.json b/Example/Resources/Images.xcassets/cut.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/cut.imageset/Contents.json rename to Example/Resources/Images.xcassets/cut.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/cut.imageset/cut.pdf b/Example/Resources/Images.xcassets/cut.imageset/cut.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/cut.imageset/cut.pdf rename to Example/Resources/Images.xcassets/cut.imageset/cut.pdf diff --git a/Example-iOS/Resources/Images.xcassets/discount.imageset/Contents.json b/Example/Resources/Images.xcassets/discount.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/discount.imageset/Contents.json rename to Example/Resources/Images.xcassets/discount.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/discount.imageset/discount.pdf b/Example/Resources/Images.xcassets/discount.imageset/discount.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/discount.imageset/discount.pdf rename to Example/Resources/Images.xcassets/discount.imageset/discount.pdf diff --git a/Example-iOS/Resources/Images.xcassets/gift.imageset/Contents.json b/Example/Resources/Images.xcassets/gift.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/gift.imageset/Contents.json rename to Example/Resources/Images.xcassets/gift.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/gift.imageset/gift.pdf b/Example/Resources/Images.xcassets/gift.imageset/gift.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/gift.imageset/gift.pdf rename to Example/Resources/Images.xcassets/gift.imageset/gift.pdf diff --git a/Example-iOS/Resources/Images.xcassets/knot.imageset/Contents.json b/Example/Resources/Images.xcassets/knot.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/knot.imageset/Contents.json rename to Example/Resources/Images.xcassets/knot.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/knot.imageset/knot.pdf b/Example/Resources/Images.xcassets/knot.imageset/knot.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/knot.imageset/knot.pdf rename to Example/Resources/Images.xcassets/knot.imageset/knot.pdf diff --git a/Example-iOS/Resources/Images.xcassets/oar.imageset/Contents.json b/Example/Resources/Images.xcassets/oar.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/oar.imageset/Contents.json rename to Example/Resources/Images.xcassets/oar.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/oar.imageset/oar.pdf b/Example/Resources/Images.xcassets/oar.imageset/oar.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/oar.imageset/oar.pdf rename to Example/Resources/Images.xcassets/oar.imageset/oar.pdf diff --git a/Example-iOS/Resources/Images.xcassets/pin.imageset/Contents.json b/Example/Resources/Images.xcassets/pin.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/pin.imageset/Contents.json rename to Example/Resources/Images.xcassets/pin.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/pin.imageset/pin.pdf b/Example/Resources/Images.xcassets/pin.imageset/pin.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/pin.imageset/pin.pdf rename to Example/Resources/Images.xcassets/pin.imageset/pin.pdf diff --git a/Example-iOS/Resources/Images.xcassets/robot.imageset/Contents.json b/Example/Resources/Images.xcassets/robot.imageset/Contents.json similarity index 100% rename from Example-iOS/Resources/Images.xcassets/robot.imageset/Contents.json rename to Example/Resources/Images.xcassets/robot.imageset/Contents.json diff --git a/Example-iOS/Resources/Images.xcassets/robot.imageset/robot.pdf b/Example/Resources/Images.xcassets/robot.imageset/robot.pdf similarity index 100% rename from Example-iOS/Resources/Images.xcassets/robot.imageset/robot.pdf rename to Example/Resources/Images.xcassets/robot.imageset/robot.pdf diff --git a/Example-iOS/Resources/Info.plist b/Example/Resources/Info.plist similarity index 100% rename from Example-iOS/Resources/Info.plist rename to Example/Resources/Info.plist diff --git a/Example-iOS/Resources/Launch Screen.xib b/Example/Resources/Launch Screen.xib similarity index 100% rename from Example-iOS/Resources/Launch Screen.xib rename to Example/Resources/Launch Screen.xib diff --git a/Example-iOS/Resources/Main.storyboard b/Example/Resources/Main.storyboard similarity index 100% rename from Example-iOS/Resources/Main.storyboard rename to Example/Resources/Main.storyboard diff --git a/Example-iOS/Resources/en.lproj/InfoPlist.strings b/Example/Resources/en.lproj/InfoPlist.strings similarity index 100% rename from Example-iOS/Resources/en.lproj/InfoPlist.strings rename to Example/Resources/en.lproj/InfoPlist.strings diff --git a/Example-iOS/StyleViewController.swift b/Example/StyleViewController.swift similarity index 89% rename from Example-iOS/StyleViewController.swift rename to Example/StyleViewController.swift index 0b77e642..be6e770e 100644 --- a/Example-iOS/StyleViewController.swift +++ b/Example/StyleViewController.swift @@ -52,13 +52,13 @@ class StyleViewController: UITableViewController { } let attributedText = styles[indexPath.section].1[indexPath.row] cell.titleLabel?.attributedText = attributedText.adapted(to: traitCollection) - cell.accessoryType = attributedText.attribute("Storyboard", at: 0, effectiveRange: nil) == nil ? .none : .disclosureIndicator + cell.accessoryType = attributedText.attribute(NSAttributedString.Key("Storyboard"), at: 0, effectiveRange: nil) == nil ? .none : .disclosureIndicator return cell } override func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool { let attributedText = styles[indexPath.section].1[indexPath.row] - if attributedText.attribute("Storyboard", at: 0, effectiveRange: nil) is String { + if attributedText.attribute(NSAttributedString.Key("Storyboard"), at: 0, effectiveRange: nil) is String { return true } return false @@ -66,7 +66,7 @@ class StyleViewController: UITableViewController { func selectRow(at indexPath: IndexPath) { let attributedText = styles[indexPath.section].1[indexPath.row] - if let storyboardIdentifier = attributedText.attribute("Storyboard", at: 0, effectiveRange: nil) as? String { + if let storyboardIdentifier = attributedText.attribute(NSAttributedString.Key("Storyboard"), at: 0, effectiveRange: nil) as? String { guard let nextVC = storyboard?.instantiateViewController(withIdentifier: storyboardIdentifier) else { fatalError("No Storyboard identifier \(storyboardIdentifier)") } diff --git a/Gemfile b/Gemfile index 43dea460..5f6889ca 100644 --- a/Gemfile +++ b/Gemfile @@ -1,10 +1,6 @@ source 'https://rubygems.org' -gem 'abbrev' # added this because a warning told me to. It is a dependency of highline which is a dependency of something else, maybe fastlane? gem 'cocoapods' -gem 'fastlane' -gem 'nkf' # added this because a warning told me to. It is a dependency of CFPropertyList which is a dependency of something else, maybe fastlane? -gem 'xcpretty' plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') eval_gemfile(plugins_path) if File.exist?(plugins_path) diff --git a/Gemfile.lock b/Gemfile.lock index 8f5ab679..f1b4d29c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,7 +3,6 @@ GEM specs: CFPropertyList (3.0.6) rexml - abbrev (0.1.2) activesupport (7.1.2) base64 bigdecimal @@ -19,25 +18,7 @@ GEM algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) - artifactory (3.0.15) atomos (0.1.3) - aws-eventstream (1.3.0) - aws-partitions (1.873.0) - aws-sdk-core (3.190.1) - aws-eventstream (~> 1, >= 1.3.0) - aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.8) - jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.75.0) - aws-sdk-core (~> 3, >= 3.188.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.142.0) - aws-sdk-core (~> 3, >= 3.189.0) - aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.8) - aws-sigv4 (1.8.0) - aws-eventstream (~> 1, >= 1.0.2) - babosa (1.0.4) base64 (0.2.0) bigdecimal (3.1.5) claide (1.1.0) @@ -78,196 +59,36 @@ GEM nap (>= 0.8, < 2.0) netrc (~> 0.11) cocoapods-try (1.2.0) - colored (1.2) colored2 (3.1.2) - commander (4.6.0) - highline (~> 2.0.0) concurrent-ruby (1.2.2) connection_pool (2.4.1) - declarative (0.0.20) - digest-crc (0.6.5) - rake (>= 12.0.0, < 14.0.0) - domain_name (0.6.20231109) - dotenv (2.8.1) drb (2.2.0) ruby2_keywords - emoji_regex (3.2.3) escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - excon (0.108.0) - faraday (1.10.3) - faraday-em_http (~> 1.0) - faraday-em_synchrony (~> 1.0) - faraday-excon (~> 1.1) - faraday-httpclient (~> 1.0) - faraday-multipart (~> 1.0) - faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.0) - faraday-patron (~> 1.0) - faraday-rack (~> 1.0) - faraday-retry (~> 1.0) - ruby2_keywords (>= 0.0.4) - faraday-cookie_jar (0.0.7) - faraday (>= 0.8.0) - http-cookie (~> 1.0.0) - faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) - faraday-excon (1.1.0) - faraday-httpclient (1.0.1) - faraday-multipart (1.0.4) - multipart-post (~> 2) - faraday-net_http (1.0.1) - faraday-net_http_persistent (1.2.0) - faraday-patron (1.0.0) - faraday-rack (1.0.0) - faraday-retry (1.0.3) - faraday_middleware (1.2.0) - faraday (~> 1.0) - fastimage (2.3.0) - fastlane (2.217.0) - CFPropertyList (>= 2.3, < 4.0.0) - addressable (>= 2.8, < 3.0.0) - artifactory (~> 3.0) - aws-sdk-s3 (~> 1.0) - babosa (>= 1.0.3, < 2.0.0) - bundler (>= 1.12.0, < 3.0.0) - colored - commander (~> 4.6) - dotenv (>= 2.1.1, < 3.0.0) - emoji_regex (>= 0.1, < 4.0) - excon (>= 0.71.0, < 1.0.0) - faraday (~> 1.0) - faraday-cookie_jar (~> 0.0.6) - faraday_middleware (~> 1.0) - fastimage (>= 2.1.0, < 3.0.0) - gh_inspector (>= 1.1.2, < 2.0.0) - google-apis-androidpublisher_v3 (~> 0.3) - google-apis-playcustomapp_v1 (~> 0.1) - google-cloud-storage (~> 1.31) - highline (~> 2.0) - http-cookie (~> 1.0.5) - json (< 3.0.0) - jwt (>= 2.1.0, < 3) - mini_magick (>= 4.9.4, < 5.0.0) - multipart-post (>= 2.0.0, < 3.0.0) - naturally (~> 2.2) - optparse (~> 0.1.1) - plist (>= 3.1.0, < 4.0.0) - rubyzip (>= 2.0.0, < 3.0.0) - security (= 0.1.3) - simctl (~> 1.6.3) - terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (~> 3) - tty-screen (>= 0.6.3, < 1.0.0) - tty-spinner (>= 0.8.0, < 1.0.0) - word_wrap (~> 1.0.0) - xcodeproj (>= 1.13.0, < 2.0.0) - xcpretty (~> 0.3.0) - xcpretty-travis-formatter (>= 0.0.3) ffi (1.16.3) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.54.0) - google-apis-core (>= 0.11.0, < 2.a) - google-apis-core (0.11.2) - addressable (~> 2.5, >= 2.5.1) - googleauth (>= 0.16.2, < 2.a) - httpclient (>= 2.8.1, < 3.a) - mini_mime (~> 1.0) - representable (~> 3.0) - retriable (>= 2.0, < 4.a) - rexml - webrick - google-apis-iamcredentials_v1 (0.17.0) - google-apis-core (>= 0.11.0, < 2.a) - google-apis-playcustomapp_v1 (0.13.0) - google-apis-core (>= 0.11.0, < 2.a) - google-apis-storage_v1 (0.29.0) - google-apis-core (>= 0.11.0, < 2.a) - google-cloud-core (1.6.1) - google-cloud-env (>= 1.0, < 3.a) - google-cloud-errors (~> 1.0) - google-cloud-env (2.1.0) - faraday (>= 1.0, < 3.a) - google-cloud-errors (1.3.1) - google-cloud-storage (1.45.0) - addressable (~> 2.8) - digest-crc (~> 0.4) - google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.29.0) - google-cloud-core (~> 1.6) - googleauth (>= 0.16.2, < 2.a) - mini_mime (~> 1.0) - googleauth (1.9.1) - faraday (>= 1.0, < 3.a) - google-cloud-env (~> 2.1) - jwt (>= 1.4, < 3.0) - multi_json (~> 1.11) - os (>= 0.9, < 2.0) - signet (>= 0.16, < 2.a) - highline (2.0.3) - http-cookie (1.0.5) - domain_name (~> 0.5) httpclient (2.8.3) i18n (1.14.1) concurrent-ruby (~> 1.0) - jmespath (1.6.2) json (2.7.1) - jwt (2.7.1) - mini_magick (4.12.0) - mini_mime (1.1.5) minitest (5.20.0) molinillo (0.8.0) - multi_json (1.15.0) - multipart-post (2.3.0) mutex_m (0.2.0) nanaimo (0.3.0) nap (1.1.0) - naturally (2.2.1) netrc (0.11.0) - nkf (0.1.3) - optparse (0.1.1) - os (1.1.4) - plist (3.7.0) public_suffix (4.0.7) - rake (13.1.0) - representable (3.2.0) - declarative (< 0.1.0) - trailblazer-option (>= 0.1.1, < 0.2.0) - uber (< 0.2.0) - retriable (3.1.2) rexml (3.2.6) - rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) - rubyzip (2.3.2) - security (0.1.3) - signet (0.18.0) - addressable (~> 2.8) - faraday (>= 0.17.5, < 3.a) - jwt (>= 1.5, < 3.0) - multi_json (~> 1.10) - simctl (1.6.10) - CFPropertyList - naturally - terminal-notifier (2.0.0) - terminal-table (3.0.2) - unicode-display_width (>= 1.1.1, < 3) - trailblazer-option (0.1.2) - tty-cursor (0.7.1) - tty-screen (0.8.2) - tty-spinner (0.9.3) - tty-cursor (~> 0.7) typhoeus (1.4.1) ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - uber (0.1.0) - unicode-display_width (2.5.0) - webrick (1.8.1) - word_wrap (1.0.0) xcodeproj (1.23.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) @@ -275,20 +96,12 @@ GEM colored2 (~> 3.1) nanaimo (~> 0.3.0) rexml (~> 3.2.4) - xcpretty (0.3.0) - rouge (~> 2.0.7) - xcpretty-travis-formatter (1.0.1) - xcpretty (~> 0.2, >= 0.0.7) PLATFORMS ruby DEPENDENCIES - abbrev cocoapods - fastlane - nkf - xcpretty BUNDLED WITH 2.5.3 diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..f9d0882a --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +test_ios: + xcodebuild test -scheme BonMot -destination "platform=iOS Simulator,name=iPhone 15" | xcbeautify + +test_macos: + xcodebuild test -scheme BonMot -destination platform=macOS,arch=arm64 | xcbeautify + +test_tvos: + xcodebuild test -scheme BonMot -destination "platform=tvOS Simulator,name=Apple TV" | xcbeautify + +test_watchos: + xcodebuild test -scheme BonMot -destination "platform=watchOS Simulator,name=Apple Watch Series 9 (45mm)" | xcbeautify + +test_all: + # Platforms listed in order of convenience to run, so if there's a failure early it's easier to test. + test_macos + test_ios + test_tvos + test_watchos diff --git a/Package.swift b/Package.swift index c9bdf35f..445c05ce 100644 --- a/Package.swift +++ b/Package.swift @@ -21,18 +21,13 @@ let package = Package( name: "BonMot", dependencies: [], path: "Sources", - exclude: ["Info.plist"] + exclude: [] ), .testTarget( name: "BonMotTests", dependencies: ["BonMot"], path: "Tests", - exclude: [ - "Info.plist", - "BonMot-iOSTests.xctestplan", // *.xctestplan didn't seem to work - "BonMot-OSXTests.xctestplan", - "BonMot-tvOSTests.xctestplan", - ], + exclude: [], resources: [ .process("Resources"), ]), diff --git a/README.md b/README.md index 5ccda8bb..b0050759 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ BonMot (pronounced *Bon Mo*, French for *good word*) is a Swift attributed string library. It abstracts away the complexities of the iOS, macOS, tvOS, and watchOS typography tools, freeing you to focus on making your text beautiful. -To run the example project, run `pod try BonMot`, or clone the repo, open `BonMot.xcodeproj`, and run the **Example-iOS** target. +To run the example project, run `pod try BonMot`, or clone the repo, open `Example/BonMot.xcodeproj`, and run the **Example-iOS** target. ### AttributedString diff --git a/Sources/BonMot.h b/Sources/BonMot.h deleted file mode 100644 index 7d289696..00000000 --- a/Sources/BonMot.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// BonMot.h -// BonMot -// -// Created by Brian King on 9/24/16. -// Copyright © 2016 Rightpoint. All rights reserved. -// - -#import - -//! Project version number for BonMot. -FOUNDATION_EXPORT double BonMotVersionNumber; - -//! Project version string for BonMot. -FOUNDATION_EXPORT const unsigned char BonMotVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/Sources/Info.plist b/Sources/Info.plist deleted file mode 100644 index d3de8eef..00000000 --- a/Sources/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSPrincipalClass - - - diff --git a/Tests/AdaptiveStyleTests.swift b/Tests/AdaptiveStyleTests.swift index 9039dc74..2ba8adb1 100644 --- a/Tests/AdaptiveStyleTests.swift +++ b/Tests/AdaptiveStyleTests.swift @@ -7,12 +7,10 @@ // @testable import BonMot -#if canImport(UIKit) +#if canImport(UIKit) && (os(iOS) || os(tvOS)) import UIKit import XCTest -#if os(iOS) - @available(iOS 10.0, *) let defaultTraitCollection = UITraitCollection(preferredContentSizeCategory: UIContentSizeCategory.large) @@ -333,4 +331,3 @@ class AdaptiveStyleTests: XCTestCase { } #endif -#endif diff --git a/Tests/BonMot-OSXTests.xctestplan b/Tests/BonMot-OSXTests.xctestplan deleted file mode 100644 index d052db10..00000000 --- a/Tests/BonMot-OSXTests.xctestplan +++ /dev/null @@ -1,28 +0,0 @@ -{ - "configurations" : [ - { - "id" : "0F5DF122-0917-4A54-80A6-27400F440DC7", - "name" : "Configuration 1", - "options" : { - - } - } - ], - "defaultOptions" : { - - }, - "testTargets" : [ - { - "skippedTests" : [ - "FontInspectorTests\/testAvailableFeatures()", - "ImageTintingTests\/testImageTinting()" - ], - "target" : { - "containerPath" : "container:BonMot.xcodeproj", - "identifier" : "ABCD3E271D980E5500273936", - "name" : "BonMot-OSXTests" - } - } - ], - "version" : 1 -} diff --git a/Tests/BonMot-iOSTests.xctestplan b/Tests/BonMot-iOSTests.xctestplan deleted file mode 100644 index e391aa35..00000000 --- a/Tests/BonMot-iOSTests.xctestplan +++ /dev/null @@ -1,28 +0,0 @@ -{ - "configurations" : [ - { - "id" : "6ADF4AFA-7D8F-49C5-B1DE-DF5C0BB3F684", - "name" : "Configuration 1", - "options" : { - - } - } - ], - "defaultOptions" : { - - }, - "testTargets" : [ - { - "skippedTests" : [ - "FontInspectorTests\/testAvailableFeatures()", - "FontInspectorTests\/testHasFeature()" - ], - "target" : { - "containerPath" : "container:BonMot.xcodeproj", - "identifier" : "ABCBFD5E1D96E61100FAD37A", - "name" : "BonMot-iOSTests" - } - } - ], - "version" : 1 -} diff --git a/Tests/BonMot-tvOSTests.xctestplan b/Tests/BonMot-tvOSTests.xctestplan deleted file mode 100644 index 0d184a1b..00000000 --- a/Tests/BonMot-tvOSTests.xctestplan +++ /dev/null @@ -1,28 +0,0 @@ -{ - "configurations" : [ - { - "id" : "95BFCB18-95F2-48B0-96F1-C67F6DA0DE0C", - "name" : "Configuration 1", - "options" : { - - } - } - ], - "defaultOptions" : { - - }, - "testTargets" : [ - { - "skippedTests" : [ - "FontInspectorTests\/testAvailableFeatures()", - "FontInspectorTests\/testHasFeature()" - ], - "target" : { - "containerPath" : "container:BonMot.xcodeproj", - "identifier" : "ABCD3DEE1D96F6E200273936", - "name" : "BonMot-tvOSTests" - } - } - ], - "version" : 1 -} diff --git a/Tests/Info.plist b/Tests/Info.plist deleted file mode 100644 index 6c6c23c4..00000000 --- a/Tests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/fastlane/Fastfile b/fastlane/Fastfile deleted file mode 100644 index 13d47560..00000000 --- a/fastlane/Fastfile +++ /dev/null @@ -1,93 +0,0 @@ -# This file contains the fastlane.tools configuration -# You can find the documentation at https://docs.fastlane.tools -# -# For a list of all available actions, check out -# -# https://docs.fastlane.tools/actions -# - -# Uncomment the line if you want fastlane to automatically update itself -# update_fastlane - -# default_platform(:ios) -fastlane_version "2.93.1" - -BUILD_PATH="./build" -DERIVED_DATA_PATH = "#{BUILD_PATH}/derived_data" -PROJECT_NAME='BonMot.xcodeproj' - -desc "Tests: iOS, tvOS, macOS. Builds: watchOS." -lane :test_all do - test(scheme: "BonMot-iOS", devices: get_devices()) - test(scheme: "BonMot-OSX", destination: "platform=macOS") - test(scheme: "BonMot-tvOS") - # Unit testing is not available on watchOS - xcodebuild(scheme: "BonMot-watchOS", - derivedDataPath: DERIVED_DATA_PATH) -end - -platform :mac do - desc "Runs Tests for macOS" - lane :test_macos do - test(scheme: "BonMot-OSX", destination: "platform=macOS") - end -end - -platform :ios do - desc "Runs Tests for latest iOS" - lane :test_ios do - devices = get_devices() - test(scheme: "BonMot-iOS", - devices: devices) - end - - desc "Runs Tests for tvOS" - lane :test_tvos do - test(scheme: "BonMot-tvOS") - end - - # Tests cannot be run on watchOS - desc "Build for watchOS" - lane :build_watchos do - xcodebuild(scheme: "BonMot-watchOS", - derivedDataPath: DERIVED_DATA_PATH) - end -end - -def test(scheme:, devices: nil, destination: nil) - # NOTE: Running too many devices concurrently breaks CircleCI resource limits - disable_concurrent_testing = false - if ENV['CIRCLE_BUILD_NUM'] - disable_concurrent_testing = true - end - - xcargs = "" - if !ENV['SWIFT_VERSION'].nil? - xcargs = "SWIFT_VERSION=#{ENV['SWIFT_VERSION']}" - end - - begin - scan( - devices: devices, - destination: destination, - scheme: scheme, - xcargs: xcargs, - derived_data_path: DERIVED_DATA_PATH, - disable_concurrent_testing: disable_concurrent_testing - ) - rescue => ex - # Don't fail the entire lane when running tests, but print failure to STDERR - STDERR.puts ex - end -end - -def get_devices() - # The full list of iOS simulators available on CircleCI - # https://circleci.com/docs/2.0/testing-ios/#supported-xcode-versions - devices = [] - devices.push("iPhone SE (3rd generation)") - devices.push("iPhone 14") - devices.push("iPhone 14 Pro Max") - devices.push("iPad Pro (11-inch) (4th generation)") - devices -end diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile deleted file mode 100644 index f4b8ec74..00000000 --- a/fastlane/Pluginfile +++ /dev/null @@ -1,4 +0,0 @@ -# Autogenerated by fastlane -# -# Ensure this file is checked in to source control! - diff --git a/fastlane/README.md b/fastlane/README.md deleted file mode 100644 index 4980f499..00000000 --- a/fastlane/README.md +++ /dev/null @@ -1,72 +0,0 @@ -fastlane documentation ----- - -# Installation - -Make sure you have the latest version of the Xcode command line tools installed: - -```sh -xcode-select --install -``` - -For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) - -# Available Actions - -### test_all - -```sh -[bundle exec] fastlane test_all -``` - -Tests: iOS, tvOS, macOS. Builds: watchOS. - ----- - - -## Mac - -### mac test_macos - -```sh -[bundle exec] fastlane mac test_macos -``` - -Runs Tests for macOS - ----- - - -## iOS - -### ios test_ios - -```sh -[bundle exec] fastlane ios test_ios -``` - -Runs Tests for latest iOS - -### ios test_tvos - -```sh -[bundle exec] fastlane ios test_tvos -``` - -Runs Tests for tvOS - -### ios build_watchos - -```sh -[bundle exec] fastlane ios build_watchos -``` - -Build for watchOS - ----- - -This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. - -More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). - -The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/fastlane/actions/xchtmlreport.rb b/fastlane/actions/xchtmlreport.rb deleted file mode 100644 index a6a0430d..00000000 --- a/fastlane/actions/xchtmlreport.rb +++ /dev/null @@ -1,118 +0,0 @@ -module Fastlane - module Actions - module SharedValues - # XCHTMLREPORT_CUSTOM_VALUE = :XCHTMLREPORT_CUSTOM_VALUE - end - - class XchtmlreportAction < Action - def self.run(params) - result_bundle_path = params[:result_bundle_path] - if result_bundle_path.nil? - result_bundle_path = Scan.cache[:result_bundle_path] - end - result_bundle_paths = params[:result_bundle_paths] - if result_bundle_path and result_bundle_paths.empty? - result_bundle_paths = [result_bundle_path] - end - - if result_bundle_paths.nil? or result_bundle_paths.empty? - UI.user_error!("You must pass at least one result_bundle_path") - end - - binary_path = params[:binary_path] - - if !File.file?(binary_path) - UI.user_error!("xchtmlreport binary not installed! https://github.com/TitouanVanBelle/XCTestHTMLReport") - end - UI.message "Result bundle path: #{result_bundle_path}" - - command = "#{binary_path}" - - result_bundle_paths.each { |path| - command += " -r #{path}" - } - - if params[:enable_junit] - command += " -j" - end - - sh command - - end - - ##################################################### - # @!group Documentation - ##################################################### - - def self.description - "Xcode-like HTML report for Unit and UI Tests" - end - - def self.details - "https://github.com/TitouanVanBelle/XCTestHTMLReport" - end - - def self.available_options - # Define all options your action supports. - - # Below a few examples - [ - FastlaneCore::ConfigItem.new(key: :result_bundle_path, - description: "Path to the result bundle from scan. After running scan you can use Scan.cache[:result_bundle_path]", - conflicting_options: [:result_bundle_paths], - optional: true, - is_string: true, - conflict_block: proc do |value| - UI.user_error!("You can't use 'result_bundle_path' and 'result_bundle_paths' options in one run") - end, - verify_block: proc do |value| - UI.user_error!("Bad path to the result bundle given: #{value}") unless (value and File.directory?(value)) - end), - FastlaneCore::ConfigItem.new(key: :result_bundle_paths, - description: "Array of multiple result bundle paths from scan", - conflicting_options: [:result_bundle_path], - optional: true, - default_value: [], - type: Array, - conflict_block: proc do |value| - UI.user_error!("You can't use 'result_bundle_path' and 'result_bundle_paths' options in one run") - end, - verify_block: proc do |value| - value.each { |path| - UI.user_error!("Bad path to the result bundle given: #{path}") unless (path and File.directory?(path)) - } - end), - FastlaneCore::ConfigItem.new(key: :binary_path, - description: "Path to xchtmlreport binary", - is_string: true, # true: verifies the input is a string, false: every kind of value - default_value: "/usr/local/bin/xchtmlreport"), # the default value if the user didn't provide one - FastlaneCore::ConfigItem.new(key: :enable_junit, - type: Boolean, - default_value: false, - description: "Enables JUnit XML output 'report.junit'", - optional: true), - ] - end - - def self.output - # Define the shared values you are going to provide - # Example - # [ - # ['XCHTMLREPORT_CUSTOM_VALUE', 'A description of what this value contains'] - # ] - end - - def self.return_value - # If your method provides a return value, you can describe here what it does - end - - def self.authors - ["XCTestHTMLReport: TitouanVanBelle", "plugin: chrisballinger"] - end - - def self.is_supported?(platform) - [:ios, :mac].include?(platform) - end - end - end -end From 64c8dedeb82b9ac8e23ef5a7c410e3fb9ec84b94 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 23:46:20 -0500 Subject: [PATCH 21/35] Naming things. --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8c6258f5..779c5a87 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -17,7 +17,7 @@ jobs: - setup - lint-pod - tests: + tests-xcode-14: executor: xcode-14 steps: - setup @@ -86,7 +86,7 @@ workflows: filters: tags: only: /.*/ - - tests: + - tests-xcode-14: filters: tags: only: /.*/ @@ -102,7 +102,7 @@ workflows: context: CocoaPods requires: - swift-package - - tests + - tests-xcode-14 - tests-xcode-15 - lint-pod filters: From 53ce84949adbc64a93eaebd39d014d4cc8966dc9 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 23:49:50 -0500 Subject: [PATCH 22/35] Make test_all work. --- Makefile | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index f9d0882a..e0128619 100644 --- a/Makefile +++ b/Makefile @@ -10,9 +10,5 @@ test_tvos: test_watchos: xcodebuild test -scheme BonMot -destination "platform=watchOS Simulator,name=Apple Watch Series 9 (45mm)" | xcbeautify -test_all: - # Platforms listed in order of convenience to run, so if there's a failure early it's easier to test. - test_macos - test_ios - test_tvos - test_watchos +# Platforms listed in order of convenience to run, so if there's a failure early it's easier to test. +test_all: test_macos test_ios test_tvos test_watchos From 1a9bcc4b9dc5ac4198911d0ee3e661b4b04d0982 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 23:50:48 -0500 Subject: [PATCH 23/35] Install xcbeautify. --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 779c5a87..8dcc80cf 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -61,6 +61,7 @@ commands: steps: - checkout - switch-ruby + - run: brew install xcbeautify switch-ruby: description: "Switch Ruby" From 82696a23db7ac7f86c382c9df7dd40c48f201fa8 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 25 Dec 2023 23:55:25 -0500 Subject: [PATCH 24/35] Separate make steps so we can see which pass and which fail more easily. --- .circleci/config.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8dcc80cf..a23e536a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,13 +21,19 @@ jobs: executor: xcode-14 steps: - setup - - run: make test_all + - run: make test_macos + - run: make test_ios + - run: make test_tvos + - run: make test_watchos tests-xcode-15: executor: xcode-15 steps: - setup - - run: make test_all + - run: make test_macos + - run: make test_ios + - run: make test_tvos + - run: make test_watchos deploy-to-cocoapods: executor: xcode-14 From f521904fcf9113bad393b9c63a0e89d1bf0c9d77 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Tue, 26 Dec 2023 00:01:40 -0500 Subject: [PATCH 25/35] Update badges. --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index b0050759..cb3ef970 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,10 @@ BonMot Logo -[![Swift 5.0](https://img.shields.io/badge/Swift-%205.0-orange.svg?style=flat)](https://swift.org) +[![Swift 5.9](https://img.shields.io/badge/Swift-%205.9-orange.svg?style=flat)](https://swift.org) [![CircleCI](https://img.shields.io/circleci/project/github/Rightpoint/BonMot/master.svg)](https://circleci.com/gh/Rightpoint/BonMot) [![Version](https://img.shields.io/cocoapods/v/BonMot.svg?style=flat)](http://cocoapods.org/pods/BonMot) [![License](https://img.shields.io/cocoapods/l/BonMot.svg?style=flat)](http://cocoapods.org/pods/BonMot) [![Platform](https://img.shields.io/cocoapods/p/BonMot.svg?style=flat)](http://cocoapods.org/pods/BonMot) -[![codecov](https://codecov.io/gh/Rightpoint/BonMot/branch/master/graph/badge.svg)](https://codecov.io/gh/Rightpoint/BonMot) BonMot (pronounced *Bon Mo*, French for *good word*) is a Swift attributed string library. It abstracts away the complexities of the iOS, macOS, tvOS, and watchOS typography tools, freeing you to focus on making your text beautiful. From 7d35f5c6d3bdda64d34b1a85cacc25ac60572753 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Sat, 30 Mar 2024 14:13:17 -0400 Subject: [PATCH 26/35] Change how we return XML parser errors to better indicate where failures happened, and to make error reporting simpler and easier to test. --- Sources/XMLBuilder.swift | 67 +++++++++++++++++++------- Tests/XMLTagStyleBuilderTests.swift | 73 ++++++++++++++++++++++++----- 2 files changed, 111 insertions(+), 29 deletions(-) diff --git a/Sources/XMLBuilder.swift b/Sources/XMLBuilder.swift index df7602e5..a25260c6 100644 --- a/Sources/XMLBuilder.swift +++ b/Sources/XMLBuilder.swift @@ -222,22 +222,42 @@ public struct XMLParsingOptions: OptionSet { /// Error wrapper that includes the line and column number of the error. public struct XMLBuilderError: Error { + /// The original XML string that was passed in to the parser. + public let originalXML: String + /// The error generated by XMLParser. - public let parserError: Error + public let parserError: Error? + + /// The error code, if the error domain is XMLParser.errorDomain + public let errorCode: XMLParser.ErrorCode? + + /// The line number where the error occurred, if it can be determined. + public let line: Int? + + /// The column where the error occurred, if it can be determined. + public let column: Int? + +} + +final class BonMotXMLParser: XMLParser { - /// The line number where the error occurred. - public let line: Int + let data: Data - /// The column where the error occurred. - public let column: Int + override init(data: Data) { + self.data = data + super.init(data: data) + } + var xmlAsString: String { + String(decoding: data, as: UTF8.self) + } } class XMLBuilder: NSObject, XMLParserDelegate { static let internalTopLevelElement = "BonMotTopLevelContainer" - let parser: XMLParser + let parser: BonMotXMLParser let options: XMLParsingOptions var attributedString: NSMutableAttributedString var styles: [StringStyle] @@ -249,6 +269,8 @@ class XMLBuilder: NSObject, XMLParserDelegate { // when the current element ends, or when a new one is started. var currentString: String? + private var lastParseError: Error? + var topStyle: StringStyle { guard let style = styles.last else { fatalError("Invalid Style Stack") } return style @@ -267,11 +289,9 @@ class XMLBuilder: NSObject, XMLParserDelegate { string : "<\(XMLBuilder.internalTopLevelElement)>\(string)") - guard let data = xml.data(using: String.Encoding.utf8) else { - fatalError("Unable to convert to UTF8") - } + let data = Data(xml.utf8) self.attributedString = NSMutableAttributedString() - self.parser = XMLParser(data: data) + self.parser = BonMotXMLParser(data: data) self.options = options self.xmlStylers = [styler] // Remove the XMLStyler from the base style @@ -287,16 +307,31 @@ class XMLBuilder: NSObject, XMLParserDelegate { func parseAttributedString() throws -> NSMutableAttributedString { guard parser.parse() else { - let line = parser.lineNumber - let shiftColumn = (line == 1 && options.contains(.doNotWrapXML) == false) - let shiftSize = XMLBuilder.internalTopLevelElement.lengthOfBytes(using: String.Encoding.utf8) + 2 - let column = parser.columnNumber - (shiftColumn ? shiftSize : 0) - - throw XMLBuilderError(parserError: parser.parserError!, line: line, column: column) + // By default, we wrap bare strings in a custom XML tag because parsing requires a top-level tag. Due to this wrapping, the column numbers of thrown errors may not make sense. In order to remedy this, we store and return the full string passed to the XML parser, including any BonMot wrapping tags. That way, the error message will include a reference for comparing the column numbers. Not ideal, but better than nothing. We tried to manually adjust the column numbers, but it was fragile and complex and deemed not worth it. + + // n.b. per https://stackoverflow.com/a/38470343/255489, if the parser.parserError is NSXMLParserErrorDomain code 111, it signifies unexpected EOF. + + let lastParseNSError = lastParseError as? NSError + let line = lastParseNSError?.userInfo["NSXMLParserErrorLineNumber"] as? Int + let column = lastParseNSError?.userInfo["NSXMLParserErrorColumn"] as? Int + let errorCode = lastParseNSError?.domain == XMLParser.errorDomain ? (lastParseNSError?.code).flatMap(XMLParser.ErrorCode.init) : nil + + throw XMLBuilderError( + originalXML: parser.xmlAsString, + parserError: lastParseError, + errorCode: errorCode, + line: line, + column: column + ) } return attributedString } + func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { + // parser.parseError may be the overall parse error, like "unexpected EOF," but not the first error encountered when parsing. The first error encountered comes through this delegate method, so this is where we grab it and store it. + self.lastParseError = parseError + } + /// When a node is entered, a new style is derived from the current style /// and the style for the node returned by the XMLStyler. If the style /// contains an `XMLStyler`, it is pushed onto the `XMLStyler` stack and diff --git a/Tests/XMLTagStyleBuilderTests.swift b/Tests/XMLTagStyleBuilderTests.swift index b20efa86..e189b9ca 100644 --- a/Tests/XMLTagStyleBuilderTests.swift +++ b/Tests/XMLTagStyleBuilderTests.swift @@ -149,28 +149,75 @@ class XMLTagStyleBuilderTests: XCTestCase { /// Test the line and column information returned in the error. Note that this is just testing our adapting of the column for the root node insertion. func testErrorLocation() { - func errorLocation(forXML xml: String, _ options: XMLParsingOptions = []) -> (line: Int, column: Int) { + struct ParseErrorResult: Equatable { + let originalXML: String + let errorCode: XMLParser.ErrorCode? + let line: Int? + let column: Int? + } + + func errorResult(forXML xml: String, options: XMLParsingOptions = []) -> ParseErrorResult? { do { - let attributedString = try NSAttributedString.composed(ofXML: xml) + let attributedString = try NSAttributedString.composed(ofXML: xml, options: options) XCTFail("compose should of thrown, got \(attributedString)") } catch let error as XMLBuilderError { - return (error.line, error.column) + return ParseErrorResult( + originalXML: error.originalXML, + errorCode: error.errorCode, + line: error.line, + column: error.column + ) } catch { XCTFail("Did not get an XMLError") } - return (0, 0) + return nil } - XCTAssertEqual(errorLocation(forXML: "Text \r\n \r\n Text ", + errorCode: .nameRequiredError, + line: 1, + column: 34 + ) + ) + + XCTAssertEqual( + errorResult(forXML: "Text \r\n Text \r\n ", + errorCode: .nameRequiredError, + line: 2, + column: 5 + ) + ) + + XCTAssertEqual( + errorResult(forXML: " \r\n \r\n Date: Sun, 31 Mar 2024 17:25:00 -0400 Subject: [PATCH 27/35] Modernize and improve snapshot testing. --- Package.resolved | 23 ++++++ Package.swift | 15 +++- Sources/Image+Tinting.swift | 73 +++++------------- Tests/AssertHelpers.swift | 27 ++----- Tests/Helpers.swift | 46 ++++------- Tests/ImageTintingTests.swift | 67 +++++++--------- Tests/Resources/Images.xcassets/Contents.json | 6 ++ .../robot.imageset/Contents.json | 21 +++++ .../robot.imageset}/robot.png | Bin .../rz-logo-black.imageset/Contents.json | 21 +++++ .../rz-logo-black.imageset}/rz-logo-black.png | Bin Tests/Resources/rz-logo-red.png | Bin 2504 -> 0 bytes Tests/UIKitBehaviorTests.swift | 3 +- .../testImageTinting-_AppKit.1.png | Bin 0 -> 50457 bytes .../testImageTinting-_UIKit.1.png | Bin 0 -> 4205 bytes ...NotTintingInAttributedString-_AppKit.1.png | Bin 0 -> 27270 bytes ...tNotTintingInAttributedString-_UIKit.1.png | Bin 0 -> 13800 bytes ...estTintingInAttributedString-_AppKit.1.png | Bin 0 -> 50511 bytes ...testTintingInAttributedString-_UIKit.1.png | Bin 0 -> 18696 bytes 19 files changed, 155 insertions(+), 147 deletions(-) create mode 100644 Package.resolved create mode 100644 Tests/Resources/Images.xcassets/Contents.json create mode 100644 Tests/Resources/Images.xcassets/robot.imageset/Contents.json rename Tests/Resources/{ => Images.xcassets/robot.imageset}/robot.png (100%) create mode 100644 Tests/Resources/Images.xcassets/rz-logo-black.imageset/Contents.json rename Tests/Resources/{ => Images.xcassets/rz-logo-black.imageset}/rz-logo-black.png (100%) delete mode 100644 Tests/Resources/rz-logo-red.png create mode 100644 Tests/__Snapshots__/ImageTintingTests/testImageTinting-_AppKit.1.png create mode 100644 Tests/__Snapshots__/ImageTintingTests/testImageTinting-_UIKit.1.png create mode 100644 Tests/__Snapshots__/ImageTintingTests/testNotTintingInAttributedString-_AppKit.1.png create mode 100644 Tests/__Snapshots__/ImageTintingTests/testNotTintingInAttributedString-_UIKit.1.png create mode 100644 Tests/__Snapshots__/ImageTintingTests/testTintingInAttributedString-_AppKit.1.png create mode 100644 Tests/__Snapshots__/ImageTintingTests/testTintingInAttributedString-_UIKit.1.png diff --git a/Package.resolved b/Package.resolved new file mode 100644 index 00000000..11820fa6 --- /dev/null +++ b/Package.resolved @@ -0,0 +1,23 @@ +{ + "pins" : [ + { + "identity" : "swift-snapshot-testing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-snapshot-testing.git", + "state" : { + "revision" : "5b0c434778f2c1a4c9b5ebdb8682b28e84dd69bd", + "version" : "1.15.4" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-syntax", + "state" : { + "revision" : "fa8f95c2d536d6620cc2f504ebe8a6167c9fc2dd", + "version" : "510.0.1" + } + } + ], + "version" : 2 +} diff --git a/Package.swift b/Package.swift index 445c05ce..1d86cab4 100644 --- a/Package.swift +++ b/Package.swift @@ -16,6 +16,9 @@ let package = Package( name: "BonMot", targets: ["BonMot"]), ], + dependencies: [ + .package(url: "https://github.com/pointfreeco/swift-snapshot-testing.git", from: "1.0.0"), + ], targets: [ .target( name: "BonMot", @@ -25,12 +28,18 @@ let package = Package( ), .testTarget( name: "BonMotTests", - dependencies: ["BonMot"], + dependencies: [ + "BonMot", + .product(name: "SnapshotTesting", package: "swift-snapshot-testing"), + ], path: "Tests", - exclude: [], + exclude: [ + "__Snapshots__", + ], resources: [ .process("Resources"), - ]), + ] + ), ], swiftLanguageVersions: [.v5] ) diff --git a/Sources/Image+Tinting.swift b/Sources/Image+Tinting.swift index 98b4fd0e..b1f8946f 100644 --- a/Sources/Image+Tinting.swift +++ b/Sources/Image+Tinting.swift @@ -28,40 +28,18 @@ public extension BONImage { /// - Parameter theColor: The color to use to tint the receiver. /// - Returns: A tinted copy of the image. @objc(bon_tintedImageWithColor:) - func tintedImage(color theColor: BONColor) -> BONImage { - let imageRect = CGRect(origin: .zero, size: size) - - let image = NSImage(size: size) - - let rep = NSBitmapImageRep( - bitmapDataPlanes: nil, - pixelsWide: Int(size.width), - pixelsHigh: Int(size.height), - bitsPerSample: 8, - samplesPerPixel: 4, - hasAlpha: true, - isPlanar: false, - colorSpaceName: theColor.colorSpaceName, - bytesPerRow: 0, - bitsPerPixel: 0 - )! - - image.addRepresentation(rep) - - image.lockFocus() - - let context = NSGraphicsContext.current!.cgContext - - context.setBlendMode(.normal) - let cgImage = self.cgImage(forProposedRect: nil, context: nil, hints: nil)! - context.draw(cgImage, in: imageRect) - - // .sourceIn: resulting color = source color * destination alpha - context.setBlendMode(.sourceIn) - context.setFillColor(theColor.cgColor) - context.fill(imageRect) - - image.unlockFocus() + func tintedImage(color: BONColor) -> BONImage { + let image = NSImage(size: size, flipped: false) { rect in + color.set() + rect.fill() + self.draw( + in: rect, + from: NSRect(origin: .zero, size: self.size), + operation: .destinationIn, + fraction: 1 + ) + return true + } // Prevent further tinting image.isTemplate = false @@ -81,33 +59,20 @@ public extension BONImage { /// - Parameter theColor: The color to use to tint the receiver. /// - Returns: A tinted copy of the image. @objc(bon_tintedImageWithColor:) - func tintedImage(color theColor: BONColor) -> BONImage { + func tintedImage(color: BONColor) -> BONImage { let imageRect = CGRect(origin: .zero, size: size) // Save original properties let originalCapInsets = capInsets let originalResizingMode = resizingMode let originalAlignmentRectInsets = alignmentRectInsets - UIGraphicsBeginImageContextWithOptions(size, false, scale) - let context = UIGraphicsGetCurrentContext()! - - // Flip the context vertically - context.translateBy(x: 0.0, y: size.height) - context.scaleBy(x: 1.0, y: -1.0) - - // Image tinting mostly inspired by http://stackoverflow.com/a/22528426/255489 + let format = UIGraphicsImageRendererFormat(for: UITraitCollection(displayScale: scale)) - context.setBlendMode(.normal) - context.draw(cgImage!, in: imageRect) - - // .sourceIn: resulting color = source color * destination alpha - context.setBlendMode(.sourceIn) - context.setFillColor(theColor.cgColor) - context.fill(imageRect) - - // Get new image - var image = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() + var image = UIGraphicsImageRenderer(size: size, format: format).image { rendererContext in + color.setFill() + UIRectFill(imageRect) + self.draw(at: .zero, blendMode: .destinationIn, alpha: 1) + } // Prevent further tinting image = image.withRenderingMode(.alwaysOriginal) diff --git a/Tests/AssertHelpers.swift b/Tests/AssertHelpers.swift index 4c941ef2..c9916d6b 100644 --- a/Tests/AssertHelpers.swift +++ b/Tests/AssertHelpers.swift @@ -9,15 +9,16 @@ import BonMot import XCTest -func dataFromImage(image theImage: BONImage) -> Data { - assert(theImage.size != .zero) +func dataFromImage(_ image: BONImage) throws -> Data { + assert(image.size != .zero) + // https://stackoverflow.com/a/26802188/255489 #if canImport(AppKit) - let cgImageRef = theImage.cgImage(forProposedRect: nil, context: nil, hints: nil) - let bitmapImageRep = NSBitmapImageRep(cgImage: cgImageRef!) - let pngData = bitmapImageRep.representation(using: .png, properties: [:])! - return pngData + let tiffRepresentation = try XCTUnwrap(image.tiffRepresentation) + let imageRep = try XCTUnwrap(NSBitmapImageRep(data: tiffRepresentation)) + let data = try XCTUnwrap(imageRep.representation(using: .png, properties: [:])) + return data #elseif canImport(UIKit) - return theImage.pngData()! + return image.pngData()! #endif } @@ -79,18 +80,6 @@ func BONAssert(attributes dictionary: StyleAttributes?, query: (NSParagraphSt XCTAssertEqual(value, actualValue, file: file, line: line) } -func BONAssertEqualImages(_ image1: BONImage, _ image2: BONImage, file: StaticString = #filePath, line: UInt = #line) { - let data1 = dataFromImage(image: image1) - let data2 = dataFromImage(image: image2) - XCTAssertEqual(data1, data2, file: file, line: line) -} - -func BONAssertNotEqualImages(_ image1: BONImage, _ image2: BONImage, file: StaticString = #filePath, line: UInt = #line) { - let data1 = dataFromImage(image: image1) - let data2 = dataFromImage(image: image2) - XCTAssertNotEqual(data1, data2, file: file, line: line) -} - func BONAssertEqualFonts(_ font1: BONFont, _ font2: BONFont, _ message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) { let descriptor1 = font1.fontDescriptor let descriptor2 = font2.fontDescriptor diff --git a/Tests/Helpers.swift b/Tests/Helpers.swift index 5e849b6a..06f95889 100644 --- a/Tests/Helpers.swift +++ b/Tests/Helpers.swift @@ -202,47 +202,29 @@ extension NSAttributedString { return attributesByRange } - func snapshotForTesting() -> BONImage? { + func snapshotForTesting() throws -> BONImage { let bigSize = CGSize(width: 10_000, height: 10_000) // Bug: on macOS, attached images are not taken into account // when measuring attributed strings: http://www.openradar.me/28639290 - let rect = boundingRect(with: bigSize, options: .usesLineFragmentOrigin, context: nil) + let boundingRect = boundingRect(with: bigSize, options: .usesLineFragmentOrigin, context: nil) - guard !rect.isEmpty else { - return nil + guard !boundingRect.isEmpty else { + struct ImageBoundingRectEmpty: Error {} + throw ImageBoundingRectEmpty() } #if canImport(AppKit) - let image = NSImage(size: rect.size) - - let rep = NSBitmapImageRep( - bitmapDataPlanes: nil, - pixelsWide: Int(rect.size.width), - pixelsHigh: Int(rect.size.height), - bitsPerSample: 8, - samplesPerPixel: 4, - hasAlpha: true, - isPlanar: false, - colorSpaceName: .deviceRGB, - bytesPerRow: 0, - bitsPerPixel: 0 - )! - - image.addRepresentation(rep) - - image.lockFocus() - - draw(with: rect, options: .usesLineFragmentOrigin, context: nil) - - image.unlockFocus() - return image + let image = NSImage(size: boundingRect.size, flipped: false) { rect in + self.draw(with: boundingRect, options: .usesLineFragmentOrigin, context: nil) + return true + } + return image #elseif canImport(UIKit) - UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) - draw(with: rect, options: .usesLineFragmentOrigin, context: nil) - let image = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - return image + let format = UIGraphicsImageRendererFormat(for: UITraitCollection(displayScale: 2)) + return UIGraphicsImageRenderer(size: boundingRect.size, format: format).image { _ in + self.draw(with: boundingRect, options: .usesLineFragmentOrigin, context: nil) + } #endif } diff --git a/Tests/ImageTintingTests.swift b/Tests/ImageTintingTests.swift index 1c6fd024..28baaf13 100644 --- a/Tests/ImageTintingTests.swift +++ b/Tests/ImageTintingTests.swift @@ -12,12 +12,18 @@ import UIKit #endif -@testable import BonMot +import SnapshotTesting import XCTest +@testable import BonMot + #if !os(watchOS) class ImageTintingTests: XCTestCase { + override func setUp() async throws { +// isRecording = true; #warning("Don't commit me!") + } + func logoImage() throws -> BONImage { #if canImport(AppKit) let imageForTest = testBundle.image(forResource: "rz-logo-black") @@ -38,79 +44,66 @@ class ImageTintingTests: XCTestCase { let accessibilityDescription = "I’m the very model of a modern accessible image." func testImageTinting() throws { - #if SWIFT_PACKAGE && canImport(AppKit) - try XCTSkipIf(true, "Doesn't work on macOS SPM targets") - #endif - let blackImageName = "rz-logo-black" - let redImageName = "rz-logo-red" + let testNameSuffix: String #if canImport(AppKit) - let sourceImage = try XCTUnwrap(testBundle.image(forResource: blackImageName)) - let controlTintedImage = try XCTUnwrap(testBundle.image(forResource: redImageName)) + let sourceImage = try XCTUnwrap(Bundle.module.image(forResource: blackImageName)) let testTintedImage = sourceImage.tintedImage(color: raizlabsRed) + testNameSuffix = "AppKit" #elseif canImport(UIKit) let sourceImage = try XCTUnwrap(UIImage(named: blackImageName, in: testBundle, compatibleWith: nil)) - let controlTintedImage = try XCTUnwrap(UIImage(named: redImageName, in: testBundle, compatibleWith: nil)) let testTintedImage = sourceImage.tintedImage(color: raizlabsRed) + testNameSuffix = "UIKit" #endif - BONAssertEqualImages(controlTintedImage, testTintedImage) + assertSnapshot(of: testTintedImage, as: .image, testName: #function + "_" + testNameSuffix) } func testTintingInAttributedString() throws { - #if os(iOS) || os(tvOS) - try XCTSkipIf(true, "No longer working for iOS/tvOS targets") - #endif - let imageForTest = try logoImage() - let untintedString = NSAttributedString.composed(of: [ - imageForTest.styled(with: .color(raizlabsRed)), - ]) + let testNameSuffix: String #if canImport(AppKit) let tintableImage = imageForTest tintableImage.isTemplate = true + testNameSuffix = "AppKit" #elseif canImport(UIKit) let tintableImage = imageForTest.withRenderingMode(.alwaysTemplate) + testNameSuffix = "UIKit" #endif let tintedString = NSAttributedString.composed(of: [ tintableImage.styled(with: .color(raizlabsRed)), ]) - let untintedResult = untintedString.snapshotForTesting() - let tintedResult = tintedString.snapshotForTesting() - - XCTAssertNotNil(untintedResult) - XCTAssertNotNil(tintedResult) + let tintedResult = try tintedString.snapshotForTesting() - BONAssertNotEqualImages(untintedResult!, tintedResult!) + assertSnapshot(of: tintedResult, as: .image, testName: #function + "_" + testNameSuffix) } func testNotTintingInAttributedString() throws { - #if os(iOS) || os(tvOS) - try XCTSkipIf(true, "No longer working for iOS/tvOS targets") - #endif + var imageForTest = try logoImage() - let imageForTest = try logoImage() + let testNameSuffix: String - let untintedString = NSAttributedString.composed(of: [ - imageForTest, - ]) + #if canImport(AppKit) + imageForTest.isTemplate = false + testNameSuffix = "AppKit" + #elseif canImport(UIKit) + imageForTest = imageForTest.withRenderingMode(.alwaysOriginal) + testNameSuffix = "UIKit" + #endif - let tintAttemptString = NSAttributedString.composed(of: [ + + let tintString = NSAttributedString.composed(of: [ imageForTest.styled(with: .color(raizlabsRed)), ]) - let untintedResult = untintedString.snapshotForTesting() - let tintAttemptResult = tintAttemptString.snapshotForTesting() - - XCTAssertNotNil(untintedResult) - XCTAssertNotNil(tintAttemptResult) + let tintResult = try tintString.snapshotForTesting() - BONAssertEqualImages(untintedResult!, tintAttemptResult!) + assertSnapshot(of: tintResult, as: .image, testName: #function + "_" + testNameSuffix) } func testAccessibilityIOSAndTVOS() throws { diff --git a/Tests/Resources/Images.xcassets/Contents.json b/Tests/Resources/Images.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Tests/Resources/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Tests/Resources/Images.xcassets/robot.imageset/Contents.json b/Tests/Resources/Images.xcassets/robot.imageset/Contents.json new file mode 100644 index 00000000..c2a662d3 --- /dev/null +++ b/Tests/Resources/Images.xcassets/robot.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "robot.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Tests/Resources/robot.png b/Tests/Resources/Images.xcassets/robot.imageset/robot.png similarity index 100% rename from Tests/Resources/robot.png rename to Tests/Resources/Images.xcassets/robot.imageset/robot.png diff --git a/Tests/Resources/Images.xcassets/rz-logo-black.imageset/Contents.json b/Tests/Resources/Images.xcassets/rz-logo-black.imageset/Contents.json new file mode 100644 index 00000000..043b9642 --- /dev/null +++ b/Tests/Resources/Images.xcassets/rz-logo-black.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "rz-logo-black.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Tests/Resources/rz-logo-black.png b/Tests/Resources/Images.xcassets/rz-logo-black.imageset/rz-logo-black.png similarity index 100% rename from Tests/Resources/rz-logo-black.png rename to Tests/Resources/Images.xcassets/rz-logo-black.imageset/rz-logo-black.png diff --git a/Tests/Resources/rz-logo-red.png b/Tests/Resources/rz-logo-red.png deleted file mode 100644 index 3cfe3d967e50d5c97051e37056fdc9544412109c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2504 zcmX|?2{@E%8^;I9GG-{Ls2t0nELqN1j_kWBvofXGkTpw4;&3pMJ(`e6vV<&0BuZIo zgb3(h}ggchxiy1{3eXySh7qaFL4Tlc8Hc!SbmXXiUNKpaEu`!B_`ZXy`@)6#Dz~ zC>W5iL?`gbSa7dUi6C63(Rg$`w4{y%LOz8eB;y4X3=hnBc`bP1!789Hpc59La$p{M zLPbGH#jZ0*kTRXLKqK%dSdcHmz<{wx4F@FyDzFNGK>$!KFaQaQ6ypEhLM3n@Z3$?K zUh%zgJkbn~j9d1_f@FZPK-~}rYLMm^?+swkKB$6Q4yYDB4G$ z02VG#fvZrnz-piX4IqC+f}$!LA)ihFMFo(zfDkZ1o2-! z@MyU86A;n@89H(xv+n8a3OK>sGeoQ#43+)v?9uU(*k9seQa}IMB>DBb;+IwBHTXe+ z#1rK2=jWsqhN%|VADw@Hh+=G(-DUl!+Rc|-p6=VS*(|n`&*Id9*33bJ7dkVa_7Hkb z?YOdRBfR*nUn#jhCPMD;?mLI{Pv}jm9!Z4JY@7RmK&kRA)r@=3W0QsmY5)uc~{mPFyiX zkbfJwn`n-P!6eye2V3`;$%cs)H_Gwdl0u360_mg*NBA}aa);e>S$s6OzVctb4GnH@ zZJ2u5E)d-M{P6Y6s9$6n%J6>2$i8Y4uO%hqc3=9ervG_Dz`{&e$&5c#AIEqaE2ha-a4O)7UXL1kA7!v7rE5 zWot<*yg!6ESQal6c#YHWi~3LlMv#AnubCBJ4&45%?aBrG4kNAHUzW$j;W=NdZKop{ zuTS}=?XHO(FS0O^DEz9*&+zs`|-D>v2{FDeD*I<7c6&z9ywEHPZ zm+BkSfjx%T7O&cvY2FbsxR2;_Pnuw}Bb4+{1pP|4r)w%#Tjz$i@Mqn1*;ly2@*T0G zwT|K4!Hx$?r0o@Bvp7G_=!#=|q4qvw;0M~j5p!&&v#dlsWKWAv#e?~Wp{$-ykY zOxA+kW7S^H3wATwAV#(2g1aoz*fz@;s}*C6Vns)GRKO<8E_2>8El|gQ?rbLMvP{*@ zob-;Ep}4v%G}HaLzc^~4e$z-&XU(UU#nc|0`Zo)d&+hA?VJVymCTdiBM0$Xp!YM!m z)L-8!jrOXsYcfP>#^?D+z={l&&PCf&TI|BV>E3zt<@;N!`9>L(+2u38b~ zvFA}?oib

ZL{)s8V9IACiDT4xaCfNj#O*X@?6k6Ns<`ys&vhd+TWL#W9u5}13=PuD4{wl3IzpZqr zUd)$pWbV7&#|rV-kTHwrTQVmb%1fdUH*4NnHlLAKSbbo-EhR^Zrtul6*xLR>_KE}A z@^7C3pMkMRtL1KK`CZ zc1iZjKJ;$(W^$tvMf-N!;+yU`-*xLAJuUcfe{*NqDBab&KH6nmaQ4$h#bcQsIkn&K zjCRu#7FQ7o^{5D$%&6-Q5s_D?4!ZLQPP?i?Px@E{9Tt>`_00T?3YMeuqSsTA;?*IF zQ{3;pZ>-JO1Cdi!Ydw9&w*yR-d&p#KALJb@yUUFID(~di_@&YVTrtx%cvbU5_|KA0 Ra^QmoLpx#}ZrORA`xijO)lUEb diff --git a/Tests/UIKitBehaviorTests.swift b/Tests/UIKitBehaviorTests.swift index 3e371455..34e4949b 100644 --- a/Tests/UIKitBehaviorTests.swift +++ b/Tests/UIKitBehaviorTests.swift @@ -94,8 +94,7 @@ class UIKitBehaviorTests: XCTestCase { #endif textField.text = "Testing" // By default the font is nil - XCTAssertNotNil(textField.font) - XCTAssertEqual(textField.font?.pointSize, defaultTextViewFontSize) + XCTAssertNil(textField.font) textField.font = largeFont XCTAssertEqual(textField.font?.pointSize, 20) diff --git a/Tests/__Snapshots__/ImageTintingTests/testImageTinting-_AppKit.1.png b/Tests/__Snapshots__/ImageTintingTests/testImageTinting-_AppKit.1.png new file mode 100644 index 0000000000000000000000000000000000000000..281936e707ed8f08640c0df102ed08757bb12690 GIT binary patch literal 50457 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 XgC;C8|Di^w00000NkvXXu0mjfJG0EL literal 0 HcmV?d00001 diff --git a/Tests/__Snapshots__/ImageTintingTests/testImageTinting-_UIKit.1.png b/Tests/__Snapshots__/ImageTintingTests/testImageTinting-_UIKit.1.png new file mode 100644 index 0000000000000000000000000000000000000000..ea618d4a51ec15a8553184707e65f9d74c57e153 GIT binary patch literal 4205 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 Nv^DhAt5h+e{|9gbrs@Cy literal 0 HcmV?d00001 diff --git a/Tests/__Snapshots__/ImageTintingTests/testNotTintingInAttributedString-_AppKit.1.png b/Tests/__Snapshots__/ImageTintingTests/testNotTintingInAttributedString-_AppKit.1.png new file mode 100644 index 0000000000000000000000000000000000000000..f02ef9e69991cb30cdfe8d7e51aaeff4726aee4f GIT binary patch literal 27270 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
    Xn2Yj8%$Qtz4`lfsFgSBj22ux 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 literal 0 HcmV?d00001 diff --git a/Tests/__Snapshots__/ImageTintingTests/testNotTintingInAttributedString-_UIKit.1.png b/Tests/__Snapshots__/ImageTintingTests/testNotTintingInAttributedString-_UIKit.1.png new file mode 100644 index 0000000000000000000000000000000000000000..4657294f45d0f912977e7c591af06d7482b5661c GIT binary patch literal 13800 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 KpRY1S#r+QkW)?*N literal 0 HcmV?d00001 diff --git a/Tests/__Snapshots__/ImageTintingTests/testTintingInAttributedString-_AppKit.1.png b/Tests/__Snapshots__/ImageTintingTests/testTintingInAttributedString-_AppKit.1.png new file mode 100644 index 0000000000000000000000000000000000000000..33674a086c3270d94099317e44c4043862a641c5 GIT binary patch literal 50511 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 literal 0 HcmV?d00001 diff --git a/Tests/__Snapshots__/ImageTintingTests/testTintingInAttributedString-_UIKit.1.png b/Tests/__Snapshots__/ImageTintingTests/testTintingInAttributedString-_UIKit.1.png new file mode 100644 index 0000000000000000000000000000000000000000..2082e15418b482b0fe841d71a154f5bd60c344fd GIT binary patch literal 18696 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 Date: Sun, 31 Mar 2024 17:47:50 -0400 Subject: [PATCH 28/35] Fail on CI if tests fail. --- Makefile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index e0128619..c54e50b9 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,16 @@ +# Use `set -o pipefail &&` to make xcbeautify exit with the same code as xcodebuild. + test_ios: - xcodebuild test -scheme BonMot -destination "platform=iOS Simulator,name=iPhone 15" | xcbeautify + set -o pipefail && xcodebuild test -scheme BonMot -destination "platform=iOS Simulator,name=iPhone 15" | xcbeautify test_macos: - xcodebuild test -scheme BonMot -destination platform=macOS,arch=arm64 | xcbeautify + set -o pipefail && xcodebuild test -scheme BonMot -destination platform=macOS,arch=arm64 | xcbeautify test_tvos: - xcodebuild test -scheme BonMot -destination "platform=tvOS Simulator,name=Apple TV" | xcbeautify + set -o pipefail && xcodebuild test -scheme BonMot -destination "platform=tvOS Simulator,name=Apple TV" | xcbeautify test_watchos: - xcodebuild test -scheme BonMot -destination "platform=watchOS Simulator,name=Apple Watch Series 9 (45mm)" | xcbeautify + set -o pipefail && xcodebuild test -scheme BonMot -destination "platform=watchOS Simulator,name=Apple Watch Series 9 (45mm)" | xcbeautify # Platforms listed in order of convenience to run, so if there's a failure early it's easier to test. test_all: test_macos test_ios test_tvos test_watchos From c58ee66fe7050b74f18877a23a405f4c9835c495 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Sun, 31 Mar 2024 17:52:29 -0400 Subject: [PATCH 29/35] Store test results. --- .circleci/config.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index a23e536a..c9375909 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -17,23 +17,41 @@ jobs: - setup - lint-pod +# Docs for store_test_results: https://circleci.com/docs/configuration-reference/#storetestresults + tests-xcode-14: executor: xcode-14 steps: - setup - run: make test_macos + - store_test_results: + path: test-results-macos - run: make test_ios + - store_test_results: + path: test-results-ios - run: make test_tvos + - store_test_results: + path: test-results-tvos - run: make test_watchos + - store_test_results: + path: test-results-watchos tests-xcode-15: executor: xcode-15 steps: - setup - run: make test_macos + - store_test_results: + path: test-results-macos - run: make test_ios + - store_test_results: + path: test-results-ios - run: make test_tvos + - store_test_results: + path: test-results-tvos - run: make test_watchos + - store_test_results: + path: test-results-watchos deploy-to-cocoapods: executor: xcode-14 From db1648cd9af2ff7dee3bd110247964f3355565a8 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Sun, 31 Mar 2024 17:57:40 -0400 Subject: [PATCH 30/35] Make directory to store test results. --- .circleci/config.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c9375909..6ea7e60e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,8 +8,11 @@ jobs: executor: xcode-14 steps: - setup + - run: mkdir test-results-swift - run: swift build - run: swift test + - store_test_results: + path: test-results-swift lint-pod: executor: xcode-14 @@ -23,15 +26,20 @@ jobs: executor: xcode-14 steps: - setup + - run: mkdir test-results-macos - run: make test_macos + - run: mkdir test-results-macos - store_test_results: path: test-results-macos + - run: mkdir test-results-ios - run: make test_ios - store_test_results: path: test-results-ios + - run: mkdir test-results-tvos - run: make test_tvos - store_test_results: path: test-results-tvos + - run: mkdir test-results-watchos - run: make test_watchos - store_test_results: path: test-results-watchos @@ -40,21 +48,26 @@ jobs: executor: xcode-15 steps: - setup + - run: mkdir test-results-macos - run: make test_macos + - run: mkdir test-results-macos - store_test_results: path: test-results-macos + - run: mkdir test-results-ios - run: make test_ios - store_test_results: path: test-results-ios + - run: mkdir test-results-tvos - run: make test_tvos - store_test_results: path: test-results-tvos + - run: mkdir test-results-watchos - run: make test_watchos - store_test_results: path: test-results-watchos deploy-to-cocoapods: - executor: xcode-14 + executor: xcode-15 steps: - setup - run: bundle exec pod trunk push From 92b6d596352334c8e41f445070eaa00a49526bb2 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Sat, 30 Mar 2024 14:14:44 -0400 Subject: [PATCH 31/35] Add supported Swift version to Podspec. --- BonMot.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BonMot.podspec b/BonMot.podspec index d325f1ee..a03dc573 100644 --- a/BonMot.podspec +++ b/BonMot.podspec @@ -2,7 +2,7 @@ Pod::Spec.new do |s| s.name = "BonMot" s.version = "6.1.3" s.summary = "Beautiful, easy attributed strings in Swift" - s.swift_versions = ["5.8", "5.9"] + s.swift_versions = ["5.8", "5.9", "5.10"] s.description = <<-DESC BonMot removes all the mystery from creating beautiful, powerful attributed strings in Swift. DESC From a95da1554a7aa9fc73af062023d48f16704ef830 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 1 Apr 2024 10:55:31 -0400 Subject: [PATCH 32/35] Update gems. --- Gemfile.lock | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f1b4d29c..c9af3bc7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,9 +1,11 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml - activesupport (7.1.2) + activesupport (7.1.3.2) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -20,12 +22,12 @@ GEM json (>= 1.5.1) atomos (0.1.3) base64 (0.2.0) - bigdecimal (3.1.5) + bigdecimal (3.1.7) claide (1.1.0) - cocoapods (1.14.3) + cocoapods (1.15.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.14.3) + cocoapods-core (= 1.15.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -40,7 +42,7 @@ GEM nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) xcodeproj (>= 1.23.0, < 2.0) - cocoapods-core (1.14.3) + cocoapods-core (1.15.2) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -60,10 +62,9 @@ GEM netrc (~> 0.11) cocoapods-try (1.2.0) colored2 (3.1.2) - concurrent-ruby (1.2.2) + concurrent-ruby (1.2.3) connection_pool (2.4.1) - drb (2.2.0) - ruby2_keywords + drb (2.2.1) escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) @@ -72,24 +73,24 @@ GEM fuzzy_match (2.0.4) gh_inspector (1.1.3) httpclient (2.8.3) - i18n (1.14.1) + i18n (1.14.4) concurrent-ruby (~> 1.0) json (2.7.1) - minitest (5.20.0) + minitest (5.22.3) molinillo (0.8.0) mutex_m (0.2.0) nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) + nkf (0.2.0) public_suffix (4.0.7) rexml (3.2.6) ruby-macho (2.5.1) - ruby2_keywords (0.0.5) typhoeus (1.4.1) ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - xcodeproj (1.23.0) + xcodeproj (1.24.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) From 6a897b3227e93c9482435d1c4d5529c27ef32c8a Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 1 Apr 2024 11:25:51 -0400 Subject: [PATCH 33/35] Display-resolution-independent snapshot tests for images. --- Tests/ImageTintingTests.swift | 28 +++++++++++++++--- .../testImageTinting-_AppKit.1.png | Bin 50457 -> 11702 bytes ...NotTintingInAttributedString-_AppKit.1.png | Bin 27270 -> 7523 bytes ...estTintingInAttributedString-_AppKit.1.png | Bin 50511 -> 11722 bytes 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Tests/ImageTintingTests.swift b/Tests/ImageTintingTests.swift index 28baaf13..9c79bde2 100644 --- a/Tests/ImageTintingTests.swift +++ b/Tests/ImageTintingTests.swift @@ -57,7 +57,7 @@ class ImageTintingTests: XCTestCase { testNameSuffix = "UIKit" #endif - assertSnapshot(of: testTintedImage, as: .image, testName: #function + "_" + testNameSuffix) + assertSnapshot(of: try testTintedImage.snapshotForTesting(), as: .image, testName: #function + "_" + testNameSuffix) } func testTintingInAttributedString() throws { @@ -78,9 +78,9 @@ class ImageTintingTests: XCTestCase { tintableImage.styled(with: .color(raizlabsRed)), ]) - let tintedResult = try tintedString.snapshotForTesting() + let tintResult = try tintedString.snapshotForTesting() - assertSnapshot(of: tintedResult, as: .image, testName: #function + "_" + testNameSuffix) + assertSnapshot(of: try tintResult.snapshotForTesting(), as: .image, testName: #function + "_" + testNameSuffix) } func testNotTintingInAttributedString() throws { @@ -103,7 +103,7 @@ class ImageTintingTests: XCTestCase { let tintResult = try tintString.snapshotForTesting() - assertSnapshot(of: tintResult, as: .image, testName: #function + "_" + testNameSuffix) + assertSnapshot(of: try tintResult.snapshotForTesting(), as: .image, testName: #function + "_" + testNameSuffix) } func testAccessibilityIOSAndTVOS() throws { @@ -129,3 +129,23 @@ class ImageTintingTests: XCTestCase { #endif } #endif + +extension BONImage { + func snapshotForTesting() throws -> BONImage { +#if canImport(AppKit) + let renderedCGImage = try XCTUnwrap( + self.cgImage( + forProposedRect: nil, + context: nil, + hints: [ + // The image will use the DPI of the display of the machine it is running on. That's 144dpi for Retina, 72dpi for non-Retina, and it could potentially be other values as well. Force to 72dpi non-Retina for testing. + .init(rawValue: NSDeviceDescriptionKey.resolution.rawValue): CGSize(width: 72, height: 72), + ] + ) + ) + return NSImage(cgImage: renderedCGImage, size: size) +#else + return self +#endif + } +} diff --git a/Tests/__Snapshots__/ImageTintingTests/testImageTinting-_AppKit.1.png b/Tests/__Snapshots__/ImageTintingTests/testImageTinting-_AppKit.1.png index 281936e707ed8f08640c0df102ed08757bb12690..63378d9f5784b3ddeb385b575bdeac0bbda2b7c4 100644 GIT binary patch delta 8628 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

      >~8Hb|9dIsm}J{I#vfr&wOMa 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 Q9rXFgNhwR#iJJ!h51HVHr2qf` From e3369823ae1c46d229f7bfe0c86df97bbf905983 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 1 Apr 2024 12:00:41 -0400 Subject: [PATCH 34/35] Fix snapshot scale. --- Tests/Helpers.swift | 2 +- ...tNotTintingInAttributedString-_UIKit.1.png | Bin 13800 -> 3481 bytes ...testTintingInAttributedString-_UIKit.1.png | Bin 18696 -> 4219 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Helpers.swift b/Tests/Helpers.swift index 06f95889..0b329b82 100644 --- a/Tests/Helpers.swift +++ b/Tests/Helpers.swift @@ -221,7 +221,7 @@ extension NSAttributedString { } return image #elseif canImport(UIKit) - let format = UIGraphicsImageRendererFormat(for: UITraitCollection(displayScale: 2)) + let format = UIGraphicsImageRendererFormat(for: UITraitCollection(displayScale: 1)) return UIGraphicsImageRenderer(size: boundingRect.size, format: format).image { _ in self.draw(with: boundingRect, options: .usesLineFragmentOrigin, context: nil) } diff --git a/Tests/__Snapshots__/ImageTintingTests/testNotTintingInAttributedString-_UIKit.1.png b/Tests/__Snapshots__/ImageTintingTests/testNotTintingInAttributedString-_UIKit.1.png index 4657294f45d0f912977e7c591af06d7482b5661c..1f91575f151e8d0325d02cb3e6a54f1fb2d88dca 100644 GIT binary patch delta 3393 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 XS7{oP9QQE*015yANkvXXu0mjfv&>Y; literal 13800 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 KpRY1S#r+QkW)?*N diff --git a/Tests/__Snapshots__/ImageTintingTests/testTintingInAttributedString-_UIKit.1.png b/Tests/__Snapshots__/ImageTintingTests/testTintingInAttributedString-_UIKit.1.png index 2082e15418b482b0fe841d71a154f5bd60c344fd..165dc6d7e6c0a1ab5181211552e7fce432d64233 100644 GIT binary patch delta 4137 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 Date: Sat, 6 Apr 2024 15:45:58 -0400 Subject: [PATCH 35/35] Use xcpretty instead of xcbeautify to output junit test format for use on CircleCI. --- .circleci/config.yml | 2 -- .gitignore | 2 ++ Gemfile | 1 + Gemfile.lock | 4 ++++ Makefile | 10 +++++----- Tests/Helpers.swift | 2 ++ 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6ea7e60e..99e47b7b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -28,7 +28,6 @@ jobs: - setup - run: mkdir test-results-macos - run: make test_macos - - run: mkdir test-results-macos - store_test_results: path: test-results-macos - run: mkdir test-results-ios @@ -98,7 +97,6 @@ commands: steps: - checkout - switch-ruby - - run: brew install xcbeautify switch-ruby: description: "Switch Ruby" diff --git a/.gitignore b/.gitignore index 291f0f2d..e4835c2e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +test-results-* + # Created by https://www.gitignore.io/api/swift,macos,swiftpm,swiftpackagemanager # Edit at https://www.gitignore.io/?templates=swift,macos,swiftpm,swiftpackagemanager diff --git a/Gemfile b/Gemfile index 5f6889ca..3898d653 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,7 @@ source 'https://rubygems.org' gem 'cocoapods' +gem 'xcpretty' plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') eval_gemfile(plugins_path) if File.exist?(plugins_path) diff --git a/Gemfile.lock b/Gemfile.lock index c9af3bc7..8aa36d7f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -85,6 +85,7 @@ GEM nkf (0.2.0) public_suffix (4.0.7) rexml (3.2.6) + rouge (2.0.7) ruby-macho (2.5.1) typhoeus (1.4.1) ethon (>= 0.9.0) @@ -97,12 +98,15 @@ GEM colored2 (~> 3.1) nanaimo (~> 0.3.0) rexml (~> 3.2.4) + xcpretty (0.3.0) + rouge (~> 2.0.7) PLATFORMS ruby DEPENDENCIES cocoapods + xcpretty BUNDLED WITH 2.5.3 diff --git a/Makefile b/Makefile index c54e50b9..1841e13f 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,16 @@ -# Use `set -o pipefail &&` to make xcbeautify exit with the same code as xcodebuild. +# Use `set -o pipefail &&` to make xcpretty exit with the same code as xcodebuild. test_ios: - set -o pipefail && xcodebuild test -scheme BonMot -destination "platform=iOS Simulator,name=iPhone 15" | xcbeautify + set -o pipefail && xcodebuild test -scheme BonMot -destination "platform=iOS Simulator,name=iPhone 15" | bundle exec xcpretty --report junit --output test-results-ios/report.xml test_macos: - set -o pipefail && xcodebuild test -scheme BonMot -destination platform=macOS,arch=arm64 | xcbeautify + set -o pipefail && xcodebuild test -scheme BonMot -destination platform=macOS,arch=arm64 | bundle exec xcpretty --report junit --output test-results-macos/report.xml test_tvos: - set -o pipefail && xcodebuild test -scheme BonMot -destination "platform=tvOS Simulator,name=Apple TV" | xcbeautify + set -o pipefail && xcodebuild test -scheme BonMot -destination "platform=tvOS Simulator,name=Apple TV" | bundle exec xcpretty --report junit --output test-results-tvos/report.xml test_watchos: - set -o pipefail && xcodebuild test -scheme BonMot -destination "platform=watchOS Simulator,name=Apple Watch Series 9 (45mm)" | xcbeautify + set -o pipefail && xcodebuild test -scheme BonMot -destination "platform=watchOS Simulator,name=Apple Watch Series 9 (45mm)" | bundle exec xcpretty --report junit --output test-results-watchos/report.xml # Platforms listed in order of convenience to run, so if there's a failure early it's easier to test. test_all: test_macos test_ios test_tvos test_watchos diff --git a/Tests/Helpers.swift b/Tests/Helpers.swift index 0b329b82..85004170 100644 --- a/Tests/Helpers.swift +++ b/Tests/Helpers.swift @@ -202,6 +202,7 @@ extension NSAttributedString { return attributesByRange } + #if !os(watchOS) func snapshotForTesting() throws -> BONImage { let bigSize = CGSize(width: 10_000, height: 10_000) @@ -227,5 +228,6 @@ extension NSAttributedString { } #endif } + #endif }

      >~8Hb|9dIsm}J{I#vfr&wOMa z7ZnTRW33y7h;L-Wcw~dU1I>IVRJ)SQOFv$4Sfjeb-1&vWnz3>^=9BMnbAG#uv>J(> z)Gqi=c&?f>v`}eOaY>R|MCWa50ti+b4?E=>?e}%K`T%p52^$3PtKf0Lck4~>w#9dH_x7zM z(^Fuuy!tfTr^*#jwLNE=A$3ML&`JVW^%`|EhRT30zEWt$DaFyJSu?r;7Y9GfA%G4U zwlKozpOQme+UPeZYEy%@DH@`HoTar0XhU;fJ9DVjAQhAs9;y7TbQ27`~hOs+tApQ+XB@y)99kIW| zTsThs<*j49>!KZQ6Sqn>fDQsxWrIW!&5xI+JYS34-Wn;GXNe;SFR7 zbL*kxd_bbROVt{I-c%`AB7XOu99niUo4d2M_ZKrnOFGt-LMm%IyaMm~3}t{OTpi{~ z6Aj`Zb#g>Pn1JWQ_3yvoi&hg!3h6KQf&Gf}pxF;4)}uo?rTDMh3qOPMo; zTyW7ib*KHDvLC8vq?A%AfEUHk_OEN*d8*wRg<&$-oybZMMHd!%Rg!*2%AbU5>lR5q z=Cv&Ua~>tH#}9XV&_ndkIB4e`8TR6tHa0EHCse7k5MLb&+?WA)@L5i=049k##__^7 zGe>p%7fC+kuEla$XBhz+VS-Ld3#IyTAA!iAsY+4(;xR`Li2+Hmq7+`AzEwaD!#T|a z&HbS2DD9;v`_3G_xRFj6K27k)Z#jM86ETj2mo&&7sj-2Xzq?Q{UlGIBq0=Eu&n%aO z$s6#~f`1>&rwDPDfIBPEqKx@+jeo|vYvPn}fFT_tys3~j zM{5)O|2!p78p{Eimj_+R6})pdz-TeIEJt@El%^@ej&4{9IR&U@5&iJA>L@2Rw`YI=7_-22hD8Lp{M=Z`|#5TxfK55yjztahmQ(s)iCVGPoPu2dn4 za-jjKa7a2?w`vn`sxxWBQ#WmPTolSgBY!$@sp2m(&LRMq3GvI!Fz+$HqmiN69=3E{ z!M086*t&LLQmXOMa!HXRMAO`-^t!y(!7~O&C2dB%S?zseAQ(QvZocmxDEw~bT{;MK z_O3q*ScluV6+eeNu|58-3KJg2@HNW?n!`t>&wpVNU9U849JhO^IPK*D&q#+J)f_zk z@&|AGGzqtOey5t3c3!ZxD z0NT;!-kEc~Dn4Py1Rbo_q){mPYp7F^-f^Aa&wc)NoDb&-LLTbHVQ+pCtk$J|SBfad zc;>piNc7B~Q!Y~o!K`I)MxwqwdA{o!@eJOn48jEfop9uyaWTq2*e$2N)Wc=dW6#vm zqSX0Vi$P&Z#c_!dRQEH=wPE1g-S$CN7^HNI{qV}63Yk{O*Bj*NXt{G;%lY7xVCvh4 zwn=M5qDZ>Rp2YT01Y9BOuk&1F2ZK*R*vrFUW6LiOg8Ki=TO*ml_U%_yW##e`RX$`E^4}v5@*;jqV9D&nIv$!+ad+Q3Bup zV_l_4Cz8rHh+$DA#&4`@NK2eWixQ1I)nFGC2UYH@MRp(mrV6mq&{?l%NU3@|ZkZ_Q zDm-J!7tdW4>_oxbp3fLrEU!+`(0VfJ|IP)_x3d9zaeGn2Zi1|L6k3`)j%LYnP*6$# zR%dTU`uD6fLJVE63q3Q?zl2(<%T7t|)f$JN0E9vRT&UtpN*-jv-A=~R1?xQ9aNs|C z%6;jd)E^7Vq+>0;(~!+D&@E7mGSRAM+fPPwLuf=e@LM$tayMp zYe4Q00{J7-Q=p@L2kLo*Q;$_D9wM3oMT^8$+cUE{*_54`X0U>mf9^H7s zw|QG#ir~&yc`fho4QZqd@SB2_z#+xPyOtqF(I8Z17cSDw+U8P&5MG4}TAwxdebSA3P39rYzrW7N0wwKYLIYC~0u1mkU?VG;a{D zeNkS9CRu2tz2Ft+8WrRi>9!()#(6E{_B=hwy zYnh4%>o?(UgXIu~oH2;jugcJ(PmNg=Fsl@u@P?gyR_Q4Fmw`c7SSW zkl&cj0Ki%wMPHV^*M8W(kqbnXyewNNTqM_dxKfrVr_@CQ~gQa7Xz?{nT0HAG&CD?94cF0u0A|9L4Oqe`%Q!xn~ zeMjhcZDgPPn&Y}9K{mNffdDV$<4=A-hFA#!rwDtf1waPvC^2x1(E!2J6soE$LGfEr zaS44?P%a?ja@Y?nRFryPPg%ZDy}5AY{8otbf&n`bTAw<360AOE!u%OcaL*_rd zZ@w#C3lBphE2!cP^+9`n@kI+Xc3qsj@~OKTXxR|&{ZU&$es=4Z+r8yZY@;ZyC`XF+ zLH2=>R@oluhEB<8SKFKxt^e|*^1YFLXzBW^G3n{S^qoX6eEJIsvUfX?0N;&A--q($ zl+WIpMLyXL92+Rh0IPLv>aQk{s~h)rFx}2Bh|WNM(f}Nc0&}&dx&8GVwJ>LY%+df= zse>v8uM(xn7umy0ZI2eP|Dm#YulqUbBs%d{-Sz@Wd5Tgn)(&e>&OUI2Wc$LKQt;4= zG5*#Z;vaIG_mC%4IgAbF@CJc{fDsHCi}as4-eoqYB)2@HiE=$6R6E2>-LK{ z9#N$+*=>mXtp#!-5%cF>*9}Aer)M+a9}PG3+JVi3Y+`@>$FT*x5GUc;yBj`Zd`F|Mw8b_ta>4s}cESv^&=op}lx9hV5#0eG_YU+L$d`${a2Y^ne z9rqnLNW!p@@XxyLPfLs3Qu54)L8p8<+y?`7jpPAH)r(E@kv1vKm>?V`R{TfzMAxb1 zDkTP`v~cQW0@sOSJd)5Z~djgz0os9j7ibwsrsCm&X5%wMT(>jYhU|8M5u6>>##34ZZ@-b5%RU zX#mWTB~EqClLW>-m%vy1kx`aCgBdi7&hqDeywMP{8+rBC1J&8Fs}Y$&&6&>)GUSFT zNS&%(oej5F1*5hl)*%GAKn^81!!Jf+6JFEy67Pe)l>S?iI}3u>BdP0ZG2+ni!s@tQEx!qQsRC-0*%(YMvWSp2SK0Nu z14>Rp)V-yYLR-k`8KG|^u>|i?gz$FywJ#_2B|td9?|48qZ2WSefI5K;pB~vGGXcJk z7w*JUjwHC+)HIxv?9Rq-R1da?E$41rm*0+c?M;ArGMrwvvhjl0QD`>k zajhdW{tUw{m<1(-VK@uRYlzxQ)8U8N!)ho4^M-6{^lr>6O^vU8KknGau{CeQxI~viP+e#7?p~; zJp7lmU5EL>Fz8GE?&a}lRi6zw4p=Y6XrH}<%?5}h6YTUWV{yN^fW!_Y93U>~BqM9? zHW0;klcHFKb}%Ugm$JdoW?0wuGs>&u)VEy>BSQt>OTk9TjMah>bM}J6z=O5!EMAQZ zc=vKFeG+=dKah&fxFk6#(;|f60OO^}h=Pf4JZgNEeonwBjO>R{fe>K_r>`287j(^^ zVhp5q>kd_fY~5q94N_*S59r}nJ_jSEfF`GVem(?Aoq@!b0a6`H+be6giI#MOHKLR1 z`iagmXUI;$DT)2rL%hwUPdkWcyl-2f@)}SEBTq-pIavL2v-FUy!$-1jrC!dC+N+0` z&OSvBTB{4-knaE1x%BIH(qb!q=|*gKJxA&A9x1)U>m;h3is-4G0R)}=(|=FT2QO2V zA*cKpIN5&&E>`W6uefze-)pcfH`PhpPx*|nnV%(+7+coN|1zlLlW*2pDlHeTcc}6e zef292y08McB`Njb^gJ;$L}kob_OIRGnfj5zeD=VCHYY}&2oVS{O^S^FDIP7vlMlRP zfsSZP*l&}_jP40x>({@TcdU?JAibTzMbdX zkJ)FPhkJ^~#=!HAB%_f#=?NISC~9=xVb3=zNLH(3+g_|>z>eZMLT2$ z=n;TKNp}INLF2YihrdjvuR*2Ja16)EBrFFbWOeyHH?&a zXv+?{MjvD@Me=zN{t56mS>e#z>ArR{;|E?GkIQ9oHZqqo4^)dF3%>oe-A#Dmj3 z>k6xhz6tmFge)Jg{@Pm?5{-M6F>KS+s>d(nJjhn6`R3SftN>VJyXe~7oXZ${xw6Zn zsO)(Aj+2saMqOwIgbDt$rqlbv{oqX~+X3+VfbX3LsDds&e)0<-z= zkO@V*LphY5^ju!0*Hgsap3lb`IZA%n`ltYLfS)Uy2m4GSvV;Gn_ue=)yQeT4D6LM_ zX1CvNOY6=>lLg>>rD-;Gugcz7_zfe%Hm^Q)Y(^+Kq>&hbZI9x*)o>^Pm2vVfryrm# zA#GFJziKp?f_WkW^Q$-^QHH(JC~2-MRF8~m{n+y{2D2+Idp)eV>oFB$MG@Qt+1_$! zpr88{*tm7-^hc+F|Br`Bw8XDm3~6|qhU(e9B57peisr|W8}+L#2A@g&I)USANZJ5= zN8{5i!#>cq)er9WZ^DFWjwKWqAOp>!0xo4Qw(Gc(UCsoWNI|)Z! zlwO0?9LAAoKKsz(5fdw;PgWhoiW#ISV+Q1a$=IYc=R;HUXB+Ae{(aVqtD!feaoQW8 z6;(tMXKPg~z{Ks9h#nAuSn~8*Q%zdh`MqVbl75QS3JS}>J@n-hRYmUwz|eZZezXkE zLKTuPtau~0A=|y5wq}S4tdRdbv=q>PNlPNIvusl+_PE{SUY?Yj77-##a^O~h7%`ja zsNKFxf|~IA66L=LFEiAE3p1?}R)rGk=osaZg_Bf?at;gH>6lVsawJZ4zPdghi;7={ zE&njuSs>oo5=n?lnAQv6(J&^Hj;Q-0G4o$PZ%3b_l7={Lh5;($KW8Y>VnT6fXMRfF zqqp`NTH)`-S>qgf`lQjnOQh;KrB4%Ffw^@mlP^y}!tvuSACc%1^Tfn^7l|Fxw7KqC zAXx2jCjHp{ZM*x_78AgltkO!|+C~=@0czM&aflkl$=EsgiR27;TNfb4eRAfSyK^eV zjJ9P*&p;r9u=Wks9n|6>rAvOuF1WL8W4r8Ag54{}gx<$jo}%>6VRJ7B8`4+?8gZFktIrLN^&7DDo2HE8p!}>wSVE4}m-91IN8dq?Wc~{8B z$W95d9&ft_(_OvY#S%|+2C!5ZyXEhAp%gB7b;NkAo96}q>VFI;d9)LI`br4NIjrAu zJtn58&Pa1Mdr$fGI)2MHoE}RV>fhq} zP0*VU8!JHD;9cV9K=;}paJLPK))eO5xE00KCdRaO;o6z`4b+i7IREM^mhb)F(zCN< zGQZ!Y?=t~ce&o7soCJ)YkB5YUH)RW#o~7QNXSmMX9$$8MytxIO?c|tkfjh&=!M<+8 zN`?#zgZ%I2z1MvIncRbEyN`_WMK5U4CYfvV);m~M-07HKX(?$K+Jug~gNeJSo#>W9 z3R}`4kgUTi?vZ65EQv1VMGB3hxK;nR9KS83K42SknjH&NQ;r(GBG2KM?j$M_cW82F z81*Xoai_rejpK#r;<4i=Fhr;TC8B2E$5xfr(6jS@XQ{ii28j;br$S6iQvDt@LeW)v z5+G*>shF{6u4LRE%D;s!O-}zKcjhoIZmSetdsqAQB2?0vCBYH4Y)+8@C$mYZwLG{1 z7CjVx-jf~%DzKCThzM=6tZ+1OxxkSJ$4M>lOG+K&^$dd@Eo%$h9Ly{Fm!sBZy@v6G zX`(M>ta%#x?h4at5~Q7?$2N30YlT-3bIVh9fU3B4OK<^^cX4(ug+a>f7<&r3`bs_H z7~{(`-$b22MUZL86zfb9Q=;?ol*9wT0tTinpI{=9e6ASe$h(U4n14IYsT?OZy*(?$X6Gax(P%^$;Q=U?VCdr1*d# z=qw_%M5Pf8W-bIC1k#WLsF~>CCd=))YI**NO1dmC(fYyiZG(`+nPPZ+lJu5FM3p2ncbjxUqc76goB?zystuEPy-q_CyF5!_(i`cGbv)WM9 zc?cYf_Pqp8U7@WJtja{vFUNS`t?zA@xmnd3~t;vBjV=n&%}OUb}VWuE7+|!8M_}3FO+G|k@XW$m)YtQO?X1&@Y_ZouWS?kt=&&1Omr?! zy>Q?kb?yngQQe+x1q!%n9g%qL^MBom{`MJ=x0;l%7}8}>ekIjWm+}-~C9^UkO>AkwyeA_fW-EqHW`RC{D0lX6{ICDR(>)@N`#41nlpkU-A zEmeBXo@!SXj00E#AnmjYOsw5U_HUFb+7j|+gJ6_+c+$Ir6Xt*n_FVvli-v$LLRcKy z2A>7KEr%Ze=$D1weM;v%S>ub}(-L)a3`Vj_hFG35LblY6&|xSH769eV+x5zE}4{XQ@(pt2D^9a++Z;}oWU1{yp2iT_071n(p z;N8BjaNJ1c``|aVBi%%Yk2PqtpGpxWl2@lHa_~b91Nr!#zxc&Q+aK)N8gvrU`0;{U zn|5JyTtF2~&wlgyW{G@f{Jczn(VqA>)e|aVBg^k23WCA=n3=o85?|wyHSchA(=i=% z2@G4pPXGUY7D%CkN(#UAlVSwupdT|5f4cRz&}EpnbX6^#I{m-ymx+>1)t0Zh^0J@d zhqTYpDYwQoO@~h*jP^R=6&Wg6gUq|Y8kb2t0G`{c&wBJ> zFjMkhNKV_?)YplbxUK)VGR;I|IX?>-rgiVd0!GbqzXXTcb(fAAr^L))mNgh+ziV{k zT*-@sxk7o+9rcKzB)7pM$M2tQAgv5PL%fGR?Ho0^ZAWLO_!Y1U*TJo}vS2AgupzGx6 zau3tl1=HubXj8+GEORRE!m~~Ia~U$F64wCK<|z#FuZ8O0H#;-SL*&N?rV}r3nIp&^ z`IdPK(hwBFTJAHc+0+`|t)v$!;Sxg3SAMPo15jJ2?I;6Z6tK zRBsu>N>hJJp5E}@(7vt2rEkn_2xI5cMQTm82E3E3CsFBX>g znLAps&)v?QwwHSkKGsM;*S~knUP+826B-3o0=CJKw6IQ=Y-6jsZohYcO0_^Pwt(P5 zFR!1El+%fVV-kjL#jp!FkT%BP8{NJbJT!#hOkLL4C3B3Su$wXh-k_VYFWBtx?mT1c zEz5e=3w_LDfC;>0UbC3u@H^BYkhrZV$}9WuAwtzqS|iB>;X_Rr{$xMN;MnKShBWO- z^JtxzOnyv30b;<$Sz!aP^4}S1AEM;FVUBC5Bbl7*^+0!h07v^ws(Zu~=Nfo=$w&{@t^d@`WS-xiv55ysZS!o9VdN z_XXBYwt(N#g4%I#YC#x{FE5A=7sf)~B*okrqdZEtE})Mgtf&LHa0Q7*P^Z_GN5?q^ zlt4Xaqf;Ljrhe6N=EYmY6q#jOkq6;c=)Eyrd4DBnan5upnR`@cvAdnf%{cYhOUXOs z$lr`V$g(+d!YZx^N(h+OCSzOvlh`ci(=mHQ%<%Sd*w5-34B&oOAMTV$^uxih*o>4U z=I8$P0#(Kx(NzS<_TW5s%X>XP*CVp)#pw(JPmz7Fx>=2sr=?lv6UYG z2H%4up3KFpzw{*6iItj3r};fgD>%j+DYlz=@;gShWL_Mw9wcB}Y@yYw{bvu#X^jK} zPo*-G^if?e5cP4_YW;M>z2m)b^wJ3QR`U0sBcFI2R;kO%>S7n<`Vmrdj&Zh{_@}m- zs|%Mr8^QL*gP4;z?Y-YgpS?+|rjbrSxR>f@Pa$XQ(xrVUso06)>Q#rf^13C*w$oL` zGsvC~?eq5lNEE#T426>~?&9E!wkQJZVK9dzKX113L{a73a&#!Y=^@?QHWH;xYoq3_ zJv*B+`oJ}gj;q%)whO0NXz5Z;(;nz##-rJN-pQe(N+_SWhCPYty3OY|A{D* z1y^pQSmxd|2walYVLz$Neax2~mw10s%vKzOm|9YRWe>$gq~H)b05IyAa8E~VZ+E~ z3?VOof!XG$^#q2S5kP$#m7!_R{pBL*-&J^ctLlPGEs;_cApJ<0`=&KG_=sqnqddb|urIW3qe9{fO{s?*X$h{FYt#}S=gbsGH z<_i_5NyZs;6j&n^%RZ$fw$g+v%lV8Y&6Ec)R>vllQ?uf%!99eCgIvbm@?u zL^*PX_sg{QZ~1xg_F7G;|1_`z`?&i8s1B2=bB2?y#CRaY>4j-jWp=%D-|)oRp?{F$ zYv>*P>%YJw5af4gq7Zf9!N*=2Sw0<=iGHxv23RM$v)A)#TtS~oS-jYU`lOu+4h>eo zaJUR!O+kuYyIiU!!%_Q$>#JXOn9u3FV5_S4A&`@}GrIksxb1+SrH@-`wWWfTePj)U zjBNL2mRb-!FsO0Qw@+5OBK@~D<20i>9srT--OzJyq(>C({att8kUI)J?gq@u#MNc zoT~gMU=$t@HB8`zSfMD7Os#qLeV6fMdY55HI3c+Aj$yhS`!ZuzAt9^Be{~m7^_#zr zAgn=>gI$C(EG78O%4RTpQ};UOkr*WB@%+o1`f?P*7xp+li%?Ys3()g02m}-tvL~Kr ziQb6Pb>R$G(}Am`)Pl*U4MADAZzo?#{wR=EQs!10rBpa91kY@HRUJeU|`_@a`FSvh>^T_!)mQ0*O_E}!J#lN%|tP7&AL(dmGZjN z3@z6=&Q%vD33DMe)`L5m;(+S0@8Fk6)VsXrL8v+%Uq+L+fE+PvBH&Mwo7swmd2%b$ zk!NNK>K~CT=~XkR6<4LiicU5%RFx`C4hQ)YQ)Hv9&WJ%r@Y)KHtX2Wc%9-6YSDI$} zG^dflyeMf~oU9>HASjBBck+Y4oTRz_&%F>Dx^gLpN!hH?UKq@bfNbRR!9b4k=f>hR zI5sED@xKu`92>E;F}%lBCwYILyw?+bLjQdfr)R_n6_U7RaP>v!h;dj&=&E8G5}G9b zXBNq;Jh9Z4g=Jc^Lsbl;`~J?#DGDG=@^|jn7SwqitKZodUT?Bz=?M#$c6Jh0PIo=Z zFo2%qyE^BrQ#LRFg8=qpozR|f-@f%oXdzeT;M@>W9_z0<+944rQT#m5m&_oP$^I95 zI)y{CY@dOa784BtjrL%6%UoT?`Gb_AzH}cP>|0fuls7qmId(cr_qptDEtanZBz^Q7Q14 zEl-x{dlOiGb{CD?h{5rPC*RWIF0EA@G5OJuKdXR572vkt(d01y%ha;eS4>QQFWU}0 ztaIHaCyJ<>72v?j?TmT*)@~%BKw`qbQwdV!i@EUr!!}_p3;vY(%b0=pIr%q*SX|;j z?nelgPK>cS_9g9kE|bm-dvGsJY6YYIu!ab(SF(1kKvbR$w-b-Mal3y@!*lHy|LKEE z1`N)bNOCe&(|SG#f5gqp0{_SqY6k^Y{qk)GjD(3)?LI;yXaeC=oFW zI~&t}K_DEEe9ECB@Q#NfE3ME<+QRtNi8YMgWIo;v+5s+MQ{o+3y%Wp7D!A9?qASCh$*g~b{1T<_l zq6Kw-2tgA+M0kU(SPW{4bCocb!8Qw)(jS`0r9DQy4`=aK^fQY2Qqyz9xh z=e7o4FMeDcVGF+9h^`f;RP%4I>+@%mX+R$hNKmJ8#6P3_)iPcZk^7ely0tz5zB{AI zKR3AR|95c+kNxq*)q3Ei31&R_fs(Y746CltZ?K}jJ0ZqgJ7>Wq=Wi4u7YyL8Uu%Jy z(P>B5d3U2H_*lpI02f?(zn*!4!Yp4+`j8v%sa1eWfh%Bl8BTF2#|f@&cHVBOK1&#G(c&TLi4vt zJm^Y&qL)d_pSkn^rtaEApj~V#L#zgmZj6|ui%t)VJ7n&+5Y zSkQCS?CV=+E}R5rwqa&GF+-Sa*GC=|LBngih<_b5GI_%;lMx zgv#F_4gI?nC>~AS0nA=kOc+&_b-S^J>t75<;XeXW33|l~_Z-+h!y6_o?!8FQ_$wN) zm(Hc94cMhFz_(G!y_1Azu4|gl>Yb~!Y^V!74A*Lv5rMB>H`}kPeGv-0sqK6Y< zxai_8BW0w0Z$n>4hh<;-E5#BsVUaaZp9U%fW5Vil?zF=MLIna7*i9 zSv`NKf#gd=xP)Zt0^jJ6vI*spiZ|mvxVYP$wP_#19~u8C5WK!$#(tTv1%1(+XlqTy zYhNG;h%RO%ouU7u?m6(=hX>E)7<)90=DTxnvnhy{sn_ar>yvU6&}0>=QS(ijjn}0! zNZ-fEGJ~^x|1qraDwW1V!j(w4md)2?U&9NRbdkKY9OS5%%>zDOX{L z05$R|r~k&(X_lQhca@Vk-LdjGGDN7_JN{drH#=-X`-y`lB6Pke9^R2+c(?jLM2`2^Hu-1OWFsoGaEU_son#Z8+)g zv8e*d`VMssl{8p1N~UF{G>*ffwdvW&@hKqGSphC z>D*SRqgOXE!Oo*y<~-*!>{vMHhXX)v_nvy&_ON&JBK-oEu@r@fLGuX~X0eFxld9xE zZB)U${0csX)2jCJI)=6L`(N*%S^JvstLs1x>b^;(O`pMJ{AaQ=5W9=l zFG24`c=gURht#u{vC24)HUKFS&>89W4RRk))r%m(G;5^I5xlhV6YkjWA}q*qeA!4-0VT@+h8#9>*0TIqhMMwqrn!Sq(u{S9;lZ*;6ICUh6Zcx z7sivMIPT|;Wk0oeX)>yqpO8S?7|k^;PSp*!9fQj4Yp+AQ>5g3=R$w^bU`dmK!l-M| z6=wbjLIm#G3Z?|uTKRQ_FSsvZ4H- z0qAWIX>%m-lP>0)GP@J@(F2<)L9|#-Hdl`wrB&T7DJQ!0OHYc-ubpu$jg%PFwSs)(}7 zlF;|NRk(T9k6Ry3d)4f1gWQrF+E;^7&5XiB$|Eoc#SLTd`Eq|9n5J9Rdc4>HY+OY? z0UB=(92~8p$JBIjwIZ}8(_0A7vVe!**@Qf~Ya6uyTVAo)GHYrDahBuciBzcUXpIFm zf98dXO8&47r7f6Pa~mCjjT_4SXtec|qCrd(ZTKY@NyBgPF8P)fLK&jLq2YWi+^cQh zrZ3#LDlFZhLOH4@1q5J|5(<&;2L0R6nhyaO!(`yC0L39=pvsv@(7v(kk3Ryvrg0kH znab1vyjOFdUmt{Il_(O59=T?B%P>j{iVir)eiu8cgXtt`^>J6ffTz0-=)#;{m`k?! zQ*vn5J3H0Dj?e&aQnf5SEd=r@y9<~l3^}5;(KPE+_0An$DPCgG;Gy+aLp3m8p>Zkd zO=;6$j^mPwUTg2iGr6;iR(FdNbQ;PjTvd($V8w>Gmm;AAOigENM{Hy4rQv*b#iNM& z>J(@W)RSSBhKZY($Dc<3caT9sa4M|IW#|zIDb6qJ(9-}=d1Jz8?hT2*7&aNI+)0Y? zXU?KSD6uJ^$j>HXO0*L6Kpato1%b%V<>p|_-A?b5E325I6cyB2s*f7ToV+le#O@k^ zdE}Mz`NiygP29oUP_7Qt5C(2CYoVhmURsA*==Ya#X;%Y^@Kuq}!3f1|Ci`G!^4!(} z5p6k~d^}bjM63mbow!@xp*GH`wp6DO=`33I^0xz<5F9|0$#C?1Wf_|yAk1yXaHKWyAO(PO~Szv6fD8r z9F3CSV0(inhvk*-lV#BJ?zE^lIVUff7S1q#FQJoprC zK}+y(hUyek5gL#HkyXql8>(3~o;r??KgaNbnrLqh&ptl1svA0sxtNycCH5;oY3GUQ z*7{zfs63mI1XG%H2HKnQ!fFw83CjvH)%IcGs+en&S0wAZj=rp}5Z|pW|Kxy`r-%(PK7W^Ksl> z_?0hW{DGQ9SnePDaU8`Zw~H2S2zostApQwn}D@)O={O3rWcAVyqRKv0;1}0j|u9$p?0j zkMjP=Z>5iszdao~#L5#OjUA%*C0cJGh&2l8eHIZ&{Vjz^2&n{ablVp)yhM_R@iNZgQE^eEU@NT z#6eB+n>iudoP>BV?AanjQYY;5uM}YNH3Ak*-aKZCs%UrsIcP^o;BrX)e;rmQ{G-p=e?Y}_~c0%MNNnpkMjSLA-TR1^E!80`I{xf4Ju;Hm%CIL{CGZNbCB zQeodZQR@HSnqq*BR<8_%lpL-JmBJp%Xwbb-@~MAgVb_h6AV!|#3fDx)5P>cZZxkWTL@ zAVI)o+dBokz^6-Mm{U{;uWj z{&dNtPn-m-4r-ESYI=ZrBrRI&p-4f;LO8CKiwq?xC?fXRYV)@U+QO`%)l=8YP%+sa z??D*LMfeA@YvK?0iN;syq}UN{P%MXVGjT>~!BtkhxUO$%fn1hlEINdKF1jPC7_NLQ++aHWI~Qm#SG%ElMl7h{`oNqadA|=yhWw24|tP6KK%Ay}vMjGWR~M)%em(4Ts^kG!k;*V-WmNTq1ky zaX?94a$vha5`xZ6;x0Lh;0Lk?Fi#qO&hr6-TVY{JDj>0`G+Vr?U1Cld2CxHf#i|D{m&-+@v&_9?nR~L216@Jk18GsXE zztIWCO#KI+k-=Ptz%Vc{_#KH1dFU2v1`!qMniriFs-Rr1*`Vml$5oeZuzJXTVNg;} z5pgN1QyX62>y2jz%sBUPgL3bu6NX7Y$4G8uY^dxjhe9A$EsH^#L3ruAVki${<#G)& z$VrRckw|~q5ghQDYOcD^LcCZyGQje2BIeYtl*)PMg83!=WJfO;)nVSZfna|~Vp|FP zY5(6<>E&vy;{!(~r!hLxmouzWtppMGSlTf&LJn|S7+VXNpNkUL;DEvypzY)bW(RJK zWHv!#)$H5)K}P!Cs{*7F4jyFu51YA|PT$+J&3&nN8Ox+P+t(LC>sQ8JK>ys=1vnW!il<`f-5%ase-;eYXhOW>w&cayK=}&R-idtC zhlsp)C;+R4O%%@){Tc#$hVj}?@U1(O7hYk%nb@AhUWM2c%xOY!0sy$cOZ>*hZh-vd z(TmWoIDd~6v)|j0L7lpBvOx;ilcD6I(j1aa;~iitSR^B|9Ple1el{&vrHNwcuA(Z6-X?9_@RE{ zB~?VrF1y4Y_Zd)eCJ0SSO)j(NcVTYR-mJ7iiUHy@0RVkey)#rQ$i0<`!FWhdjc+ZN zyncVI!CFI@)7!|_bD}se7Q=>_6#hxMI@ktZ&x$xS%WO9z6Q>6wi(BK%uI${@{ zWaS5gmN-@kKdiwC-96ML{^KCe=gA^VyKko|HszS%4G<@Xq`zmS_Rn1=BkoX%b{y5O z^w&=3=YWX85S;+z1hJ-Cwoub;WKAEHO3K*+Vyb<<#r7=c_tFW<=)n?VmB}wNEkRER z57a=uRy-rlJBL*7ssIr_$Fky z9J{#Af)`7`1{&5R8rF%c+vqjRvOH&$g*M)2AE2liYyOK>9S&NNf)cdb$nb}0{JS09 zx}Z@XxScHE5BD`hq6%gI-m>!vG#>p=tH76-Jd^e?vpsovFj~HO`|#ZfWu9?KkF%_< z+47++0;v!aSy)0~67R!0RJ}rI)<34=(J{lC^O@UholYz^(hO^BmrZCF&Q^oWynZ)W zPrzGCEGO`qr*1C$h8f|5>4TJu`98bM*OpvW z*o2*KjW2`$hc^CG`>>uHO$quiE_d!mJRqyNdrBxaijBQ0aeCEF9Ay0=&Bdp){>Vcq)jr%zGS~kn(l{;0 z!L=o1uP#Iin?RdJX-Sir8@%dqKf#Wkz_|x}2}Y3QxDyfx8VKfeQ4RQm)VNU@PaMkj zhkyI!KBxaULUtSCsESa^kdcC$lKhVJzcL;0*R#y*Gms*f9(o3A(7<_5z+?E$+I5t(|o+ za4q~OYPm^sKp|wiaJFhz=9#<{l&O;P_!#BF_FMnmav894Xn>@+?cO7p6@ZVlBt~0-2{Ic?I<~NO> zoBxET+j=m5!+>V?0{H&(Cm_6+0NafUHn@Uv>tz*e=1A>z5Nulo zZ-=D-Z%KNLBQ2cqj=K(&34h4=`YS;TWVja`hb)&MVJ-h;;f4E{IKYi4wdy!T6<9M= zDH;X%7olFt?T=DhP|7_KP==lR?Tf(`0)ciOPdh{kPc8$W+|=769y2K~4Zb2b7(X_; zDo+)ovsJssf6X zxX(z?P^2ieNj`C6t`|Cn$N&+69|9EUn1)~U4JKjfi;{UDDayuknlQuxCagG{G=hqDo!~PS=n@_~g~9%-A7* zIC3YXbh=}-mSxkYTYnd}7Dn{_2xFhODPU7z2U0-ipNKkmvAM6r`9*HYatyS9RZ2yf ztpy2W;(WuyzM}J$V`GB50pNKT1GKPin{ZZRe)o0!yNLO^>{D7wNXRzn3Vs2R1ENar zC%6ue8twvMVK&Dv2VM;+eqL=AVDS*4nrNF!M7(@AgyIc{Fv$iRy= z2~Y-I6XIJ?MvQsHci=m-!AH9Z`TyL^wohW$`}yoTZROS+@5=$dS0R;4c z4&=(d_k0}tWxTFY8Wy>ne`E>ey2R6NO{+pX^OXMf5IR4eZ0FfK7p2 zK!IW44KhPry)lb%3h=F|%*uBqnf=%&Y^XzEV2JU=rGMauOMC-St`muO;Dn!1w*(IsC3kw!&Qs~>Z1zF#7$1{i8R=e z1V4a--UzT-k@ABP@CcFW`WUriW_G`(O#p%V)W`t&X7`VkFBX643TZO`BwKQa@^mf# zw;F&yG=B$7;eYq&SUT(YnZI)WhMZKZW$lE2rkU`j4W=Q~{KW{#i9p{u8-Ol|JiVN9(LxTY zr%JCl1}}iqt)hezdCn`fH4#J?RZ^*cjHmEqIe$M3SuuBOiBme#;Nz4dCjciRl4@N5 zsDGG4ui}MN+$uV8Q$ynKcG|vZQ^2OcdsEwca>t}*Wgz70HF8X#~^`qm2M zTqi9(Uql$*CaE9ccTMa4!Mn*L%g~s5E`(KA>Z>6*1LC4ptbhaxA0J_*42f?_gn#nb zq9E3>51Rru1-707!`2GJu@*GJnTDqw2e4)zQKdMpzMVrr7;N7kU`4ptdokzXfH!{& zXd@tc@o`XKy{yS)`D~EAeRl(gxcnZ|X)#dFmi;&jFMa+Y%y)R(26g$xqjqA9``%3VRb0CL4QS{2sP#(53aCt@9u|jBiGxSY1EEcS-u4i-Yy9t z7pXFz1>dTNt;MY8x5LMF*dp_F4YH2>G4Kn#9Jz*+@Cj2F4A7G~B zCPZ~T6YoB1UZy$3Vk+2>GAmaZ5|>L#*cvgHCn*PU`X-H3Pu9Bl@c=e5<$q06Em>0W zRc!rum1eeqyOIAAB&Zw6?s1>ar(5dxnZ`FUD;lQ(&^Zz6FYt55vZig6uTw?i|848=(v%H$CJpnlueZ3^rb6d3kEs|E0a`53b$AlagFo)ro7YRng) zvoFm2Lih5Jk_6c=Iv-8v9)Gz10_G>yOap2S)hn6ufuIAMeaA)^CwN(+ja5^wQFS8t zfRpg?(}3@cgfNRG_^lY{AIEoDGIe467XsoBsUyTt8u=}hTO5dh1Mt9uVM-y;?qU^X z0K}aUKH-$_oWdt&vOSt;f}lHF*0zP`{;~b)@=H7V-EB7x_yZfd7k^RX_bNOnuN!;H z>#v-F)-WW&SHDBIVfB}N7ea`*YgEFL66Yza`R$W*YaF-)fX@o^0sy|6D0lUX?58i3 zq=fs#k?|n2`PeFjYbjxOoacVe<8jPOG?>OR%5jR^t>(`_dw&BfZ4uABC6t2Dy<-!6 z`UI(aWhHm@NxmA3Ie&%nlcpnMVyLtTr4ZlfT%k6~tBcWYk#zOY!r=YLI}i%951RsG zfC9t7tNsAS^AYx+BrEF*%f8I3^6i&1dt8#=tboa$b(OkVabNxn=2aE35zYp9Uz33A zdA`vO?Rh!#5wp|A1;kPyIKf34Zyc#@Q_RvO`9Jn)o(jrfV1FrWSq2y27yyn#7or7? zDU(_gW0q$vp9c@WEAc7Z=b=4{8Yt10{gS6MlFh83H85I(9`I$NY^+>A9PNxZ@<+K^ z#ts0t9eC@w_J1_lgXodJ6RV2voplzkoRZ5yz>FM%-7jz{rPT}BasZ{p84#u@ zt~K}b!qo9X?SGE_Zz%JKwuXoRSd?I6oY#hwD5RV!=|CnYxto>Ey%dfWbCb!}@jCn> zTMptyq-9*^G&pF6OyL*+7#?}kKD-!AsZ)o;Q4=(1^)gz4XJ0|X)ZtpVI?O@=mz+`& z1*w)=)h>{<;GP(t7-k2Qb4O;3Fke0LG#8$2cMJ*bV}Hz0U^s3rf`7{FhNW>(ttN4c z!MRRQ8wEm_SF6APjH*s>758C7=QH*Z8TBhbgo#xG$$6x9L6lO;D9sFJFOCquxsJQg z5)IT^<+}z{)gO|zr5o_|eNetp_#E}^D}UdXf7#V9#@N*jc)$8PZl1Nz%%2-8@t^}b zLm!8{Y))!@mTcH@R+p}eVzgYudHQf_gcoj#r$#wnUPLYLj58%i7><>&LgfS!-lBy1 zl|%N*z%O+L9kM&#$P3Ip65%==E!G#xQA^*6ye^WFmVeAIuk<-iWH?YxO$)Falz-~a zoXVTgolk0dB6VJ=WPn?QVLi~ zZAmb$hpZKpqpegDjBd<3Q|f`no-!M=#(n;^Fb-8BzKwCNh9p0)pB-$!1UKru%*nbx zUkmUZAYFwY;;Ggr2M3?vK6b30uYYqLk;23r8-6yZ4a=wn(IMd+Rrzie$*XAqone?7) zWbbmM&4q0@&AsfNHd(SuY5X3Q?=lYfJ=*e)Q_ky*s~kD=i{)>cS66(g7k>fXUa8NX z2AQj5%g+x7{!-W-AHfR>i9C3n!mnf-eY|joxG%gO4w<;d6Ew#YEA+?I6FVT%6akpI zev$AR0qETI3?!sbXVx&lNSe3ley(HpH}46`$C7yCbbj|p?Xn*NqXSaAaUnn)kp4TK zq8@w#eg97BY-%2QOoxvcjem!77d-Zbs*OcCh`>0_{lSkX=^Pe}zIXJ|{$W#K#86-u zc-2KAn~DQ(sG(s<)V0=mZ<6th$Lsow8PDuFA8TgRGq(E|b05;$zV8eHZ)Hz(C=B|_ zsq9EM$icN0c9sZcKl5c|xmX*up2Ga8lj3I=S^dt|Uj>7NXIVp>*?)q}*fq3sb-I%P z@t_P0#3`NZY>!206{3gry2Av*+b`yMbU!_6pUb@7d<^K25g~@nf&8_9cGVle`>(DW zOP2-OWSQJFVkrHNhKyJa_#Lf$j~^W`%xatYL)WdAd0G9$hX7hOAq~@cp=7PQ@Hk+w zBKhVxz={_1h$tK?u7A_PFv9?cj_NSa5gx7*2iX0Xuf>2{WKP`)uEN3MYPf;F(i<>c z1K1sZ_!h&DM41Z^aSkF8ORHEoI81ZcB zRmqhpMs)NOw_EM?3AWV}gP}l)b@vP;s#wOudG^v6#}ikQVhmA1`uj4Cao^*)i~HFj zy42PP(P8}xW*ZC#JJu8<+&E(z*SXSimDVc08Bsprh?xhLXPObW=AFMB0q7B4^y<9j z=!?-lc-n`&<2S71#RJ9PZDy;2@+@>QFD@;?qt!>nL~ym5>zI{& zUj0^Z)u@l~qWfiVd$pY%%^j$6dD@ynd2kRM#A{JOY;(-<~v-9FLHaIBG3b3X$LUiref1-QWm zHOs+(yj8bU_?C~}*YSbx%f4aPQs6D%h1V?WcqcYXN>D-*eegFL1q=_>&KRQ=2d8_E zXVjNaT7NIl{hc_8il|{?GldIaBhaH{GXSqsdc1e>H0GX1G-3Wl?zEyFT9F* zL?(#w+Gm~*U&VZ4aQmX%MewfR8^Bx8d4NmAi&1LBbFC{(X)sE+*D;U!#kpB?r;*HO zWjF0){^l;E)^6D&b*VKEpRW8KJB9B#W|{X<&wpidomMxxj#0}2e-N2Fo}bk?^GCip z$Y^~s;jl~D7!}}%)$y4mqZcgVEXuUTD4Z@4?DtgJFFdI)!8-23LoUt$z_c4H2sM+d zyqpBUkvet7L`}Xcx6go+MP0CIKZXff;1&M^yyAJ6Maw6DmCm#d_q}9K_y1TNuKQyr z@_!WG?oHEa58*Qzp!?H;99WH@LcDD#Y`O07sVo|cM5HR3W6I%F**4N|L$$q36p4IL zzwPTb1uP2aj!FZRtLK_(-t6vv>fbG!)qst*C0n1g^Te(+f z%K$o&c1HPTvYo3y4X8Dm2`7#(S@r(_gMaMxLWeWH;h>MXh2PlYHtT#L^Udd1(S`x( ztB)x>i?cq#*ri4z0eeLJgn<~dAV=nih>m(G|2|x(u#nxex&L*^ zc73Mp$hpP#uWFQ>v2~1DmdiNOe9*W$f4BJu;|%kvKPqQiClg%r*}?#zf6#Rp0DrDM zUeu1k^N&*)4v7Cz>h*F(KC6I>^K^9#WkE_x2djtzz&$8Teh$aoNO9gv zj4J?n)7`)*Z18Je0qBS~mfONzy)rJff?qw-}B75pW5h1{ZNZ9CTGgXOlQ931A(d?us(cyyEYU&>EC#w;zg`DSuWC8=~wN zQLaCKEcM~akxsH8IAzno?Ew2a?0Szd78uiwr^>g|>U%$^%cJqSF&Z1aEp66lZrB|! zVCyu;JkQm~utMEXwVcZNDrCp;A3|4wq44p3O zG*1Em)~wEIaGnL&+`wIB@%D6am0%zn8SD(;d@%r=rlh$r4VZ3{ zRNxA$UiZnj;823yB%VD*>J6Q(zwnhuM53;j#R<9qAjI(K1S(0tKW^RUb;P+F*|bFY zZy&o81=N+^&3o6Z<&~1kP>F3)i9iCB!2=1#DQD8^K;*zIEW-G~hkp#f>j3}<=QXqJ zBckh0@|(m5ovn<|^|G?^Tke`5dxmCmm8gXNTX-77&wWp%oQn7+L;+ZY6csozE(l2jl zoAGAGh~4QeLd@OdP=9SGU7cOJ%ypx2S80yanCF;h^;gR|#vxL9Fv@TuOo&&N1$AQl zdKtgTO4qO$(EwYf^Abdqz!bejl?NE49ha~;WKUIsr<{^HEy7lhp<0MC@ClQ7(o&Rl zy;9y1hLbHx)q>d!O9J9`Mxi*e;6*+->1tU=Wd1trHJTs2lz$LLaJ=r>nB8S0_nSF9 zg&JerV{jY*`8i>(Vvg6MTRP&qov5-he0_rIip>*Ih(Lk+{QrwJe4RAcF5`Km zw`V6gk8q*oOn(3r8SN=oS>?K`Z{v4CdTV1egxD+W$ZB=v*U-ePMCSA zfS~mc!e-&y}Jt)fgbE!46KXf9$x}5!@&$Fz-sijFJLQya?boV1C;wc-{Cwm zyxJ>h2T**r%7)3lXH5t^_D+d0jDccAB#dcmLZ~NRwKHzD)AXn|+YUevX-4faY?rH1 z{xr*PkADIjTlxa;)t8FuXpnR+%D6*JurkTG#BO(U0w5)(!5vpy3_-a|V=Ew3_+yTc z;0F-y^#J)4cX$H@9kt?eKf{6#C)_-T(MOOR7JN-A={;vDYyx|?mL#>*Nd8koIRjD^ zNHY4-mE% zEq{+7fI!x~Q5`qDQki!s!vf}-hnYn z#eByb*-qocE@o#_faRM7Sw&vB#%B|Z7M$$+)ee?;2KT8*0WKGvLxF~+ABqi`TlQT5 z%n?zy_XTSK?=7E8iZ4UO2uR3x7wnNhS)h> z9F>!GC(2$lKE;U3LS;*K^TP(<4>U0&y zVXE@La4wkOlc-ZwYDb9+w==;6f`8L-hM7Rb$dK5F?7n^5j-tRYr#lR|nqj8Epuna; zjG}U!1dG`eX4D`O>xm-zLio@=1rZm}+qsNSLYhCCWIT0CnJmBcJUQrG#P~s3?A%jF znRsgJ8MWB?SV~`(=F^6hzUoP;O5fsHQATNqZCnCK%)%Kbt?}qWrd+KZ?|+XmZUU0( zk0O%e`eQ0v#@eCt0XSyNH}9FnsLM#PZ$A9>cuAzb(>8nV()M^|(~ctBSSi;A;1BsG zJ8CaEXJ(E3L4IjGAXmB{2F@l+$f?P(D^gWGpJ7bkOn?^tR~*MJWLTo4Yl$|@tZU>JCZMGUwFNhPiC4U2=t3HdYc*WalNHVzASUCi6XIk@{4IDbqc>~>DYjFBiO z`6Y6<`I2}uKO*(xfwI|?;e8_oKKO8ULgZv@`qqawdtA>rbO89186U;J#2|{={|a!6 zf!e&)j5|j5#>W_40jwrYw|+aa*RW3v%9hkKjAn0>0Na!A%EWSeE&U`a-(>(W{QFXX)PrSl{yuS< z9nzHkx%iB*tn-o-P&a=^XdVE}e6Tyl!BZUAW%hA@c6^eF0)M9*j%n#4J~fQTOeh$G zlVO2yD5qSKAj878JKjzs=zjd%x?(?wbKgr0Rs zv9lleBLVwekMUmAHFzdU*PiB~>7mhzT?n=>e{K12*c_D9C z9e)ntIXKpFDt`(ioDDlQjj<4NBshzY+F%lqn0mH_v2QO*@dXtRuej2 zJ)5I&*fru_TW*^+_b=@iln#8eclICKL;=?}J!L=iZVISJ+Yz}(8K5b7{`aRcdL5(=PF!DXn3!G*7t#OHoL^y;`;_0fJg3doX6e72WvbG0Bshd z;b>s^E!TImSw&0Z#5hWoVE}!o<_*{PC{JO*YbL3+N@{vyj1PoUThz6_D8c!f<+msU z8+7Lu68|%5&1St)QI4`EMT|kplJ%`-lX5zsEZs zz2w=MYJAgToFIc9mAGO#Turcf05yNc6MSOG(;5XX3GX-kDu9vSb!tY0@(xY~0fY>= z5^x~Mnw>DKl;B7u0a9eV4@bDpyF)}lE?F_}`zzCnG=#lGjAH7V-MSpq;oFbVJpa0YH>dgK8Ix?^h-XKmx(bl2EmVEq(-A5-~Ua z@9ccwRW~o>{dI{q`5WuK)tCMs-;<<2q<_Jm`laN162CCU!=8`vv<82QQC__W9Ij>N z)s$diNBV!L@RnG3JrUm8kky1`os*BjFZ)Gf)gaL&1`3M+1jno6EB)O3 zwxi~*Z~y;t6W`uN`|s^f0h!HW({f1r6@S2G zl@vWW20UBDN2bBAVn)<(InxC#@&$3G5mMx4wa3Jq?5GIO0l{@i024#^&+66@Lp3Ip zI(igOjd365Lfv700l;@&4siF8MfyReVU=W_sYa%_K{oX-l!Mq@)-G(YIOdAyG5BC0 z{89G69R7x@;mkBVV2pYYmLNk8QGbu?*cexl5e8LRqnh)$4aCsl?Z+_iZi0t(Y|(`h z`DsrWphGus=M*?qk5qL=bblj-#fNep$`6L2DsgoOQoN->@tVJZ+O0C^`YPjrFs9?C z1Fwb^{!|@;@-0806d&PFm-1dXYM1hX<4@foym#!zS*X=MT+9e?jkN?}O73SyZId*T5&Dh2CQ*uOjK2_cD2`1E$0}2Baf7t7Ya@&Li1^resgY9t?a0!UQrdaf2fnW?C?{3d$)V zqYXy^U}V8nLtEEWwE{5q5`XRlu#0&Tj0(A?r5H@|lqpr=rQA*I2+tIrCU?Q>Q}MhT z&xHSrHK8*Dsze0Rizibb@iEp<=Q*_5>19}Jz`-T89AwATkL`r`_tJ??ctBL*^^`Bv zk2SJ*oDpjRr{J`-1s>7o#^#|hIg0d8Iop64hDylld7oDD*mRO#xPRK_!xo)nt=?BF zP8P(RE?K-!2k$4lfkhE$%ym9!Tp)-MavRKRi073F9L0{LP8!??@I1=c@ln3f8r0YF zJW<3ZU&QnE;%p65>J}N87_}Bqe^Bkg2Ql{w^WKOu#x|;z?@V`$+BBM3n5Rg+wfY8& z6L*tkSc6RE*7i3f)c8vDjMg$qV$i~0+BLLjsWAR z{c6HU>X_nRRiI{)WiP_hs3Ll z4gMND4ZU+weq%@T zRGbAiErkt9tRS%8{l&$!iiNVfj&|`<)_sN1K$Nk9zD3eprY8*nZ{-+$Ta`=XT>Z9> zolgN{=T~Xh_+co}@dWXXulM{16VQ~peb>Vw5gxN~Hh&YF0NBy{nWm^w(B!OxS27Na zGjWmS`6B=T^1o1=>*OFP$57_w2lN!hA)&EYD?pTbON%-^z6 zt`f0$@Dl(wQcLF-SQs!vniA%!7e|xX)J8z;i|(QvJo%bbric{tV=x)UHPcTufH2(!3FSf;Ql=!>yWs7Ubs zi!G6Wqf_rE|L%h)vK($C6;CGs3m}_&@f&5T^DO8=64;uRyhT#=u%plj?pcYU3lDGwCBF5i>~Ky1dSu)asY_4_22akBO6_;IYZ!Pn zZe97=1oWbZ8=~|J^S}9r@-}!M-9Mq1sDC$C|B9UkRswl7B6}UEFRYbEMpk@ z?e{6(5?RR_HC;Lee;29Xs6iYPlF)fjDhH^j06GJ-M2Cj1U_LcfN^0%ml&Td9^vH}i zg?SDKn|Z4dC;_w^ujZ|i{p=Op0pXFBxdm8Ohm6wz-WK_5`FqAE%!lA{@1*qo-+$dn z`^>JUfXxB#>NoHq>(^**XLk_GP0aHuL1Vgn+Bi@i4?YD4ifG`tli^5RGT1VkPecvp z-Ny99yl7n1+A5b@m4hP>ttYH}5wQS0f|u&v z4;UcO;JOQdU!>0YAMxENuVyqa!G9`g^-TqKY9;tdwNGX&HLF&g=gz;Lg`zBl29+Hn zB-tavf`GHNH%=>vhJ~z}R$E!5l~Xn(!LOZbU7^YaF4TYqF<#4glLGsj7-z5`Ta27#1LQ z8dJ}u_f8pXN&<@o@n5vc+9~A5Cs|nWNSqV}His6dYHD;04gsw@6Xt2m#a>p9+lTAA z?ogmx{5)j77>;d<=src#uQ#`yLPm%$7Z0IU`xr$OumO0KysTAbRH7n2jpml=kg3L9 z@@%EqxX%2sES7uyemGxvB!9Q+){#v%9?myWuIg@K!jqBXERAM`EV3n{(^X2RhMCAj zjR-~oAmYB2B24hIR2LNx5N&iTumH@xN#GaW_r59EP@ooCzmSkF$fkd#Kt&+Kl)4YF zNp_u#`5J*Zo$IXn%MDhdC2^ocYJ>xJeD*jvGn3c@QQ!yR$mt30Mt`|i6{EHA%$^9Z zVdpCGRB2`)QkX!!xm8*_K)E^2Hx3MO=<4;-J-9?t6fJjp3tC5e)o}; z#@$@cNn>3Q&ipuM~cXkRMyPC(z+1i1Obi`-5XWnjHhM5`por~BIGl4Uy zYZd0iOwIr}*vu9*2`MtYoe$sHkCsugeW7qfa`dI z6|ch86<}YRfPY42T&p4xIOO^;_4o*06b1GM$cC#{21r2-l_BRPVeeA3n^ryhXAjL?b!DI{y54~`3)t_4oXpt9*s zNz&p>X)4#JNHEv}aBq=DFY;h|?ASy77yCsTz6Fq0OF8^1)Z|~Yz8ch{O)+Xmx#o*- z7CCKNMMPvn%SWLqb}s9ZoX5_$TSX3V&PiSVLY7hu>VG2|Izi^j*W~ofiQ0LTW=qs+ z;l4-7&msc4+sA07fDOQ-_09cFyB!-Vmzy=_@4?aQu{^sBS?#`(Cj8(r0E%z^Qve@^ zY(4`{46XUYno0@Rit#gm7d-Mle?6a7;%!P&EFrQFQ~O_!1R4@nHRbc-zzDmg+#+BT z!2QhExPJ=+w#^aX0ejc^e*rk)v^OlU?$1B}Imwe2ymbp9UW_*BTJQzn8fyXXVz%UY z2|e7U5>P2MTx)UOrL)3Z#iMINT$cxtqvCp1d_e_fluu~?L3b%`#fEJdcpGS8X3{;(KE_}>k!M4#w|fOdK`BpJ>xd+gEF;Bmp&Y60DbN(x-jP6|ud<>fq$M_lP>7Kfod1@)^1Kxq^L?5+W3@zFymr`8>=x_{*W5Yp9|=fVjC&`paJ-lTN2!fjbvRagw8|MlL6T4b<|TX$7u~aj4f)VLZJP=IQ2Qj_rN^pgdNLz zwGLq+c%Vcrr1u$^E1S&cWMTfvwsUT6X#X95+sBxufXxAq>DT*K=Z14@ndh1d&41{+ z1i-)nV{^U5i8-#r`whS`f*QI9&VTFhm*9u-t!j<|6F?ZQt{79{sh6;nR@H2+b@QD; z$)?)+>Ti6_0+L+jOoF}u$S-=)#}T)7!y%N1hu*x?x!WuCo2Tio+uOo0EY-2O&qv&Dr{6{GjAH;@3C=C;ZNn$M=1#gVA#O#1mZ=pYdd;)+) zY5AO*k!=?DhN#uQ>>Z0~HGhHqyD#Rx4DDIKf`AnX!IYM8epC7pX$5Q_tqeH6YL=V< zQ(@jdb^{970K6N#WbNYK*Z=HZJo9D`dFGX8a|({Jtd|B=L)5Ww*0`DT2CugQYs;Ex zoFxQ({#<|>pSolexWoJmtvqlld4B{zBS5z=3ZNnTtO>&xBmE7iy?=2=oRea}3eroj za-0Yk!V3Uc%&7c6sv@^X=5X#Fl-}%0YzLg6S-X53XlgZ|2AE%yRp}QLX2r|yA3hn; z!+ro^wfOunp|sc-5C9Z)6dO3@XdOA_I8l}rP>2EDIa<1QDyQpdf`K9xQtTqXq!BlT3K-F zln&S-RK+YMm|9Vcr+wuf<;)Sm492++j(c^OPZqRJwc~{YUcH#75q)fVg#~X9F?w!l zJ7Vs$?dO+&!u`VstC@Z5ZWOQqcz1i_@7LcG&EFdTT==d$VSjwe{MpO@jb|11rLLy| z5F*hoy$(QOGhVZVvknQK5~rB5RB#+n^;YieFffIy06?tHw)y=MaEScgS2;jj8V+6r zAF0VA)hZw>&R;(dK&qC1u1w`h)NPhtE9>Qi$qa1kW%8M)vgFxWX2n4o>zw`n?ybmtJhsu%iE%`+$C65EV zMRyY5Y?A&x{|`hpM=c4*O0AkcpPzo5uaLZGW+pVXg_w;HdHKi{3^lxau~l?3vgJZEA)GPQsrk zAZtn~{0gO#4O1?nhF6m)^RO4$6a{Dl#LMl+Hh%(hy^Rr;k$&0ym;Y!xb#A_WcEJYP z_ZVCDskbO#1Mpk4u>X1+1=Q|%x=5|s9lLInsC>&jUH;^F5Zl*N2m=ne zKYvasSVJVjaHw7}dk*CnK7LChaIT8R(Rn zriH*IU|OwabSUMHuAw#9ZH!Zq0A^*=5&$}}G(t(>lcQ!xv=E|bGN6$XD8Wfu)UPo# z0^+<|0UH2cui1sMvwnOISz01B%BU`<+?b}s`UNxcLBhdEycfS1ETmjU3(T7P{611>}&hsF3! zz)i0pQb4$njZqtR$pw|&63hn9Tmv=2Zu3bv&jmMd9-h5(I>3#R^2rwYjk!!tPQQpi z`YuP>T&Q-r_q=JJ{r+^buhD*pfW&fm3(FpT5RT~f^tY#YUP5X%i7RUE3| z;2@ZSXmRMGAQZ$C1YI2b56;caQ7BQ1xG1%S425iQ5$s}zB83j72vJH&Q?1wb(!2P1 zPC9gq-1r_e<8}OpI zFIP~g_#1Lpz#Q9r)h8qnuwM;n$ucQ{dp`K2&)4ujpKss!vg%aXJ6TtKDT6m1K&*|; z>tK}YZ)whzR7LE8Z=Q*?-fWw9_ySffiLB@R)>09@9=lrhHGX4K5%yTpp0Sftg$uB4 z7>tt5WE-qHAkl9viN=pmQ-1}{1e0ci*YAtGFR?x)5-lucocFI^;?*ek&NTlxhUIMV z;sCrl<+tF0jJADTL;wz@`LPs%mnd02X zO}jT#}*qo-bl}}d&PbN{G(xmQ~{3WsKNVEn6a%nV{CT66xj4$SeOCJ^ulPafm^io z2aiuhGo1D#wgNY0J{WNyR({UTb*EU}93}#(MZhTF)Iw<%IuwBe_rYg*CR5+v;TB+f zs!5*%z!pBO06aX$`F~}A$V|G?H2{ltEe(=EjiqpP3_uQ$g7(z3B|1d34H~VSk5Z** z`9v8^9-|;b@k?7q0DDRm@P3(fnQph?CAs1-@Dc?cEGxiwq_}yX$2=1$+BCBXB-)zb zQ!s(#$2r9pqVe-A4nrEo@=qtiy2B4OPB4l52jVc*Cs=@|DWKT&wCn pu6&%m8;|tCIbH-fxm+$EHeM0MyCJ(002ovPDHLkV1nbJbBF){ diff --git a/Tests/__Snapshots__/ImageTintingTests/testNotTintingInAttributedString-_AppKit.1.png b/Tests/__Snapshots__/ImageTintingTests/testNotTintingInAttributedString-_AppKit.1.png index f02ef9e69991cb30cdfe8d7e51aaeff4726aee4f..5302104d9a18d6de1dc0ecb45b3a2983f736b2d7 100644 GIT binary patch delta 4416 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 amO1j}J;S%VV%-0X<)3Kisu!wSg!~`;Yz6uN diff --git a/Tests/__Snapshots__/ImageTintingTests/testTintingInAttributedString-_AppKit.1.png b/Tests/__Snapshots__/ImageTintingTests/testTintingInAttributedString-_AppKit.1.png index 33674a086c3270d94099317e44c4043862a641c5..f7f396b84d45c5982a5c5a4f6ce2cced2ab3993a 100644 GIT binary patch delta 8648 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