diff --git a/.editorconfig b/.editorconfig index e9582eeda..f46c76213 100644 --- a/.editorconfig +++ b/.editorconfig @@ -12,5 +12,5 @@ insert_final_newline = true [*.md] trim_trailing_whitespace = false -[{script/*,*.rb,*.yml}] +[{script/*,*.{rb,yml}}] indent_size = 2 diff --git a/.gitignore b/.gitignore index 4ca07cf22..f335987fa 100644 --- a/.gitignore +++ b/.gitignore @@ -31,5 +31,6 @@ Pods/ Temporary Items bin/ build/ +default.profraw releases/ xcuserdata diff --git a/Brewfile.lock.json b/Brewfile.lock.json index 3ee4193ce..d32b988ba 100644 --- a/Brewfile.lock.json +++ b/Brewfile.lock.json @@ -44,12 +44,12 @@ "system": { "macos": { "catalina": { - "HOMEBREW_VERSION": "2.2.17-96-g2e801c3", + "HOMEBREW_VERSION": "2.4.16-180-gb2d9594", "HOMEBREW_PREFIX": "/usr/local", - "Homebrew/homebrew-core": "572fc56b93562aa2d07749e826f8b4ab6cc04090", - "CLT": "11.0.0.0.1.1567737322", - "Xcode": "11.5", - "macOS": "10.15.4" + "Homebrew/homebrew-core": "85bdb1a3845135bb3b7311ae6adcae8c82447951", + "CLT": "1103.0.32.62", + "Xcode": "11.6", + "macOS": "10.15.6" } } } diff --git a/CHANGELOG.md b/CHANGELOG.md index b73e681bc..b754bc922 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +## [v1.7.1] 🐛 Search JSON Fix - 2020-09-06 + +- 🐛 Account for missing JSON fields in search results #299 + ## [v1.7.0] 🛍 Purchase Command - 2020-05-24 - ✨ New `purchase` command for purchasing free apps #264 (resolves #2, #145) @@ -200,7 +204,8 @@ Use the `mas.pkg` package to install manually. - Initial Release -[Unreleased]: https://github.com/mas-cli/mas/compare/v1.7.0...HEAD +[Unreleased]: https://github.com/mas-cli/mas/compare/v1.7.1...HEAD +[v1.7.1]: https://github.com/mas-cli/mas/compare/v1.7.0...v1.7.1 [v1.7.0]: https://github.com/mas-cli/mas/compare/v1.6.4...v1.7.0 [v1.6.4]: https://github.com/mas-cli/mas/compare/v1.6.3...v1.6.4 [v1.6.3]: https://github.com/mas-cli/mas/compare/v1.6.2...v1.6.3 diff --git a/Cartfile.resolved b/Cartfile.resolved index 111337e77..7cd499c4e 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,3 +1,3 @@ github "Carthage/Commandant" "0.17.0" -github "Quick/Nimble" "v8.0.9" -github "Quick/Quick" "v2.2.0" +github "Quick/Nimble" "v8.1.2" +github "Quick/Quick" "v3.0.0" diff --git a/Carthage/Checkouts/Nimble/.github/workflows/ci.yml b/Carthage/Checkouts/Nimble/.github/workflows/ci.yml index e0568acab..3c888d30a 100644 --- a/Carthage/Checkouts/Nimble/.github/workflows/ci.yml +++ b/Carthage/Checkouts/Nimble/.github/workflows/ci.yml @@ -6,29 +6,41 @@ on: - master pull_request: branches: - - '*' + - "*" jobs: + cocoapods: + name: CocoaPods Lint + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - run: bundle install + - run: ./test podspec + xcode: name: Xcode ${{ matrix.xcode }} - runs-on: macOS-latest + runs-on: macos-latest strategy: matrix: - xcode: [11, 11.1, 11.2] + xcode: [10.3, 11, 11.1, 11.2] + fail-fast: false + env: + DEVELOPER_DIR: /Applications/Xcode_${{ matrix.xcode }}.app steps: - - uses: actions/checkout@v2 - - run: sudo xcode-select -s '/Applications/Xcode_${{ matrix.xcode }}.app' - - run: ./test macos - - run: ./test ios - - run: ./test tvos + - uses: actions/checkout@v2 + - run: ./test macos + - run: ./test ios + - run: ./test tvos swiftpm_darwin: name: SwiftPM, Darwin, Xcode ${{ matrix.xcode }} - runs-on: macOS-latest + runs-on: macos-latest strategy: matrix: xcode: [11, 11.1, 11.2] + fail-fast: false + env: + DEVELOPER_DIR: /Applications/Xcode_${{ matrix.xcode }}.app steps: - - uses: actions/checkout@v2 - - run: sudo xcode-select -s '/Applications/Xcode_${{ matrix.xcode }}.app' - - run: ./test swiftpm + - uses: actions/checkout@v2 + - run: ./test swiftpm diff --git a/Carthage/Checkouts/Nimble/.travis.yml b/Carthage/Checkouts/Nimble/.travis.yml index b3e256021..3a3bd63f0 100644 --- a/Carthage/Checkouts/Nimble/.travis.yml +++ b/Carthage/Checkouts/Nimble/.travis.yml @@ -6,12 +6,6 @@ branches: language: generic jobs: include: - - &cocoapods - name: CocoaPods Lint - os: osx - osx_image: xcode10.3 - install: bundle install - script: ./test podspec - &xcode name: Xcode 10.1 / Swift 4.2 os: osx @@ -20,9 +14,6 @@ jobs: - ./test macos - ./test ios - ./test tvos - - <<: *xcode - name: Xcode 10.3 / Swift 5.0 - osx_image: xcode10.3 - &swiftpm_darwin name: SwiftPM / Darwin / Swift 4.2 os: osx @@ -49,13 +40,17 @@ jobs: env: - SWIFT_VERSION=5.1.5 - <<: *swiftpm_linux - name: SwiftPM / Linux / Swift 5.2.2 + name: SwiftPM / Linux / Swift 5.2.4 + env: + - SWIFT_VERSION=5.2.4 + - <<: *swiftpm_linux + name: SwiftPM / Linux / Swift 5.3 Development env: - - SWIFT_VERSION=5.2.2 + - SWIFT_VERSION=5.3-DEVELOPMENT-SNAPSHOT-2020-05-19-a - <<: *swiftpm_linux name: SwiftPM / Linux / Swift Development env: - - SWIFT_VERSION=DEVELOPMENT-SNAPSHOT-2020-04-17-a + - SWIFT_VERSION=DEVELOPMENT-SNAPSHOT-2020-05-26-a install: true script: - ./test $TYPE diff --git a/Carthage/Checkouts/Nimble/Gemfile.lock b/Carthage/Checkouts/Nimble/Gemfile.lock index 6c6f53490..0c4c5bf5e 100644 --- a/Carthage/Checkouts/Nimble/Gemfile.lock +++ b/Carthage/Checkouts/Nimble/Gemfile.lock @@ -1,65 +1,79 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.0) - activesupport (4.2.11.1) + CFPropertyList (3.0.2) + activesupport (4.2.11.3) i18n (~> 0.7) minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) + algoliasearch (1.27.3) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) atomos (0.1.3) - claide (1.0.2) - cocoapods (1.7.1) + claide (1.0.3) + cocoapods (1.9.3) activesupport (>= 4.0.2, < 5) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.7.1) + cocoapods-core (= 1.9.3) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 1.2.2, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.3.1, < 2.0) + cocoapods-trunk (>= 1.4.0, < 2.0) cocoapods-try (>= 1.1.0, < 2.0) colored2 (~> 3.1) escape (~> 0.0.4) - fourflusher (>= 2.2.0, < 3.0) + fourflusher (>= 2.3.0, < 3.0) gh_inspector (~> 1.0) molinillo (~> 0.6.6) nap (~> 1.0) ruby-macho (~> 1.4) - xcodeproj (>= 1.8.2, < 2.0) - cocoapods-core (1.7.1) + xcodeproj (>= 1.14.0, < 2.0) + cocoapods-core (1.9.3) activesupport (>= 4.0.2, < 6) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) fuzzy_match (~> 2.0.4) nap (~> 1.0) + netrc (~> 0.11) + typhoeus (~> 1.0) cocoapods-deintegrate (1.0.4) - cocoapods-downloader (1.2.2) + cocoapods-downloader (1.3.0) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.0) cocoapods-stats (1.1.0) - cocoapods-trunk (1.3.1) + cocoapods-trunk (1.5.0) nap (>= 0.8, < 2.0) netrc (~> 0.11) - cocoapods-try (1.1.0) + cocoapods-try (1.2.0) colored2 (3.1.2) - concurrent-ruby (1.1.5) + concurrent-ruby (1.1.6) escape (0.0.4) - fourflusher (2.3.0) + ethon (0.12.0) + ffi (>= 1.3.0) + ffi (1.13.0) + fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) + httpclient (2.8.3) i18n (0.9.5) concurrent-ruby (~> 1.0) - minitest (5.11.3) + json (2.3.0) + minitest (5.14.1) molinillo (0.6.6) nanaimo (0.2.6) nap (1.1.0) netrc (0.11.0) ruby-macho (1.4.0) thread_safe (0.3.6) - tzinfo (1.2.5) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (1.2.7) thread_safe (~> 0.1) - xcodeproj (1.9.0) + xcodeproj (1.16.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -73,4 +87,4 @@ DEPENDENCIES cocoapods (~> 1.7) BUNDLED WITH - 1.17.3 + 2.1.4 diff --git a/Carthage/Checkouts/Nimble/Nimble.podspec b/Carthage/Checkouts/Nimble/Nimble.podspec index 36eb8de6c..4c568ef9a 100644 --- a/Carthage/Checkouts/Nimble/Nimble.podspec +++ b/Carthage/Checkouts/Nimble/Nimble.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Nimble" - s.version = "8.0.9" + s.version = "8.1.2" s.summary = "A Matcher Framework for Swift and Objective-C" s.description = <<-DESC Use Nimble to express the expected outcomes of Swift or Objective-C expressions. Inspired by Cedar. diff --git a/Carthage/Checkouts/Nimble/README.md b/Carthage/Checkouts/Nimble/README.md index 4f7f89bcc..b358b1d10 100644 --- a/Carthage/Checkouts/Nimble/README.md +++ b/Carthage/Checkouts/Nimble/README.md @@ -1186,7 +1186,7 @@ expect { let notificationCenter = NotificationCenter() expect { notificationCenter.postNotification(testNotification) -}.to(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) +}.to(postNotifications(equal([testNotification]), from: notificationCenter)) ``` > This matcher is only available in Swift. diff --git a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift index 5e8bee3d5..1a62247b6 100644 --- a/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift +++ b/Carthage/Checkouts/Nimble/Sources/Nimble/Matchers/PostNotification.swift @@ -29,7 +29,7 @@ private let mainThread = pthread_self() public func postNotifications( _ predicate: Predicate<[Notification]>, - fromNotificationCenter center: NotificationCenter = .default + from center: NotificationCenter = .default ) -> Predicate { _ = mainThread // Force lazy-loading of this value let collector = NotificationCollector(notificationCenter: center) @@ -66,12 +66,18 @@ public func postNotifications( } } +@available(*, deprecated, renamed: "postNotifications(_:from:)") +public func postNotifications( + _ predicate: Predicate<[Notification]>, + fromNotificationCenter center: NotificationCenter +) -> Predicate { + return postNotifications(predicate, from: center) +} + public func postNotifications( _ notificationsMatcher: T, - fromNotificationCenter center: NotificationCenter = .default) - -> Predicate - where T: Matcher, T.ValueType == [Notification] -{ + from center: NotificationCenter = .default +)-> Predicate where T: Matcher, T.ValueType == [Notification] { _ = mainThread // Force lazy-loading of this value let collector = NotificationCollector(notificationCenter: center) collector.startObserving() @@ -98,3 +104,11 @@ public func postNotifications( return PredicateResult(bool: match, message: failureMessage.toExpectationMessage()) } } + +@available(*, deprecated, renamed: "postNotifications(_:from:)") +public func postNotifications( + _ notificationsMatcher: T, + fromNotificationCenter center: NotificationCenter +)-> Predicate where T: Matcher, T.ValueType == [Notification] { + return postNotifications(notificationsMatcher, from: center) +} diff --git a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m b/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m index 8cf733491..3c1110bab 100644 --- a/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m +++ b/Carthage/Checkouts/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m @@ -6,7 +6,12 @@ #import #endif -__attribute__((constructor)) -static void registerCurrentTestCaseTracker(void) { +#pragma mark - Private + +@implementation XCTestObservationCenter (Register) + ++ (void)load { [[XCTestObservationCenter sharedTestObservationCenter] addTestObserver:[CurrentTestCaseTracker sharedInstance]]; } + +@end diff --git a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift index de6fe5dcd..52985728a 100644 --- a/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift +++ b/Carthage/Checkouts/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift @@ -9,14 +9,14 @@ final class PostNotificationTest: XCTestCase, XCTestCaseProvider { expect { // no notifications here! return nil - }.to(postNotifications(beEmpty(), fromNotificationCenter: notificationCenter)) + }.to(postNotifications(beEmpty())) } func testPassesWhenExpectedNotificationIsPosted() { let testNotification = Notification(name: Notification.Name("Foo"), object: nil) expect { self.notificationCenter.post(testNotification) - }.to(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) + }.to(postNotifications(equal([testNotification]), from: notificationCenter)) } func testPassesWhenAllExpectedNotificationsArePosted() { @@ -28,7 +28,7 @@ final class PostNotificationTest: XCTestCase, XCTestCaseProvider { self.notificationCenter.post(n1) self.notificationCenter.post(n2) return nil - }.to(postNotifications(equal([n1, n2]), fromNotificationCenter: notificationCenter)) + }.to(postNotifications(equal([n1, n2]), from: notificationCenter)) } func testFailsWhenNoNotificationsArePosted() { @@ -37,7 +37,7 @@ final class PostNotificationTest: XCTestCase, XCTestCaseProvider { expect { // no notifications here! return nil - }.to(postNotifications(equal([testNotification]), fromNotificationCenter: self.notificationCenter)) + }.to(postNotifications(equal([testNotification]), from: self.notificationCenter)) } } @@ -48,7 +48,7 @@ final class PostNotificationTest: XCTestCase, XCTestCaseProvider { expect { self.notificationCenter.post(n2) return nil - }.to(postNotifications(equal([n1]), fromNotificationCenter: self.notificationCenter)) + }.to(postNotifications(equal([n1]), from: self.notificationCenter)) } } @@ -59,7 +59,7 @@ final class PostNotificationTest: XCTestCase, XCTestCaseProvider { expect { self.notificationCenter.post(n2) return nil - }.to(postNotifications(equal([n1]), fromNotificationCenter: self.notificationCenter)) + }.to(postNotifications(equal([n1]), from: self.notificationCenter)) } } @@ -70,6 +70,6 @@ final class PostNotificationTest: XCTestCase, XCTestCaseProvider { self.notificationCenter.post(testNotification) } return nil - }.toEventually(postNotifications(equal([testNotification]), fromNotificationCenter: notificationCenter)) + }.toEventually(postNotifications(equal([testNotification]), from: notificationCenter)) } } diff --git a/Carthage/Checkouts/Nimble/test b/Carthage/Checkouts/Nimble/test index cb301430e..3f2a22c78 100755 --- a/Carthage/Checkouts/Nimble/test +++ b/Carthage/Checkouts/Nimble/test @@ -7,12 +7,14 @@ if which xcodebuild > /dev/null; then echo -e "Gathering ${GREEN}xcodebuild sdk versions${CLEAR}..." BUILD_DIR=`pwd`/build LATEST_IOS_SDK_VERSION=`xcodebuild -showsdks | grep iphonesimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` + LATEST_IOS_VERSION=`xcrun simctl list | grep ^iOS | ruby -e 'puts /\(([0-9.]+).*\)/.match(STDIN.read.chomp.split("\n").last).to_a[1]'` LATEST_TVOS_SDK_VERSION=`xcodebuild -showsdks | grep appletvsimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - LATEST_MACOS_SDK_VERSION=`xcodebuild -showsdks | grep 'macosx' | cut -d ' ' -f 3 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` + LATEST_TVOS_VERSION=`xcrun simctl list | grep ^tvOS | ruby -e 'puts /\(([0-9.]+).*\)/.match(STDIN.read.chomp.split("\n").last).to_a[1]'` + LATEST_MACOS_SDK_VERSION=`xcodebuild -showsdks | grep 'macosx' | cut -d ' ' -f 2 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` BUILD_IOS_SDK_VERSION=${NIMBLE_BUILD_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} - RUNTIME_IOS_SDK_VERSION=${NIMBLE_RUNTIME_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} + RUNTIME_IOS_VERSION=${NIMBLE_RUNTIME_IOS_VERSION:-$LATEST_IOS_VERSION} BUILD_TVOS_SDK_VERSION=${NIMBLE_BUILD_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} - RUNTIME_TVOS_SDK_VERSION=${NIMBLE_RUNTIME_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} + RUNTIME_TVOS_VERSION=${NIMBLE_RUNTIME_TVOS_VERSION:-$LATEST_TVOS_VERSION} BUILD_MACOS_SDK_VERSION=${NIMBLE_BUILD_MACOS_SDK_VERSION:-$LATEST_MACOS_SDK_VERSION} fi @@ -33,12 +35,12 @@ function print_env { echo " iOS:" echo " Latest iOS SDK: $LATEST_IOS_SDK_VERSION" echo " Building with iOS SDK: `color_if_overridden $BUILD_IOS_SDK_VERSION $NIMBLE_BUILD_IOS_SDK_VERSION`" - echo " Running with iOS SDK: `color_if_overridden $RUNTIME_IOS_SDK_VERSION $NIMBLE_RUNTIME_IOS_SDK_VERSION`" + echo " Running with iOS: `color_if_overridden $RUNTIME_IOS_VERSION $NIMBLE_RUNTIME_IOS_VERSION`" echo echo " tvOS:" echo " Latest tvOS SDK: $LATEST_TVOS_SDK_VERSION" echo " Building with tvOS SDK: `color_if_overridden $BUILD_TVOS_SDK_VERSION $NIMBLE_BUILD_TVOS_SDK_VERSION`" - echo " Running with tvOS SDK: `color_if_overridden $RUNTIME_TVOS_SDK_VERSION $NIMBLE_RUNTIME_TVOS_SDK_VERSION`" + echo " Running with tvOS: `color_if_overridden $RUNTIME_TVOS_VERSION $NIMBLE_RUNTIME_TVOS_VERSION`" echo echo " macOS:" echo " Latest macOS SDK: $LATEST_MACOS_SDK_VERSION" @@ -57,17 +59,17 @@ function test_ios { run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -destination "generic/platform=iOS" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build | xcpretty run osascript -e 'tell app "Simulator" to quit' - run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPad Pro (11-inch),OS=$RUNTIME_IOS_SDK_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty + run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPad Pro (11-inch),OS=$RUNTIME_IOS_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty run osascript -e 'tell app "Simulator" to quit' - run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPhone 8,OS=$RUNTIME_IOS_SDK_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty + run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPhone 8,OS=$RUNTIME_IOS_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty } function test_tvos { run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-tvOS" -configuration "Debug" -destination "generic/platform=tvOS" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build | xcpretty run osascript -e 'tell app "Simulator" to quit' - run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-tvOS" -configuration "Debug" -sdk "appletvsimulator$BUILD_TVOS_SDK_VERSION" -destination "name=Apple TV,OS=$RUNTIME_TVOS_SDK_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty + run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-tvOS" -configuration "Debug" -sdk "appletvsimulator$BUILD_TVOS_SDK_VERSION" -destination "name=Apple TV,OS=$RUNTIME_TVOS_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty } function test_macos { diff --git a/Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE b/Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE index ebe5a2b0f..5a6346fa7 100644 --- a/Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE +++ b/Carthage/Checkouts/Quick/.github/ISSUE_TEMPLATE @@ -24,7 +24,7 @@ List the software versions you're using: Please also mention which package manager you used and its version. Delete the other package managers in this list: - - Cocoapods: *?.?.?* (Use `pod --version` in Terminal) + - CocoaPods: *?.?.?* (Use `pod --version` in Terminal) - Carthage: *?.?* (Use `carthage version` in Terminal) - Swift Package Manager *?.?.? (swiftpm-???)* (Use `swift build --version` in Terminal) diff --git a/Carthage/Checkouts/Quick/.github/workflows/ci.yml b/Carthage/Checkouts/Quick/.github/workflows/ci.yml index 128f5af5b..284628b4b 100644 --- a/Carthage/Checkouts/Quick/.github/workflows/ci.yml +++ b/Carthage/Checkouts/Quick/.github/workflows/ci.yml @@ -5,33 +5,48 @@ on: branches: - master tags: - - '*' + - "*" pull_request: jobs: + cocoapods: + name: CocoaPods Lint & Danger + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - run: bundle install + - run: bundle exec danger + env: + DANGER_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - run: PODSPEC=1 ./script/travis-script-macos + xcode: - name: Xcode ${{ matrix.xcode }} - runs-on: macOS-10.14 + name: Xcode ${{ matrix.xcode }} (${{ matrix.platform }}) + runs-on: macos-latest strategy: matrix: - xcode: [10.1, 10.3, 11] + xcode: [11.5] + platform: ["macos", "ios", "tvos"] + fail-fast: false + env: + DEVELOPER_DIR: "/Applications/Xcode_${{ matrix.xcode }}.app" steps: - - uses: actions/checkout@v1 - with: - submodules: true - - run: sudo xcode-select -s '/Applications/Xcode_${{ matrix.xcode }}.app' - - run: PLATFORM=macos ./script/travis-script-macos - - run: PLATFORM=macos_static ./script/travis-script-macos - - run: PLATFORM=ios ./script/travis-script-macos - - run: PLATFORM=tvos ./script/travis-script-macos + - uses: actions/checkout@v2 + with: + submodules: true + - run: PLATFORM=${{ matrix.platform }} ./script/travis-script-macos + - if: ${{ matrix.platform == 'macos' }} + run: PLATFORM=${{ matrix.platform }}_static ./script/travis-script-macos swiftpm_darwin: name: SwiftPM, Darwin, Xcode ${{ matrix.xcode }} - runs-on: macOS-10.14 + runs-on: macos-latest strategy: matrix: - xcode: [10.1, 10.3, 11] + xcode: [11.5] + fail-fast: false + env: + DEVELOPER_DIR: "/Applications/Xcode_${{ matrix.xcode }}.app" steps: - - uses: actions/checkout@v1 - - run: sudo xcode-select -s '/Applications/Xcode_${{ matrix.xcode }}.app' - - run: PLATFORM=swiftpm ./script/travis-script-macos + - uses: actions/checkout@v2 + - run: PLATFORM=swiftpm ./script/travis-script-macos diff --git a/Carthage/Checkouts/Quick/.github/workflows/swiftlint.yml b/Carthage/Checkouts/Quick/.github/workflows/swiftlint.yml new file mode 100644 index 000000000..c10adfe26 --- /dev/null +++ b/Carthage/Checkouts/Quick/.github/workflows/swiftlint.yml @@ -0,0 +1,15 @@ +name: SwiftLint + +on: + pull_request: + paths: + - '.github/workflows/swiftlint.yml' + - '.swiftlint.yml' + - '**/*.swift' + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: norio-nomura/action-swiftlint@3.1.0 diff --git a/Carthage/Checkouts/Quick/.swiftlint.yml b/Carthage/Checkouts/Quick/.swiftlint.yml index 79cda08fb..092aa073b 100644 --- a/Carthage/Checkouts/Quick/.swiftlint.yml +++ b/Carthage/Checkouts/Quick/.swiftlint.yml @@ -1,8 +1,11 @@ disabled_rules: - - line_length - - type_name - - function_body_length - - identifier_name included: - Sources - Tests + +line_length: + warning: 160 + error: 240 + +trailing_comma: + mandatory_comma: true diff --git a/Carthage/Checkouts/Quick/.travis.yml b/Carthage/Checkouts/Quick/.travis.yml index 2687e6d1d..ff392d50e 100644 --- a/Carthage/Checkouts/Quick/.travis.yml +++ b/Carthage/Checkouts/Quick/.travis.yml @@ -3,32 +3,35 @@ branches: - master language: generic -matrix: +jobs: include: - - name: CocoaPods Lint & Danger - os: osx - osx_image: xcode10.3 - language: ruby - script: - - PODSPEC=1 ./script/travis-script-macos - - bundle exec danger + # - &xcode + # name: Xcode 10.1 / Swift 4.2 + # os: osx + # env: + # - XCODE_ACTION="build-for-testing test-without-building" + # osx_image: xcode10.1 + # script: + # - PLATFORM=macos ./script/travis-script-macos + # - PLATFORM=macos_static ./script/travis-script-macos + # - PLATFORM=ios ./script/travis-script-macos + # - PLATFORM=tvos ./script/travis-script-macos + # - &swiftpm_darwin + # name: SwiftPM / Darwin / Swift 4.2 + # os: osx + # osx_image: xcode10.1 + # script: PLATFORM=swiftpm ./script/travis-script-macos - &swiftpm_linux - name: SwiftPM / Linux / Swift 4.2.4 + name: SwiftPM / Linux / Swift 5.2.4 os: linux - sudo: required - dist: trusty env: - - SWIFT_VERSION=4.2.4 - install: ./script/travis-install-linux - script: ./script/travis-script-linux + - SWIFT_VERSION=5.2.4 + install: eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" + script: rake test:swiftpm - <<: *swiftpm_linux - name: SwiftPM / Linux / Swift 5.0.3 + name: SwiftPM / Linux / Swift 5.3 Development env: - - SWIFT_VERSION=5.0.3 - - <<: *swiftpm_linux - name: SwiftPM / Linux / Swift 5.1 Development - env: - - SWIFT_VERSION=5.1-DEVELOPMENT-SNAPSHOT-2019-09-09-a + - SWIFT_VERSION=5.3-DEVELOPMENT-SNAPSHOT-2020-05-19-a notifications: email: false diff --git a/Carthage/Checkouts/Quick/CONTRIBUTING.md b/Carthage/Checkouts/Quick/CONTRIBUTING.md index e8e32c182..a57b74c68 100644 --- a/Carthage/Checkouts/Quick/CONTRIBUTING.md +++ b/Carthage/Checkouts/Quick/CONTRIBUTING.md @@ -39,7 +39,7 @@ Be sure to include in your issue: - What are the steps to reproduce this issue? - What platform are you using? (eg - OS X, iOS, watchOS, tvOS) - If the problem is on a UI Testing Bundle, Unit Testing Bundle, or some other target configuration -- Are you using carthage or cocoapods? +- Are you using Carthage or CocoaPods? ## Building the Project diff --git a/Carthage/Checkouts/Quick/Dangerfile b/Carthage/Checkouts/Quick/Dangerfile index ff6259ff1..e9e3128bd 100644 --- a/Carthage/Checkouts/Quick/Dangerfile +++ b/Carthage/Checkouts/Quick/Dangerfile @@ -1,5 +1,5 @@ # set the number of lines that must be changed before this classifies as a 'Big PR' -@SDM_DANGER_BIG_PR_LINES = 50 +@SDM_DANGER_BIG_PR_LINES = 200 # set the files to watch and fail if there are changes @SDM_DANGER_IMMUTABLE_FILES = ['LICENSE', 'CODE_OF_CONDUCT.md'] @@ -47,7 +47,3 @@ end if github.pr_body.length < 5 warn "Please provide a summary in the Pull Request description" end - -swiftlint.config_file = '.swiftlint.yml' -swiftlint.lint_files - diff --git a/Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md b/Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md index 5b8950941..55c19d65d 100644 --- a/Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md +++ b/Carthage/Checkouts/Quick/Documentation/en-us/InstallingQuick.md @@ -22,7 +22,7 @@ you should be able to `import Quick` from within files in your test target. To link Quick and Nimble using Git submodules: 1. Add submodule for Quick. -2. If you don't already have a `.xcworkspace` for your project, create one. ([Here's how](https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html)) +2. If you don't already have a `.xcworkspace` for your project, create one. ([Here's how](https://help.apple.com/xcode/mac/11.4/#/devf5378fca9)) 3. Add `Quick.xcodeproj` to your project's `.xcworkspace`. 4. Add `Nimble.xcodeproj` to your project's `.xcworkspace`. It exists in `path/to/Quick/Externals/Nimble`. By adding Nimble from Quick's dependencies (as opposed to adding directly as a submodule), you'll ensure that you're using the correct version of Nimble for whatever version of Quick you're using. 5. Link `Quick.framework` and `Nimble.framework` in your test target's diff --git a/Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md b/Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md index 884b8a5e3..88182e46e 100644 --- a/Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md +++ b/Carthage/Checkouts/Quick/Documentation/ja/InstallingQuick.md @@ -21,7 +21,7 @@ Quick をテストに組み込むには3つの方法があります。 Git submodules を使って Quick と Nimble をリンクします。手順の流れとしては下記の通りです。 1. Quick を submodule として追加. -2. プロジェクトで`.xcworkspace`を使っていなければ作成してください。 ([こちらを参照](https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html)) +2. プロジェクトで`.xcworkspace`を使っていなければ作成してください。 ([こちらを参照](https://help.apple.com/xcode/mac/11.4/#/devf5378fca9)) 3. `Quick.xcodeproj` をプロジェクトの`.xcworkspace`に追加してください。 4. `Nimble.xcodeproj` をプロジェクトの`.xcworkspace`に追加してください。 `Nimble.xcodeproj` は `path/to/Quick/Externals/Nimble` にあります。 Quick が依存している Niimble を追加することで Quick のバージョンと Nimble のバージョンを合わせられます。 diff --git a/Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md b/Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md index 1179ed7ad..bd681d068 100644 --- a/Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md +++ b/Carthage/Checkouts/Quick/Documentation/ja/SharedExamples.md @@ -18,8 +18,8 @@ import Quick import Nimble class EdibleSharedExamplesConfiguration: QuickConfiguration { - override class func configure(configuration: Configuration) { - sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in + override class func configure(_ configuration: Configuration) { + sharedExamples("something edible") { (sharedExampleContext: @escaping SharedExampleContext) in it("makes dolphins happy") { let dolphin = Dolphin(happy: false) let edible = sharedExampleContext()["edible"] diff --git a/Carthage/Checkouts/Quick/Documentation/ko-kr/InstallingQuick.md b/Carthage/Checkouts/Quick/Documentation/ko-kr/InstallingQuick.md index 6b875d5ab..70bb1afda 100644 --- a/Carthage/Checkouts/Quick/Documentation/ko-kr/InstallingQuick.md +++ b/Carthage/Checkouts/Quick/Documentation/ko-kr/InstallingQuick.md @@ -18,7 +18,7 @@ Quick은 예제들과 예제 그룹을 정의하는 구문을 제공합니다. N Git 서브 모듈을 사용하여 Quick과 Nimble을 링크하려면: 1. Quick 서브 모듈을 추가하세요. -2. `.xcworkspace` 가 프로젝트에 아직 없는 경우, 만드세요. ([방법은 이곳에](https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html)) +2. `.xcworkspace` 가 프로젝트에 아직 없는 경우, 만드세요. ([방법은 이곳에](https://help.apple.com/xcode/mac/11.4/#/devf5378fca9)) 3. `Quick.xcodeproj`를 프로젝트의 `.xcworkspace` 에 추가하세요. 4. `Nimble.xcodeproj` 또한 프로젝트의 `.xcworkspace` 에 추가하세요. `path/to/Quick/Externals/Nimble` 에 있습니다. Quick의 종속성에서 Nimble을 추가하면 (하위 모듈에서 바로 추가하는 것과 대조적으로), 당신이 사용하고 있는 Quick의 버전에 맞는 Nimble의 올바른 버전을 사용할 수 있게 됩니다. 5. `Quick.framework`와 `Nimble.framework`를 test target 프로젝트의 "Link Binary with Libraries" build phase에 링크시키세요. diff --git a/Carthage/Checkouts/Quick/Documentation/ko-kr/SharedExamples.md b/Carthage/Checkouts/Quick/Documentation/ko-kr/SharedExamples.md index 9ca182b3d..5a890755c 100644 --- a/Carthage/Checkouts/Quick/Documentation/ko-kr/SharedExamples.md +++ b/Carthage/Checkouts/Quick/Documentation/ko-kr/SharedExamples.md @@ -15,7 +15,7 @@ import Nimble class EdibleSharedExamplesConfiguration: QuickConfiguration { override class func configure(_ configuration: Configuration) { - sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in + sharedExamples("something edible") { (sharedExampleContext: @escaping SharedExampleContext) in it("makes dolphins happy") { let dolphin = Dolphin(happy: false) let edible = sharedExampleContext()["edible"] diff --git a/Carthage/Checkouts/Quick/Documentation/pt-br/SharedExamples.md b/Carthage/Checkouts/Quick/Documentation/pt-br/SharedExamples.md index 8dd0ecd42..dacd2b0f1 100644 --- a/Carthage/Checkouts/Quick/Documentation/pt-br/SharedExamples.md +++ b/Carthage/Checkouts/Quick/Documentation/pt-br/SharedExamples.md @@ -15,7 +15,7 @@ import Nimble class EdibleSharedExamplesConfiguration: QuickConfiguration { override class func configure(_ configuration: Configuration) { - sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in + sharedExamples("something edible") { (sharedExampleContext: @escaping SharedExampleContext) in it("makes dolphins happy") { let dolphin = Dolphin(happy: false) let edible = sharedExampleContext()["edible"] diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md index 2f54b0a32..78f2dfeec 100644 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md +++ b/Carthage/Checkouts/Quick/Documentation/zh-cn/InstallingQuick.md @@ -21,7 +21,7 @@ Quick 提供了定义例子和例子群的语法。 Nimble 提供了如 `expect( 通过以下步骤可以使用 Git 的子模块(submodules) 为项目添加 Quick 和 Nimble : 1. 添加子模块 Quick。 -2. 为你的项目新建一个 `.xcworkspace` 文件,如果原本已经有这个文件,则跳过此步骤。 ([如何添加请看这里](https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html)) +2. 为你的项目新建一个 `.xcworkspace` 文件,如果原本已经有这个文件,则跳过此步骤。 ([如何添加请看这里](https://help.apple.com/xcode/mac/11.4/#/devf5378fca9)) 3. 把 `Quick.xcodeproj` 添加到项目的 `.xcworkspace`中。 4. 把 `Nimble.xcodeproj` 添加到项目的 `.xcworkspace`中。它所在的目录是: `path/to/Quick/Externals/Nimble`。 通过从 Quick 的依赖库中添加 Nimble (而不是直接添加为子模块),可以确保无论所用的 Quick 是什么版本,都能使用正确版本的 Nimble 。 5. 把 `Quick.framework` 和 `Nimble.framework` 添加到项目 "build phase" 选项页的 "Link Binary with Libraries" 列表中。 diff --git a/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md b/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md index 79c40c93f..0fc1948fd 100644 --- a/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md +++ b/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md @@ -14,7 +14,7 @@ import Nimble class EdibleSharedExamplesConfiguration: QuickConfiguration { override class func configure(_ configuration: Configuration) { - sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in + sharedExamples("something edible") { (sharedExampleContext: @escaping SharedExampleContext) in it("makes dolphins happy") { let dolphin = Dolphin(happy: false) let edible = sharedExampleContext()["edible"] diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.github/ISSUE_TEMPLATE b/Carthage/Checkouts/Quick/Externals/Nimble/.github/ISSUE_TEMPLATE index 85e591e2a..1273aff3b 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.github/ISSUE_TEMPLATE +++ b/Carthage/Checkouts/Quick/Externals/Nimble/.github/ISSUE_TEMPLATE @@ -16,17 +16,17 @@ Please replace this with what happened instead. List the software versions you're using: - - Quick: *?.?.?* - - Nimble: *?.?.?* - - Xcode Version: *?.? (????)* (Open Xcode; In menubar: Xcode > About Xcode) - - Swift Version: *?.?* (Open Xcode Preferences; Components > Toolchains. If none, use `Xcode Default`.) +- Quick: *?.?.?* +- Nimble: *?.?.?* +- Xcode Version: *?.? (????)* (Open Xcode; In menubar: Xcode > About Xcode) +- Swift Version: *?.?* (Open Xcode Preferences; Components > Toolchains. If none, use `Xcode Default`.) Please also mention which package manager you used and its version. Delete the other package managers in this list: - - Cocoapods: *?.?.?* (Use `pod --version` in Terminal) - - Carthage: *?.?* (Use `carthage version` in Terminal) - - Swift Package Manager *?.?.? (swiftpm-???)* (Use `swift build --version` in Terminal) +- Cocoapods: *?.?.?* (Use `pod --version` in Terminal) +- Carthage: *?.?* (Use `carthage version` in Terminal) +- Swift Package Manager *?.?.? (swiftpm-???)* (Use `swift build --version` in Terminal) ### Project that demonstrates the issue diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.github/PULL_REQUEST_TEMPLATE b/Carthage/Checkouts/Quick/Externals/Nimble/.github/PULL_REQUEST_TEMPLATE index 20e40c875..0e3395a66 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.github/PULL_REQUEST_TEMPLATE +++ b/Carthage/Checkouts/Quick/Externals/Nimble/.github/PULL_REQUEST_TEMPLATE @@ -1,14 +1,13 @@ The PR should summarize what was changed and why. Here are some questions to help you if you're not sure: - - What behavior was changed? - - What code was refactored / updated to support this change? - - What issues are related to this PR? Or why was this change introduced? +- What behavior was changed? +- What code was refactored / updated to support this change? +- What issues are related to this PR? Or why was this change introduced? Checklist - While not every PR needs it, new features should consider this list: - - [ ] Does this have tests? - - [ ] Does this have documentation? - - [ ] Does this break the public API (Requires major version bump)? - - [ ] Is this a new feature (Requires minor version bump)? - +- [ ] Does this have tests? +- [ ] Does this have documentation? +- [ ] Does this break the public API (Requires major version bump)? +- [ ] Is this a new feature (Requires minor version bump)? diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.github/workflows/ci.yml b/Carthage/Checkouts/Quick/Externals/Nimble/.github/workflows/ci.yml index 2c4109d5e..4e86fec46 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.github/workflows/ci.yml +++ b/Carthage/Checkouts/Quick/Externals/Nimble/.github/workflows/ci.yml @@ -6,41 +6,39 @@ on: - master pull_request: branches: - - '*' + - "*" jobs: cocoapods: name: CocoaPods Lint - runs-on: macOS-10.14 + runs-on: macos-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-ruby@v1 - with: - ruby-version: '2.x' - - run: sudo xcode-select -s '/Applications/Xcode_10.3.app' - - run: bundle install --jobs=8 - - run: ./test podspec + - uses: actions/checkout@v2 + - run: bundle install + - run: ./test podspec xcode: - name: Xcode ${{ matrix.xcode }} - runs-on: macOS-10.14 + name: Xcode ${{ matrix.xcode }} - ${{ matrix.platform }} + runs-on: macos-latest strategy: matrix: - xcode: [10.1, 10.3, 11] + xcode: [11.4.1] + platform: [macos, ios, tvos, macos_xcodespm, ios_xcodespm] + fail-fast: false + env: + DEVELOPER_DIR: /Applications/Xcode_${{ matrix.xcode }}.app steps: - - uses: actions/checkout@v1 - - run: sudo xcode-select -s '/Applications/Xcode_${{ matrix.xcode }}.app' - - run: ./test macos - - run: ./test ios - - run: ./test tvos + - uses: actions/checkout@v2 + - run: ./test ${{ matrix.platform }} swiftpm_darwin: name: SwiftPM, Darwin, Xcode ${{ matrix.xcode }} - runs-on: macOS-10.14 + runs-on: macos-latest strategy: matrix: - xcode: [10.1, 10.3, 11] + xcode: [11.4.1] + env: + DEVELOPER_DIR: /Applications/Xcode_${{ matrix.xcode }}.app steps: - - uses: actions/checkout@v1 - - run: sudo xcode-select -s '/Applications/Xcode_${{ matrix.xcode }}.app' - - run: ./test swiftpm + - uses: actions/checkout@v2 + - run: ./test swiftpm diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.github/workflows/swiftlint.yml b/Carthage/Checkouts/Quick/Externals/Nimble/.github/workflows/swiftlint.yml new file mode 100644 index 000000000..c10adfe26 --- /dev/null +++ b/Carthage/Checkouts/Quick/Externals/Nimble/.github/workflows/swiftlint.yml @@ -0,0 +1,15 @@ +name: SwiftLint + +on: + pull_request: + paths: + - '.github/workflows/swiftlint.yml' + - '.swiftlint.yml' + - '**/*.swift' + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: norio-nomura/action-swiftlint@3.1.0 diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.hound.yml b/Carthage/Checkouts/Quick/Externals/Nimble/.hound.yml deleted file mode 100644 index f18050417..000000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.hound.yml +++ /dev/null @@ -1,2 +0,0 @@ -swiftlint: - config_file: .swiftlint.yml diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.swift-version b/Carthage/Checkouts/Quick/Externals/Nimble/.swift-version deleted file mode 100644 index bf77d5496..000000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.swift-version +++ /dev/null @@ -1 +0,0 @@ -4.2 diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.swiftlint.yml b/Carthage/Checkouts/Quick/Externals/Nimble/.swiftlint.yml index 146ea6a10..47543c610 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.swiftlint.yml +++ b/Carthage/Checkouts/Quick/Externals/Nimble/.swiftlint.yml @@ -6,6 +6,7 @@ included: - Tests excluded: + - Package.swift - Carthage/Checkouts - Tests/NimbleTests/XCTestManifests.swift - Tests/NimbleTests/Helpers/XCTestCaseProvider.swift diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml b/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml index 7d1047d12..6a9ff56f3 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml +++ b/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml @@ -3,27 +3,38 @@ branches: - master language: generic -matrix: +jobs: include: + # - &xcode + # name: Xcode 10.3 / Swift 5.0 + # os: osx + # osx_image: xcode10.3 + # script: + # - ./test macos + # - ./test ios + # - ./test tvos + # - &swiftpm_darwin + # name: SwiftPM / Darwin / Swift 5.0 + # os: osx + # osx_image: xcode10.3 + # script: ./test swiftpm - &swiftpm_linux - name: SwiftPM / Linux / Swift 4.2.4 + name: SwiftPM / Linux / Swift 5.2.3 os: linux - dist: trusty - sudo: required env: - - SWIFT_VERSION=4.2.4 + - SWIFT_VERSION=5.2.3 install: - eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" script: - ./test swiftpm - <<: *swiftpm_linux - name: SwiftPM / Linux / Swift 5.0.3 + name: SwiftPM / Linux / Swift 5.3 Development env: - - SWIFT_VERSION=5.0.3 + - SWIFT_VERSION=5.3-DEVELOPMENT-SNAPSHOT-2020-05-11-a - <<: *swiftpm_linux - name: SwiftPM / Linux / Swift 5.1 Development + name: SwiftPM / Linux / Swift Development env: - - SWIFT_VERSION=5.1-DEVELOPMENT-SNAPSHOT-2019-09-05-a + - SWIFT_VERSION=DEVELOPMENT-SNAPSHOT-2020-05-18-a install: true script: - ./test $TYPE diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Cartfile.private b/Carthage/Checkouts/Quick/Externals/Nimble/Cartfile.private index b5ed77ee1..a04db39fd 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Cartfile.private +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Cartfile.private @@ -1 +1,2 @@ -github "mattgallagher/CwlPreconditionTesting" == 1.2.0 +github "mattgallagher/CwlCatchException" ~> 2.0 +github "mattgallagher/CwlPreconditionTesting" ~> 2.0 diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Cartfile.resolved b/Carthage/Checkouts/Quick/Externals/Nimble/Cartfile.resolved index fbe69497d..2ba0b9ece 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Cartfile.resolved +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Cartfile.resolved @@ -1 +1,2 @@ -github "mattgallagher/CwlPreconditionTesting" "1.2.0" +github "mattgallagher/CwlCatchException" "2.0.0" +github "mattgallagher/CwlPreconditionTesting" "2.0.0" diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/LICENSE.txt b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/LICENSE.txt similarity index 100% rename from Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/LICENSE.txt rename to Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/LICENSE.txt diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Package.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/Package.swift similarity index 94% rename from Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Package.swift rename to Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/Package.swift index 33689a22c..acee3952a 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Package.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:4.2 +// swift-tools-version:5.0 import PackageDescription let package = Package( diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/README.md b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/README.md new file mode 100644 index 000000000..1e8a6ec56 --- /dev/null +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/README.md @@ -0,0 +1,18 @@ +# CwlCatchException +A simple Swift wrapper around an Objective-C `@try`/`@catch` statement that selectively catches Objective-C exceptions by `NSException` subtype, rethrowing if any caught exception is not the expected subtype. + +Look at [CwlCatchExceptionTests.swift](https://github.com/mattgallagher/CwlCatchException/blob/master/Tests/CwlCatchExceptionTests/CwlCatchExceptionTests.swift) for syntax. + +## Requirements + +From version 2.0.0-beta.1, building CwlCatchException requires Swift 5 or newer and the Swift Package Manager. + +For use with older versions of Swift or other package managers, [use version 1.2.0 or older](https://github.com/mattgallagher/CwlCatchException/tree/1.2.0). + +## Adding to your project + +Add the following to the `dependencies` array in your "Package.swift" file: + + .package(url: "https://github.com/mattgallagher/CwlCatchException.git", from: Version("2.0.0-beta.1")) + +Or by adding `https://github.com/mattgallagher/CwlCatchException.git`, version 2.0.0-beta.1 or later, to the list of Swift packages for any project in Xcode. diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift similarity index 100% rename from Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift rename to Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m similarity index 100% rename from Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m rename to Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h similarity index 82% rename from Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h rename to Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h index 47b06bf2b..eb42378f5 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h @@ -20,10 +20,4 @@ #import -//! Project version number for CwlCatchException. -FOUNDATION_EXPORT double CwlCatchExceptionVersionNumber; - -//! Project version string for CwlCatchException. -FOUNDATION_EXPORT const unsigned char CwlCatchExceptionVersionString[]; - NSException* __nullable catchExceptionOfKind(Class __nonnull type, void (^ __nonnull inBlock)(void)); diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/README.md b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/README.md deleted file mode 100644 index 052d7c0e2..000000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# CwlCatchException -A simple Swift wrapper around an Objective-C `@try`/`@catch` statement that selectively catches Objective-C exceptions by `NSException` subtype, rethrowing if any caught exception is not the expected subtype. - -Look at [CwlCatchExceptionTests.swift](https://github.com/mattgallagher/CwlCatchException/blob/master/Tests/CwlCatchExceptionTests/CwlCatchExceptionTests.swift) for syntax. - -## Adding to your project - -This project can be used by direct inclusion in your projects or through any of the Swift Package Manager, CocoaPods or Carthage. - -Minimum requirements are iOS 8 or macOS 10.9. - -### Manual inclusion - -1. In a subdirectory of your project's directory, run `git clone https://github.com/mattgallagher/CwlCatchException.git` -2. Drag the "CwlCatchException.xcodeproj" file from the Finder into your own project's file tree in Xcode -3. Add the "CwlCatchException.framework" from the "Products" folder of the CwlCatchException project's file tree to the "Copy Files (Frameworks)" build phases of any target that you want to include this module. - -That third step is a little tricky if you're unfamiliar with Xcode but it involves: - -a. click on your project in the file tree -b. click on the target to whih you want to add this module -c. select the "Build Phases" tab -d. if you don't already have a "Copy File" build phase with a "Destination: Frameworks", add one using the "+" button in the top left of the tab -e. click the "+" within the "Copy File (Frameworks)" phase and from the list that appears, select the "CwlCatchException.framework" (if there are multiple frameworks with the same name, look for the one that appears *above* the corresponding macOS or iOS CwlCatchException testing target). - -### Swift Package Manager - -Add the following to the `dependencies` array in your "Package.swift" file: - - .Package(url: "https://github.com/mattgallagher/CwlCatchException.git", majorVersion: 1), - -Or, if you're using the `swift-tools-version:4.0` package manager, add the following to the `dependencies` array in your "Package.swift" file: - - .package(url: "https://github.com/mattgallagher/CwlCatchException.git", majorVersion: 1) - -### CocoaPods - -Add the following to your target in your "Podfile": - - pod 'CwlCatchException', :git => 'https://github.com/mattgallagher/CwlCatchException.git' - -### Carthage - -Add the following line to your Cartfile: - - git "https://github.com/mattgallagher/CwlCatchException.git" "master" diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Package.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Package.swift index 12b0c068d..d6d183dbf 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Package.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Package.swift @@ -1,13 +1,14 @@ -// swift-tools-version:4.0 +// swift-tools-version:5.0 import PackageDescription let package = Package( name: "CwlPreconditionTesting", products: [ - .library(name: "CwlPreconditionTesting", targets: ["CwlPreconditionTesting", "CwlMachBadInstructionHandler"]) + .library(name: "CwlPreconditionTesting", targets: ["CwlPreconditionTesting", "CwlMachBadInstructionHandler"]), + .library(name: "CwlPosixPreconditionTesting", targets: ["CwlPosixPreconditionTesting"]) ], dependencies: [ - .package(url: "https://github.com/mattgallagher/CwlCatchException.git", from: "1.2.0") + .package(url: "https://github.com/mattgallagher/CwlCatchException.git", from: "2.0.0") ], targets: [ .target( @@ -15,14 +16,12 @@ let package = Package( dependencies: [ .target(name: "CwlMachBadInstructionHandler"), .product(name: "CwlCatchException") - ], - exclude: [ - "./Mach/CwlPreconditionTesting.h", - "./Posix/CwlPreconditionTesting.h", - "./CwlCatchBadInstructionPosix.swift" ] ), + .target( + name: "CwlPosixPreconditionTesting" + ), .target(name: "CwlMachBadInstructionHandler"), - .testTarget(name: "CwlPreconditionTestingTests", dependencies: ["CwlPreconditionTesting"]) + .testTarget(name: "CwlPreconditionTestingTests", dependencies: ["CwlPreconditionTesting", "CwlPosixPreconditionTesting"]) ] ) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/README.md b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/README.md index 259d1fe9c..9af31c79e 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/README.md +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/README.md @@ -8,52 +8,40 @@ For an extended discussion of this code, please see the Cocoa with Love article: [Partial functions in Swift, Part 2: Catching precondition failures](http://cocoawithlove.com/blog/2016/02/02/partial-functions-part-two-catching-precondition-failures.html) -## Adding to your project - -This project can be used by manual inclusion in your projects or through any of the Swift Package Manager, CocoaPods or Carthage. - -Minimum requirements are iOS 8 (simulator-only) or macOS 10.9. The project includes tvOS 9 and POSIX targets but these aren't regularly tested. - -### Manual inclusion - -1. In a subdirectory of your project's directory, run `git clone https://github.com/mattgallagher/CwlPreconditionTesting.git` -2. Drag the "CwlPreconditionTesting.xcodeproj" file from the Finder into your own project's file tree in Xcode -3. Add the "CwlPreconditionTesting.framework" from the "Products" folder of the CwlPreconditionTesting project's file tree to the "Copy Files (Frameworks)" build phases of any targets that you want to include this module. -4. Drag the "CwlCatchException.framework" from the "Dependencies" group (within the CwlPreconditionTesting project's file tree) onto the same "Copy Files (Frameworks)" build phase +## Requirements -### Swift Package Manager +From version 2.0.0-beta.1, building CwlPreconditionTesting requires Swift 5 or newer and the Swift Package Manager. -Assuming you're using the `swift-tools-version:4.0` package manager, add the following to the `dependencies` array in your "Package.swift" file: +For use with older versions of Swift or other package managers, [use version 1.2.0 or older](https://github.com/mattgallagher/CwlPreconditionTesting/tree/1.2.0). - .package(url: "https://github.com/mattgallagher/CwlPreconditionTesting.git", majorVersion: 1) - -> NOTE: even though this git repository includes its dependencies in the Dependencies folder, building via the Swift Package manager fetches and builds these dependencies independently. - -### CocoaPods - -Add the following lines to your target in your "Podfile": +## Adding to your project - pod 'CwlPreconditionTesting', :git => 'https://github.com/mattgallagher/CwlPreconditionTesting.git' - pod 'CwlCatchException', :git => 'https://github.com/mattgallagher/CwlCatchException.git' +Add the following to the `dependencies` array in your "Package.swift" file: -### Carthage + .package(url: "https://github.com/mattgallagher/CwlPreconditionTesting.git", from: Version("2.0.0-beta.1")) -Add the following line to your Cartfile: +Or by adding `https://github.com/mattgallagher/CwlPreconditionTesting.git`, version 2.0.0-beta.1 or later, to the list of Swift packages for any project in Xcode. - git "https://github.com/mattgallagher/CwlPreconditionTesting.git" "master" +## Usage -## Using POSIX signals and setjmp/longjmp +On macOS and iOS you can use the regular version: -For comparison or for anyone running this code on a platform without Mach exceptions or the Objective-C runtime, I've added a proof-of-concept implementation of `catchBadInstruction` that uses a POSIX SIGILL `sigaction` and `setjmp`/`longjmp` to perform the throw. +```swift +import CwlPreconditionTesting -In Xcode, you can simply select the CwlPreconditionTesting_POSIX target (instead of the OSX or iOS targets). If you're building without Xcode: all you need is the CwlCatchBadInstructionPOSIX.swift file (compared to the Mach exception handler, the code is tiny doesn't have any weird Objective-C/MiG file dependencies). +let e = catchBadInstruction { + precondition(false, "THIS PRECONDITION FAILURE IS EXPECTED") +} +``` -**Warning No. 1**: on OS X, this approach can't be used when lldb is attached since lldb's Mach exception handler blocks the SIGILL from ever occurring (I've disabled the "Debug Executable" setting for the tests in Xcode - re-enable it to witness the problem). +on tvOS, Linux and other platforms, you can use the POSIX version: -**Warning No. 2**: if you're switching between the CwlPreconditionTesting_OSX and CwlPreconditionTesting_POSIX targets, Xcode (as of Xcode 7.2.1) will not detect the change and will not remove the old framework correctly so you'll need to *clean your project* otherwise the old framework will hang around. +```swift +import CwlPosixPreconditionTesting -Additional problems in decreasing severity include: +let e = catchBadInstruction { + precondition(false, "THIS PRECONDITION FAILURE IS EXPECTED") +} +``` -* the signal handler is whole process (rather than correctly scoped to the thread where the "catch" occurs) -* the signal handler doesn't deal with re-entrancy whereas the mach exception handler remains deterministic in the face of multiple fatal errors -* the signal handler overwrites the "[red zone](https://en.wikipedia.org/wiki/Red_zone_(computing))" which is technically frowned upon in signal handlers (although unlikely to cause problems here) +**Warning**: this POSIX version can't be used when lldb is attached since lldb's Mach exception handler blocks the SIGILL from ever occurring. You should disable the "Debug Executable" setting for the tests in Xcode. The POSIX version of the signal handler is also whole process (rather than correctly scoped to the thread where the "catch" occurs). diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstructionPosix.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPosixPreconditionTesting/CwlCatchBadInstructionPosix.swift similarity index 99% rename from Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstructionPosix.swift rename to Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPosixPreconditionTesting/CwlCatchBadInstructionPosix.swift index 4fc99faad..4296a79d3 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstructionPosix.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPosixPreconditionTesting/CwlCatchBadInstructionPosix.swift @@ -18,7 +18,7 @@ // IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // -#if os(tvOS) && targetEnvironment(simulator) +#if arch(x86_64) import Foundation @@ -104,5 +104,5 @@ public func catchBadInstruction(block: @escaping () -> Void) -> BadInstructionEx return caught ? BadInstructionException() : nil } - + #endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/include/CwlPreconditionTesting.h b/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/include/CwlPreconditionTesting.h deleted file mode 100644 index 93a0e610c..000000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/include/CwlPreconditionTesting.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// CwlPreconditionTesting.h -// CwlPreconditionTesting -// -// Created by Matt Gallagher on 2016/01/10. -// Copyright © 2016 Matt Gallagher ( https://www.cocoawithlove.com ). All rights reserved. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -// - -#import - -//! Project version number for CwlUtils. -FOUNDATION_EXPORT double CwlPreconditionTestingVersionNumber; - -//! Project version string for CwlUtils. -FOUNDATION_EXPORT const unsigned char CwlAssertingTestingVersionString[]; - -#import "CwlMachBadInstructionHandler.h" - -#if TARGET_OS_OSX || TARGET_OS_IOS - #import "CwlCatchException.h" -#elif !TARGET_OS_TV - #error Unsupported platform. -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile b/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile index adb8306b7..847d7eaf1 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile @@ -1,4 +1,4 @@ # A sample Gemfile source "https://rubygems.org" -gem 'cocoapods', '~> 1.7' +gem 'cocoapods', '~> 1.9' diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock b/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock index 6c6f53490..5f4c65676 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Gemfile.lock @@ -1,65 +1,79 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.0) - activesupport (4.2.11.1) + CFPropertyList (3.0.2) + activesupport (4.2.11.3) i18n (~> 0.7) minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) + algoliasearch (1.27.2) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) atomos (0.1.3) - claide (1.0.2) - cocoapods (1.7.1) + claide (1.0.3) + cocoapods (1.9.2) activesupport (>= 4.0.2, < 5) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.7.1) + cocoapods-core (= 1.9.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 1.2.2, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.3.1, < 2.0) + cocoapods-trunk (>= 1.4.0, < 2.0) cocoapods-try (>= 1.1.0, < 2.0) colored2 (~> 3.1) escape (~> 0.0.4) - fourflusher (>= 2.2.0, < 3.0) + fourflusher (>= 2.3.0, < 3.0) gh_inspector (~> 1.0) molinillo (~> 0.6.6) nap (~> 1.0) ruby-macho (~> 1.4) - xcodeproj (>= 1.8.2, < 2.0) - cocoapods-core (1.7.1) + xcodeproj (>= 1.14.0, < 2.0) + cocoapods-core (1.9.2) activesupport (>= 4.0.2, < 6) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) fuzzy_match (~> 2.0.4) nap (~> 1.0) + netrc (~> 0.11) + typhoeus (~> 1.0) cocoapods-deintegrate (1.0.4) - cocoapods-downloader (1.2.2) + cocoapods-downloader (1.3.0) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.0) cocoapods-stats (1.1.0) - cocoapods-trunk (1.3.1) + cocoapods-trunk (1.5.0) nap (>= 0.8, < 2.0) netrc (~> 0.11) - cocoapods-try (1.1.0) + cocoapods-try (1.2.0) colored2 (3.1.2) - concurrent-ruby (1.1.5) + concurrent-ruby (1.1.6) escape (0.0.4) - fourflusher (2.3.0) + ethon (0.12.0) + ffi (>= 1.3.0) + ffi (1.12.2) + fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) + httpclient (2.8.3) i18n (0.9.5) concurrent-ruby (~> 1.0) - minitest (5.11.3) + json (2.3.0) + minitest (5.14.1) molinillo (0.6.6) nanaimo (0.2.6) nap (1.1.0) netrc (0.11.0) ruby-macho (1.4.0) thread_safe (0.3.6) - tzinfo (1.2.5) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (1.2.7) thread_safe (~> 0.1) - xcodeproj (1.9.0) + xcodeproj (1.16.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -70,7 +84,7 @@ PLATFORMS ruby DEPENDENCIES - cocoapods (~> 1.7) + cocoapods (~> 1.9) BUNDLED WITH - 1.17.3 + 2.1.4 diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec index 754e2c1fe..6d02c0a4d 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Nimble" - s.version = "8.0.4" + s.version = "9.0.0-rc.1" s.summary = "A Matcher Framework for Swift and Objective-C" s.description = <<-DESC Use Nimble to express the expected outcomes of Swift or Objective-C expressions. Inspired by Cedar. @@ -16,24 +16,24 @@ Pod::Spec.new do |s| s.source_files = [ "Sources/**/*.{swift,h,m,c}", - "Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Sources/**/*.{swift,h,m,c}", + "Carthage/Checkouts/CwlCatchException/Sources/**/*.{swift,h,m,c}", "Carthage/Checkouts/CwlPreconditionTesting/Sources/**/*.{swift,h,m,c}", ] s.osx.exclude_files = [ - "Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstructionPosix.swift", + "Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPosixPreconditionTesting/CwlCatchBadInstructionPosix.swift", ] s.ios.exclude_files = [ - "Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstructionPosix.swift", + "Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPosixPreconditionTesting/CwlCatchBadInstructionPosix.swift", ] s.tvos.exclude_files = [ - "Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h", + "Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h", "Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstruction.swift", "Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlBadInstructionException.swift", "Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift", - "Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift", - "Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m", - "Carthage/Checkouts/CwlPreconditionTesting/Dependencies/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h", + "Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift", + "Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m", + "Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h", ] s.exclude_files = "Sources/Nimble/Adapters/NonObjectiveC/*.swift" @@ -51,8 +51,8 @@ Pod::Spec.new do |s| s.cocoapods_version = '>= 1.4.0' if s.respond_to?(:swift_versions) then - s.swift_versions = ['4.2', '5.0'] + s.swift_versions = ['5.0'] else - s.swift_version = '4.2' + s.swift_version = '5.0' end end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj index 5179f22f5..3468eb7cf 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/project.pbxproj @@ -21,6 +21,9 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 0477153523B740AD00402D4E /* DispatchTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0477153423B740AD00402D4E /* DispatchTimeInterval.swift */; }; + 0477153623B740B700402D4E /* DispatchTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0477153423B740AD00402D4E /* DispatchTimeInterval.swift */; }; + 0477153723B740B800402D4E /* DispatchTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0477153423B740AD00402D4E /* DispatchTimeInterval.swift */; }; 1F0648CC19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; 1F0648CD19639F5A001F9C46 /* ObjectWithLazyProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */; }; 1F0648D41963AAB2001F9C46 /* SynchronousTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0648D31963AAB2001F9C46 /* SynchronousTest.swift */; }; @@ -62,8 +65,6 @@ 1F1B5AD51963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1B5AD31963E13900CA8BF9 /* BeAKindOfTest.swift */; }; 1F299EAB19627B2D002641AF /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; 1F299EAC19627B2D002641AF /* BeEmptyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */; }; - 1F43728A1A1B343800EB80F8 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; - 1F43728B1A1B343900EB80F8 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; 1F43728C1A1B343C00EB80F8 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; 1F43728D1A1B343D00EB80F8 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; 1F43728E1A1B343F00EB80F8 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; @@ -142,7 +143,6 @@ 1F5DF1871BDCA0F500C3A531 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB4D5EC19FE43C200E9D9FE /* Match.swift */; }; 1F5DF1891BDCA0F500C3A531 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */; }; 1F5DF18A1BDCA0F500C3A531 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 1F5DF18B1BDCA0F500C3A531 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD251968AB07008ED995 /* Functional.swift */; }; 1F5DF18C1BDCA0F500C3A531 /* Await.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD261968AB07008ED995 /* Await.swift */; }; 1F5DF18D1BDCA0F500C3A531 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD271968AB07008ED995 /* SourceLocation.swift */; }; 1F5DF18E1BDCA0F500C3A531 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD281968AB07008ED995 /* Stringers.swift */; }; @@ -284,15 +284,18 @@ 29EA59641B551ED2002D767E /* ThrowErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */; }; 29EA59661B551EE6002D767E /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; 29EA59671B551EE6002D767E /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29EA59651B551EE6002D767E /* ThrowError.swift */; }; - 347155CA1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 347155CB1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; - 347155CC1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */; }; 472FD1351B9E085700C7B8DA /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; 472FD1391B9E0A9700C7B8DA /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1341B9E085700C7B8DA /* HaveCount.swift */; }; 472FD13A1B9E0A9F00C7B8DA /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; 472FD13B1B9E0CFE00C7B8DA /* HaveCountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */; }; 4793854D1BA0BB2500296F85 /* ObjCHaveCountTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCountTest.m */; }; 4793854E1BA0BB2500296F85 /* ObjCHaveCountTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4793854C1BA0BB2500296F85 /* ObjCHaveCountTest.m */; }; + 62FB326223B78BF90047BED9 /* BeginWithPrefix.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FB326123B78BF90047BED9 /* BeginWithPrefix.swift */; }; + 62FB326323B78BF90047BED9 /* BeginWithPrefix.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FB326123B78BF90047BED9 /* BeginWithPrefix.swift */; }; + 62FB326423B78BF90047BED9 /* BeginWithPrefix.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FB326123B78BF90047BED9 /* BeginWithPrefix.swift */; }; + 62FB326923B78D4F0047BED9 /* BeginWithPrefixTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FB326523B78D4A0047BED9 /* BeginWithPrefixTest.swift */; }; + 62FB326A23B78D500047BED9 /* BeginWithPrefixTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FB326523B78D4A0047BED9 /* BeginWithPrefixTest.swift */; }; + 62FB326B23B78D510047BED9 /* BeginWithPrefixTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FB326523B78D4A0047BED9 /* BeginWithPrefixTest.swift */; }; 6CAEDD0A1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; 6CAEDD0B1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; 6CAEDD0C1CAEA86F003F1584 /* LinuxSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */; }; @@ -353,7 +356,10 @@ B20058C520E92CE400C1264D /* ElementsEqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C420E92CE400C1264D /* ElementsEqualTest.swift */; }; B20058C620E92CE400C1264D /* ElementsEqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C420E92CE400C1264D /* ElementsEqualTest.swift */; }; B20058C720E92CE400C1264D /* ElementsEqualTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20058C420E92CE400C1264D /* ElementsEqualTest.swift */; }; - CD037213207DCC580047AF28 /* XCTestManifests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD037212207DCC580047AF28 /* XCTestManifests.swift */; }; + CD3D9A79232647BC00802581 /* CwlCatchBadInstructionPosix.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3D9A78232647BC00802581 /* CwlCatchBadInstructionPosix.swift */; }; + CD4C8F092464365300A7BDE0 /* SynchronousDeprecatedTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4C8F082464365300A7BDE0 /* SynchronousDeprecatedTest.swift */; }; + CD4C8F0A2464365300A7BDE0 /* SynchronousDeprecatedTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4C8F082464365300A7BDE0 /* SynchronousDeprecatedTest.swift */; }; + CD4C8F0B2464365300A7BDE0 /* SynchronousDeprecatedTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4C8F082464365300A7BDE0 /* SynchronousDeprecatedTest.swift */; }; CD79C99E1D2CC832004B6F9A /* ObjCAsyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56651A3B305F009E1637 /* ObjCAsyncTest.m */; }; CD79C99F1D2CC835004B6F9A /* ObjCSyncTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A37AF1B7C5042001C8357 /* ObjCSyncTest.m */; }; CD79C9A01D2CC839004B6F9A /* ObjCBeAnInstanceOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4A56691A3B3108009E1637 /* ObjCBeAnInstanceOfTest.m */; }; @@ -380,9 +386,9 @@ CD79C9B51D2CC848004B6F9A /* ObjCUserDescriptionTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 965B0D081B62B8ED0005AE66 /* ObjCUserDescriptionTest.m */; }; CD79C9B61D2CC848004B6F9A /* ObjCAllPassTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFAEB31A93CBE6005CA37A /* ObjCAllPassTest.m */; }; CD79C9B71D2CC848004B6F9A /* ObjCSatisfyAnyOfTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5358C11C39155600A23FAA /* ObjCSatisfyAnyOfTest.m */; }; - CD8D21BD2322BFC300C3996F /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = CD8D21BC2322BFC300C3996F /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CD8D21BE2322BFC300C3996F /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = CD8D21BC2322BFC300C3996F /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CD8D21BF2322BFC300C3996F /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = CD8D21BC2322BFC300C3996F /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CDBC39B92462EA7D00069677 /* PredicateTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBC39B82462EA7D00069677 /* PredicateTest.swift */; }; + CDBC39BA2462EA7D00069677 /* PredicateTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBC39B82462EA7D00069677 /* PredicateTest.swift */; }; + CDBC39BB2462EA7D00069677 /* PredicateTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBC39B82462EA7D00069677 /* PredicateTest.swift */; }; CDD80B831F2030790002CD65 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; CDD80B841F20307A0002CD65 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; CDD80B851F20307B0002CD65 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */; }; @@ -405,8 +411,6 @@ CDFB6A4B1F7E082500AD8CC7 /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = CDFB6A371F7E082400AD8CC7 /* mach_excServer.c */; }; CDFB6A4C1F7E082500AD8CC7 /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = CDFB6A371F7E082400AD8CC7 /* mach_excServer.c */; }; CDFB6A4F1F7E084600AD8CC7 /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = CDFB6A341F7E082400AD8CC7 /* CwlMachBadInstructionHandler.m */; }; - CDFB6A501F7E085600AD8CC7 /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = CDFB6A361F7E082400AD8CC7 /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CDFB6A511F7E087500AD8CC7 /* CwlCatchBadInstructionPosix.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDFB6A2C1F7E082400AD8CC7 /* CwlCatchBadInstructionPosix.swift */; }; DA9E8C821A414BB9002633C2 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; DA9E8C831A414BB9002633C2 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9E8C811A414BB9002633C2 /* DSL+Wait.swift */; }; DD72EC641A93874A002F7651 /* AllPassTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD72EC631A93874A002F7651 /* AllPassTest.swift */; }; @@ -493,6 +497,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 0477153423B740AD00402D4E /* DispatchTimeInterval.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DispatchTimeInterval.swift; sourceTree = ""; }; 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjectWithLazyProperty.swift; sourceTree = ""; }; 1F0648D31963AAB2001F9C46 /* SynchronousTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronousTest.swift; sourceTree = ""; }; 1F14FB63194180C5009F2A08 /* utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = utils.swift; sourceTree = ""; }; @@ -588,7 +593,6 @@ 1FD8CD1C1968AB07008ED995 /* Equal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Equal.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 1FD8CD1D1968AB07008ED995 /* MatcherProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatcherProtocols.swift; sourceTree = ""; }; 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RaisesException.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 1FD8CD251968AB07008ED995 /* Functional.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Functional.swift; sourceTree = ""; }; 1FD8CD261968AB07008ED995 /* Await.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Await.swift; sourceTree = ""; }; 1FD8CD271968AB07008ED995 /* SourceLocation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SourceLocation.swift; sourceTree = ""; }; 1FD8CD281968AB07008ED995 /* Stringers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stringers.swift; sourceTree = ""; }; @@ -596,10 +600,11 @@ 1FE661561E6574E20035F243 /* ExpectationMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExpectationMessage.swift; sourceTree = ""; }; 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowErrorTest.swift; sourceTree = ""; }; 29EA59651B551EE6002D767E /* ThrowError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowError.swift; sourceTree = ""; }; - 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTestCaseProvider.swift; sourceTree = ""; }; 472FD1341B9E085700C7B8DA /* HaveCount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HaveCount.swift; sourceTree = ""; }; 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HaveCountTest.swift; sourceTree = ""; }; 4793854C1BA0BB2500296F85 /* ObjCHaveCountTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCHaveCountTest.m; sourceTree = ""; }; + 62FB326123B78BF90047BED9 /* BeginWithPrefix.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeginWithPrefix.swift; sourceTree = ""; }; + 62FB326523B78D4A0047BED9 /* BeginWithPrefixTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeginWithPrefixTest.swift; sourceTree = ""; }; 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinuxSupport.swift; sourceTree = ""; }; 7A0A26221E7F52360092A34E /* ToSucceed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToSucceed.swift; sourceTree = ""; }; 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToSucceedTest.swift; sourceTree = ""; }; @@ -621,14 +626,14 @@ AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchErrorTest.swift; sourceTree = ""; }; B20058C020E92C7500C1264D /* ElementsEqual.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementsEqual.swift; sourceTree = ""; }; B20058C420E92CE400C1264D /* ElementsEqualTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementsEqualTest.swift; sourceTree = ""; }; - CD037212207DCC580047AF28 /* XCTestManifests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTestManifests.swift; sourceTree = ""; }; - CD8D21BC2322BFC300C3996F /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CwlPreconditionTesting.h; sourceTree = ""; }; + CD3D9A78232647BC00802581 /* CwlCatchBadInstructionPosix.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchBadInstructionPosix.swift; sourceTree = ""; }; + CD4C8F082464365300A7BDE0 /* SynchronousDeprecatedTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronousDeprecatedTest.swift; sourceTree = ""; }; + CDBC39B82462EA7D00069677 /* PredicateTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PredicateTest.swift; sourceTree = ""; }; CDFB6A1E1F7E07C600AD8CC7 /* CwlCatchException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchException.swift; sourceTree = ""; }; CDFB6A201F7E07C600AD8CC7 /* CwlCatchException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CwlCatchException.m; sourceTree = ""; }; CDFB6A221F7E07C600AD8CC7 /* CwlCatchException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CwlCatchException.h; sourceTree = ""; }; CDFB6A2A1F7E082400AD8CC7 /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlBadInstructionException.swift; sourceTree = ""; }; CDFB6A2B1F7E082400AD8CC7 /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchBadInstruction.swift; sourceTree = ""; }; - CDFB6A2C1F7E082400AD8CC7 /* CwlCatchBadInstructionPosix.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlCatchBadInstructionPosix.swift; sourceTree = ""; }; CDFB6A2D1F7E082400AD8CC7 /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CwlDarwinDefinitions.swift; sourceTree = ""; }; CDFB6A341F7E082400AD8CC7 /* CwlMachBadInstructionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CwlMachBadInstructionHandler.m; sourceTree = ""; }; CDFB6A361F7E082400AD8CC7 /* CwlMachBadInstructionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CwlMachBadInstructionHandler.h; sourceTree = ""; }; @@ -698,7 +703,6 @@ children = ( 1F14FB63194180C5009F2A08 /* utils.swift */, 1F0648CB19639F5A001F9C46 /* ObjectWithLazyProperty.swift */, - 347155C91C337C8900549F03 /* XCTestCaseProvider.swift */, ); path = Helpers; sourceTree = ""; @@ -776,11 +780,12 @@ 1F1A74381940169200FFFC47 /* NimbleTests */ = { isa = PBXGroup; children = ( - 1F925EE5195C121200ED456B /* AsynchronousTest.swift */, + CDBC39B82462EA7D00069677 /* PredicateTest.swift */, 1F0648D31963AAB2001F9C46 /* SynchronousTest.swift */, + CD4C8F082464365300A7BDE0 /* SynchronousDeprecatedTest.swift */, + 1F925EE5195C121200ED456B /* AsynchronousTest.swift */, 965B0D0B1B62C06D0005AE66 /* UserDescriptionTest.swift */, 6CAEDD091CAEA86F003F1584 /* LinuxSupport.swift */, - CD037212207DCC580047AF28 /* XCTestManifests.swift */, 1FFD729A1963FC8200CD29A2 /* objc */, 1F14FB61194180A7009F2A08 /* Helpers */, 1F925EE3195C11B000ED456B /* Matchers */, @@ -806,6 +811,7 @@ 1F925EE8195C124400ED456B /* BeAnInstanceOfTest.swift */, 1F925EF5195C147800ED456B /* BeCloseToTest.swift */, 1F299EAA19627B2D002641AF /* BeEmptyTest.swift */, + 62FB326523B78D4A0047BED9 /* BeginWithPrefixTest.swift */, 1F925EFB195C186800ED456B /* BeginWithTest.swift */, 1F925F10195C190B00ED456B /* BeGreaterThanOrEqualToTest.swift */, 1F925F07195C18CF00ED456B /* BeGreaterThanTest.swift */, @@ -818,18 +824,18 @@ 1F91DD2C1C74BF36002C309F /* BeVoidTest.swift */, 7B13BA091DD360DE00C9098C /* ContainElementSatisfyingTest.swift */, 1F925F01195C189500ED456B /* ContainTest.swift */, + B20058C420E92CE400C1264D /* ElementsEqualTest.swift */, 1F925EFE195C187600ED456B /* EndWithTest.swift */, 1F925F04195C18B700ED456B /* EqualTest.swift */, - B20058C420E92CE400C1264D /* ElementsEqualTest.swift */, 472FD1361B9E094B00C7B8DA /* HaveCountTest.swift */, + AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */, DDB4D5EF19FE442800E9D9FE /* MatchTest.swift */, + 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */, 1F925EEB195C12C800ED456B /* RaisesExceptionTest.swift */, - 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */, - 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */, A8A3B6E920712FC100E25A08 /* SatisfyAllOfTest.swift */, - 1FCF914E1C61C85A00B15DCB /* PostNotificationTest.swift */, - AE7ADE481C80C00D00B94CD3 /* MatchErrorTest.swift */, + 7B5358B91C3846C900A23FAA /* SatisfyAnyOfTest.swift */, 1F4BB8B31DACA0D00048464B /* ThrowAssertionTest.swift */, + 29EA59621B551ED2002D767E /* ThrowErrorTest.swift */, 7A6AB2C11E7F547E00A2F694 /* ToSucceedTest.swift */, ); path = Matchers; @@ -860,6 +866,7 @@ 1FD8CD0F1968AB07008ED995 /* BeCloseTo.swift */, 1FD8CD101968AB07008ED995 /* BeEmpty.swift */, 1FD8CD111968AB07008ED995 /* BeginWith.swift */, + 62FB326123B78BF90047BED9 /* BeginWithPrefix.swift */, 1FD8CD121968AB07008ED995 /* BeGreaterThan.swift */, 1FD8CD131968AB07008ED995 /* BeGreaterThanOrEqualTo.swift */, 1FD8CD141968AB07008ED995 /* BeIdenticalTo.swift */, @@ -870,9 +877,9 @@ 1F91DD301C74BF61002C309F /* BeVoid.swift */, 1FD8CD1A1968AB07008ED995 /* Contain.swift */, 7B13BA051DD360AA00C9098C /* ContainElementSatisfying.swift */, + B20058C020E92C7500C1264D /* ElementsEqual.swift */, 1FD8CD1B1968AB07008ED995 /* EndWith.swift */, 1FD8CD1C1968AB07008ED995 /* Equal.swift */, - B20058C020E92C7500C1264D /* ElementsEqual.swift */, 472FD1341B9E085700C7B8DA /* HaveCount.swift */, DDB4D5EC19FE43C200E9D9FE /* Match.swift */, 1F1871E51CA89FCD00A34BF2 /* MatcherFunc.swift */, @@ -881,8 +888,8 @@ 1FCF91521C61C8A400B15DCB /* PostNotification.swift */, 1FA0C3FE1E30B14500623165 /* Predicate.swift */, 1FD8CD1E1968AB07008ED995 /* RaisesException.swift */, - 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */, A8F6B5BC2070186D00FCB5ED /* SatisfyAllOf.swift */, + 7B5358BD1C38479700A23FAA /* SatisfyAnyOf.swift */, 964CFEFC1C4FF48900513336 /* ThrowAssertion.swift */, 29EA59651B551EE6002D767E /* ThrowError.swift */, 7A0A26221E7F52360092A34E /* ToSucceed.swift */, @@ -893,11 +900,11 @@ 1FD8CD241968AB07008ED995 /* Utils */ = { isa = PBXGroup; children = ( - 1FD8CD251968AB07008ED995 /* Functional.swift */, 1FD8CD261968AB07008ED995 /* Await.swift */, 1FD8CD271968AB07008ED995 /* SourceLocation.swift */, 1FD8CD281968AB07008ED995 /* Stringers.swift */, AE4BA9AC1C88DDB500B73906 /* Errors.swift */, + 0477153423B740AD00402D4E /* DispatchTimeInterval.swift */, ); path = Utils; sourceTree = ""; @@ -939,12 +946,12 @@ path = objc; sourceTree = ""; }; - CD8D21BB2322BFC300C3996F /* include */ = { + CD3D9A77232647BC00802581 /* CwlPosixPreconditionTesting */ = { isa = PBXGroup; children = ( - CD8D21BC2322BFC300C3996F /* CwlPreconditionTesting.h */, + CD3D9A78232647BC00802581 /* CwlCatchBadInstructionPosix.swift */, ); - path = include; + path = CwlPosixPreconditionTesting; sourceTree = ""; }; CDFB69521F7E06E600AD8CC7 /* Carthage-Checkouts */ = { @@ -964,7 +971,7 @@ CDFB6A1F1F7E07C600AD8CC7 /* CwlCatchExceptionSupport */, ); name = CwlCatchException; - path = CwlPreconditionTesting/Dependencies/CwlCatchException/Sources; + path = CwlCatchException/Sources; sourceTree = ""; }; CDFB69741F7E076F00AD8CC7 /* CwlPreconditionTesting */ = { @@ -972,6 +979,7 @@ children = ( CDFB6A331F7E082400AD8CC7 /* CwlMachBadInstructionHandler */, CDFB6A291F7E082400AD8CC7 /* CwlPreconditionTesting */, + CD3D9A77232647BC00802581 /* CwlPosixPreconditionTesting */, ); name = CwlPreconditionTesting; path = CwlPreconditionTesting/Sources; @@ -1005,10 +1013,8 @@ CDFB6A291F7E082400AD8CC7 /* CwlPreconditionTesting */ = { isa = PBXGroup; children = ( - CD8D21BB2322BFC300C3996F /* include */, CDFB6A2A1F7E082400AD8CC7 /* CwlBadInstructionException.swift */, CDFB6A2B1F7E082400AD8CC7 /* CwlCatchBadInstruction.swift */, - CDFB6A2C1F7E082400AD8CC7 /* CwlCatchBadInstructionPosix.swift */, CDFB6A2D1F7E082400AD8CC7 /* CwlDarwinDefinitions.swift */, ); path = CwlPreconditionTesting; @@ -1040,7 +1046,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - CD8D21BE2322BFC300C3996F /* CwlPreconditionTesting.h in Headers */, CDFB6A4A1F7E082500AD8CC7 /* CwlMachBadInstructionHandler.h in Headers */, CDFB6A281F7E07C700AD8CC7 /* CwlCatchException.h in Headers */, 1F1871C91CA89EDB00A34BF2 /* NMBStringify.h in Headers */, @@ -1055,10 +1060,8 @@ buildActionMask = 2147483647; files = ( 1F1871E21CA89EF600A34BF2 /* NMBStringify.h in Headers */, - CD8D21BF2322BFC300C3996F /* CwlPreconditionTesting.h in Headers */, 1F1871E01CA89EF600A34BF2 /* DSL.h in Headers */, 1F1871E11CA89EF600A34BF2 /* NMBExceptionCapture.h in Headers */, - CDFB6A501F7E085600AD8CC7 /* CwlMachBadInstructionHandler.h in Headers */, 1F4999A61DBF2DD100BF8877 /* Nimble.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1067,7 +1070,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - CD8D21BD2322BFC300C3996F /* CwlPreconditionTesting.h in Headers */, CDFB6A491F7E082500AD8CC7 /* CwlMachBadInstructionHandler.h in Headers */, CDFB6A271F7E07C700AD8CC7 /* CwlCatchException.h in Headers */, 1F1871DF1CA89EF500A34BF2 /* NMBStringify.h in Headers */, @@ -1335,9 +1337,9 @@ 1F43728D1A1B343D00EB80F8 /* SourceLocation.swift in Sources */, 1FD8CD4E1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */, 1FDBD8671AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */, - 1F43728A1A1B343800EB80F8 /* Functional.swift in Sources */, AE4BA9AD1C88DDB500B73906 /* Errors.swift in Sources */, 1FD8CD3C1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */, + 0477153623B740B700402D4E /* DispatchTimeInterval.swift in Sources */, 7A6AB2C51E7F628900A2F694 /* ToSucceed.swift in Sources */, 1FD8CD501968AB07008ED995 /* BeLogical.swift in Sources */, 1F1871CB1CA89EDB00A34BF2 /* NMBExpectation.swift in Sources */, @@ -1351,6 +1353,7 @@ 1FCF91531C61C8A400B15DCB /* PostNotification.swift in Sources */, 1FD8CD2E1968AB07008ED995 /* AssertionRecorder.swift in Sources */, 29EA59661B551EE6002D767E /* ThrowError.swift in Sources */, + 62FB326323B78BF90047BED9 /* BeginWithPrefix.swift in Sources */, 1FD8CD5A1968AB07008ED995 /* Equal.swift in Sources */, 1FD8CD4C1968AB07008ED995 /* BeLessThan.swift in Sources */, 1F1871CC1CA89EDB00A34BF2 /* NMBObjCMatcher.swift in Sources */, @@ -1397,9 +1400,11 @@ files = ( 1F4A569A1A3B3539009E1637 /* ObjCEqualTest.m in Sources */, 1F925EEC195C12C800ED456B /* RaisesExceptionTest.swift in Sources */, + 62FB326A23B78D500047BED9 /* BeginWithPrefixTest.swift in Sources */, 1F925EFF195C187600ED456B /* EndWithTest.swift in Sources */, 1F1B5AD41963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */, 1F925F0E195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */, + CDBC39BA2462EA7D00069677 /* PredicateTest.swift in Sources */, 1F4A56661A3B305F009E1637 /* ObjCAsyncTest.m in Sources */, 1F925EFC195C186800ED456B /* BeginWithTest.swift in Sources */, 1F14FB64194180C5009F2A08 /* utils.swift in Sources */, @@ -1422,6 +1427,7 @@ 1F4A56761A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */, 1F925EF9195C175000ED456B /* BeNilTest.swift in Sources */, 7A6AB2C31E7F547E00A2F694 /* ToSucceedTest.swift in Sources */, + CD4C8F0A2464365300A7BDE0 /* SynchronousDeprecatedTest.swift in Sources */, A8A3B707207368F000E25A08 /* ObjCSatisfyAllOfTest.m in Sources */, 1F4A56701A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */, 1F4A56971A3B34AA009E1637 /* ObjCEndWithTest.m in Sources */, @@ -1448,7 +1454,6 @@ DD9A9A8F19CF439B00706F49 /* BeIdenticalToObjectTest.swift in Sources */, 1F4BB8B71DACA0E40048464B /* ThrowAssertionTest.swift in Sources */, 1F0648D41963AAB2001F9C46 /* SynchronousTest.swift in Sources */, - 347155CA1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, 4793854D1BA0BB2500296F85 /* ObjCHaveCountTest.m in Sources */, 1F925F08195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */, 7B5358BA1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, @@ -1473,8 +1478,10 @@ 1F1871D71CA89EEF00A34BF2 /* NMBExceptionCapture.m in Sources */, 1F5DF16E1BDCA0F500C3A531 /* NimbleXCTestHandler.swift in Sources */, 7A6AB2C61E7F628A00A2F694 /* ToSucceed.swift in Sources */, + 62FB326423B78BF90047BED9 /* BeginWithPrefix.swift in Sources */, 1F5DF1751BDCA0F500C3A531 /* FailureMessage.swift in Sources */, A8A3B6EC2071487F00E25A08 /* SatisfyAllOf.swift in Sources */, + CD3D9A79232647BC00802581 /* CwlCatchBadInstructionPosix.swift in Sources */, 1F5DF1801BDCA0F500C3A531 /* BeLessThanOrEqual.swift in Sources */, 1F1871E81CA8A18400A34BF2 /* Async.swift in Sources */, 1F5DF18A1BDCA0F500C3A531 /* ThrowError.swift in Sources */, @@ -1509,7 +1516,6 @@ 1F5DF17E1BDCA0F500C3A531 /* BeIdenticalTo.swift in Sources */, 1F1871E91CA8A18700A34BF2 /* MatcherFunc.swift in Sources */, 1F5DF17A1BDCA0F500C3A531 /* BeEmpty.swift in Sources */, - CDFB6A511F7E087500AD8CC7 /* CwlCatchBadInstructionPosix.swift in Sources */, 1F5DF18C1BDCA0F500C3A531 /* Await.swift in Sources */, 1F1871D81CA89EEF00A34BF2 /* NMBStringify.m in Sources */, 1F5DF1821BDCA0F500C3A531 /* BeNil.swift in Sources */, @@ -1522,8 +1528,8 @@ CDD80B851F20307B0002CD65 /* MatcherProtocols.swift in Sources */, 1F5DF1721BDCA0F500C3A531 /* Expectation.swift in Sources */, 7B5358C01C38479700A23FAA /* SatisfyAnyOf.swift in Sources */, + 0477153723B740B800402D4E /* DispatchTimeInterval.swift in Sources */, 7B13BA0C1DD361D300C9098C /* ContainElementSatisfying.swift in Sources */, - 1F5DF18B1BDCA0F500C3A531 /* Functional.swift in Sources */, 1F5DF1871BDCA0F500C3A531 /* Match.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1534,9 +1540,11 @@ files = ( CD79C9AD1D2CC848004B6F9A /* ObjCBeTrueTest.m in Sources */, CD79C9B41D2CC848004B6F9A /* ObjCRaiseExceptionTest.m in Sources */, + 62FB326923B78D4F0047BED9 /* BeginWithPrefixTest.swift in Sources */, 1F5DF1A31BDCA10200C3A531 /* BeLogicalTest.swift in Sources */, 1F5DF1951BDCA10200C3A531 /* utils.swift in Sources */, CD79C9B01D2CC848004B6F9A /* ObjCEndWithTest.m in Sources */, + CDBC39BB2462EA7D00069677 /* PredicateTest.swift in Sources */, CD79C9B21D2CC848004B6F9A /* ObjCHaveCountTest.m in Sources */, CD79C9A41D2CC848004B6F9A /* ObjCBeFalsyTest.m in Sources */, 1F5DF1981BDCA10200C3A531 /* BeAKindOfTest.swift in Sources */, @@ -1559,6 +1567,7 @@ CD79C9AE1D2CC848004B6F9A /* ObjCBeTruthyTest.m in Sources */, 1F5DF1921BDCA10200C3A531 /* AsynchronousTest.swift in Sources */, 1F5DF1A91BDCA10200C3A531 /* MatchTest.swift in Sources */, + CD4C8F0B2464365300A7BDE0 /* SynchronousDeprecatedTest.swift in Sources */, A8A3B708207368F100E25A08 /* ObjCSatisfyAllOfTest.m in Sources */, 1F5DF1A81BDCA10200C3A531 /* HaveCountTest.swift in Sources */, 1F5DF1971BDCA10200C3A531 /* AllPassTest.swift in Sources */, @@ -1582,7 +1591,6 @@ 7A6AB2C41E7F547E00A2F694 /* ToSucceedTest.swift in Sources */, CD79C9A71D2CC848004B6F9A /* ObjCBeGreaterThanTest.m in Sources */, CD79C9A51D2CC848004B6F9A /* ObjCBeginWithTest.m in Sources */, - 347155CC1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, 1F5DF1AA1BDCA10200C3A531 /* RaisesExceptionTest.swift in Sources */, 1F5DF1941BDCA10200C3A531 /* UserDescriptionTest.swift in Sources */, CD79C9AF1D2CC848004B6F9A /* ObjCContainTest.m in Sources */, @@ -1615,8 +1623,8 @@ 1FD8CD4F1968AB07008ED995 /* BeLessThanOrEqual.swift in Sources */, 1F1871E71CA8A18400A34BF2 /* Async.swift in Sources */, 1FDBD8681AF8A4FF0089F27B /* AssertionDispatcher.swift in Sources */, - 1F43728B1A1B343900EB80F8 /* Functional.swift in Sources */, AE4BA9AE1C88DDB500B73906 /* Errors.swift in Sources */, + 0477153523B740AD00402D4E /* DispatchTimeInterval.swift in Sources */, 1FD8CD3D1968AB07008ED995 /* BeAnInstanceOf.swift in Sources */, 1FD8CD511968AB07008ED995 /* BeLogical.swift in Sources */, 1F1871D91CA89EF100A34BF2 /* NMBExpectation.swift in Sources */, @@ -1630,6 +1638,7 @@ 1FCF91541C61C8A400B15DCB /* PostNotification.swift in Sources */, DDB4D5EE19FE43C200E9D9FE /* Match.swift in Sources */, 29EA59671B551EE6002D767E /* ThrowError.swift in Sources */, + 62FB326223B78BF90047BED9 /* BeginWithPrefix.swift in Sources */, 1FD8CD5B1968AB07008ED995 /* Equal.swift in Sources */, 1FD8CD4D1968AB07008ED995 /* BeLessThan.swift in Sources */, 1FD8CD471968AB07008ED995 /* BeGreaterThan.swift in Sources */, @@ -1676,16 +1685,17 @@ files = ( 1F4A569B1A3B3539009E1637 /* ObjCEqualTest.m in Sources */, 1F925EED195C12C800ED456B /* RaisesExceptionTest.swift in Sources */, + 62FB326B23B78D510047BED9 /* BeginWithPrefixTest.swift in Sources */, 1F925F00195C187600ED456B /* EndWithTest.swift in Sources */, 1F1B5AD51963E13900CA8BF9 /* BeAKindOfTest.swift in Sources */, 1F925F0F195C18F500ED456B /* BeLessThanOrEqualToTest.swift in Sources */, + CDBC39B92462EA7D00069677 /* PredicateTest.swift in Sources */, 1F4A56671A3B305F009E1637 /* ObjCAsyncTest.m in Sources */, 1F925EFD195C186800ED456B /* BeginWithTest.swift in Sources */, 1F925EE2195C0DFD00ED456B /* utils.swift in Sources */, DDB4D5F119FE442800E9D9FE /* MatchTest.swift in Sources */, 1F4A56741A3B3210009E1637 /* ObjCBeginWithTest.m in Sources */, 1F4A56831A3B336F009E1637 /* ObjCBeLessThanOrEqualToTest.m in Sources */, - CD037213207DCC580047AF28 /* XCTestManifests.swift in Sources */, 7B13BA0D1DD361DE00C9098C /* ContainElementSatisfyingTest.swift in Sources */, 1F925F03195C189500ED456B /* ContainTest.swift in Sources */, A8A3B6FD2073644700E25A08 /* ObjcStringersTest.m in Sources */, @@ -1702,6 +1712,7 @@ 1F91DD2E1C74BF36002C309F /* BeVoidTest.swift in Sources */, 1F4A56771A3B3253009E1637 /* ObjCBeGreaterThanTest.m in Sources */, 1F925EFA195C175000ED456B /* BeNilTest.swift in Sources */, + CD4C8F092464365300A7BDE0 /* SynchronousDeprecatedTest.swift in Sources */, 7A6AB2C21E7F547E00A2F694 /* ToSucceedTest.swift in Sources */, A8A3B706207368EF00E25A08 /* ObjCSatisfyAllOfTest.m in Sources */, 1F4A56711A3B319F009E1637 /* ObjCBeCloseToTest.m in Sources */, @@ -1728,7 +1739,6 @@ DD9A9A9019CF43AD00706F49 /* BeIdenticalToObjectTest.swift in Sources */, 1F4BB8B61DACA0E30048464B /* ThrowAssertionTest.swift in Sources */, 1F0648D51963AAB2001F9C46 /* SynchronousTest.swift in Sources */, - 347155CB1C337C8900549F03 /* XCTestCaseProvider.swift in Sources */, 4793854E1BA0BB2500296F85 /* ObjCHaveCountTest.m in Sources */, 1F925F09195C18CF00ED456B /* BeGreaterThanTest.swift in Sources */, 7B5358BB1C3846C900A23FAA /* SatisfyAnyOfTest.swift in Sources */, @@ -1850,10 +1860,15 @@ MACOSX_DEPLOYMENT_TARGET = 10.10; METAL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "$(inherited)", + "-Xlinker", + "-no_application_extension", + ); SDKROOT = macosx; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -1906,11 +1921,16 @@ GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.10; METAL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ( + "$(inherited)", + "-Xlinker", + "-no_application_extension", + ); OTHER_SWIFT_FLAGS = "$(inherited) -suppress-warnings"; SDKROOT = macosx; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -1920,6 +1940,7 @@ 1F1A74401940169200FFFC47 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CLANG_ENABLE_MODULES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -1945,8 +1966,6 @@ "-weak_framework", XCTest, "-weak-lswiftXCTest", - "-Xlinker", - "-no_application_extension", ); PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_MODULE_NAME = Nimble; @@ -1961,6 +1980,7 @@ 1F1A74411940169200FFFC47 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CLANG_ENABLE_MODULES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -1985,8 +2005,6 @@ "-weak_framework", XCTest, "-weak-lswiftXCTest", - "-Xlinker", - "-no_application_extension", ); PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_MODULE_NAME = Nimble; @@ -2045,6 +2063,7 @@ 1F5DF1661BDCA0CE00C3A531 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2070,8 +2089,6 @@ "-weak_framework", XCTest, "-weak-lswiftXCTest", - "-Xlinker", - "-no_application_extension", ); PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_MODULE_NAME = Nimble; @@ -2086,6 +2103,7 @@ 1F5DF1671BDCA0CE00C3A531 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; @@ -2111,8 +2129,6 @@ "-weak_framework", XCTest, "-weak-lswiftXCTest", - "-Xlinker", - "-no_application_extension", ); PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_MODULE_NAME = Nimble; @@ -2172,6 +2188,7 @@ 1F925EC1195C0D6300ED456B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2198,8 +2215,6 @@ "-weak_framework", XCTest, "-weak-lswiftXCTest", - "-Xlinker", - "-no_application_extension", ); PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_MODULE_NAME = Nimble; @@ -2213,6 +2228,7 @@ 1F925EC2195C0D6300ED456B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; COMBINE_HIDPI_IMAGES = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; @@ -2239,8 +2255,6 @@ "-weak_framework", XCTest, "-weak-lswiftXCTest", - "-Xlinker", - "-no_application_extension", ); PRODUCT_BUNDLE_IDENTIFIER = "net.jeffhui.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_MODULE_NAME = Nimble; diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme index f9a7a228a..2175cc3cd 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme @@ -29,7 +29,8 @@ shouldUseLaunchSchemeArgsEnv = "YES"> + skipped = "NO" + parallelizable = "YES"> - - - - + skipped = "NO" + parallelizable = "YES"> - - - - + + + + + skipped = "NO" + parallelizable = "YES"> - - - - - - - - NMBObjCMatcher { - return NMBObjCMatcher { actualBlock, failureMessage, location in - let block = ({ actualBlock() as NSObject? }) - let expr = Expression(expression: block, location: location) - return beNil().matches(expr, failureMessage: failureMessage) +extension NMBPredicate { + @objc public class func beNilMatcher() -> NMBPredicate { + return NMBPredicate { actualExpression in + return try beNil().satisfies(actualExpression).toObjectiveC() } } } @@ -1528,7 +1525,7 @@ The above allows you to use the matcher from Objective-C: ```objc // Objective-C -expect(actual).to([NMBObjCMatcher beNilMatcher]()); +expect(actual).to([NMBPredicate beNilMatcher]()); ``` To make the syntax easier to use, define a C function that calls the @@ -1537,8 +1534,8 @@ class method: ```objc // Objective-C -FOUNDATION_EXPORT id beNil() { - return [NMBObjCMatcher beNilMatcher]; +FOUNDATION_EXPORT NMBPredicate *beNil() { + return [NMBPredicate beNilMatcher]; } ``` @@ -1560,29 +1557,25 @@ expect(nil).to(equal(nil)); // fails expect(nil).to(beNil()); // passes ``` -If your matcher does not want to match with nil, you use `NonNilMatcherFunc` -and the `canMatchNil` constructor on `NMBObjCMatcher`. Using both types will -automatically generate expected value failure messages when they're nil. +If your matcher does not want to match with nil, you use `Predicate.define` or `Predicate.simple`. +Using those factory methods will automatically generate expected value failure messages when they're nil. ```swift +public func beginWith(_ startingElement: S.Element) -> Predicate where S.Element: Equatable { + return Predicate.simple("begin with <\(startingElement)>") { actualExpression in + guard let actualValue = try actualExpression.evaluate() else { return .fail } -public func beginWith(startingElement: T) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "begin with <\(startingElement)>" - if let actualValue = actualExpression.evaluate() { - var actualGenerator = actualValue.makeIterator() - return actualGenerator.next() == startingElement - } - return false + var actualGenerator = actualValue.makeIterator() + return PredicateStatus(bool: actualGenerator.next() == startingElement) } } -extension NMBObjCMatcher { - public class func beginWithMatcher(expected: AnyObject) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = actualExpression.evaluate() +extension NMBPredicate { + @objc public class func beginWithMatcher(_ expected: Any) -> NMBPredicate { + return NMBPredicate { actualExpression in + let actual = try actualExpression.evaluate() let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return beginWith(expected).matches(expr, failureMessage: failureMessage) + return try beginWith(expected).satisfies(expr).toObjectiveC() } } } @@ -1607,7 +1600,7 @@ converts those types to the newer `Predicate`. ```swift // Swift -public func beginWith(startingElement: T) -> Predicate { +public func beginWith(_ startingElement: S.Element) -> Predicate where S.Element: Equatable { return NonNilMatcherFunc { actualExpression, failureMessage in failureMessage.postfixMessage = "begin with <\(startingElement)>" if let actualValue = actualExpression.evaluate() { @@ -1630,7 +1623,7 @@ matcher types. ```swift // Swift -public func beginWith(startingElement: T) -> Predicate { +public func beginWith(_ startingElement: S.Element) -> Predicate where S.Element: Equatable { return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "begin with <\(startingElement)>" if let actualValue = actualExpression.evaluate() { @@ -1707,7 +1700,7 @@ source 'https://github.com/CocoaPods/Specs.git' target 'YOUR_APP_NAME_HERE_Tests', :exclusive => true do use_frameworks! - pod 'Nimble', '~> 6.0.0' + pod 'Nimble' end ``` diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift index abaf5328f..a28bf2be5 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AdapterProtocols.swift @@ -1,5 +1,3 @@ -import Foundation - /// Protocol for the assertion handler that Nimble uses for all expectations. public protocol AssertionHandler { func assert(_ assertion: Bool, message: FailureMessage, location: SourceLocation) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift index 0f5df599e..ac7546726 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift @@ -1,5 +1,3 @@ -import Foundation - /// A data structure that stores information about an assertion when /// AssertionRecorder is set as the Nimble assertion handler. /// diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift index 5338a4656..bc367603a 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift @@ -1,6 +1,7 @@ -import Foundation - #if canImport(Darwin) && !SWIFT_PACKAGE +import class Foundation.NSObject +import typealias Foundation.TimeInterval +import enum Dispatch.DispatchTimeInterval private func from(objcPredicate: NMBPredicate) -> Predicate { return Predicate { actualExpression in @@ -10,24 +11,27 @@ private func from(objcPredicate: NMBPredicate) -> Predicate { } } -internal struct ObjCMatcherWrapper: Matcher { - let matcher: NMBMatcher - - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - return matcher.matches( - // swiftlint:disable:next force_try - ({ try! actualExpression.evaluate() }), - failureMessage: failureMessage, - location: actualExpression.location) - } - - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - return matcher.doesNotMatch( - // swiftlint:disable:next force_try - ({ try! actualExpression.evaluate() }), - failureMessage: failureMessage, - location: actualExpression.location) +private func from(matcher: NMBMatcher, style: ExpectationStyle) -> Predicate { + // Almost same as `Matcher.toClosure` + let closure: (Expression, FailureMessage) throws -> Bool = { expr, msg in + switch style { + case .toMatch: + return matcher.matches( + // swiftlint:disable:next force_try + ({ try! expr.evaluate() }), + failureMessage: msg, + location: expr.location + ) + case .toNotMatch: + return !matcher.doesNotMatch( + // swiftlint:disable:next force_try + ({ try! expr.evaluate() }), + failureMessage: msg, + location: expr.location + ) + } } + return Predicate._fromDeprecatedClosure(closure) } // Equivalent to Expectation, but for Nimble's Objective-C interface @@ -37,7 +41,7 @@ public class NMBExpectation: NSObject { internal var _negative: Bool internal let _file: FileString internal let _line: UInt - internal var _timeout: TimeInterval = 1.0 + internal var _timeout: DispatchTimeInterval = .seconds(1) // swiftlint:enable identifier_name @objc public init(actualBlock: @escaping () -> NSObject?, negative: Bool, file: FileString, line: UInt) { @@ -54,54 +58,58 @@ public class NMBExpectation: NSObject { } @objc public var withTimeout: (TimeInterval) -> NMBExpectation { - return { timeout in self._timeout = timeout + return { timeout in self._timeout = timeout.dispatchInterval return self } } - @objc public var to: (NMBMatcher) -> Void { + @objc public var to: (NMBMatcher) -> NMBExpectation { return { matcher in if let pred = matcher as? NMBPredicate { self.expectValue.to(from(objcPredicate: pred)) } else { - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher)) + self.expectValue.to(from(matcher: matcher, style: .toMatch)) } + return self } } - @objc public var toWithDescription: (NMBMatcher, String) -> Void { + @objc public var toWithDescription: (NMBMatcher, String) -> NMBExpectation { return { matcher, description in if let pred = matcher as? NMBPredicate { self.expectValue.to(from(objcPredicate: pred), description: description) } else { - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher), description: description) + self.expectValue.to(from(matcher: matcher, style: .toMatch), description: description) } + return self } } - @objc public var toNot: (NMBMatcher) -> Void { + @objc public var toNot: (NMBMatcher) -> NMBExpectation { return { matcher in if let pred = matcher as? NMBPredicate { self.expectValue.toNot(from(objcPredicate: pred)) } else { - self.expectValue.toNot(ObjCMatcherWrapper(matcher: matcher)) + self.expectValue.toNot(from(matcher: matcher, style: .toNotMatch)) } + return self } } - @objc public var toNotWithDescription: (NMBMatcher, String) -> Void { + @objc public var toNotWithDescription: (NMBMatcher, String) -> NMBExpectation { return { matcher, description in if let pred = matcher as? NMBPredicate { self.expectValue.toNot(from(objcPredicate: pred), description: description) } else { - self.expectValue.toNot(ObjCMatcherWrapper(matcher: matcher), description: description) + self.expectValue.toNot(from(matcher: matcher, style: .toNotMatch), description: description) } + return self } } - @objc public var notTo: (NMBMatcher) -> Void { return toNot } + @objc public var notTo: (NMBMatcher) -> NMBExpectation { return toNot } - @objc public var notToWithDescription: (NMBMatcher, String) -> Void { return toNotWithDescription } + @objc public var notToWithDescription: (NMBMatcher, String) -> NMBExpectation { return toNotWithDescription } @objc public var toEventually: (NMBMatcher) -> Void { return { matcher in @@ -113,7 +121,7 @@ public class NMBExpectation: NSObject { ) } else { self.expectValue.toEventually( - ObjCMatcherWrapper(matcher: matcher), + from(matcher: matcher, style: .toMatch), timeout: self._timeout, description: nil ) @@ -131,7 +139,7 @@ public class NMBExpectation: NSObject { ) } else { self.expectValue.toEventually( - ObjCMatcherWrapper(matcher: matcher), + from(matcher: matcher, style: .toMatch), timeout: self._timeout, description: description ) @@ -149,7 +157,7 @@ public class NMBExpectation: NSObject { ) } else { self.expectValue.toEventuallyNot( - ObjCMatcherWrapper(matcher: matcher), + from(matcher: matcher, style: .toNotMatch), timeout: self._timeout, description: nil ) @@ -167,7 +175,7 @@ public class NMBExpectation: NSObject { ) } else { self.expectValue.toEventuallyNot( - ObjCMatcherWrapper(matcher: matcher), + from(matcher: matcher, style: .toNotMatch), timeout: self._timeout, description: description ) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift index a91efe338..8b8258d34 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift @@ -1,12 +1,12 @@ -import Foundation - #if canImport(Darwin) +import class Foundation.NSObject // swiftlint:disable line_length public typealias MatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage) throws -> Bool public typealias FullMatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) throws -> Bool // swiftlint:enable line_length +@available(*, deprecated, message: "Use NMBPredicate instead") public class NMBObjCMatcher: NSObject, NMBMatcher { // swiftlint:disable identifier_name let _match: MatcherBlock diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift index 1b2e8c0b2..06bde8a90 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift @@ -1,5 +1,6 @@ import Dispatch -import Foundation +import class Foundation.NSObject +import class Foundation.Thread /// "Global" state of Nimble is stored here. Only DSL functions should access / be aware of this /// class' existence diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift index cd3b47608..5f2962879 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift @@ -45,7 +45,7 @@ class NimbleXCTestUnavailableHandler: AssertionHandler { private var stashed_swift_reportFatalErrorsToDebugger: Bool = false @objc func testCaseWillStart(_ testCase: XCTestCase) { - #if swift(>=3.2) && !os(tvOS) + #if os(macOS) || os(iOS) stashed_swift_reportFatalErrorsToDebugger = _swift_reportFatalErrorsToDebugger _swift_reportFatalErrorsToDebugger = false #endif @@ -56,7 +56,7 @@ class NimbleXCTestUnavailableHandler: AssertionHandler { @objc func testCaseDidFinish(_ testCase: XCTestCase) { currentTestCase = nil - #if swift(>=3.2) && !os(tvOS) + #if os(macOS) || os(iOS) _swift_reportFatalErrorsToDebugger = stashed_swift_reportFatalErrorsToDebugger #endif } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift index d0871fc70..8cb8e16fa 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Adapters/NonObjectiveC/ExceptionCapture.swift @@ -1,6 +1,6 @@ -import Foundation - -#if !canImport(Darwin) +#if canImport(Darwin) +import class Foundation.NSException +#else // swift-corelibs-foundation doesn't provide NSException at all, so provide a dummy class NSException {} #endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift index c049417ad..4be4524ef 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL+Wait.swift @@ -21,13 +21,13 @@ internal class NMBWait: NSObject { file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { - return throwableUntil(timeout: timeout, file: file, line: line) { done in - action(done) - } + // Convert TimeInterval to DispatchTimeInterval + until(timeout: timeout.dispatchInterval, file: file, line: line, action: action) } -#else +#endif + internal class func until( - timeout: TimeInterval, + timeout: DispatchTimeInterval, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { @@ -35,16 +35,15 @@ internal class NMBWait: NSObject { action(done) } } -#endif // Using a throwable closure makes this method not objc compatible. internal class func throwableUntil( - timeout: TimeInterval, + timeout: DispatchTimeInterval, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) throws -> Void) { let awaiter = NimbleEnvironment.activeInstance.awaiter - let leeway = timeout / 2.0 + let leeway = timeout.divided // swiftlint:disable:next line_length let result = awaiter.performBlock(file: file, line: line) { (done: @escaping (ErrorResult) -> Void) throws -> Void in DispatchQueue.main.async { @@ -72,8 +71,7 @@ internal class NMBWait: NSObject { fail(blockedRunLoopErrorMessageFor("-waitUntil()", leeway: leeway), file: file, line: line) case .timedOut: - let pluralize = (timeout == 1 ? "" : "s") - fail("Waited more than \(timeout) second\(pluralize)", file: file, line: line) + fail("Waited more than \(timeout.description)", file: file, line: line) case let .raisedException(exception): fail("Unexpected exception raised: \(exception)") case let .errorThrown(error): @@ -93,21 +91,21 @@ internal class NMBWait: NSObject { _ file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { - until(timeout: 1, file: file, line: line, action: action) + until(timeout: .seconds(1), file: file, line: line, action: action) } #else internal class func until( _ file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { - until(timeout: 1, file: file, line: line, action: action) + until(timeout: .seconds(1), file: file, line: line, action: action) } #endif } -internal func blockedRunLoopErrorMessageFor(_ fnName: String, leeway: TimeInterval) -> String { +internal func blockedRunLoopErrorMessageFor(_ fnName: String, leeway: DispatchTimeInterval) -> String { // swiftlint:disable:next line_length - return "\(fnName) timed out but was unable to run the timeout handler because the main thread is unresponsive (\(leeway) seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." + return "\(fnName) timed out but was unable to run the timeout handler because the main thread is unresponsive (\(leeway.description) is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." } /// Wait asynchronously until the done closure is called or the timeout has been reached. @@ -117,6 +115,6 @@ internal func blockedRunLoopErrorMessageFor(_ fnName: String, leeway: TimeInterv /// /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. -public func waitUntil(timeout: TimeInterval = AsyncDefaults.Timeout, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { +public func waitUntil(timeout: DispatchTimeInterval = AsyncDefaults.timeout, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { NMBWait.until(timeout: timeout, file: file, line: line, action: action) } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift index d6dc9cc46..25e97db21 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/DSL.swift @@ -1,5 +1,3 @@ -import Foundation - /// Make an expectation on a given actual value. The value given is lazily evaluated. public func expect(_ expression: @autoclosure @escaping () throws -> T?, file: FileString = #file, line: UInt = #line) -> Expectation { return Expectation( @@ -36,24 +34,16 @@ public func fail(_ file: FileString = #file, line: UInt = #line) { /// Like Swift's precondition(), but raises NSExceptions instead of sigaborts internal func nimblePrecondition( - _ expr: @autoclosure() -> Bool, - _ name: @autoclosure() -> String, - _ message: @autoclosure() -> String, + _ expr: @autoclosure () -> Bool, + _ name: @autoclosure () -> String, + _ message: @autoclosure () -> String, file: StaticString = #file, - line: UInt = #line) { - let result = expr() - if !result { -#if canImport(Darwin) - let exception = NSException( - name: NSExceptionName(name()), - reason: message(), - userInfo: nil - ) - exception.raise() -#else - preconditionFailure("\(name()) - \(message())", file: file, line: line) -#endif - } + line: UInt = #line +) { + let result = expr() + if !result { + _nimblePrecondition(name(), message(), file, line) + } } internal func internalError(_ msg: String, file: FileString = #file, line: UInt = #line) -> Never { @@ -66,3 +56,31 @@ internal func internalError(_ msg: String, file: FileString = #file, line: UInt ) // swiftlint:enable line_length } + +#if canImport(Darwin) +import class Foundation.NSException +import struct Foundation.NSExceptionName + +private func _nimblePrecondition( + _ name: String, + _ message: String, + _ file: StaticString, + _ line: UInt +) { + let exception = NSException( + name: NSExceptionName(name), + reason: message, + userInfo: nil + ) + exception.raise() +} +#else +private func _nimblePrecondition( + _ name: String, + _ message: String, + _ file: StaticString, + _ line: UInt +) { + preconditionFailure("\(name) - \(message)", file: file, line: line) +} +#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift index 41625a123..9906c70f2 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expectation.swift @@ -1,6 +1,4 @@ -import Foundation - -// Deprecated +@available(*, deprecated) internal func expressionDoesNotMatch(_ expression: Expression, matcher: U, toNot: String, description: String?) -> (Bool, FailureMessage) where U: Matcher, U.ValueType == T { let msg = FailureMessage() @@ -69,7 +67,9 @@ public struct Expectation { ////////////////// OLD API ///////////////////// /// DEPRECATED: Tests the actual value using a matcher to match. - public func to(_ matcher: U, description: String? = nil) + @available(*, deprecated, message: "Use Predicate instead") + @discardableResult + public func to(_ matcher: U, description: String? = nil) -> Self where U: Matcher, U.ValueType == T { let (pass, msg) = execute( expression, @@ -80,43 +80,54 @@ public struct Expectation { captureExceptions: false ) verify(pass, msg) + return self } /// DEPRECATED: Tests the actual value using a matcher to not match. - public func toNot(_ matcher: U, description: String? = nil) + @available(*, deprecated, message: "Use Predicate instead") + @discardableResult + public func toNot(_ matcher: U, description: String? = nil) -> Self where U: Matcher, U.ValueType == T { // swiftlint:disable:next line_length let (pass, msg) = expressionDoesNotMatch(expression, matcher: matcher, toNot: "to not", description: description) verify(pass, msg) + return self } /// DEPRECATED: Tests the actual value using a matcher to not match. /// /// Alias to toNot(). - public func notTo(_ matcher: U, description: String? = nil) + @available(*, deprecated, message: "Use Predicate instead") + @discardableResult + public func notTo(_ matcher: U, description: String? = nil) -> Self where U: Matcher, U.ValueType == T { - toNot(matcher, description: description) + return toNot(matcher, description: description) } ////////////////// NEW API ///////////////////// /// Tests the actual value using a matcher to match. - public func to(_ predicate: Predicate, description: String? = nil) { + @discardableResult + public func to(_ predicate: Predicate, description: String? = nil) -> Self { let (pass, msg) = execute(expression, .toMatch, predicate, to: "to", description: description) verify(pass, msg) + return self } /// Tests the actual value using a matcher to not match. - public func toNot(_ predicate: Predicate, description: String? = nil) { + @discardableResult + public func toNot(_ predicate: Predicate, description: String? = nil) -> Self { let (pass, msg) = execute(expression, .toNotMatch, predicate, to: "to not", description: description) verify(pass, msg) + return self } /// Tests the actual value using a matcher to not match. /// /// Alias to toNot(). - public func notTo(_ predicate: Predicate, description: String? = nil) { - toNot(predicate, description: description) + @discardableResult + public func notTo(_ predicate: Predicate, description: String? = nil) -> Self { + return toNot(predicate, description: description) } // see: diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/ExpectationMessage.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/ExpectationMessage.swift index b0cbcc324..5f3f08e8f 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/ExpectationMessage.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/ExpectationMessage.swift @@ -1,11 +1,9 @@ -import Foundation - public indirect enum ExpectationMessage { // --- Primary Expectations --- /// includes actual value in output ("expected to , got ") case expectedActualValueTo(/* message: */ String) /// uses a custom actual value string in output ("expected to , got ") - case expectedCustomValueTo(/* message: */ String, /* actual: */ String) + case expectedCustomValueTo(/* message: */ String, actual: String) /// excludes actual value in output ("expected to ") case expectedTo(/* message: */ String) /// allows any free-form message ("") @@ -118,7 +116,7 @@ public indirect enum ExpectationMessage { case let .expectedActualValueTo(msg): return .expectedActualValueTo(message + msg) case let .expectedCustomValueTo(msg, actual): - return .expectedCustomValueTo(message + msg, actual) + return .expectedCustomValueTo(message + msg, actual: actual) default: return msg.visitLeafs(walk) } @@ -193,7 +191,7 @@ extension FailureMessage { var message: ExpectationMessage = .fail(userDescription ?? "") if actualValue != "" && actualValue != nil { - message = .expectedCustomValueTo(postfixMessage, actualValue ?? "") + message = .expectedCustomValueTo(postfixMessage, actual: actualValue ?? "") } else if postfixMessage != defaultMessage.postfixMessage { if actualValue == nil { message = .expectedTo(postfixMessage) @@ -212,6 +210,7 @@ extension FailureMessage { } #if canImport(Darwin) +import class Foundation.NSObject public class NMBExpectationMessage: NSObject { private let msg: ExpectationMessage @@ -228,7 +227,7 @@ public class NMBExpectationMessage: NSObject { } public init(expectedActualValueTo message: String, customActualValue actual: String) { - self.msg = .expectedCustomValueTo(message, actual) + self.msg = .expectedCustomValueTo(message, actual: actual) } public init(fail message: String) { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift index dcc42e4e3..40dde89b4 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Expression.swift @@ -1,5 +1,3 @@ -import Foundation - // Memoizes the given closure, only calling the passed // closure once; even if repeat calls to the returned closure internal func memoizedClosure(_ closure: @escaping () throws -> T) -> (Bool) throws -> T { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift index dbbccb9c5..f067aff3e 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/AllPass.swift @@ -1,70 +1,71 @@ -import Foundation - -public func allPass - (_ passFunc: @escaping (T?) throws -> Bool) -> Predicate - where U: Sequence, T == U.Iterator.Element { - let matcher = Predicate.simpleNilable("pass a condition") { actualExpression in - return PredicateStatus(bool: try passFunc(try actualExpression.evaluate())) - } - return createPredicate(matcher) +public func allPass( + _ passFunc: @escaping (S.Element?) throws -> Bool +) -> Predicate { + let matcher = Predicate.simpleNilable("pass a condition") { actualExpression in + return PredicateStatus(bool: try passFunc(try actualExpression.evaluate())) + } + return createPredicate(matcher) } -public func allPass - (_ passName: String, _ passFunc: @escaping (T?) throws -> Bool) -> Predicate - where U: Sequence, T == U.Iterator.Element { - let matcher = Predicate.simpleNilable(passName) { actualExpression in - return PredicateStatus(bool: try passFunc(try actualExpression.evaluate())) - } - return createPredicate(matcher) +public func allPass( + _ passName: String, + _ passFunc: @escaping (S.Element?) throws -> Bool +) -> Predicate { + let matcher = Predicate.simpleNilable(passName) { actualExpression in + return PredicateStatus(bool: try passFunc(try actualExpression.evaluate())) + } + return createPredicate(matcher) } -public func allPass(_ elementMatcher: M) -> Predicate - where S: Sequence, M: Matcher, S.Iterator.Element == M.ValueType { - return createPredicate(elementMatcher.predicate) +@available(*, deprecated, message: "Use Predicate instead") +public func allPass(_ elementMatcher: M) -> Predicate where S.Element == M.ValueType { + return createPredicate(elementMatcher.predicate) } -public func allPass(_ elementPredicate: Predicate) -> Predicate - where S: Sequence { - return createPredicate(elementPredicate) +public func allPass(_ elementPredicate: Predicate) -> Predicate { + return createPredicate(elementPredicate) } -private func createPredicate(_ elementMatcher: Predicate) -> Predicate - where S: Sequence { - return Predicate { actualExpression in - guard let actualValue = try actualExpression.evaluate() else { - return PredicateResult( - status: .fail, - message: .appends(.expectedTo("all pass"), " (use beNil() to match nils)") - ) - } +private func createPredicate(_ elementMatcher: Predicate) -> Predicate { + return Predicate { actualExpression in + guard let actualValue = try actualExpression.evaluate() else { + return PredicateResult( + status: .fail, + message: .appends(.expectedTo("all pass"), " (use beNil() to match nils)") + ) + } - var failure: ExpectationMessage = .expectedTo("all pass") - for currentElement in actualValue { - let exp = Expression( - expression: {currentElement}, location: actualExpression.location) - let predicateResult = try elementMatcher.satisfies(exp) - if predicateResult.status == .matches { - failure = predicateResult.message.prepended(expectation: "all ") - } else { - failure = predicateResult.message - .replacedExpectation({ .expectedTo($0.expectedMessage) }) - .wrappedExpectation( - before: "all ", - after: ", but failed first at element <\(stringify(currentElement))>" - + " in <\(stringify(actualValue))>" - ) - return PredicateResult(status: .doesNotMatch, message: failure) - } + var failure: ExpectationMessage = .expectedTo("all pass") + for currentElement in actualValue { + let exp = Expression( + expression: {currentElement}, location: actualExpression.location) + let predicateResult = try elementMatcher.satisfies(exp) + if predicateResult.status == .matches { + failure = predicateResult.message.prepended(expectation: "all ") + } else { + failure = predicateResult.message + .replacedExpectation({ .expectedTo($0.expectedMessage) }) + .wrappedExpectation( + before: "all ", + after: ", but failed first at element <\(stringify(currentElement))>" + + " in <\(stringify(actualValue))>" + ) + return PredicateResult(status: .doesNotMatch, message: failure) } - failure = failure.replacedExpectation({ expectation in - return .expectedTo(expectation.expectedMessage) - }) - return PredicateResult(status: .matches, message: failure) } + failure = failure.replacedExpectation({ expectation in + return .expectedTo(expectation.expectedMessage) + }) + return PredicateResult(status: .matches, message: failure) + } } #if canImport(Darwin) -extension NMBObjCMatcher { +import class Foundation.NSObject +import struct Foundation.NSFastEnumerationIterator +import protocol Foundation.NSFastEnumeration + +extension NMBPredicate { @objc public class func allPassMatcher(_ matcher: NMBMatcher) -> NMBPredicate { return NMBPredicate { actualExpression in let location = actualExpression.location diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Async.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Async.swift index 5022fe211..dc5e5eddd 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Async.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Async.swift @@ -1,13 +1,21 @@ import Foundation +import Dispatch /// If you are running on a slower machine, it could be useful to increase the default timeout value /// or slow down poll interval. Default timeout interval is 1, and poll interval is 0.01. public struct AsyncDefaults { + public static var timeout: DispatchTimeInterval = .seconds(1) + public static var pollInterval: DispatchTimeInterval = .milliseconds(10) +} + +extension AsyncDefaults { + @available(*, unavailable, renamed: "timeout") public static var Timeout: TimeInterval = 1 + @available(*, unavailable, renamed: "pollInterval") public static var PollInterval: TimeInterval = 0.01 } -private func async(style: ExpectationStyle, predicate: Predicate, timeout: TimeInterval, poll: TimeInterval, fnName: String) -> Predicate { +private func async(style: ExpectationStyle, predicate: Predicate, timeout: DispatchTimeInterval, poll: DispatchTimeInterval, fnName: String) -> Predicate { return Predicate { actualExpression in let uncachedExpression = actualExpression.withoutCaching() let fnName = "expect(...).\(fnName)(...)" @@ -55,7 +63,7 @@ extension Expectation { /// @discussion /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventually(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { + public func toEventually(_ predicate: Predicate, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil) { nimblePrecondition(expression.isClosure, "NimbleInternalError", toEventuallyRequiresClosureError.stringValue) let (pass, msg) = execute( @@ -75,7 +83,7 @@ extension Expectation { /// @discussion /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventuallyNot(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { + public func toEventuallyNot(_ predicate: Predicate, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil) { nimblePrecondition(expression.isClosure, "NimbleInternalError", toEventuallyRequiresClosureError.stringValue) let (pass, msg) = execute( @@ -103,12 +111,12 @@ extension Expectation { /// @discussion /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toNotEventually(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { + public func toNotEventually(_ predicate: Predicate, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil) { return toEventuallyNot(predicate, timeout: timeout, pollInterval: pollInterval, description: description) } } -// Deprecated +@available(*, deprecated, message: "Use Predicate instead") extension Expectation { /// Tests the actual value using a matcher to match by checking continuously /// at each pollInterval until the timeout is reached. @@ -116,7 +124,7 @@ extension Expectation { /// @discussion /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) + public func toEventually(_ matcher: U, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil) where U: Matcher, U.ValueType == T { if expression.isClosure { let (pass, msg) = execute( @@ -145,7 +153,7 @@ extension Expectation { /// @discussion /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toEventuallyNot(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) + public func toEventuallyNot(_ matcher: U, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil) where U: Matcher, U.ValueType == T { if expression.isClosure { let (pass, msg) = expressionDoesNotMatch( @@ -174,7 +182,7 @@ extension Expectation { /// @discussion /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. - public func toNotEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) + public func toNotEventually(_ matcher: U, timeout: DispatchTimeInterval = AsyncDefaults.timeout, pollInterval: DispatchTimeInterval = AsyncDefaults.pollInterval, description: String? = nil) where U: Matcher, U.ValueType == T { return toEventuallyNot(matcher, timeout: timeout, pollInterval: pollInterval, description: description) } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift index 3a68b09c0..f01ca7707 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift @@ -1,5 +1,3 @@ -import Foundation - private func matcherMessage(forType expectedType: T.Type) -> String { return "be a kind of \(String(describing: expectedType))" } @@ -14,12 +12,12 @@ public func beAKindOf(_ expectedType: T.Type) -> Predicate { let instance = try actualExpression.evaluate() guard let validInstance = instance else { - message = .expectedCustomValueTo(matcherMessage(forType: expectedType), "") + message = .expectedCustomValueTo(matcherMessage(forType: expectedType), actual: "") return PredicateResult(status: .fail, message: message) } message = .expectedCustomValueTo( "be a kind of \(String(describing: expectedType))", - "<\(String(describing: type(of: validInstance))) instance>" + actual: "<\(String(describing: type(of: validInstance))) instance>" ) return PredicateResult( @@ -30,6 +28,7 @@ public func beAKindOf(_ expectedType: T.Type) -> Predicate { } #if canImport(Darwin) +import class Foundation.NSObject /// A Nimble matcher that succeeds when the actual value is an instance of the given class. /// @see beAnInstanceOf if you want to match against the exact class @@ -43,13 +42,13 @@ public func beAKindOf(_ expectedClass: AnyClass) -> Predicate { status = PredicateStatus(bool: instance != nil && instance!.isKind(of: expectedClass)) message = .expectedCustomValueTo( matcherMessage(forClass: expectedClass), - "<\(String(describing: type(of: validInstance))) instance>" + actual: "<\(String(describing: type(of: validInstance))) instance>" ) } else { status = .fail message = .expectedCustomValueTo( matcherMessage(forClass: expectedClass), - "" + actual: "" ) } @@ -57,8 +56,8 @@ public func beAKindOf(_ expectedClass: AnyClass) -> Predicate { } } -extension NMBObjCMatcher { - @objc public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBMatcher { +extension NMBPredicate { + @objc public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBPredicate { return NMBPredicate { actualExpression in return try beAKindOf(expected).satisfies(actualExpression).toObjectiveC() } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift index 3cef3a7be..47ea663a1 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift @@ -16,7 +16,7 @@ public func beAnInstanceOf(_ expectedType: T.Type) -> Predicate { return PredicateResult( status: PredicateStatus(bool: type(of: validInstance) == expectedType), - message: .expectedCustomValueTo(errorMessage, actualString) + message: .expectedCustomValueTo(errorMessage, actual: actualString) ) } } @@ -40,14 +40,14 @@ public func beAnInstanceOf(_ expectedClass: AnyClass) -> Predicate { #endif return PredicateResult( status: PredicateStatus(bool: matches), - message: .expectedCustomValueTo(errorMessage, actualString) + message: .expectedCustomValueTo(errorMessage, actual: actualString) ) } } #if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBMatcher { +extension NMBPredicate { + @objc public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBPredicate { return NMBPredicate { actualExpression in return try beAnInstanceOf(expected).satisfies(actualExpression).toObjectiveC() } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift index 4396180a4..c05f967b8 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift @@ -11,7 +11,7 @@ internal func isCloseTo(_ actualValue: NMBDoubleConvertible?, return PredicateResult( bool: actualValue != nil && abs(actualValue!.doubleValue - expectedValue.doubleValue) < delta, - message: .expectedCustomValueTo(errorMessage, "<\(stringify(actualValue))>") + message: .expectedCustomValueTo(errorMessage, actual: "<\(stringify(actualValue))>") ) } @@ -36,60 +36,31 @@ public func beCloseTo(_ expectedValue: NMBDoubleConvertible, within delta: Doubl } #if canImport(Darwin) -public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { - // swiftlint:disable identifier_name - var _expected: NSNumber - var _delta: CDouble - // swiftlint:enable identifier_name - init(expected: NSNumber, within: CDouble) { - _expected = expected - _delta = within - } +public class NMBObjCBeCloseToPredicate: NMBPredicate { + private let _expected: NSNumber - @objc public func matches(_ actualExpression: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let actualBlock: () -> NMBDoubleConvertible? = ({ - return actualExpression() as? NMBDoubleConvertible - }) - let expr = Expression(expression: actualBlock, location: location) - let predicate = beCloseTo(self._expected, within: self._delta) - - do { - let result = try predicate.satisfies(expr) - result.message.update(failureMessage: failureMessage) - return result.toBoolean(expectation: .toMatch) - } catch let error { - failureMessage.stringValue = "unexpected error thrown: <\(error)>" - return false - } - } + fileprivate init(expected: NSNumber, within: CDouble) { + _expected = expected - @objc public func doesNotMatch(_ actualExpression: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let actualBlock: () -> NMBDoubleConvertible? = ({ - return actualExpression() as? NMBDoubleConvertible - }) - let expr = Expression(expression: actualBlock, location: location) - let predicate = beCloseTo(self._expected, within: self._delta) - - do { - let result = try predicate.satisfies(expr) - result.message.update(failureMessage: failureMessage) - return result.toBoolean(expectation: .toNotMatch) - } catch let error { - failureMessage.stringValue = "unexpected error thrown: <\(error)>" - return false + let predicate = beCloseTo(expected, within: within) + let predicateBlock: PredicateBlock = { actualExpression in + let expr = actualExpression.cast { $0 as? NMBDoubleConvertible } + return try predicate.satisfies(expr).toObjectiveC() } + super.init(predicate: predicateBlock) } - @objc public var within: (CDouble) -> NMBObjCBeCloseToMatcher { + @objc public var within: (CDouble) -> NMBObjCBeCloseToPredicate { + let expected = _expected return { delta in - return NMBObjCBeCloseToMatcher(expected: self._expected, within: delta) + return NMBObjCBeCloseToPredicate(expected: expected, within: delta) } } } -extension NMBObjCMatcher { - @objc public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToMatcher { - return NMBObjCBeCloseToMatcher(expected: expected, within: within) +extension NMBPredicate { + @objc public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToPredicate { + return NMBObjCBeCloseToPredicate(expected: expected, within: within) } } #endif @@ -117,23 +88,27 @@ public func beCloseTo(_ expectedValues: [Double], within delta: Double = Default infix operator ≈ : ComparisonPrecedence -// swiftlint:disable:next identifier_name -public func ≈(lhs: Expectation<[Double]>, rhs: [Double]) { - lhs.to(beCloseTo(rhs)) +extension Expectation where T == [Double] { + // swiftlint:disable:next identifier_name + public static func ≈(lhs: Expectation, rhs: [Double]) { + lhs.to(beCloseTo(rhs)) + } } -// swiftlint:disable:next identifier_name -public func ≈(lhs: Expectation, rhs: NMBDoubleConvertible) { - lhs.to(beCloseTo(rhs)) -} +extension Expectation where T == NMBDoubleConvertible { + // swiftlint:disable:next identifier_name + public static func ≈(lhs: Expectation, rhs: NMBDoubleConvertible) { + lhs.to(beCloseTo(rhs)) + } -// swiftlint:disable:next identifier_name -public func ≈(lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { - lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) -} + // swiftlint:disable:next identifier_name + public static func ≈(lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { + lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) + } -public func == (lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { - lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) + public static func == (lhs: Expectation, rhs: (expected: NMBDoubleConvertible, delta: Double)) { + lhs.to(beCloseTo(rhs.expected, within: rhs.delta)) + } } // make this higher precedence than exponents so the Doubles either end aren't pulled in diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift index 860287f0b..7ff478630 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeEmpty.swift @@ -4,9 +4,8 @@ import Foundation /// means the are no items in that collection. For strings, it is an empty string. public func beEmpty() -> Predicate { return Predicate.simple("be empty") { actualExpression in - guard let actual = try actualExpression.evaluate() else { - return .fail - } + guard let actual = try actualExpression.evaluate() else { return .fail } + var generator = actual.makeIterator() return PredicateStatus(bool: generator.next() == nil) } @@ -16,9 +15,8 @@ public func beEmpty() -> Predicate { /// means the are no items in that collection. For strings, it is an empty string. public func beEmpty() -> Predicate { return Predicate.simple("be empty") { actualExpression in - guard let actual = try actualExpression.evaluate() else { - return .fail - } + guard let actual = try actualExpression.evaluate() else { return .fail } + return PredicateStatus(bool: actual.isEmpty) } } @@ -27,9 +25,8 @@ public func beEmpty() -> Predicate { /// means the are no items in that collection. For strings, it is an empty string. public func beEmpty() -> Predicate { return Predicate.simple("be empty") { actualExpression in - guard let actual = try actualExpression.evaluate() else { - return .fail - } + guard let actual = try actualExpression.evaluate() else { return .fail } + return PredicateStatus(bool: actual.isEmpty) } } @@ -83,7 +80,7 @@ public func beEmpty() -> Predicate { } #if canImport(Darwin) -extension NMBObjCMatcher { +extension NMBPredicate { @objc public class func beEmptyMatcher() -> NMBPredicate { return NMBPredicate { actualExpression in let location = actualExpression.location diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift index 782c771ce..a8d12125e 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift @@ -1,13 +1,10 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual value is greater than the expected value. public func beGreaterThan(_ expectedValue: T?) -> Predicate { let errorMessage = "be greater than <\(stringify(expectedValue))>" return Predicate.simple(errorMessage) { actualExpression in - if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return PredicateStatus(bool: actual > expected) - } - return .fail + guard let actual = try actualExpression.evaluate(), let expected = expectedValue else { return .fail } + + return PredicateStatus(bool: actual > expected) } } @@ -15,7 +12,9 @@ public func >(lhs: Expectation, rhs: T) { lhs.to(beGreaterThan(rhs)) } -#if canImport(Darwin) || !compiler(>=5.1) +#if canImport(Darwin) +import enum Foundation.ComparisonResult + /// A Nimble matcher that succeeds when the actual value is greater than the expected value. public func beGreaterThan(_ expectedValue: NMBComparable?) -> Predicate { let errorMessage = "be greater than <\(stringify(expectedValue))>" @@ -30,11 +29,9 @@ public func beGreaterThan(_ expectedValue: NMBComparable?) -> Predicate (lhs: Expectation, rhs: NMBComparable?) { lhs.to(beGreaterThan(rhs)) } -#endif -#if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBMatcher { +extension NMBPredicate { + @objc public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBPredicate { return NMBPredicate { actualExpression in let expr = actualExpression.cast { $0 as? NMBComparable } return try beGreaterThan(expected).satisfies(expr).toObjectiveC() diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift index c3fc52387..affa58cf8 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift @@ -1,15 +1,11 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual value is greater than /// or equal to the expected value. public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> Predicate { let message = "be greater than or equal to <\(stringify(expectedValue))>" return Predicate.simple(message) { actualExpression in - let actualValue = try actualExpression.evaluate() - if let actual = actualValue, let expected = expectedValue { - return PredicateStatus(bool: actual >= expected) - } - return .fail + guard let actual = try actualExpression.evaluate(), let expected = expectedValue else { return .fail } + + return PredicateStatus(bool: actual >= expected) } } @@ -17,7 +13,9 @@ public func >=(lhs: Expectation, rhs: T) { lhs.to(beGreaterThanOrEqualTo(rhs)) } -#if canImport(Darwin) || !compiler(>=5.1) +#if canImport(Darwin) +import enum Foundation.ComparisonResult + /// A Nimble matcher that succeeds when the actual value is greater than /// or equal to the expected value. public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> Predicate { @@ -32,11 +30,9 @@ public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> Pre public func >=(lhs: Expectation, rhs: T) { lhs.to(beGreaterThanOrEqualTo(rhs)) } -#endif -#if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBMatcher { +extension NMBPredicate { + @objc public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBPredicate { return NMBPredicate { actualExpression in let expr = actualExpression.cast { $0 as? NMBComparable } return try beGreaterThanOrEqualTo(expected).satisfies(expr).toObjectiveC() diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift index 7644b4c4c..85e14f95a 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift @@ -1,5 +1,3 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual value is the same instance /// as the expected instance. public func beIdenticalTo(_ expected: Any?) -> Predicate { @@ -11,17 +9,20 @@ public func beIdenticalTo(_ expected: Any?) -> Predicate { bool: bool, message: .expectedCustomValueTo( "be identical to \(identityAsString(expected))", - "\(identityAsString(actual))" + actual: "\(identityAsString(actual))" ) ) } } -public func === (lhs: Expectation, rhs: Any?) { - lhs.to(beIdenticalTo(rhs)) -} -public func !== (lhs: Expectation, rhs: Any?) { - lhs.toNot(beIdenticalTo(rhs)) +extension Expectation where T == Any { + public static func === (lhs: Expectation, rhs: Any?) { + lhs.to(beIdenticalTo(rhs)) + } + + public static func !== (lhs: Expectation, rhs: Any?) { + lhs.toNot(beIdenticalTo(rhs)) + } } /// A Nimble matcher that succeeds when the actual value is the same instance @@ -33,8 +34,10 @@ public func be(_ expected: Any?) -> Predicate { } #if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBMatcher { +import class Foundation.NSObject + +extension NMBPredicate { + @objc public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBPredicate { return NMBPredicate { actualExpression in let aExpr = actualExpression.cast { $0 as Any? } return try beIdenticalTo(expected).satisfies(aExpr).toObjectiveC() diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift index 12fc9c20f..256f3a625 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThan.swift @@ -1,13 +1,10 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual value is less than the expected value. public func beLessThan(_ expectedValue: T?) -> Predicate { let message = "be less than <\(stringify(expectedValue))>" return Predicate.simple(message) { actualExpression in - if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return PredicateStatus(bool: actual < expected) - } - return .fail + guard let actual = try actualExpression.evaluate(), let expected = expectedValue else { return .fail } + + return PredicateStatus(bool: actual < expected) } } @@ -15,7 +12,9 @@ public func <(lhs: Expectation, rhs: T) { lhs.to(beLessThan(rhs)) } -#if canImport(Darwin) || !compiler(>=5.1) +#if canImport(Darwin) +import enum Foundation.ComparisonResult + /// A Nimble matcher that succeeds when the actual value is less than the expected value. public func beLessThan(_ expectedValue: NMBComparable?) -> Predicate { let message = "be less than <\(stringify(expectedValue))>" @@ -29,11 +28,9 @@ public func beLessThan(_ expectedValue: NMBComparable?) -> Predicate, rhs: NMBComparable?) { lhs.to(beLessThan(rhs)) } -#endif -#if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBMatcher { +extension NMBPredicate { + @objc public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBPredicate { return NMBPredicate { actualExpression in let expr = actualExpression.cast { $0 as? NMBComparable } return try beLessThan(expected).satisfies(expr).toObjectiveC() diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift index bf6ba1640..6174be5af 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift @@ -1,13 +1,10 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual value is less than /// or equal to the expected value. public func beLessThanOrEqualTo(_ expectedValue: T?) -> Predicate { return Predicate.simple("be less than or equal to <\(stringify(expectedValue))>") { actualExpression in - if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return PredicateStatus(bool: actual <= expected) - } - return .fail + guard let actual = try actualExpression.evaluate(), let expected = expectedValue else { return .fail } + + return PredicateStatus(bool: actual <= expected) } } @@ -15,7 +12,9 @@ public func <=(lhs: Expectation, rhs: T) { lhs.to(beLessThanOrEqualTo(rhs)) } -#if canImport(Darwin) || !compiler(>=5.1) +#if canImport(Darwin) +import enum Foundation.ComparisonResult + /// A Nimble matcher that succeeds when the actual value is less than /// or equal to the expected value. public func beLessThanOrEqualTo(_ expectedValue: T?) -> Predicate { @@ -29,11 +28,9 @@ public func beLessThanOrEqualTo(_ expectedValue: T?) -> Predic public func <=(lhs: Expectation, rhs: T) { lhs.to(beLessThanOrEqualTo(rhs)) } -#endif -#if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBMatcher { +extension NMBPredicate { + @objc public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBPredicate { return NMBPredicate { actualExpression in let expr = actualExpression.cast { $0 as? NMBComparable } return try beLessThanOrEqualTo(expected).satisfies(expr).toObjectiveC() diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift index 788234b98..1676ba46b 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeLogical.swift @@ -119,29 +119,29 @@ public func beFalsy() -> Predicate NMBMatcher { +extension NMBPredicate { + @objc public class func beTruthyMatcher() -> NMBPredicate { return NMBPredicate { actualExpression in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } return try beTruthy().satisfies(expr).toObjectiveC() } } - @objc public class func beFalsyMatcher() -> NMBMatcher { + @objc public class func beFalsyMatcher() -> NMBPredicate { return NMBPredicate { actualExpression in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } return try beFalsy().satisfies(expr).toObjectiveC() } } - @objc public class func beTrueMatcher() -> NMBMatcher { + @objc public class func beTrueMatcher() -> NMBPredicate { return NMBPredicate { actualExpression in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } return try beTrue().satisfies(expr).toObjectiveC() } } - @objc public class func beFalseMatcher() -> NMBMatcher { + @objc public class func beFalseMatcher() -> NMBPredicate { return NMBPredicate { actualExpression in let expr = actualExpression.cast { value -> Bool? in guard let value = value else { return nil } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift index 0f21d4180..270bd3548 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeNil.swift @@ -1,5 +1,3 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual value is nil. public func beNil() -> Predicate { return Predicate.simpleNilable("be nil") { actualExpression in @@ -9,8 +7,10 @@ public func beNil() -> Predicate { } #if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func beNilMatcher() -> NMBMatcher { +import Foundation + +extension NMBPredicate { + @objc public class func beNilMatcher() -> NMBPredicate { return NMBPredicate { actualExpression in return try beNil().satisfies(actualExpression).toObjectiveC() } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift index 9a7eafda2..c4bbaf6bc 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeVoid.swift @@ -1,5 +1,3 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual value is Void. public func beVoid() -> Predicate<()> { return Predicate.simpleNilable("be void") { actualExpression in diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift index 3183eb954..1da781824 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWith.swift @@ -2,14 +2,12 @@ import Foundation /// A Nimble matcher that succeeds when the actual sequence's first element /// is equal to the expected value. -public func beginWith(_ startingElement: T) -> Predicate - where S.Iterator.Element == T { +public func beginWith(_ startingElement: S.Element) -> Predicate where S.Element: Equatable { return Predicate.simple("begin with <\(startingElement)>") { actualExpression in - if let actualValue = try actualExpression.evaluate() { - var actualGenerator = actualValue.makeIterator() - return PredicateStatus(bool: actualGenerator.next() == startingElement) - } - return .fail + guard let actualValue = try actualExpression.evaluate() else { return .fail } + + var actualGenerator = actualValue.makeIterator() + return PredicateStatus(bool: actualGenerator.next() == startingElement) } } @@ -34,16 +32,15 @@ public func beginWith(_ startingElement: Any) -> Predicate /// where the expected substring's location is zero. public func beginWith(_ startingSubstring: String) -> Predicate { return Predicate.simple("begin with <\(startingSubstring)>") { actualExpression in - if let actual = try actualExpression.evaluate() { - return PredicateStatus(bool: actual.hasPrefix(startingSubstring)) - } - return .fail + guard let actual = try actualExpression.evaluate() else { return .fail } + + return PredicateStatus(bool: actual.hasPrefix(startingSubstring)) } } #if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func beginWithMatcher(_ expected: Any) -> NMBMatcher { +extension NMBPredicate { + @objc public class func beginWithMatcher(_ expected: Any) -> NMBPredicate { return NMBPredicate { actualExpression in let actual = try actualExpression.evaluate() if actual is String { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWithPrefix.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWithPrefix.swift new file mode 100644 index 000000000..c3a79b18d --- /dev/null +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/BeginWithPrefix.swift @@ -0,0 +1,39 @@ +/// A Nimble matcher that succeeds when the exepected sequence is a prefix of the actual sequence. +/// +/// This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2854218-starts +public func beginWith(prefix expectedPrefix: Seq2?) + -> Predicate where Seq1.Element: Equatable, Seq1.Element == Seq2.Element { + return Predicate.define("begin with <\(stringify(expectedPrefix))>") { (actualExpression, msg) in + let actualPrefix = try actualExpression.evaluate() + switch (expectedPrefix, actualPrefix) { + case (nil, _?): + return PredicateResult(status: .fail, message: msg.appendedBeNilHint()) + case (nil, nil), (_, nil): + return PredicateResult(status: .fail, message: msg) + case (let expected?, let actual?): + let matches = actual.starts(with: expected) + return PredicateResult(bool: matches, message: msg) + } + } +} + +/// A Nimble matcher that succeeds when the expected sequence is the prefix of the actual sequence, using the given predicate as the equivalence test. +/// +/// This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2996828-starts +public func beginWith( + prefix expectedPrefix: Seq2?, + by areEquivalent: @escaping (Seq1.Element, Seq2.Element) -> Bool +) -> Predicate { + return Predicate.define("begin with <\(stringify(expectedPrefix))>") { (actualExpression, msg) in + let actualPrefix = try actualExpression.evaluate() + switch (expectedPrefix, actualPrefix) { + case (nil, _?): + return PredicateResult(status: .fail, message: msg.appendedBeNilHint()) + case (nil, nil), (_, nil): + return PredicateResult(status: .fail, message: msg) + case (let expected?, let actual?): + let matches = actual.starts(with: expected, by: areEquivalent) + return PredicateResult(bool: matches, message: msg) + } + } +} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift index 6974a4d4c..c7fc15b1c 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Contain.swift @@ -1,63 +1,56 @@ +#if canImport(Foundation) import Foundation +#endif /// A Nimble matcher that succeeds when the actual sequence contains the expected values. -public func contain(_ items: T...) -> Predicate - where S.Element == T { +public func contain(_ items: S.Element...) -> Predicate where S.Element: Equatable { return contain(items) } /// A Nimble matcher that succeeds when the actual sequence contains the expected values. -public func contain(_ items: [T]) -> Predicate - where S.Element == T { +public func contain(_ items: [S.Element]) -> Predicate where S.Element: Equatable { return Predicate.simple("contain <\(arrayAsString(items))>") { actualExpression in - if let actual = try actualExpression.evaluate() { - let matches = items.allSatisfy { - return actual.contains($0) - } - return PredicateStatus(bool: matches) + guard let actual = try actualExpression.evaluate() else { return .fail } + + let matches = items.allSatisfy { + return actual.contains($0) } - return .fail + return PredicateStatus(bool: matches) } } /// A Nimble matcher that succeeds when the actual set contains the expected values. -public func contain(_ items: T...) -> Predicate - where S.Element == T { - return contain(items) +public func contain(_ items: S.Element...) -> Predicate where S.Element: Equatable { + return contain(items) } /// A Nimble matcher that succeeds when the actual set contains the expected values. -public func contain(_ items: [T]) -> Predicate - where S.Element == T { - return Predicate.simple("contain <\(arrayAsString(items))>") { actualExpression in - if let actual = try actualExpression.evaluate() { - let matches = items.allSatisfy { - return actual.contains($0) - } - return PredicateStatus(bool: matches) - } - return .fail +public func contain(_ items: [S.Element]) -> Predicate where S.Element: Equatable { + return Predicate.simple("contain <\(arrayAsString(items))>") { actualExpression in + guard let actual = try actualExpression.evaluate() else { return .fail } + + let matches = items.allSatisfy { + return actual.contains($0) } + return PredicateStatus(bool: matches) + } } /// A Nimble matcher that succeeds when the actual set contains the expected values. -public func contain(_ items: T...) -> Predicate - where S.Element == T { - return contain(items) +public func contain(_ items: S.Element...) -> Predicate where S.Element: Equatable { + return contain(items) } /// A Nimble matcher that succeeds when the actual set contains the expected values. -public func contain(_ items: [T]) -> Predicate - where S.Element == T { - return Predicate.simple("contain <\(arrayAsString(items))>") { actualExpression in - if let actual = try actualExpression.evaluate() { - let matches = items.allSatisfy { - return actual.contains($0) - } - return PredicateStatus(bool: matches) - } - return .fail +public func contain(_ items: [S.Element]) -> Predicate where S.Element: Equatable { + return Predicate.simple("contain <\(arrayAsString(items))>") { actualExpression in + guard let actual = try actualExpression.evaluate() else { return .fail } + + let matches = items.allSatisfy { + return actual.contains($0) } + return PredicateStatus(bool: matches) + } } /// A Nimble matcher that succeeds when the actual string contains the expected substring. @@ -67,17 +60,17 @@ public func contain(_ substrings: String...) -> Predicate { public func contain(_ substrings: [String]) -> Predicate { return Predicate.simple("contain <\(arrayAsString(substrings))>") { actualExpression in - if let actual = try actualExpression.evaluate() { - let matches = substrings.allSatisfy { - let range = actual.range(of: $0) - return range != nil && !range!.isEmpty - } - return PredicateStatus(bool: matches) + guard let actual = try actualExpression.evaluate() else { return .fail } + + let matches = substrings.allSatisfy { + let range = actual.range(of: $0) + return range != nil && !range!.isEmpty } - return .fail + return PredicateStatus(bool: matches) } } +#if canImport(Foundation) /// A Nimble matcher that succeeds when the actual string contains the expected substring. public func contain(_ substrings: NSString...) -> Predicate { return contain(substrings) @@ -85,13 +78,13 @@ public func contain(_ substrings: NSString...) -> Predicate { public func contain(_ substrings: [NSString]) -> Predicate { return Predicate.simple("contain <\(arrayAsString(substrings))>") { actualExpression in - if let actual = try actualExpression.evaluate() { - let matches = substrings.allSatisfy { actual.range(of: $0.description).length != 0 } - return PredicateStatus(bool: matches) - } - return .fail + guard let actual = try actualExpression.evaluate() else { return .fail } + + let matches = substrings.allSatisfy { actual.range(of: $0.description).length != 0 } + return PredicateStatus(bool: matches) } } +#endif /// A Nimble matcher that succeeds when the actual collection contains the expected object. public func contain(_ items: Any?...) -> Predicate { @@ -101,6 +94,7 @@ public func contain(_ items: Any?...) -> Predicate { public func contain(_ items: [Any?]) -> Predicate { return Predicate.simple("contain <\(arrayAsString(items))>") { actualExpression in guard let actual = try actualExpression.evaluate() else { return .fail } + let matches = items.allSatisfy { item in return item.map { actual.contains($0) } ?? false } @@ -109,8 +103,8 @@ public func contain(_ items: [Any?]) -> Predicate { } #if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func containMatcher(_ expected: [NSObject]) -> NMBMatcher { +extension NMBPredicate { + @objc public class func containMatcher(_ expected: [NSObject]) -> NMBPredicate { return NMBPredicate { actualExpression in let location = actualExpression.location let actualValue = try actualExpression.evaluate() diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift index 331f3bc25..2e7875b2f 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift @@ -1,7 +1,6 @@ -import Foundation - -public func containElementSatisfying(_ predicate: @escaping ((T) -> Bool), _ predicateDescription: String = "") -> Predicate where S.Iterator.Element == T { - +public func containElementSatisfying( + _ predicate: @escaping ((S.Element) -> Bool), _ predicateDescription: String = "" +) -> Predicate { return Predicate.define { actualExpression in let message: ExpectationMessage if predicateDescription == "" { @@ -25,34 +24,38 @@ public func containElementSatisfying(_ predicate: @escaping ((T) } #if canImport(Darwin) - extension NMBObjCMatcher { - @objc public class func containElementSatisfyingMatcher(_ predicate: @escaping ((NSObject) -> Bool)) -> NMBMatcher { - return NMBPredicate { actualExpression in - let value = try actualExpression.evaluate() - guard let enumeration = value as? NSFastEnumeration else { - let message = ExpectationMessage.fail( - "containElementSatisfying must be provided an NSFastEnumeration object" - ) - return NMBPredicateResult(status: .fail, message: message.toObjectiveC()) - } - - let message = ExpectationMessage - .expectedTo("find object in collection that satisfies predicate") - .toObjectiveC() +import class Foundation.NSObject +import struct Foundation.NSFastEnumerationIterator +import protocol Foundation.NSFastEnumeration + +extension NMBPredicate { + @objc public class func containElementSatisfyingMatcher(_ predicate: @escaping ((NSObject) -> Bool)) -> NMBPredicate { + return NMBPredicate { actualExpression in + let value = try actualExpression.evaluate() + guard let enumeration = value as? NSFastEnumeration else { + let message = ExpectationMessage.fail( + "containElementSatisfying must be provided an NSFastEnumeration object" + ) + return NMBPredicateResult(status: .fail, message: message.toObjectiveC()) + } - var iterator = NSFastEnumerationIterator(enumeration) - while let item = iterator.next() { - guard let object = item as? NSObject else { - continue - } + let message = ExpectationMessage + .expectedTo("find object in collection that satisfies predicate") + .toObjectiveC() - if predicate(object) { - return NMBPredicateResult(status: .matches, message: message) - } + var iterator = NSFastEnumerationIterator(enumeration) + while let item = iterator.next() { + guard let object = item as? NSObject else { + continue } - return NMBPredicateResult(status: .doesNotMatch, message: message) + if predicate(object) { + return NMBPredicateResult(status: .matches, message: message) + } } + + return NMBPredicateResult(status: .doesNotMatch, message: message) } } +} #endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ElementsEqual.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ElementsEqual.swift index 1704e945a..708cf1c9c 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ElementsEqual.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ElementsEqual.swift @@ -1,6 +1,10 @@ -/// A Nimble matcher that succeeds when the actual sequence contain the same elements in the same order to the exepected sequence. -public func elementsEqual(_ expectedValue: S?) -> Predicate where S.Element: Equatable { - // A matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2949668-elementsequal +/// A Nimble matcher that succeeds when the actual sequence and the exepected sequence contain the same elements in +/// the same order. +/// +/// This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2854213-elementsequal +public func elementsEqual( + _ expectedValue: Seq2? +) -> Predicate where Seq1.Element: Equatable, Seq1.Element == Seq2.Element { return Predicate.define("elementsEqual <\(stringify(expectedValue))>") { (actualExpression, msg) in let actualValue = try actualExpression.evaluate() switch (expectedValue, actualValue) { @@ -14,3 +18,25 @@ public func elementsEqual(_ expectedValue: S?) -> Predicate wher } } } + +/// A Nimble matcher that succeeds when the actual sequence and the exepected sequence contain equivalent elements in +/// the same order, using the given predicate as the equivalence test. +/// +/// This is a matcher abstraction for https://developer.apple.com/documentation/swift/sequence/2949668-elementsequal +public func elementsEqual( + _ expectedValue: Seq2?, + by areEquivalent: @escaping (Seq1.Element, Seq2.Element) -> Bool +) -> Predicate { + return Predicate.define("elementsEqual <\(stringify(expectedValue))>") { (actualExpression, msg) in + let actualValue = try actualExpression.evaluate() + switch (expectedValue, actualValue) { + case (nil, _?): + return PredicateResult(status: .fail, message: msg.appendedBeNilHint()) + case (nil, nil), (_, nil): + return PredicateResult(status: .fail, message: msg) + case (let expected?, let actual?): + let matches = actual.elementsEqual(expected, by: areEquivalent) + return PredicateResult(bool: matches, message: msg) + } + } +} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift index 13bdb3112..16c4d0675 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/EndWith.swift @@ -2,21 +2,19 @@ import Foundation /// A Nimble matcher that succeeds when the actual sequence's last element /// is equal to the expected value. -public func endWith(_ endingElement: T) -> Predicate - where S.Iterator.Element == T { +public func endWith(_ endingElement: S.Element) -> Predicate where S.Element: Equatable { return Predicate.simple("end with <\(endingElement)>") { actualExpression in - if let actualValue = try actualExpression.evaluate() { - var actualGenerator = actualValue.makeIterator() - var lastItem: T? - var item: T? - repeat { - lastItem = item - item = actualGenerator.next() - } while(item != nil) + guard let actualValue = try actualExpression.evaluate() else { return .fail } - return PredicateStatus(bool: lastItem == endingElement) - } - return .fail + var actualGenerator = actualValue.makeIterator() + var lastItem: S.Element? + var item: S.Element? + repeat { + lastItem = item + item = actualGenerator.next() + } while(item != nil) + + return PredicateStatus(bool: lastItem == endingElement) } } @@ -25,6 +23,7 @@ public func endWith(_ endingElement: T) -> Predicate< public func endWith(_ endingElement: Any) -> Predicate { return Predicate.simple("end with <\(endingElement)>") { actualExpression in guard let collection = try actualExpression.evaluate() else { return .fail } + guard collection.count > 0 else { return PredicateStatus(bool: false) } #if os(Linux) guard let collectionValue = collection.object(at: collection.count - 1) as? NSObject else { @@ -43,16 +42,15 @@ public func endWith(_ endingElement: Any) -> Predicate { /// expected substring's length. public func endWith(_ endingSubstring: String) -> Predicate { return Predicate.simple("end with <\(endingSubstring)>") { actualExpression in - if let collection = try actualExpression.evaluate() { - return PredicateStatus(bool: collection.hasSuffix(endingSubstring)) - } - return .fail + guard let collection = try actualExpression.evaluate() else { return .fail } + + return PredicateStatus(bool: collection.hasSuffix(endingSubstring)) } } #if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func endWithMatcher(_ expected: Any) -> NMBMatcher { +extension NMBPredicate { + @objc public class func endWithMatcher(_ expected: Any) -> NMBPredicate { return NMBPredicate { actualExpression in let actual = try actualExpression.evaluate() if actual is String { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift index b08d5f671..190edb4b7 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Equal.swift @@ -1,5 +1,3 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual value is equal to the expected value. /// Values can support equal by supporting the Equatable protocol. /// @@ -71,7 +69,7 @@ private func equal(_ expectedValue: Set?, stringify: @escaping (Set?) - errorMessage = .expectedCustomValueTo( "equal <\(stringify(expectedValue))>", - "<\(stringify(actualValue))>" + actual: "<\(stringify(actualValue))>" ) if expectedValue == actualValue { @@ -138,8 +136,10 @@ public func !=(lhs: Expectation<[T: C]>, rhs: [T: C]?) { } #if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func equalMatcher(_ expected: NSObject) -> NMBMatcher { +import class Foundation.NSObject + +extension NMBPredicate { + @objc public class func equalMatcher(_ expected: NSObject) -> NMBPredicate { return NMBPredicate { actualExpression in return try equal(expected).satisfies(actualExpression).toObjectiveC() } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift index 984e2d4c2..20397f5a9 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/HaveCount.swift @@ -1,5 +1,3 @@ -import Foundation - // The `haveCount` matchers do not print the full string representation of the collection value, // instead they only print the type name and the expected count. This makes it easier to understand // the reason for failed expectations. See: https://github.com/Quick/Nimble/issues/308. @@ -13,7 +11,7 @@ public func haveCount(_ expectedValue: Int) -> Predicate { let message = ExpectationMessage .expectedCustomValueTo( "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))", - "\(actualValue.count)" + actual: "\(actualValue.count)" ) .appended(details: "Actual Value: \(stringify(actualValue))") @@ -33,7 +31,7 @@ public func haveCount(_ expectedValue: Int) -> Predicate { let message = ExpectationMessage .expectedCustomValueTo( "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))", - "\(actualValue.count)" + actual: "\(actualValue.count)" ) .appended(details: "Actual Value: \(stringify(actualValue))") @@ -46,8 +44,10 @@ public func haveCount(_ expectedValue: Int) -> Predicate { } #if canImport(Darwin) -extension NMBObjCMatcher { - @objc public class func haveCountMatcher(_ expected: NSNumber) -> NMBMatcher { +import Foundation + +extension NMBPredicate { + @objc public class func haveCountMatcher(_ expected: NSNumber) -> NMBPredicate { return NMBPredicate { actualExpression in let location = actualExpression.location let actualValue = try actualExpression.evaluate() @@ -60,7 +60,7 @@ extension NMBObjCMatcher { if let actualValue = actualValue { message = ExpectationMessage.expectedCustomValueTo( "get type of NSArray, NSSet, NSDictionary, or NSHashTable", - "\(String(describing: type(of: actualValue)))" + actual: "\(String(describing: type(of: actualValue)))" ) } else { message = ExpectationMessage diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift index dbcff09ec..93363b324 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Match.swift @@ -1,29 +1,23 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual string satisfies the regular expression /// described by the expected string. public func match(_ expectedValue: String?) -> Predicate { return Predicate.simple("match <\(stringify(expectedValue))>") { actualExpression in - if let actual = try actualExpression.evaluate() { - if let regexp = expectedValue { - let bool = actual.range(of: regexp, options: .regularExpression) != nil - return PredicateStatus(bool: bool) - } - } + guard let actual = try actualExpression.evaluate(), let regexp = expectedValue else { return .fail } - return .fail + let bool = actual.range(of: regexp, options: .regularExpression) != nil + return PredicateStatus(bool: bool) } } #if canImport(Darwin) +import class Foundation.NSString -extension NMBObjCMatcher { - @objc public class func matchMatcher(_ expected: NSString) -> NMBMatcher { +extension NMBPredicate { + @objc public class func matchMatcher(_ expected: NSString) -> NMBPredicate { return NMBPredicate { actualExpression in let actual = actualExpression.cast { $0 as? String } return try match(expected.description).satisfies(actual).toObjectiveC() } } } - #endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift index 4ad71d4f5..3edc99bcb 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatchError.swift @@ -1,5 +1,3 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual expression evaluates to an /// error from the specified case. /// @@ -9,9 +7,7 @@ public func matchError(_ error: T) -> Predicate { return Predicate.define { actualExpression in let actualError = try actualExpression.evaluate() - let failureMessage = FailureMessage() - setFailureMessageForError( - failureMessage, + let message = messageForError( postfixMessageVerb: "match", actualError: actualError, error: error @@ -22,7 +18,7 @@ public func matchError(_ error: T) -> Predicate { matches = true } - return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + return PredicateResult(bool: matches, message: message) } } @@ -35,9 +31,7 @@ public func matchError(_ error: T) -> Predicate { return Predicate.define { actualExpression in let actualError = try actualExpression.evaluate() - let failureMessage = FailureMessage() - setFailureMessageForError( - failureMessage, + let message = messageForError( postfixMessageVerb: "match", actualError: actualError, error: error @@ -48,7 +42,7 @@ public func matchError(_ error: T) -> Predicate { matches = true } - return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + return PredicateResult(bool: matches, message: message) } } @@ -58,9 +52,7 @@ public func matchError(_ errorType: T.Type) -> Predicate { return Predicate.define { actualExpression in let actualError = try actualExpression.evaluate() - let failureMessage = FailureMessage() - setFailureMessageForError( - failureMessage, + let message = messageForError( postfixMessageVerb: "match", actualError: actualError, errorType: errorType @@ -71,6 +63,6 @@ public func matchError(_ errorType: T.Type) -> Predicate { matches = true } - return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + return PredicateResult(bool: matches, message: message) } } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift index abcafa990..cba4d33d5 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift @@ -9,7 +9,7 @@ /// Use the Matcher protocol instead of this type to accept custom matchers as /// input parameters. /// @see allPass for an example that uses accepts other matchers as input. -@available(*, deprecated, message: "Use to Predicate instead") +@available(*, deprecated, message: "Use Predicate instead") public struct MatcherFunc: Matcher { public let matcher: (Expression, FailureMessage) throws -> Bool @@ -28,6 +28,7 @@ public struct MatcherFunc: Matcher { /// Compatibility layer to new Matcher API. Converts an old-style matcher to a new one. /// Note: You should definitely spend the time to convert to the new api as soon as possible /// since this struct type is deprecated. + @available(*, deprecated, message: "Use Predicate directly instead") public var predicate: Predicate { return Predicate.fromDeprecatedMatcher(self) } @@ -44,7 +45,7 @@ public struct MatcherFunc: Matcher { /// Use the Matcher protocol instead of this type to accept custom matchers as /// input parameters. /// @see allPass for an example that uses accepts other matchers as input. -@available(*, deprecated, message: "Use to Predicate instead") +@available(*, deprecated, message: "Use Predicate instead") public struct NonNilMatcherFunc: Matcher { public let matcher: (Expression, FailureMessage) throws -> Bool @@ -79,6 +80,7 @@ public struct NonNilMatcherFunc: Matcher { /// Compatibility layer to new Matcher API. Converts an old-style matcher to a new one. /// Note: You should definitely spend the time to convert to the new api as soon as possible /// since this struct type is deprecated. + @available(*, deprecated, message: "Use Predicate directly instead") public var predicate: Predicate { return Predicate.fromDeprecatedMatcher(self) } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift index 21ffd7719..720ced01c 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift @@ -12,6 +12,7 @@ public protocol Matcher { func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool } +@available(*, deprecated) extension Matcher { var predicate: Predicate { return Predicate.fromDeprecatedMatcher(self) @@ -128,22 +129,15 @@ extension NSDate: TestOutputStringConvertible { } } +#if canImport(Darwin) /// Protocol for types to support beLessThan(), beLessThanOrEqualTo(), /// beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers. /// /// Types that conform to Swift's Comparable protocol will work implicitly too -#if canImport(Darwin) @objc public protocol NMBComparable { func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult } -#elseif !compiler(>=5.1) -// This should become obsolete once Corelibs Foundation adds Comparable conformance to NSNumber -public protocol NMBComparable { - func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult -} -#endif -#if canImport(Darwin) || !compiler(>=5.1) extension NSNumber: NMBComparable { public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { // swiftlint:disable:next force_cast diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift index 5e8bee3d5..680c287e1 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/PostNotification.swift @@ -1,3 +1,4 @@ +#if canImport(Foundation) import Foundation internal class NotificationCollector { @@ -60,18 +61,18 @@ public func postNotifications( var result = try predicate.satisfies(collectorNotificationsExpression) result.message = result.message.replacedExpectation { message in - return .expectedCustomValueTo(message.expectedMessage, actualValue) + return .expectedCustomValueTo(message.expectedMessage, actual: actualValue) } return result } } +@available(*, deprecated, message: "Use Predicate instead") public func postNotifications( _ notificationsMatcher: T, fromNotificationCenter center: NotificationCenter = .default) -> Predicate - where T: Matcher, T.ValueType == [Notification] -{ + where T: Matcher, T.ValueType == [Notification] { _ = mainThread // Force lazy-loading of this value let collector = NotificationCollector(notificationCenter: center) collector.startObserving() @@ -98,3 +99,4 @@ public func postNotifications( return PredicateResult(bool: match, message: failureMessage.toExpectationMessage()) } } +#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Predicate.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Predicate.swift index 2604411af..fa0128f47 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Predicate.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/Predicate.swift @@ -1,6 +1,5 @@ // New Matcher API // -import Foundation /// A Predicate is part of the new matcher API that provides assertions to expectations. /// @@ -45,17 +44,17 @@ extension Predicate { /// Defines a predicate with a default message that can be returned in the closure /// Also ensures the predicate's actual value cannot pass with `nil` given. - public static func define(_ msg: String, matcher: @escaping (Expression, ExpectationMessage) throws -> PredicateResult) -> Predicate { + public static func define(_ message: String = "match", matcher: @escaping (Expression, ExpectationMessage) throws -> PredicateResult) -> Predicate { return Predicate { actual in - return try matcher(actual, .expectedActualValueTo(msg)) + return try matcher(actual, .expectedActualValueTo(message)) }.requireNonNil } /// Defines a predicate with a default message that can be returned in the closure /// Unlike `define`, this allows nil values to succeed if the given closure chooses to. - public static func defineNilable(_ msg: String, matcher: @escaping (Expression, ExpectationMessage) throws -> PredicateResult) -> Predicate { + public static func defineNilable(_ message: String = "match", matcher: @escaping (Expression, ExpectationMessage) throws -> PredicateResult) -> Predicate { return Predicate { actual in - return try matcher(actual, .expectedActualValueTo(msg)) + return try matcher(actual, .expectedActualValueTo(message)) } } } @@ -65,9 +64,9 @@ extension Predicate { /// error message. /// /// Also ensures the predicate's actual value cannot pass with `nil` given. - public static func simple(_ msg: String, matcher: @escaping (Expression) throws -> PredicateStatus) -> Predicate { + public static func simple(_ message: String = "match", matcher: @escaping (Expression) throws -> PredicateStatus) -> Predicate { return Predicate { actual in - return PredicateResult(status: try matcher(actual), message: .expectedActualValueTo(msg)) + return PredicateResult(status: try matcher(actual), message: .expectedActualValueTo(message)) }.requireNonNil } @@ -75,9 +74,9 @@ extension Predicate { /// error message. /// /// Unlike `simple`, this allows nil values to succeed if the given closure chooses to. - public static func simpleNilable(_ msg: String, matcher: @escaping (Expression) throws -> PredicateStatus) -> Predicate { + public static func simpleNilable(_ message: String = "match", matcher: @escaping (Expression) throws -> PredicateStatus) -> Predicate { return Predicate { actual in - return PredicateResult(status: try matcher(actual), message: .expectedActualValueTo(msg)) + return PredicateResult(status: try matcher(actual), message: .expectedActualValueTo(message)) } } } @@ -166,32 +165,41 @@ public enum PredicateStatus { } } -// Backwards compatibility until Old Matcher API removal -extension Predicate: Matcher { - /// Compatibility layer for old Matcher API, deprecated - public static func fromDeprecatedFullClosure(_ matcher: @escaping (Expression, FailureMessage, Bool) throws -> Bool) -> Predicate { +extension Predicate { + /// Compatibility layer for old Matcher API, deprecated. + /// Emulates the MatcherFunc API + internal static func _fromDeprecatedClosure(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) -> Predicate { + // swiftlint:disable:previous identifier_name return Predicate { actual in let failureMessage = FailureMessage() - let result = try matcher(actual, failureMessage, true) + let result = try matcher(actual, failureMessage) return PredicateResult( status: PredicateStatus(bool: result), message: failureMessage.toExpectationMessage() ) } } +} - /// Compatibility layer for old Matcher API, deprecated. - /// Emulates the MatcherFunc API - public static func fromDeprecatedClosure(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) -> Predicate { +// Backwards compatibility until Old Matcher API removal +@available(*, deprecated, message: "Use Predicate directly instead") +extension Predicate: Matcher { + /// Compatibility layer for old Matcher API, deprecated + public static func fromDeprecatedFullClosure(_ matcher: @escaping (Expression, FailureMessage, Bool) throws -> Bool) -> Predicate { return Predicate { actual in let failureMessage = FailureMessage() - let result = try matcher(actual, failureMessage) + let result = try matcher(actual, failureMessage, true) return PredicateResult( status: PredicateStatus(bool: result), message: failureMessage.toExpectationMessage() ) } + } + /// Compatibility layer for old Matcher API, deprecated. + /// Emulates the MatcherFunc API + public static func fromDeprecatedClosure(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) -> Predicate { + return _fromDeprecatedClosure(matcher) } /// Compatibility layer for old Matcher API, deprecated. @@ -243,6 +251,8 @@ extension Predicate { } #if canImport(Darwin) +import class Foundation.NSObject + public typealias PredicateBlock = (_ actualExpression: Expression) throws -> NMBPredicateResult public class NMBPredicate: NSObject { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift index 4dd930442..7c1b2b26c 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/RaisesException.swift @@ -1,7 +1,8 @@ -import Foundation - -// This matcher requires the Objective-C, and being built by Xcode rather than the Swift Package Manager +// This matcher requires the Objective-C, and being built by Xcode rather than the Swift Package Manager #if canImport(Darwin) && !SWIFT_PACKAGE +import class Foundation.NSObject +import class Foundation.NSDictionary +import class Foundation.NSException /// A Nimble matcher that succeeds when the actual expression raises an /// exception with the specified name, reason, and/or userInfo. @@ -12,78 +13,97 @@ import Foundation /// /// nil arguments indicates that the matcher should not attempt to match against /// that parameter. -public func raiseException( - named: String? = nil, +public func raiseException( + named: NSExceptionName? = nil, reason: String? = nil, userInfo: NSDictionary? = nil, - closure: ((NSException) -> Void)? = nil) -> Predicate { - return Predicate { actualExpression in - var exception: NSException? - let capture = NMBExceptionCapture(handler: ({ e in - exception = e - }), finally: nil) - - do { - try capture.tryBlockThrows { - _ = try actualExpression.evaluate() - } - } catch { - return PredicateResult(status: .fail, message: .fail("unexpected error thrown: <\(error)>")) - } + closure: ((NSException) -> Void)? = nil +) -> Predicate { + return raiseException(named: named?.rawValue, reason: reason, userInfo: userInfo, closure: closure) +} - let failureMessage = FailureMessage() - setFailureMessageForException( - failureMessage, - exception: exception, - named: named, - reason: reason, - userInfo: userInfo, - closure: closure - ) +/// A Nimble matcher that succeeds when the actual expression raises an +/// exception with the specified name, reason, and/or userInfo. +/// +/// Alternatively, you can pass a closure to do any arbitrary custom matching +/// to the raised exception. The closure only gets called when an exception +/// is raised. +/// +/// nil arguments indicates that the matcher should not attempt to match against +/// that parameter. +public func raiseException( + named: String?, + reason: String? = nil, + userInfo: NSDictionary? = nil, + closure: ((NSException) -> Void)? = nil +) -> Predicate { + return Predicate { actualExpression in + var exception: NSException? + let capture = NMBExceptionCapture(handler: ({ e in + exception = e + }), finally: nil) - let matches = exceptionMatchesNonNilFieldsOrClosure( - exception, - named: named, - reason: reason, - userInfo: userInfo, - closure: closure - ) - return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + do { + try capture.tryBlockThrows { + _ = try actualExpression.evaluate() + } + } catch { + return PredicateResult(status: .fail, message: .fail("unexpected error thrown: <\(error)>")) } + + let message = messageForException( + exception: exception, + named: named, + reason: reason, + userInfo: userInfo, + closure: closure + ) + + let matches = exceptionMatchesNonNilFieldsOrClosure( + exception, + named: named, + reason: reason, + userInfo: userInfo, + closure: closure + ) + return PredicateResult(bool: matches, message: message) + } } -// swiftlint:disable:next function_parameter_count -internal func setFailureMessageForException( - _ failureMessage: FailureMessage, +internal func messageForException( exception: NSException?, named: String?, reason: String?, userInfo: NSDictionary?, - closure: ((NSException) -> Void)?) { - failureMessage.postfixMessage = "raise exception" + closure: ((NSException) -> Void)? +) -> ExpectationMessage { + var rawMessage: String = "raise exception" - if let named = named { - failureMessage.postfixMessage += " with name <\(named)>" - } - if let reason = reason { - failureMessage.postfixMessage += " with reason <\(reason)>" - } - if let userInfo = userInfo { - failureMessage.postfixMessage += " with userInfo <\(userInfo)>" - } - if closure != nil { - failureMessage.postfixMessage += " that satisfies block" - } - if named == nil && reason == nil && userInfo == nil && closure == nil { - failureMessage.postfixMessage = "raise any exception" - } + if let named = named { + rawMessage += " with name <\(named)>" + } + if let reason = reason { + rawMessage += " with reason <\(reason)>" + } + if let userInfo = userInfo { + rawMessage += " with userInfo <\(userInfo)>" + } + if closure != nil { + rawMessage += " that satisfies block" + } + if named == nil && reason == nil && userInfo == nil && closure == nil { + rawMessage = "raise any exception" + } - if let exception = exception { - // swiftlint:disable:next line_length - failureMessage.actualValue = "\(String(describing: type(of: exception))) { name=\(exception.name), reason='\(stringify(exception.reason))', userInfo=\(stringify(exception.userInfo)) }" - } else { - failureMessage.actualValue = "no exception" - } + let actual: String + if let exception = exception { + // swiftlint:disable:next line_length + actual = "\(String(describing: type(of: exception))) { name=\(exception.name), reason='\(stringify(exception.reason))', userInfo=\(stringify(exception.userInfo)) }" + } else { + actual = "no exception" + } + + return .expectedCustomValueTo(rawMessage, actual: actual) } internal func exceptionMatchesNonNilFieldsOrClosure( @@ -121,93 +141,82 @@ internal func exceptionMatchesNonNilFieldsOrClosure( return matches } -public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { - // swiftlint:disable identifier_name - internal var _name: String? - internal var _reason: String? - internal var _userInfo: NSDictionary? - internal var _block: ((NSException) -> Void)? - // swiftlint:enable identifier_name +public class NMBObjCRaiseExceptionPredicate: NMBPredicate { + private let _name: String? + private let _reason: String? + private let _userInfo: NSDictionary? + private let _block: ((NSException) -> Void)? - internal init(name: String?, reason: String?, userInfo: NSDictionary?, block: ((NSException) -> Void)?) { + fileprivate init(name: String?, reason: String?, userInfo: NSDictionary?, block: ((NSException) -> Void)?) { _name = name _reason = reason _userInfo = userInfo _block = block - } - @objc public func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - let block: () -> Any? = ({ _ = actualBlock(); return nil }) - let expr = Expression(expression: block, location: location) - - do { - let predicate = raiseException( - named: _name, - reason: _reason, - userInfo: _userInfo, - closure: _block - ) - let result = try predicate.satisfies(expr) - result.message.update(failureMessage: failureMessage) - return result.toBoolean(expectation: .toMatch) - } catch let error { - failureMessage.stringValue = "unexpected error thrown: <\(error)>" - return false + let predicate: Predicate = raiseException( + named: name, + reason: reason, + userInfo: userInfo, + closure: block + ) + let predicateBlock: PredicateBlock = { actualExpression in + return try predicate.satisfies(actualExpression).toObjectiveC() } + super.init(predicate: predicateBlock) } - @objc public func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { - return !matches(actualBlock, failureMessage: failureMessage, location: location) - } - - @objc public var named: (_ name: String) -> NMBObjCRaiseExceptionMatcher { + @objc public var named: (_ name: String) -> NMBObjCRaiseExceptionPredicate { + let (reason, userInfo, block) = (_reason, _userInfo, _block) return { name in - return NMBObjCRaiseExceptionMatcher( + return NMBObjCRaiseExceptionPredicate( name: name, - reason: self._reason, - userInfo: self._userInfo, - block: self._block + reason: reason, + userInfo: userInfo, + block: block ) } } - @objc public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionMatcher { + @objc public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionPredicate { + let (name, userInfo, block) = (_name, _userInfo, _block) return { reason in - return NMBObjCRaiseExceptionMatcher( - name: self._name, + return NMBObjCRaiseExceptionPredicate( + name: name, reason: reason, - userInfo: self._userInfo, - block: self._block + userInfo: userInfo, + block: block ) } } - @objc public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionMatcher { + @objc public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionPredicate { + let (name, reason, block) = (_name, _reason, _block) return { userInfo in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: self._reason, + return NMBObjCRaiseExceptionPredicate( + name: name, + reason: reason, userInfo: userInfo, - block: self._block + block: block ) } } - @objc public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionMatcher { + @objc public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionPredicate { + let (name, reason, userInfo) = (_name, _reason, _userInfo) return { block in - return NMBObjCRaiseExceptionMatcher( - name: self._name, - reason: self._reason, - userInfo: self._userInfo, + return NMBObjCRaiseExceptionPredicate( + name: name, + reason: reason, + userInfo: userInfo, block: block ) } } } -extension NMBObjCMatcher { - @objc public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionMatcher { - return NMBObjCRaiseExceptionMatcher(name: nil, reason: nil, userInfo: nil, block: nil) +extension NMBPredicate { + @objc public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionPredicate { + return NMBObjCRaiseExceptionPredicate(name: nil, reason: nil, userInfo: nil, block: nil) } } #endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift index 15de060b9..7fbeeef69 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift @@ -1,5 +1,3 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual value matches with all of the matchers /// provided in the variable list of matchers. public func satisfyAllOf(_ predicates: Predicate...) -> Predicate { @@ -8,6 +6,7 @@ public func satisfyAllOf(_ predicates: Predicate...) -> Predicate { /// A Nimble matcher that succeeds when the actual value matches with all of the matchers /// provided in the variable list of matchers. +@available(*, deprecated, message: "Use Predicate instead") public func satisfyAllOf(_ matchers: U...) -> Predicate where U: Matcher, U.ValueType == T { return satisfyAllOf(matchers.map { $0.predicate }) @@ -29,7 +28,7 @@ internal func satisfyAllOf(_ predicates: [Predicate]) -> Predicate { if let actualValue = try actualExpression.evaluate() { msg = .expectedCustomValueTo( "match all of: " + postfixMessages.joined(separator: ", and "), - "\(actualValue)" + actual: "\(actualValue)" ) } else { msg = .expectedActualValueTo( @@ -46,7 +45,9 @@ public func && (left: Predicate, right: Predicate) -> Predicate { } #if canImport(Darwin) -extension NMBObjCMatcher { +import class Foundation.NSObject + +extension NMBPredicate { @objc public class func satisfyAllOfMatcher(_ matchers: [NMBMatcher]) -> NMBPredicate { return NMBPredicate { actualExpression in if matchers.isEmpty { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift index e8b379f15..44615dce7 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift @@ -1,5 +1,3 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual value matches with any of the matchers /// provided in the variable list of matchers. public func satisfyAnyOf(_ predicates: Predicate...) -> Predicate { @@ -8,6 +6,7 @@ public func satisfyAnyOf(_ predicates: Predicate...) -> Predicate { /// A Nimble matcher that succeeds when the actual value matches with any of the matchers /// provided in the variable list of matchers. +@available(*, deprecated, message: "Use Predicate instead") public func satisfyAnyOf(_ matchers: U...) -> Predicate where U: Matcher, U.ValueType == T { return satisfyAnyOf(matchers.map { $0.predicate }) @@ -29,7 +28,7 @@ internal func satisfyAnyOf(_ predicates: [Predicate]) -> Predicate { if let actualValue = try actualExpression.evaluate() { msg = .expectedCustomValueTo( "match one of: " + postfixMessages.joined(separator: ", or "), - "\(actualValue)" + actual: "\(actualValue)" ) } else { msg = .expectedActualValueTo( @@ -45,16 +44,20 @@ public func || (left: Predicate, right: Predicate) -> Predicate { return satisfyAnyOf(left, right) } +@available(*, deprecated, message: "Use Predicate instead") public func || (left: NonNilMatcherFunc, right: NonNilMatcherFunc) -> Predicate { return satisfyAnyOf(left, right) } +@available(*, deprecated, message: "Use Predicate instead") public func || (left: MatcherFunc, right: MatcherFunc) -> Predicate { return satisfyAnyOf(left, right) } #if canImport(Darwin) -extension NMBObjCMatcher { +import class Foundation.NSObject + +extension NMBPredicate { @objc public class func satisfyAnyOfMatcher(_ matchers: [NMBMatcher]) -> NMBPredicate { return NMBPredicate { actualExpression in if matchers.isEmpty { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift index e20f9eabe..5bbe96b00 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift @@ -1,10 +1,10 @@ -import Foundation - -#if canImport(CwlPreconditionTesting) +#if canImport(CwlPreconditionTesting) && (os(macOS) || os(iOS)) import CwlPreconditionTesting +#elseif canImport(CwlPosixPreconditionTesting) +import CwlPosixPreconditionTesting #endif -public func throwAssertion() -> Predicate { +public func throwAssertion() -> Predicate { return Predicate { actualExpression in #if arch(x86_64) && canImport(Darwin) let message = ExpectationMessage.expectedTo("throw an assertion") @@ -28,7 +28,7 @@ public func throwAssertion() -> Predicate { } #endif do { - try actualExpression.evaluate() + _ = try actualExpression.evaluate() } catch { actualError = error } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift index d294ba39d..d5ac732e2 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ThrowError.swift @@ -1,5 +1,3 @@ -import Foundation - /// A Nimble matcher that succeeds when the actual expression throws an /// error of the specified type or from the specified case. /// @@ -11,7 +9,7 @@ import Foundation /// /// nil arguments indicates that the matcher should not attempt to match against /// that parameter. -public func throwError() -> Predicate { +public func throwError() -> Predicate { return Predicate { actualExpression in var actualError: Error? do { @@ -21,9 +19,15 @@ public func throwError() -> Predicate { } if let actualError = actualError { - return PredicateResult(bool: true, message: .expectedCustomValueTo("throw any error", "<\(actualError)>")) + return PredicateResult( + bool: true, + message: .expectedCustomValueTo("throw any error", actual: "<\(actualError)>") + ) } else { - return PredicateResult(bool: false, message: .expectedCustomValueTo("throw any error", "no error")) + return PredicateResult( + bool: false, + message: .expectedCustomValueTo("throw any error", actual: "no error") + ) } } } @@ -39,7 +43,7 @@ public func throwError() -> Predicate { /// /// nil arguments indicates that the matcher should not attempt to match against /// that parameter. -public func throwError(_ error: T, closure: ((Error) -> Void)? = nil) -> Predicate { +public func throwError(_ error: T, closure: ((Error) -> Void)? = nil) -> Predicate { return Predicate { actualExpression in var actualError: Error? do { @@ -48,9 +52,7 @@ public func throwError(_ error: T, closure: ((Error) -> Void)? = nil) actualError = error } - let failureMessage = FailureMessage() - setFailureMessageForError( - failureMessage, + let message = messageForError( actualError: actualError, error: error, errorType: nil, @@ -72,7 +74,7 @@ public func throwError(_ error: T, closure: ((Error) -> Void)? = nil) } } - return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + return PredicateResult(bool: matches, message: message) } } @@ -87,7 +89,7 @@ public func throwError(_ error: T, closure: ((Error) -> Void)? = nil) /// /// nil arguments indicates that the matcher should not attempt to match against /// that parameter. -public func throwError(_ error: T, closure: ((T) -> Void)? = nil) -> Predicate { +public func throwError(_ error: T, closure: ((T) -> Void)? = nil) -> Predicate { return Predicate { actualExpression in var actualError: Error? do { @@ -96,9 +98,7 @@ public func throwError(_ error: T, closure: ((T) -> Void)? actualError = error } - let failureMessage = FailureMessage() - setFailureMessageForError( - failureMessage, + let message = messageForError( actualError: actualError, error: error, errorType: nil, @@ -120,7 +120,7 @@ public func throwError(_ error: T, closure: ((T) -> Void)? } } - return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + return PredicateResult(bool: matches, message: message) } } @@ -135,9 +135,10 @@ public func throwError(_ error: T, closure: ((T) -> Void)? /// /// nil arguments indicates that the matcher should not attempt to match against /// that parameter. -public func throwError( +public func throwError( errorType: T.Type, - closure: ((T) -> Void)? = nil) -> Predicate { + closure: ((T) -> Void)? = nil +) -> Predicate { return Predicate { actualExpression in var actualError: Error? do { @@ -146,9 +147,7 @@ public func throwError( actualError = error } - let failureMessage = FailureMessage() - setFailureMessageForError( - failureMessage, + let message = messageForError( actualError: actualError, error: nil, errorType: errorType, @@ -187,7 +186,7 @@ public func throwError( } } - return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + return PredicateResult(bool: matches, message: message) } } @@ -198,7 +197,7 @@ public func throwError( /// values of the existential type `Error` in the closure. /// /// The closure only gets called when an error was thrown. -public func throwError(closure: @escaping ((Error) -> Void)) -> Predicate { +public func throwError(closure: @escaping ((Error) -> Void)) -> Predicate { return Predicate { actualExpression in var actualError: Error? do { @@ -207,8 +206,7 @@ public func throwError(closure: @escaping ((Error) -> Void)) -> Predicate { actualError = error } - let failureMessage = FailureMessage() - setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) + let message = messageForError(actualError: actualError, closure: closure) var matches = false if let actualError = actualError { @@ -223,7 +221,7 @@ public func throwError(closure: @escaping ((Error) -> Void)) -> Predicate { } } - return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + return PredicateResult(bool: matches, message: message) } } @@ -234,7 +232,7 @@ public func throwError(closure: @escaping ((Error) -> Void)) -> Predicate { /// values of the existential type `Error` in the closure. /// /// The closure only gets called when an error was thrown. -public func throwError(closure: @escaping ((T) -> Void)) -> Predicate { +public func throwError(closure: @escaping ((T) -> Void)) -> Predicate { return Predicate { actualExpression in var actualError: Error? do { @@ -243,8 +241,7 @@ public func throwError(closure: @escaping ((T) -> Void)) -> Predicate< actualError = error } - let failureMessage = FailureMessage() - setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) + let message = messageForError(actualError: actualError, closure: closure) var matches = false if let actualError = actualError as? T { @@ -259,6 +256,6 @@ public func throwError(closure: @escaping ((T) -> Void)) -> Predicate< } } - return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + return PredicateResult(bool: matches, message: message) } } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ToSucceed.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ToSucceed.swift index 01369bb32..0b52ee9a1 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ToSucceed.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Matchers/ToSucceed.swift @@ -25,12 +25,12 @@ public func succeed() -> Predicate<() -> ToSucceedResult> { case .succeeded: return PredicateResult( bool: true, - message: .expectedCustomValueTo("succeed", "") + message: .expectedCustomValueTo("succeed", actual: "") ) case .failed(let reason): return PredicateResult( bool: false, - message: .expectedCustomValueTo("succeed", " because <\(reason)>") + message: .expectedCustomValueTo("succeed", actual: " because <\(reason)>") ) } } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h index bd45c5dde..d975a7278 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Nimble.h @@ -3,7 +3,10 @@ #import "NMBStringify.h" #import "DSL.h" -#import "CwlPreconditionTesting.h" +#if TARGET_OS_OSX || TARGET_OS_IOS + #import "CwlMachBadInstructionHandler.h" + #import "CwlCatchException.h" +#endif FOUNDATION_EXPORT double NimbleVersionNumber; FOUNDATION_EXPORT const unsigned char NimbleVersionString[]; diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Await.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Await.swift index abe1237e5..ce1b8231e 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Await.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Await.swift @@ -2,10 +2,6 @@ import CoreFoundation import Dispatch import Foundation -#if canImport(CDispatch) - import CDispatch -#endif - private let timeoutLeeway = DispatchTimeInterval.milliseconds(1) private let pollLeeway = DispatchTimeInterval.milliseconds(1) @@ -98,7 +94,7 @@ internal enum AwaitResult { /// Holds the resulting value from an asynchronous expectation. /// This class is thread-safe at receiving an "response" to this promise. -internal class AwaitPromise { +internal final class AwaitPromise { private(set) internal var asyncResult: AwaitResult = .incomplete private var signal: DispatchSemaphore @@ -152,7 +148,7 @@ internal class AwaitPromiseBuilder { self.trigger = trigger } - func timeout(_ timeoutInterval: TimeInterval, forcefullyAbortTimeout: TimeInterval) -> Self { + func timeout(_ timeoutInterval: DispatchTimeInterval, forcefullyAbortTimeout: DispatchTimeInterval) -> Self { // = Discussion = // // There's a lot of technical decisions here that is useful to elaborate on. This is @@ -257,11 +253,7 @@ internal class AwaitPromiseBuilder { self.trigger.timeoutSource.resume() while self.promise.asyncResult.isIncomplete() { // Stopping the run loop does not work unless we run only 1 mode - #if (swift(>=4.2) && canImport(Darwin)) || compiler(>=5.0) _ = RunLoop.current.run(mode: .default, before: .distantFuture) - #else - _ = RunLoop.current.run(mode: .defaultRunLoopMode, before: .distantFuture) - #endif } self.trigger.timeoutSource.cancel() @@ -301,11 +293,19 @@ internal class Awaiter { let timeoutSource = createTimerSource(timeoutQueue) var completionCount = 0 let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: nil) { - try closure { + try closure { result in completionCount += 1 if completionCount < 2 { - if promise.resolveResult(.completed($0)) { - CFRunLoopStop(CFRunLoopGetMain()) + func completeBlock() { + if promise.resolveResult(.completed(result)) { + CFRunLoopStop(CFRunLoopGetMain()) + } + } + + if Thread.isMainThread { + completeBlock() + } else { + DispatchQueue.main.async { completeBlock() } } } else { fail("waitUntil(..) expects its completion closure to be only called once", @@ -321,12 +321,12 @@ internal class Awaiter { trigger: trigger) } - func poll(_ pollInterval: TimeInterval, closure: @escaping () throws -> T?) -> AwaitPromiseBuilder { + func poll(_ pollInterval: DispatchTimeInterval, closure: @escaping () throws -> T?) -> AwaitPromiseBuilder { let promise = AwaitPromise() let timeoutSource = createTimerSource(timeoutQueue) let asyncSource = createTimerSource(asyncQueue) let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: asyncSource) { - let interval = DispatchTimeInterval.nanoseconds(Int(pollInterval * TimeInterval(NSEC_PER_SEC))) + let interval = pollInterval asyncSource.schedule(deadline: .now(), repeating: interval, leeway: pollLeeway) asyncSource.setEventHandler { do { @@ -353,8 +353,8 @@ internal class Awaiter { } internal func pollBlock( - pollInterval: TimeInterval, - timeoutInterval: TimeInterval, + pollInterval: DispatchTimeInterval, + timeoutInterval: DispatchTimeInterval, file: FileString, line: UInt, fnName: String = #function, @@ -365,7 +365,7 @@ internal func pollBlock( return true } return nil - }.timeout(timeoutInterval, forcefullyAbortTimeout: timeoutInterval / 2.0).wait(fnName, file: file, line: line) + }.timeout(timeoutInterval, forcefullyAbortTimeout: timeoutInterval.divided).wait(fnName, file: file, line: line) return result } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/DispatchTimeInterval.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/DispatchTimeInterval.swift new file mode 100644 index 000000000..a4b1d65f3 --- /dev/null +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/DispatchTimeInterval.swift @@ -0,0 +1,41 @@ +import Dispatch + +#if canImport(CDispatch) +import CDispatch +#endif + +extension DispatchTimeInterval { + // ** Note: We cannot simply divide the time interval because DispatchTimeInterval associated value type is Int + var divided: DispatchTimeInterval { + switch self { + case let .seconds(val): return val < 2 ? .milliseconds(Int(Float(val)/2*1000)) : .seconds(val/2) + case let .milliseconds(val): return .milliseconds(val/2) + case let .microseconds(val): return .microseconds(val/2) + case let .nanoseconds(val): return .nanoseconds(val/2) + case .never: return .never + @unknown default: fatalError("Unknown DispatchTimeInterval value") + } + } + + var description: String { + switch self { + case let .seconds(val): return val == 1 ? "\(Float(val)) second" : "\(Float(val)) seconds" + case let .milliseconds(val): return "\(Float(val)/1_000) seconds" + case let .microseconds(val): return "\(Float(val)/1_000_000) seconds" + case let .nanoseconds(val): return "\(Float(val)/1_000_000_000) seconds" + default: fatalError("Unknown DispatchTimeInterval value") + } + } +} + +#if canImport(Foundation) +import typealias Foundation.TimeInterval + +extension TimeInterval { + var dispatchInterval: DispatchTimeInterval { + let microseconds = Int64(self * TimeInterval(USEC_PER_SEC)) + // perhaps use nanoseconds, though would more often be > Int.max + return microseconds < Int.max ? .microseconds(Int(microseconds)) : .seconds(Int(self)) + } +} +#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift index 074cb2033..4c3e43449 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Errors.swift @@ -1,33 +1,34 @@ -import Foundation - // Generic -internal func setFailureMessageForError( - _ failureMessage: FailureMessage, +internal func messageForError( postfixMessageVerb: String = "throw", actualError: Error?, error: T? = nil, errorType: T.Type? = nil, - closure: ((T) -> Void)? = nil) { - failureMessage.postfixMessage = "\(postfixMessageVerb) error" + closure: ((T) -> Void)? = nil +) -> ExpectationMessage { + var rawMessage = "\(postfixMessageVerb) error" if let error = error { - failureMessage.postfixMessage += " <\(error)>" + rawMessage += " <\(error)>" } else if errorType != nil || closure != nil { - failureMessage.postfixMessage += " from type <\(T.self)>" + rawMessage += " from type <\(T.self)>" } if closure != nil { - failureMessage.postfixMessage += " that satisfies block" + rawMessage += " that satisfies block" } if error == nil && errorType == nil && closure == nil { - failureMessage.postfixMessage = "\(postfixMessageVerb) any error" + rawMessage = "\(postfixMessageVerb) any error" } + let actual: String if let actualError = actualError { - failureMessage.actualValue = "<\(actualError)>" + actual = "<\(actualError)>" } else { - failureMessage.actualValue = "no error" + actual = "no error" } + + return .expectedCustomValueTo(rawMessage, actual: actual) } internal func errorMatchesExpectedError( @@ -39,21 +40,24 @@ internal func errorMatchesExpectedError( // Non-generic -internal func setFailureMessageForError( - _ failureMessage: FailureMessage, +internal func messageForError( actualError: Error?, - closure: ((Error) -> Void)?) { - failureMessage.postfixMessage = "throw error" + closure: ((Error) -> Void)? +) -> ExpectationMessage { + var rawMessage = "throw error" if closure != nil { - failureMessage.postfixMessage += " that satisfies block" + rawMessage += " that satisfies block" } else { - failureMessage.postfixMessage = "throw any error" + rawMessage = "throw any error" } + let actual: String if let actualError = actualError { - failureMessage.actualValue = "<\(actualError)>" + actual = "<\(actualError)>" } else { - failureMessage.actualValue = "no error" + actual = "no error" } + + return .expectedCustomValueTo(rawMessage, actual: actual) } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Functional.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Functional.swift deleted file mode 100644 index c87af761d..000000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Functional.swift +++ /dev/null @@ -1,14 +0,0 @@ -import Foundation - -#if !swift(>=4.2) -extension Sequence { - internal func allSatisfy(_ predicate: (Element) throws -> Bool) rethrows -> Bool { - for item in self { - if try !predicate(item) { - return false - } - } - return true - } -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift index 7caea26a4..88e84bb5a 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/Nimble/Utils/Stringers.swift @@ -40,32 +40,24 @@ extension Float: TestOutputStringConvertible { } extension NSNumber: TestOutputStringConvertible { - // This is using `NSString(format:)` instead of - // `String(format:)` because the latter somehow breaks - // the travis CI build on linux. public var testDescription: String { let description = self.description if description.contains(".") { - // Travis linux swiftpm build doesn't like casting String to NSString, - // which is why this annoying nested initializer thing is here. - // Maybe this will change in a future snapshot. - let decimalPlaces = NSString(string: NSString(string: description) - .components(separatedBy: ".")[1]) - - // SeeAlso: https://bugs.swift.org/browse/SR-1464 - switch decimalPlaces.length { + let decimalPlaces = description.split(separator: ".")[1] + switch decimalPlaces.count { case 1: - return NSString(format: "%0.1f", self.doubleValue).description + return String(format: "%0.1f", doubleValue) case 2: - return NSString(format: "%0.2f", self.doubleValue).description + return String(format: "%0.2f", doubleValue) case 3: - return NSString(format: "%0.3f", self.doubleValue).description + return String(format: "%0.3f", doubleValue) default: - return NSString(format: "%0.4f", self.doubleValue).description + return String(format: "%0.4f", doubleValue) } } - return self.description + + return description } } @@ -80,7 +72,7 @@ extension AnySequence: TestOutputStringConvertible { public var testDescription: String { let generator = self.makeIterator() var strings = [String]() - var value: AnySequence.Iterator.Element? + var value: AnySequence.Element? repeat { value = generator.next() diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h index 9170541bf..9ae06a4d1 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.h @@ -1,9 +1,9 @@ #import @class NMBExpectation; -@class NMBObjCBeCloseToMatcher; -@class NMBObjCRaiseExceptionMatcher; -@protocol NMBMatcher; +@class NMBPredicate; +@class NMBObjCBeCloseToPredicate; +@class NMBObjCRaiseExceptionPredicate; NS_ASSUME_NONNULL_BEGIN @@ -66,16 +66,16 @@ NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(void), NSStrin #define DEFINE_OVERLOAD(TYPE, EXPR) \ NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ - id NMB_equal(TYPE expectedValue) { \ + NMBPredicate *NMB_equal(TYPE expectedValue) { \ return NMB_equal((EXPR)); \ } \ - NIMBLE_SHORT_OVERLOADED(id equal(TYPE expectedValue), NMB_equal(expectedValue)); + NIMBLE_SHORT_OVERLOADED(NMBPredicate *equal(TYPE expectedValue), NMB_equal(expectedValue)); NIMBLE_EXPORT NIMBLE_OVERLOADABLE - id NMB_equal(__nullable id expectedValue); + NMBPredicate *NMB_equal(__nullable id expectedValue); - NIMBLE_SHORT_OVERLOADED(id equal(__nullable id expectedValue), + NIMBLE_SHORT_OVERLOADED(NMBPredicate *equal(__nullable id expectedValue), NMB_equal(expectedValue)); // overloaded dispatch for nils - expect(nil) @@ -101,17 +101,17 @@ NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(void), NSStrin #define DEFINE_OVERLOAD(TYPE, EXPR) \ NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ - id NMB_haveCount(TYPE expectedValue) { \ + NMBPredicate *NMB_haveCount(TYPE expectedValue) { \ return NMB_haveCount((EXPR)); \ } \ - NIMBLE_SHORT_OVERLOADED(id haveCount(TYPE expectedValue), \ + NIMBLE_SHORT_OVERLOADED(NMBPredicate *haveCount(TYPE expectedValue), \ NMB_haveCount(expectedValue)); NIMBLE_EXPORT NIMBLE_OVERLOADABLE - id NMB_haveCount(id expectedValue); + NMBPredicate *NMB_haveCount(id expectedValue); - NIMBLE_SHORT_OVERLOADED(id haveCount(id expectedValue), + NIMBLE_SHORT_OVERLOADED(NMBPredicate *haveCount(id expectedValue), NMB_haveCount(expectedValue)); DEFINE_OVERLOAD(long, @(expectedValue)) @@ -127,14 +127,14 @@ NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(void), NSStrin #define DEFINE_OVERLOAD(TYPE, EXPR) \ NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ - NMBObjCBeCloseToMatcher *NMB_beCloseTo(TYPE expectedValue) { \ + NMBObjCBeCloseToPredicate *NMB_beCloseTo(TYPE expectedValue) { \ return NMB_beCloseTo((NSNumber *)(EXPR)); \ } \ - NIMBLE_SHORT_OVERLOADED(NMBObjCBeCloseToMatcher *beCloseTo(TYPE expectedValue), \ + NIMBLE_SHORT_OVERLOADED(NMBObjCBeCloseToPredicate *beCloseTo(TYPE expectedValue), \ NMB_beCloseTo(expectedValue)); - NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBObjCBeCloseToMatcher *NMB_beCloseTo(NSNumber *expectedValue); - NIMBLE_SHORT_OVERLOADED(NMBObjCBeCloseToMatcher *beCloseTo(NSNumber *expectedValue), + NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBObjCBeCloseToPredicate *NMB_beCloseTo(NSNumber *expectedValue); + NIMBLE_SHORT_OVERLOADED(NMBObjCBeCloseToPredicate *beCloseTo(NSNumber *expectedValue), NMB_beCloseTo(expectedValue)); // it would be better to only overload float & double, but zero becomes ambigious @@ -152,33 +152,33 @@ NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(void), NSStrin #undef DEFINE_OVERLOAD -NIMBLE_EXPORT id NMB_beAnInstanceOf(Class expectedClass); -NIMBLE_EXPORT_INLINE id beAnInstanceOf(Class expectedClass) { +NIMBLE_EXPORT NMBPredicate *NMB_beAnInstanceOf(Class expectedClass); +NIMBLE_EXPORT_INLINE NMBPredicate *beAnInstanceOf(Class expectedClass) { return NMB_beAnInstanceOf(expectedClass); } -NIMBLE_EXPORT id NMB_beAKindOf(Class expectedClass); -NIMBLE_EXPORT_INLINE id beAKindOf(Class expectedClass) { +NIMBLE_EXPORT NMBPredicate *NMB_beAKindOf(Class expectedClass); +NIMBLE_EXPORT_INLINE NMBPredicate *beAKindOf(Class expectedClass) { return NMB_beAKindOf(expectedClass); } -NIMBLE_EXPORT id NMB_beginWith(id itemElementOrSubstring); -NIMBLE_EXPORT_INLINE id beginWith(id itemElementOrSubstring) { +NIMBLE_EXPORT NMBPredicate *NMB_beginWith(id itemElementOrSubstring); +NIMBLE_EXPORT_INLINE NMBPredicate *beginWith(id itemElementOrSubstring) { return NMB_beginWith(itemElementOrSubstring); } #define DEFINE_OVERLOAD(TYPE, EXPR) \ NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ - id NMB_beGreaterThan(TYPE expectedValue) { \ + NMBPredicate *NMB_beGreaterThan(TYPE expectedValue) { \ return NMB_beGreaterThan((EXPR)); \ } \ - NIMBLE_SHORT_OVERLOADED(id beGreaterThan(TYPE expectedValue), NMB_beGreaterThan(expectedValue)); + NIMBLE_SHORT_OVERLOADED(NMBPredicate *beGreaterThan(TYPE expectedValue), NMB_beGreaterThan(expectedValue)); NIMBLE_EXPORT NIMBLE_OVERLOADABLE - id NMB_beGreaterThan(NSNumber *expectedValue); + NMBPredicate *NMB_beGreaterThan(NSNumber *expectedValue); NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE - id beGreaterThan(NSNumber *expectedValue) { + NMBPredicate *beGreaterThan(NSNumber *expectedValue) { return NMB_beGreaterThan(expectedValue); } @@ -197,17 +197,17 @@ NIMBLE_EXPORT_INLINE id beginWith(id itemElementOrSubstring) { #define DEFINE_OVERLOAD(TYPE, EXPR) \ NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ - id NMB_beGreaterThanOrEqualTo(TYPE expectedValue) { \ + NMBPredicate *NMB_beGreaterThanOrEqualTo(TYPE expectedValue) { \ return NMB_beGreaterThanOrEqualTo((EXPR)); \ } \ - NIMBLE_SHORT_OVERLOADED(id beGreaterThanOrEqualTo(TYPE expectedValue), \ + NIMBLE_SHORT_OVERLOADED(NMBPredicate *beGreaterThanOrEqualTo(TYPE expectedValue), \ NMB_beGreaterThanOrEqualTo(expectedValue)); NIMBLE_EXPORT NIMBLE_OVERLOADABLE - id NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue); + NMBPredicate *NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue); NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE - id beGreaterThanOrEqualTo(NSNumber *expectedValue) { + NMBPredicate *beGreaterThanOrEqualTo(NSNumber *expectedValue) { return NMB_beGreaterThanOrEqualTo(expectedValue); } @@ -225,28 +225,28 @@ NIMBLE_EXPORT_INLINE id beginWith(id itemElementOrSubstring) { #undef DEFINE_OVERLOAD -NIMBLE_EXPORT id NMB_beIdenticalTo(id expectedInstance); -NIMBLE_SHORT(id beIdenticalTo(id expectedInstance), +NIMBLE_EXPORT NMBPredicate *NMB_beIdenticalTo(id expectedInstance); +NIMBLE_SHORT(NMBPredicate *beIdenticalTo(id expectedInstance), NMB_beIdenticalTo(expectedInstance)); -NIMBLE_EXPORT id NMB_be(id expectedInstance); -NIMBLE_SHORT(id be(id expectedInstance), +NIMBLE_EXPORT NMBPredicate *NMB_be(id expectedInstance); +NIMBLE_SHORT(NMBPredicate *be(id expectedInstance), NMB_be(expectedInstance)); #define DEFINE_OVERLOAD(TYPE, EXPR) \ NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ - id NMB_beLessThan(TYPE expectedValue) { \ + NMBPredicate *NMB_beLessThan(TYPE expectedValue) { \ return NMB_beLessThan((EXPR)); \ } \ - NIMBLE_SHORT_OVERLOADED(id beLessThan(TYPE expectedValue), \ + NIMBLE_SHORT_OVERLOADED(NMBPredicate *beLessThan(TYPE expectedValue), \ NMB_beLessThan(expectedValue)); NIMBLE_EXPORT NIMBLE_OVERLOADABLE - id NMB_beLessThan(NSNumber *expectedValue); + NMBPredicate *NMB_beLessThan(NSNumber *expectedValue); NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE - id beLessThan(NSNumber *expectedValue) { + NMBPredicate *beLessThan(NSNumber *expectedValue) { return NMB_beLessThan(expectedValue); } @@ -266,18 +266,18 @@ NIMBLE_SHORT(id be(id expectedInstance), #define DEFINE_OVERLOAD(TYPE, EXPR) \ NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ - id NMB_beLessThanOrEqualTo(TYPE expectedValue) { \ + NMBPredicate *NMB_beLessThanOrEqualTo(TYPE expectedValue) { \ return NMB_beLessThanOrEqualTo((EXPR)); \ } \ - NIMBLE_SHORT_OVERLOADED(id beLessThanOrEqualTo(TYPE expectedValue), \ + NIMBLE_SHORT_OVERLOADED(NMBPredicate *beLessThanOrEqualTo(TYPE expectedValue), \ NMB_beLessThanOrEqualTo(expectedValue)); NIMBLE_EXPORT NIMBLE_OVERLOADABLE - id NMB_beLessThanOrEqualTo(NSNumber *expectedValue); + NMBPredicate *NMB_beLessThanOrEqualTo(NSNumber *expectedValue); NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE - id beLessThanOrEqualTo(NSNumber *expectedValue) { + NMBPredicate *beLessThanOrEqualTo(NSNumber *expectedValue) { return NMB_beLessThanOrEqualTo(expectedValue); } @@ -294,63 +294,63 @@ NIMBLE_SHORT(id be(id expectedInstance), #undef DEFINE_OVERLOAD -NIMBLE_EXPORT id NMB_beTruthy(void); -NIMBLE_SHORT(id beTruthy(void), +NIMBLE_EXPORT NMBPredicate *NMB_beTruthy(void); +NIMBLE_SHORT(NMBPredicate *beTruthy(void), NMB_beTruthy()); -NIMBLE_EXPORT id NMB_beFalsy(void); -NIMBLE_SHORT(id beFalsy(void), +NIMBLE_EXPORT NMBPredicate *NMB_beFalsy(void); +NIMBLE_SHORT(NMBPredicate *beFalsy(void), NMB_beFalsy()); -NIMBLE_EXPORT id NMB_beTrue(void); -NIMBLE_SHORT(id beTrue(void), +NIMBLE_EXPORT NMBPredicate *NMB_beTrue(void); +NIMBLE_SHORT(NMBPredicate *beTrue(void), NMB_beTrue()); -NIMBLE_EXPORT id NMB_beFalse(void); -NIMBLE_SHORT(id beFalse(void), +NIMBLE_EXPORT NMBPredicate *NMB_beFalse(void); +NIMBLE_SHORT(NMBPredicate *beFalse(void), NMB_beFalse()); -NIMBLE_EXPORT id NMB_beNil(void); -NIMBLE_SHORT(id beNil(void), +NIMBLE_EXPORT NMBPredicate *NMB_beNil(void); +NIMBLE_SHORT(NMBPredicate *beNil(void), NMB_beNil()); -NIMBLE_EXPORT id NMB_beEmpty(void); -NIMBLE_SHORT(id beEmpty(void), +NIMBLE_EXPORT NMBPredicate *NMB_beEmpty(void); +NIMBLE_SHORT(NMBPredicate *beEmpty(void), NMB_beEmpty()); -NIMBLE_EXPORT id NMB_containWithNilTermination(id itemOrSubstring, ...) NS_REQUIRES_NIL_TERMINATION; +NIMBLE_EXPORT NMBPredicate *NMB_containWithNilTermination(id itemOrSubstring, ...) NS_REQUIRES_NIL_TERMINATION; #define NMB_contain(...) NMB_containWithNilTermination(__VA_ARGS__, nil) #ifndef NIMBLE_DISABLE_SHORT_SYNTAX #define contain(...) NMB_contain(__VA_ARGS__) #endif -NIMBLE_EXPORT id NMB_containElementSatisfying(BOOL(^predicate)(id)); -NIMBLE_SHORT(id containElementSatisfying(BOOL(^predicate)(id)), +NIMBLE_EXPORT NMBPredicate *NMB_containElementSatisfying(BOOL(^predicate)(id)); +NIMBLE_SHORT(NMBPredicate *containElementSatisfying(BOOL(^predicate)(id)), NMB_containElementSatisfying(predicate)); -NIMBLE_EXPORT id NMB_endWith(id itemElementOrSubstring); -NIMBLE_SHORT(id endWith(id itemElementOrSubstring), +NIMBLE_EXPORT NMBPredicate *NMB_endWith(id itemElementOrSubstring); +NIMBLE_SHORT(NMBPredicate *endWith(id itemElementOrSubstring), NMB_endWith(itemElementOrSubstring)); -NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException(void); -NIMBLE_SHORT(NMBObjCRaiseExceptionMatcher *raiseException(void), +NIMBLE_EXPORT NMBObjCRaiseExceptionPredicate *NMB_raiseException(void); +NIMBLE_SHORT(NMBObjCRaiseExceptionPredicate *raiseException(void), NMB_raiseException()); -NIMBLE_EXPORT id NMB_match(id expectedValue); -NIMBLE_SHORT(id match(id expectedValue), +NIMBLE_EXPORT NMBPredicate *NMB_match(id expectedValue); +NIMBLE_SHORT(NMBPredicate *match(id expectedValue), NMB_match(expectedValue)); -NIMBLE_EXPORT id NMB_allPass(id matcher); -NIMBLE_SHORT(id allPass(id matcher), +NIMBLE_EXPORT NMBPredicate *NMB_allPass(id matcher); +NIMBLE_SHORT(NMBPredicate *allPass(id matcher), NMB_allPass(matcher)); -NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers); +NIMBLE_EXPORT NMBPredicate *NMB_satisfyAnyOfWithMatchers(id matchers); #define NMB_satisfyAnyOf(...) NMB_satisfyAnyOfWithMatchers(@[__VA_ARGS__]) #ifndef NIMBLE_DISABLE_SHORT_SYNTAX #define satisfyAnyOf(...) NMB_satisfyAnyOf(__VA_ARGS__) #endif -NIMBLE_EXPORT id NMB_satisfyAllOfWithMatchers(id matchers); +NIMBLE_EXPORT NMBPredicate *NMB_satisfyAllOfWithMatchers(id matchers); #define NMB_satisfyAllOf(...) NMB_satisfyAllOfWithMatchers(@[__VA_ARGS__]) #ifndef NIMBLE_DISABLE_SHORT_SYNTAX #define satisfyAllOf(...) NMB_satisfyAllOf(__VA_ARGS__) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m index 670415b48..6f7572f1d 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/DSL.m @@ -28,71 +28,71 @@ NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger return [NMBExpectation failWithMessage:msg file:file line:line]; } -NIMBLE_EXPORT id NMB_beAnInstanceOf(Class expectedClass) { - return [NMBObjCMatcher beAnInstanceOfMatcher:expectedClass]; +NIMBLE_EXPORT NMBPredicate *NMB_beAnInstanceOf(Class expectedClass) { + return [NMBPredicate beAnInstanceOfMatcher:expectedClass]; } -NIMBLE_EXPORT id NMB_beAKindOf(Class expectedClass) { - return [NMBObjCMatcher beAKindOfMatcher:expectedClass]; +NIMBLE_EXPORT NMBPredicate *NMB_beAKindOf(Class expectedClass) { + return [NMBPredicate beAKindOfMatcher:expectedClass]; } -NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBObjCBeCloseToMatcher *NMB_beCloseTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beCloseToMatcher:expectedValue within:0.001]; +NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBObjCBeCloseToPredicate *NMB_beCloseTo(NSNumber *expectedValue) { + return [NMBPredicate beCloseToMatcher:expectedValue within:0.001]; } -NIMBLE_EXPORT id NMB_beginWith(id itemElementOrSubstring) { - return [NMBObjCMatcher beginWithMatcher:itemElementOrSubstring]; +NIMBLE_EXPORT NMBPredicate *NMB_beginWith(id itemElementOrSubstring) { + return [NMBPredicate beginWithMatcher:itemElementOrSubstring]; } -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThan(NSNumber *expectedValue) { - return [NMBObjCMatcher beGreaterThanMatcher:expectedValue]; +NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBPredicate *NMB_beGreaterThan(NSNumber *expectedValue) { + return [NMBPredicate beGreaterThanMatcher:expectedValue]; } -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beGreaterThanOrEqualToMatcher:expectedValue]; +NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBPredicate *NMB_beGreaterThanOrEqualTo(NSNumber *expectedValue) { + return [NMBPredicate beGreaterThanOrEqualToMatcher:expectedValue]; } -NIMBLE_EXPORT id NMB_beIdenticalTo(id expectedInstance) { - return [NMBObjCMatcher beIdenticalToMatcher:expectedInstance]; +NIMBLE_EXPORT NMBPredicate *NMB_beIdenticalTo(id expectedInstance) { + return [NMBPredicate beIdenticalToMatcher:expectedInstance]; } -NIMBLE_EXPORT id NMB_be(id expectedInstance) { - return [NMBObjCMatcher beIdenticalToMatcher:expectedInstance]; +NIMBLE_EXPORT NMBPredicate *NMB_be(id expectedInstance) { + return [NMBPredicate beIdenticalToMatcher:expectedInstance]; } -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThan(NSNumber *expectedValue) { - return [NMBObjCMatcher beLessThanMatcher:expectedValue]; +NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBPredicate *NMB_beLessThan(NSNumber *expectedValue) { + return [NMBPredicate beLessThanMatcher:expectedValue]; } -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_beLessThanOrEqualTo(NSNumber *expectedValue) { - return [NMBObjCMatcher beLessThanOrEqualToMatcher:expectedValue]; +NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBPredicate *NMB_beLessThanOrEqualTo(NSNumber *expectedValue) { + return [NMBPredicate beLessThanOrEqualToMatcher:expectedValue]; } -NIMBLE_EXPORT id NMB_beTruthy() { - return [NMBObjCMatcher beTruthyMatcher]; +NIMBLE_EXPORT NMBPredicate *NMB_beTruthy() { + return [NMBPredicate beTruthyMatcher]; } -NIMBLE_EXPORT id NMB_beFalsy() { - return [NMBObjCMatcher beFalsyMatcher]; +NIMBLE_EXPORT NMBPredicate *NMB_beFalsy() { + return [NMBPredicate beFalsyMatcher]; } -NIMBLE_EXPORT id NMB_beTrue() { - return [NMBObjCMatcher beTrueMatcher]; +NIMBLE_EXPORT NMBPredicate *NMB_beTrue() { + return [NMBPredicate beTrueMatcher]; } -NIMBLE_EXPORT id NMB_beFalse() { - return [NMBObjCMatcher beFalseMatcher]; +NIMBLE_EXPORT NMBPredicate *NMB_beFalse() { + return [NMBPredicate beFalseMatcher]; } -NIMBLE_EXPORT id NMB_beNil() { - return [NMBObjCMatcher beNilMatcher]; +NIMBLE_EXPORT NMBPredicate *NMB_beNil() { + return [NMBPredicate beNilMatcher]; } -NIMBLE_EXPORT id NMB_beEmpty() { - return [NMBObjCMatcher beEmptyMatcher]; +NIMBLE_EXPORT NMBPredicate *NMB_beEmpty() { + return [NMBPredicate beEmptyMatcher]; } -NIMBLE_EXPORT id NMB_containWithNilTermination(id itemOrSubstring, ...) { +NIMBLE_EXPORT NMBPredicate *NMB_containWithNilTermination(id itemOrSubstring, ...) { NSMutableArray *itemOrSubstringArray = [NSMutableArray array]; if (itemOrSubstring) { @@ -107,43 +107,43 @@ NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger va_end(args); } - return [NMBObjCMatcher containMatcher:itemOrSubstringArray]; + return [NMBPredicate containMatcher:itemOrSubstringArray]; } -NIMBLE_EXPORT id NMB_containElementSatisfying(BOOL(^predicate)(id)) { - return [NMBObjCMatcher containElementSatisfyingMatcher:predicate]; +NIMBLE_EXPORT NMBPredicate *NMB_containElementSatisfying(BOOL(^predicate)(id)) { + return [NMBPredicate containElementSatisfyingMatcher:predicate]; } -NIMBLE_EXPORT id NMB_endWith(id itemElementOrSubstring) { - return [NMBObjCMatcher endWithMatcher:itemElementOrSubstring]; +NIMBLE_EXPORT NMBPredicate *NMB_endWith(id itemElementOrSubstring) { + return [NMBPredicate endWithMatcher:itemElementOrSubstring]; } -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_equal(__nullable id expectedValue) { - return [NMBObjCMatcher equalMatcher:expectedValue]; +NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBPredicate *NMB_equal(__nullable id expectedValue) { + return [NMBPredicate equalMatcher:expectedValue]; } -NIMBLE_EXPORT NIMBLE_OVERLOADABLE id NMB_haveCount(id expectedValue) { - return [NMBObjCMatcher haveCountMatcher:expectedValue]; +NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBPredicate *NMB_haveCount(id expectedValue) { + return [NMBPredicate haveCountMatcher:expectedValue]; } -NIMBLE_EXPORT id NMB_match(id expectedValue) { - return [NMBObjCMatcher matchMatcher:expectedValue]; +NIMBLE_EXPORT NMBPredicate *NMB_match(id expectedValue) { + return [NMBPredicate matchMatcher:expectedValue]; } -NIMBLE_EXPORT id NMB_allPass(id expectedValue) { - return [NMBObjCMatcher allPassMatcher:expectedValue]; +NIMBLE_EXPORT NMBPredicate *NMB_allPass(id expectedValue) { + return [NMBPredicate allPassMatcher:expectedValue]; } -NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers) { - return [NMBObjCMatcher satisfyAnyOfMatcher:matchers]; +NIMBLE_EXPORT NMBPredicate *NMB_satisfyAnyOfWithMatchers(id matchers) { + return [NMBPredicate satisfyAnyOfMatcher:matchers]; } -NIMBLE_EXPORT id NMB_satisfyAllOfWithMatchers(id matchers) { - return [NMBObjCMatcher satisfyAllOfMatcher:matchers]; +NIMBLE_EXPORT NMBPredicate *NMB_satisfyAllOfWithMatchers(id matchers) { + return [NMBPredicate satisfyAllOfMatcher:matchers]; } -NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException() { - return [NMBObjCMatcher raiseExceptionMatcher]; +NIMBLE_EXPORT NMBObjCRaiseExceptionPredicate *NMB_raiseException() { + return [NMBPredicate raiseExceptionMatcher]; } NIMBLE_EXPORT NMBWaitUntilTimeoutBlock NMB_waitUntilTimeoutBuilder(NSString *file, NSUInteger line) { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m index fa5030a70..8cf733491 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m @@ -1,5 +1,4 @@ #import -#import #if __has_include("Nimble-Swift.h") #import "Nimble-Swift.h" @@ -7,77 +6,7 @@ #import #endif -#pragma mark - Method Swizzling - -/// Swaps the implementations between two instance methods. -/// -/// @param class The class containing `originalSelector`. -/// @param originalSelector Original method to replace. -/// @param replacementSelector Replacement method. -void swizzleSelectors(Class class, SEL originalSelector, SEL replacementSelector) { - Method originalMethod = class_getInstanceMethod(class, originalSelector); - Method replacementMethod = class_getInstanceMethod(class, replacementSelector); - - BOOL didAddMethod = - class_addMethod(class, - originalSelector, - method_getImplementation(replacementMethod), - method_getTypeEncoding(replacementMethod)); - - if (didAddMethod) { - class_replaceMethod(class, - replacementSelector, - method_getImplementation(originalMethod), - method_getTypeEncoding(originalMethod)); - } else { - method_exchangeImplementations(originalMethod, replacementMethod); - } -} - -#pragma mark - Private - -@interface XCTestObservationCenter (Private) -- (void)_addLegacyTestObserver:(id)observer; -@end - -@implementation XCTestObservationCenter (Register) - -/// Uses objc method swizzling to register `CurrentTestCaseTracker` as a test observer. This is necessary -/// because Xcode 7.3 introduced timing issues where if a custom `XCTestObservation` is registered too early -/// it suppresses all console output (generated by `XCTestLog`), breaking any tools that depend on this output. -/// This approach waits to register our custom test observer until XCTest adds its first "legacy" observer, -/// falling back to registering after the first normal observer if this private method ever changes. -+ (void)load { - if (class_getInstanceMethod([self class], @selector(_addLegacyTestObserver:))) { - // Swizzle -_addLegacyTestObserver: - swizzleSelectors([self class], @selector(_addLegacyTestObserver:), @selector(NMB_original__addLegacyTestObserver:)); - } else { - // Swizzle -addTestObserver:, only if -_addLegacyTestObserver: is not implemented - swizzleSelectors([self class], @selector(addTestObserver:), @selector(NMB_original_addTestObserver:)); - } +__attribute__((constructor)) +static void registerCurrentTestCaseTracker(void) { + [[XCTestObservationCenter sharedTestObservationCenter] addTestObserver:[CurrentTestCaseTracker sharedInstance]]; } - -#pragma mark - Replacement Methods - -/// Registers `CurrentTestCaseTracker` as a test observer after `XCTestLog` has been added. -- (void)NMB_original__addLegacyTestObserver:(id)observer { - [self NMB_original__addLegacyTestObserver:observer]; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [self addTestObserver:[CurrentTestCaseTracker sharedInstance]]; - }); -} - -/// Registers `CurrentTestCaseTracker` as a test observer after `XCTestLog` has been added. -/// This method is only used if `-_addLegacyTestObserver:` is not impelemented. (added in Xcode 7.3) -- (void)NMB_original_addTestObserver:(id)observer { - [self NMB_original_addTestObserver:observer]; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [self NMB_original_addTestObserver:[CurrentTestCaseTracker sharedInstance]]; - }); -} - -@end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift index 307412e5a..e51763835 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/AsynchronousTest.swift @@ -1,9 +1,10 @@ import Dispatch +import CoreFoundation import Foundation import XCTest import Nimble -final class AsyncTest: XCTestCase, XCTestCaseProvider { +final class AsyncTest: XCTestCase { class Error: Swift.Error {} let errorToThrow = Error() @@ -37,9 +38,9 @@ final class AsyncTest: XCTestCase, XCTestCaseProvider { } func testToEventuallyWithCustomDefaultTimeout() { - AsyncDefaults.Timeout = 2 + AsyncDefaults.timeout = .seconds(2) defer { - AsyncDefaults.Timeout = 1 + AsyncDefaults.timeout = .seconds(1) } var value = 0 @@ -61,9 +62,9 @@ final class AsyncTest: XCTestCase, XCTestCaseProvider { } func testWaitUntilWithCustomDefaultsTimeout() { - AsyncDefaults.Timeout = 3 + AsyncDefaults.timeout = .seconds(3) defer { - AsyncDefaults.Timeout = 1 + AsyncDefaults.timeout = .seconds(1) } waitUntil { done in Thread.sleep(forTimeInterval: 2.8) @@ -84,14 +85,14 @@ final class AsyncTest: XCTestCase, XCTestCaseProvider { func testWaitUntilTimesOutIfNotCalled() { failsWithErrorMessage("Waited more than 1.0 second") { - waitUntil(timeout: 1) { _ in return } + waitUntil(timeout: .seconds(1)) { _ in return } } } func testWaitUntilTimesOutWhenExceedingItsTime() { var waiting = true failsWithErrorMessage("Waited more than 0.01 seconds") { - waitUntil(timeout: 0.01) { done in + waitUntil(timeout: .milliseconds(10)) { done in let asyncOperation: () -> Void = { Thread.sleep(forTimeInterval: 0.1) done() @@ -120,7 +121,7 @@ final class AsyncTest: XCTestCase, XCTestCaseProvider { func testWaitUntilDetectsStalledMainThreadActivity() { let msg = "-waitUntil() timed out but was unable to run the timeout handler because the main thread is unresponsive (0.5 seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." failsWithErrorMessage(msg) { - waitUntil(timeout: 1) { done in + waitUntil(timeout: .seconds(1)) { done in Thread.sleep(forTimeInterval: 3.0) done() } @@ -141,7 +142,7 @@ final class AsyncTest: XCTestCase, XCTestCaseProvider { is currently managing the main run loop. """ failsWithErrorMessage(msg) { // reference line - waitUntil(timeout: 2.0) { done in + waitUntil(timeout: .seconds(2)) { done in var protected: Int = 0 DispatchQueue.main.async { protected = 1 @@ -165,6 +166,39 @@ final class AsyncTest: XCTestCase, XCTestCaseProvider { } } + func testWaitUntilDoesNotCompleteBeforeRunLoopIsWaiting() { + // This verifies the fix for a race condition in which `done()` is + // called asynchronously on a background thread after the main thread checks + // for completion, but prior to `RunLoop.current.run(mode:before:)` being called. + // This race condition resulted in the RunLoop locking up. + var failed = false + + let timeoutQueue = DispatchQueue(label: "Nimble.waitUntilTest.timeout", qos: .background) + let timer = DispatchSource.makeTimerSource(flags: .strict, queue: timeoutQueue) + timer.schedule( + deadline: DispatchTime.now() + 5, + repeating: .never, + leeway: .milliseconds(1) + ) + timer.setEventHandler { + failed = true + fail("Timed out: Main RunLoop stalled.") + CFRunLoopStop(CFRunLoopGetMain()) + } + timer.resume() + + for index in 0..<100 { + if failed { break } + waitUntil(line: UInt(index)) { done in + DispatchQueue(label: "Nimble.waitUntilTest.\(index)").async { + done() + } + } + } + + timer.cancel() + } + func testWaitUntilMustBeInMainThread() { #if !SWIFT_PACKAGE var executedAsyncBlock: Bool = false @@ -203,11 +237,11 @@ final class AsyncTest: XCTestCase, XCTestCaseProvider { var subject: ClassUnderTest? = ClassUnderTest() if let sub = subject { - expect(sub.count).toEventually(equal(0), timeout: 0.1) - expect(sub.count).toEventuallyNot(equal(1), timeout: 0.1) + expect(sub.count).toEventually(equal(0), timeout: .milliseconds(100)) + expect(sub.count).toEventuallyNot(equal(1), timeout: .milliseconds(100)) } - waitUntil(timeout: 0.5) { done in + waitUntil(timeout: .milliseconds(500)) { done in subject?.deinitCalled = { done() } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift deleted file mode 100644 index 08567fd78..000000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Helpers/XCTestCaseProvider.swift +++ /dev/null @@ -1,62 +0,0 @@ -import Foundation -import XCTest - -// XCTestCaseProvider should be adopted by all XCTestCase subclasses. It provides a -// mechanism for us to fail tests in Xcode which haven't been included in the `allTests` -// list for swift-corelibs-xctest which is unable to dynamically discover tests. Note -// that only `static var __allTests` needs to be explicitly implemented, as `allTestNames` -// has a default implementation provided by a protocol extension. - -// Implementation note: This is broken down into two separate protocols because we need a -// protocol with no Self references to which we can cast XCTestCase instances in a non-generic context. - -public protocol XCTestCaseProviderStatic { - // This should be explicitly implemented by XCTestCase subclasses - static var __allTests: [(String, (Self) -> () -> ())] { get } -} - -public protocol XCTestCaseNameProvider { - // This does not need to be explicitly implemented because of the protocol extension below - var allTestNames: [String] { get } -} - -#if os(macOS) -public protocol XCTestCaseProvider: XCTestCaseProviderStatic, XCTestCaseNameProvider {} - -extension XCTestCaseProvider { - var allTestNames: [String] { - return type(of: self).__allTests.map({ name, _ in - return name - }) - } -} -#else -public protocol XCTestCaseProvider {} -#endif - -#if os(macOS) - -extension XCTestCase { - override open func tearDown() { - if let provider = self as? XCTestCaseNameProvider { - provider.assertContainsTest(invocation!.selector.description) - } - - super.tearDown() - } -} - -extension XCTestCaseNameProvider { - fileprivate func assertContainsTest(_ name: String) { - let contains = self.allTestNames.contains(name) - XCTAssert( - contains, - """ - Test '\(name)' is missing from the __allTests array. - Please run `$ swift test --generate-linuxmain` to update the manifests. - """ - ) - } -} - -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift index 683121c9b..17a330f95 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/AllPassTest.swift @@ -42,7 +42,7 @@ extension Optional where Wrapped: Comparable { } } -final class AllPassTest: XCTestCase, XCTestCaseProvider { +final class AllPassTest: XCTestCase { func testAllPassArray() { expect([1, 2, 3, 4]).to(allPass({$0 < 5})) expect([1, 2, 3, 4]).toNot(allPass({$0 > 5})) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift index 00a35ff08..5628ec3b5 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAKindOfTest.swift @@ -7,7 +7,7 @@ private protocol TestProtocol {} private class TestClassConformingToProtocol: TestProtocol {} private struct TestStructConformingToProtocol: TestProtocol {} -final class BeAKindOfSwiftTest: XCTestCase, XCTestCaseProvider { +final class BeAKindOfSwiftTest: XCTestCase { enum TestEnum { case one, two } @@ -47,29 +47,31 @@ final class BeAKindOfSwiftTest: XCTestCase, XCTestCaseProvider { } } -final class BeAKindOfObjCTest: XCTestCase, XCTestCaseProvider { +final class BeAKindOfObjCTest: XCTestCase { func testPositiveMatch() { -#if canImport(Darwin) expect(TestNull()).to(beAKindOf(NSNull.self)) expect(NSObject()).to(beAKindOf(NSObject.self)) - expect(NSNumber(value: 1)).toNot(beAKindOf(NSDate.self)) -#endif + expect(1 as NSNumber).toNot(beAKindOf(NSDate.self)) } func testFailureMessages() { -#if canImport(Darwin) failsWithErrorMessageForNil("expected to not be a kind of NSNull, got ") { expect(nil as NSNull?).toNot(beAKindOf(NSNull.self)) } failsWithErrorMessageForNil("expected to be a kind of NSString, got ") { expect(nil as NSString?).to(beAKindOf(NSString.self)) } - failsWithErrorMessage("expected to be a kind of NSString, got <__NSCFNumber instance>") { - expect(NSNumber(value: 1)).to(beAKindOf(NSString.self)) + + #if canImport(Darwin) + let numberTypeName = "__NSCFNumber" + #else + let numberTypeName = "NSNumber" + #endif + failsWithErrorMessage("expected to be a kind of NSString, got <\(numberTypeName) instance>") { + expect(1 as NSNumber).to(beAKindOf(NSString.self)) } - failsWithErrorMessage("expected to not be a kind of NSNumber, got <__NSCFNumber instance>") { - expect(NSNumber(value: 1)).toNot(beAKindOf(NSNumber.self)) + failsWithErrorMessage("expected to not be a kind of NSNumber, got <\(numberTypeName) instance>") { + expect(1 as NSNumber).toNot(beAKindOf(NSNumber.self)) } -#endif } } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift index 0d379a20f..1648fa552 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeAnInstanceOfTest.swift @@ -6,10 +6,10 @@ private protocol TestProtocol {} private class TestClassConformingToProtocol: TestProtocol {} private struct TestStructConformingToProtocol: TestProtocol {} -final class BeAnInstanceOfTest: XCTestCase, XCTestCaseProvider { +final class BeAnInstanceOfTest: XCTestCase { func testPositiveMatch() { expect(NSNull()).to(beAnInstanceOf(NSNull.self)) - expect(NSNumber(value: 1)).toNot(beAnInstanceOf(NSDate.self)) + expect(1 as NSNumber).toNot(beAnInstanceOf(NSDate.self)) } enum TestEnum { @@ -40,16 +40,17 @@ final class BeAnInstanceOfTest: XCTestCase, XCTestCaseProvider { failsWithErrorMessageForNil("expected to be an instance of NSString, got ") { expect(nil as NSString?).to(beAnInstanceOf(NSString.self)) } -#if canImport(Darwin) + + #if canImport(Darwin) let numberTypeName = "__NSCFNumber" -#else + #else let numberTypeName = "NSNumber" -#endif + #endif failsWithErrorMessage("expected to be an instance of NSString, got <\(numberTypeName) instance>") { - expect(NSNumber(value: 1)).to(beAnInstanceOf(NSString.self)) + expect(1 as NSNumber).to(beAnInstanceOf(NSString.self)) } failsWithErrorMessage("expected to not be an instance of \(numberTypeName), got <\(numberTypeName) instance>") { - expect(NSNumber(value: 1)).toNot(beAnInstanceOf(type(of: NSNumber(value: 1)))) + expect(1 as NSNumber).toNot(beAnInstanceOf(type(of: 1 as NSNumber))) } } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift index f724be661..bfc14c2bc 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeCloseToTest.swift @@ -2,7 +2,7 @@ import Foundation import XCTest import Nimble -final class BeCloseToTest: XCTestCase, XCTestCaseProvider { +final class BeCloseToTest: XCTestCase { func testBeCloseTo() { expect(1.2).to(beCloseTo(1.2001)) expect(1.2 as CDouble).to(beCloseTo(1.2001)) @@ -22,12 +22,12 @@ final class BeCloseToTest: XCTestCase, XCTestCaseProvider { } func testBeCloseToWithNSNumber() { - expect(NSNumber(value: 1.2)).to(beCloseTo(9.300, within: 10)) - expect(NSNumber(value: 1.2)).to(beCloseTo(NSNumber(value: 9.300), within: 10)) - expect(1.2).to(beCloseTo(NSNumber(value: 9.300), within: 10)) + expect(1.2 as NSNumber).to(beCloseTo(9.300, within: 10)) + expect(1.2 as NSNumber).to(beCloseTo(9.300 as NSNumber, within: 10)) + expect(1.2).to(beCloseTo(9.300 as NSNumber, within: 10)) failsWithErrorMessage("expected to not be close to <1.2001> (within 1.1), got <1.2>") { - expect(NSNumber(value: 1.2)).toNot(beCloseTo(1.2001, within: 1.1)) + expect(1.2 as NSNumber).toNot(beCloseTo(1.2001, within: 1.1)) } } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift index fa6f9d784..c769883c1 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeEmptyTest.swift @@ -2,7 +2,7 @@ import Foundation import XCTest import Nimble -final class BeEmptyTest: XCTestCase, XCTestCaseProvider { +final class BeEmptyTest: XCTestCase { func testBeEmptyPositive() { expect([] as [Int]).to(beEmpty()) expect([1]).toNot(beEmpty()) @@ -13,27 +13,23 @@ final class BeEmptyTest: XCTestCase, XCTestCaseProvider { expect([] as Set).to(beEmpty()) expect([1] as Set).toNot(beEmpty()) -#if canImport(Darwin) expect(NSDictionary() as? [Int: Int]).to(beEmpty()) - expect(NSDictionary(object: 1, forKey: 1 as NSNumber) as? [Int: Int]).toNot(beEmpty()) -#endif + expect(([1: 1] as NSDictionary) as? [Int: Int]).toNot(beEmpty()) expect([Int: Int]()).to(beEmpty()) expect(["hi": 1]).toNot(beEmpty()) -#if canImport(Darwin) expect(NSArray() as? [Int]).to(beEmpty()) - expect(NSArray(array: [1]) as? [Int]).toNot(beEmpty()) -#endif + expect(([1] as NSArray) as? [Int]).toNot(beEmpty()) expect(NSSet()).to(beEmpty()) - expect(NSSet(array: [NSNumber(value: 1)])).toNot(beEmpty()) + expect(NSSet(array: [1 as NSNumber])).toNot(beEmpty()) expect(NSIndexSet()).to(beEmpty()) expect(NSIndexSet(index: 1)).toNot(beEmpty()) expect(NSString()).to(beEmpty()) - expect(NSString(string: "hello")).toNot(beEmpty()) + expect("hello" as NSString).toNot(beEmpty()) expect("").to(beEmpty()) expect("foo").toNot(beEmpty()) @@ -57,14 +53,12 @@ final class BeEmptyTest: XCTestCase, XCTestCaseProvider { expect([1] as Set).to(beEmpty()) } -#if canImport(Darwin) failsWithErrorMessage("expected to not be empty, got <{()}>") { expect(NSSet()).toNot(beEmpty()) } failsWithErrorMessage("expected to be empty, got <{(1)}>") { - expect(NSSet(object: NSNumber(value: 1))).to(beEmpty()) + expect(NSSet(object: 1 as NSNumber)).to(beEmpty()) } -#endif failsWithErrorMessage("expected to not be empty, got <()>") { expect(NSIndexSet()).toNot(beEmpty()) @@ -89,6 +83,13 @@ final class BeEmptyTest: XCTestCase, XCTestCaseProvider { } func testNilMatches() { + failsWithErrorMessageForNil("expected to be empty, got ") { + expect(nil as String?).to(beEmpty()) + } + failsWithErrorMessageForNil("expected to not be empty, got ") { + expect(nil as String?).toNot(beEmpty()) + } + failsWithErrorMessageForNil("expected to be empty, got ") { expect(nil as NSString?).to(beEmpty()) } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift index 9ac561ffd..d2cabdd09 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift @@ -2,14 +2,14 @@ import Foundation import XCTest import Nimble -final class BeGreaterThanOrEqualToTest: XCTestCase, XCTestCaseProvider { +final class BeGreaterThanOrEqualToTest: XCTestCase { func testGreaterThanOrEqualTo() { expect(10).to(beGreaterThanOrEqualTo(10)) expect(10).to(beGreaterThanOrEqualTo(2)) expect(1).toNot(beGreaterThanOrEqualTo(2)) - expect(NSNumber(value: 1)).toNot(beGreaterThanOrEqualTo(2)) - expect(NSNumber(value: 2)).to(beGreaterThanOrEqualTo(NSNumber(value: 2))) - expect(1).to(beGreaterThanOrEqualTo(NSNumber(value: 0))) + expect(1 as NSNumber).toNot(beGreaterThanOrEqualTo(2)) + expect(2 as NSNumber).to(beGreaterThanOrEqualTo(2 as NSNumber)) + expect(1).to(beGreaterThanOrEqualTo(0 as NSNumber)) failsWithErrorMessage("expected to be greater than or equal to <2>, got <0>") { expect(0).to(beGreaterThanOrEqualTo(2)) @@ -30,8 +30,8 @@ final class BeGreaterThanOrEqualToTest: XCTestCase, XCTestCaseProvider { func testGreaterThanOrEqualToOperator() { expect(0) >= 0 expect(1) >= 0 - expect(NSNumber(value: 1)) >= 1 - expect(NSNumber(value: 1)) >= NSNumber(value: 1) + expect(1 as NSNumber) >= 1 + expect(1 as NSNumber) >= 1 as NSNumber expect(2.5) >= 2.5 expect(2.5) >= 2 expect(Float(2.5)) >= Float(2.5) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift index 3d742f477..7278dc85a 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeGreaterThanTest.swift @@ -2,16 +2,12 @@ import Foundation import XCTest import Nimble -final class BeGreaterThanTest: XCTestCase, XCTestCaseProvider { +final class BeGreaterThanTest: XCTestCase { func testGreaterThan() { expect(10).to(beGreaterThan(2)) expect(1).toNot(beGreaterThan(2)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value: 3)).to(beGreaterThan(2)) -#else - expect(NSNumber(value: 3)).to(beGreaterThan(2 as NSNumber)) -#endif - expect(NSNumber(value: 1)).toNot(beGreaterThan(NSNumber(value: 2))) + expect(3 as NSNumber).to(beGreaterThan(2 as NSNumber)) + expect(1 as NSNumber).toNot(beGreaterThan(2 as NSNumber)) failsWithErrorMessage("expected to be greater than <2>, got <0>") { expect(0).to(beGreaterThan(2)) @@ -29,12 +25,8 @@ final class BeGreaterThanTest: XCTestCase, XCTestCaseProvider { func testGreaterThanOperator() { expect(1) > 0 - expect(NSNumber(value: 1)) > NSNumber(value: 0) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value: 1)) > 0 -#else - expect(NSNumber(value: 1)) > 0 as NSNumber -#endif + expect(1 as NSNumber) > 0 as NSNumber + expect(1 as NSNumber) > 0 as NSNumber expect(2.5) > 1.5 expect(Float(2.5)) > Float(1.5) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift index b1155fb70..1f705bf42 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToObjectTest.swift @@ -2,7 +2,7 @@ import Foundation import XCTest import Nimble -final class BeIdenticalToObjectTest: XCTestCase, XCTestCaseProvider { +final class BeIdenticalToObjectTest: XCTestCase { private class BeIdenticalToObjectTester {} private let testObjectA = BeIdenticalToObjectTester() private let testObjectB = BeIdenticalToObjectTester() diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift index 80d40e78e..54ae6f409 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeIdenticalToTest.swift @@ -2,20 +2,20 @@ import Foundation import XCTest @testable import Nimble -final class BeIdenticalToTest: XCTestCase, XCTestCaseProvider { +final class BeIdenticalToTest: XCTestCase { func testBeIdenticalToPositive() { let value = NSDate() expect(value).to(beIdenticalTo(value)) } func testBeIdenticalToNegative() { - expect(NSNumber(value: 1)).toNot(beIdenticalTo(NSString(string: "yo"))) - expect(NSArray(array: [NSNumber(value: 1)])).toNot(beIdenticalTo(NSArray(array: [NSNumber(value: 1)]))) + expect(1 as NSNumber).toNot(beIdenticalTo("yo" as NSString)) + expect([1 as NSNumber] as NSArray).toNot(beIdenticalTo([1 as NSNumber] as NSArray)) } func testBeIdenticalToPositiveMessage() { - let num1 = NSNumber(value: 1) - let num2 = NSNumber(value: 2) + let num1 = 1 as NSNumber + let num2 = 2 as NSNumber let message = "expected to be identical to \(identityAsString(num2)), got \(identityAsString(num1))" failsWithErrorMessage(message) { expect(num1).to(beIdenticalTo(num2)) @@ -23,7 +23,7 @@ final class BeIdenticalToTest: XCTestCase, XCTestCaseProvider { } func testBeIdenticalToNegativeMessage() { - let value1 = NSArray(array: []) + let value1 = NSArray() let value2 = value1 let message = "expected to not be identical to \(identityAsString(value2)), got \(identityAsString(value1))" failsWithErrorMessage(message) { @@ -34,20 +34,17 @@ final class BeIdenticalToTest: XCTestCase, XCTestCaseProvider { func testOperators() { let value = NSDate() expect(value) === value - expect(NSNumber(value: 1)) !== NSNumber(value: 2) + expect(1 as NSNumber) !== 2 as NSNumber } func testBeAlias() { let value = NSDate() expect(value).to(be(value)) - expect(NSNumber(value: 1)).toNot(be(NSString(string: "turtles"))) - #if canImport(Darwin) - expect([1]).toNot(be([1])) - #else - expect(NSArray(array: [NSNumber(value: 1)])).toNot(beIdenticalTo(NSArray(array: [NSNumber(value: 1)]))) - #endif + expect(1 as NSNumber).toNot(be("turtles" as NSString)) + expect([1]).toNot(be([1])) + expect([1 as NSNumber] as NSArray).toNot(be([1 as NSNumber] as NSArray)) - let value1 = NSArray(array: []) + let value1 = NSArray() let value2 = value1 let message = "expected to not be identical to \(identityAsString(value1)), got \(identityAsString(value2))" failsWithErrorMessage(message) { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift index dd8120d3a..78b37f445 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift @@ -2,16 +2,16 @@ import Foundation import XCTest import Nimble -final class BeLessThanOrEqualToTest: XCTestCase, XCTestCaseProvider { +final class BeLessThanOrEqualToTest: XCTestCase { func testLessThanOrEqualTo() { expect(10).to(beLessThanOrEqualTo(10)) expect(2).to(beLessThanOrEqualTo(10)) expect(2).toNot(beLessThanOrEqualTo(1)) - expect(NSNumber(value: 2)).to(beLessThanOrEqualTo(10)) - expect(NSNumber(value: 2)).toNot(beLessThanOrEqualTo(1)) - expect(2).to(beLessThanOrEqualTo(NSNumber(value: 10))) - expect(2).toNot(beLessThanOrEqualTo(NSNumber(value: 1))) + expect(2 as NSNumber).to(beLessThanOrEqualTo(10)) + expect(2 as NSNumber).toNot(beLessThanOrEqualTo(1)) + expect(2).to(beLessThanOrEqualTo(10 as NSNumber)) + expect(2).toNot(beLessThanOrEqualTo(1 as NSNumber)) failsWithErrorMessage("expected to be less than or equal to <0>, got <2>") { expect(2).to(beLessThanOrEqualTo(0)) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift index d56023212..e30238ca9 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLessThanTest.swift @@ -2,23 +2,12 @@ import Foundation import XCTest import Nimble -final class BeLessThanTest: XCTestCase, XCTestCaseProvider { +final class BeLessThanTest: XCTestCase { func testLessThan() { expect(2).to(beLessThan(10)) expect(2).toNot(beLessThan(1)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value: 2)).to(beLessThan(10)) - expect(NSNumber(value: 2)).toNot(beLessThan(1)) - - expect(2).to(beLessThan(NSNumber(value: 10))) - expect(2).toNot(beLessThan(NSNumber(value: 1))) -#else - expect(NSNumber(value: 2)).to(beLessThan(10 as NSNumber)) - expect(NSNumber(value: 2)).toNot(beLessThan(1 as NSNumber)) - - expect(2 as NSNumber).to(beLessThan(NSNumber(value: 10))) - expect(2 as NSNumber).toNot(beLessThan(NSNumber(value: 1))) -#endif + expect(2 as NSNumber).to(beLessThan(10 as NSNumber)) + expect(2 as NSNumber).toNot(beLessThan(1 as NSNumber)) failsWithErrorMessage("expected to be less than <0>, got <2>") { expect(2).to(beLessThan(0)) @@ -37,11 +26,7 @@ final class BeLessThanTest: XCTestCase, XCTestCaseProvider { func testLessThanOperator() { expect(0) < 1 -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(NSNumber(value: 0)) < 1 -#else - expect(NSNumber(value: 0)) < 1 as NSNumber -#endif + expect(0 as NSNumber) < 1 as NSNumber failsWithErrorMessage("expected to be less than <1>, got <2>") { expect(2) < 1 return diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift index d9ef8eaca..dfe3bcd1e 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeLogicalTest.swift @@ -29,7 +29,7 @@ enum ConvertsToBool: ExpressibleByBooleanLiteral, CustomStringConvertible { } } -final class BeTruthyTest: XCTestCase, XCTestCaseProvider { +final class BeTruthyTest: XCTestCase { func testShouldMatchNonNilTypes() { expect(true as Bool?).to(beTruthy()) @@ -110,7 +110,7 @@ final class BeTruthyTest: XCTestCase, XCTestCaseProvider { } } -final class BeTrueTest: XCTestCase, XCTestCaseProvider { +final class BeTrueTest: XCTestCase { func testShouldMatchTrue() { expect(true).to(beTrue()) @@ -138,7 +138,7 @@ final class BeTrueTest: XCTestCase, XCTestCaseProvider { } } -final class BeFalsyTest: XCTestCase, XCTestCaseProvider { +final class BeFalsyTest: XCTestCase { func testShouldMatchNilTypes() { expect(false as Bool?).to(beFalsy()) @@ -203,7 +203,7 @@ final class BeFalsyTest: XCTestCase, XCTestCaseProvider { } } -final class BeFalseTest: XCTestCase, XCTestCaseProvider { +final class BeFalseTest: XCTestCase { func testShouldNotMatchTrue() { expect(true).toNot(beFalse()) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift index 9e3711612..df35eeb0a 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeNilTest.swift @@ -1,7 +1,7 @@ import XCTest import Nimble -final class BeNilTest: XCTestCase, XCTestCaseProvider { +final class BeNilTest: XCTestCase { func producesNil() -> [Int]? { return nil } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift index bb5d32434..bea7f4eb6 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeVoidTest.swift @@ -1,7 +1,7 @@ import XCTest import Nimble -final class BeVoidTest: XCTestCase, XCTestCaseProvider { +final class BeVoidTest: XCTestCase { func testBeVoid() { expect(()).to(beVoid()) expect(() as ()?).to(beVoid()) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithPrefixTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithPrefixTest.swift new file mode 100644 index 000000000..e6497907b --- /dev/null +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithPrefixTest.swift @@ -0,0 +1,64 @@ +import Foundation +import Nimble +import XCTest + +final class BeginWithPrefixTest: XCTestCase { + + func testBeginWithSequencePrefix() { + failsWithErrorMessageForNil("expected to begin with , got ") { + expect(nil as [Int]?).to(beginWith(prefix: nil as [Int]?)) + } + + failsWithErrorMessageForNil("expected to begin with <[1, 2]>, got ") { + expect(nil as [Int]?).to(beginWith(prefix: [1, 2])) + } + + failsWithErrorMessageForNil("expected to begin with , got <[1, 2]>") { + expect([1, 2]).to(beginWith(prefix: nil as [Int]?)) + } + + let sequence = [1, 2, 3] + expect(sequence).toNot(beginWith(prefix: [1, 2, 3, 4])) + expect(sequence).toNot(beginWith(prefix: [2, 3])) + + expect(sequence).to(beginWith(prefix: [1, 2, 3])) + expect(sequence).to(beginWith(prefix: [1, 2])) + expect(sequence).to(beginWith(prefix: [])) + + expect([]).toNot(beginWith(prefix: [1])) + expect([]).to(beginWith(prefix: [] as [Int])) + } + + func testBeginWithSequencePrefixUsingPredicateClosure() { + failsWithErrorMessageForNil("expected to begin with , got ") { + expect(nil as [Int]?).to(beginWith(prefix: nil as [Int]?, by: { $0 == $1 })) + } + + failsWithErrorMessageForNil("expected to begin with <[1, 2]>, got ") { + expect(nil as [Int]?).to(beginWith(prefix: [1, 2], by: { $0 == $1 })) + } + + failsWithErrorMessageForNil("expected to begin with , got <[1, 2]>") { + expect([1, 2]).to(beginWith(prefix: nil as [Int]?, by: { $0 == $1 })) + } + + let sequence = [1, 2, 3] + expect(sequence).toNot(beginWith(prefix: [1, 2, 3, 4], by: { $0 == $1 })) + expect(sequence).toNot(beginWith(prefix: [2, 3], by: { $0 == $1 })) + + expect(sequence).to(beginWith(prefix: [1, 2, 3], by: { $0 == $1 })) + expect(sequence).to(beginWith(prefix: [1, 2], by: { $0 == $1 })) + expect(sequence).to(beginWith(prefix: [], by: { $0 == $1 })) + + expect([]).toNot(beginWith(prefix: [1], by: { $0 == $1 })) + expect([]).to(beginWith(prefix: [] as [Int], by: { $0 == $1 })) + } + + func testBeginWithSequencePrefixWithDifferentSequenceTypes() { + expect(1...3).to(beginWith(prefix: [1, 2, 3])) + expect(1...3).toNot(beginWith(prefix: [1, 2, 3, 4, 5])) + + expect(1...3).to(beginWith(prefix: [1, 2, 3], by: { $0 == $1 })) + expect(1...3).toNot(beginWith(prefix: [1, 2, 3, 4, 5], by: { $0 == $1 })) + } +} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift index 6805d7c60..4babb0b87 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/BeginWithTest.swift @@ -2,7 +2,7 @@ import Foundation import XCTest import Nimble -final class BeginWithTest: XCTestCase, XCTestCaseProvider { +final class BeginWithTest: XCTestCase { func testPositiveMatches() { expect([1, 2, 3]).to(beginWith(1)) expect([1, 2, 3]).toNot(beginWith(2)) @@ -12,19 +12,19 @@ final class BeginWithTest: XCTestCase, XCTestCaseProvider { expect("foobarfoo").to(beginWith("foo")) - expect(NSString(string: "foobar").description).to(beginWith("foo")) - expect(NSString(string: "foobar").description).toNot(beginWith("oo")) + expect(("foobar" as NSString).description).to(beginWith("foo")) + expect(("foobar" as NSString).description).toNot(beginWith("oo")) - expect(NSArray(array: ["a", "b"])).to(beginWith("a")) - expect(NSArray(array: ["a", "b"])).toNot(beginWith("b")) + expect(["a", "b"] as NSArray).to(beginWith("a")) + expect(["a", "b"] as NSArray).toNot(beginWith("b")) } func testNegativeMatches() { failsWithErrorMessageForNil("expected to begin with , got ") { - expect(nil as NSArray?).to(beginWith(NSString(string: "b"))) + expect(nil as NSArray?).to(beginWith("b" as NSString)) } failsWithErrorMessageForNil("expected to not begin with , got ") { - expect(nil as NSArray?).toNot(beginWith(NSString(string: "b"))) + expect(nil as NSArray?).toNot(beginWith("b" as NSString)) } failsWithErrorMessage("expected to begin with <2>, got <[1, 2, 3]>") { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift index 694437526..324b0c9f3 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainElementSatisfyingTest.swift @@ -2,7 +2,7 @@ import Foundation import XCTest import Nimble -final class ContainElementSatisfyingTest: XCTestCase, XCTestCaseProvider { +final class ContainElementSatisfyingTest: XCTestCase { func testContainElementSatisfying() { var orderIndifferentArray = [1, 2, 3] expect(orderIndifferentArray).to(containElementSatisfying({ number in diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift index 28f685e9f..5dea081b7 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ContainTest.swift @@ -2,7 +2,7 @@ import Foundation import XCTest import Nimble -final class ContainTest: XCTestCase, XCTestCaseProvider { +final class ContainTest: XCTestCase { func testContainSequence() { expect([1, 2, 3]).to(contain(1)) expect([1, 2, 3]).toNot(contain(4)) @@ -11,9 +11,9 @@ final class ContainTest: XCTestCase, XCTestCaseProvider { expect(["foo", "bar", "baz"]).to(contain("baz")) expect(["foo", "bar", "baz"]).toNot(contain("ba")) #if canImport(Darwin) - expect(NSArray(array: ["a"])).to(contain(NSString(string: "a"))) - expect(NSArray(array: ["a"])).toNot(contain(NSString(string: "b"))) - expect(NSArray(object: 1) as NSArray?).to(contain(1)) + expect(["a"] as NSArray).to(contain("a" as NSString)) + expect(["a"] as NSArray).toNot(contain("b" as NSString)) + expect([1] as NSArray?).to(contain(1)) #endif failsWithErrorMessage("expected to contain , got <[a, b, c]>") { @@ -85,12 +85,12 @@ final class ContainTest: XCTestCase, XCTestCaseProvider { } } - func testContainObjCSubstring() { - let str = NSString(string: "foo") - expect(str).to(contain(NSString(string: "o"))) - expect(str).to(contain(NSString(string: "oo"))) - expect(str).toNot(contain(NSString(string: "z"))) - expect(str).toNot(contain(NSString(string: "zz"))) + func testContainNSStringSubstring() { + let str = "foo" as NSString + expect(str).to(contain("o" as NSString)) + expect(str).to(contain("oo" as NSString)) + expect(str).toNot(contain("z" as NSString)) + expect(str).toNot(contain("zz" as NSString)) } func testVariadicArguments() { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ElementsEqualTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ElementsEqualTest.swift index ec7a0dd7f..39dd1f467 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ElementsEqualTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ElementsEqualTest.swift @@ -2,7 +2,7 @@ import Foundation import XCTest import Nimble -final class ElementsEqualTest: XCTestCase, XCTestCaseProvider { +final class ElementsEqualTest: XCTestCase { func testSequenceElementsEquality() { failsWithErrorMessageForNil("expected to elementsEqual , got ") { @@ -22,6 +22,35 @@ final class ElementsEqualTest: XCTestCase, XCTestCaseProvider { expect(sequence1).toNot(elementsEqual(sequence2)) expect(sequence1).toNot(elementsEqual([3, 2, 1])) expect(sequence1).to(elementsEqual([1, 2, 3])) + } + + func testSequenceElementsEqualityUsingPredicateClosure() { + failsWithErrorMessageForNil("expected to elementsEqual , got ") { + expect(nil as [Int]?).to(elementsEqual(nil as [Int]?, by: { $0 == $1 })) + } + let sequence = [1, 2] + failsWithErrorMessageForNil("expected to elementsEqual <[1, 2]>, got ") { + expect(nil as [Int]?).to(elementsEqual(sequence, by: { $0 == $1 })) + } + + failsWithErrorMessageForNil("expected to elementsEqual , got <[1, 2]>") { + expect(sequence).to(elementsEqual(nil as [Int]?, by: { $0 == $1 })) + } + + let sequence1 = [1, 2, 3] + let sequence2 = [1, 2, 3, 4, 5] + expect(sequence1).toNot(elementsEqual(sequence2, by: { $0 == $1 })) + expect(sequence1).toNot(elementsEqual([3, 2, 1], by: { $0 == $1 })) + expect(sequence1).to(elementsEqual([1, 2, 3], by: { $0 == $1 })) + } + + func testElementsEqualDifferentSequenceTypes() { + expect(1...3).to(elementsEqual([1, 2, 3])) + expect(1...3).toNot(elementsEqual([1, 2, 3, 4, 5])) + expect(1...3).toNot(elementsEqual([3, 2, 1])) + expect(1...3).to(elementsEqual([1, 2, 3], by: { $0 == $1 })) + expect(1...3).toNot(elementsEqual([1, 2, 3, 4, 5], by: { $0 == $1 })) + expect(1...3).toNot(elementsEqual([3, 2, 1], by: { $0 == $1 })) } } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift index 54794c56f..ea387579d 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EndWithTest.swift @@ -2,7 +2,7 @@ import Foundation import XCTest import Nimble -final class EndWithTest: XCTestCase, XCTestCaseProvider { +final class EndWithTest: XCTestCase { func testEndWithPositives() { expect([1, 2, 3]).to(endWith(3)) expect([1, 2, 3]).toNot(endWith(2)) @@ -13,13 +13,13 @@ final class EndWithTest: XCTestCase, XCTestCaseProvider { expect("foobar").toNot(endWith("oo")) expect("foobarfoo").to(endWith("foo")) - expect(NSString(string: "foobar").description).to(endWith("bar")) - expect(NSString(string: "foobar").description).toNot(endWith("oo")) + expect(("foobar" as NSString).description).to(endWith("bar")) + expect(("foobar" as NSString).description).toNot(endWith("oo")) - expect(NSArray(array: ["a", "b"])).to(endWith("b")) - expect(NSArray(array: ["a", "b"])).toNot(endWith("a")) - expect(NSArray(array: [])).toNot(endWith("a")) - expect(NSArray(array: ["a", "b", "a"])).to(endWith("a")) + expect(["a", "b"] as NSArray).to(endWith("b")) + expect(["a", "b"] as NSArray).toNot(endWith("a")) + expect([] as NSArray).toNot(endWith("a")) + expect(["a", "b", "a"] as NSArray).to(endWith("a")) } func testEndWithNegatives() { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift index 5b1aa499c..5dad4998c 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/EqualTest.swift @@ -2,7 +2,7 @@ import Foundation import XCTest import Nimble -final class EqualTest: XCTestCase, XCTestCaseProvider { +final class EqualTest: XCTestCase { func testEquality() { expect(1 as CInt).to(equal(1 as CInt)) expect(1 as CInt).to(equal(1)) @@ -33,7 +33,7 @@ final class EqualTest: XCTestCase, XCTestCaseProvider { expect(array1).to(equal([1, 2, 3])) expect(array1).toNot(equal([1, 2] as [Int])) - expect(NSArray(array: [1, 2, 3])).to(equal(NSArray(array: [1, 2, 3]))) + expect([1, 2, 3] as NSArray).to(equal([1, 2, 3] as NSArray)) failsWithErrorMessage("expected to equal <[1, 2]>, got <[1, 2, 3]>") { expect([1, 2, 3]).to(equal([1, 2])) @@ -117,8 +117,8 @@ final class EqualTest: XCTestCase, XCTestCaseProvider { expect(actual).to(equal(expected)) expect(actual).toNot(equal(unexpected)) - expect(NSDictionary(object: "bar", forKey: "foo" as NSString)).to(equal(["foo": "bar"])) - expect(NSDictionary(object: "bar", forKey: "foo" as NSString) as? [String: String]).to(equal(expected)) + expect(["foo": "bar"] as NSDictionary).to(equal(["foo": "bar"])) + expect((["foo": "bar"] as NSDictionary) as? [String: String]).to(equal(expected)) } func testDataEquality() { @@ -138,10 +138,10 @@ final class EqualTest: XCTestCase, XCTestCaseProvider { } func testNSObjectEquality() { - expect(NSNumber(value: 1)).to(equal(NSNumber(value: 1))) - expect(NSNumber(value: 1)) == NSNumber(value: 1) - expect(NSNumber(value: 1)) != NSNumber(value: 2) - expect { NSNumber(value: 1) }.to(equal(1)) + expect(1 as NSNumber).to(equal(1 as NSNumber)) + expect(1 as NSNumber) == 1 as NSNumber + expect(1 as NSNumber) != 2 as NSNumber + expect { 1 as NSNumber }.to(equal(1)) } func testOperatorEquality() { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift index 4ef610ea6..5b5f19411 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/HaveCountTest.swift @@ -1,7 +1,7 @@ import XCTest import Nimble -final class HaveCountTest: XCTestCase, XCTestCaseProvider { +final class HaveCountTest: XCTestCase { func testHaveCountForArray() { expect([1, 2, 3]).to(haveCount(3)) expect([1, 2, 3]).notTo(haveCount(1)) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift index bac76e95a..a2517c1da 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchErrorTest.swift @@ -2,7 +2,7 @@ import Foundation import XCTest import Nimble -final class MatchErrorTest: XCTestCase, XCTestCaseProvider { +final class MatchErrorTest: XCTestCase { func testMatchErrorPositive() { expect(NimbleError.laugh).to(matchError(NimbleError.laugh)) expect(NimbleError.laugh).to(matchError(NimbleError.self)) @@ -19,12 +19,10 @@ final class MatchErrorTest: XCTestCase, XCTestCaseProvider { } func testMatchNSErrorPositive() { -#if canImport(Darwin) let error1 = NSError(domain: "err", code: 0, userInfo: nil) let error2 = NSError(domain: "err", code: 0, userInfo: nil) expect(error1).to(matchError(error2)) -#endif } func testMatchNSErrorNegative() { @@ -45,13 +43,11 @@ final class MatchErrorTest: XCTestCase, XCTestCaseProvider { expect(CustomDebugStringConvertibleError.a).to(matchError(CustomDebugStringConvertibleError.b)) } -#if canImport(Darwin) failsWithErrorMessage("expected to match error , got ") { let error1 = NSError(domain: "err", code: 0, userInfo: nil) let error2 = NSError(domain: "err", code: 1, userInfo: nil) expect(error1).to(matchError(error2)) } -#endif } func testMatchNegativeMessage() { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift index 1285eccfc..73b0c1667 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/MatchTest.swift @@ -1,7 +1,7 @@ import XCTest import Nimble -final class MatchTest: XCTestCase, XCTestCaseProvider { +final class MatchTest: XCTestCase { func testMatchPositive() { expect("11:14").to(match("\\d{2}:\\d{2}")) } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift index de6fe5dcd..ad13782f0 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/PostNotificationTest.swift @@ -2,7 +2,7 @@ import XCTest import Nimble import Foundation -final class PostNotificationTest: XCTestCase, XCTestCaseProvider { +final class PostNotificationTest: XCTestCase { let notificationCenter = NotificationCenter() func testPassesWhenNoNotificationsArePosted() { @@ -20,8 +20,8 @@ final class PostNotificationTest: XCTestCase, XCTestCaseProvider { } func testPassesWhenAllExpectedNotificationsArePosted() { - let foo = NSNumber(value: 1) - let bar = NSNumber(value: 2) + let foo = 1 as NSNumber + let bar = 2 as NSNumber let n1 = Notification(name: Notification.Name("Foo"), object: foo) let n2 = Notification(name: Notification.Name("Bar"), object: bar) expect { diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift index 085b3b41e..50a858cd0 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/RaisesExceptionTest.swift @@ -3,113 +3,113 @@ import Nimble #if canImport(Darwin) && !SWIFT_PACKAGE -final class RaisesExceptionTest: XCTestCase { - var anException = NSException(name: NSExceptionName("laugh"), reason: "Lulz", userInfo: ["key": "value"]) +let anException = NSException(name: NSExceptionName("laugh"), reason: "Lulz", userInfo: ["key": "value"]) +final class RaisesExceptionTest: XCTestCase { func testPositiveMatches() { - expect { self.anException.raise() }.to(raiseException()) - expect { self.anException.raise() }.to(raiseException(named: "laugh")) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz")) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) + expect { anException.raise() }.to(raiseException()) + expect { anException.raise() }.to(raiseException(named: "laugh")) + expect { anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz")) + expect { anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) } func testPositiveMatchesWithClosures() { - expect { self.anException.raise() }.to(raiseException { (exception: NSException) in + expect { anException.raise() }.to(raiseException { (exception: NSException) in expect(exception.name).to(equal(NSExceptionName("laugh"))) }) - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in expect(exception.name.rawValue).to(beginWith("lau")) }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in expect(exception.name.rawValue).to(beginWith("lau")) }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in expect(exception.name.rawValue).to(beginWith("lau")) }) - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in expect(exception.name.rawValue).toNot(beginWith("as")) }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in expect(exception.name.rawValue).toNot(beginWith("df")) }) - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in expect(exception.name.rawValue).toNot(beginWith("as")) }) } func testNegativeMatches() { failsWithErrorMessage("expected to raise exception with name , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "foo")) + expect { anException.raise() }.to(raiseException(named: "foo")) } failsWithErrorMessage("expected to raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "bar")) + expect { anException.raise() }.to(raiseException(named: "laugh", reason: "bar")) } failsWithErrorMessage( "expected to raise exception with name with reason with userInfo <{k = v;}>, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["k": "v"])) + expect { anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["k": "v"])) } failsWithErrorMessage("expected to raise any exception, got no exception") { - expect { self.anException }.to(raiseException()) + expect {}.to(raiseException()) } failsWithErrorMessage("expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException()) + expect { anException.raise() }.toNot(raiseException()) } failsWithErrorMessage("expected to raise exception with name with reason , got no exception") { - expect { self.anException }.to(raiseException(named: "laugh", reason: "Lulz")) + expect {}.to(raiseException(named: "laugh", reason: "Lulz")) } failsWithErrorMessage("expected to raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException(named: "bar", reason: "Lulz")) + expect { anException.raise() }.to(raiseException(named: "bar", reason: "Lulz")) } failsWithErrorMessage("expected to not raise exception with name , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh")) + expect { anException.raise() }.toNot(raiseException(named: "laugh")) } failsWithErrorMessage("expected to not raise exception with name with reason , got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz")) + expect { anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz")) } failsWithErrorMessage("expected to not raise exception with name with reason with userInfo <{key = value;}>, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) + expect { anException.raise() }.toNot(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) } } func testNegativeMatchesDoNotCallClosureWithoutException() { failsWithErrorMessage("expected to raise exception that satisfies block, got no exception") { - expect { self.anException }.to(raiseException { (exception: NSException) in + expect {}.to(raiseException { (exception: NSException) in expect(exception.name).to(equal(NSExceptionName(rawValue: "foo"))) }) } failsWithErrorMessage("expected to raise exception with name that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo") { (exception: NSException) in + expect {}.to(raiseException(named: "foo") { (exception: NSException) in expect(exception.name.rawValue).to(equal("foo")) }) } failsWithErrorMessage("expected to raise exception with name with reason that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo", reason: "ha") { (exception: NSException) in + expect {}.to(raiseException(named: "foo", reason: "ha") { (exception: NSException) in expect(exception.name.rawValue).to(equal("foo")) }) } failsWithErrorMessage("expected to raise exception with name with reason with userInfo <{}> that satisfies block, got no exception") { - expect { self.anException }.to(raiseException(named: "foo", reason: "Lulz", userInfo: [:]) { (exception: NSException) in + expect {}.to(raiseException(named: "foo", reason: "Lulz", userInfo: [:]) { (exception: NSException) in expect(exception.name.rawValue).to(equal("foo")) }) } failsWithErrorMessage("expected to not raise any exception, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.toNot(raiseException()) + expect { anException.raise() }.toNot(raiseException()) } } func testNegativeMatchesWithClosure() { failsWithErrorMessage("expected to raise exception that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }") { - expect { self.anException.raise() }.to(raiseException { (exception: NSException) in + expect { anException.raise() }.to(raiseException { (exception: NSException) in expect(exception.name.rawValue).to(equal("foo")) }) } @@ -117,40 +117,57 @@ final class RaisesExceptionTest: XCTestCase { let innerFailureMessage = "expected to begin with , got " failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "laugh") { (exception: NSException) in expect(exception.name.rawValue).to(beginWith("fo")) }) } failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol") { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "lol") { (exception: NSException) in expect(exception.name.rawValue).to(beginWith("fo")) }) } failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz") { (exception: NSException) in expect(exception.name.rawValue).to(beginWith("fo")) }) } failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol", reason: "wrong") { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "lol", reason: "wrong") { (exception: NSException) in expect(exception.name.rawValue).to(beginWith("fo")) }) } failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason with userInfo <{key = value;}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { (exception: NSException) in expect(exception.name.rawValue).to(beginWith("fo")) }) } failsWithErrorMessage([innerFailureMessage, "expected to raise exception with name with reason with userInfo <{}> that satisfies block, got NSException { name=NSExceptionName(_rawValue: laugh), reason='Lulz', userInfo=[AnyHashable(\"key\"): \"value\"] }"]) { - expect { self.anException.raise() }.to(raiseException(named: "lol", reason: "Lulz", userInfo: [:]) { (exception: NSException) in + expect { anException.raise() }.to(raiseException(named: "lol", reason: "Lulz", userInfo: [:]) { (exception: NSException) in expect(exception.name.rawValue).to(beginWith("fo")) }) } } + + func testNSExceptionName() { + let exception = NSException(name: .genericException, reason: nil, userInfo: nil) + expect { exception.raise() }.to(raiseException(named: .genericException)) + } + + func testNonVoidClosure() { + expect { return 1 }.toNot(raiseException()) + expect { return 2 }.toNot(raiseException(named: "laugh")) + expect { return 3 }.toNot(raiseException(named: "laugh", reason: "Lulz")) + expect { return 4 }.toNot(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"])) + expect { return 5 }.toNot(raiseException(named: "laugh", reason: "Lulz", userInfo: ["key": "value"]) { _ in }) + } + + func testChainOnRaiseException() { + expect { () -> Int in return 5 }.toNot(raiseException()).to(equal(5)) + } } #endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAllOfTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAllOfTest.swift index be60a41cb..f85b5fcb2 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAllOfTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAllOfTest.swift @@ -2,14 +2,10 @@ import XCTest import Nimble import Foundation -final class SatisfyAllOfTest: XCTestCase, XCTestCaseProvider { +final class SatisfyAllOfTest: XCTestCase { func testSatisfyAllOf() { expect(2).to(satisfyAllOf(equal(2), beLessThan(3))) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(2).toNot(satisfyAllOf(equal(3), equal("turtles"))) -#else expect(2 as NSNumber).toNot(satisfyAllOf(equal(3 as NSNumber), equal("turtles" as NSString))) -#endif expect([1, 2, 3]).to(satisfyAllOf(equal([1, 2, 3]), allPass({$0 < 4}), haveCount(3))) expect("turtle").to(satisfyAllOf(contain("e"), beginWith("tur"))) expect(82.0).to(satisfyAllOf(beGreaterThan(10.5), beLessThan(100.75), beCloseTo(82.00001))) @@ -36,11 +32,8 @@ final class SatisfyAllOfTest: XCTestCase, XCTestCaseProvider { func testOperatorAnd() { expect(2).to(equal(2) && beLessThan(3)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION expect(2).to(beLessThan(3) && beGreaterThan(1)) -#else expect(2 as NSNumber).to(beLessThan(3 as NSNumber) && beGreaterThan(1 as NSNumber)) -#endif expect("turtle").to(contain("t") && endWith("tle")) expect(82.0).to(beGreaterThan(10.5) && beLessThan(100.75)) expect(false).to(beFalsy() && beFalse()) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift index 0cba8d5ca..102616d20 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/SatisfyAnyOfTest.swift @@ -2,14 +2,10 @@ import XCTest import Nimble import Foundation -final class SatisfyAnyOfTest: XCTestCase, XCTestCaseProvider { +final class SatisfyAnyOfTest: XCTestCase { func testSatisfyAnyOf() { expect(2).to(satisfyAnyOf(equal(2), equal(3))) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(2).toNot(satisfyAnyOf(equal(3), equal("turtles"))) -#else expect(2 as NSNumber).toNot(satisfyAnyOf(equal(3 as NSNumber), equal("turtles" as NSString))) -#endif expect([1, 2, 3]).to(satisfyAnyOf(equal([1, 2, 3]), allPass({$0 < 4}), haveCount(3))) expect("turtle").toNot(satisfyAnyOf(contain("a"), endWith("magic"))) expect(82.0).toNot(satisfyAnyOf(beLessThan(10.5), beGreaterThan(100.75), beCloseTo(50.1))) @@ -36,11 +32,7 @@ final class SatisfyAnyOfTest: XCTestCase, XCTestCaseProvider { func testOperatorOr() { expect(2).to(equal(2) || equal(3)) -#if SUPPORT_IMPLICIT_BRIDGING_CONVERSION - expect(2).toNot(equal(3) || equal("turtles")) -#else expect(2 as NSNumber).toNot(equal(3 as NSNumber) || equal("turtles" as NSString)) -#endif expect("turtle").toNot(contain("a") || endWith("magic")) expect(82.0).toNot(beLessThan(10.5) || beGreaterThan(100.75)) expect(false).to(beTrue() || beFalse()) diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift index a1f69cc7f..f3b99695b 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowAssertionTest.swift @@ -2,20 +2,23 @@ import Foundation import XCTest import Nimble -#if canImport(Darwin) - private let error: Error = NSError(domain: "test", code: 0, userInfo: nil) final class ThrowAssertionTest: XCTestCase { func testPositiveMatch() { + #if canImport(Darwin) expect { () -> Void in fatalError() }.to(throwAssertion()) + #endif } func testErrorThrown() { + #if canImport(Darwin) expect { throw error }.toNot(throwAssertion()) + #endif } func testPostAssertionCodeNotRun() { + #if canImport(Darwin) var reachedPoint1 = false var reachedPoint2 = false @@ -27,17 +30,21 @@ final class ThrowAssertionTest: XCTestCase { expect(reachedPoint1) == true expect(reachedPoint2) == false + #endif } func testNegativeMatch() { + #if canImport(Darwin) var reachedPoint1 = false expect { reachedPoint1 = true }.toNot(throwAssertion()) expect(reachedPoint1) == true + #endif } func testPositiveMessage() { + #if canImport(Darwin) failsWithErrorMessage("expected to throw an assertion") { expect { () -> Void? in return }.to(throwAssertion()) } @@ -45,13 +52,26 @@ final class ThrowAssertionTest: XCTestCase { failsWithErrorMessage("expected to throw an assertion; threw error instead <\(error)>") { expect { throw error }.to(throwAssertion()) } + #endif } func testNegativeMessage() { + #if canImport(Darwin) failsWithErrorMessage("expected to not throw an assertion") { expect { () -> Void in fatalError() }.toNot(throwAssertion()) } + #endif + } + + func testNonVoidClosure() { + #if canImport(Darwin) + expect { () -> Int in fatalError() }.to(throwAssertion()) + #endif } -} -#endif + func testChainOnThrowAssertion() { + #if canImport(Darwin) + expect { () -> Int in return 5 }.toNot(throwAssertion()).to(equal(5)) + #endif + } +} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift index 7a7253fc0..5c1556724 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ThrowErrorTest.swift @@ -6,7 +6,7 @@ enum NimbleError: Error { case cry } -enum EquatableError: Error { +enum EquatableError: Error, Equatable { case parameterized(x: Int) } @@ -19,16 +19,6 @@ extension EquatableError: CustomDebugStringConvertible { } } -extension EquatableError: Equatable { -} - -func == (lhs: EquatableError, rhs: EquatableError) -> Bool { - switch (lhs, rhs) { - case (.parameterized(let l), .parameterized(let r)): - return l == r - } -} - enum CustomDebugStringConvertibleError: Error { // swiftlint:disable identifier_name case a @@ -42,7 +32,7 @@ extension CustomDebugStringConvertibleError: CustomDebugStringConvertible { } } -final class ThrowErrorTest: XCTestCase, XCTestCaseProvider { +final class ThrowErrorTest: XCTestCase { func testPositiveMatches() { expect { throw NimbleError.laugh }.to(throwError()) expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh)) @@ -135,7 +125,7 @@ final class ThrowErrorTest: XCTestCase, XCTestCaseProvider { func testNegativeMatchesWithClosure() { let moduleName = "NimbleTests" let innerFailureMessage = "expected to equal , got <\(moduleName).NimbleError>" - let closure = { (error: Error) in + let closure = { (error: Error) -> Void in expect(error._domain).to(equal("foo")) } @@ -151,4 +141,31 @@ final class ThrowErrorTest: XCTestCase, XCTestCaseProvider { expect { throw NimbleError.laugh }.to(throwError(NimbleError.laugh, closure: closure)) } } + + func testNonVoidClosure() { + expect { return 1 }.toNot(throwError()) + expect { return 2 }.toNot(throwError(NimbleError.laugh)) + expect { return 3 }.toNot(throwError(errorType: NimbleError.self)) + expect { return 4 }.toNot(throwError(EquatableError.parameterized(x: 1))) + expect { return 5 }.toNot(throwError(EquatableError.parameterized(x: 2))) + + // swiftlint:disable unused_closure_parameter + + // Generic typed closure + expect { return "1" }.toNot(throwError { error in }) + // Explicit typed closure + expect { return "2" }.toNot(throwError { (error: EquatableError) in }) + // Typed closure over errorType argument + expect { return "3" }.toNot(throwError(errorType: EquatableError.self) { error in }) + // Typed closure over error argument + expect { return "4" }.toNot(throwError(NimbleError.laugh) { (error: Error) in }) + // Typed closure over error argument + expect { return "5" }.toNot(throwError(NimbleError.laugh) { (error: Error) in }) + + // swiftlint:enable unused_closure_parameter + } + + func testChainOnThrowError() { + expect { () throws -> Int in return 5 }.toNot(throwError()).to(equal(5)) + } } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift index 0079f236e..df6b0aa40 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/Matchers/ToSucceedTest.swift @@ -1,7 +1,7 @@ import XCTest import Nimble -final class ToSucceedTest: XCTestCase, XCTestCaseProvider { +final class ToSucceedTest: XCTestCase { func testToSucceed() { expect({ return .succeeded diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/PredicateTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/PredicateTest.swift new file mode 100644 index 000000000..3fd561586 --- /dev/null +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/PredicateTest.swift @@ -0,0 +1,28 @@ +import XCTest +import Nimble + +final class PredicateTest: XCTestCase { + func testDefineDefaultMessage() { + failsWithErrorMessage("expected to match, got <1>") { + expect(1).to(Predicate.define { _, msg in PredicateResult(status: .fail, message: msg) }) + } + } + + func testDefineNilableDefaultMessage() { + failsWithErrorMessage("expected to match, got <1>") { + expect(1).to(Predicate.defineNilable { _, msg in PredicateResult(status: .fail, message: msg) }) + } + } + + func testSimpleDefaultMessage() { + failsWithErrorMessage("expected to match, got <1>") { + expect(1).to(Predicate.simple { _ in .fail }) + } + } + + func testSimpleNilableDefaultMessage() { + failsWithErrorMessage("expected to match, got <1>") { + expect(1).to(Predicate.simpleNilable { _ in .fail }) + } + } +} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousDeprecatedTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousDeprecatedTest.swift new file mode 100644 index 000000000..ed305f067 --- /dev/null +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousDeprecatedTest.swift @@ -0,0 +1,98 @@ +import Foundation +import XCTest +import Nimble + +@available(*, deprecated) +final class SynchronousDeprecatedTest: XCTestCase { + func testToMatchesIfMatcherReturnsTrue() { + expect(1).to(MatcherFunc { _, _ in true }) + expect {1}.to(MatcherFunc { _, _ in true }) + + expect(1).to(MatcherFunc { _, _ in true }.predicate) + expect {1}.to(MatcherFunc { _, _ in true }.predicate) + } + + func testToProvidesActualValueExpression() { + var value: Int? + expect(1).to(MatcherFunc { expr, _ in value = try expr.evaluate(); return true }) + expect(value).to(equal(1)) + } + + func testToProvidesAMemoizedActualValueExpression() { + var callCount = 0 + expect { callCount += 1 }.to(MatcherFunc { expr, _ in + _ = try expr.evaluate() + _ = try expr.evaluate() + return true + }) + expect(callCount).to(equal(1)) + } + + func testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { + var callCount = 0 + expect { callCount += 1 }.to(MatcherFunc { expr, _ in + expect(callCount).to(equal(0)) + _ = try expr.evaluate() + return true + }) + expect(callCount).to(equal(1)) + } + + // repeated tests from to() for toNot() + func testToNotMatchesIfMatcherReturnsTrue() { + expect(1).toNot(MatcherFunc { _, _ in false }) + expect {1}.toNot(MatcherFunc { _, _ in false }) + + expect(1).toNot(MatcherFunc { _, _ in false }.predicate) + expect {1}.toNot(MatcherFunc { _, _ in false }.predicate) + } + + func testToNotProvidesActualValueExpression() { + var value: Int? + expect(1).toNot(MatcherFunc { expr, _ in value = try expr.evaluate(); return false }) + expect(value).to(equal(1)) + } + + func testToNotProvidesAMemoizedActualValueExpression() { + var callCount = 0 + expect { callCount += 1 }.toNot(MatcherFunc { expr, _ in + _ = try expr.evaluate() + _ = try expr.evaluate() + return false + }) + expect(callCount).to(equal(1)) + } + + func testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { + var callCount = 0 + expect { callCount += 1 }.toNot(MatcherFunc { expr, _ in + expect(callCount).to(equal(0)) + _ = try expr.evaluate() + return false + }) + expect(callCount).to(equal(1)) + } + + func testToNegativeMatches() { + failsWithErrorMessage("expected to match, got <1>") { + expect(1).to(MatcherFunc { _, _ in false }) + } + failsWithErrorMessage("expected to match, got <1>") { + expect(1).to(MatcherFunc { _, _ in false }.predicate) + } + } + + func testToNotNegativeMatches() { + failsWithErrorMessage("expected to not match, got <1>") { + expect(1).toNot(MatcherFunc { _, _ in true }) + } + failsWithErrorMessage("expected to not match, got <1>") { + expect(1).toNot(MatcherFunc { _, _ in true }.predicate) + } + } + + func testNotToMatchesLikeToNot() { + expect(1).notTo(MatcherFunc { _, _ in false }) + expect(1).notTo(MatcherFunc { _, _ in false }.predicate) + } +} diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTest.swift index 1f412dde7..cab4e5287 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/SynchronousTest.swift @@ -2,7 +2,7 @@ import Foundation import XCTest import Nimble -final class SynchronousTest: XCTestCase, XCTestCaseProvider { +final class SynchronousTest: XCTestCase { class Error: Swift.Error {} let errorToThrow = Error() @@ -29,38 +29,32 @@ final class SynchronousTest: XCTestCase, XCTestCaseProvider { } func testToMatchesIfMatcherReturnsTrue() { - expect(1).to(MatcherFunc { _, _ in true }) - expect {1}.to(MatcherFunc { _, _ in true }) - - expect(1).to(MatcherFunc { _, _ in true }.predicate) - expect {1}.to(MatcherFunc { _, _ in true }.predicate) - - expect(1).to(Predicate.simple("match") { _ in .matches }) - expect {1}.to(Predicate.simple("match") { _ in .matches }) + expect(1).to(Predicate.simple { _ in .matches }) + expect {1}.to(Predicate.simple { _ in .matches }) } func testToProvidesActualValueExpression() { var value: Int? - expect(1).to(MatcherFunc { expr, _ in value = try expr.evaluate(); return true }) + expect(1).to(Predicate.simple { expr in value = try expr.evaluate(); return .matches }) expect(value).to(equal(1)) } func testToProvidesAMemoizedActualValueExpression() { var callCount = 0 - expect { callCount += 1 }.to(MatcherFunc { expr, _ in + expect { callCount += 1 }.to(Predicate.simple { expr in _ = try expr.evaluate() _ = try expr.evaluate() - return true + return .matches }) expect(callCount).to(equal(1)) } func testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { var callCount = 0 - expect { callCount += 1 }.to(MatcherFunc { expr, _ in + expect { callCount += 1 }.to(Predicate.simple { expr in expect(callCount).to(equal(0)) _ = try expr.evaluate() - return true + return .matches }) expect(callCount).to(equal(1)) } @@ -74,69 +68,61 @@ final class SynchronousTest: XCTestCase, XCTestCaseProvider { // repeated tests from to() for toNot() func testToNotMatchesIfMatcherReturnsTrue() { - expect(1).toNot(MatcherFunc { _, _ in false }) - expect {1}.toNot(MatcherFunc { _, _ in false }) - - expect(1).toNot(MatcherFunc { _, _ in false }.predicate) - expect {1}.toNot(MatcherFunc { _, _ in false }.predicate) - - expect(1).toNot(Predicate.simple("match") { _ in .doesNotMatch }) - expect {1}.toNot(Predicate.simple("match") { _ in .doesNotMatch }) + expect(1).toNot(Predicate.simple { _ in .doesNotMatch }) + expect {1}.toNot(Predicate.simple { _ in .doesNotMatch }) } func testToNotProvidesActualValueExpression() { var value: Int? - expect(1).toNot(MatcherFunc { expr, _ in value = try expr.evaluate(); return false }) + expect(1).toNot(Predicate.simple { expr in value = try expr.evaluate(); return .doesNotMatch }) expect(value).to(equal(1)) } func testToNotProvidesAMemoizedActualValueExpression() { var callCount = 0 - expect { callCount += 1 }.toNot(MatcherFunc { expr, _ in + expect { callCount += 1 }.toNot(Predicate.simple { expr in _ = try expr.evaluate() _ = try expr.evaluate() - return false + return .doesNotMatch }) expect(callCount).to(equal(1)) } func testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl() { var callCount = 0 - expect { callCount += 1 }.toNot(MatcherFunc { expr, _ in + expect { callCount += 1 }.toNot(Predicate.simple { expr in expect(callCount).to(equal(0)) _ = try expr.evaluate() - return false + return .doesNotMatch }) expect(callCount).to(equal(1)) } func testToNegativeMatches() { failsWithErrorMessage("expected to match, got <1>") { - expect(1).to(MatcherFunc { _, _ in false }) - } - failsWithErrorMessage("expected to match, got <1>") { - expect(1).to(MatcherFunc { _, _ in false }.predicate) - } - failsWithErrorMessage("expected to match, got <1>") { - expect(1).to(Predicate.simple("match") { _ in .doesNotMatch }) + expect(1).to(Predicate.simple { _ in .doesNotMatch }) } } func testToNotNegativeMatches() { failsWithErrorMessage("expected to not match, got <1>") { - expect(1).toNot(MatcherFunc { _, _ in true }) - } - failsWithErrorMessage("expected to not match, got <1>") { - expect(1).toNot(MatcherFunc { _, _ in true }.predicate) - } - failsWithErrorMessage("expected to not match, got <1>") { - expect(1).toNot(Predicate.simple("match") { _ in .matches }) + expect(1).toNot(Predicate.simple { _ in .matches }) } } func testNotToMatchesLikeToNot() { - expect(1).notTo(MatcherFunc { _, _ in false }) - expect(1).notTo(MatcherFunc { _, _ in false }.predicate) - expect(1).notTo(Predicate.simple("match") { _ in .doesNotMatch }) + expect(1).notTo(Predicate.simple { _ in .doesNotMatch }) + } + + // MARK: Assertion chaining + + func testChain() { + expect(2).toNot(equal(1)).to(equal(2)).notTo(equal(3)) + } + + func testChainFail() { + failsWithErrorMessage(["expected to not equal <2>, got <2>", "expected to equal <3>, got <2>"]) { + expect(2).toNot(equal(1)).toNot(equal(2)).to(equal(3)) + } } } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift index 0c451c849..71feb9bd1 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/UserDescriptionTest.swift @@ -1,7 +1,7 @@ import XCTest import Nimble -final class UserDescriptionTest: XCTestCase, XCTestCaseProvider { +final class UserDescriptionTest: XCTestCase { func testToMatcher_CustomFailureMessage() { failsWithErrorMessage( """ @@ -9,7 +9,7 @@ final class UserDescriptionTest: XCTestCase, XCTestCaseProvider { expected to match, got <1> """ ) { - expect(1).to(MatcherFunc { _, _ in false }, description: "These aren't equal!") + expect(1).to(Predicate.simple { _ in .doesNotMatch }, description: "These aren't equal!") } } @@ -20,7 +20,7 @@ final class UserDescriptionTest: XCTestCase, XCTestCaseProvider { expected to not match, got <1> """ ) { - expect(1).notTo(MatcherFunc { _, _ in true }, description: "These aren't equal!") + expect(1).notTo(Predicate.simple { _ in .matches }, description: "These aren't equal!") } } @@ -31,7 +31,7 @@ final class UserDescriptionTest: XCTestCase, XCTestCaseProvider { expected to not match, got <1> """ ) { - expect(1).toNot(MatcherFunc { _, _ in true }, description: "These aren't equal!") + expect(1).toNot(Predicate.simple { _ in .matches }, description: "These aren't equal!") } } diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/XCTestManifests.swift b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/XCTestManifests.swift deleted file mode 100644 index 2bd105255..000000000 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/XCTestManifests.swift +++ /dev/null @@ -1,387 +0,0 @@ -import XCTest - -extension AllPassTest { - static let __allTests = [ - ("testAllPassArray", testAllPassArray), - ("testAllPassCollectionsWithOptionalsDontWork", testAllPassCollectionsWithOptionalsDontWork), - ("testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer", testAllPassCollectionsWithOptionalsUnwrappingOneOptionalLayer), - ("testAllPassMatcher", testAllPassMatcher), - ("testAllPassSet", testAllPassSet), - ("testAllPassWithNilAsExpectedValue", testAllPassWithNilAsExpectedValue), - ] -} - -extension AsyncTest { - static let __allTests = [ - ("testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed", testCombiningAsyncWaitUntilAndToEventuallyIsNotAllowed), - ("testSubjectUnderTestIsReleasedFromMemory", testSubjectUnderTestIsReleasedFromMemory), - ("testToEventuallyMustBeInMainThread", testToEventuallyMustBeInMainThread), - ("testToEventuallyNegativeMatches", testToEventuallyNegativeMatches), - ("testToEventuallyPositiveMatches", testToEventuallyPositiveMatches), - ("testToEventuallyWithCustomDefaultTimeout", testToEventuallyWithCustomDefaultTimeout), - ("testWaitUntilDetectsStalledMainThreadActivity", testWaitUntilDetectsStalledMainThreadActivity), - ("testWaitUntilErrorsIfDoneIsCalledMultipleTimes", testWaitUntilErrorsIfDoneIsCalledMultipleTimes), - ("testWaitUntilMustBeInMainThread", testWaitUntilMustBeInMainThread), - ("testWaitUntilNegativeMatches", testWaitUntilNegativeMatches), - ("testWaitUntilPositiveMatches", testWaitUntilPositiveMatches), - ("testWaitUntilTimesOutIfNotCalled", testWaitUntilTimesOutIfNotCalled), - ("testWaitUntilTimesOutWhenExceedingItsTime", testWaitUntilTimesOutWhenExceedingItsTime), - ("testWaitUntilWithCustomDefaultsTimeout", testWaitUntilWithCustomDefaultsTimeout), - ] -} - -extension BeAKindOfObjCTest { - static let __allTests = [ - ("testFailureMessages", testFailureMessages), - ("testPositiveMatch", testPositiveMatch), - ] -} - -extension BeAKindOfSwiftTest { - static let __allTests = [ - ("testFailureMessages", testFailureMessages), - ("testPositiveMatch", testPositiveMatch), - ] -} - -extension BeAnInstanceOfTest { - static let __allTests = [ - ("testFailureMessages", testFailureMessages), - ("testFailureMessagesSwiftTypes", testFailureMessagesSwiftTypes), - ("testPositiveMatch", testPositiveMatch), - ("testPositiveMatchSwiftTypes", testPositiveMatchSwiftTypes), - ] -} - -extension BeCloseToTest { - static let __allTests = [ - ("testBeCloseTo", testBeCloseTo), - ("testBeCloseToArray", testBeCloseToArray), - ("testBeCloseToOperator", testBeCloseToOperator), - ("testBeCloseToOperatorWithDate", testBeCloseToOperatorWithDate), - ("testBeCloseToWithCGFloat", testBeCloseToWithCGFloat), - ("testBeCloseToWithDate", testBeCloseToWithDate), - ("testBeCloseToWithin", testBeCloseToWithin), - ("testBeCloseToWithinOperator", testBeCloseToWithinOperator), - ("testBeCloseToWithinOperatorWithDate", testBeCloseToWithinOperatorWithDate), - ("testBeCloseToWithNSDate", testBeCloseToWithNSDate), - ("testBeCloseToWithNSNumber", testBeCloseToWithNSNumber), - ("testPlusMinusOperator", testPlusMinusOperator), - ("testPlusMinusOperatorWithDate", testPlusMinusOperatorWithDate), - ] -} - -extension BeEmptyTest { - static let __allTests = [ - ("testBeEmptyNegative", testBeEmptyNegative), - ("testBeEmptyPositive", testBeEmptyPositive), - ("testNilMatches", testNilMatches), - ] -} - -extension BeFalseTest { - static let __allTests = [ - ("testShouldMatchFalse", testShouldMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ("testShouldNotMatchTrue", testShouldNotMatchTrue), - ] -} - -extension BeFalsyTest { - static let __allTests = [ - ("testShouldMatchFalse", testShouldMatchFalse), - ("testShouldMatchNilBools", testShouldMatchNilBools), - ("testShouldMatchNilTypes", testShouldMatchNilTypes), - ("testShouldNotMatchNonNilTypes", testShouldNotMatchNonNilTypes), - ("testShouldNotMatchTrue", testShouldNotMatchTrue), - ] -} - -extension BeGreaterThanOrEqualToTest { - static let __allTests = [ - ("testGreaterThanOrEqualTo", testGreaterThanOrEqualTo), - ("testGreaterThanOrEqualToOperator", testGreaterThanOrEqualToOperator), - ] -} - -extension BeGreaterThanTest { - static let __allTests = [ - ("testGreaterThan", testGreaterThan), - ("testGreaterThanOperator", testGreaterThanOperator), - ] -} - -extension BeIdenticalToObjectTest { - static let __allTests = [ - ("testBeIdenticalToNegative", testBeIdenticalToNegative), - ("testBeIdenticalToNegativeMessage", testBeIdenticalToNegativeMessage), - ("testBeIdenticalToPositive", testBeIdenticalToPositive), - ("testBeIdenticalToPositiveMessage", testBeIdenticalToPositiveMessage), - ("testFailsOnNils", testFailsOnNils), - ("testOperators", testOperators), - ] -} - -extension BeIdenticalToTest { - static let __allTests = [ - ("testBeAlias", testBeAlias), - ("testBeIdenticalToNegative", testBeIdenticalToNegative), - ("testBeIdenticalToNegativeMessage", testBeIdenticalToNegativeMessage), - ("testBeIdenticalToPositive", testBeIdenticalToPositive), - ("testBeIdenticalToPositiveMessage", testBeIdenticalToPositiveMessage), - ("testOperators", testOperators), - ] -} - -extension BeLessThanOrEqualToTest { - static let __allTests = [ - ("testLessThanOrEqualTo", testLessThanOrEqualTo), - ("testLessThanOrEqualToOperator", testLessThanOrEqualToOperator), - ] -} - -extension BeLessThanTest { - static let __allTests = [ - ("testLessThan", testLessThan), - ("testLessThanOperator", testLessThanOperator), - ] -} - -extension BeNilTest { - static let __allTests = [ - ("testBeNil", testBeNil), - ] -} - -extension BeTrueTest { - static let __allTests = [ - ("testShouldMatchTrue", testShouldMatchTrue), - ("testShouldNotMatchFalse", testShouldNotMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ] -} - -extension BeTruthyTest { - static let __allTests = [ - ("testShouldMatchBoolConvertibleTypesThatConvertToTrue", testShouldMatchBoolConvertibleTypesThatConvertToTrue), - ("testShouldMatchNonNilTypes", testShouldMatchNonNilTypes), - ("testShouldMatchTrue", testShouldMatchTrue), - ("testShouldNotMatchBoolConvertibleTypesThatConvertToFalse", testShouldNotMatchBoolConvertibleTypesThatConvertToFalse), - ("testShouldNotMatchFalse", testShouldNotMatchFalse), - ("testShouldNotMatchNilBools", testShouldNotMatchNilBools), - ("testShouldNotMatchNilTypes", testShouldNotMatchNilTypes), - ] -} - -extension BeVoidTest { - static let __allTests = [ - ("testBeVoid", testBeVoid), - ] -} - -extension BeginWithTest { - static let __allTests = [ - ("testNegativeMatches", testNegativeMatches), - ("testPositiveMatches", testPositiveMatches), - ] -} - -extension ContainElementSatisfyingTest { - static let __allTests = [ - ("testContainElementSatisfying", testContainElementSatisfying), - ("testContainElementSatisfyingDefaultErrorMessage", testContainElementSatisfyingDefaultErrorMessage), - ("testContainElementSatisfyingNegativeCase", testContainElementSatisfyingNegativeCase), - ("testContainElementSatisfyingNegativeCaseDefaultErrorMessage", testContainElementSatisfyingNegativeCaseDefaultErrorMessage), - ("testContainElementSatisfyingNegativeCaseSpecificErrorMessage", testContainElementSatisfyingNegativeCaseSpecificErrorMessage), - ("testContainElementSatisfyingSpecificErrorMessage", testContainElementSatisfyingSpecificErrorMessage), - ] -} - -extension ContainTest { - static let __allTests = [ - ("testCollectionArguments", testCollectionArguments), - ("testContainObjCSubstring", testContainObjCSubstring), - ("testContainSequence", testContainSequence), - ("testContainSequenceAndSetAlgebra", testContainSequenceAndSetAlgebra), - ("testContainSetAlgebra", testContainSetAlgebra), - ("testContainSubstring", testContainSubstring), - ("testVariadicArguments", testVariadicArguments), - ] -} - -extension ElementsEqualTest { - static let __allTests = [ - ("testSequenceElementsEquality", testSequenceElementsEquality), - ] -} - -extension EndWithTest { - static let __allTests = [ - ("testEndWithNegatives", testEndWithNegatives), - ("testEndWithPositives", testEndWithPositives), - ] -} - -extension EqualTest { - static let __allTests = [ - ("testArrayEquality", testArrayEquality), - ("testArrayOfOptionalsEquality", testArrayOfOptionalsEquality), - ("testDataEquality", testDataEquality), - ("testDictionariesWithDifferentSequences", testDictionariesWithDifferentSequences), - ("testDictionaryEquality", testDictionaryEquality), - ("testDoesNotMatchNils", testDoesNotMatchNils), - ("testEquality", testEquality), - ("testNSObjectEquality", testNSObjectEquality), - ("testOperatorEquality", testOperatorEquality), - ("testOperatorEqualityWithArrays", testOperatorEqualityWithArrays), - ("testOperatorEqualityWithDictionaries", testOperatorEqualityWithDictionaries), - ("testOptionalEquality", testOptionalEquality), - ("testSetEquality", testSetEquality), - ] -} - -extension HaveCountTest { - static let __allTests = [ - ("testHaveCountForArray", testHaveCountForArray), - ("testHaveCountForDictionary", testHaveCountForDictionary), - ("testHaveCountForSet", testHaveCountForSet), - ] -} - -extension MatchErrorTest { - static let __allTests = [ - ("testDoesNotMatchNils", testDoesNotMatchNils), - ("testMatchErrorNegative", testMatchErrorNegative), - ("testMatchErrorPositive", testMatchErrorPositive), - ("testMatchNegativeMessage", testMatchNegativeMessage), - ("testMatchNSErrorNegative", testMatchNSErrorNegative), - ("testMatchNSErrorPositive", testMatchNSErrorPositive), - ("testMatchPositiveMessage", testMatchPositiveMessage), - ] -} - -extension MatchTest { - static let __allTests = [ - ("testMatchNegative", testMatchNegative), - ("testMatchNegativeMessage", testMatchNegativeMessage), - ("testMatchNils", testMatchNils), - ("testMatchPositive", testMatchPositive), - ("testMatchPositiveMessage", testMatchPositiveMessage), - ] -} - -extension PostNotificationTest { - static let __allTests = [ - ("testFailsWhenNoNotificationsArePosted", testFailsWhenNoNotificationsArePosted), - ("testFailsWhenNotificationWithWrongNameIsPosted", testFailsWhenNotificationWithWrongNameIsPosted), - ("testFailsWhenNotificationWithWrongObjectIsPosted", testFailsWhenNotificationWithWrongObjectIsPosted), - ("testPassesWhenAllExpectedNotificationsArePosted", testPassesWhenAllExpectedNotificationsArePosted), - ("testPassesWhenExpectedNotificationEventuallyIsPosted", testPassesWhenExpectedNotificationEventuallyIsPosted), - ("testPassesWhenExpectedNotificationIsPosted", testPassesWhenExpectedNotificationIsPosted), - ("testPassesWhenNoNotificationsArePosted", testPassesWhenNoNotificationsArePosted), - ] -} - -extension SatisfyAllOfTest { - static let __allTests = [ - ("testOperatorAnd", testOperatorAnd), - ("testSatisfyAllOf", testSatisfyAllOf), - ] -} - -extension SatisfyAnyOfTest { - static let __allTests = [ - ("testOperatorOr", testOperatorOr), - ("testSatisfyAnyOf", testSatisfyAnyOf), - ] -} - -extension SynchronousTest { - static let __allTests = [ - ("testFailAlwaysFails", testFailAlwaysFails), - ("testNotToMatchesLikeToNot", testNotToMatchesLikeToNot), - ("testToMatchAgainstLazyProperties", testToMatchAgainstLazyProperties), - ("testToMatchesIfMatcherReturnsTrue", testToMatchesIfMatcherReturnsTrue), - ("testToNegativeMatches", testToNegativeMatches), - ("testToNotMatchesIfMatcherReturnsTrue", testToNotMatchesIfMatcherReturnsTrue), - ("testToNotNegativeMatches", testToNotNegativeMatches), - ("testToNotProvidesActualValueExpression", testToNotProvidesActualValueExpression), - ("testToNotProvidesAMemoizedActualValueExpression", testToNotProvidesAMemoizedActualValueExpression), - ("testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl", testToNotProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl), - ("testToProvidesActualValueExpression", testToProvidesActualValueExpression), - ("testToProvidesAMemoizedActualValueExpression", testToProvidesAMemoizedActualValueExpression), - ("testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl", testToProvidesAMemoizedActualValueExpressionIsEvaluatedAtMatcherControl), - ("testUnexpectedErrorsThrownFails", testUnexpectedErrorsThrownFails), - ] -} - -extension ThrowErrorTest { - static let __allTests = [ - ("testNegativeMatches", testNegativeMatches), - ("testNegativeMatchesDoNotCallClosureWithoutError", testNegativeMatchesDoNotCallClosureWithoutError), - ("testNegativeMatchesWithClosure", testNegativeMatchesWithClosure), - ("testNegativeNegatedMatches", testNegativeNegatedMatches), - ("testPositiveMatches", testPositiveMatches), - ("testPositiveMatchesWithClosures", testPositiveMatchesWithClosures), - ("testPositiveNegatedMatches", testPositiveNegatedMatches), - ] -} - -extension ToSucceedTest { - static let __allTests = [ - ("testToSucceed", testToSucceed), - ] -} - -extension UserDescriptionTest { - static let __allTests = [ - ("testNotToMatcher_CustomFailureMessage", testNotToMatcher_CustomFailureMessage), - ("testToEventuallyMatch_CustomFailureMessage", testToEventuallyMatch_CustomFailureMessage), - ("testToEventuallyNotMatch_CustomFailureMessage", testToEventuallyNotMatch_CustomFailureMessage), - ("testToMatcher_CustomFailureMessage", testToMatcher_CustomFailureMessage), - ("testToNotEventuallyMatch_CustomFailureMessage", testToNotEventuallyMatch_CustomFailureMessage), - ("testToNotMatcher_CustomFailureMessage", testToNotMatcher_CustomFailureMessage), - ] -} - -#if !os(macOS) -public func __allTests() -> [XCTestCaseEntry] { - return [ - testCase(AllPassTest.__allTests), - testCase(AsyncTest.__allTests), - testCase(BeAKindOfObjCTest.__allTests), - testCase(BeAKindOfSwiftTest.__allTests), - testCase(BeAnInstanceOfTest.__allTests), - testCase(BeCloseToTest.__allTests), - testCase(BeEmptyTest.__allTests), - testCase(BeFalseTest.__allTests), - testCase(BeFalsyTest.__allTests), - testCase(BeGreaterThanOrEqualToTest.__allTests), - testCase(BeGreaterThanTest.__allTests), - testCase(BeIdenticalToObjectTest.__allTests), - testCase(BeIdenticalToTest.__allTests), - testCase(BeLessThanOrEqualToTest.__allTests), - testCase(BeLessThanTest.__allTests), - testCase(BeNilTest.__allTests), - testCase(BeTrueTest.__allTests), - testCase(BeTruthyTest.__allTests), - testCase(BeVoidTest.__allTests), - testCase(BeginWithTest.__allTests), - testCase(ContainElementSatisfyingTest.__allTests), - testCase(ContainTest.__allTests), - testCase(ElementsEqualTest.__allTests), - testCase(EndWithTest.__allTests), - testCase(EqualTest.__allTests), - testCase(HaveCountTest.__allTests), - testCase(MatchErrorTest.__allTests), - testCase(MatchTest.__allTests), - testCase(PostNotificationTest.__allTests), - testCase(SatisfyAllOfTest.__allTests), - testCase(SatisfyAnyOfTest.__allTests), - testCase(SynchronousTest.__allTests), - testCase(ThrowErrorTest.__allTests), - testCase(ToSucceedTest.__allTests), - testCase(UserDescriptionTest.__allTests), - ] -} -#endif diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m index 2aae8168c..64b6a0585 100644 --- a/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m +++ b/Carthage/Checkouts/Quick/Externals/Nimble/Tests/NimbleTests/objc/ObjCSyncTest.m @@ -18,4 +18,16 @@ - (void)testFailureExpectation { }); } +#pragma mark - Assertion chaining + +- (void)testChain { + expect(@2).toNot(equal(@1)).to(equal(@2)).notTo(equal(@3)); +} + +- (void)testChainFail { + expectFailureMessages((@[@"expected to not equal <2>, got <2>", @"expected to equal <3>, got <2>"]), ^{ + expect(@2).toNot(equal(@1)).toNot(equal(@2)).to(equal(@3)); + }); +} + @end diff --git a/Carthage/Checkouts/Quick/Externals/Nimble/test b/Carthage/Checkouts/Quick/Externals/Nimble/test index 3c17d810d..6749f577e 100755 --- a/Carthage/Checkouts/Quick/Externals/Nimble/test +++ b/Carthage/Checkouts/Quick/Externals/Nimble/test @@ -7,12 +7,14 @@ if which xcodebuild > /dev/null; then echo -e "Gathering ${GREEN}xcodebuild sdk versions${CLEAR}..." BUILD_DIR=`pwd`/build LATEST_IOS_SDK_VERSION=`xcodebuild -showsdks | grep iphonesimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` + LATEST_IOS_VERSION=`xcrun simctl list | grep ^iOS | ruby -e 'puts /\(([0-9.]+).*\)/.match(STDIN.read.chomp.split("\n").last).to_a[1]'` LATEST_TVOS_SDK_VERSION=`xcodebuild -showsdks | grep appletvsimulator | cut -d ' ' -f 4 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` - LATEST_MACOS_SDK_VERSION=`xcodebuild -showsdks | grep 'macosx' | cut -d ' ' -f 3 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` + LATEST_TVOS_VERSION=`xcrun simctl list | grep ^tvOS | ruby -e 'puts /\(([0-9.]+).*\)/.match(STDIN.read.chomp.split("\n").last).to_a[1]'` + LATEST_MACOS_SDK_VERSION=`xcodebuild -showsdks | grep 'macosx' | cut -d ' ' -f 2 | ruby -e 'puts STDIN.read.chomp.split("\n").last'` BUILD_IOS_SDK_VERSION=${NIMBLE_BUILD_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} - RUNTIME_IOS_SDK_VERSION=${NIMBLE_RUNTIME_IOS_SDK_VERSION:-$LATEST_IOS_SDK_VERSION} + RUNTIME_IOS_VERSION=${NIMBLE_RUNTIME_IOS_VERSION:-$LATEST_IOS_VERSION} BUILD_TVOS_SDK_VERSION=${NIMBLE_BUILD_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} - RUNTIME_TVOS_SDK_VERSION=${NIMBLE_RUNTIME_TVOS_SDK_VERSION:-$LATEST_TVOS_SDK_VERSION} + RUNTIME_TVOS_VERSION=${NIMBLE_RUNTIME_TVOS_VERSION:-$LATEST_TVOS_VERSION} BUILD_MACOS_SDK_VERSION=${NIMBLE_BUILD_MACOS_SDK_VERSION:-$LATEST_MACOS_SDK_VERSION} fi @@ -33,12 +35,12 @@ function print_env { echo " iOS:" echo " Latest iOS SDK: $LATEST_IOS_SDK_VERSION" echo " Building with iOS SDK: `color_if_overridden $BUILD_IOS_SDK_VERSION $NIMBLE_BUILD_IOS_SDK_VERSION`" - echo " Running with iOS SDK: `color_if_overridden $RUNTIME_IOS_SDK_VERSION $NIMBLE_RUNTIME_IOS_SDK_VERSION`" + echo " Running with iOS: `color_if_overridden $RUNTIME_IOS_VERSION $NIMBLE_RUNTIME_IOS_VERSION`" echo echo " tvOS:" echo " Latest tvOS SDK: $LATEST_TVOS_SDK_VERSION" echo " Building with tvOS SDK: `color_if_overridden $BUILD_TVOS_SDK_VERSION $NIMBLE_BUILD_TVOS_SDK_VERSION`" - echo " Running with tvOS SDK: `color_if_overridden $RUNTIME_TVOS_SDK_VERSION $NIMBLE_RUNTIME_TVOS_SDK_VERSION`" + echo " Running with tvOS: `color_if_overridden $RUNTIME_TVOS_VERSION $NIMBLE_RUNTIME_TVOS_VERSION`" echo echo " macOS:" echo " Latest macOS SDK: $LATEST_MACOS_SDK_VERSION" @@ -57,40 +59,49 @@ function test_ios { run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -destination "generic/platform=iOS" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build | xcpretty run osascript -e 'tell app "Simulator" to quit' - run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPad Pro (11-inch),OS=$RUNTIME_IOS_SDK_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty + run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPad Pro (9.7-inch),OS=$RUNTIME_IOS_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty run osascript -e 'tell app "Simulator" to quit' - run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPhone 8,OS=$RUNTIME_IOS_SDK_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty + run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-iOS" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPhone 8,OS=$RUNTIME_IOS_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty } function test_tvos { run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-tvOS" -configuration "Debug" -destination "generic/platform=tvOS" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build | xcpretty run osascript -e 'tell app "Simulator" to quit' - run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-tvOS" -configuration "Debug" -sdk "appletvsimulator$BUILD_TVOS_SDK_VERSION" -destination "name=Apple TV,OS=$RUNTIME_TVOS_SDK_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty + run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-tvOS" -configuration "Debug" -sdk "appletvsimulator$BUILD_TVOS_SDK_VERSION" -destination "name=Apple TV,OS=$RUNTIME_TVOS_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty } function test_macos { run set -o pipefail && xcodebuild -project Nimble.xcodeproj -scheme "Nimble-macOS" -configuration "Debug" -sdk "macosx$BUILD_MACOS_SDK_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty } +function test_xcode_spm_macos { + mv Nimble.xcodeproj Nimble.xcodeproj.bak + trap 'mv Nimble.xcodeproj.bak Nimble.xcodeproj' EXIT + run set -o pipefail && xcodebuild -scheme "Nimble" -configuration "Debug" -sdk "macosx$BUILD_MACOS_SDK_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty +} + +function test_xcode_spm_ios { + run osascript -e 'tell app "Simulator" to quit' + mv Nimble.xcodeproj Nimble.xcodeproj.bak + trap 'mv Nimble.xcodeproj.bak Nimble.xcodeproj' EXIT + run set -o pipefail && xcodebuild -scheme "Nimble" -configuration "Debug" -sdk "iphonesimulator$BUILD_IOS_SDK_VERSION" -destination "name=iPhone 8,OS=$RUNTIME_IOS_VERSION" OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' build-for-testing test-without-building | xcpretty +} + function test_podspec { echo "Gathering CocoaPods installation information..." run bundle exec pod --version echo "Linting podspec..." - # To work around the lint error: "ERROR | swift: Specification `Nimble` specifies an inconsistent `swift_version` (`4.0`) compared to the one present in your `.swift-version` file (`4.1`). Please remove the `.swift-version` file which is now deprecated and only use the `swift_version` attribute within your podspec." - # `.swift-version` is for swiftenv, not for CocoaPods, so we can't remove the file as suggested. - run mv .swift-version .swift-version.backup # Note: remove `--allow-warnings` once old Matcher API has been removed - run bundle exec pod lib lint Nimble.podspec --allow-warnings --skip-import-validation - run mv .swift-version.backup .swift-version + run bundle exec pod lib lint Nimble.podspec --allow-warnings --skip-import-validation --verbose } function test_swiftpm { if [ -d .build ]; then run swift package clean fi - run swift build -Xswiftc -suppress-warnings && swift test -Xswiftc -suppress-warnings + run swift build -Xswiftc -suppress-warnings && swift test -Xswiftc -suppress-warnings --enable-test-discovery } function test_swiftpm_docker { @@ -103,6 +114,13 @@ function test() { test_tvos test_macos + if xcodebuild --help 2>&1 | grep xcframework > /dev/null; then + test_xcode_spm_ios + test_xcode_spm_macos + else + echo "Not testing with Swift Package Manager version of Xcode because it requires at least Xcode 11" + fi + if which swift-test; then test_swiftpm else @@ -127,12 +145,14 @@ function help { echo " all - Runs the all tests of macos, ios and tvos" echo " clean - Cleans the derived data directory of Xcode. Assumes default location" echo " help - Displays this help" - echo " ios - Runs the tests as an iOS device" echo " macos - Runs the tests on macOS 10.10 (Yosemite and newer only)" + echo " macos_xcodespm - Runs the tests on macOS using the Swift Package Manager version of Xcode" + echo " ios - Runs the tests as an iOS device" + echo " ios_xcodespm - Runs the tests as an iOS device using the Swift Package Manager version of Xcode" + echo " tvos - Runs the tests as an tvOS device" echo " podspec - Runs pod lib lint against the podspec to detect breaking changes" echo " swiftpm - Runs the tests built by the Swift Package Manager" echo " swiftpm_docker - Runs the tests built by the Swift Package Manager in a docker linux container" - echo " tvos - Runs the tests as an tvOS device" echo exit 1 } @@ -144,8 +164,10 @@ function main { case "$arg" in clean) clean ;; ios) test_ios ;; + ios_xcodespm) test_xcode_spm_ios ;; tvos) test_tvos ;; macos) test_macos ;; + macos_xcodespm) test_xcode_spm_macos ;; podspec) test_podspec ;; test) test ;; all) test ;; diff --git a/Carthage/Checkouts/Quick/Gemfile b/Carthage/Checkouts/Quick/Gemfile index 22da5457a..a29354cef 100644 --- a/Carthage/Checkouts/Quick/Gemfile +++ b/Carthage/Checkouts/Quick/Gemfile @@ -1,5 +1,4 @@ source "https://rubygems.org" -gem 'cocoapods', '~> 1.7' +gem 'cocoapods', '~> 1.9' gem 'danger' -gem 'danger-swiftlint' diff --git a/Carthage/Checkouts/Quick/Gemfile.lock b/Carthage/Checkouts/Quick/Gemfile.lock index 9eb0fede1..1eefeb879 100644 --- a/Carthage/Checkouts/Quick/Gemfile.lock +++ b/Carthage/Checkouts/Quick/Gemfile.lock @@ -1,30 +1,33 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.1) - activesupport (4.2.11.1) + CFPropertyList (3.0.2) + activesupport (4.2.11.3) i18n (~> 0.7) minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + algoliasearch (1.27.2) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) atomos (0.1.3) claide (1.0.3) claide-plugins (0.9.2) cork nap open4 (~> 1.3) - cocoapods (1.7.5) + cocoapods (1.9.2) activesupport (>= 4.0.2, < 5) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.7.5) + cocoapods-core (= 1.9.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 1.2.2, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.3.1, < 2.0) + cocoapods-trunk (>= 1.4.0, < 2.0) cocoapods-try (>= 1.1.0, < 2.0) colored2 (~> 3.1) escape (~> 0.0.4) @@ -33,76 +36,90 @@ GEM molinillo (~> 0.6.6) nap (~> 1.0) ruby-macho (~> 1.4) - xcodeproj (>= 1.10.0, < 2.0) - cocoapods-core (1.7.5) + xcodeproj (>= 1.14.0, < 2.0) + cocoapods-core (1.9.2) activesupport (>= 4.0.2, < 6) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) fuzzy_match (~> 2.0.4) nap (~> 1.0) + netrc (~> 0.11) + typhoeus (~> 1.0) cocoapods-deintegrate (1.0.4) - cocoapods-downloader (1.2.2) + cocoapods-downloader (1.3.0) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.0) cocoapods-stats (1.1.0) - cocoapods-trunk (1.4.0) + cocoapods-trunk (1.5.0) nap (>= 0.8, < 2.0) netrc (~> 0.11) - cocoapods-try (1.1.0) + cocoapods-try (1.2.0) colored2 (3.1.2) - concurrent-ruby (1.1.5) + concurrent-ruby (1.1.6) cork (0.3.0) colored2 (~> 3.1) - danger (6.0.3) + danger (8.0.0) claide (~> 1.0) claide-plugins (>= 0.9.2) colored2 (~> 3.1) cork (~> 0.1) - faraday (~> 0.9) - faraday-http-cache (~> 1.0) - git (~> 1.5) + faraday (>= 0.9.0, < 2.0) + faraday-http-cache (~> 2.0) + git (~> 1.7) kramdown (~> 2.0) kramdown-parser-gfm (~> 1.0) no_proxy_fix octokit (~> 4.7) terminal-table (~> 1) - danger-swiftlint (0.2.1) - danger escape (0.0.4) - faraday (0.15.4) + ethon (0.12.0) + ffi (>= 1.3.0) + faraday (1.0.1) multipart-post (>= 1.2, < 3) - faraday-http-cache (1.3.1) - faraday (~> 0.8) + faraday-http-cache (2.2.0) + faraday (>= 0.8) + ffi (1.12.2) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - git (1.5.0) + git (1.7.0) + rchardet (~> 1.8) + httpclient (2.8.3) i18n (0.9.5) concurrent-ruby (~> 1.0) - kramdown (2.1.0) - kramdown-parser-gfm (1.0.1) + json (2.3.0) + kramdown (2.2.1) + rexml + kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - minitest (5.11.3) + minitest (5.14.1) molinillo (0.6.6) - multipart-post (2.0.0) + multipart-post (2.1.1) nanaimo (0.2.6) nap (1.1.0) netrc (0.11.0) no_proxy_fix (0.1.2) - octokit (4.14.0) + octokit (4.18.0) + faraday (>= 0.9) sawyer (~> 0.8.0, >= 0.5.3) open4 (1.3.4) - public_suffix (3.0.3) + public_suffix (4.0.5) + rchardet (1.8.0) + rexml (3.2.4) ruby-macho (1.4.0) - sawyer (0.8.1) - addressable (>= 2.3.5, < 2.6) - faraday (~> 0.8, < 1.0) + sawyer (0.8.2) + addressable (>= 2.3.5) + faraday (> 0.8, < 2.0) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) thread_safe (0.3.6) - tzinfo (1.2.5) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (1.2.7) thread_safe (~> 0.1) - unicode-display_width (1.5.0) - xcodeproj (1.12.0) + unicode-display_width (1.7.0) + xcodeproj (1.16.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -113,9 +130,8 @@ PLATFORMS ruby DEPENDENCIES - cocoapods (~> 1.7) + cocoapods (~> 1.9) danger - danger-swiftlint BUNDLED WITH - 1.17.3 + 2.1.4 diff --git a/Carthage/Checkouts/Quick/Package.resolved b/Carthage/Checkouts/Quick/Package.resolved index 9d724da75..89372de2e 100644 --- a/Carthage/Checkouts/Quick/Package.resolved +++ b/Carthage/Checkouts/Quick/Package.resolved @@ -1,13 +1,31 @@ { "object": { "pins": [ + { + "package": "CwlCatchException", + "repositoryURL": "https://github.com/mattgallagher/CwlCatchException.git", + "state": { + "branch": null, + "revision": "f809deb30dc5c9d9b78c872e553261a61177721a", + "version": "2.0.0" + } + }, + { + "package": "CwlPreconditionTesting", + "repositoryURL": "https://github.com/mattgallagher/CwlPreconditionTesting.git", + "state": { + "branch": null, + "revision": "02b7a39a99c4da27abe03cab2053a9034379639f", + "version": "2.0.0" + } + }, { "package": "Nimble", "repositoryURL": "https://github.com/Quick/Nimble.git", "state": { "branch": null, - "revision": "a27c5186ce2d65f60d1237660b2509df3eb29023", - "version": "8.0.0" + "revision": "2ed9844b9267d5d5e82b222c362964dd46825161", + "version": "9.0.0-rc.1" } } ] diff --git a/Carthage/Checkouts/Quick/Package.swift b/Carthage/Checkouts/Quick/Package.swift index 3677c82a0..f72d6362d 100644 --- a/Carthage/Checkouts/Quick/Package.swift +++ b/Carthage/Checkouts/Quick/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.0 +// swift-tools-version:5.2 import PackageDescription @@ -11,7 +11,7 @@ let package = Package( .library(name: "Quick", targets: ["Quick"]), ], dependencies: [ - .package(url: "https://github.com/Quick/Nimble.git", from: "8.0.0"), + .package(url: "https://github.com/Quick/Nimble.git", from: "9.0.0-rc.1"), ], targets: { var targets: [Target] = [ @@ -28,11 +28,15 @@ let package = Package( "QuickTests/QuickConfigurationTests.m", ] ), + .testTarget( + name: "QuickIssue853RegressionTests", + dependencies: [ "Quick" ] + ), ] #if os(macOS) targets.append(contentsOf: [ - .target(name: "QuickSpecBase", dependencies: []), - .target(name: "Quick", dependencies: [ "QuickSpecBase" ]), + .target(name: "QuickObjCRuntime", dependencies: []), + .target(name: "Quick", dependencies: [ "QuickObjCRuntime" ]), ]) #else targets.append(contentsOf: [ diff --git a/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m b/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m index 31443f27a..97798be25 100644 --- a/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m +++ b/Carthage/Checkouts/Quick/Quick Templates/Quick Spec Class.xctemplate/Objective-C/___FILEBASENAME___.m @@ -6,8 +6,8 @@ // ___COPYRIGHT___ // -#import -#import +@import Quick; +@import Nimble; QuickSpecBegin(___FILEBASENAMEASIDENTIFIER___) diff --git a/Carthage/Checkouts/Quick/Quick.podspec b/Carthage/Checkouts/Quick/Quick.podspec index 1d85c7cf4..e42258d6a 100644 --- a/Carthage/Checkouts/Quick/Quick.podspec +++ b/Carthage/Checkouts/Quick/Quick.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Quick" - s.version = "2.2.0" + s.version = "3.0.0" s.summary = "The Swift (and Objective-C) testing framework." s.description = <<-DESC @@ -35,14 +35,15 @@ Pod::Spec.new do |s| s.user_target_xcconfig = { 'FRAMEWORK_SEARCH_PATHS' => '$(PLATFORM_DIR)/Developer/Library/Frameworks' } s.pod_target_xcconfig = { 'APPLICATION_EXTENSION_API_ONLY' => 'YES', + 'DEFINES_MODULE' => 'YES', 'ENABLE_BITCODE' => 'NO', 'OTHER_LDFLAGS' => '$(inherited) -Xlinker -no_application_extension', } s.cocoapods_version = '>= 1.4.0' if s.respond_to?(:swift_versions) then - s.swift_versions = ['4.2', '5.0'] + s.swift_versions = ['5.0'] else - s.swift_version = '4.2' + s.swift_version = '5.0' end end diff --git a/Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj b/Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj index 4dcf57e23..75a78c2cd 100644 --- a/Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj +++ b/Carthage/Checkouts/Quick/Quick.xcodeproj/project.pbxproj @@ -140,6 +140,9 @@ CD1F6506226398F600EBE9D8 /* XCTestObservationCenter+QCKSuspendObservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD1F6502226398F600EBE9D8 /* XCTestObservationCenter+QCKSuspendObservation.swift */; }; CD1F6507226398F600EBE9D8 /* XCTestObservationCenter+QCKSuspendObservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD1F6502226398F600EBE9D8 /* XCTestObservationCenter+QCKSuspendObservation.swift */; }; CD1F6508226398F600EBE9D8 /* XCTestObservationCenter+QCKSuspendObservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD1F6502226398F600EBE9D8 /* XCTestObservationCenter+QCKSuspendObservation.swift */; }; + CD21A026247C1385002C4762 /* QuickTestObservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD21A025247C1385002C4762 /* QuickTestObservation.swift */; }; + CD21A027247C1385002C4762 /* QuickTestObservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD21A025247C1385002C4762 /* QuickTestObservation.swift */; }; + CD21A028247C1385002C4762 /* QuickTestObservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD21A025247C1385002C4762 /* QuickTestObservation.swift */; }; CD264DBD1DDA147A0038B0EB /* AfterSuiteTests+ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 64076D241D6D80B500E2B499 /* AfterSuiteTests+ObjC.m */; }; CD582D6F2264B371008F7CE6 /* QuickSpec+MethodList.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD582D6E2264B371008F7CE6 /* QuickSpec+MethodList.swift */; }; CD582D702264B371008F7CE6 /* QuickSpec+MethodList.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD582D6E2264B371008F7CE6 /* QuickSpec+MethodList.swift */; }; @@ -150,9 +153,9 @@ CD582D762264C137008F7CE6 /* QuickSpecRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD582D722264C137008F7CE6 /* QuickSpecRunner.swift */; }; CD582D772264C137008F7CE6 /* QuickSpecRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD582D722264C137008F7CE6 /* QuickSpecRunner.swift */; }; CD582D782264C137008F7CE6 /* QuickSpecRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD582D722264C137008F7CE6 /* QuickSpecRunner.swift */; }; - CDB2A957226B714400C0F199 /* SubclassOfSubclassWithStructPropertyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB2A956226B714400C0F199 /* SubclassOfSubclassWithStructPropertyTests.swift */; }; - CDB2A958226B714400C0F199 /* SubclassOfSubclassWithStructPropertyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB2A956226B714400C0F199 /* SubclassOfSubclassWithStructPropertyTests.swift */; }; - CDB2A959226B714400C0F199 /* SubclassOfSubclassWithStructPropertyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB2A956226B714400C0F199 /* SubclassOfSubclassWithStructPropertyTests.swift */; }; + CD89D175247A673100C1F086 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8100E901A1E4447007595ED /* Nimble.framework */; }; + CD89D176247A673100C1F086 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEB6B8E1943873100289F44 /* Quick.framework */; }; + CD89D17F247A68A100C1F086 /* SubclassOfSubclassWithStructPropertyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD89D17E247A68A000C1F086 /* SubclassOfSubclassWithStructPropertyTests.swift */; }; CDE5BDFD2268CE95006E2F66 /* QuickConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD261AC81DEC8B0000A8863C /* QuickConfiguration.swift */; }; CDE5BDFE2268CE96006E2F66 /* QuickConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD261AC81DEC8B0000A8863C /* QuickConfiguration.swift */; }; CDE5BDFF2268CE97006E2F66 /* QuickConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD261AC81DEC8B0000A8863C /* QuickConfiguration.swift */; }; @@ -261,139 +264,6 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 047655511949F4CB00B288BB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 047655531949F4CB00B288BB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04765555194A327000B288BB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97E4194B4A6000CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97E6194B4A6000CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97E8194B4B7E00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97EA194B4B9B00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97F0194B82DB00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97F2194B82DE00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97F6194B831200CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97F8194B834000CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97FA194B834100CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC97FC194B834B00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC97FE194B835E00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC9800194B836100CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC9802194B836300CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC9804194B838400CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; - 04DC9806194B838700CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; - }; - 04DC9808194B838B00CE00B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; 1F118CE01BDCA4AB005013A2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DAEB6B851943873100289F44 /* Project object */; @@ -408,54 +278,47 @@ remoteGlobalIDString = 1F118CD41BDCA4AB005013A2; remoteInfo = "Quick-tvOS"; }; - 5A5D118819473F2100F6D13D /* PBXContainerItemProxy */ = { + 64076CE71D6D7C2000E2B499 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DAEB6B851943873100289F44 /* Project object */; proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; + remoteGlobalIDString = DAEB6B8D1943873100289F44; + remoteInfo = "Quick-OSX"; }; - 5A5D11EF194741B500F6D13D /* PBXContainerItemProxy */ = { + 64076CFA1D6D7CD600E2B499 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DAEB6B851943873100289F44 /* Project object */; proxyType = 1; remoteGlobalIDString = 5A5D117B19473F2100F6D13D; remoteInfo = "Quick-iOS"; }; - 5A5D11F1194741B500F6D13D /* PBXContainerItemProxy */ = { + 64076D0C1D6D7CEA00E2B499 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DAEB6B851943873100289F44 /* Project object */; proxyType = 1; - remoteGlobalIDString = 5A5D117B19473F2100F6D13D; - remoteInfo = "Quick-iOS"; + remoteGlobalIDString = 1F118CD41BDCA4AB005013A2; + remoteInfo = "Quick-tvOS"; }; - 64076CE71D6D7C2000E2B499 /* PBXContainerItemProxy */ = { + CD89D14824791ED000C1F086 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DAEB6B851943873100289F44 /* Project object */; proxyType = 1; remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = "Quick-OSX"; + remoteInfo = "Quick-macOS"; }; - 64076CFA1D6D7CD600E2B499 /* PBXContainerItemProxy */ = { + CD89D14A24791EDA00C1F086 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DAEB6B851943873100289F44 /* Project object */; proxyType = 1; remoteGlobalIDString = 5A5D117B19473F2100F6D13D; remoteInfo = "Quick-iOS"; }; - 64076D0C1D6D7CEA00E2B499 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1F118CD41BDCA4AB005013A2; - remoteInfo = "Quick-tvOS"; - }; - 93625F381951DDC8006B1FE1 /* PBXContainerItemProxy */ = { + CD89D14E247A673100C1F086 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DAEB6B851943873100289F44 /* Project object */; proxyType = 1; remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; + remoteInfo = "Quick-macOS"; }; DA5663EF1A4C8D8500193C88 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; @@ -471,13 +334,6 @@ remoteGlobalIDString = 5A5D117B19473F2100F6D13D; remoteInfo = "Quick-iOS"; }; - DAEB6B9B1943873100289F44 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAEB6B851943873100289F44 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAEB6B8D1943873100289F44; - remoteInfo = Quick; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -514,13 +370,15 @@ 8D010A561C11726F00633E2B /* DescribeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DescribeTests.swift; sourceTree = ""; }; AED9C8621CC8A7BD00432F62 /* CrossReferencingSpecs.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrossReferencingSpecs.swift; sourceTree = ""; }; CD1F6502226398F600EBE9D8 /* XCTestObservationCenter+QCKSuspendObservation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCTestObservationCenter+QCKSuspendObservation.swift"; sourceTree = ""; }; + CD21A025247C1385002C4762 /* QuickTestObservation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickTestObservation.swift; sourceTree = ""; }; CD261AC81DEC8B0000A8863C /* QuickConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickConfiguration.swift; sourceTree = ""; }; CD3451461E4703D4000C8633 /* QuickMain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickMain.swift; sourceTree = ""; }; CD3451471E4703D4000C8633 /* QuickSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickSpec.swift; sourceTree = ""; }; CD582D6E2264B371008F7CE6 /* QuickSpec+MethodList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "QuickSpec+MethodList.swift"; sourceTree = ""; }; CD582D722264C137008F7CE6 /* QuickSpecRunner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSpecRunner.swift; sourceTree = ""; }; CD665CE0225A5BB9008F0AE6 /* LinuxMain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LinuxMain.swift; path = Tests/LinuxMain.swift; sourceTree = SOURCE_ROOT; }; - CDB2A956226B714400C0F199 /* SubclassOfSubclassWithStructPropertyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubclassOfSubclassWithStructPropertyTests.swift; sourceTree = ""; }; + CD89D17B247A673100C1F086 /* QuickIssue853RegressionTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QuickIssue853RegressionTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + CD89D17E247A68A000C1F086 /* SubclassOfSubclassWithStructPropertyTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubclassOfSubclassWithStructPropertyTests.swift; sourceTree = ""; }; CE175D4D1E8D6B4900EB5E84 /* Behavior.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Behavior.swift; sourceTree = ""; }; CE4A57891EA5DC270063C0D4 /* BehaviorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BehaviorTests.swift; sourceTree = ""; }; CE4A578D1EA7251C0063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FunctionalTests_BehaviorTests_Behaviors.swift; sourceTree = ""; }; @@ -644,6 +502,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + CD89D174247A673100C1F086 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CD89D175247A673100C1F086 /* Nimble.framework in Frameworks */, + CD89D176247A673100C1F086 /* Quick.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; DA5663E51A4C8D8500193C88 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -732,6 +599,15 @@ path = DSL; sourceTree = ""; }; + CD89D17D247A67BA00C1F086 /* QuickIssue853RegressionTests */ = { + isa = PBXGroup; + children = ( + CD89D17E247A68A000C1F086 /* SubclassOfSubclassWithStructPropertyTests.swift */, + ); + name = QuickIssue853RegressionTests; + path = Tests/QuickIssue853RegressionTests; + sourceTree = ""; + }; CDB2AA5E1D6C84CF005600C3 /* ObjC */ = { isa = PBXGroup; children = ( @@ -809,7 +685,6 @@ DED3037C1DF6CF140041394E /* BundleModuleNameTests.swift */, CE4A57891EA5DC270063C0D4 /* BehaviorTests.swift */, DA5CBB471EAFA55800297C9E /* CurrentSpecTests.swift */, - CDB2A956226B714400C0F199 /* SubclassOfSubclassWithStructPropertyTests.swift */, 79FE27DE22DC955400BA013D /* QuickSpec_SelectedTests.swift */, ); path = FunctionalTests; @@ -867,6 +742,7 @@ DAEB6B901943873100289F44 /* Quick */, 6C3983EE1D1E930D00637469 /* QuickObjectiveC */, DAEB6B9D1943873100289F44 /* QuickTests */, + CD89D17D247A67BA00C1F086 /* QuickIssue853RegressionTests */, DA9876BE1A4C87200004AA17 /* QuickFocusedTests */, 64076D1C1D6D7D0B00E2B499 /* QuickAfterSuiteTests */, DAEB6B8F1943873100289F44 /* Products */, @@ -891,6 +767,7 @@ 64076CF51D6D7C2000E2B499 /* QuickAfterSuite - macOSTests.xctest */, 64076D081D6D7CD600E2B499 /* QuickAfterSuite - iOSTests.xctest */, 64076D1A1D6D7CEA00E2B499 /* QuickAfterSuite - tvOSTests.xctest */, + CD89D17B247A673100C1F086 /* QuickIssue853RegressionTests.xctest */, ); name = Products; sourceTree = ""; @@ -903,6 +780,7 @@ DA408BDE19FF5599005DF92A /* Hooks */, CD3451461E4703D4000C8633 /* QuickMain.swift */, CD3451471E4703D4000C8633 /* QuickSpec.swift */, + CD21A025247C1385002C4762 /* QuickTestObservation.swift */, 34F375A619515CA700CE1B99 /* World.swift */, 34F3759E19515CA700CE1B99 /* Example.swift */, DA02C91819A8073100093156 /* ExampleMetadata.swift */, @@ -1092,17 +970,7 @@ buildRules = ( ); dependencies = ( - 5A5D118919473F2100F6D13D /* PBXTargetDependency */, - 5A5D11F0194741B500F6D13D /* PBXTargetDependency */, - 5A5D11F2194741B500F6D13D /* PBXTargetDependency */, - 04DC97E9194B4B7E00CE00B6 /* PBXTargetDependency */, - 04DC97EB194B4B9B00CE00B6 /* PBXTargetDependency */, - 04DC97F3194B82DE00CE00B6 /* PBXTargetDependency */, - 04DC97F7194B831200CE00B6 /* PBXTargetDependency */, - 04DC97FB194B834100CE00B6 /* PBXTargetDependency */, - 04DC97FF194B835E00CE00B6 /* PBXTargetDependency */, - 04DC9803194B836300CE00B6 /* PBXTargetDependency */, - 04DC9807194B838700CE00B6 /* PBXTargetDependency */, + CD89D14B24791EDA00C1F086 /* PBXTargetDependency */, ); name = "Quick - iOSTests"; productName = "Quick-iOSTests"; @@ -1163,6 +1031,24 @@ productReference = 64076D1A1D6D7CEA00E2B499 /* QuickAfterSuite - tvOSTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + CD89D14C247A673100C1F086 /* QuickIssue853RegressionTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = CD89D178247A673100C1F086 /* Build configuration list for PBXNativeTarget "QuickIssue853RegressionTests" */; + buildPhases = ( + CD89D14F247A673100C1F086 /* Sources */, + CD89D174247A673100C1F086 /* Frameworks */, + CD89D177247A673100C1F086 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + CD89D14D247A673100C1F086 /* PBXTargetDependency */, + ); + name = QuickIssue853RegressionTests; + productName = QuickTests; + productReference = CD89D17B247A673100C1F086 /* QuickIssue853RegressionTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; DA5663E71A4C8D8500193C88 /* QuickFocused - macOSTests */ = { isa = PBXNativeTarget; buildConfigurationList = DA5663F31A4C8D8500193C88 /* Build configuration list for PBXNativeTarget "QuickFocused - macOSTests" */; @@ -1228,19 +1114,7 @@ buildRules = ( ); dependencies = ( - DAEB6B9C1943873100289F44 /* PBXTargetDependency */, - 047655521949F4CB00B288BB /* PBXTargetDependency */, - 047655541949F4CB00B288BB /* PBXTargetDependency */, - 04765556194A327000B288BB /* PBXTargetDependency */, - 04DC97E5194B4A6000CE00B6 /* PBXTargetDependency */, - 04DC97E7194B4A6000CE00B6 /* PBXTargetDependency */, - 04DC97F1194B82DB00CE00B6 /* PBXTargetDependency */, - 04DC97F9194B834000CE00B6 /* PBXTargetDependency */, - 04DC97FD194B834B00CE00B6 /* PBXTargetDependency */, - 04DC9801194B836100CE00B6 /* PBXTargetDependency */, - 04DC9805194B838400CE00B6 /* PBXTargetDependency */, - 04DC9809194B838B00CE00B6 /* PBXTargetDependency */, - 93625F391951DDC8006B1FE1 /* PBXTargetDependency */, + CD89D14924791ED000C1F086 /* PBXTargetDependency */, ); name = "Quick - macOSTests"; productName = QuickTests; @@ -1316,6 +1190,7 @@ targets = ( DAEB6B8D1943873100289F44 /* Quick-macOS */, DAEB6B981943873100289F44 /* Quick - macOSTests */, + CD89D14C247A673100C1F086 /* QuickIssue853RegressionTests */, DA5663E71A4C8D8500193C88 /* QuickFocused - macOSTests */, 64076CE51D6D7C2000E2B499 /* QuickAfterSuite - macOSTests */, 5A5D117B19473F2100F6D13D /* Quick-iOS */, @@ -1388,6 +1263,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + CD89D177247A673100C1F086 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; DA5663E61A4C8D8500193C88 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1462,6 +1344,7 @@ CE175D501E8D6B4900EB5E84 /* Behavior.swift in Sources */, CE590E1F1C431FE400253D19 /* QuickTestSuite.swift in Sources */, 1F118D091BDCA536005013A2 /* QuickSpec.m in Sources */, + CD21A028247C1385002C4762 /* QuickTestObservation.swift in Sources */, CDE5BDFF2268CE97006E2F66 /* QuickConfiguration.swift in Sources */, 1F118D011BDCA536005013A2 /* ExampleHooks.swift in Sources */, ); @@ -1482,7 +1365,6 @@ CE4A57911EA7252E0063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift in Sources */, DED3037F1DF6CF140041394E /* BundleModuleNameTests.swift in Sources */, 1F118D0F1BDCA54B005013A2 /* FunctionalTests_SharedExamplesTests_SharedExamples.swift in Sources */, - CDB2A959226B714400C0F199 /* SubclassOfSubclassWithStructPropertyTests.swift in Sources */, CD1F6507226398F600EBE9D8 /* XCTestObservationCenter+QCKSuspendObservation.swift in Sources */, 1F118D101BDCA556005013A2 /* Configuration+AfterEach.swift in Sources */, 1F118D1A1BDCA556005013A2 /* PendingTests.swift in Sources */, @@ -1550,6 +1432,7 @@ CE175D4F1E8D6B4900EB5E84 /* Behavior.swift in Sources */, CE590E1A1C431FE300253D19 /* QuickTestSuite.swift in Sources */, DA3124E719FCAEE8002858A7 /* DSL.swift in Sources */, + CD21A027247C1385002C4762 /* QuickTestObservation.swift in Sources */, CDE5BDFE2268CE96006E2F66 /* QuickConfiguration.swift in Sources */, DA6B30191A4DB0D500FFB148 /* Filter.swift in Sources */, ); @@ -1570,7 +1453,6 @@ DA05D61119F73A3800771050 /* AfterEachTests.swift in Sources */, DAB0137019FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift in Sources */, DA8F91A619F3208B006F6675 /* BeforeSuiteTests.swift in Sources */, - CDB2A958226B714400C0F199 /* SubclassOfSubclassWithStructPropertyTests.swift in Sources */, CD1F6505226398F600EBE9D8 /* XCTestObservationCenter+QCKSuspendObservation.swift in Sources */, DA8C00221A01E4B900CE58A6 /* QuickConfigurationTests.m in Sources */, CE4A578A1EA5DC270063C0D4 /* BehaviorTests.swift in Sources */, @@ -1625,6 +1507,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + CD89D14F247A673100C1F086 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CD89D17F247A68A100C1F086 /* SubclassOfSubclassWithStructPropertyTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; DA5663E41A4C8D8500193C88 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1678,6 +1568,7 @@ CE175D4E1E8D6B4900EB5E84 /* Behavior.swift in Sources */, 34F375AB19515CA700CE1B99 /* Example.swift in Sources */, DA3124E619FCAEE8002858A7 /* DSL.swift in Sources */, + CD21A026247C1385002C4762 /* QuickTestObservation.swift in Sources */, CDE5BDFD2268CE95006E2F66 /* QuickConfiguration.swift in Sources */, DA6B30181A4DB0D500FFB148 /* Filter.swift in Sources */, ); @@ -1698,7 +1589,6 @@ CE4A57921EA725300063C0D4 /* FunctionalTests_BehaviorTests_Behaviors.swift in Sources */, DED3037D1DF6CF140041394E /* BundleModuleNameTests.swift in Sources */, DA05D61019F73A3800771050 /* AfterEachTests.swift in Sources */, - CDB2A957226B714400C0F199 /* SubclassOfSubclassWithStructPropertyTests.swift in Sources */, CD1F6503226398F600EBE9D8 /* XCTestObservationCenter+QCKSuspendObservation.swift in Sources */, DAB0136F19FC4315006AFBEE /* SharedExamples+BeforeEachTests.swift in Sources */, DA8F91A519F3208B006F6675 /* BeforeSuiteTests.swift in Sources */, @@ -1729,101 +1619,6 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 047655521949F4CB00B288BB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 047655511949F4CB00B288BB /* PBXContainerItemProxy */; - }; - 047655541949F4CB00B288BB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 047655531949F4CB00B288BB /* PBXContainerItemProxy */; - }; - 04765556194A327000B288BB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04765555194A327000B288BB /* PBXContainerItemProxy */; - }; - 04DC97E5194B4A6000CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97E4194B4A6000CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97E7194B4A6000CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97E6194B4A6000CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97E9194B4B7E00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97E8194B4B7E00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97EB194B4B9B00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97EA194B4B9B00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F1194B82DB00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97F0194B82DB00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F3194B82DE00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97F2194B82DE00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F7194B831200CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97F6194B831200CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97F9194B834000CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97F8194B834000CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97FB194B834100CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97FA194B834100CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97FD194B834B00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC97FC194B834B00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC97FF194B835E00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC97FE194B835E00CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9801194B836100CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC9800194B836100CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9803194B836300CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC9802194B836300CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9805194B838400CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC9804194B838400CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9807194B838700CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 04DC9806194B838700CE00B6 /* PBXContainerItemProxy */; - }; - 04DC9809194B838B00CE00B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 04DC9808194B838B00CE00B6 /* PBXContainerItemProxy */; - }; 1F118CE11BDCA4AB005013A2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */; @@ -1834,21 +1629,6 @@ target = 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */; targetProxy = 1F118CF61BDCA4BB005013A2 /* PBXContainerItemProxy */; }; - 5A5D118919473F2100F6D13D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 5A5D118819473F2100F6D13D /* PBXContainerItemProxy */; - }; - 5A5D11F0194741B500F6D13D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 5A5D11EF194741B500F6D13D /* PBXContainerItemProxy */; - }; - 5A5D11F2194741B500F6D13D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; - targetProxy = 5A5D11F1194741B500F6D13D /* PBXContainerItemProxy */; - }; 64076CE61D6D7C2000E2B499 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = DAEB6B8D1943873100289F44 /* Quick-macOS */; @@ -1864,10 +1644,20 @@ target = 1F118CD41BDCA4AB005013A2 /* Quick-tvOS */; targetProxy = 64076D0C1D6D7CEA00E2B499 /* PBXContainerItemProxy */; }; - 93625F391951DDC8006B1FE1 /* PBXTargetDependency */ = { + CD89D14924791ED000C1F086 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = 93625F381951DDC8006B1FE1 /* PBXContainerItemProxy */; + targetProxy = CD89D14824791ED000C1F086 /* PBXContainerItemProxy */; + }; + CD89D14B24791EDA00C1F086 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; + targetProxy = CD89D14A24791EDA00C1F086 /* PBXContainerItemProxy */; + }; + CD89D14D247A673100C1F086 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DAEB6B8D1943873100289F44 /* Quick-macOS */; + targetProxy = CD89D14E247A673100C1F086 /* PBXContainerItemProxy */; }; DA5663F01A4C8D8500193C88 /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -1879,11 +1669,6 @@ target = 5A5D117B19473F2100F6D13D /* Quick-iOS */; targetProxy = DA9876B91A4C70EB0004AA17 /* PBXContainerItemProxy */; }; - DAEB6B9C1943873100289F44 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAEB6B8D1943873100289F44 /* Quick-macOS */; - targetProxy = DAEB6B9B1943873100289F44 /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -1891,6 +1676,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -1924,6 +1710,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; COPY_PHASE_STRIP = NO; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2047,6 +1834,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -2076,7 +1864,6 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; @@ -2084,6 +1871,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -2110,7 +1898,6 @@ SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 9.0; VALIDATE_PRODUCT = YES; }; name = Release; @@ -2313,6 +2100,52 @@ }; name = Release; }; + CD89D179247A673100C1F086 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + METAL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "QuickTests-Swift.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + CD89D17A247A673100C1F086 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/QuickTests/QuickTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + METAL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "io.quick.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = Tests/QuickTests/QuickTests/Helpers/QuickTestsBridgingHeader.h; + SWIFT_OBJC_INTERFACE_HEADER_NAME = "QuickTests-Swift.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + }; + name = Release; + }; DA5663F11A4C8D8500193C88 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2462,7 +2295,7 @@ SDKROOT = macosx; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -2517,7 +2350,7 @@ SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -2527,6 +2360,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2559,6 +2393,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2718,6 +2553,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + CD89D178247A673100C1F086 /* Build configuration list for PBXNativeTarget "QuickIssue853RegressionTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CD89D179247A673100C1F086 /* Debug */, + CD89D17A247A673100C1F086 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; DA5663F31A4C8D8500193C88 /* Build configuration list for PBXNativeTarget "QuickFocused - macOSTests" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme b/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme index c0116c3cf..ca411239e 100644 --- a/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme +++ b/Carthage/Checkouts/Quick/Quick.xcodeproj/xcshareddata/xcschemes/Quick-macOS.xcscheme @@ -41,6 +41,15 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> + + + + @@ -72,18 +81,17 @@ ReferencedContainer = "container:Quick.xcodeproj"> + + + + - - - - - - - - { /** diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift b/Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift index 9250a1772..33e732ca5 100644 --- a/Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift +++ b/Carthage/Checkouts/Quick/Sources/Quick/Callsite.swift @@ -1,10 +1,12 @@ import Foundation #if canImport(Darwin) +// swiftlint:disable type_name @objcMembers public class _CallsiteBase: NSObject {} #else public class _CallsiteBase: NSObject {} +// swiftlint:enable type_name #endif // Ideally we would always use `StaticString` as the type for tracking the file name diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift b/Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift index fe3399737..71b263b5c 100644 --- a/Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift +++ b/Carthage/Checkouts/Quick/Sources/Quick/Configuration/Configuration.swift @@ -19,20 +19,24 @@ public typealias ExampleFilter = (_ example: Example) -> Bool final public class Configuration: NSObject { internal let exampleHooks = ExampleHooks() internal let suiteHooks = SuiteHooks() - internal var exclusionFilters: [ExampleFilter] = [ { example in - if let pending = example.filterFlags[Filter.pending] { - return pending - } else { - return false - } - }] - internal var inclusionFilters: [ExampleFilter] = [ { example in - if let focused = example.filterFlags[Filter.focused] { - return focused - } else { - return false - } - }] + internal var exclusionFilters: [ExampleFilter] = [ + { example in // swiftlint:disable:this opening_brace + if let pending = example.filterFlags[Filter.pending] { + return pending + } else { + return false + } + }, + ] + internal var inclusionFilters: [ExampleFilter] = [ + { example in // swiftlint:disable:this opening_brace + if let focused = example.filterFlags[Filter.focused] { + return focused + } else { + return false + } + }, + ] /** Run all examples if none match the configured filters. True by default. @@ -88,13 +92,13 @@ final public class Configuration: NSObject { given closure before each example that is run. The closure passed to this method is executed before each example Quick runs, globally across the test suite. You may call this method multiple - times across mulitple +[QuickConfigure configure:] methods in order + times across multiple +[QuickConfigure configure:] methods in order to define several closures to run before each example. Note that, since Quick makes no guarantee as to the order in which +[QuickConfiguration configure:] methods are evaluated, there is no guarantee as to the order in which beforeEach closures are evaluated - either. Mulitple beforeEach defined on a single configuration, however, + either. Multiple beforeEach defined on a single configuration, however, will be executed in the order they're defined. - parameter closure: The closure to be executed before each example @@ -125,13 +129,13 @@ final public class Configuration: NSObject { given closure after each example that is run. The closure passed to this method is executed after each example Quick runs, globally across the test suite. You may call this method multiple - times across mulitple +[QuickConfigure configure:] methods in order + times across multiple +[QuickConfigure configure:] methods in order to define several closures to run after each example. Note that, since Quick makes no guarantee as to the order in which +[QuickConfiguration configure:] methods are evaluated, there is no guarantee as to the order in which afterEach closures are evaluated - either. Mulitple afterEach defined on a single configuration, however, + either. Multiple afterEach defined on a single configuration, however, will be executed in the order they're defined. - parameter closure: The closure to be executed before each example diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift b/Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift index 661df2e76..d807bfee0 100644 --- a/Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift +++ b/Carthage/Checkouts/Quick/Sources/Quick/Configuration/QuickConfiguration.swift @@ -21,7 +21,7 @@ extension QuickConfiguration { /// This block will be executed once for each subclass of QuickConfiguration. private static func enumerateSubclasses(_ block: (QuickConfiguration.Type) -> Void) { #if canImport(Darwin) - var classesCount = objc_getClassList(nil, 0) + let classesCount = objc_getClassList(nil, 0) guard classesCount > 0 else { return @@ -30,14 +30,14 @@ extension QuickConfiguration { let classes = UnsafeMutablePointer.allocate(capacity: Int(classesCount)) defer { free(classes) } - classesCount = objc_getClassList(AutoreleasingUnsafeMutablePointer(classes), classesCount) + objc_getClassList(AutoreleasingUnsafeMutablePointer(classes), classesCount) var configurationSubclasses: [QuickConfiguration.Type] = [] - for i in 0.. Void) { +public func it(_ description: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, closure: @escaping () throws -> Void) { World.sharedWorld.it(description, flags: flags, file: file, line: line, closure: closure) } @@ -198,7 +200,7 @@ public func pending(_ description: String, closure: () -> Void) { Use this to quickly mark a `describe` closure as pending. This disables all examples within the closure. */ -public func xdescribe(_ description: String, flags: FilterFlags, closure: () -> Void) { +public func xdescribe(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.xdescribe(description, flags: flags, closure: closure) } @@ -206,7 +208,7 @@ public func xdescribe(_ description: String, flags: FilterFlags, closure: () -> Use this to quickly mark a `context` closure as pending. This disables all examples within the closure. */ -public func xcontext(_ description: String, flags: FilterFlags, closure: () -> Void) { +public func xcontext(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { xdescribe(description, flags: flags, closure: closure) } @@ -214,7 +216,7 @@ public func xcontext(_ description: String, flags: FilterFlags, closure: () -> V Use this to quickly mark an `it` closure as pending. This disables the example and ensures the code within the closure is never run. */ -public func xit(_ description: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, closure: @escaping () -> Void) { +public func xit(_ description: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, closure: @escaping () throws -> Void) { World.sharedWorld.xit(description, flags: flags, file: file, line: line, closure: closure) } @@ -245,7 +247,7 @@ public func fcontext(_ description: String, flags: FilterFlags = [:], closure: ( Use this to quickly focus an `it` closure, focusing the example. If any examples in the test suite are focused, only those examples are executed. */ -public func fit(_ description: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, closure: @escaping () -> Void) { +public func fit(_ description: String, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, closure: @escaping () throws -> Void) { World.sharedWorld.fit(description, flags: flags, file: file, line: line, closure: closure) } @@ -269,3 +271,5 @@ public func fitBehavesLike(_ name: String, flags: FilterFlags = [:], file: FileS public func fitBehavesLike(_ behavior: Behavior.Type, flags: FilterFlags = [:], file: FileString = #file, line: UInt = #line, context: @escaping () -> C) { World.sharedWorld.fitBehavesLike(behavior, context: context, flags: flags, file: file, line: line) } + +// swiftlint:enable line_length diff --git a/Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift b/Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift index 14dcdbf45..7b4edf34e 100644 --- a/Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift +++ b/Carthage/Checkouts/Quick/Sources/Quick/DSL/World+DSL.swift @@ -20,9 +20,10 @@ extension World { internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { guard currentExampleMetadata == nil else { - raiseError("'describe' cannot be used inside '\(currentPhase)', 'describe' may only be used inside 'context' or 'describe'. ") + raiseError("'describe' cannot be used inside '\(currentPhase)', 'describe' may only be used inside 'context' or 'describe'.") } guard currentExampleGroup != nil else { + // swiftlint:disable:next line_length raiseError("Error: example group was not created by its parent QuickSpec spec. Check that describe() or context() was used in QuickSpec.spec() and not a more general context (i.e. an XCTestCase test)") } let group = ExampleGroup(description: description, flags: flags) @@ -32,7 +33,7 @@ extension World { internal func context(_ description: String, flags: FilterFlags, closure: () -> Void) { guard currentExampleMetadata == nil else { - raiseError("'context' cannot be used inside '\(currentPhase)', 'context' may only be used inside 'context' or 'describe'. ") + raiseError("'context' cannot be used inside '\(currentPhase)', 'context' may only be used inside 'context' or 'describe'.") } self.describe(description, flags: flags, closure: closure) } @@ -51,7 +52,7 @@ extension World { internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { - raiseError("'beforeEach' cannot be used inside '\(currentPhase)', 'beforeEach' may only be used inside 'context' or 'describe'. ") + raiseError("'beforeEach' cannot be used inside '\(currentPhase)', 'beforeEach' may only be used inside 'context' or 'describe'.") } currentExampleGroup.hooks.appendBefore(closure) } @@ -69,7 +70,7 @@ extension World { internal func afterEach(_ closure: @escaping AfterExampleClosure) { guard currentExampleMetadata == nil else { - raiseError("'afterEach' cannot be used inside '\(currentPhase)', 'afterEach' may only be used inside 'context' or 'describe'. ") + raiseError("'afterEach' cannot be used inside '\(currentPhase)', 'afterEach' may only be used inside 'context' or 'describe'.") } currentExampleGroup.hooks.appendAfter(closure) } @@ -86,15 +87,15 @@ extension World { #endif @nonobjc - internal func it(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () -> Void) { + internal func it(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () throws -> Void) { if beforesCurrentlyExecuting { - raiseError("'it' cannot be used inside 'beforeEach', 'it' may only be used inside 'context' or 'describe'. ") + raiseError("'it' cannot be used inside 'beforeEach', 'it' may only be used inside 'context' or 'describe'.") } if aftersCurrentlyExecuting { - raiseError("'it' cannot be used inside 'afterEach', 'it' may only be used inside 'context' or 'describe'. ") + raiseError("'it' cannot be used inside 'afterEach', 'it' may only be used inside 'context' or 'describe'.") } guard currentExampleMetadata == nil else { - raiseError("'it' cannot be used inside 'it', 'it' may only be used inside 'context' or 'describe'. ") + raiseError("'it' cannot be used inside 'it', 'it' may only be used inside 'context' or 'describe'.") } let callsite = Callsite(file: file, line: line) let example = Example(description: description, callsite: callsite, flags: flags, closure: closure) @@ -102,14 +103,14 @@ extension World { } @nonobjc - internal func fit(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () -> Void) { + internal func fit(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () throws -> Void) { var focusedFlags = flags focusedFlags[Filter.focused] = true self.it(description, flags: focusedFlags, file: file, line: line, closure: closure) } @nonobjc - internal func xit(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () -> Void) { + internal func xit(_ description: String, flags: FilterFlags, file: FileString, line: UInt, closure: @escaping () throws -> Void) { var pendingFlags = flags pendingFlags[Filter.pending] = true self.it(description, flags: pendingFlags, file: file, line: line, closure: closure) @@ -118,7 +119,7 @@ extension World { @nonobjc internal func itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: FileString, line: UInt) { guard currentExampleMetadata == nil else { - raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'. ") + raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'.") } let callsite = Callsite(file: file, line: line) let closure = World.sharedWorld.sharedExample(name) @@ -144,7 +145,7 @@ extension World { internal func itBehavesLike(_ behavior: Behavior.Type, context: @escaping () -> C, flags: FilterFlags, file: FileString, line: UInt) { guard currentExampleMetadata == nil else { - raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'. ") + raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'.") } let callsite = Callsite(file: file, line: line) let closure = behavior.spec diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Example.swift b/Carthage/Checkouts/Quick/Sources/Quick/Example.swift index 036aa3ad1..7cef7c59d 100644 --- a/Carthage/Checkouts/Quick/Sources/Quick/Example.swift +++ b/Carthage/Checkouts/Quick/Sources/Quick/Example.swift @@ -1,10 +1,12 @@ import Foundation #if canImport(Darwin) +// swiftlint:disable type_name @objcMembers public class _ExampleBase: NSObject {} #else public class _ExampleBase: NSObject {} +// swiftlint:enable type_name #endif /** @@ -28,10 +30,10 @@ final public class Example: _ExampleBase { weak internal var group: ExampleGroup? private let internalDescription: String - private let closure: () -> Void + private let closure: () throws -> Void private let flags: FilterFlags - internal init(description: String, callsite: Callsite, flags: FilterFlags, closure: @escaping () -> Void) { + internal init(description: String, callsite: Callsite, flags: FilterFlags, closure: @escaping () throws -> Void) { self.internalDescription = description self.closure = closure self.callsite = callsite @@ -79,7 +81,22 @@ final public class Example: _ExampleBase { } group!.phase = .beforesFinished - closure() + do { + try closure() + } catch { + let description = "Test \(name) threw unexpected error: \(error.localizedDescription)" + #if SWIFT_PACKAGE + let file = callsite.file.description + #else + let file = callsite.file + #endif + QuickSpec.current.recordFailure( + withDescription: description, + inFile: file, + atLine: Int(callsite.line), + expected: false + ) + } group!.phase = .aftersExecuting for after in group!.afters { diff --git a/Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift b/Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift index 2cdd10faa..a8f0d7765 100644 --- a/Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift +++ b/Carthage/Checkouts/Quick/Sources/Quick/ExampleMetadata.swift @@ -1,10 +1,12 @@ import Foundation #if canImport(Darwin) +// swiftlint:disable type_name @objcMembers public class _ExampleMetadataBase: NSObject {} #else public class _ExampleMetadataBase: NSObject {} +// swiftlint:enable type_name #endif /** diff --git a/Carthage/Checkouts/Quick/Sources/Quick/Filter.swift b/Carthage/Checkouts/Quick/Sources/Quick/Filter.swift index 3382d38f8..d7fbe8d79 100644 --- a/Carthage/Checkouts/Quick/Sources/Quick/Filter.swift +++ b/Carthage/Checkouts/Quick/Sources/Quick/Filter.swift @@ -1,10 +1,12 @@ import Foundation #if canImport(Darwin) +// swiftlint:disable type_name @objcMembers public class _FilterBase: NSObject {} #else public class _FilterBase: NSObject {} +// swiftlint:enable type_name #endif /** diff --git a/Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift b/Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift index b4be76e7f..7f63787bb 100644 --- a/Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift +++ b/Carthage/Checkouts/Quick/Sources/Quick/QuickSpec.swift @@ -5,8 +5,8 @@ import XCTest #if SWIFT_PACKAGE -#if canImport(QuickSpecBase) -import QuickSpecBase +#if canImport(QuickObjCRuntime) +import QuickObjCRuntime public typealias QuickSpecBase = _QuickSpecBase #else @@ -76,11 +76,11 @@ open class QuickSpec: QuickSpecBase { let originalName = example.name.c99ExtendedIdentifier var selectorName = originalName - var i: UInt = 2 + var index: UInt = 2 while selectorNames.contains(selectorName) { - selectorName = String(format: "%@_%tu", originalName, i) - i += 1 + selectorName = String(format: "%@_%tu", originalName, index) + index += 1 } selectorNames.insert(selectorName) @@ -120,6 +120,32 @@ open class QuickSpec: QuickSpecBase { self.init().spec() } } + + // MARK: Delegation to `QuickSpec.current`. + + override public func recordFailure( + withDescription description: String, + inFile filePath: String, + atLine lineNumber: Int, + expected: Bool + ) { + guard self === Self.current else { + Self.current.recordFailure( + withDescription: description, + inFile: filePath, + atLine: lineNumber, + expected: expected + ) + return + } + + super.recordFailure( + withDescription: description, + inFile: filePath, + atLine: lineNumber, + expected: expected + ) + } } #endif diff --git a/Carthage/Checkouts/Quick/Sources/Quick/QuickTestObservation.swift b/Carthage/Checkouts/Quick/Sources/Quick/QuickTestObservation.swift new file mode 100644 index 000000000..e508566f4 --- /dev/null +++ b/Carthage/Checkouts/Quick/Sources/Quick/QuickTestObservation.swift @@ -0,0 +1,69 @@ +#if !SWIFT_PACKAGE + +import Foundation +import XCTest + +/// A dummy protocol for calling the internal `+[QuickSpec buildExamplesIfNeeded]` method +/// which is defined in Objective-C from Swift. +@objc internal protocol _QuickSpecInternal { + static func buildExamplesIfNeeded() +} + +@objc internal final class QuickTestObservation: NSObject, XCTestObservation { + @objc(sharedInstance) + static let shared = QuickTestObservation() + + // Quick hooks into this event to compile example groups for each QuickSpec subclasses. + // + // If an exception occurs when compiling examples, report it to the user. Chances are they + // included an expectation outside of a "it", "describe", or "context" block. + func testBundleWillStart(_ testBundle: Bundle) { + QuickSpec.enumerateSubclasses { specClass in + // This relies on `_QuickSpecInternal`. + (specClass as AnyClass).buildExamplesIfNeeded() + } + } +} + +// swiftlint:disable:next todo +// TODO: Unify this with QuickConfiguration's equivalent +extension QuickSpec { + internal static func enumerateSubclasses( + subclasses: [QuickSpec.Type]? = nil, + _ block: (QuickSpec.Type) -> Void + ) { + let subjects: [QuickSpec.Type] + if let subclasses = subclasses { + subjects = subclasses + } else { + let classesCount = objc_getClassList(nil, 0) + + guard classesCount > 0 else { + return + } + + let classes = UnsafeMutablePointer.allocate(capacity: Int(classesCount)) + defer { free(classes) } + + objc_getClassList(AutoreleasingUnsafeMutablePointer(classes), classesCount) + + var specSubclasses: [QuickSpec.Type] = [] + for index in 0.. [String: Any] public typealias SharedExampleClosure = (@escaping SharedExampleContext) -> Void #if canImport(Darwin) +// swiftlint:disable type_name @objcMembers internal class _WorldBase: NSObject {} #else internal class _WorldBase: NSObject {} +// swiftlint:enable type_name #endif /** @@ -96,8 +98,11 @@ final internal class World: _WorldBase { be mutated to change Quick's behavior. */ internal func configure(_ closure: QuickConfigurer) { - assert(!isConfigurationFinalized, - "Quick cannot be configured outside of a +[QuickConfiguration configure:] method. You should not call -[World configure:] directly. Instead, subclass QuickConfiguration and override the +[QuickConfiguration configure:] method.") + assert( + !isConfigurationFinalized, + // swiftlint:disable:next line_length + "Quick cannot be configured outside of a +[QuickConfiguration configure:] method. You should not call -[World configure:] directly. Instead, subclass QuickConfiguration and override the +[QuickConfiguration configure:] method." + ) closure(configuration) } @@ -109,6 +114,17 @@ final internal class World: _WorldBase { isConfigurationFinalized = true } + /** + Returns `true` if the root example group for the given spec class has been already initialized. + + - parameter specClass: The QuickSpec class for which is checked for the existing root example group. + - returns: Whether the root example group for the given spec class has been already initialized or not. + */ + internal func isRootExampleGroupInitialized(forSpecClass specClass: QuickSpec.Type) -> Bool { + let name = String(describing: specClass) + return specs.keys.contains(name) + } + /** Returns an internally constructed root example group for the given QuickSpec class. diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjCRuntime/QuickSpecBase.m b/Carthage/Checkouts/Quick/Sources/QuickObjCRuntime/QuickSpecBase.m new file mode 100644 index 000000000..e452e658e --- /dev/null +++ b/Carthage/Checkouts/Quick/Sources/QuickObjCRuntime/QuickSpecBase.m @@ -0,0 +1,38 @@ +#import "QuickSpecBase.h" + +#pragma mark - _QuickSpecBase + +@implementation _QuickSpecBase + +- (instancetype)init { + self = [super initWithInvocation: nil]; + return self; +} + +/** + Invocations for each test method in the test case. QuickSpec overrides this method to define a + new method for each example defined in +[QuickSpec spec]. + + @return An array of invocations that execute the newly defined example methods. + */ ++ (NSArray *)testInvocations { + NSArray *selectors = [self _qck_testMethodSelectors]; + NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:selectors.count]; + + for (NSString *selectorString in selectors) { + SEL selector = NSSelectorFromString(selectorString); + NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + invocation.selector = selector; + + [invocations addObject:invocation]; + } + + return invocations; +} + ++ (NSArray *)_qck_testMethodSelectors { + return @[]; +} + +@end diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjCRuntime/include/QuickSpecBase.h b/Carthage/Checkouts/Quick/Sources/QuickObjCRuntime/include/QuickSpecBase.h new file mode 100644 index 000000000..2ee00e73d --- /dev/null +++ b/Carthage/Checkouts/Quick/Sources/QuickObjCRuntime/include/QuickSpecBase.h @@ -0,0 +1,7 @@ +#import +#import + +@interface _QuickSpecBase : XCTestCase ++ (NSArray *)_qck_testMethodSelectors; +- (instancetype)init NS_DESIGNATED_INITIALIZER; +@end diff --git a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m index 3e817c77b..90ac7c61b 100644 --- a/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m +++ b/Carthage/Checkouts/Quick/Sources/QuickObjectiveC/QuickSpec.m @@ -17,26 +17,6 @@ @implementation QuickSpec #pragma mark - XCTestCase Overrides -/** - QuickSpec hooks into this event to compile the example groups for this spec subclass. - - If an exception occurs when compiling the examples, report it to the user. Chances are they - included an expectation outside of a "it", "describe", or "context" block. - */ -+ (XCTestSuite *)defaultTestSuite { - [self buildExamplesIfNeeded]; - - // Add instance methods for this class' examples. - NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; - NSMutableSet *selectorNames = [NSMutableSet set]; - - for (Example *example in examples) { - [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; - } - - return [super defaultTestSuite]; -} - /** Invocations for each test method in the test case. QuickSpec overrides this method to define a new method for each example defined in +[QuickSpec spec]. @@ -44,8 +24,6 @@ + (XCTestSuite *)defaultTestSuite { @return An array of invocations that execute the newly defined example methods. */ + (NSArray *)testInvocations { - [self buildExamplesIfNeeded]; - NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; @@ -84,13 +62,12 @@ + (void)buildExamplesIfNeeded { [QuickConfiguration class]; World *world = [World sharedWorld]; - ExampleGroup *rootExampleGroup = [world rootExampleGroupForSpecClass:self]; - - if ([rootExampleGroup examples].count > 0) { + if ([world isRootExampleGroupInitializedForSpecClass:[self class]]) { // The examples fot this subclass have been already built. Skipping. return; } + ExampleGroup *rootExampleGroup = [world rootExampleGroupForSpecClass:[self class]]; [world performWithCurrentExampleGroup:rootExampleGroup closure:^{ QuickSpec *spec = [self new]; @@ -162,14 +139,29 @@ - (void)recordFailureWithDescription:(NSString *)description inFile:(NSString *)filePath atLine:(NSUInteger)lineNumber expected:(BOOL)expected { + if (self != [QuickSpec current]) { + [[QuickSpec current] recordFailureWithDescription:description + inFile:filePath + atLine:lineNumber + expected:expected]; + return; + } + if (self.example.isSharedExample) { filePath = self.example.callsite.file; lineNumber = self.example.callsite.line; } - [currentSpec.testRun recordFailureWithDescription:description - inFile:filePath - atLine:lineNumber - expected:expected]; + [super recordFailureWithDescription:description + inFile:filePath + atLine:lineNumber + expected:expected]; } @end + +#pragma mark - Test Observation + +__attribute__((constructor)) +static void registerQuickTestObservation(void) { + [[XCTestObservationCenter sharedTestObservationCenter] addTestObserver:[QuickTestObservation sharedInstance]]; +} diff --git a/Carthage/Checkouts/Quick/Tests/.swiftlint.yml b/Carthage/Checkouts/Quick/Tests/.swiftlint.yml new file mode 100644 index 000000000..e7477749a --- /dev/null +++ b/Carthage/Checkouts/Quick/Tests/.swiftlint.yml @@ -0,0 +1,5 @@ +disabled_rules: + - function_body_length + - identifier_name + - line_length + - type_name diff --git a/Carthage/Checkouts/Quick/Tests/LinuxMain.swift b/Carthage/Checkouts/Quick/Tests/LinuxMain.swift index 060281298..43706fcee 100644 --- a/Carthage/Checkouts/Quick/Tests/LinuxMain.swift +++ b/Carthage/Checkouts/Quick/Tests/LinuxMain.swift @@ -19,22 +19,21 @@ Quick.QCKMain([ FunctionalTests_SharedExamples_BeforeEachSpec.self, FunctionalTests_SharedExamples_ContextSpec.self, FunctionalTests_SharedExamples_Spec.self, - FunctionalTests_SubclassSpec.self, - FunctionalTests_SubclassOfSubclassWithStructPropertySpec.self, _FunctionalTests_FocusedSpec_Focused.self, - _FunctionalTests_FocusedSpec_Unfocused.self + _FunctionalTests_FocusedSpec_Unfocused.self, ], configurations: [ FunctionalTests_Configuration_AfterEach.self, FunctionalTests_Configuration_BeforeEach.self, FunctionalTests_FocusedSpec_SharedExamplesConfiguration.self, FunctionalTests_SharedExamples_BeforeEachTests_SharedExamples.self, - FunctionalTests_SharedExamplesTests_SharedExamples.self + FunctionalTests_SharedExamplesTests_SharedExamples.self, ], testCases: [ testCase(AfterEachTests.allTests), testCase(BeforeEachTests.allTests), testCase(BeforeSuiteTests.allTests), + testCase(BehaviorTests.allTests), testCase(Configuration_AfterEachTests.allTests), testCase(Configuration_BeforeEachTests.allTests), // testCase(DescribeTests.allTests), @@ -44,5 +43,5 @@ testCases: [ testCase(ItTests.allTests), testCase(PendingTests.allTests), testCase(SharedExamples_BeforeEachTests.allTests), - testCase(SharedExamplesTests.allTests) + testCase(SharedExamplesTests.allTests), ]) diff --git a/Carthage/Checkouts/Quick/Tests/QuickIssue853RegressionTests/SubclassOfSubclassWithStructPropertyTests.swift b/Carthage/Checkouts/Quick/Tests/QuickIssue853RegressionTests/SubclassOfSubclassWithStructPropertyTests.swift new file mode 100644 index 000000000..5eff5953f --- /dev/null +++ b/Carthage/Checkouts/Quick/Tests/QuickIssue853RegressionTests/SubclassOfSubclassWithStructPropertyTests.swift @@ -0,0 +1,20 @@ +import XCTest +import Quick + +// The regression test for https://github.com/Quick/Quick/issues/853 +// +// Don't change the classes definition order to mimic the situation in https://github.com/gzafra/QuickCrashTest. + +class SubclassOfSubclassWithStructPropertySpec: SubclassSpec { + let date = Date() + + override func spec() { + it("should not crash") {} + } +} + +class SubclassSpec: QuickSpec { + override func spec() { + it("should not crash") {} + } +} diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift index e15252f7d..126167bdd 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickFocusedTests/FocusedTests.swift @@ -58,15 +58,22 @@ class _FunctionalTests_FocusedSpec_Unfocused: QuickSpec { final class FocusedTests: XCTestCase, XCTestCaseProvider { static var allTests: [(String, (FocusedTests) -> () throws -> Void)] { return [ - ("testOnlyFocusedExamplesAreExecuted", testOnlyFocusedExamplesAreExecuted) + ("testOnlyFocusedExamplesAreExecuted", testOnlyFocusedExamplesAreExecuted), ] } func testOnlyFocusedExamplesAreExecuted() { + #if SWIFT_PACKAGE let result = qck_runSpecs([ _FunctionalTests_FocusedSpec_Focused.self, - _FunctionalTests_FocusedSpec_Unfocused.self + _FunctionalTests_FocusedSpec_Unfocused.self, ]) + #else + let result = qck_runSpecs([ + _FunctionalTests_FocusedSpec_Unfocused.self, + _FunctionalTests_FocusedSpec_Focused.self, + ]) + #endif XCTAssertEqual(result?.executionCount, 8) } } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift index f6b6777b2..6e4e70319 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/AfterEachTests.swift @@ -41,8 +41,8 @@ class FunctionalTests_AfterEachSpec: QuickSpec { // The list should contain the afterEach for those example, executed from top to bottom. expect(afterEachOrder).to(equal([ .outerOne, .outerTwo, .outerThree, - .outerOne, .outerTwo, .outerThree - ])) + .outerOne, .outerTwo, .outerThree, + ])) } } @@ -57,7 +57,7 @@ class FunctionalTests_AfterEachSpec: QuickSpec { afterEach { } }.to(raiseException { (exception: NSException) in expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'afterEach' cannot be used inside 'it', 'afterEach' may only be used inside 'context' or 'describe'. ")) + expect(exception.reason).to(equal("'afterEach' cannot be used inside 'it', 'afterEach' may only be used inside 'context' or 'describe'.")) }) } } @@ -68,7 +68,7 @@ class FunctionalTests_AfterEachSpec: QuickSpec { final class AfterEachTests: XCTestCase, XCTestCaseProvider { static var allTests: [(String, (AfterEachTests) -> () throws -> Void)] { return [ - ("testAfterEachIsExecutedInTheCorrectOrder", testAfterEachIsExecutedInTheCorrectOrder) + ("testAfterEachIsExecutedInTheCorrectOrder", testAfterEachIsExecutedInTheCorrectOrder), ] } @@ -83,7 +83,7 @@ final class AfterEachTests: XCTestCase, XCTestCaseProvider { .outerOne, .outerTwo, .outerThree, // [3] The inner afterEach closures are executed from top to bottom, // then the outer afterEach closures are executed from top to bottom. - .innerOne, .innerTwo, .outerOne, .outerTwo, .outerThree + .innerOne, .innerTwo, .outerOne, .outerTwo, .outerThree, ] XCTAssertEqual(afterEachOrder, expectedOrder) diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift index 17b222e6b..9b5d44e0d 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeEachTests.swift @@ -42,7 +42,7 @@ class FunctionalTests_BeforeEachSpec: QuickSpec { beforeEach { } }.to(raiseException { (exception: NSException) in expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'beforeEach' cannot be used inside 'it', 'beforeEach' may only be used inside 'context' or 'describe'. ")) + expect(exception.reason).to(equal("'beforeEach' cannot be used inside 'it', 'beforeEach' may only be used inside 'context' or 'describe'.")) }) } } @@ -53,7 +53,7 @@ class FunctionalTests_BeforeEachSpec: QuickSpec { final class BeforeEachTests: XCTestCase, XCTestCaseProvider { static var allTests: [(String, (BeforeEachTests) -> () throws -> Void)] { return [ - ("testBeforeEachIsExecutedInTheCorrectOrder", testBeforeEachIsExecutedInTheCorrectOrder) + ("testBeforeEachIsExecutedInTheCorrectOrder", testBeforeEachIsExecutedInTheCorrectOrder), ] } @@ -68,7 +68,7 @@ final class BeforeEachTests: XCTestCase, XCTestCaseProvider { .outerOne, .outerTwo, // [3] The outer beforeEach closures are executed from top to bottom, // then the inner beforeEach closures are executed from top to bottom. - .outerOne, .outerTwo, .innerOne, .innerTwo, .innerThree + .outerOne, .outerTwo, .innerOne, .innerTwo, .innerThree, ] XCTAssertEqual(beforeEachOrder, expectedOrder) } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift index df39126bf..421348602 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BeforeSuiteTests.swift @@ -23,7 +23,7 @@ class FunctionalTests_BeforeSuite_Spec: QuickSpec { final class BeforeSuiteTests: XCTestCase, XCTestCaseProvider { static var allTests: [(String, (BeforeSuiteTests) -> () throws -> Void)] { return [ - ("testBeforeSuiteIsExecutedBeforeAnyExamples", testBeforeSuiteIsExecutedBeforeAnyExamples) + ("testBeforeSuiteIsExecutedBeforeAnyExamples", testBeforeSuiteIsExecutedBeforeAnyExamples), ] } @@ -31,8 +31,8 @@ final class BeforeSuiteTests: XCTestCase, XCTestCaseProvider { // Execute the spec with an assertion before the one with a beforeSuite let result = qck_runSpecs([ FunctionalTests_BeforeSuite_Spec.self, - FunctionalTests_BeforeSuite_BeforeSuiteSpec.self - ]) + FunctionalTests_BeforeSuite_BeforeSuiteSpec.self, + ]) XCTAssert(result!.hasSucceeded) } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BehaviorTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BehaviorTests.swift index 54bcb4231..db22bbf1e 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BehaviorTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/BehaviorTests.swift @@ -27,7 +27,7 @@ class FunctionalTests_BehaviorTests_ErrorSpec: QuickSpec { } .to(raiseException {(exception: NSException) in expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'itBehavesLike' cannot be used inside 'it', 'itBehavesLike' may only be used inside 'context' or 'describe'. ")) + expect(exception.reason).to(equal("'itBehavesLike' cannot be used inside 'it', 'itBehavesLike' may only be used inside 'context' or 'describe'.")) }) } } @@ -39,10 +39,8 @@ final class BehaviorTests: XCTestCase, XCTestCaseProvider { static var allTests: [(String, (BehaviorTests) -> () throws -> Void)] { return [ - ("testBehaviorPassContextToExamples", - testBehaviorPassContextToExamples), - ("testBehaviorExecutesThreeExamples", - testBehaviorExecutesThreeExamples) + ("testBehaviorPassContextToExamples", testBehaviorPassContextToExamples), + ("testBehaviorExecutesThreeExamples", testBehaviorExecutesThreeExamples), ] } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift index d7c2105e7..2cb01133a 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/AfterEach/Configuration+AfterEachTests.swift @@ -16,7 +16,7 @@ class Configuration_AfterEachSpec: QuickSpec { final class Configuration_AfterEachTests: XCTestCase, XCTestCaseProvider { static var allTests: [(String, (Configuration_AfterEachTests) -> () throws -> Void)] { return [ - ("testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted", testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted) + ("testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted", testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted), ] } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift index ddf15097f..a7a8c3cf9 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/Configuration/BeforeEach/Configuration+BeforeEachTests.swift @@ -13,7 +13,7 @@ class Configuration_BeforeEachSpec: QuickSpec { final class Configuration_BeforeEachTests: XCTestCase, XCTestCaseProvider { static var allTests: [(String, (Configuration_BeforeEachTests) -> () throws -> Void)] { return [ - ("testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted", testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted) + ("testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted", testExampleIsRunAfterTheConfigurationBeforeEachIsExecuted), ] } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift index eb6c03a2e..20d08467d 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ContextTests.swift @@ -11,7 +11,7 @@ class QuickContextTests: QuickSpec { context("A nested context that should throw") { } }.to(raiseException { (exception: NSException) in expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'context' cannot be used inside 'it', 'context' may only be used inside 'context' or 'describe'. ")) + expect(exception.reason).to(equal("'context' cannot be used inside 'it', 'context' may only be used inside 'context' or 'describe'.")) }) } } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift index a923f4db2..7bdeee6fa 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/DescribeTests.swift @@ -7,7 +7,7 @@ import Quick final class DescribeTests: XCTestCase, XCTestCaseProvider { static var allTests: [(String, (DescribeTests) -> () throws -> Void)] { return [ - ("testDescribeThrowsIfUsedOutsideOfQuickSpec", testDescribeThrowsIfUsedOutsideOfQuickSpec) + ("testDescribeThrowsIfUsedOutsideOfQuickSpec", testDescribeThrowsIfUsedOutsideOfQuickSpec), ] } @@ -24,7 +24,7 @@ class QuickDescribeTests: QuickSpec { describe("A nested describe that should throw") { } }.to(raiseException { (exception: NSException) in expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'describe' cannot be used inside 'it', 'describe' may only be used inside 'context' or 'describe'. ")) + expect(exception.reason).to(equal("'describe' cannot be used inside 'it', 'describe' may only be used inside 'context' or 'describe'.")) }) } } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift index 762a45d3b..d04db0dd4 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/ItTests.swift @@ -28,7 +28,7 @@ class FunctionalTests_ItSpec: QuickSpec { expect(allSelectors) == [ "when_an_example_has_a_unique_name__doesn_t_add_multiple_selectors_for_it", - "when_an_example_has_a_unique_name__has_a_unique_name" + "when_an_example_has_a_unique_name__has_a_unique_name", ] } } @@ -46,7 +46,7 @@ class FunctionalTests_ItSpec: QuickSpec { expect(allSelectors) == [ "when_two_examples_have_the_exact_name__has_exactly_the_same_name", "when_two_examples_have_the_exact_name__has_exactly_the_same_name_2", - "when_two_examples_have_the_exact_name__makes_a_unique_name_for_each_of_the_above" + "when_two_examples_have_the_exact_name__makes_a_unique_name_for_each_of_the_above", ] } @@ -59,7 +59,7 @@ class FunctionalTests_ItSpec: QuickSpec { it("will throw an error when it is nested in another it") { } }.to(raiseException { (exception: NSException) in expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'it' cannot be used inside 'it', 'it' may only be used inside 'context' or 'describe'. ")) + expect(exception.reason).to(equal("'it' cannot be used inside 'it', 'it' may only be used inside 'context' or 'describe'.")) }) } @@ -79,7 +79,7 @@ class FunctionalTests_ItSpec: QuickSpec { it("should have thrown an exception with the correct error message") { expect(exception).toNot(beNil()) - expect(exception!.reason).to(equal("'it' cannot be used inside 'beforeEach', 'it' may only be used inside 'context' or 'describe'. ")) + expect(exception!.reason).to(equal("'it' cannot be used inside 'beforeEach', 'it' may only be used inside 'context' or 'describe'.")) } } @@ -90,7 +90,7 @@ class FunctionalTests_ItSpec: QuickSpec { let capture = NMBExceptionCapture(handler: ({ e in exception = e expect(exception).toNot(beNil()) - expect(exception!.reason).to(equal("'it' cannot be used inside 'afterEach', 'it' may only be used inside 'context' or 'describe'. ")) + expect(exception!.reason).to(equal("'it' cannot be used inside 'afterEach', 'it' may only be used inside 'context' or 'describe'.")) }), finally: nil) capture.tryBlock { @@ -107,13 +107,52 @@ class FunctionalTests_ItSpec: QuickSpec { } } +private var isRunningFunctionalTests = false + +class FunctionalTests_ImplicitErrorItSpec: QuickSpec { + override func spec() { + describe("implicit error handling") { + enum ExampleError: Error { + case error + } + + func nonThrowingFunc() throws {} + + func throwingFunc(shouldThrow: Bool) throws { + if shouldThrow { + throw ExampleError.error + } + } + + it("supports calling functions marked as throws") { + try nonThrowingFunc() + } + + it("supports calling functions that actually throws") { + try throwingFunc(shouldThrow: isRunningFunctionalTests) + } + } + } +} + final class ItTests: XCTestCase, XCTestCaseProvider { static var allTests: [(String, (ItTests) -> () throws -> Void)] { return [ - ("testAllExamplesAreExecuted", testAllExamplesAreExecuted) + ("testAllExamplesAreExecuted", testAllExamplesAreExecuted), + ("testImplicitErrorHandling", testImplicitErrorHandling), ] } + override func setUp() { + super.setUp() + isRunningFunctionalTests = true + } + + override func tearDown() { + isRunningFunctionalTests = false + super.tearDown() + } + func testAllExamplesAreExecuted() { let result = qck_runSpec(FunctionalTests_ItSpec.self) #if canImport(Darwin) @@ -126,4 +165,13 @@ final class ItTests: XCTestCase, XCTestCaseProvider { XCTAssertEqual(result?.executionCount, 2) #endif } + + func testImplicitErrorHandling() { + let result = qck_runSpec(FunctionalTests_ImplicitErrorItSpec.self)! + XCTAssertFalse(result.hasSucceeded) + XCTAssertEqual(result.executionCount, 2) + XCTAssertEqual(result.failureCount, 0) + XCTAssertEqual(result.unexpectedExceptionCount, 1) + XCTAssertEqual(result.totalFailureCount, 1) + } } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift index 5334200d7..556a981a9 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/PendingTests.swift @@ -28,6 +28,18 @@ class FunctionalTests_PendingSpec: QuickSpec { beforeEach { onlyPendingExamplesBeforeEachExecutedCount += 1 } pending("an example that will not run") {} } + describe("a describe block with a disabled context that will not run") { + xcontext("these examples will not run") { + it("does not run") { + fail() + } + } + } + xdescribe("a describe block that will not run") { + it("does not run") { + fail() + } + } } } @@ -36,7 +48,7 @@ final class PendingTests: XCTestCase, XCTestCaseProvider { return [ ("testAnOtherwiseFailingExampleWhenMarkedPendingDoesNotCauseTheSuiteToFail", testAnOtherwiseFailingExampleWhenMarkedPendingDoesNotCauseTheSuiteToFail), ("testBeforeEachOnlyRunForEnabledExamples", testBeforeEachOnlyRunForEnabledExamples), - ("testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples", testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples) + ("testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples", testBeforeEachDoesNotRunForContextsWithOnlyPendingExamples), ] } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift index 2b0fd77a8..c45807512 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamples+BeforeEachTests.swift @@ -28,7 +28,7 @@ final class SharedExamples_BeforeEachTests: XCTestCase, XCTestCaseProvider { static var allTests: [(String, (SharedExamples_BeforeEachTests) -> () throws -> Void)] { return [ ("testBeforeEachOutsideOfSharedExamplesExecutedOnceBeforeEachExample", testBeforeEachOutsideOfSharedExamplesExecutedOnceBeforeEachExample), - ("testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample", testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample) + ("testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample", testBeforeEachInSharedExamplesExecutedOnceBeforeEachSharedExample), ] } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift index f75f5245e..63395b3f9 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/FunctionalTests/SharedExamplesTests.swift @@ -24,7 +24,7 @@ class FunctionalTests_SharedExamples_ErrorSpec: QuickSpec { itBehavesLike("a group of three shared examples") }.to(raiseException { (exception: NSException) in expect(exception.name).to(equal(NSExceptionName.internalInconsistencyException)) - expect(exception.reason).to(equal("'itBehavesLike' cannot be used inside 'it', 'itBehavesLike' may only be used inside 'context' or 'describe'. ")) + expect(exception.reason).to(equal("'itBehavesLike' cannot be used inside 'it', 'itBehavesLike' may only be used inside 'context' or 'describe'.")) }) } } @@ -37,7 +37,7 @@ final class SharedExamplesTests: XCTestCase, XCTestCaseProvider { static var allTests: [(String, (SharedExamplesTests) -> () throws -> Void)] { return [ ("testAGroupOfThreeSharedExamplesExecutesThreeExamples", testAGroupOfThreeSharedExamplesExecutesThreeExamples), - ("testSharedExamplesWithContextPassContextToExamples", testSharedExamplesWithContextPassContextToExamples) + ("testSharedExamplesWithContextPassContextToExamples", testSharedExamplesWithContextPassContextToExamples), ] } diff --git a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpecRunner.swift b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpecRunner.swift index d857253ae..bc5792110 100644 --- a/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpecRunner.swift +++ b/Carthage/Checkouts/Quick/Tests/QuickTests/QuickTests/Helpers/QuickSpecRunner.swift @@ -60,6 +60,14 @@ func qck_runSpecs(_ specClasses: [QuickSpec.Type]) -> XCTestRun? { world.isRunningAdditionalSuites = true defer { world.isRunningAdditionalSuites = false } + #if !SWIFT_PACKAGE + // Gather examples first + QuickSpec.enumerateSubclasses(subclasses: specClasses) { specClass in + // This relies on `_QuickSpecInternal`. + (specClass as AnyClass).buildExamplesIfNeeded() + } + #endif + let suite = XCTestSuite(name: "MySpecs") for specClass in specClasses { #if canImport(Darwin) diff --git a/Homebrew/mas-tap.rb b/Homebrew/mas-tap.rb index baf5fad56..642a2e333 100644 --- a/Homebrew/mas-tap.rb +++ b/Homebrew/mas-tap.rb @@ -2,35 +2,39 @@ class Mas < Formula desc "Mac App Store command-line interface" homepage "https://github.com/mas-cli/mas" url "https://github.com/mas-cli/mas.git", - :tag => "v1.6.4", - :revision => "4cfb3185b6c72ac4a67eaaf17f842cc1dacf27c7" + tag: "v1.7.1", + revision: "b8dcb4ce4b1d78ada7556565dd5c73e9913758d8" + license "MIT" head "https://github.com/mas-cli/mas.git" bottle do root_url "https://dl.bintray.com/phatblat/mas-bottles" cellar :any - sha256 "5ef426109d9c5be43a43621ea52bab6130aac836f4bec75d0d127fbc5526c26f" => :catalina - sha256 "5ef426109d9c5be43a43621ea52bab6130aac836f4bec75d0d127fbc5526c26f" => :mojave - sha256 "5ef426109d9c5be43a43621ea52bab6130aac836f4bec75d0d127fbc5526c26f" => :high_sierra - sha256 "5ef426109d9c5be43a43621ea52bab6130aac836f4bec75d0d127fbc5526c26f" => :sierra - sha256 "5ef426109d9c5be43a43621ea52bab6130aac836f4bec75d0d127fbc5526c26f" => :el_capitan + sha256 "de5acfedda59b73fbd36e4a966120aa1aa7e5eea4c07c19e75c0b21819b0900d" => :catalina + sha256 "de5acfedda59b73fbd36e4a966120aa1aa7e5eea4c07c19e75c0b21819b0900d" => :mojave + sha256 "de5acfedda59b73fbd36e4a966120aa1aa7e5eea4c07c19e75c0b21819b0900d" => :high_sierra + sha256 "de5acfedda59b73fbd36e4a966120aa1aa7e5eea4c07c19e75c0b21819b0900d" => :sierra + sha256 "de5acfedda59b73fbd36e4a966120aa1aa7e5eea4c07c19e75c0b21819b0900d" => :el_capitan end depends_on "carthage" => :build - depends_on :xcode => ["10.2", :build] + depends_on xcode: ["10.2", :build] def install # Working around build issues in dependencies # - Prevent warnings from causing build failures # - Prevent linker errors by telling all lib builds to use max size install names + # - Ensure dependencies build for the current CPU; otherwise Commandant will + # build for x86_64 when running arm64 xcconfig = buildpath/"Overrides.xcconfig" xcconfig.write <<~EOS GCC_TREAT_WARNINGS_AS_ERRORS = NO OTHER_LDFLAGS = -headerpad_max_install_names + VALID_ARCHS = #{Hardware::CPU.arch} EOS ENV["XCODE_XCCONFIG_FILE"] = xcconfig - # Only build necessary dependencies (Commandant, Result) + # Only build necessary dependencies system "carthage", "bootstrap", "--platform", "macOS", "Commandant" system "script/install", prefix diff --git a/Homebrew/mas.rb b/Homebrew/mas.rb index 2fd1f1f7b..758f95cc2 100644 --- a/Homebrew/mas.rb +++ b/Homebrew/mas.rb @@ -2,32 +2,35 @@ class Mas < Formula desc "Mac App Store command-line interface" homepage "https://github.com/mas-cli/mas" url "https://github.com/mas-cli/mas.git", - :tag => "v1.6.4", - :revision => "4cfb3185b6c72ac4a67eaaf17f842cc1dacf27c7" + tag: "v1.7.1", + revision: "b8dcb4ce4b1d78ada7556565dd5c73e9913758d8" + license "MIT" head "https://github.com/mas-cli/mas.git" bottle do cellar :any - sha256 "2069b8c1c1a64c2fb91cc1c25ab9c9890c61f2182224b9e0605a35a151bb85bd" => :catalina - sha256 "3dd5a50b551a37c164c31375cc8498ba870e29e50086bd5c4c294bc26708a6d2" => :mojave - sha256 "a0d1e45203448c08420c3eab2d40ef957fd22c8e40fbeb067bc7bffe4f08dfe2" => :high_sierra + sha256 "e6de2f98ebd21885a9827664fe1b7eea5516a7fd75d5b7383e3a9b088591a27f" => :catalina + sha256 "8b6dc4e261ebdc8e2f93afe87da3db4d482eb3d8a0358ab19a0485d434550e77" => :mojave end depends_on "carthage" => :build - depends_on :xcode => ["10.2", :build] + depends_on xcode: ["10.2", :build] def install # Working around build issues in dependencies # - Prevent warnings from causing build failures # - Prevent linker errors by telling all lib builds to use max size install names + # - Ensure dependencies build for the current CPU; otherwise Commandant will + # build for x86_64 when running arm64 xcconfig = buildpath/"Overrides.xcconfig" xcconfig.write <<~EOS GCC_TREAT_WARNINGS_AS_ERRORS = NO OTHER_LDFLAGS = -headerpad_max_install_names + VALID_ARCHS = #{Hardware::CPU.arch} EOS ENV["XCODE_XCCONFIG_FILE"] = xcconfig - # Only build necessary dependencies (Commandant, Result) + # Only build necessary dependencies system "carthage", "bootstrap", "--platform", "macOS", "Commandant" system "script/install", prefix diff --git a/MasKit/AppStore/SSPurchase.swift b/MasKit/AppStore/SSPurchase.swift index 82ab63842..1359d7c29 100644 --- a/MasKit/AppStore/SSPurchase.swift +++ b/MasKit/AppStore/SSPurchase.swift @@ -35,7 +35,7 @@ extension SSPurchase { buyParameters = parameters.map { key, value in return "\(key)=\(value)" - }.joined(separator: "&") + }.joined(separator: "&") itemIdentifier = adamId accountIdentifier = account.dsID diff --git a/MasKit/ExternalCommands/OpenSystemCommand.swift b/MasKit/ExternalCommands/OpenSystemCommand.swift index 14285394e..a82723f1c 100644 --- a/MasKit/ExternalCommands/OpenSystemCommand.swift +++ b/MasKit/ExternalCommands/OpenSystemCommand.swift @@ -18,7 +18,7 @@ public struct OpenSystemCommand: ExternalCommand { public init( binaryPath: String = "/usr/bin/open" - ) { + ) { self.binaryPath = binaryPath } } diff --git a/MasKit/Formatters/AppInfoFormatter.swift b/MasKit/Formatters/AppInfoFormatter.swift index 21a6f4a4e..58409fb46 100644 --- a/MasKit/Formatters/AppInfoFormatter.swift +++ b/MasKit/Formatters/AppInfoFormatter.swift @@ -18,7 +18,7 @@ struct AppInfoFormatter { let headline = [ "\(app.trackName)", "\(app.version)", - "[\(app.price)]" + "[\(app.price ?? 0)]" ].joined(separator: " ") return [ @@ -26,7 +26,7 @@ struct AppInfoFormatter { "By: \(app.sellerName)", "Released: \(humanReadableDate(app.currentVersionReleaseDate))", "Minimum OS: \(app.minimumOsVersion)", - "Size: \(humanReadableSize(app.fileSizeBytes))", + "Size: \(humanReadableSize(app.fileSizeBytes ?? "0"))", "From: \(app.trackViewUrl)" ].joined(separator: "\n") } diff --git a/MasKit/Formatters/SearchResultFormatter.swift b/MasKit/Formatters/SearchResultFormatter.swift index 17853c1d2..413a43ba1 100644 --- a/MasKit/Formatters/SearchResultFormatter.swift +++ b/MasKit/Formatters/SearchResultFormatter.swift @@ -25,7 +25,7 @@ struct SearchResultFormatter { let appId = result.trackId let appName = result.trackName.padding(toLength: maxLength, withPad: " ", startingAt: 0) let version = result.version - let price = result.price + let price = result.price ?? 0.0 if includePrice { output += String(format: "%12d %@ $%5.2f (%@)\n", appId, appName, price, version) diff --git a/MasKit/Models/SearchResult.swift b/MasKit/Models/SearchResult.swift index 9f1189966..ed65b9905 100644 --- a/MasKit/Models/SearchResult.swift +++ b/MasKit/Models/SearchResult.swift @@ -9,10 +9,10 @@ public struct SearchResult: Decodable { public var bundleId: String public var currentVersionReleaseDate: String - public var fileSizeBytes: String - public var formattedPrice: String + public var fileSizeBytes: String? + public var formattedPrice: String? public var minimumOsVersion: String - public var price: Double + public var price: Double? public var sellerName: String public var sellerUrl: String? public var trackId: Int @@ -23,8 +23,8 @@ public struct SearchResult: Decodable { init(bundleId: String = "", currentVersionReleaseDate: String = "", - fileSizeBytes: String = "", - formattedPrice: String = "", + fileSizeBytes: String = "0", + formattedPrice: String = "Free", minimumOsVersion: String = "", price: Double = 0.0, sellerName: String = "", diff --git a/MasKitTests/.swiftlint.yml b/MasKitTests/.swiftlint.yml index 9e54f1728..daa6dd045 100644 --- a/MasKitTests/.swiftlint.yml +++ b/MasKitTests/.swiftlint.yml @@ -7,4 +7,5 @@ --- disabled_rules: - force_cast +- force_try - function_body_length diff --git a/MasKitTests/Controllers/MasStoreSearchSpec.swift b/MasKitTests/Controllers/MasStoreSearchSpec.swift index 280b9da17..8b896ce62 100644 --- a/MasKitTests/Controllers/MasStoreSearchSpec.swift +++ b/MasKitTests/Controllers/MasStoreSearchSpec.swift @@ -12,50 +12,53 @@ import Quick class MasStoreSearchSpec: QuickSpec { override func spec() { - describe("store search") { - it("can find slack") { - let networkSession = NetworkSessionMockFromFile(responseFile: "search/slack.json") - let storeSearch = MasStoreSearch(networkManager: NetworkManager(session: networkSession)) + describe("store") { + context("when searched") { + it("can find slack") { + let networkSession = NetworkSessionMockFromFile(responseFile: "search/slack.json") + let storeSearch = MasStoreSearch(networkManager: NetworkManager(session: networkSession)) - var searchList: SearchResultList - do { - searchList = try storeSearch.search(for: "slack") - expect(searchList.resultCount) == 6 - expect(searchList.results.count) == 6 - } catch { - let maserror = error as! MASError - if case let .jsonParsing(nserror) = maserror { - fail("\(maserror) \(nserror!)") + var searchList: SearchResultList + do { + searchList = try storeSearch.search(for: "slack") + expect(searchList.resultCount) == 39 + expect(searchList.results.count) == 39 + } catch { + let maserror = error as! MASError + if case let .jsonParsing(nserror) = maserror { + fail("\(maserror) \(nserror!)") + } } } } - } - describe("store lookup") { - it("can find slack") { - let appId = 803_453_959 - let networkSession = NetworkSessionMockFromFile(responseFile: "lookup/slack.json") - let storeSearch = MasStoreSearch(networkManager: NetworkManager(session: networkSession)) - var lookup: SearchResult? - do { - lookup = try storeSearch.lookup(app: appId) - } catch { - let maserror = error as! MASError - if case let .jsonParsing(nserror) = maserror { - fail("\(maserror) \(nserror!)") + context("when lookup used") { + it("can find slack") { + let appId = 803_453_959 + let networkSession = NetworkSessionMockFromFile(responseFile: "lookup/slack.json") + let storeSearch = MasStoreSearch(networkManager: NetworkManager(session: networkSession)) + + var lookup: SearchResult? + do { + lookup = try storeSearch.lookup(app: appId) + } catch { + let maserror = error as! MASError + if case let .jsonParsing(nserror) = maserror { + fail("\(maserror) \(nserror!)") + } } - } - guard let result = lookup else { fatalError("lookup result was nil") } + guard let result = lookup else { fatalError("lookup result was nil") } - expect(result.trackId) == appId - expect(result.bundleId) == "com.tinyspeck.slackmacgap" - expect(result.price) == 0 - expect(result.sellerName) == "Slack Technologies, Inc." - expect(result.sellerUrl) == "https://slack.com" - expect(result.trackName) == "Slack" - expect(result.trackViewUrl) == "https://itunes.apple.com/us/app/slack/id803453959?mt=12&uo=4" - expect(result.version) == "3.3.3" + expect(result.trackId) == appId + expect(result.bundleId) == "com.tinyspeck.slackmacgap" + expect(result.price) == 0 + expect(result.sellerName) == "Slack Technologies, Inc." + expect(result.sellerUrl) == "https://slack.com" + expect(result.trackName) == "Slack" + expect(result.trackViewUrl) == "https://itunes.apple.com/us/app/slack/id803453959?mt=12&uo=4" + expect(result.version) == "3.3.3" + } } } } diff --git a/MasKitTests/Extensions/Bundle+JSON.swift b/MasKitTests/Extensions/Bundle+JSON.swift index a1286db6f..e5288969c 100644 --- a/MasKitTests/Extensions/Bundle+JSON.swift +++ b/MasKitTests/Extensions/Bundle+JSON.swift @@ -8,20 +8,30 @@ import Foundation +extension Data { + /// Unsafe initializer for loading data from string paths. + /// - Parameter file: Relative path within the JSON folder + init(from fileName: String) { + let fileURL = Bundle.url(for: fileName)! + print("fileURL: \(fileURL)") + try! self.init(contentsOf: fileURL, options: .mappedIfSafe) + } +} + extension Bundle { /// Locates a JSON response file from the test bundle. /// /// - Parameter fileName: Name of file to locate. /// - Returns: URL to file. - static func jsonResponse(fileName: String) -> URL? { - return Bundle(for: NetworkSessionMock.self).fileURL(fileName: fileName) + static func url(for fileName: String) -> URL? { + return Bundle(for: NetworkSessionMock.self).url(for: fileName) } /// Builds a URL for a file in the JSON directory of the current bundle. /// /// - Parameter fileName: Name of file to locate. /// - Returns: URL to file. - func fileURL(fileName: String) -> URL? { + func url(for fileName: String) -> URL? { guard let path = self.path(forResource: fileName.fileNameWithoutExtension, ofType: fileName.fileExtension, inDirectory: "JSON") diff --git a/MasKitTests/JSON/search/bbedit.json b/MasKitTests/JSON/search/bbedit.json new file mode 100644 index 000000000..3e9a0a7ba --- /dev/null +++ b/MasKitTests/JSON/search/bbedit.json @@ -0,0 +1,64 @@ +{ + "resultCount": 1, + "results": [ + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/d6/4f/1d/d64f1d4d-7317-be28-2622-1c0e0281bf10/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/6c/c3/6e/6cc36e59-bb9d-d1c8-8826-63d6fd9e3190/mzl.khdxvhmp.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/b8/3c/d8/b83cd83c-bb37-7f2b-ac4b-ae2675e6ad4d/mzl.bnkikobm.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/6c/f4/4a/6cf44a64-636b-beeb-fa4f-f2c36783a449/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/66/f6/44/66f6442b-c49d-179a-c3d3-7e6dde251137/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/9b/7a/52/9b7a5236-b568-3468-244b-81d16191341e/mzl.fhamemzv.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/94/60/02/9460029f-0e79-e5e9-88db-55a11b732c40/mzl.avroidbj.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/df/ef/3b/dfef3b25-1c8d-9671-ae41-3b15ded00137/mzl.mtktnwpr.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/6e/1b/ea/6e1bea82-16be-a75d-21db-9c58db4fb605/mzl.oifmshpk.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/d5/47/b4/d547b4ba-bcb7-def3-fefc-e9f50529577e/mzl.ywkwmifv.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/b9/5d/a8/b95da808-2eea-5edd-0715-b0e13fd43f44/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/bare-bones-software-inc/id396307685?mt=12&uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/b9/5d/a8/b95da808-2eea-5edd-0715-b0e13fd43f44/source/60x60bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/b9/5d/a8/b95da808-2eea-5edd-0715-b0e13fd43f44/source/100x100bb.png", + "kind": "mac-software", + "trackId": 404009241, + "trackName": "BBEdit", + "primaryGenreName": "Developer Tools", + "isVppDeviceBasedLicensingEnabled": true, + "genreIds": [ + "6026", + "6007" + ], + "minimumOsVersion": "10.14", + "releaseNotes": "BBEdit 13.1.3 is a recommended update for all customers. This version includes an assortment of fixes for customer-reported issues, including a bug which caused the Search menu to display incorrect information or crash the application when pulled down. The full change notes are too long to include in the space allowed, but are available via the \"Support\" link on BBEdit's page in the App Store app.\n\nBBEdit 13.1 introduced significant feature additions and refinements, including (but not limited to): improved HTML previewing; advanced control over Markdown rendering; a new “Run Unix Command” command; significant improvements to its built-in CSS syntax coloring and navigation support; and built-in HTML Tidy commands.", + "releaseDate": "2011-01-05T08:23:40Z", + "formattedPrice": "Free", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "15198547", + "sellerUrl": "https://www.barebones.com/products/bbedit/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "currentVersionReleaseDate": "2020-07-30T12:53:37Z", + "trackCensoredName": "BBEdit", + "trackViewUrl": "https://apps.apple.com/us/app/bbedit/id404009241?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "13.1.3", + "wrapperType": "software", + "primaryGenreId": 6026, + "artistId": 396307685, + "artistName": "Bare Bones Software, Inc.", + "genres": [ + "Developer Tools", + "Productivity" + ], + "price": 0.00, + "description": "BBEdit is the leading professional text, code, and markup editor for the Macintosh. \n\nAs the \"go to\" tool for web site designers, web application developers, writers, and software developers, this award-winning product provides an abundance of high-performance features for editing, searching, and manipulation of text, code, and HTML/XML markup.\n\nAs a replacement for TextWrangler, BBEdit is built by the same developers, using the same award-winning technology, and is identical to TextWrangler in every way you're used to. BBEdit is 64-bit and compatible with macOS Catalina.\n\nAn intelligent interface provides easy access to BBEdit’s best-of-class features, including: grep pattern matching; search and replace across multiple files; project definition tools; function navigation and syntax coloring for numerous source code languages; code folding; FTP and SFTP open and save; AppleScript and Automator support; Unix scripting support; text and code completion; a complete set of robust HTML tools; and more.\n\nBBEdit offers a 30-day evaluation period (beginning the first time you use it on your computer), during which its full feature set is available.\n\nDuring the evaluation period, BBEdit is fully functional. After the evaluation period has expired, you can continue to use BBEdit for free, forever, with no nag screens or unsolicited interruptions.\n\nIn “free mode”, BBEdit provides a modified set of features, which incorporates a powerful set of core features. Using BBEdit in free mode costs you nothing, while providing an upgrade path to advanced features and capabilities.\n\nTo enable BBEdit’s advanced features after the evaluation period is over, you will need to have an active BBEdit subscription. Subscriptions are available on either a monthly or annual basis.\n\nAn active subscription gives you access to all of BBEdit’s advanced features, including any new features that we introduce during updates or major upgrades, for as long as the subscription is in good standing.\n\nPlease see our comparison chart for a detailed listing of which advanced features are available with a subscription.\n\nSubscription terms and conditions:\n\nWe do not collect any data from your use of BBEdit, whether or not a subscription is in effect.\n\nYour interactions with BBEdit and with Bare Bones Software, Inc. are protected by our privacy policy.\n\nYour use of BBEdit is governed by the terms of its end-user license.\n\nWhen you purchase a subscription, payment will be charged to your iTunes Account upon confirmation of purchase.\n\nYour subscription will renew automatically, unless you cancel your subscription at least 24 hours prior to the end of the currently active subscription period. Your iTunes Account will be charged for the renewal within 24 hours prior to the end of the currently active subscription period, and your account history will reflect the cost of the renewal.\n\nYou can manage your subscription and cancel automatic renewal by going to your \"Manage my Subscriptions\" page after purchase.\n\nPurchasing a subscription will permanently end your evaluation period, and forfeits any unused portion of the evaluation period, if applicable.\n\nFor the full text of the BBEdit end user license for Mac App Store customers, please visit this page on our web site: https://www.barebones.com/products/bbedit/appstore/terms.html", + "sellerName": "Bare Bones Software, Inc.", + "currency": "USD", + "bundleId": "com.barebones.bbedit", + "userRatingCount": 0 + } + ] + } diff --git a/MasKitTests/JSON/search/bear.json b/MasKitTests/JSON/search/bear.json new file mode 100644 index 000000000..2dfd07e33 --- /dev/null +++ b/MasKitTests/JSON/search/bear.json @@ -0,0 +1,3418 @@ +{ + "resultCount": 50, + "results": [ + { + "artistViewUrl": "https://apps.apple.com/us/developer/shiny-frog-ltd/id527618974?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/c3/03/4f/c3034fea-d595-dc56-de9c-189ae67e6afa/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/c3/03/4f/c3034fea-d595-dc56-de9c-189ae67e6afa/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/70/2b/6a/702b6a77-ca38-b056-1bbf-23ebf2cca565/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/8e/2f/fc/8e2ffcde-df4c-3ad8-5f7c-1f1d9e12e550/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/43/8c/81/438c81d3-7d84-4531-ff8f-57df63dd9b84/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/1c/00/1d/1c001d82-fe4b-12cc-7346-b6843fa57778/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/c2/4d/70/c24d70ce-4c5f-c70d-6540-628f0499c03d/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/27/c2/00/27c2001a-65a8-ffe4-4f28-7a683890809f/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/c3/03/4f/c3034fea-d595-dc56-de9c-189ae67e6afa/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Bear", + "trackViewUrl": "https://apps.apple.com/us/app/bear/id1091189122?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.11", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES", + "ZH" + ], + "fileSizeBytes": "22226957", + "sellerUrl": "https://bear.app", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1091189122, + "trackName": "Bear", + "genreIds": [ + "6007", + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2016-11-03T00:41:39Z", + "currentVersionReleaseDate": "2020-09-02T08:05:32Z", + "releaseNotes": "***WIKI LINKS FOR NOTE HEADERS***\nBear supports linking to other notes, and now you can link directly to headers (H1-H6) in a note! Type [[ to find a note to link, then press / to view available headers.\n\n***HTML EXPORT FOR NOTE WIKI LINKS***\nExport multiple notes that have Bear wiki links to each other, and they’ll become proper HTML links.\n\n***CHOOSE YOUR NOTE ADVENTURE***\nYou can now choose the starting text of new notes: Header, Date, Date and Time, or Empty. Check Bear’s Settings > General.\n\n***A NEW WAY TO INCLUDE IMAGES IN HTML EXPORT***\nUse the new Base64 option when exporting a note to HTML with images. This will embed the image _in_ the HTML file for more flexible portability.\n\niOS -> Preferences -> Import & Export\nmacOS -> Save Panel (⌘⇧S)\n\n***BETTER MARKDOWN PREVIEW WITH MARKED 2***\nMarked is a great utility for previewing Markdown files (learn more at Marked2app.com). Now, you no longer need to authorize it to view Markdown previews from Bear.\n\n***NEW THEMES FOR BEAR PRO***\nEnjoy the new Olive Dark and D.Boring themes, now available to Bear Pro subscribers.\n\n***MORE GOODIES AND FIXES***\n\n* **macOS**: Changed label names in the `Format -> Insert Current Date` menu so you can create keyboard shortcuts\n* Localization improvements in the iOS extension, changed `append/prepend` with `Start of.../End Of...`\n* QLPreviewController export bug workaround\n* QLPreviewController markup tool orientation fix\n* Enex and HTML importer improvements\n* Various fixes for crashes and minor bugs\n\n* XCallback-URLs improvements:\n* `/open-tag` parameter `name` now takes a tag list as input\n* `/add-text` and `/add-file` takes a new parameter `selected` (current selected note, see `/open-note`)\n* `/add-text` and `/create` takes a new parameter `clipboard` (takes the text input from clipboard instead of passing it as a parameter)\n* `/create` takes a new parameter `float` to making the new note open in a floating window (see `/open-note`)", + "primaryGenreId": 6007, + "sellerName": "Shiny Frog Ltd.", + "description": "Bear is a focused, flexible notes app used by writers, lawyers, chefs, teachers, engineers, students, parents and more! Bear has quick organisation, editing tools, and export options to help you write quickly and share anywhere and preserve your privacy with encryption.\n\n2017 Apple Design Award\nApp Store App of the Year 2016\n“My journaling app of choice is Bear” - Kit Eaton, New York Times\n\n*WRITE YOUR WAY* with flexible yet simple tools\n\n- Tools stay out of your way so you can just write\n- **NEW** Encrypt individual notes and lock Bear with Face/Touch ID (Bear Pro required. Learn more below)\n- Easily create notes with Siri and iOS Shortcuts\n- Use Apple Watch to dictate and append to recent notes\n- Pick from over a dozen themes for the perfect writing space (requires Bear Pro. Learn more below)\n- Support for sketching, drawing, and Apple Pencil (and other styli)\n- Grab images, text, files, and clip web pages with Bear’s app extension\n\n*ORGANIZE QUICKLY* with tasks and #tags\n\n- Add #tags, #multi-word tags# and even #multiple/nested/tags anywhere in a note for quick organization\n- Add tasks to notes to stay on track\n- Archive notes to keep them around, but out of your way\n- Use Cross-Note Links to build a body of work, reference other notes, and more\n- Pick custom icons to help important tags stand out in the Sidebar\n- Use emoji autocomplete to add style to your tasks, journals, headings, and more\n\n*SHARE ANYWHERE*\n\n- Multiple export options including HTML, PDF, DOCX, MD, JPG, EPUB, and TextBundle (some export options require Bear Pro)\n- Copy part of a note in a variety of formats to paste elsewhere\n- Easily share your notes to any third party app including Wordpress, Mail, Sparkle, etc...\n\n*SEARCH ALL THE THINGS*\n\n- Use Spotlight to search your notes from anywhere\n- Quickly find what you need with keyword highlights\n- Focus on specific types of notes with powerful Search Triggers. Try @task to find all notes with todos.\n\n*USE IT EVERYWHERE* with sync in Bear Pro\n\n- Sync your notes between Mac, iPad, iPhone, and Apple Watch\n- Notes sync via iCloud, not our servers\n- A single in-app subscription works across all your devices\n\n*YOUR NOTES, NOT OURS*\n\n- Bear is private at its core: We cannot see your notes, tags, or anything else\n- **NEW** Encrypt individual notes with a password that is entirely private to you (Bear Pro required)\n- **NEW** Lock Bear with Face/Touch ID (Bear Pro required)\n- Export notes to portable formats like Plain Text, Markdown, and TextBundle\n- With a Bear Pro subscription, your notes sync via iCloud, not our servers\n- Backup and restore all notes with just a couple taps\n\n*ENABLE ALL FEATURES WITH BEAR PRO*\n\nOne low, yearly subscription enables a variety of features on all your devices and keeps the Bear hugs coming.\n\n- **NEW** Encrypt individual notes with a password that is entirely private to you\n- **NEW** Lock Bear with Face/Touch ID\n- Sync notes between your iPhone, iPad, and Mac via iCloud\n- Advanced export to PDF, HTML, DOCX, JPG\n- Over a dozen gorgeous app themes to help you create the best writing environment\n- More themes are on the way\n- Keep the Bear updates coming\n\n$1.49 monthly, $14.99 annually (save 18%)\n\n---- ---\n\nPrice may vary by location. Subscriptions will be charged to your credit card through your iTunes account. Your subscription will automatically renew unless canceled at least 24 hours before the end of the current period. You will not be able to cancel the subscription once activated. After purchase, manage your subscriptions in App Store Account Settings. Any unused portion of a free trial period, will be forfeited when the user purchases a subscription.\n\n$1.49 monthly, includes a one week free trial\n$14.99 annually, includes a one month free trial\n\n---- ---\n\nbear@shinyfrog.net\nTwitter: BearNotesApp\nReddit: reddit.com/r/BearApp\nFacebook: BearNotes\nInstagram: BearNotesApp\n\nPrivacy Policy: http://www.bear-writer.com/privacy/\nTerms of Service: http://www.bear-writer.com/terms/", + "artistId": 527618974, + "artistName": "Shiny Frog Ltd.", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "net.shinyfrog.bear", + "version": "1.7.15", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/skyvu-inc/id321183680?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/27/76/d0/2776d0fc-7b21-7d28-3a56-26e5195e9921/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/27/76/d0/2776d0fc-7b21-7d28-3a56-26e5195e9921/source/100x100bb.png", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple/22/74/e5/mzl.inmhusfi.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple/86/45/f3/mzl.kjklczqt.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/72/e8/a9/mzl.toaoonlh.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/9d/10/80/mzl.exglzlkj.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple/7b/4b/f2/mzl.ebzjoutz.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/27/76/d0/2776d0fc-7b21-7d28-3a56-26e5195e9921/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "BATTLE BEARS -1 Mac", + "trackViewUrl": "https://apps.apple.com/us/app/battle-bears-1-mac/id413013033?mt=12&uo=4", + "contentAdvisoryRating": "9+", + "averageUserRating": 0, + "minimumOsVersion": "10.6.6", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "718719628", + "sellerUrl": "http://www.BattleBears.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "9+", + "trackId": 413013033, + "trackName": "BATTLE BEARS -1 Mac", + "genreIds": [ + "6014", + "7001", + "7002", + "6016" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Games", + "releaseDate": "2011-01-11T18:15:27Z", + "currentVersionReleaseDate": "2011-04-25T22:45:15Z", + "releaseNotes": "Get BATTLE BEARS GOLD, SkyVu's award-winning multiplayer shooter for your iPhone, iPod touch, and iPad.", + "primaryGenreId": 6014, + "sellerName": "SkyVu Inc.", + "description": "FREE FOR A LIMITED TIME! Celebrating 30 MILLION downloads! \nThe #1 Action/Adventure Game in the USA! \n\"BATTLE BEARS -1 is a ride that's well worth taking.\" -TouchArcade \n\"BATTLE BEARS -1 is a game that you should NOT pass up on!\" -TouchAholics\n\nBATTLE BEARS -1 is an action-packed 3D shooter with massive bosses, heaps of humor, tons of crazy weapons, and no shortage of fluffiness or shooting rainbows. This special Mac edition includes all 3 campaigns, full HD cutscenes, and tons of new effects tailor made for your Mac.\n\n\"The guys and girls at SkyVu have a spooky ability to create the most compulsive and playable games available.\" -iPad.net\n\n\"Every action fan will want to grab a copy of BATTLE BEARS -1 for its hilarious style and non-stop rainbow-spewing\" -AppSpy\n\nJoin OLIVER, RIGGS and WIL on a space odyssey none of them are anywhere close to thrilled to be experiencing. Defend the flagship Ursa Major from an onslaught of confused creatures hewn from the deepest, darkest corners of the cosmos' disturbed imagination.\n\nHOW TO PLAY:\nTo Move: Use WASD or Arrow keys\nTo Look Around: Use Mouse or Trackpad\nTo Fire: Click\nTo Pause: Esc\nTo Switch Weapons: Use Mouse Scroll or 1, 2, 3, 4 or 5\nTo Access MAP: Tab\n\n\nCOLLECT ALL SKYVU GAMES!\n\nBATTLE BEARS GOLD (FREE!!)\nBATTLE BEARS: ZOMBIES! (FREE!!)\nBATTLE BEARS -1 (FREE!!)\nBATTLE BEARS ZERO: Wil's Finest Hour \nBATTLE BEARS Soundtracks on iTunes\n\nSUPPORT FORUMS, TOYS & T-SHIRTS at BattleBears.com\nLIKE US: Facebook.com/BattleBears\nFOLLOW US: Twitter.com/BattleBears\nWATCH US: YouTube.com/SkyVuTV\n\nEVERY 5 STAR RATING HELPS US BRING YOU MORE UPDATES! The SkyVu family appreciates your support.", + "artistId": 321183680, + "artistName": "SkyVu Inc.", + "genres": [ + "Games", + "Action", + "Adventure", + "Entertainment" + ], + "price": 0.00, + "bundleId": "net.skyvu.battlebearsneg1mac", + "version": "1.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/hot-texas-ltd/id1410625290?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/a3/dc/cf/a3dccf80-9338-4dd1-81e8-e837387a8d7a/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/a3/dc/cf/a3dccf80-9338-4dd1-81e8-e837387a8d7a/source/100x100bb.png", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/94/9b/74/949b744d-847f-0d8f-e4fd-8e0ad89efe9a/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/a3/dc/cf/a3dccf80-9338-4dd1-81e8-e837387a8d7a/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "VPN Hotspot - Unlimited Proxy", + "trackViewUrl": "https://apps.apple.com/us/app/vpn-hotspot-unlimited-proxy/id1380623227?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.11", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "1075784", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1380623227, + "trackName": "VPN Hotspot - Unlimited Proxy", + "genreIds": [ + "6007", + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2018-07-28T23:01:06Z", + "currentVersionReleaseDate": "2019-07-10T23:26:28Z", + "releaseNotes": "- Fix keychain errors.", + "primaryGenreId": 6007, + "sellerName": "HOT TEXAS LTD", + "description": "VPN Hotspot - faster, more smooth, and easier to use. \nIt is the best proxy VPN client for WiFi hotspot security, access your favorite sites, and privacy protection.It is a free and unlimited VPN.\nVPN Hotspot - It brings a high vpn speed and encrypted VPN connection to your iPhone. \nAccess your favorite sites and apps with VPN Hotspot! It can also access video.\nThe best VPN for school wifi.\nThe best privacy guard. It protects your network traffic under WiFi hotspot Browse anonymously and securely without being tracked. \nEnjoy private browsing.\nWorks with WiFi,LTE, 3G, and all mobile data carriers.\n\nYou can be a Premium member and get more features through auto-renewing subscription:\n\n1 Month: $9.99\n1 Year: $35.99 / 12 = $2.99 per month!\n\n- Payment will be charged to iTunes Account at confirmation of purchase\n- Subscription automatically renews unless auto-renew is turned off at least 24-hours before the end of the period\n- Account will be charged for renewal within 24-hours prior to the end of the current period, and identify the cost of the renewal\n- Subscriptions may be managed by the user and auto-renewal may be turned off by going to the user's Account Settings after purchase\n- Any unused portion of a free trial period, if offered, will be forfeited when the user purchases a subscription to that publication.\n\nPrivacy Policy: https://www.hottexasltd.com/privacy.html\nTerms of Service: https://www.hottexasltd.com/terms.html", + "artistId": 1410625290, + "artistName": "HOT TEXAS LTD", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.ifn.vpnlite", + "version": "1.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/esoteric-development/id416932838?uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/6e/8f/44/6e8f44bb-c5a2-1b31-e453-9e603140c894/source/60x60bb.jpg", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/6e/8f/44/6e8f44bb-c5a2-1b31-e453-9e603140c894/source/100x100bb.jpg", + "isGameCenterEnabled": false, + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/aa/77/2a/aa772a55-7b83-de81-31ec-dcc95077b680/mzl.lsalkvnw.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/0d/9a/c7/0d9ac7de-fffb-9080-28fd-c8159a89dccf/mzl.auybgdds.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/3e/26/7c/3e267c24-a594-1f51-020f-e52af0e3d215/mzl.tvquqsoi.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/60/38/e4/6038e494-eb66-df48-517b-e6bd5faecd82/mzl.zkozxcae.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/4f/bb/47/4fbb47c6-3637-ef4d-cfa9-b9214844f8d8/mzl.aeyjdncr.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/7d/c1/62/7dc162c6-4183-0760-b976-62942bbd67fa/mzl.qbyxbsfc.png/576x768bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/b0/f1/a3/b0f1a3df-e481-cbf0-a9c9-0e98d2ae253b/mzl.gabhvqkt.png/576x768bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/ac/56/e9/ac56e93a-15ec-eb9c-0da0-dcec9be6d5da/mzl.uvbelauo.png/576x768bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/73/7f/14/737f1407-7449-c69f-f21d-8eb1ce544329/mzl.ehfxmgox.png/576x768bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/ed/b1/7a/edb17a31-24de-c0d2-b54b-88ccbe334a96/mzl.gkqbndpo.png/576x768bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/6e/8f/44/6e8f44bb-c5a2-1b31-e453-9e603140c894/source/512x512bb.jpg", + "advisories": [], + "supportedDevices": [ + "iPhone11ProMax-iPhone11ProMax", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadSeventhGen-iPadSeventhGen", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadMini4-iPadMini4", + "iPad834-iPad834", + "iPhoneSE-iPhoneSE", + "iPad73-iPad73", + "iPadAir2-iPadAir2", + "iPadMini5Cellular-iPadMini5Cellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad612-iPad612", + "iPadPro97-iPadPro97", + "iPhone6s-iPhone6s", + "iPad856-iPad856", + "iPadAirCellular-iPadAirCellular", + "iPhone8-iPhone8", + "iPhoneXR-iPhoneXR", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMiniRetina-iPadMiniRetina", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone7Plus-iPhone7Plus", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhone8Plus-iPhone8Plus", + "iPhoneX-iPhoneX", + "iPadMini5-iPadMini5", + "iPhone6Plus-iPhone6Plus", + "iPadProCellular-iPadProCellular", + "iPad71-iPad71", + "iPhone7-iPhone7", + "iPhone6-iPhone6", + "iPadProFourthGen-iPadProFourthGen", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadAir3-iPadAir3", + "iPad72-iPad72", + "iPhoneXS-iPhoneXS", + "iPadProSecondGen-iPadProSecondGen", + "iPad878-iPad878", + "iPhone11-iPhone11", + "iPadAir-iPadAir", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadPro-iPadPro", + "iPadMini3-iPadMini3", + "iPad611-iPad611", + "iPhone6sPlus-iPhone6sPlus", + "iPhone11Pro-iPhone11Pro", + "MacDesktop-MacDesktop", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone5s-iPhone5s", + "iPhoneXSMax-iPhoneXSMax", + "iPad75-iPad75", + "iPad74-iPad74", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPad812-iPad812", + "iPad76-iPad76" + ], + "features": [ + "iosUniversal" + ], + "kind": "software", + "currency": "USD", + "trackCensoredName": "Suru: Lists & Notes", + "trackViewUrl": "https://apps.apple.com/us/app/suru-lists-notes/id738040933?uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 4.60517999999999982918552632327191531658172607421875, + "minimumOsVersion": "11.0", + "languageCodesISO2A": [ + "ZH", + "EN", + "ZH", + "ZH" + ], + "fileSizeBytes": "41945088", + "sellerUrl": "https://www.esotericdevelopment.com/suru", + "averageUserRatingForCurrentVersion": 4.60517999999999982918552632327191531658172607421875, + "userRatingCountForCurrentVersion": 309, + "trackContentRating": "4+", + "trackId": 738040933, + "trackName": "Suru: Lists & Notes", + "genreIds": [ + "6007", + "6000" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2014-03-14T23:53:46Z", + "currentVersionReleaseDate": "2020-08-26T13:43:11Z", + "releaseNotes": "Bug fixes and performance improvements.", + "primaryGenreId": 6007, + "sellerName": "Brandon Storms", + "description": "Suru is a simple, beautiful, and easy-to-use app that helps you organize all your tasks and projects. Create beautiful outlines, mind maps and task or To-Do lists with perfectly organized text and photos all in palm of your hand. \n\nWith Suru you can :\n- Create and edit organized task lists broken down into sub-tasks\n- Outline your next paper or presentation with precise detail and photos\n- Take organized notes in class or at the office\n- Brainstorm new ideas and projects from anywhere, never forget your next big idea!\n- Snap and group important or inspiring photos relevant to your projects and ideas\n- Organize and structure your research\n- Share your lists and outlines with friends and co-workers\n- Set reminders or alarms for important tasks to keep you on track and productive\n- Sync your lists and outlines to the cloud!\n- Send a copy of your lists and ideas to other Suru users directly to their device. \n\nSuru Key Features:\n- Create tasks and ideas organized by priority and color\n- Mark items as complete to track your progress/productivity\n- Set Reminders/Alarms for items\n- Break ideas down into smaller pieces and add detailed text and photos.\n- Re-Organize, Re-Color, and Delete items or sub-items \n- Export your work as a beautifully formatted PDF outline.\n- 7 Unique and beautiful color palettes\n- Simple, intuitive interface allows you to capture you ideas quickly and easily \n- PDF export lets you share your lists and outlines with anyone.\n\nSuru lets you work in whatever way best suits you. You can be as general or specific as you like using whatever colors you love!\n\n--------------------------------\n\nAlso:\n\nSuru Pro!\n\n• Sync lists and outlines over all your devices\n• Backup all your work and photos securely in the cloud.\n• 7 All new colors themes\n• Support Suru and future Suru products!\n\n$1.49 monthly, $8.99 yearly\n\n-------\n\nPrice may vary by location. Subscriptions will be charged to your credit card through your iTunes account. Your subscription will automatically renew unless canceled at least 24 hours before the end of the current period. You will not be able to cancel the subscription once activated. Manage your subscriptions in Suru Pro Settings after purchase. Any unused portion of a free trial peri​od, will be forfeited when the user purchases a subscription.\n\n-------\n\nWe'd love to answer your questions or just hear what you think about Suru. Find us online at:\n\nsupport@esotericdevelopment.com(mailto:support@esotericdevelopment.com)\n\n---\n\nPrivacy Policy : https://www.esotericdevelopment.com/privacy-policy\nTerms Of Service : https://www.esotericdevelopment.com/tos", + "artistId": 416932838, + "artistName": "Esoteric Development", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.00, + "bundleId": "com.esotericdevelopment.suru", + "version": "5.10", + "wrapperType": "software", + "userRatingCount": 309 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/yi-lun-zhao/id598496583?uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/7b/7b/04/7b7b0432-16f8-65d7-8b1d-bb7e2c60780b/source/60x60bb.jpg", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/7b/7b/04/7b7b0432-16f8-65d7-8b1d-bb7e2c60780b/source/100x100bb.jpg", + "isGameCenterEnabled": false, + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/23/c6/05/23c6052b-64e8-470f-c8ff-44f95b7e168f/pr_source.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/d3/e7/70/d3e770a2-717b-29d4-9b0c-834c9b8d7a70/pr_source.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/39/b1/2c/39b12c3e-3a42-1b0a-4e8f-2d6e2412c121/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/34/78/7e/34787e5a-1cb2-3205-2821-c03469ae212c/pr_source.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/ca/1b/60/ca1b6032-2815-e46b-3106-6defeee52e69/pr_source.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/ef/d9/55/efd9557d-515a-a68b-9d51-7b08c01b1324/pr_source.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/b1/0a/f4/b10af413-ee4c-dabf-a772-b5b27723163e/pr_source.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/0b/4c/49/0b4c49c7-b586-3d71-f1d6-73fcf9b10a5e/pr_source.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/40/94/b7/4094b707-e8ed-c0a7-ba44-5fdcf7c0432e/pr_source.png/552x414bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/7b/7b/04/7b7b0432-16f8-65d7-8b1d-bb7e2c60780b/source/512x512bb.jpg", + "advisories": [], + "supportedDevices": [ + "iPhone11ProMax-iPhone11ProMax", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadSeventhGen-iPadSeventhGen", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadMini4-iPadMini4", + "iPad834-iPad834", + "iPhoneSE-iPhoneSE", + "iPad73-iPad73", + "iPadAir2-iPadAir2", + "iPadMini5Cellular-iPadMini5Cellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad612-iPad612", + "iPadPro97-iPadPro97", + "iPhone6s-iPhone6s", + "iPad856-iPad856", + "iPadAirCellular-iPadAirCellular", + "iPhone8-iPhone8", + "iPhoneXR-iPhoneXR", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMiniRetina-iPadMiniRetina", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone7Plus-iPhone7Plus", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhone8Plus-iPhone8Plus", + "iPhoneX-iPhoneX", + "iPadMini5-iPadMini5", + "iPhone6Plus-iPhone6Plus", + "iPadProCellular-iPadProCellular", + "iPad71-iPad71", + "iPhone7-iPhone7", + "iPhone6-iPhone6", + "iPadProFourthGen-iPadProFourthGen", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadAir3-iPadAir3", + "iPad72-iPad72", + "iPhoneXS-iPhoneXS", + "iPadProSecondGen-iPadProSecondGen", + "iPad878-iPad878", + "iPhone11-iPhone11", + "iPadAir-iPadAir", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadPro-iPadPro", + "iPadMini3-iPadMini3", + "iPad611-iPad611", + "iPhone6sPlus-iPhone6sPlus", + "iPhone11Pro-iPhone11Pro", + "MacDesktop-MacDesktop", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone5s-iPhone5s", + "iPhoneXSMax-iPhoneXSMax", + "iPad75-iPad75", + "iPad74-iPad74", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPad812-iPad812", + "iPad76-iPad76" + ], + "features": [ + "iosUniversal" + ], + "kind": "software", + "currency": "USD", + "trackCensoredName": "Noto - Elegant Note", + "trackViewUrl": "https://apps.apple.com/us/app/noto-elegant-note/id1459055246?uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 4.5970700000000004337152859079651534557342529296875, + "minimumOsVersion": "13.0", + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "35651584", + "sellerUrl": "http://noto.ink", + "averageUserRatingForCurrentVersion": 4.5970700000000004337152859079651534557342529296875, + "userRatingCountForCurrentVersion": 273, + "trackContentRating": "4+", + "trackId": 1459055246, + "trackName": "Noto - Elegant Note", + "genreIds": [ + "6007", + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2019-10-11T07:00:00Z", + "currentVersionReleaseDate": "2020-08-11T00:18:19Z", + "releaseNotes": "* Add Spell Check Settings\n* Fix Share Extension", + "primaryGenreId": 6007, + "sellerName": "Yi Lun Zhao", + "description": "Features:\n - Powerful text editing tools\n - Bold / Italic / Underline / Strikethrough / Highlight\n - Number list / Bullet list / Check list\n - Unlimited attachments (Pro):\n - Image / Video / Scan / Drawing / File\n - Table / Block quote / Code / Math Equation\n - Dark mode\n - iCloud sync\n - Organize with gesture\n - Export to HTML, Markdown, PDF, & JPG\n - Lock notes (Pro)\n - Desktop class organization\n - Drag to reorder your list and paragraph\n - Drag to organize your notes\n - Rapid multi select\n\nNoto is free to use, including iCloud Sync support.\n\nUnlock Noto Pro to enable all features including\n* Attachments\n* Note lock\n* Export\n* Support future Noto development\n\nTerms and Conditions: https://noto.ink/terms\nPrivacy Policy: https://noto.ink/privacy", + "artistId": 598496583, + "artistName": "Yi Lun Zhao", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.lkzhao.editor", + "version": "2.3.1", + "wrapperType": "software", + "userRatingCount": 273 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/aloha-mobile/id1105317681?uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/3c/c3/c4/3cc3c4cf-f882-c5dd-fb63-ca03875c94c3/source/60x60bb.jpg", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/3c/c3/c4/3cc3c4cf-f882-c5dd-fb63-ca03875c94c3/source/100x100bb.jpg", + "isGameCenterEnabled": false, + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/f1/20/a3/f120a379-a2fa-3b54-6774-87bded6db4e4/pr_source.jpg/392x696bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/fc/69/5b/fc695b10-4bbb-aea5-8fdd-416368f83187/pr_source.jpg/392x696bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/1c/40/25/1c4025cc-3e18-da8e-0c7e-9b298d5aec96/pr_source.jpg/392x696bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/23/dd/c6/23ddc63c-165c-2348-94e7-64ae24e0a7fd/pr_source.jpg/392x696bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/67/d7/66/67d76691-5414-077f-f2d4-e3bb28d31ae1/pr_source.jpg/392x696bb.jpg" + ], + "ipadScreenshotUrls": [], + "appletvScreenshotUrls": [], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/3c/c3/c4/3cc3c4cf-f882-c5dd-fb63-ca03875c94c3/source/512x512bb.jpg", + "advisories": [], + "supportedDevices": [ + "iPhone11ProMax-iPhone11ProMax", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadSeventhGen-iPadSeventhGen", + "iPhone5-iPhone5", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadMini4-iPadMini4", + "iPad834-iPad834", + "iPadFourthGen-iPadFourthGen", + "iPhoneSE-iPhoneSE", + "iPad73-iPad73", + "iPadAir2-iPadAir2", + "iPadMini5Cellular-iPadMini5Cellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad612-iPad612", + "iPadPro97-iPadPro97", + "iPhone6s-iPhone6s", + "iPad856-iPad856", + "iPadAirCellular-iPadAirCellular", + "iPhone8-iPhone8", + "iPhoneXR-iPhoneXR", + "iPadFourthGen4G-iPadFourthGen4G", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMiniRetina-iPadMiniRetina", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone7Plus-iPhone7Plus", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhone8Plus-iPhone8Plus", + "iPhoneX-iPhoneX", + "iPadMini5-iPadMini5", + "iPhone6Plus-iPhone6Plus", + "iPadProCellular-iPadProCellular", + "iPad71-iPad71", + "iPhone7-iPhone7", + "iPhone6-iPhone6", + "iPadProFourthGen-iPadProFourthGen", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadAir3-iPadAir3", + "iPad72-iPad72", + "iPhoneXS-iPhoneXS", + "iPadProSecondGen-iPadProSecondGen", + "iPad878-iPad878", + "iPhone11-iPhone11", + "iPadAir-iPadAir", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadPro-iPadPro", + "iPadMini3-iPadMini3", + "iPhone5c-iPhone5c", + "iPad611-iPad611", + "iPhone6sPlus-iPhone6sPlus", + "iPhone11Pro-iPhone11Pro", + "MacDesktop-MacDesktop", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone5s-iPhone5s", + "iPhoneXSMax-iPhoneXSMax", + "iPad75-iPad75", + "iPad74-iPad74", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPad812-iPad812", + "iPad76-iPad76" + ], + "features": [], + "kind": "software", + "currency": "USD", + "trackCensoredName": "Aloha VPN", + "trackViewUrl": "https://apps.apple.com/us/app/aloha-vpn/id1455494920?uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 4.39893000000000000682121026329696178436279296875, + "minimumOsVersion": "10.0", + "languageCodesISO2A": [ + "AR", + "CA", + "HR", + "CS", + "DA", + "NL", + "EN", + "FI", + "FR", + "DE", + "EL", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KO", + "MS", + "NO", + "FA", + "PL", + "PT", + "RO", + "RU", + "ZH", + "SK", + "ES", + "SV", + "TH", + "ZH", + "TR", + "UK", + "VI" + ], + "fileSizeBytes": "48723968", + "sellerUrl": "https://alohabrowser.com/", + "averageUserRatingForCurrentVersion": 4.39893000000000000682121026329696178436279296875, + "userRatingCountForCurrentVersion": 188, + "trackContentRating": "4+", + "trackId": 1455494920, + "trackName": "Aloha VPN", + "genreIds": [ + "6002", + "6007" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Utilities", + "releaseDate": "2019-04-27T05:17:30Z", + "currentVersionReleaseDate": "2020-07-08T21:32:43Z", + "releaseNotes": "This update brings speed and stability improvement to the VPN connection.\n\nPlease rate the app if you like it!\nFeel free to contact our customer support team if you have any questions: support@alohabrowser.com", + "primaryGenreId": 6002, + "sellerName": "Aloha Mobile Ltd.", + "description": "Aloha VPN is a secure VPN client that works on turbo speeds. We have a plenty of locations to choose from, or you can always stay on the fastest server if you just want to be protected.\n\nThe first PRIVACY COMMITTED secure VPN client.\n\n- Our servers have strict no logs policy\n- We don't record your IP\n- We don't record what you are doing\n- We don't share or sell your data and we have nothing to share or sell\n- Every connection is encrypted with military-grade AES256 algorithm\n- We use secure DNS\n- We regularly test our network with privacy audits\n- Our Smart Speed Alert technology adds new servers automatically to maintain ultra fast connection for each every one of our users\n\nALOHA VPN SUBSCRIPTION\n\nYou can buy Aloha VPN subscription that gives you access to a secure VPN connection, including:\n- VPN country selection\n- VPN protection for the public Wi-Fi\n- Ability to use VPN in another apps\n\nAloha VPN subscription price starts at $3.99 USD/month or $24.99 USD/year. Prices are in US dollars, may vary in countries other than the US and are subject to change without notice.\n\nIf you choose to purchase Aloha VPN, payment will be charged to iTunes Account at confirmation of purchase. Subscription automatically renews unless auto-renew is turned off at least 24-hours before the end of the current period. Auto-renewal may be turned off at any time by going to your settings in the iTunes Store after purchase. Any unused portion of a free trial period will be forfeited when you purchases a subscription.\n\nPrivacy policy: https://alohabrowser.com/policy-vpn.html\nTerms & Conditions: https://alohabrowser.com/terms-vpn.html\n\nABOUT US\n\nAloha VPN is proudly brought to you by the privacy experts and the makers of Aloha Browser\n\nWe are a group of enthusiasts whose main concern is the current lack of Internet privacy. That’s why we have created Aloha Browser. Our mission is to keep you safe, and make your web browsing experience as private as you want it to be.\n\n\nCUSTOMER CARE\n\nhttps://community.alohabrowser.com/\nsupport@alohabrowser.com", + "artistId": 1105317681, + "artistName": "Aloha Mobile", + "genres": [ + "Utilities", + "Productivity" + ], + "price": 0.00, + "bundleId": "com.alohabrowser.vpn", + "version": "1.5.9", + "wrapperType": "software", + "userRatingCount": 188 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/graphic-node/id438911754?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/4e/6c/17/4e6c172c-2be4-9232-c785-0d6625ba00f9/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/4e/6c/17/4e6c172c-2be4-9232-c785-0d6625ba00f9/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/18/d9/cf/18d9cf6d-d649-dace-86a1-d18b49c3d027/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/86/03/55/8603552d-c1b8-dc37-f56b-de4a24377a62/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/12/8c/8a/128c8a12-f0c8-bcdd-3299-de3b9abe6419/mzl.kyswsyto.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/d5/40/a7/d540a7a4-7fa4-0984-f2d2-59aaecba318d/mzl.uxiadnuc.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/fe/3f/15/fe3f1594-4f82-94cc-6833-029396c2480b/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/4e/6c/17/4e6c172c-2be4-9232-c785-0d6625ba00f9/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Templates for iWork - DesiGN", + "trackViewUrl": "https://apps.apple.com/us/app/templates-for-iwork-design/id932743968?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.11", + "languageCodesISO2A": [ + "DA", + "NL", + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES", + "SV", + "TH" + ], + "fileSizeBytes": "12750258", + "sellerUrl": "http://graphicnode.com/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 932743968, + "trackName": "Templates for iWork - DesiGN", + "genreIds": [ + "6007", + "6027" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2015-03-24T20:14:26Z", + "currentVersionReleaseDate": "2020-06-26T18:11:54Z", + "releaseNotes": "• Menu item \"Unlock All\", has been removed. Now all purchases can be download, with the menu item \"Download all purchased items\".", + "primaryGenreId": 6007, + "sellerName": "UAB \"Graphic Node\"", + "description": "The ideal tool for users of iWork, Templates for iWork - DesiGN provides you with over 35,000 unique designs for Pages documents, spreadsheet templates for Numbers, first-class slideshow themes for Keynote, over 2000 images and graphics for illustrating your content. All templates are available in the US and international paper sizes.\n\nTemplates for iWork - DesiGN is free to download with free items in each category and in-app purchases for instant use. All items can be purchased individually or in packs. The bundle for iWork unlocks all the items within the Templates for iWork - DesiGN and enables free content updates. With Templates for iWork - DesiGN your work will always be the most productive.\n\n\nRoyalty-free stock images, illustrations, photographs in a fast-growing library. It can be used in both personal and commercial projects.\n\n\n\n * Latest versions of Pages, Numbers, ​and Keynote are recommended.", + "artistId": 438911754, + "artistName": "Graphic Node", + "genres": [ + "Productivity", + "Graphics & Design" + ], + "price": 0.00, + "bundleId": "com.graphicnode.setforbusiness", + "version": "4.2.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/mighty-bear-games-pte-ltd/id1321709593?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/a4/c1/71/a4c17180-65ea-2b85-901f-ac90b3b8673a/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/a4/c1/71/a4c17180-65ea-2b85-901f-ac90b3b8673a/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/64/3b/eb/643bebfd-5ffb-aa13-e376-378c01895fcb/1e5e6c65-dbcb-4654-9136-554f7ef3fea4_01_Splash_Mac.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/85/d5/68/85d56882-8ad8-ab12-5acf-bd92639130b0/b4eac1c2-3567-4bbd-958e-97baaf9e5909_02_Friends_Mac.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/11/eb/8a/11eb8ac3-135f-67a5-a4c2-d90ffd4fe5e8/30137b1a-51fe-4b40-9e7e-d4ed12a99db2_03_Friends_Mac.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/d5/f5/d0/d5f5d0ab-cecc-0527-4758-8513982c219f/f5c2a67a-0d6a-4245-be94-b278e0e57052_04_Squad_Mac.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/68/ce/fe/68cefea3-9ea4-7263-cc13-cd48fef0b53c/2364baa0-370d-4abb-bd82-cc03fb0b9168_05_PowerUp_Mac.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/60/18/b4/6018b4c1-bad1-a781-a5af-fa366ce85268/ef56b5db-ea6a-4a57-bc6d-f788936d19f3_06_Season_Mac.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/2b/43/33/2b4333c1-1a13-154a-7a36-0f56721e2239/def5cbab-8c84-4e32-92c2-4dedf810adf9_07_Quest_Mac.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/3c/c4/30/3cc430ec-8df6-d19b-450c-9ff23d6f65f1/e3a3999e-0862-4d85-b49c-b7138dc40a3b_08_Collect_Mac.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/a4/c1/71/a4c17180-65ea-2b85-901f-ac90b3b8673a/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Butter Royale", + "trackViewUrl": "https://apps.apple.com/us/app/butter-royale/id1464649839?mt=12&uo=4", + "contentAdvisoryRating": "9+", + "averageUserRating": 0, + "minimumOsVersion": "10.15.5", + "languageCodesISO2A": [ + "AR", + "NL", + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES", + "TH", + "ZH", + "TR" + ], + "sellerUrl": "https://www.butterco.net", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "9+", + "trackId": 1464649839, + "trackName": "Butter Royale", + "genreIds": [ + "6014", + "7001" + ], + "isVppDeviceBasedLicensingEnabled": true, + "primaryGenreName": "Games", + "releaseDate": "2020-01-24T08:00:00Z", + "currentVersionReleaseDate": "2020-08-27T01:08:03Z", + "releaseNotes": "- A new Powerup, the Jelly Shield has been added to the game! Use it to block incoming damage and watch it burst!\n- New pre-match tutorial panels have been added to explain Chests, Deliveries, Quests and #squadgoals.\n- Quests now have specific in-game terms highlighted! You can refer to the Glossary for explanations.\n- Volume sliders for Music, SFX and Voice Lines in the game have been added.\n- The NOM Gallery has been expanded to include Powerups and a helpful Glossary of game terms.", + "primaryGenreId": 6014, + "sellerName": "Mighty Bear Games Pte. Ltd.", + "description": "Have the food fight of your life in the #1 battle royale game on Arcade! Play solo or in squads against 31 others in fast-paced 5 minute food fights. Fire sauce-shooting, bread-blasting tools and knock out your opponents with food! Use Power-Ups to heal your squad or trap your opponents in a flood of thick, delicious milkshake! \n\n__________________\n\n\"This is the only reason I've been paying for Apple Arcade these past few months\" \n\n\"Never imagined I'd be battling alongside my kids in my squad. Fun and engaging...\"\n\n\"Simple controls and quick matches. Really love the cheeky vibe and fast paced action\" \n\n__________________\n\nCHOOSE YOUR FOOD FIGHTER — Play as any of 80+ characters in this top-down shooter\n\nTEAM UP WITH FRIENDS & FAM — Squad up for multiplayer 4v4 food fights\n\nBE A SOLO SURVIVOR — Win this battle royale game solo for ultimate bragging rights\n\nKNOCK 'EM OUT WITH FOOD — Pick up epic food blasters like the Breadzooka, snag silver and gold blasters from Fridge Deliveries, and fire away\n\nPOWER UPS — All's fair in food fights! Power-Ups heal your squad or slow down opponents for a short period of time\n\nBEWARE OF BUTTER — Watch out for hot Butter and get yourself to safe zones\n\nUNLOCK EXCLUSIVE SWAG — Complete daily and weekly challenges to earn XP and seasonal currency, and unlock exclusive seasonal characters, melees, and more \n\nCHAMPION IN 5 MINS — Become the Champion of the Butterfield on your morning coffee break \n\n__________________\n\nP.S. Parents - Butter Royale is safe for kids aged 9+ to play. \n\nThere are no ads, loot boxes, in-app purchases, chats, or tracking. \n\n__________________\n\nSee you on the Butterfield!", + "artistId": 1321709593, + "artistName": "Mighty Bear Games Pte. Ltd.", + "genres": [ + "Games", + "Action" + ], + "bundleId": "com.mightybeargames.butter.macos", + "version": "5.0.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/brett-terpstra/id448925442?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/ad/a7/87/ada787ae-82d6-065a-dda8-f3a65dd32e9d/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/ad/a7/87/ada787ae-82d6-065a-dda8-f3a65dd32e9d/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple125/v4/a8/9a/a6/a89aa65b-1d6c-fae8-0ea4-3c1a206ec474/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple115/v4/1a/5b/fa/1a5bfab8-8322-f81d-0c71-e57a96653f04/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/df/0d/bc/df0dbc10-2069-9dfc-7578-5c717924b688/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/f2/59/7d/f2597d61-de26-edcb-4f36-a2fb04b1ec97/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/a8/d0/c3/a8d0c3f6-e4f5-f15a-889d-24e4806e7e60/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/ad/a7/87/ada787ae-82d6-065a-dda8-f3a65dd32e9d/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Marked 2 - Markdown Preview", + "trackViewUrl": "https://apps.apple.com/us/app/marked-2-markdown-preview/id890031187?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.10", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "20403236", + "sellerUrl": "http://marked2app.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 890031187, + "trackName": "Marked 2 - Markdown Preview", + "genreIds": [ + "6007", + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$13.99", + "primaryGenreName": "Productivity", + "releaseDate": "2014-07-21T07:00:00Z", + "currentVersionReleaseDate": "2020-08-25T19:15:26Z", + "releaseNotes": "### IMPROVED\n\n- Allow apps using Streaming Preview to declare a source in metadata/HTML comment\n\n### FIXED\n\n- Crash when requesting sandbox permission (affecting Bear and MarsEdit previews)", + "primaryGenreId": 6007, + "sellerName": "Brett Terpstra", + "description": "Marked 2 is a previewer (*not an editor*) for Markdown, MultiMarkdown and other text markup languages. It updates live every time you save your document in your favorite text editor, comes with writing analysis tools, and is powerfully flexible.\n\nSee what's new: http://marked2app.com/help/Whats_New.html\n\nMarked provides document navigation and statistics, proofreading tools, multiple export formats, and much more. Marked comes with 9 preview styles built in (including GitHub), and you can add unlimited custom styles of your own.\n\nMultiMarkdown processing is provided for writers, complete with tables, footnotes, file transcludes, and other MultiMarkdown-specific features.\n\nGitHub users will appreciate Marked's built in GitHub Flavored Markdown processor, capable of handling fenced code blocks, line break preservation and automatic hyperlinking.\n\nMarked is powerful enough to allow custom processors (shell scripts) before and/or instead of the built in processors, allowing custom Markdown processing and use of non-Markdown text processors.\n\nMarked works with Scrivener, Ulysses, MarsEdit, Highland 2, iThoughtsX, MindNode, and other third-party apps, allowing you to use Markdown and see beautiful previews just about anywhere.\n\nSee the video tutorials! http://bit.ly/1riW0IK", + "artistId": 448925442, + "artistName": "Brett Terpstra", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 13.99, + "bundleId": "com.brettterpstra.marked2", + "version": "2.6.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/ser-int/id525443615?uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/b4/46/59/b4465990-317e-b6bc-ec21-8580075ac0d7/source/60x60bb.jpg", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/b4/46/59/b4465990-317e-b6bc-ec21-8580075ac0d7/source/100x100bb.jpg", + "isGameCenterEnabled": false, + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/9c/23/e0/9c23e042-a454-8b87-ee6c-a4b3b497bbc8/314905e5-2d99-4b3e-8428-0bd3c9b48bc5_iphone1.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/07/a5/21/07a521fe-59bb-47d8-57f8-0e9ee7c4f743/bdefceed-10fb-45cc-92f3-2438cc483f77_iphone2.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/0a/55/1c/0a551cf2-2905-ba9d-3749-606d880d9487/249dd591-d1af-4b16-b7fc-26f0a510bf7d_iphone3.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/dd/d0/f0/ddd0f0ef-c91c-530e-0a14-35ee9c90fd57/d2aa3806-83f7-4e6f-963e-7cfcd571f07f_iphone4.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/77/35/b2/7735b2f5-d8a4-7816-29d1-872f05061dce/bb0a1768-6a1b-482d-b0f7-805abc73ab3d_ipad1.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/b8/50/6d/b8506d82-e5df-7299-b043-25d2137119ef/64b5b730-76d9-4153-a91f-24dad103f621_ipad2.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/85/80/4a/85804a23-e0b8-00fc-cd66-88d7799f0dae/ac9174f6-e2b1-4fe1-a821-1f44d435000b_ipad3.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/bc/22/2e/bc222e57-77db-c984-2bb4-b62d5759132c/1ad8fe1d-03ba-4448-b1e7-e22b18b09684_ipad4.png/552x414bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/b4/46/59/b4465990-317e-b6bc-ec21-8580075ac0d7/source/512x512bb.jpg", + "advisories": [], + "supportedDevices": [ + "iPhone11ProMax-iPhone11ProMax", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadSeventhGen-iPadSeventhGen", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadMini4-iPadMini4", + "iPad834-iPad834", + "iPhoneSE-iPhoneSE", + "iPad73-iPad73", + "iPadAir2-iPadAir2", + "iPadMini5Cellular-iPadMini5Cellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad612-iPad612", + "iPadPro97-iPadPro97", + "iPhone6s-iPhone6s", + "iPad856-iPad856", + "iPadAirCellular-iPadAirCellular", + "iPhone8-iPhone8", + "iPhoneXR-iPhoneXR", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMiniRetina-iPadMiniRetina", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone7Plus-iPhone7Plus", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhone8Plus-iPhone8Plus", + "iPhoneX-iPhoneX", + "iPadMini5-iPadMini5", + "iPhone6Plus-iPhone6Plus", + "iPadProCellular-iPadProCellular", + "iPad71-iPad71", + "iPhone7-iPhone7", + "iPhone6-iPhone6", + "iPadProFourthGen-iPadProFourthGen", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadAir3-iPadAir3", + "iPad72-iPad72", + "iPhoneXS-iPhoneXS", + "iPadProSecondGen-iPadProSecondGen", + "iPad878-iPad878", + "iPhone11-iPhone11", + "iPadAir-iPadAir", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadPro-iPadPro", + "iPadMini3-iPadMini3", + "iPad611-iPad611", + "iPhone6sPlus-iPhone6sPlus", + "iPhone11Pro-iPhone11Pro", + "MacDesktop-MacDesktop", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone5s-iPhone5s", + "iPhoneXSMax-iPhoneXSMax", + "iPad75-iPad75", + "iPad74-iPad74", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPad812-iPad812", + "iPad76-iPad76" + ], + "features": [ + "iosUniversal" + ], + "kind": "software", + "currency": "USD", + "trackCensoredName": "Penman Speech to text note app", + "trackViewUrl": "https://apps.apple.com/us/app/penman-speech-to-text-note-app/id1434184098?uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 3.5892900000000000915179043659009039402008056640625, + "minimumOsVersion": "13.0", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "41207808", + "sellerUrl": "https://penman.app", + "averageUserRatingForCurrentVersion": 3.5892900000000000915179043659009039402008056640625, + "userRatingCountForCurrentVersion": 56, + "trackContentRating": "4+", + "trackId": 1434184098, + "trackName": "Penman Speech to text note app", + "genreIds": [ + "6007", + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2018-12-06T06:06:04Z", + "currentVersionReleaseDate": "2020-08-12T20:34:03Z", + "releaseNotes": "## Our BIGGEST update to Penman is available now!\nWe have recreated Penman from ground up; bringing a new experience while maintaining Penman's core values.\nlet’s dive into the new features: \n\n# Continuity\nNow, you can have Penman on all of your devices: iPhone, iPad and Mac, taking you to a whole new level of efficiency. \n\n# Universe Purchase \nPurchase premium once and enjoy it on all your devices no matter iPhone iPad or even Mac\n\n# Fresh Design\nWith this version, we’ve modernized and revamped almost every part of Penman. Giving users a whole new experience while maintaining our commitment to a simplicity and efficiency.\n\n# New Sync system \nWe’ve developed a whole new save and sync system for premium users to make sure you never loose your notes. \n\n# Trash\nYour notes will now be added to the trash after you delete them. You can recover deleted notes from the trash. \n\n# New Editor\nWe have completely revamped our editor system.\n\n# New Notebooks\nMake sure to checkout our new Notebooks; more beautiful than ever and still the best place to save your notes.\n\nBe sure to download the update and enjoy Penman!", + "primaryGenreId": 6007, + "sellerName": "sobhan eskandari", + "description": "-- Tell your story --\nWith the power of Googles speech to text software, you can seamlessly convert your words to notes and write in over 120 different languages!\nJust start it and tell your story.\n\n-- Write your story --\nWe have implemented a powerful text editor that pens your thoughts into text easily and in a way that is visually stunning. Additionally our software support bidirectional writing as well as a number of features that you can take advantage of during the process of turning your speech into convertible text.\n\n-- Stay Organized --\nYou can categorize, group and coordinate your notebooks, in order to distinguish between them and seamlessly move through your ideas, lists and stories in a way that fits your lifestyle.\n\n-- Stay Synced --\nWith the power of iCloud, all of your notes are saved and synced with your iCloud account where you can access them across all of your devices.\n\n-- Stay Secure --\nAs you write your story we use iCloud to save your notes so they are always safe and never lost.\n\n-- Stay Global --\nUsing penman you can convert your working file into the following formats:\n• PDF\n• TXT\n• Image\n• Html\n\n-- Penman Premium --\nUnlock your full potential by upgrading to premium :\n\n• Turn your speech to text quickly and easily\n• Export to various formats like pdf,html,jpg\n• Sync and backup all your notes in iCloud\n• Customize your notes with great fonts\n\n$2.99 monthly, $17.99 annually (an 20% savings!)\n\n---- ---\n\nSubscriptions will be charged to your credit card through your iTunes account. Your subscription will automatically renew unless canceled at least 24 hours before the end of the current period. You will not be able to cancel the subscription once activated. After purchase, manage your subscriptions in App Store Account Settings. Any unused portion of a free trial period, will be forfeited when the user purchases a subscription.\n\n$2.99 monthly, includes a 3 day free trial\n$17.99 annually, includes a 3 day free trial\n.\n- Terms of use: https://penman.app/terms-of-service.html\n- Privacy policy: https://penman.app/privacy.html", + "artistId": 525443615, + "artistName": "SER_INT", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.aurora.Penman", + "version": "3.0", + "wrapperType": "software", + "userRatingCount": 56 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/onus-inc/id966765471?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/e2/d9/e5/e2d9e5ec-159d-a867-beda-db3009700bae/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/e2/d9/e5/e2d9e5ec-159d-a867-beda-db3009700bae/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple71/v4/36/ce/0b/36ce0b74-3e13-691d-23b5-96f3ca319b34/mzl.etmgcoxa.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple71/v4/0c/99/20/0c992088-7d75-907a-f8bd-97d17ee9834f/mzl.ikuphqdy.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple71/v4/64/d7/7c/64d77cfd-8a70-b571-6946-22e1e2ebcdc6/mzl.mfbmplnu.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple71/v4/83/79/78/83797871-f1cf-1cd8-5f9a-a94a3d50c269/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/e2/d9/e5/e2d9e5ec-159d-a867-beda-db3009700bae/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "WeDo: Simple Life Manager", + "trackViewUrl": "https://apps.apple.com/us/app/wedo-simple-life-manager/id1115322594?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.9.0", + "languageCodesISO2A": [ + "AM", + "AR", + "BN", + "BG", + "CA", + "HR", + "CS", + "DA", + "NL", + "EN", + "ET", + "FI", + "FR", + "DE", + "EL", + "GU", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KN", + "KO", + "LV", + "LT", + "MS", + "ML", + "MR", + "NB", + "FA", + "PL", + "PT", + "RO", + "RU", + "SR", + "ZH", + "SK", + "SL", + "ES", + "SW", + "SV", + "TA", + "TE", + "TH", + "ZH", + "TR", + "UK", + "VI" + ], + "fileSizeBytes": "62179954", + "sellerUrl": "http://wedo.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1115322594, + "trackName": "WeDo: Simple Life Manager", + "genreIds": [ + "6007", + "6017" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2016-10-11T13:54:41Z", + "currentVersionReleaseDate": "2018-11-01T01:20:27Z", + "releaseNotes": "\"Amateurs sit and wait for inspiration, the rest of us just get up and go to work.\" - Stephen King\n\n- Fixed invite issue some users were having\n- Resolved some duplicate lists showing up\n- If you remove a list, it should now consistently be removed\n\nNew On 3.5 Mobile:\n\n[+] Support for iOS 12 and iPhone XS/Max\n[+] New theme: Astroid\n+ Add something... now has all icons on the left hand side (3.5)\n+ Reduced video playback wait times\n+ Review pop up triggers a bit earlier\n+ Some minor UI tweaks\n+ More Siri commands\n- List order on \"add something...\" consistently showing the right order\n- A list disappearing bug a few users reports (they should all now be back)\n- Inbox selection bug (3.4.1)\n- Inbox ordering fix crash (3.5)\nLike what we're doing? Drop us a review! It's free and genuinely helps us grow. With a higher rating, that mean more users, and more users, means more subscribers, and more subscribers means we get to keep doing this for you! :) If you have any questions or issues, please email us at hello@wedo.com!", + "primaryGenreId": 6007, + "sellerName": "Onus Technologies Inc.", + "description": "MOST LOVED LIFE MANAGER\nSee why people who get things done are using WeDo as their second brain for remembering everything in their life. Join the WeDo movement of being less stressed and anxious again with the first real life management app!\n\nHABITS\nWeDo is the first to help you create and maintain positive habits, alongside everything else you need to remember, whether that be for short or long term goals. Create daily, weekly, and monthly habits, set reminders and view them intuitively on your schedule. \n\nCALENDAR & SCHEDULES\nUnique and simple built-in planner that lets you easily manage classes, homework, office hours, work and your social life, all in one place. Easily create events, set reminders, plan and view your schedule right in WeDo. \n\nFUN & FREE\nWith the simple and fun interface it’s never been easier to add tasks, events, and habits into your daily life. We keep the the essentials free, don’t pay for reminders, notes, attachments, events, and more! WeDo syncs between all of your devices with ease.\n\nTO DO LISTS\nWhether it’s homework, a party, or Keeping track of what you need to get done has never been easier. Add subtasks, due dates, repeat, reminder, notes, and attachments free and synced between all of your devices. \n\nSHOPPING LIST\nCreate multiple shopping list for groceries, Amazon, or just a general shopping list, and share them with your roommate or partner! You can also keep track of what’s in your pantry with a pantry list. Leave your post it notes behind! You can set expiration dates for food keep track of it all inside of WeDo.\n\nCLASSES & HOMEWORK\nView, create, and keep track of your class schedule, and homework. Use the calendar in this intuitive student planner to see when and where you need to be - right alongside your homework, school and work responsibilities.\n\nBILLS LIST\nSetup when your bills are due, whether it be rent, credit cards, Spotify, Netflix, or your tuba lessons. Get reminders and set when they repeat. Whether it’s every week, month, or year!\n\nSHARE\nSometimes it’s not about getting things done by yourself but with other people. We make it easy to share, assign and work together seamlessly synced between anyone. Whether it’s recurring bills, groceries, shopping, homework, or chores, keep track of it for free!\n\nPeople use WeDo as their school planner, calendar, reminders, task list, checklist, a notepad, a board for post its or sticky notes, a project management tool for small groups and organizations like frats and sororities, day scheduler, habit tracker, goal tracker, bucket list and with their bullet journal. WeDo has the best FREE life management system features you’ll ever use that grows with you from high school, to college, to work, to a family organizer.", + "artistId": 966765471, + "artistName": "Onus, Inc.", + "genres": [ + "Productivity", + "Education" + ], + "price": 0.00, + "bundleId": "com.wedo.desktop", + "version": "2.0.8", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/ibear-llc/id347886453?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/bd/f5/bc/bdf5bcc4-215b-d47f-40d3-2e16bfa76c9e/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/bd/f5/bc/bdf5bcc4-215b-d47f-40d3-2e16bfa76c9e/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/cf/7d/34/cf7d3403-a568-caa8-5e10-24c815f922dc/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/e7/bf/d1/e7bfd16b-1866-ebba-7492-0aea758cba8d/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/c7/eb/50/c7eb50aa-31c6-54b7-c697-c9117f31848f/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/4b/5b/0f/4b5b0ff6-a9ca-2401-2734-59011642e3ae/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/59/9a/f7/599af7b9-3cf8-28cc-c46f-7ab7f2b78937/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/62/86/8e/62868efb-08ea-5ddb-1859-de8c5c29fbc1/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/c3/2e/75/c32e754c-ca1d-dd94-0226-84d026436733/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/83/26/c9/8326c981-bd8c-8770-2523-5b6247720e57/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/65/86/27/658627b7-1efb-79de-4823-e18025e6593d/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/bd/f5/bc/bdf5bcc4-215b-d47f-40d3-2e16bfa76c9e/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Money Pro: Personal Finance", + "trackViewUrl": "https://apps.apple.com/us/app/money-pro-personal-finance/id972572731?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.12", + "languageCodesISO2A": [ + "AR", + "DA", + "NL", + "EN", + "FR", + "DE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KO", + "MS", + "PL", + "PT", + "RU", + "ZH", + "SK", + "ES", + "TH", + "ZH", + "TR", + "UK", + "VI" + ], + "fileSizeBytes": "36059600", + "sellerUrl": "https://money.pro/mac/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 972572731, + "trackName": "Money Pro: Personal Finance", + "genreIds": [ + "6015", + "6000" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$0.99", + "primaryGenreName": "Finance", + "releaseDate": "2015-05-03T07:08:11Z", + "currentVersionReleaseDate": "2020-08-19T19:03:15Z", + "releaseNotes": "Bug fixes and performance improvements", + "primaryGenreId": 6015, + "sellerName": "iBear LLC", + "description": "Manage money like a pro. Сhange your spending behavior for good.\nMoney Pro®  is the one place for bill planning, budgeting and keeping track of your accounts. Money Pro works great for home budgeting and even for business use. \n\nEasy sync with iPhone/iPad version. Money Pro is the next generation of Money app (over 2 million downloads worldwide).\n\nCalendar\n- Mark days on the big calendar when your bills are due.\n- Schedule recurring bills with custom periodicity.\n\nToday view\n- Take a quick glance at bills due.\n- When you actually have a transaction, approve it quickly.\n\nBills due notifications\n- A whole system of reminders will alert you of upcoming bills.\n- Quick rescheduling option will help you deal with bills due.\n\nBudgets\n- Create budgeted entries both for your income and expenses.\n- Set different budget limits for every period if needed.\n- Start adding every transaction you have, and see progress of each category and the overall progress.\n- Monitor visual indicators for budget overspending.\n\nBudget rollover\n- Set budgets to transfer the leftover of the current period to the next budget period.\n- Budget rollover limits your spending automatically if you overspent in previous periods.\n\nCheckbook register\n- Unlimited number of accounts in one place (checking, credit card, etc).\n- Setting transactions as recurring or as one-time only.\n- Balance change history.\n- Additional fields for organizing your records: payee, description, check #, class (personal/business travel expenses). \n- Attachment of receipt photos.\n\nAccount reconciliation\n- Record transactions and clear them later on (reconcile).\n- Automatically calculated available balance and cleared balance.\n\nOnline Banking (GOLD subscription)\n- Connect banks and download your data.\n\nImport of bank statements \n- Import history of your transactions (files: .ofx, .csv).\n- Money Pro predicts categories for the transactions being imported.\n\nSplit transactions\n- Split a transaction into multiple categories when you pay for multiple items at once.\n\nSearch\n- Search transactions by amount, category, description, payee, etc.\n\nDetailed reports\n- Income/Expenses\n- Cash flow\n- Transactions\n- Assets/Liabilities (net worth)\n- Projected balance \n- Trend chart for days/weeks/months/years\n\nLots of personal settings\n- Custom periodicity is available for budgeting and bill planning (weekly, monthly, etc).\n- Adjust the structure of income/expense categories & subcategories for your needs.\n- Customize accounts & categories with over 1,500 built-in icons. \n- Create your own unique icons using photos.\n\nMoney Pro Sync (PLUS or GOLD subscription)\n- Track expenses with family members/partners and on devices with different platforms.\n \nMultiple profiles\n- Set multiple profiles and track your finances separately for home budget and your small business.\n\nMore\n- Calculator and currency converter\n- Print and Export to pdf, qif, csv formats\n- Password protection\n- Backups of your data\n- Multiple currencies support & automatic update of exchange rates\n- iCloud sync for iPhone, iPad, Mac (no subscription)\n\nPLUS subscription\n- 1 Month of PLUS: $2.99\n- 6 Months of PLUS: $8.99\n- 12 Months of PLUS: $11.99\n\nGOLD subscription\n- 1 Month of GOLD: $6.99\n- 6 Months of GOLD: $29.99\n- 12 Months of GOLD: $49.99\nIn all the countries (except the USA) actual charges will be converted to the local currency. Payment will be charged to iTunes Account at confirmation of purchase. Account will be charged for renewal within 24-hours prior to the end of the current period, and identify the cost of the renewal. Any unused portion of a free trial period, if offered, will be forfeited when the user purchases a subscription to that publication, where applicable.\n\nTerms & Privacy\n- http://ibearsoft.com/privacy.html\n- http://ibearsoft.com/terms.html\n\nUser Guide\n- https://money.pro/guide/\n\nMoney Pro will help you stay on top of ALL your money, providing a clear picture of where you are, where to go and how to save more. Start today!", + "artistId": 347886453, + "artistName": "iBear LLC", + "genres": [ + "Finance", + "Business" + ], + "price": 0.99, + "bundleId": "com.ibearsoft.moneypromac", + "version": "2.5.12", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/qubyte-games-desenvolvimento-de-jogos-ltda/id380375548?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/48/be/14/48be14fe-e3cf-6e40-1c04-94b5160a4b08/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/48/be/14/48be14fe-e3cf-6e40-1c04-94b5160a4b08/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple/21/5f/01/mzl.sitprpfv.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple/e8/6a/b1/mzl.iodopxci.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple/33/33/ab/mzl.bfjegozl.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple/02/bc/a4/mzl.oqgoeqaz.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple/9d/f5/bf/mzl.vobixiue.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/48/be/14/48be14fe-e3cf-6e40-1c04-94b5160a4b08/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Plush Wars Lite", + "trackViewUrl": "https://apps.apple.com/us/app/plush-wars-lite/id439683741?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.6.6", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "92191350", + "sellerUrl": "http://www.qubyteinteractive.com/games/plushwars/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 439683741, + "trackName": "Plush Wars Lite", + "genreIds": [ + "6014", + "6016", + "7003", + "7017" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Games", + "releaseDate": "2011-05-27T02:17:07Z", + "currentVersionReleaseDate": "2011-05-27T02:17:07Z", + "primaryGenreId": 6014, + "sellerName": "QUByte Games Desenvolvimento de Jogos LTDA", + "description": "After being rejected, the PlushBalls decided to take revenge: they locked up the princess in her castle and killed all PlushBears.\n\nBut they were brought back as ZomBears to save the princess and destroy the PlushBalls. Will you let them succeed?\n\nHelp defend the castle, shooting down the gruesome yet fluffy ZomBears. Define your defense strategy using specially designed traps and ammo.\n\nWith the Full Version you will get:\n- 3 challenging worlds, full of nasty ZomBears\n- different kinds of cannons to wipe them out of the map\n- installing traps to keep them from coming\n- choosing your ammo\n- destroying the vicious ZomBosses\n- completing all the tricky achievements\n- and much more!\n\nhttp://www.qubyteinteractive.com/games/plushwars/\nhttp://www.twitter.com/qubytegames\nhttp://www.facebook.com/pages/QUByte-Interactive/129428830449232", + "artistId": 380375548, + "artistName": "QUByte Games Desenvolvimento de Jogos LTDA", + "genres": [ + "Games", + "Entertainment", + "Casual", + "Strategy" + ], + "price": 0.00, + "bundleId": "com.qubyte.plushlitemac", + "version": "1.0.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/shihab-mehboob/id1012903170?uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/bc/8f/d7/bc8fd793-aad2-b60b-d174-44cba7754342/source/60x60bb.jpg", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/bc/8f/d7/bc8fd793-aad2-b60b-d174-44cba7754342/source/100x100bb.jpg", + "isGameCenterEnabled": false, + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/4a/8b/b1/4a8bb1a9-54fc-7214-4b40-7bb92fc9f2bc/pr_source.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/ec/5b/41/ec5b4185-2f49-1bb3-1441-637595930db9/pr_source.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/18/3b/26/183b2664-2c17-1bac-1e8b-5759df726eeb/pr_source.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/21/ab/f2/21abf2ea-672e-517a-9941-bd8057196b77/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/7f/a0/03/7fa00345-db22-bf9b-31b2-4d22490ca1f6/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/4a/6d/ab/4a6dab7d-1162-0235-6012-207038d00244/pr_source.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/63/35/7b/63357bc9-3e1c-7758-83d2-f36bb05ac12c/pr_source.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/11/c4/a4/11c4a431-474c-1c52-93df-2a2b948bc4e7/pr_source.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/79/9c/bd/799cbdc4-b67f-7d7f-e54f-0b2b24ac185a/pr_source.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/87/c4/f6/87c4f65a-62c1-ea9d-036a-e77cf4921423/pr_source.png/552x414bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/bc/8f/d7/bc8fd793-aad2-b60b-d174-44cba7754342/source/512x512bb.jpg", + "advisories": [], + "supportedDevices": [ + "iPhone11ProMax-iPhone11ProMax", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadSeventhGen-iPadSeventhGen", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadMini4-iPadMini4", + "iPad834-iPad834", + "iPhoneSE-iPhoneSE", + "iPad73-iPad73", + "iPadAir2-iPadAir2", + "iPadMini5Cellular-iPadMini5Cellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad612-iPad612", + "iPadPro97-iPadPro97", + "iPhone6s-iPhone6s", + "iPad856-iPad856", + "iPadAirCellular-iPadAirCellular", + "iPhone8-iPhone8", + "iPhoneXR-iPhoneXR", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMiniRetina-iPadMiniRetina", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone7Plus-iPhone7Plus", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhone8Plus-iPhone8Plus", + "iPhoneX-iPhoneX", + "iPadMini5-iPadMini5", + "iPhone6Plus-iPhone6Plus", + "iPadProCellular-iPadProCellular", + "Watch4-Watch4", + "iPad71-iPad71", + "iPhone7-iPhone7", + "iPhone6-iPhone6", + "iPadProFourthGen-iPadProFourthGen", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadAir3-iPadAir3", + "iPad72-iPad72", + "iPhoneXS-iPhoneXS", + "iPadProSecondGen-iPadProSecondGen", + "iPad878-iPad878", + "iPhone11-iPhone11", + "iPadAir-iPadAir", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadPro-iPadPro", + "iPadMini3-iPadMini3", + "iPad611-iPad611", + "iPhone6sPlus-iPhone6sPlus", + "iPhone11Pro-iPhone11Pro", + "MacDesktop-MacDesktop", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone5s-iPhone5s", + "iPhoneXSMax-iPhoneXSMax", + "iPad75-iPad75", + "iPad74-iPad74", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPad812-iPad812", + "iPad76-iPad76" + ], + "features": [ + "iosUniversal" + ], + "kind": "software", + "currency": "USD", + "trackCensoredName": "Allegory", + "trackViewUrl": "https://apps.apple.com/us/app/allegory/id1470828583?uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 4.07017000000000006565414878423325717449188232421875, + "minimumOsVersion": "13.0", + "languageCodesISO2A": [ + "AR", + "NL", + "EN", + "FR", + "DE", + "HE", + "IT", + "PL", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "21512192", + "sellerUrl": "https://www.allegoryapp.info/press", + "averageUserRatingForCurrentVersion": 4.07017000000000006565414878423325717449188232421875, + "userRatingCountForCurrentVersion": 57, + "trackContentRating": "4+", + "trackId": 1470828583, + "trackName": "Allegory", + "genreIds": [ + "6007", + "6012" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2019-09-19T07:00:00Z", + "currentVersionReleaseDate": "2020-05-29T17:39:24Z", + "releaseNotes": "- Added a new default app icon\n- Added cursor support for iPad\n- Pulling down when viewing a full-screen list will now dismiss the list\n- Improved iCloud sync\n- Improved accessibility and contrast across the app\n- Improved keyboard shortcut commands\n- Added more alternative app icons\n- Fixed various issues where the app may crash\n- Minor UI changes\n- Various bug fixes and improvements\n\nIf you have any questions or feedback, please get in touch. Allegory was created by an incredibly small team of one and I'd love to hear your thoughts. I'm available through email: shihab@allegoryapp.info or Twitter: @AllegoryApp or @JPEGuin.", + "primaryGenreId": 6007, + "sellerName": "Shihab Mehboob", + "description": "Allegory is a powerful notes app with a beautiful iOS-centric UI. The minimal and focused writing experience, combined with an impressive set of powerful features, makes this the ideal choice for everyone. Allegory removes the complexity of most markdown editors, presenting a minimal UI that’s welcoming for casual writers and note-takers as well as more attuned authors, making it a great app for you to pick up regardless of your background and skill level.\n\n—\n\nWHY YOU'LL LOVE ALLEGORY:\n\nAllegory immediately launches to the clean and simple note editor screen, boosting your productivity and reducing friction between wanting to write down what you’ve just thought of, and actually getting it written down. Support for valid markdown as well as custom markdown makes it easier to create your best work.\n\nAllegory also includes a brilliant hand-crafted drawing area which lets you select from a variety of colors, long-holding on any of the tools brings them into focus with sliders to adjust their opacity and stroke size with gorgeous animations that strike awe.\n\nYou can bookmark and set due dates on any note from anywhere in the app regardless of where you are, which makes performing essential actions entirely seamless, further reducing friction for users. Seamless iCloud sync adds upon the notion of keeping your notes exactly where they need to be. Notes can be searched for within the app in ways that make sense to you, by words and dates, or by using language that comes naturally such as ‘today’, ‘yesterday’, and ‘last week’. A summary of your current note also provides further context on your writing by displaying character/word/line/paragraph counts, sentiment analysis to portray how positive or negative your writing is, quick links to open the specific note, and more.\n\nInspiration can strike anywhere, and that is why Allegory supports custom action extensions that allow creating notes and putting down ideas from other apps. You can also use Siri to do the same. Scan documents and text to convert it to notes, or add images within notes to provide more context. When you want to share your work with the world, use one of the many export options to create files that work best for you, from TXT and MD, to HTML and PDF. Or simply export as an image or plain text. It's built in ways that make sense to your workflow.\n\nTweak and adjust the app to make it look and behave the way that you want. From app icons and tints, to markdown settings and haptics, there's a settings option to make the app your own. URL schemes and Siri shortcuts allow you to perform useful actions in Allegory from anywhere. Allegory is available on your iPhone, your iPad, and your Apple Watch, and supports seamless iCloud sync to share notes without lifting a finger.\n\nAll the power of iOS is in your hands with Allegory. It is fully integrated with the latest technologies such as Dark Mode, a standalone Apple Watch app, Siri, Today Widget, Quick Actions, Action Extension, Context Menus, iCloud sync, Notifications, document scanning, biometric locks, custom haptics, Pencil support, keyboard shortcuts, URL schemes, custom app icons, iMessage stickers, fully accessible, and more.\n\n—\n\nGET IN TOUCH:\n\nIf you have any questions or feedback, please get in touch. Allegory was created by an incredibly small team of one and I'd love to hear your thoughts. I'm available through email shihab@allegoryapp.info or Twitter @AllegoryApp or @JPEGuin.\n\nhttps://www.allegoryapp.info/terms\nhttps://www.allegoryapp.info/privacy", + "artistId": 1012903170, + "artistName": "Shihab Mehboob", + "genres": [ + "Productivity", + "Lifestyle" + ], + "price": 0.00, + "bundleId": "com.shi.Allegory", + "version": "1.2.8", + "wrapperType": "software", + "userRatingCount": 57 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/tanmay-sonawane/id507744776?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/e9/77/92/e977925b-9746-bb41-493c-123cf3bb2f6b/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/e9/77/92/e977925b-9746-bb41-493c-123cf3bb2f6b/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/8b/45/f0/8b45f08b-8fcc-983d-6f1d-ac36197ceae2/mzl.hhhwtcak.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/13/38/62/133862ef-a9f5-3b44-3448-d0509984907e/mzl.ndtkwxwz.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/ff/40/0a/ff400a39-4305-846e-999c-35fd270e4e99/mzl.ztzpsacs.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/8b/88/4e/8b884ea5-0dcb-4e70-43b1-dcb5f6e3c4ef/mzl.jomfrxqf.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/e9/77/92/e977925b-9746-bb41-493c-123cf3bb2f6b/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Write - Best Note Taking App", + "trackViewUrl": "https://apps.apple.com/us/app/write-best-note-taking-app/id848311469?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.12", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "EL", + "IT", + "JA", + "PL", + "ZH", + "ES", + "ZH" + ], + "fileSizeBytes": "13142640", + "sellerUrl": "http://writeapp.net/mac/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 848311469, + "trackName": "Write - Best Note Taking App", + "genreIds": [ + "6007", + "6026" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$9.99", + "primaryGenreName": "Productivity", + "releaseDate": "2014-05-28T16:03:18Z", + "currentVersionReleaseDate": "2017-10-03T02:21:25Z", + "releaseNotes": "- Fixed issue causing blank screen at startup on High Sierra.\n- Fixed issue which caused close, minimize button to gray out after saving a new file in a new window.\n- Added option to show main window in dock icons context menu and under app menu's Window context.\n- Write now requires minimum macOS v10.12. \n\nPlease consider leaving a good review if you find the app helpful.", + "primaryGenreId": 6007, + "sellerName": "Tanmay Sonawane", + "description": "Write is a modern note taking app with a stunning interface. \n\nNOTE: iCloud sync between iOS and Mac version of Write is currently broken. I have no definite date on a fix for this. Dropbox sync should be working just fine.\n\nYou might be a writer, student, blogger or just a simple person who likes to keep things in order and make life productive, you'll love Write!\n\nNo matter where you store your notes, Write will organise and present them beautifully. \n\n----------------\nFeatures\n----------------\n\n- Full Multimarkdown 4 Support\n- Syntax Highlighting and a unique Rich Text Markdown mode\n- Distraction free writing interface\n- Beautiful handpicked fonts and support to use your own fonts\n- Type Writer Scrolling\n- Customisable Theme and Export CSS\n- Butter smooth scrolling no matter how big your document\n- Word, Sentence, Paragraph count and Estimated Reading Time stats\n- Drag Drop Image/URL Support via panels\n- Select to Copy HTML offers super quick way to get HTML code for a particular piece of markdown text\n- Dark Theme\n- Menu bar app\n\n----------------\nTags & Syncing\n----------------\n\n- Organise your notes with tags\n- Any tag you add via Write will be available in Finder (Mavericks only)\n- Any tag you add via Write for iOS will be available in Finder \n- Full Dropbox* synchronisation for notes \n- Ability to use Google Drive, Box.net, SkyDrive, etc to read, edit & save your notes*. \n\n*requires respective Mac client app.\n\n----------------\nSharing\n----------------\n\n- Export as PDF, RTF and HTML\n- Share over iMessage or AirDrop\n- Post on Twitter or Facebook\n- Customisable Export CSS\n\n----------------\nSupport\n----------------\n\nIf you're facing any issues please contact us directly at support@writeapp.net instead of leaving your remarks in reviews, we guarantee a response within 24hrs.\n\nIf you like the app please take a moment to leave a nice review, it helps us a lot.", + "artistId": 507744776, + "artistName": "Tanmay Sonawane", + "genres": [ + "Productivity", + "Developer Tools" + ], + "price": 9.99, + "bundleId": "me.tanmay.WriteMac", + "version": "1.1.8", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/gummy-bear-studios/id371279011?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/bc/ea/46/bcea4615-7079-f869-0403-af39e80ac041/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/bc/ea/46/bcea4615-7079-f869-0403-af39e80ac041/source/100x100bb.png", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple1/v4/b7/06/14/b7061464-f06a-3955-5e02-acc46f70f8a4/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple5/v4/8e/3d/f1/8e3df1cc-b113-728f-4ae7-9788ec46faa1/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple3/v4/fc/2c/db/fc2cdb96-441a-fe63-0a1f-fb453aab68cf/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/bc/ea/46/bcea4615-7079-f869-0403-af39e80ac041/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Tumblelog Picture Archiver", + "trackViewUrl": "https://apps.apple.com/us/app/tumblelog-picture-archiver/id702387412?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.7", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "395898", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 702387412, + "trackName": "Tumblelog Picture Archiver", + "genreIds": [ + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$2.99", + "primaryGenreName": "Utilities", + "releaseDate": "2013-09-23T18:34:40Z", + "currentVersionReleaseDate": "2019-01-29T01:24:25Z", + "releaseNotes": "• name change\n• fixed minor issues", + "primaryGenreId": 6002, + "sellerName": "Marco Petrucci", + "description": "Tumblelog Picture Archiver lets you batch download all the pictures from a Tumblr account in a simple and easy way.\n\n*** NEW IN VERSION 2.3 ***\n• name change\n• fixed minor issues\n\n*** NEW IN VERSION 2.2 ***\n• fixed an issue where a client could not sometimes login again or using a second account\n• fixed few minor issues\n\n*** NEW IN VERSION 2.1 ***\n• fixed some issues and incompatibilities with new macOS versions\n• fixed few issues with alerts\n• fixed an issue introduced with some changes in older Tumblr API\n\n*** NEW IN VERSION 2.0 ***\n• login with Tumblr\n• download pictures from your account (LIKES and POSTS)\n• download pictures from a public account (LIKES and POSTS)\n• search for a blog by name or address\n\n\nMain features:\n\n• download pictures from a Tumblr account (likes / posts)\n• skip already downloaded pictures / overwrite pictures\n• skip GIF / PNG / JPG pictures\n• start downloading from a specified index\n\nInstead of saving pictures manually from a web browser, which can be slow and time consuming, simply specify a Tumblr account you want to download pictures from and press Download! It's as easy as pressing one button!\n\nNOTE: if an account doesn't share likes, you will not be able to download them.\n\nIMPORTANT NOTES: this app uses Tumblr API, it doesn't scrape pages for pictures, so it's compliant with the Tumblr terms of use. However, any change made by Tumblr to their services and to their terms of use can break this app without notice. Should this happen, this app could start behaving not as intended or not work at all.\n\nThis app is not affiliated or endorsed by Tumblr, which is Copyright of Tumblr, Inc.", + "artistId": 371279011, + "artistName": "Gummy Bear Studios", + "genres": [ + "Utilities" + ], + "price": 2.99, + "bundleId": "com.gummybearstudios.tumblelogpicturedownloader", + "version": "2.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/cookapps-play/id1332616667?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/f4/b3/0f/f4b30fa5-cf41-25c7-6292-9ebe7b5beb2b/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/f4/b3/0f/f4b30fa5-cf41-25c7-6292-9ebe7b5beb2b/source/100x100bb.png", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/cf/6f/76/cf6f76c5-d4b6-a5ce-1da7-0ac4f6bd536a/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/22/c3/e7/22c3e707-1f75-28c5-583f-cccb37461d1b/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/6d/14/4d/6d144da9-39f4-31ad-c8bf-aff9ab778eb6/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/0b/a9/af/0ba9afc9-a2ce-a39d-cc3e-936818d21093/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/f4/b3/0f/f4b30fa5-cf41-25c7-6292-9ebe7b5beb2b/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Bubble Buggle Pop", + "trackViewUrl": "https://apps.apple.com/us/app/bubble-buggle-pop/id1435563346?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.9.0", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "45673048", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1435563346, + "trackName": "Bubble Buggle Pop", + "genreIds": [ + "6014", + "7012", + "7004" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Games", + "releaseDate": "2018-09-17T19:30:20Z", + "currentVersionReleaseDate": "2019-03-21T18:46:28Z", + "releaseNotes": "Full Screen Support\nModify Stage Balance\nMinor Bug Fix", + "primaryGenreId": 6014, + "sellerName": "CookApps Play Inc.", + "description": "Finding a fun bubble shooter with unlimited playtime and worry-free of internet?\nFinding a fun bubble shooter with unlimited lives?\n\nBubble Buggle Pop will continue to challenge your brain!\n\nOver 1000 stages to play without worrying about lives!\n\nTest your ability to find the best way til the end.\nRemove all obstacles in your way of getting back the sweet honey.\nBe smart about where you are bouncing the bubble to execute a big blast.\n\nThis game works without the Internet.\nDownloading the app itself will be enough. (Data free)\n\nPlay anywhere and anytime!\n\nAre you ready for shooting? Let's Go~!\n\n[Precautions]\nRemoving the application may result losing all game data.\nThis game contains in-app purchase items.", + "artistId": 1332616667, + "artistName": "CookApps Play", + "genres": [ + "Games", + "Puzzle", + "Board" + ], + "price": 0.00, + "bundleId": "com.cookappsplay.bg2lite", + "version": "1.0.5", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/improvision/id1440448854?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/19/6a/f3/196af3b3-dcf9-5ba3-a3b5-b48563f1d77b/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/19/6a/f3/196af3b3-dcf9-5ba3-a3b5-b48563f1d77b/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple71/v4/88/ca/e0/88cae08d-cce1-cac2-5f58-3bd892e59078/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple71/v4/72/b7/16/72b7166d-3f7a-2067-b8ec-24c68eb1bdd5/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple71/v4/ee/91/d0/ee91d0b0-eab2-b8b3-34e5-df2c78f50c5e/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/19/6a/f3/196af3b3-dcf9-5ba3-a3b5-b48563f1d77b/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Draft Writing", + "trackViewUrl": "https://apps.apple.com/us/app/draft-writing/id1180883279?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.10", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "18078358", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1180883279, + "trackName": "Draft Writing", + "genreIds": [ + "6007", + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2016-12-07T01:16:24Z", + "currentVersionReleaseDate": "2020-07-08T03:36:06Z", + "releaseNotes": "We are pleased to announce that in the new version of the app there are:\n- сloud storage\n- more formats for saving files\n- much less errors;\n- much more convenient and user-friendly interface;\n- improved stability.", + "primaryGenreId": 6007, + "sellerName": "IMPROVIZHN, OOO", + "description": "Draft Writing is a creative text editor for writers and bloggers.\nA writing tool to gather your ideas into one place.\nEasy writing projects and texts management.\n\nCREATE\n- drafts for any blogs, articles, or quick notes;\n- writing projects: short stories, novels, poems and more.\n\nGET\n- Simple but useful text editor;\n- Status labels to show the current status of a project;\n- Possibility to add inspirational photos of places and characters to your projects;\n- Possibility to store unlimited number of documents;\n- Handy document organization;\n- Article preview;\n- Exporting articles you are working on to rich-text format (.rtf).\n\nOptimize your work and improve your productivity with Draft Writing - Creative Text Editor! Keep focused on what matters the most!\n\n\nPrivacy Policy: https://improvisionapps.com/privacy\nTerms Of Use: https://improvisionapps.com/tos", + "artistId": 1440448854, + "artistName": "Improvision", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.alabs.com.academmedialabs.Write.On", + "version": "1.1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/primate-labs-inc/id683676890?mt=12&uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/90/42/56/90425604-0c4e-fed4-9c7b-0638004b21f0/source/60x60bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/90/42/56/90425604-0c4e-fed4-9c7b-0638004b21f0/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/13/4a/6d/134a6d41-4343-95f3-5ada-8ed3b4107102/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/90/42/56/90425604-0c4e-fed4-9c7b-0638004b21f0/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "VoodooPad 5", + "trackViewUrl": "https://apps.apple.com/us/app/voodoopad-5/id514489722?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.12", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "JA" + ], + "fileSizeBytes": "7043697", + "sellerUrl": "https://www.voodoopad.com/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 514489722, + "trackName": "VoodooPad 5", + "genreIds": [ + "6007", + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$24.99", + "primaryGenreName": "Productivity", + "releaseDate": "2012-04-21T20:11:12Z", + "currentVersionReleaseDate": "2019-01-14T20:09:47Z", + "releaseNotes": "Bug fixes and performance improvements.", + "primaryGenreId": 6007, + "sellerName": "Primate Labs Inc.", + "description": "VoodooPad is a place to write down your notes and thoughts. Plant ideas, images, lists and anything else you need to keep track of and VoodooPad will grow with you, without getting in the way. You can even drag and drop folders, images, applications, or URLs into VoodooPad — they're linked up just like on the web. And with powerful search, nothing will be lost or out of reach.\n\nDo you ever have a bit of information that you're not sure where to file? Put it in VoodooPad, it won't mind. Because the more you put into it, the more useful VoodooPad becomes.\n\nOrganize your shopping, travel, and home repair by importing coupons, important receipts, & travel documents into VoodooPad. Link to favorite items, preferred stores, hotels, rental companies, and other businesses. Create lists detailing your plans!\n\nNeed to share your VoodooPad document? Export it as a PDF ePub, or even HTML to make your own website. Maybe you want to collaborate with a few friends? Put it on a shared Dropbox folder and edit away. Need VoodooPad on the go? Use VoodooPad for iOS to access your document on the iPhone or iPad. VoodooPad even has a built-in web server to share documents over a local network.\n\nWith VoodooPad's powerful encryption you can easily organize passwords, usernames, registration information, and accounts. You can encrypt single pages or your entire document.\n\nKeep your research organized and logical by taking advantage of VoodooPad's wiki links, collections, tags, aliases, and powerful search. Import research articles, class notes, and link to websites. Merge and split your information as it grows!", + "artistId": 683676890, + "artistName": "Primate Labs Inc.", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 24.99, + "bundleId": "com.flyingmeat.VoodooPad5", + "version": "5.3.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/bakno-games/id295881975?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/bd/64/ed/bd64ede3-48a3-d224-90f8-639436b1a55e/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/bd/64/ed/bd64ede3-48a3-d224-90f8-639436b1a55e/source/100x100bb.png", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple3/v4/e3/ac/19/e3ac19c7-6e7b-e07f-e148-7f7190596412/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple60/v4/7f/ad/e0/7fade0d4-a2dc-6859-d4b0-500c88984f9d/mzm.ffnmdgvh.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/d2/14/2c/d2142ca5-7d55-4bf8-c839-f82c19078c69/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple5/v4/0a/52/a3/0a52a37e-287e-6bbd-282f-43beb7140a04/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple60/v4/61/6f/1d/616f1d97-03b5-e4c8-b02d-6679ebf51ab1/mzm.wjsxhgoj.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/bd/64/ed/bd64ede3-48a3-d224-90f8-639436b1a55e/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Backgammon.", + "trackViewUrl": "https://apps.apple.com/us/app/backgammon/id898313418?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.6.6", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "50055792", + "sellerUrl": "http://www.bakno.com/Backgammon/index.html", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 898313418, + "trackName": "Backgammon.", + "genreIds": [ + "6014", + "7004", + "6016" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Games", + "releaseDate": "2014-07-23T19:26:44Z", + "currentVersionReleaseDate": "2017-08-09T22:50:14Z", + "releaseNotes": "- Minor bugs fixed", + "primaryGenreId": 6014, + "sellerName": "baKno Games", + "description": "The classic board game of all times, with gorgeous graphics, computer opponent, and intuitive interface. \n\nBackgammon is a game of luck and strategy. Beautiful handcrafted board and pieces are showcased in a 3D view with rotation and zoom.\n\nWith Backgammon you can test your playing skills against the computer, or against friends or family on the same device.", + "artistId": 295881975, + "artistName": "baKno Games", + "genres": [ + "Games", + "Board", + "Entertainment" + ], + "price": 0.00, + "bundleId": "com.bakno.Backgammon", + "version": "2.5.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/triniti-interactive-limited/id328034860?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/0a/20/95/0a2095d7-7575-8b75-89aa-be4765137b01/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/0a/20/95/0a2095d7-7575-8b75-89aa-be4765137b01/source/100x100bb.png", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/1d/ac/45/1dac4503-47f9-91b3-ff74-49dbf8fce29b/mza_3145013274762652115.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/v4/54/53/7e/54537ebf-c554-8bca-87d7-9964689c8d2d/mza_569773968466356935.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/fc/ad/a3/fcada348-0803-b9bb-c64f-78db7c0f74f6/mza_3849052298799157098.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/v4/9d/a0/48/9da048ee-f517-58e8-69f3-5f621724195e/mza_2973133309905572568.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/19/fc/04/19fc0430-6bc7-3a7b-3682-8048302273d6/mza_4698859831607611961.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/0a/20/95/0a2095d7-7575-8b75-89aa-be4765137b01/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Call of Mini - Zombies", + "trackViewUrl": "https://apps.apple.com/us/app/call-of-mini-zombies/id521955032?mt=12&uo=4", + "contentAdvisoryRating": "17+", + "averageUserRating": 0, + "minimumOsVersion": "10.6.6", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "76548732", + "sellerUrl": "http://TRINITIgames.net", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "17+", + "trackId": 521955032, + "trackName": "Call of Mini - Zombies", + "genreIds": [ + "6014", + "7001", + "6016", + "7003" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$2.99", + "primaryGenreName": "Games", + "releaseDate": "2012-08-02T07:00:00Z", + "currentVersionReleaseDate": "2012-08-02T07:00:00Z", + "primaryGenreId": 6014, + "sellerName": "Triniti Interactive Limited", + "description": "A SMALL TOWN INFECTED... UNDEAD ROAM the STREETS... LOCK 'n' LOAD and come out GUNS BLAZING in HD GLORY!\n\n★★★★★\n\nA strange virus has taken hold in a small town; one after another, the town's people have succumbed, losing their appetite for food and gaining one for BRAINS. \n\nA few brave men hold out against all hope, machine guns and rocket launchers their only aid. Will they survive another day? \n\nThat's up to YOU. \n\n★★★★★\n\n✓ Amazing 3D VISUALS\n✓ Fast & furious RUN-AND-GUN ACTION\n✓ Awesome WEAPONS in the ARMORY\n\n★★★★★ \n\n✓ 8 immersive & expansive MAPS\n✓ 16 powerful & unique WEAPONS\n✓ 12 awesome AVATARS with special STRENGTHS\n✓ 17 totally terrifying ENEMY ZOMBIE BREEDS\n✓ In-App purchases available\n\n★★★★★ \n\nMORE UPDATES COMING SOON! \n\n★★★★★ \n\n▶ http://twitter.com/TRINITIgames \n▶ http://facebook.com/TRINITIgames", + "artistId": 328034860, + "artistName": "Triniti Interactive Limited", + "genres": [ + "Games", + "Action", + "Entertainment", + "Casual" + ], + "price": 2.99, + "bundleId": "com.trinitigame.callofminizombiesmac", + "version": "1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/zilla-technology/id1435061023?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/49/da/1c/49da1c62-ed67-a3c7-0caa-6313490a5105/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/49/da/1c/49da1c62-ed67-a3c7-0caa-6313490a5105/source/100x100bb.png", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/bc/08/36/bc083612-2bf9-a7c5-04ca-7d56e685ff8f/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/99/6b/3d/996b3dd9-8ab9-f8d3-1758-81aed628b972/mzl.vfpgmlzt.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/7e/01/d6/7e01d63d-73d2-9fdb-9a43-ecb144d0f2cd/mzl.uzerrmop.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/31/4f/c8/314fc884-2240-f2c8-5ca9-e7708152cc77/mzl.hzdemipj.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/b1/0f/91/b10f915a-f032-b1d1-99e5-5f141ae17d2f/mzl.gkvhyjvu.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/49/da/1c/49da1c62-ed67-a3c7-0caa-6313490a5105/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "GuruVPN", + "trackViewUrl": "https://apps.apple.com/us/app/guruvpn/id1435154552?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.12", + "languageCodesISO2A": [ + "EN", + "RU" + ], + "fileSizeBytes": "16812625", + "sellerUrl": "https://guruvpn.com/en", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1435154552, + "trackName": "GuruVPN", + "genreIds": [ + "6002", + "6007" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Utilities", + "releaseDate": "2018-11-12T20:21:02Z", + "currentVersionReleaseDate": "2019-06-11T23:02:45Z", + "releaseNotes": "1. Reworked subscription's left time output (Connection Info page) with special Russian localization\n2. Reworked program's instance control mechanism: starting new program instance will show tray message of currently running program instead of error message\n3. Added mobile application's download information (authorization)", + "primaryGenreId": 6002, + "sellerName": "ZILLA TECHNOLOGY LP", + "description": "SECURE VPN WITHOUT LIMITS!\n\nUNLIMITED TRAFFIC\nYou can watch streaming video, chat with friends on video chat and much more.\n\nABSENCE OF LOGGERS\nGuaranteed absence of logs, which is extremely important for our demanding audience.\n\nSUPPORT\nOur support will be with you 24/7 every day!\n\nEASY SETUP\nEasy installation without settings! Enable VPN on your phone, tablet and laptop just like 1 - 2 - 3!\n\nTo activate VPN, you must buy a subscription to the mobile application of the same name. The subscription price is $0.99 per week.\n\nOur website: https://guruvpn.com\nTechnical support: support@guruvpn.com\nUser agreement: https://guruvpn.com/en/user-agreement\nTerms of use: https://guruvpn.com/en/frontend/index/terms\nPrivacy policy: https://guruvpn.com/en/privacy-policy", + "artistId": 1435061023, + "artistName": "Zilla Technology", + "genres": [ + "Utilities", + "Productivity" + ], + "price": 0.00, + "bundleId": "com.zillatech.guruvpn", + "version": "1.0.6", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/gluten-free-games/id698937431?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple1/v4/7c/df/bc/7cdfbc43-a69f-4f4f-b775-8b23eba113f6/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple1/v4/7c/df/bc/7cdfbc43-a69f-4f4f-b775-8b23eba113f6/source/100x100bb.png", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple5/v4/a2/99/78/a29978f8-b5f8-7b08-8e57-2361201137cb/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple3/v4/bf/a0/cc/bfa0cc62-bc49-fa4d-777c-2acd171bce0e/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple3/v4/ad/57/3f/ad573fb4-3bcd-a0e0-54ae-250630a8f92c/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple5/v4/bc/9f/28/bc9f28ee-da57-330f-7e41-b226e46dcc05/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple3/v4/15/02/fe/1502fe61-a343-6b78-d0e7-e2a5a7126b39/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple1/v4/7c/df/bc/7cdfbc43-a69f-4f4f-b775-8b23eba113f6/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Wildlife Simulator: Bear", + "trackViewUrl": "https://apps.apple.com/us/app/wildlife-simulator-bear/id926066161?mt=12&uo=4", + "contentAdvisoryRating": "9+", + "averageUserRating": 0, + "minimumOsVersion": "10.6.6", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "51362415", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "9+", + "trackId": 926066161, + "trackName": "Wildlife Simulator: Bear", + "genreIds": [ + "6014", + "6016", + "7015", + "7002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$0.99", + "primaryGenreName": "Games", + "releaseDate": "2014-10-12T15:05:52Z", + "currentVersionReleaseDate": "2014-10-12T15:05:52Z", + "primaryGenreId": 6014, + "sellerName": "Gluten Free Games LLC", + "description": "Live the life of a Grizzly Bear! Survive as a young bear in a forest filled with dangerous carnivores and rushing rapids overflowing with tasty fish! Hunt animals, start a family, and battle for your life against deadly predators like wolves, hawks, and snakes!\n\nDownload the Wildlife Simulator: Bear today while it's 50% OFF for a very limited time!\n\nGame Features\n+ REALISTIC SIMULATOR - You'll need to maintain your health, hunger, thirst, and energy if you're going to survive in the wilderness!\n+ EPIC BATTLES - Use your powerful bite and sharp claws to fight ferocious animals and catch wild fish!\n+ START A FAMILY - Find a mate to bond with and raise your very own bear family to help you hunt! Watch your bear cubs grow in size and assist you in combat!\n+ LEVEL UP YOUR BEAR - Gain experience by defeating other animals and level up your bears to increase their health, attack damage, and even unlock new attacks!\n+ WILDERNESS SURVIVAL GUIDE - Look to your handy survival guide for information on enemy animals, a map of the world, bear customizations, and much more!\n+ HUGE 3D ENVIRONMENT - Your bear is free to explore a massive open world forest! Find a comfy cave to settle down in, climb hills, and sit atop rushing rapids to catch a tasty meal!\n+ HD GRAPHICS - Stunning High Definition graphics will dazzle your display with beautiful views of a gigantic lush forest! New graphics quality options let you customize the game to look amazing and perform great on any device!\n+ OPTIONAL BLOOD EFFECTS - Looking for more realistic action? If you are of age or have your parents permission, turn on the blood effects for some added combat ferocity!\n+ GLUTEN-FREE PROMISE - With all of our games you will always get the full game with no ads or additional purchases!\n\nDownload the Wildlife Simulator: Bear and live the thrilling life of a grizzly in the forest! Hunt, grow, and battle your way to the top of the food chain!\n\nIf you liked living as a Bear then you'll love our other animal simulators! Download our Eagle Simulator and soar through the skies or check out the World of Dragons: Dragon Simulator and raid castles and battle mythical bosses!\n\nFollow us on Facebook for more awesome animal simulation games!\nfacebook.com/glutenfreegames\n\nFollow us on Twitter too! We love hearing feedback and suggestions!\ntwitter.com/glutenfreegames", + "artistId": 698937431, + "artistName": "Gluten Free Games", + "genres": [ + "Games", + "Entertainment", + "Simulation", + "Adventure" + ], + "price": 0.99, + "bundleId": "com.glutenfreegames.bearsimulatormac", + "version": "1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/ibear-llc/id347886453?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/50/74/7c/50747ce8-c032-2b5e-869f-295eb284a057/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/50/74/7c/50747ce8-c032-2b5e-869f-295eb284a057/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple71/v4/54/29/cc/5429cc9d-fd80-03e6-d92c-33f216d5f184/mzl.rfgweenv.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple62/v4/4c/5f/78/4c5f786c-3f59-dbee-f231-2da700eeb097/mzl.hnqwtgjh.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple71/v4/bc/00/d8/bc00d839-9f6c-cf1f-1bc5-d5fd113791d0/mzl.eghyhzaw.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple71/v4/c8/ad/fe/c8adfedd-6b5c-91a1-05c0-e41b7a17334a/mzl.fxrfttbj.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple71/v4/85/f9/05/85f9050b-aa9b-737e-d78a-064cf62d9788/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/50/74/7c/50747ce8-c032-2b5e-869f-295eb284a057/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Checkbook HD: Personal Finance", + "trackViewUrl": "https://apps.apple.com/us/app/checkbook-hd-personal-finance/id496433528?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.9", + "languageCodesISO2A": [ + "AR", + "NL", + "EN", + "FR", + "DE", + "ID", + "IT", + "JA", + "KO", + "PL", + "PT", + "RU", + "ZH", + "ES", + "TH", + "ZH", + "TR" + ], + "fileSizeBytes": "25119347", + "sellerUrl": "http://checkbookhd.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 496433528, + "trackName": "Checkbook HD: Personal Finance", + "genreIds": [ + "6015", + "6000" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Finance", + "releaseDate": "2012-12-13T00:49:45Z", + "currentVersionReleaseDate": "2018-08-23T05:16:55Z", + "releaseNotes": "- Bug fixes", + "primaryGenreId": 6015, + "sellerName": "iBear LLC", + "description": "Checkbook HD offers you a quick and simple way of managing your personal finances. Clean and beautiful interface and easy cloud sync with your iPhone or iPad.\n\nManage all your accounts with Checkbook HD and stay always aware of how much money is left on each of your accounts, and how it happened. Add entries that change balances on your accounts manually, or import your banking records by using your bank's OFX file. You can also schedule recurring transactions, sync your data between several devices, schedule delayed transactions and clear them later on (reconcile). To visualize the activity of your accounts, use colorful charts. \n\nVideo: www.checkbookhd.com \n\nCheckbook HD features:\n\nACCOUNTS MANAGEMENT \n- Unlimited number of accounts (checking, savings, credit card, etc.)\n- Running balance column\n- Accounts reconciliation (balance and cleared balance)\n- Support of multiple currencies \n- Restoration of previously deleted accounts (if needed)\n\nTRANSACTIONS \n- Income, Expenses, Transfers between accounts\n- Categories and subcategories\n- Automatic categorization based on previous transactions\n- Additional fields for organizing your records including description, payee, check #, etc. \n- Customization of the transaction columns\n- Search \n- Hotkeys \n\nRECURRING TRANSACTIONS\n- Automatic repeating transactions scheduled as “cleared” or “not cleared”\n- Regulated custom frequency (daily, weekly, bi-weekly, monthly and any other frequency customization)\n\nREPORTS\n- Pie chart and bar chart reports showing the structure of your income and expenses\n- Filter by categories and subcategories, accounts and payees \n- PDF reports for sharing and printing\n\nDATA AND SYNC\n- Import of your banking records using your bank's OFX file \n- Quick manual entry\n- PIN-protected data\n- Backup\n- Export of your data in CSV/Excel and PDF formats\n- iCloud storing of your data and providing it on all your devices - iPhone, iPad, Mac (This feature can be turned on after the installation. All the updates occur automatically.)\n- Printing of your data (CSV/Excel and PDF formats supported)\n\n\u2028DESIGN\n- Clean and beautiful Mac-oriented interface (check the screenshots)\n- Beautiful PDF reports for sharing and printing\n\n- User Guide - http://checkbookhd.com \n- Feedback & Support - support@ibearsoft.com\n\n\u2028Checkbook HD is truly a high quality clean product for easy personal finance management. Buy now! ►►", + "artistId": 347886453, + "artistName": "iBear LLC", + "genres": [ + "Finance", + "Business" + ], + "price": 0.00, + "bundleId": "com.ibearsoft.checkbookhdformac", + "version": "1.2.8", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/oleksandr-glushchenko/id1277179283?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/86/43/08/864308cb-4d12-72c4-3a49-a029e98d4f51/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/86/43/08/864308cb-4d12-72c4-3a49-a029e98d4f51/source/100x100bb.png", + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/d7/9e/ef/d79eef4b-8e30-8fe8-f891-635c556e3ecc/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/49/35/7e/49357e72-f771-71be-8a61-4f1a8961657c/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/7a/72/b4/7a72b4d3-ee36-50cc-9dd0-d5612ef09d47/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/db/fb/c4/dbfbc4f8-1f25-e5d4-649e-0123bcc113a8/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/9a/d6/54/9ad6545a-b4f0-ca16-aaac-01de81dcfc2b/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/2d/54/e3/2d54e32c-868c-842e-35e6-fb7751c7364a/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/00/67/09/006709eb-2a06-9304-ac5e-9d6a296115bb/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/86/43/08/864308cb-4d12-72c4-3a49-a029e98d4f51/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "FSNotes", + "trackViewUrl": "https://apps.apple.com/us/app/fsnotes/id1277179284?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.12", + "languageCodesISO2A": [ + "AR", + "NL", + "EN", + "FR", + "DE", + "IT", + "KO", + "PT", + "RU", + "ZH", + "ES", + "UK" + ], + "fileSizeBytes": "12839365", + "sellerUrl": "https://fsnot.es", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1277179284, + "trackName": "FSNotes", + "genreIds": [ + "6007", + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$3.99", + "primaryGenreName": "Productivity", + "releaseDate": "2017-09-02T21:50:41Z", + "currentVersionReleaseDate": "2020-09-02T04:29:22Z", + "releaseNotes": "- Adds Italian translation\n- Adds file action \"Change creation date\"\n- Fixes notes auto selection\n- Fixes notes visibility\n- Fixes reordering in sort by creation date", + "primaryGenreId": 6007, + "sellerName": "Oleksandr Glushchenko", + "description": "FSNotes features:\n\n- Keyboard centric.\n- Global shortcuts (clipboard save/search).\n- Markdown and RTF markup (files stored on disk as Plaintext and Rich Text).\n- Markdown preview mode.\n- Elastic two-pane view (vertical and horizontal layout).\n- Blazing fast and lightweight (working fine with 10k+ files)\n- Open files in finder work with external editors (changes seamless live sync with UI).\n- Pin/Unpin important notes on the top.\n- Synchronization over iCloud Drive.\n- Multi-folder storage.\n- Live Markdown highlighting with code blocks (over 170 languages).\n- Themes for code highlighting.\n- Markdown images preview in the editor.\n- Images drag and drop or copy & paste.\n- Tags.\n- Dark mode (macOS Mojave and higher).\n- Encryption AES-256.\n- Mermaid and MathJax support.\n- Git versioning and scheduled backups.", + "artistId": 1277179283, + "artistName": "Oleksandr Glushchenko", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 3.99, + "bundleId": "co.fluder.FSNotes", + "version": "4.6.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/serpensoft-group/id321979768?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/4a/27/4a/4a274ae5-39dc-4be4-d9ce-62d74701827f/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/4a/27/4a/4a274ae5-39dc-4be4-d9ce-62d74701827f/source/100x100bb.png", + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/88/63/2f/88632f83-eae2-d81c-0218-d209fc0c6218/abc4e446-31f1-406e-b6c4-f74df1393326_1.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/2a/d5/a0/2ad5a098-82ae-a5db-8f75-927704fc5491/c5a56ec1-1ed9-472f-b9eb-c962ecfcda0c_2.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/3f/65/f8/3f65f89e-56a8-4ef2-8d69-726b9e828326/5ece51da-4611-4ff2-ad94-e7e2c4699baf_3.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/fe/79/15/fe791552-9b11-ffd0-9983-94a9be136411/e48e5523-d2a2-4983-8e5c-d56748d15d1b_4.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/ab/71/36/ab7136d2-4160-b089-4b7a-ebef44cf70e9/627c940b-21ab-4671-88b7-42ed240d4262_5.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/88/20/2a/88202ae1-088f-455d-80ad-9f52e3294782/b5783428-0d26-45ec-abaf-18ad55a49bcb_6.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/8f/5b/e0/8f5be013-6375-966c-c541-012d10cc126b/319e42a2-8039-4806-8f27-b469d10afc19_7.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/4a/27/4a/4a274ae5-39dc-4be4-d9ce-62d74701827f/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "iWriter Pro", + "trackViewUrl": "https://apps.apple.com/us/app/iwriter-pro/id893199093?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.14", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "9130507", + "sellerUrl": "http://serpensoft.info", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 893199093, + "trackName": "iWriter Pro", + "genreIds": [ + "6007", + "6000" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$8.99", + "primaryGenreName": "Productivity", + "releaseDate": "2016-07-21T16:27:00Z", + "currentVersionReleaseDate": "2020-07-28T17:37:25Z", + "releaseNotes": "# RELEASE 1.14\n• File transclusion: use {{filepath}} element to attach external files.\n• EPUB export now supports fields for cover, title, and author.\n• Theme auto-switching for system Light/Dark mode.\n• Automatic page numbers for printing/PDF.\n• New counter options: words/chars/disabled.\n• Improved support for drag-n-drop.\n• Bug fixes and under-the-hood optimisations.\n\n# PREVIOUS RELEASES:\n• New element: Task list.\n• New export option: EPUB.\n• Improved styling for nested lists.\n• Added support for Math equations (MathJax) and diagrams (Flowchart and Mermaid).\n\nIf you like iWriter Pro please rate it in the Mac App Store every time the update goes live. Your ratings and reviews help us a lot!", + "primaryGenreId": 6007, + "sellerName": "Sergey Zorin", + "description": "iWriter Pro is elegant and minimalist text editor with built-in Markdown support. Distraction-free and subscription-free. \n\n# Key Features:\n\n- Sync across all your Mac, iPad, and iPhone devices*. \n- Text editing with live syntax highlight. \n- Preview for Markdown and MultiMarkdown documents. \n- Typewriter and Focus modes (sentence, line, & paragraph).\n- Fast and responsive editing even for large files. \n- Integrated counters for words/chars/sentences/etc.\n- QuickLook plugin for Markdown documents.\n\n# iWriter Pro Supports:\n\n- Math equations and flowchart diagrams.\n- Export Markdown documents to HTML, PDF, RTF, EPUB, and LaTeX. \n- Keyboard shortcuts for text formatting.\n- Automatic number/bullet/task list continuations.\n- User-selectable fonts.\n- Markdown documents printing.\n\n* iWriter Pro for iPhone and iPad available as a separate purchase.\n\nPlease note: iWriter Pro is designed to be as easy as possible so it works with plain text files only (like ‘.txt’ and ‘.md’).", + "artistId": 321979768, + "artistName": "Serpensoft Group", + "genres": [ + "Productivity", + "Business" + ], + "price": 8.99, + "bundleId": "com.serpensoft.iwriterpromac", + "version": "1.14", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/mithra-media/id995975657?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/e2/f4/3b/e2f43bba-f636-ce36-ffaa-0beece791093/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/e2/f4/3b/e2f43bba-f636-ce36-ffaa-0beece791093/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/3e/15/6e/3e156e22-d01a-8a2f-378c-1c4fd0ffdb2d/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/a7/c0/65/a7c065f1-0ffc-d2d8-e394-7a31ca74a5a5/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/fc/23/bf/fc23bf3e-3fec-f3b8-e7d2-ad6b4abfa856/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/e4/2e/80/e42e8029-f30b-beec-4dc9-f1665c714fde/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/e2/f4/3b/e2f43bba-f636-ce36-ffaa-0beece791093/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Virtual Hunting Bear", + "trackViewUrl": "https://apps.apple.com/us/app/virtual-hunting-bear/id1440703595?mt=12&uo=4", + "contentAdvisoryRating": "17+", + "averageUserRating": 0, + "minimumOsVersion": "10.9.0", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "67971716", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "17+", + "trackId": 1440703595, + "trackName": "Virtual Hunting Bear", + "genreIds": [ + "6014", + "6016", + "7003", + "7002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Games", + "releaseDate": "2018-11-16T15:08:24Z", + "currentVersionReleaseDate": "2018-11-16T15:08:24Z", + "primaryGenreId": 6014, + "sellerName": "Mithra Media", + "description": "Kill or Get Killed - Awesome Bear Sniper Game.\n\nEnjoy Two Mode :\nTime Trial: Snipe Bear in given Time Limit.\nFree Mode : Snipe as many as you can.\n\nUltimate Radar System to get Bear's Locations.\n\nUltimate Radar System to get AmmoCrate's Locations.\n\nTake HeadShots For More Points.\n\nGet Achievements On Different Kills.\n\nSwipe to get more weapons.\n\nChallenge your friends to get the highest score!\n\nFEATURES:\n\n• Awesome 3D graphics\n• Epic slow motion camera\n• Several Weapons\n\n\n• Slick FPS controls\n\n- Move by swiping the left of the screen\n- Aim by swiping the right of the screen\n- Tap Zoom button to go into snipe mode\n- Tap Fire button to fire\n\n• Loads of Bears to shoot\n• Addictive quick gameplay\n\nDownload NOW 100% FREE.", + "artistId": 995975657, + "artistName": "Mithra Media", + "genres": [ + "Games", + "Entertainment", + "Casual", + "Adventure" + ], + "price": 0.00, + "bundleId": "com.unanimoustech.virtual.hunting.bear.free", + "version": "1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/david-caddy/id398901339?uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/e8/19/8a/e8198a51-f4a1-556e-70c2-6a36d1b4b5d6/source/60x60bb.jpg", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/e8/19/8a/e8198a51-f4a1-556e-70c2-6a36d1b4b5d6/source/100x100bb.jpg", + "isGameCenterEnabled": false, + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/b5/e9/0e/b5e90e1b-187b-6aa5-474f-6669c0ba07b9/pr_source.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/bf/72/cb/bf72cb47-3571-b828-0041-2807dbe12e00/pr_source.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/56/8d/47/568d4744-fc88-10ff-f784-ff2d71215836/pr_source.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/f2/44/93/f24493ce-1c9b-4ffd-e7fb-0d65a7fad74c/pr_source.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/b3/48/d8/b348d86b-1067-b09b-47ce-4883da932aeb/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/29/c3/0f/29c30feb-71f9-578c-8606-ede0491dffb9/pr_source.png/392x696bb.png" + ], + "ipadScreenshotUrls": [], + "appletvScreenshotUrls": [], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/e8/19/8a/e8198a51-f4a1-556e-70c2-6a36d1b4b5d6/source/512x512bb.jpg", + "advisories": [], + "supportedDevices": [ + "iPhone11ProMax-iPhone11ProMax", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadSeventhGen-iPadSeventhGen", + "iPhone5-iPhone5", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadMini4-iPadMini4", + "iPad834-iPad834", + "iPadFourthGen-iPadFourthGen", + "iPhoneSE-iPhoneSE", + "iPad73-iPad73", + "iPadAir2-iPadAir2", + "iPadMini5Cellular-iPadMini5Cellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad612-iPad612", + "iPadPro97-iPadPro97", + "iPhone6s-iPhone6s", + "iPad856-iPad856", + "iPadAirCellular-iPadAirCellular", + "iPhone8-iPhone8", + "iPhoneXR-iPhoneXR", + "iPadFourthGen4G-iPadFourthGen4G", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMiniRetina-iPadMiniRetina", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone7Plus-iPhone7Plus", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhone8Plus-iPhone8Plus", + "iPhoneX-iPhoneX", + "iPadMini5-iPadMini5", + "iPhone6Plus-iPhone6Plus", + "iPadProCellular-iPadProCellular", + "iPad71-iPad71", + "iPhone7-iPhone7", + "iPhone6-iPhone6", + "iPadProFourthGen-iPadProFourthGen", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadAir3-iPadAir3", + "iPad72-iPad72", + "iPhoneXS-iPhoneXS", + "iPadProSecondGen-iPadProSecondGen", + "iPad878-iPad878", + "iPhone11-iPhone11", + "iPadAir-iPadAir", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadPro-iPadPro", + "iPadMini3-iPadMini3", + "iPhone5c-iPhone5c", + "iPad611-iPad611", + "iPhone6sPlus-iPhone6sPlus", + "iPhone11Pro-iPhone11Pro", + "MacDesktop-MacDesktop", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone5s-iPhone5s", + "iPhoneXSMax-iPhoneXSMax", + "iPad75-iPad75", + "iPad74-iPad74", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPad812-iPad812", + "iPad76-iPad76" + ], + "features": [ + "iosUniversal" + ], + "kind": "software", + "currency": "USD", + "trackCensoredName": "Deck Help", + "trackViewUrl": "https://apps.apple.com/us/app/deck-help/id1473798154?uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 2.923080000000000122639676192193292081356048583984375, + "minimumOsVersion": "10.0", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "21393408", + "sellerUrl": "https://armchairengineering.com", + "averageUserRatingForCurrentVersion": 2.923080000000000122639676192193292081356048583984375, + "userRatingCountForCurrentVersion": 13, + "trackContentRating": "4+", + "trackId": 1473798154, + "trackName": "Deck Help", + "genreIds": [ + "6002", + "6007" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$2.99", + "primaryGenreName": "Utilities", + "releaseDate": "2019-07-27T07:00:00Z", + "currentVersionReleaseDate": "2019-11-08T09:24:13Z", + "releaseNotes": "- Fixed floating keyboard bug, present on some devices running iOS 13", + "primaryGenreId": 6002, + "sellerName": "David Caddy", + "description": "Deck Help is the easiest way to calculate decking material requirements, timber lengths and associated values when building!\n\nQuickly find bearer and joist lengths, as well as stump, bearer, joist and board set outs for a given deck width and length.\n\nFeatures Include: \n\n- Accurately solve deck equations\n- Enter lengths in mm, cm, inches or feet\n- Select your preferred number of decimal places", + "artistId": 398901339, + "artistName": "David Caddy", + "genres": [ + "Utilities", + "Productivity" + ], + "price": 2.99, + "bundleId": "com.davidcaddy.DeckHelp", + "version": "1.0.1", + "wrapperType": "software", + "userRatingCount": 13 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/liga-andina/id915778732?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/ce/4c/b9/ce4cb92e-a6d1-30b4-7036-4fe95708c703/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/ce/4c/b9/ce4cb92e-a6d1-30b4-7036-4fe95708c703/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple62/v4/44/f2/e3/44f2e306-c87f-2722-e0e7-75e12e214e0a/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/a4/2e/13/a42e1320-f5f3-a96e-f4f9-8686516a308c/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/e6/e2/b4/e6e2b423-a91c-88c9-4ede-cce2fcc5b663/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/d4/0e/d2/d40ed214-cc93-6a7b-b826-75ed884ffd86/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple62/v4/23/a3/50/23a35086-2f77-2b31-b942-b39ce1f898b4/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/ce/4c/b9/ce4cb92e-a6d1-30b4-7036-4fe95708c703/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Trophy Hunt: Online Evolution", + "trackViewUrl": "https://apps.apple.com/us/app/trophy-hunt-online-evolution/id969809817?mt=12&uo=4", + "contentAdvisoryRating": "17+", + "averageUserRating": 0, + "minimumOsVersion": "10.9.0", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "85994071", + "sellerUrl": "https://jurassicapps.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "17+", + "trackId": 969809817, + "trackName": "Trophy Hunt: Online Evolution", + "genreIds": [ + "6014", + "7015", + "7002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Games", + "releaseDate": "2015-05-09T17:00:46Z", + "currentVersionReleaseDate": "2019-07-11T01:09:24Z", + "releaseNotes": "Multiplayer Online 20 Players - Play as a Animal\n\nYou all requested 'Play as a Animal' Enjoy!!\n\nAdded Radar & Map positions for Everyone\nInteractive 3D animal & item selection\nPlayer Damage and Blood Splatters\n\nTweaks and Bug Fixes", + "primaryGenreId": 6014, + "sellerName": "Liga Andina", + "description": "​Deadly big game animals run wild, hunt by day or night and in all conditions.\n\nMultiplayer Online 20 Players - Play as a Animal\n\nTake every weapon you can with you, load it into your 4x4 Off-Road Vehicle, Motorbike, Boat, Horse or track your prey by foot.\n\nCollect these Weapons: Handgun/Rifle/Pistol Crossbow(Explosive Arrows)/Compound Bow/Proximity Mines/Gas Canisters.\n\nUse your Tracking device or Map to locate:\n\nBear, Wolf, Fox, Badger, Bison, Squirrel, Mallard, Stag, Moose, Crocodile, Piranha, Water Snake, Beetle, Bee, Eagle and Wild Boar.\n\nAt night camp out by your log fire, if you have night Vision Goggles then perhaps night hunting can be both fun and dangerous.\n\nTrophy Hunt: Evolution has High quality graphics and gameplay.", + "artistId": 915778732, + "artistName": "Liga Andina", + "genres": [ + "Games", + "Simulation", + "Adventure" + ], + "price": 0.00, + "bundleId": "com.hunt2kgames.trophyhunt", + "version": "19.7.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/wanderful-inc/id533206719?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple1/v4/ba/1a/7c/ba1a7c6c-28f2-c6f4-bea8-8bb2e7cf2894/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple1/v4/ba/1a/7c/ba1a7c6c-28f2-c6f4-bea8-8bb2e7cf2894/source/100x100bb.png", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/e2/e5/e3/e2e5e3d5-9240-8f32-d5dc-12f8f8a1576d/mzl.chvyhucb.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple2/v4/f1/c1/38/f1c13800-17af-7143-518d-a3c9169a4065/mzl.dvixzeom.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/v4/ca/3e/7a/ca3e7a01-9c3d-6422-3537-2447119fe16a/mzl.luldfbnx.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple2/v4/f9/a9/e2/f9a9e25d-5a8a-729a-f136-9c4f11787cf3/mzl.xiswcfyw.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple2/v4/48/40/02/484002f2-5208-4d88-07d8-c151cf1fbe8a/mzl.hbrnzxbw.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple1/v4/ba/1a/7c/ba1a7c6c-28f2-c6f4-bea8-8bb2e7cf2894/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Storybook Sampler", + "trackViewUrl": "https://apps.apple.com/us/app/storybook-sampler/id632152206?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.6", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "53340785", + "sellerUrl": "http://wanderfulstorybooks.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 632152206, + "trackName": "Storybook Sampler", + "genreIds": [ + "6017" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Education", + "releaseDate": "2013-04-23T23:09:57Z", + "currentVersionReleaseDate": "2015-03-23T17:54:10Z", + "releaseNotes": "Bug fix for a freeze when launching on Retina displays.", + "primaryGenreId": 6017, + "sellerName": "Wanderful, Inc.", + "description": "Orignally published as Living Books by Broderbund Software\n\n• Recipient of a 2013 PARENTS’ CHOICE Approved Award\n• Sample the interactive stories originally published by Living Books\n• Arthur, Berenstain Bears, Harry and the Haunted House, Little Monster, Tortoise and the Hare, and Ruff are all here\n\nReview:\n\"For all those who take full advantage of the taste-before-you-buy events at farmer's markets or grocery stores, Wanderful Storybooks Sampler offers a similar experience.\n\nThis free app gives readers a fully interactive 'first page' sample from each of its seven-book collection: Little Monster At School, Arthur's Teacher Trouble, Arthur's Birthday, Berenstain Bears Get In A Fight, Harry and the Haunted House, Tortoise and the Hare and Ruff's Bone. Additionally, the sampler highlights what to expect in the parental tips and teacher resources sections of each Wanderful title designed to help, guide, and delight new and emerging readers.\"\n \n- Parents' Choice ©2013 Parents' Choice \n\nHave you ever wished you could play inside a story and really interact with all the characters and words? Now you can! The Storybook Sampler presents pages from the available Wanderful interactive storybooks. These are fully interactive reading experiences with fully animated content loved by children, parents and teachers alike.\n\nRead and play inside each of the animated story pages, where everything comes to life for hours of delightful story fun. The stories include Arthur’s Birthday, The Tortoise and the Hare, the Berenstain Bears Get in a Fight, harry and the Haunted House and Little Monster at School.\n\nKEY FEATURES:\n• Each page is fully animated and interactive and virtually every item comes to life when tapped\n• The entire interactive first page of each story is included\n• All words are recorded twice and are fully “active” for extended word play and language learning – listen to them in story sequence or tap on them to make your own phrases \n• A hidden surprise is on each page – see if you can find it. It’s a different surprise for every story\n• Multiple settings further customize the App for your child’s reading experience\n• Parental tips help you get the most out of this Wanderful Interactive Storybook Sampler\n• The Sampler features easy options to purchase the complete storybooks or learn more about them\n• Teacher resources include a 36 page overview of Wanderful interactive storybooks Classroom Activities and a free preview of the Tortoise and the Hare Classroom Activities guide \n\nWanderful’s goal is to help children discover a lasting love of language through story exploration. We hope the Storybook Sampler provides your family, children and students with hours of delightful reading and story play. \n\nPrivacy Disclosure\nWanderful creates engaging interactive storybooks for children that are educational, fun, and above all safe and appropriate. This App:\n• does not collect any information\n• does not contain ads\n• does not contain in-app purchases, but does allow you to purchase the storybooks\n• includes active links to websites or social networks, but ONLY from the PARENTS and TEACHERS pages, not from the storybook pages", + "artistId": 533206719, + "artistName": "Wanderful, Inc.", + "genres": [ + "Education" + ], + "price": 0.00, + "bundleId": "com.wanderfulstorybooks.osx.Sampler", + "version": "1.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/rick-jansen/id288704033?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/be/8b/67/be8b676a-d3c1-7870-006f-d6ec9047d210/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/be/8b/67/be8b676a-d3c1-7870-006f-d6ec9047d210/source/100x100bb.png", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/70/6a/1e/706a1e1a-c383-a84f-2144-a5337ff00ca8/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/03/f4/64/03f464f7-7aec-d231-bb93-812578900b92/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/a9/ba/18/a9ba18ae-8898-3d12-3dd4-6b31698c7c77/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/be/8b/67/be8b676a-d3c1-7870-006f-d6ec9047d210/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "iSnow", + "trackViewUrl": "https://apps.apple.com/us/app/isnow/id565963412?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.9", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "3901682", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 565963412, + "trackName": "iSnow", + "genreIds": [ + "6016", + "6012" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$0.99", + "primaryGenreName": "Entertainment", + "releaseDate": "2012-11-08T17:52:01Z", + "currentVersionReleaseDate": "2020-01-06T22:09:22Z", + "releaseNotes": "Fix for multi-monitor setups where the main screen is on the right or at the top.", + "primaryGenreId": 6016, + "sellerName": "Rick Jansen", + "description": "Let it snow on your desktop and have Santa and his reindeer fly around your screen for that Extra Festive Season Cheer, while snow piles up on top of your windows (really!) and at the bottom of the screen. Maybe there's a polar bear somewhere too.\n\nThere are lots of options to control the snow fall, the wind, Rudolf's red nose, the size of the snowflakes, Santa, the bear, the snowdrops, etc. \n\nThis year Sinterklaas (Dutch Saint Nicholas) is present, too. \n\nOptionally you can have snow on your second display too.\n\nNOTE: If you have trouble starting iSnow you can hold down the option-key while starting the application, that will reset the settings.\n\niSnow, the classic Snow since 1984.", + "artistId": 288704033, + "artistName": "Rick Jansen", + "genres": [ + "Entertainment", + "Lifestyle" + ], + "price": 0.99, + "bundleId": "com.Rick.Jansen.Snow", + "version": "2.2.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/codebots-ltd/id1173102927?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/ba/72/d2/ba72d2a5-ad8e-e92b-6a46-746f48e24cb5/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/ba/72/d2/ba72d2a5-ad8e-e92b-6a46-746f48e24cb5/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple5/v4/c1/9f/0a/c19f0a6d-803d-71c3-6845-82974a83627c/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple5/v4/61/01/89/6101892f-b18d-4e47-a54b-5f0ed08c87dc/mzl.eqjhosee.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple5/v4/65/71/fe/6571fe57-26c0-bc22-3de7-696551b0ae58/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple7/v4/ad/39/61/ad3961fb-35fc-cd65-8978-6ffdff6fd064/mzl.zramimxc.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple7/v4/14/92/a0/1492a07e-06a1-3423-c2f1-65f48a1212fa/mzl.yucrpcqc.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/ba/72/d2/ba72d2a5-ad8e-e92b-6a46-746f48e24cb5/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Focused - Minimal Markdown App", + "trackViewUrl": "https://apps.apple.com/us/app/focused-minimal-markdown-app/id899966452?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.11", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "32053879", + "sellerUrl": "http://codebots.co.uk", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 899966452, + "trackName": "Focused - Minimal Markdown App", + "genreIds": [ + "6007", + "6000" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$19.99", + "primaryGenreName": "Productivity", + "releaseDate": "2015-07-16T07:58:06Z", + "currentVersionReleaseDate": "2018-12-15T22:58:02Z", + "releaseNotes": "Improved support for macOS Mojave\nImproved heading font and spacing\nDocuments are now searchable", + "primaryGenreId": 6007, + "sellerName": "Codebots Ltd", + "description": "Meet Focused, formally known as Typed - the writing & Markdown app that blocks out distractions and clutter, and aids your focus so you can just write.\n\nWe firmly believe the typewriter gives you the best writing experience. That's why we've completely re-built Focused from the ground up, typewriter first!\n\nFocused has the best typewriter experience on the Mac!\n\n“Focused has separated itself from the pack by very intentionally not packing itself full of features that many users won't touch, instead focusing of the pure writing experience as the core element to get right.” — iMore\n\nIf you’re writing for the web, or quickly outlining longer articles, Focused features a full complement of keyboard shortcuts to both format and structure as you write. Quickly mark headings, Bold & Italics, Add Links - all easily within reach.\n\nWhen you sit down to write, getting in the “zone” as quickly as possible is imperative. So when creating Focused we carefully studied the ideal environment - and built it. There’s Full Screen as you would expect, and then there’s Zen Mode. Eight carefully selected ambient soundtracks that heighten your focus - from rain to wind and more. All perfect for keeping calm and creating great content when you’re on a deadline.\n\nFeatures\n\n- No clutter, no distractions. Just a perfectly honed set of tools to help you write and stay focused on the task at hand.\n- Filter out life’s distractions with 8 calming soundtracks that aid your focus, allowing you to concentrate on your writing.\n- Need to hit a word count, or stick to a character limit? Focused keeps you on target without cluttering your workspace.\n- The dog will never eat your homework again - Auto Save keeps your content safe, with Versions support to retrieve an edit.\n- Typewriter & Focus modes: Focused vertically centres and highlights just the sentence or paragraph you’re working on. Great no matter whether you’re editing or writing.\n- Built to help you write for the web without the need to know any code - Focused generates it all for you, and uses Markdown syntax to keep your writing easily readable.\n- Never leave the keyboard again, with comprehensive keyboard shortcuts to help you structure and format.\n\nFocused is not just a distraction-free writing app - it’s the first writing app that actually aids your focus, and we think you’ll love it.\n\nIf you have any questions, or want to share your feedback just use the Support link here on the Mac App Store to contact us and one of the Focused team will get back to you!", + "artistId": 1173102927, + "artistName": "Codebots Ltd", + "genres": [ + "Productivity", + "Business" + ], + "price": 19.99, + "bundleId": "com.realmacsoftware.typed", + "version": "3.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/yegor-kurbachev/id550306229?mt=12&uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple7/v4/9d/ec/e3/9dece3d3-0cc7-45b3-eabb-3c9f54086ca5/source/60x60bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple7/v4/9d/ec/e3/9dece3d3-0cc7-45b3-eabb-3c9f54086ca5/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple7/v4/47/ba/3c/47ba3c60-90d5-ac15-1638-e0ac37ae7e0c/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple1/v4/cd/9f/74/cd9f748f-b468-47d5-87b7-e382d6f56fe2/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple5/v4/3a/e4/2b/3ae42bde-78d9-f4d5-8ed0-7d24e4904fb1/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple7/v4/f4/81/73/f4817365-44ff-f4cc-cb13-0e56ba16957f/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple1/v4/61/66/94/6166940c-5bf9-4be7-0b90-59f6e96a808f/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple7/v4/9d/ec/e3/9dece3d3-0cc7-45b3-eabb-3c9f54086ca5/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Wild Faces Jigsaw Puzzle - The Free Animals", + "trackViewUrl": "https://apps.apple.com/us/app/wild-faces-jigsaw-puzzle-the-free-animals/id946466591?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.8", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "RU" + ], + "fileSizeBytes": "23473297", + "sellerUrl": "http://www.jvesoft.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 946466591, + "trackName": "Wild Faces Jigsaw Puzzle - The Free Animals", + "genreIds": [ + "6014", + "6017" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Games", + "releaseDate": "2015-05-18T18:22:53Z", + "currentVersionReleaseDate": "2015-12-04T08:16:17Z", + "releaseNotes": "Bug fixes and improved support for El Capitan", + "primaryGenreId": 6014, + "sellerName": "Yegor Kurbachev", + "description": "Many beautiful puzzles for your child to master!\nThis app contains 18 hand-picked and individually prepared jigsaw puzzles.\n\nFeatures:\n- A user interface with no extra features.\n- 2 solving modes: normal (allowing puzzle pieces to be rotated) and baby (just moving the pieces with no need for rotation).\n- Movement and rotation customizable magnets, allowing for easier game play.\n- No written language, just pictures and icons.\n- All transitions are immediate and animated.\n- No music (anyway, if your child likes music, you know what he likes better than we do, and you already have that in your iTunes!).\n\nWhat that means:\n- No distractions for the child!\n- Easily configurable to your child’s preference.\n- Easy for the child to understand.\n- No waiting for the next screen, it appears right-away!\n\nI hope your children will enjoy this simple app as much as my two kids do!\n\nThanks!!!", + "artistId": 550306229, + "artistName": "Yegor Kurbachev", + "genres": [ + "Games", + "Education" + ], + "price": 0.00, + "bundleId": "com.jvesoft.mac.puzzle.Wild", + "version": "1.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/abhishek-karale/id1087945443?uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/87/e5/0f/87e50fab-b484-466c-a7e3-f1a918008d8b/source/60x60bb.jpg", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/87/e5/0f/87e50fab-b484-466c-a7e3-f1a918008d8b/source/100x100bb.jpg", + "isGameCenterEnabled": false, + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/3f/e2/4e/3fe24e92-0561-e0d9-383e-40fcc1c4f649/pr_source.jpg/392x696bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource113/v4/2c/b9/7e/2cb97e9f-a8d3-c29e-d9e5-1a05bb784da4/66a59f39-757b-412e-8e40-0e3beebec899_7.jpg/392x696bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/5f/74/5b/5f745b44-e436-5465-22ce-d549ab7e7e5f/pr_source.jpg/392x696bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/70/d9/d270d932-dfd0-da17-8e9c-13199059ce81/pr_source.jpg/392x696bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/c7/60/3b/c7603bc5-acf3-4faf-f1e9-a0a630b01985/pr_source.jpg/392x696bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/83/0a/d3/830ad329-4fd8-b676-3b10-60caf12ef67f/pr_source.jpg/392x696bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/80/8c/f3/808cf354-bb15-caba-0161-d634581f02f0/pr_source.jpg/392x696bb.jpg" + ], + "ipadScreenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/bc/b7/d6/bcb7d6e7-512a-0441-635c-3dd48b229f60/pr_source.png/576x768bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/69/e2/52/69e252a7-40e7-e6bf-521b-1b634b3dba93/pr_source.png/576x768bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/e5/ff/42/e5ff422e-4d51-1d54-85ed-45519263b1fe/pr_source.png/576x768bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/b7/8f/13/b78f1300-5b25-74b5-e808-00f1d8d97b4d/pr_source.png/576x768bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/b4/46/26/b44626d1-4d03-3f97-1635-8647499c3a24/pr_source.png/576x768bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/6a/2b/5d/6a2b5de8-09ef-b4cb-60ef-cb761c7bd97c/pr_source.png/576x768bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/87/e5/0f/87e50fab-b484-466c-a7e3-f1a918008d8b/source/512x512bb.jpg", + "advisories": [], + "supportedDevices": [ + "iPhone11ProMax-iPhone11ProMax", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadSeventhGen-iPadSeventhGen", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadMini4-iPadMini4", + "iPad834-iPad834", + "iPhoneSE-iPhoneSE", + "iPad73-iPad73", + "iPadAir2-iPadAir2", + "iPadMini5Cellular-iPadMini5Cellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad612-iPad612", + "iPadPro97-iPadPro97", + "iPhone6s-iPhone6s", + "iPad856-iPad856", + "iPadAirCellular-iPadAirCellular", + "iPhone8-iPhone8", + "iPhoneXR-iPhoneXR", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMiniRetina-iPadMiniRetina", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone7Plus-iPhone7Plus", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhone8Plus-iPhone8Plus", + "iPhoneX-iPhoneX", + "iPadMini5-iPadMini5", + "iPhone6Plus-iPhone6Plus", + "iPadProCellular-iPadProCellular", + "iPad71-iPad71", + "iPhone7-iPhone7", + "iPhone6-iPhone6", + "iPadProFourthGen-iPadProFourthGen", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadAir3-iPadAir3", + "iPad72-iPad72", + "iPhoneXS-iPhoneXS", + "iPadProSecondGen-iPadProSecondGen", + "iPad878-iPad878", + "iPhone11-iPhone11", + "iPadAir-iPadAir", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadPro-iPadPro", + "iPadMini3-iPadMini3", + "iPad611-iPad611", + "iPhone6sPlus-iPhone6sPlus", + "iPhone11Pro-iPhone11Pro", + "MacDesktop-MacDesktop", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone5s-iPhone5s", + "iPhoneXSMax-iPhoneXSMax", + "iPad75-iPad75", + "iPad74-iPad74", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPad812-iPad812", + "iPad76-iPad76" + ], + "features": [ + "iosUniversal" + ], + "kind": "software", + "currency": "USD", + "trackCensoredName": "Quote Keeper", + "trackViewUrl": "https://apps.apple.com/us/app/quote-keeper/id1480095106?uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 4.54544999999999976836306814220733940601348876953125, + "minimumOsVersion": "13.0", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "39824384", + "sellerUrl": "https://quotekeeper.app", + "averageUserRatingForCurrentVersion": 4.54544999999999976836306814220733940601348876953125, + "userRatingCountForCurrentVersion": 11, + "trackContentRating": "4+", + "trackId": 1480095106, + "trackName": "Quote Keeper", + "genreIds": [ + "6018", + "6017" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Book", + "releaseDate": "2019-10-03T07:00:00Z", + "currentVersionReleaseDate": "2020-06-28T23:37:53Z", + "releaseNotes": "Improved character recognition on scan", + "primaryGenreId": 6018, + "sellerName": "Abhishek Karale", + "description": "Quote Keeper is a way to store and organise any quotes or clippings from your reading.\n\nEasily add entries. Organise by Book, Author, Tags.\n\nAll synced to the cloud so you can access on the iPad, iPhone or Mac\n\nYou can review cards by swiping through them.\n\nFeatures\n- Access on iPhone/iPad/Mac\n- Scan in quotes using camera whilst reading\n- iCloud Sync\n- Local storage\n- Export CSV File/JSON\n- Backup Quotes and Import into app via JSON File \n- Theme Options\n- Autocomplete\n\nIn development:\n- Local Notifications \n- Siri Integration\n- Watch App\n- CSV Importer", + "artistId": 1087945443, + "artistName": "Abhishek Karale", + "genres": [ + "Books", + "Education" + ], + "price": 0.00, + "bundleId": "com.abhishekkarale.QuoteKeeper", + "version": "1.3.1", + "wrapperType": "software", + "userRatingCount": 11 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/forever-entertainment-s-a/id443386079?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/ec/90/6d/ec906d78-d340-0d34-2558-579466e03a43/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/ec/90/6d/ec906d78-d340-0d34-2558-579466e03a43/source/100x100bb.png", + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple2/v4/59/51/dc/5951dc23-6202-b2c7-1107-195070d04b2f/mzl.pjodwagr.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/fe/4f/ef/fe4feff8-5c33-a092-67e2-5da7078a74aa/mzl.fmbcjnaa.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/e3/1e/38/e31e3808-9a35-c499-2e33-d7392dc9461a/mzl.lvzcucxj.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple2/v4/4f/b2/3d/4fb23df2-1900-c454-5f52-339718c4b3b6/mzl.ievqfqfw.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/v4/eb/e3/25/ebe32528-044e-a700-9156-726d1a691294/mzl.marmmbfn.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/ec/90/6d/ec906d78-d340-0d34-2558-579466e03a43/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Teddy Floppy Ear - Mountain Adventure", + "trackViewUrl": "https://apps.apple.com/us/app/teddy-floppy-ear-mountain-adventure/id598947644?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.6.6", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "426994292", + "sellerUrl": "http://games.forever-entertainment.com/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 598947644, + "trackName": "Teddy Floppy Ear - Mountain Adventure", + "genreIds": [ + "6014", + "7002", + "6017" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$3.99", + "primaryGenreName": "Games", + "releaseDate": "2013-02-07T02:16:43Z", + "currentVersionReleaseDate": "2013-02-07T02:16:43Z", + "primaryGenreId": 6014, + "sellerName": "Forever Entertainment S.A.", + "description": "*** Teddy Floppy Ear - Mountain Adventure is also available on iPhone & iPad. ***\n\nSend your kid onto an unforgettable journey with the world’s most charming bear. \n\nBased on a famous polish cartoon, Teddy Floppy Ear stands out as a great entertainment for our younglings. Prepared by an experienced team, Teddy Floppy Ear – Mountain Adventure mixes entertaining adventure game with a healthy dose of learning. In this episode our main character goes onto an extended visit to his uncle, a painter, who's living deep in the mountains. There he goes on a field trip on which he learns basics of art, color mixing, shape recognition and many more. During these travels he solves numerous mini-games to keep him entertained. Beautiful hand-painted graphics, soothing music, entertaining and violence free story keep your child occupied for hours. \n\nFeatures: \n- A dozen of colorful locations \n- Educational value \n- Great for even the youngest kids \n- Absolutely no violence \n- Numerous mini-games for variety \n- Soothing music \n- Famous Teddy Floppy Ear \n\nWatch the trailer video: http://www.youtube.com/watch?v=63hDhFcbam0 \nFollow us on Twitter: www.twitter.com/foreverentert \nLike us on Facebook: www.facebook.com/foreverentert \nWatch our YT Channel: www.youtube.com/foreverentert", + "artistId": 443386079, + "artistName": "Forever Entertainment S.A.", + "genres": [ + "Games", + "Adventure", + "Education" + ], + "price": 3.99, + "bundleId": "com.forever-entertainment.tfemamac", + "version": "1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/wala-bear-inc/id1455604117?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/66/dc/d6/66dcd63e-5482-b12e-6ade-179801aac833/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/66/dc/d6/66dcd63e-5482-b12e-6ade-179801aac833/source/100x100bb.png", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/10/a4/cc/10a4cc55-02b4-e298-7631-3a4e6197795a/mzl.nxxvsnht.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/7f/de/02/7fde022f-51cb-7db0-960a-d49f2bd4a8cd/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/d3/58/55/d3585508-0839-dc12-5c53-f86d50bb33e3/mzl.slvmixyw.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/f7/97/ea/f797ea03-9903-245c-51ea-6afa72469a17/mzl.nmzwrusk.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/4f/56/e6/4f56e65f-c209-68a9-c99a-e913a466c927/mzl.lbbiqjev.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/1a/e0/8f/1ae08f9a-ddb8-b46e-5a0f-00e0a0c769e0/mzl.vjbsvejf.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/66/dc/d6/66dcd63e-5482-b12e-6ade-179801aac833/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Good Night Bo: Read-Aloud Book", + "trackViewUrl": "https://apps.apple.com/us/app/good-night-bo-read-aloud-book/id1457988313?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.8", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "33676704", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1457988313, + "trackName": "Good Night Bo: Read-Aloud Book", + "genreIds": [ + "6017", + "6012" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Education", + "releaseDate": "2019-03-31T02:31:33Z", + "currentVersionReleaseDate": "2019-12-30T14:59:16Z", + "releaseNotes": "Minor Bug Fix", + "primaryGenreId": 6017, + "sellerName": "Wala Bear Inc.", + "description": "\"Good Night Bo\" is the cheerful and heartwarming bedtime story book of a baby parrot who loves his friends so much he has to say good night to all! Rich illustrations highlight this charming adventure. Each page is highlighted with interactive features and animations to make you laugh and giggle. Good for both new readers and old alike, \"Good Night Bo\" is perfect for learning the value of friendship while also developing reading skills. It is fully interactive for use with both the Macbooks and iMacs and sure to be a hit with all audiences. \n \n• 100% Kid-Friendly book app (No ads, No in-app purchase, No settings button, No web links).\n• Also Available on iPad and iPhone\n\n------------------------------------\nFEATURES\n------------------------------------\n \n• Interactive Read-Aloud Learning Book for toddlers and little kids\n• Teach children how to read with this heartwarming bedtime story book. \n• Tap, Pull, Pop and Drag objects!\n• Professionally narrated - Children can read along!\n• FUN, INTERACTIVE animations and CUTE sound effects on every page of the book!\n• 100% Kid-Safe design (No ads, No in-app purchase, No settings button, No web links).\n• Easy-to-use navigation buttons.\n• Fun and educational classroom storybook for both boys and girls.\n• Great for Homeschooling parents and teachers.\n• Helps kids learn and study new words and count numbers.\n• Beautifully and colorfully illustrated picture book.\n• Read-to-Me (Narrator) & I-Can-Read (Independent) Modes.\n• Cute Animal Friends in this illustrated children's book - parrot, rhinoceros, cows, rabbits, giraffes, and cats.\n\n------------------------------------\nALSO AVAILABLE\n------------------------------------\n\n• Also Available on iPad and iPhone\n\n------------------------------------\nSUPPORT\n------------------------------------\n\n• https://www.walabear.com\n• Please visit our site for more information.", + "artistId": 1455604117, + "artistName": "Wala Bear Inc.", + "genres": [ + "Education", + "Lifestyle" + ], + "price": 0.00, + "bundleId": "com.walabear.mac.goodnightbo", + "version": "1.5.5", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/greg-chapel/id1517263101?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/6a/ff/e9/6affe9a7-a513-baa4-ee20-40c28c57890e/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/6a/ff/e9/6affe9a7-a513-baa4-ee20-40c28c57890e/source/100x100bb.png", + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/1a/83/7c/1a837cb5-9ff3-5571-3695-4ccfe1c81c82/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/a6/67/ac/a667ace8-5902-b069-c2c3-cc27f373d853/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/ee/1c/21/ee1c21c3-e5e6-e98b-d8d2-e3dbfea12c6f/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/5a/5b/e2/5a5be2df-6f35-7874-8a58-a725a04e0511/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/6a/ff/e9/6affe9a7-a513-baa4-ee20-40c28c57890e/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Scanner Remote", + "trackViewUrl": "https://apps.apple.com/us/app/scanner-remote/id1517263102?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.14", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "4363854", + "sellerUrl": "http://www.gregchapel.com/home", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1517263102, + "trackName": "Scanner Remote", + "genreIds": [ + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Utilities", + "releaseDate": "2020-06-10T07:00:00Z", + "currentVersionReleaseDate": "2020-06-11T20:18:54Z", + "releaseNotes": "The Mac App Store name was spelled wrong on the last submission (Version 1.0.2).. This version (Version 1.0.3) corrects the Mac App Store name to \"Scanner Remote\".", + "primaryGenreId": 6002, + "sellerName": "Greg Chapel", + "description": "Scanner Remote is a remote control application for Uniden BearCat scanners.\n\nJust connect your Uniden BearCat scanner via a USB cable and allow your Mac to control your radio.\n\nScanner Remote makes it easy to control volume, squelch, temporary avoid, mute, and hold channel functions directly from your Mac. \n\nThe application serves as a remote head and displays the current scanner Frequency/TGID, System, Department, Channel, and Current Time. \n\nScanner Remote captures scanner hits and displays a table of Frequency/TGID, System, Department, Channel, and number of times that a Channel is Hit. \n\nThis is a free app that has been tested to work with Uniden BCD536HP, BCD436HP, and SDS100 model scanners. It may also work with Uniden Home Patrol scanners that have USB connections but it has not been tested.", + "artistId": 1517263101, + "artistName": "Greg Chapel", + "genres": [ + "Utilities" + ], + "price": 0.00, + "bundleId": "com.gregchapel.Scanner-Remote", + "version": "1.0.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/jadegame/id285361686?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/d5/f7/0e/d5f70e61-19d8-9a2a-21ef-de51edbab633/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/d5/f7/0e/d5f70e61-19d8-9a2a-21ef-de51edbab633/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple/ab/c2/ca/mzl.qvdupvwb.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple/9a/c6/61/mzl.jiysiuff.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple/be/fc/66/mzl.aanjblyk.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple/fe/8b/e7/mzl.hstnmbbp.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/d5/f7/0e/d5f70e61-19d8-9a2a-21ef-de51edbab633/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Grizzly Retro Platformer", + "trackViewUrl": "https://apps.apple.com/us/app/grizzly-retro-platformer/id413938360?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.10", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "14262585", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 413938360, + "trackName": "Grizzly Retro Platformer", + "genreIds": [ + "6014", + "7001", + "7002", + "6016" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Games", + "releaseDate": "2011-03-24T01:38:12Z", + "currentVersionReleaseDate": "2020-05-27T00:03:19Z", + "releaseNotes": "Bug fixes", + "primaryGenreId": 6014, + "sellerName": "Julien meyer", + "description": "I decided to build this game for long time, as a Donkey-Kong game on SuperNES and multi paralax big fan. Grizzly Adventure is Jadeware's first and most famous platform game complete with over 30 action-packed levels. An evil sorcerer has taken control of Grizzly's forest and driven the creatures completely mad. With the animals under control and the help of a few minions, the sorcerer plans to bring the forest down, but Grizzly's not gonna take it in these woods. Follow Grizzly on his journey through 3 different worlds as he takes on enemies that are out to get him! Goblins, trolls and killer bees will be only some of the many obstacles that will come his way as he tries to reach his quest. Thankfully, mother nature is on his side, and Grizzly can count on a strong ally for food and hidden passageways to trick the beasts. Complete with a groovy soundtrack and some eye-catching graphics, Grizzly is surely the game you have been waiting for to get back to some platform fun!\n\n30 levels of fun + Bonus\n- Forest\n- Green Hill\n- Mines", + "artistId": 285361686, + "artistName": "JadeGame", + "genres": [ + "Games", + "Action", + "Adventure", + "Entertainment" + ], + "price": 0.00, + "bundleId": "com.jadegame.grizzlymac", + "version": "1.6.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/wala-bear-inc/id1455604117?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/a1/8f/f3/a18ff3dc-d3d4-ab66-147a-a47e67062a26/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/a1/8f/f3/a18ff3dc-d3d4-ab66-147a-a47e67062a26/source/100x100bb.png", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/0f/05/11/0f051111-8a0e-e528-c917-26862ead16b5/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/e7/a6/7c/e7a67c92-dc21-8807-0439-db0667910b4d/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/f6/c8/08/f6c8083d-490c-988c-068e-531ea72477db/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/40/e2/8e/40e28e8c-666a-eef9-fb37-8cbf6ecb996d/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/c2/37/fe/c237fee9-51e1-1052-b8e6-a46633119040/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/a1/cd/0f/a1cd0fd2-f92a-7f7a-ea97-b7036e023d20/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/65/f3/2e/65f32e55-953c-14f8-e110-a13c4593bb44/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/a1/8f/f3/a18ff3dc-d3d4-ab66-147a-a47e67062a26/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Pink Rhino - Read-Aloud Book", + "trackViewUrl": "https://apps.apple.com/us/app/pink-rhino-read-aloud-book/id1458278234?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.8", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "43755337", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1458278234, + "trackName": "Pink Rhino - Read-Aloud Book", + "genreIds": [ + "6017", + "6012" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Education", + "releaseDate": "2019-04-01T05:43:47Z", + "currentVersionReleaseDate": "2019-12-30T14:59:29Z", + "releaseNotes": "Minor Bug Fix", + "primaryGenreId": 6017, + "sellerName": "Wala Bear Inc.", + "description": "\"Pink Rhino\" is a beautifully told story of one rhino’s adventures and quest to return home to her family. Helped by her new friends, the pink rhinoceros learns about friendship and family. This fully illustrated children’s read-aloud book is good for both new readers and old alike. \"Pink Rhino\" is also filled with interesting facts about the rhino population and what we can do to help save them. It is fully interactive for use with both the Macbooks and iMacs and sure to be a hit with all audiences. \n \n• 100% Kid-Friendly book app (No ads, No in-app purchase, No settings button, No web links).\n• Also Available on iPad and iPhone\n\n------------------------------------\nFEATURES\n------------------------------------\n \n• Interactive Educational Learning Book for preschool & kindergarten kids\n• Teach children how to read with this heartwarming story. \n• Tap, Pull, Pop and Drag objects!\n• Recommended for preschool & kindergarten students and teachers.\n• Professionally narrated - Children can read along!\n• FUN, INTERACTIVE animations and CUTE sound effects on every page of the book!\n• 100% Kid-Safe design (No ads, No in-app purchase, No settings button, No web links).\n• Easy-to-use navigation buttons.\n• Fun and educational classroom storybook.\n• Great for Homeschooling parents and teachers.\n• Helps kids learn and study new words.\n• Beautifully and colorfully illustrated lessons.\n• Read-to-Me (Narrator) & I-Can-Read (Independent) Modes.\n• Wild Animal Friends in this illustrated children's book - parrot, rhinoceros and zebra.\n\n------------------------------------\nALSO AVAILABLE\n------------------------------------\n\n• Also Available on iPad and iPhone\n\n------------------------------------\nSUPPORT\n------------------------------------\n\n• https://www.walabear.com\n• Please visit our site for more information.", + "artistId": 1455604117, + "artistName": "Wala Bear Inc.", + "genres": [ + "Education", + "Lifestyle" + ], + "price": 0.00, + "bundleId": "com.walabear.mac.pinkrhino2", + "version": "1.5.5", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/wala-bear-inc/id1455604117?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/35/06/15/3506150a-9973-72fb-6858-411f34a552c3/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/35/06/15/3506150a-9973-72fb-6858-411f34a552c3/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/c6/6e/c4/c66ec4a1-2d3d-bf8a-71c6-a8d89b427758/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/ca/1e/2e/ca1e2ea4-1e00-52c1-63f2-c854689c39e3/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/c0/c1/ed/c0c1ed4d-dc1a-1b47-d0f0-9e8924f02b17/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/20/49/1a/20491a6c-9931-1c1b-dab8-e20056c879e1/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/94/58/5d/94585d88-8ce7-d990-d6a6-eeaba47f763f/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/71/14/37/7114374f-808b-bb78-0244-84065162bf16/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/35/06/15/3506150a-9973-72fb-6858-411f34a552c3/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Bundee: Kids Read-Aloud Story", + "trackViewUrl": "https://apps.apple.com/us/app/bundee-kids-read-aloud-story/id1491643588?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.8", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "51271050", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1491643588, + "trackName": "Bundee: Kids Read-Aloud Story", + "genreIds": [ + "6017", + "6016" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Education", + "releaseDate": "2019-12-20T08:00:00Z", + "currentVersionReleaseDate": "2020-08-31T13:52:16Z", + "releaseNotes": "Minor Bug Fix", + "primaryGenreId": 6017, + "sellerName": "Wala Bear Inc.", + "description": "\"Bundee\" is the perfect interactive story to teach your children the value of true friendship and how we should act toward each other. Children will delight as they join Bundee on his quest to find his friend, Bear. It is fully interactive for use with iPhone, iPad and Mac.\n \n• 100% Kid-Friendly Read & Learn app (No ads, No in-app purchase, No settings button, No web links).\n• Also Available on iPad and iPhone\n\n------------------------------------\nFEATURES\n------------------------------------\n \n• Interactive Educational Learning Story for preschool & kindergarten kids\n• Teach children how to read with this heartwarming story. \n• Tap, Pull, Pop and Drag objects!\n• Recommended for preschool & kindergarten students and teachers.\n• Professionally narrated - Children can read along!\n• FUN, INTERACTIVE animations and CUTE sound effects on every page!\n• 100% Kid-Safe design (No ads, No in-app purchase, No settings button, No web links).\n• Easy-to-use navigation buttons.\n• Fun and educational for classrooms.\n• Great for Homeschooling parents and teachers.\n• Helps kids learn and study new words.\n• Beautifully and colorfully illustrated lessons.\n• Read-to-Me (Narrator) & I-Can-Read (Independent) Modes.\n• Wild Animal Friends in this illustrated children's app - Bunnies and Bear.\n\n------------------------------------\nALSO AVAILABLE\n------------------------------------\n\n• Also Available on iPad and iPhone\n\n------------------------------------\nSUPPORT\n------------------------------------\n\n• https://www.walabear.com\n• Please visit our site for more information.", + "artistId": 1455604117, + "artistName": "Wala Bear Inc.", + "genres": [ + "Education", + "Entertainment" + ], + "price": 0.00, + "bundleId": "com.walabear.mac.bundee", + "version": "1.8", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/ivan-korovin/id937929054?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple115/v4/45/79/14/45791478-b673-6d6b-2104-8730ba5d7db7/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple115/v4/45/79/14/45791478-b673-6d6b-2104-8730ba5d7db7/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/eb/0b/53/eb0b533a-b7c8-3ac4-3cf4-2e897106fc37/mzl.gnalpgns.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/81/e4/46/81e446dc-b4d8-0623-80ee-aeb996aa2873/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/47/11/ba/4711bac4-66c5-c85c-2595-ca4afc82e952/mzl.okvzdoqk.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple115/v4/45/79/14/45791478-b673-6d6b-2104-8730ba5d7db7/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Hawkmark", + "trackViewUrl": "https://apps.apple.com/us/app/hawkmark/id1164609712?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.11", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "6179433", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1164609712, + "trackName": "Hawkmark", + "genreIds": [ + "6007", + "6026" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2016-12-21T00:24:17Z", + "currentVersionReleaseDate": "2018-06-29T02:09:40Z", + "releaseNotes": "• Fix of an issue with missing symbols like Emoji or Chinese characters in the Markdown editor pane\n• Minor bug fixes and user interface improvements", + "primaryGenreId": 6007, + "sellerName": "Ivan Korovin", + "description": "> NOTICE: Saving .md files requires PRO In-App Purchase, without it you can use Hawkmark as viewer and Markdown Playground.\n\nHawkmark is a simple Markdown writing app with a dozen of nice features and tools. It helps to create beautiful notes, essays and documentation easily and quickly. Use its power to share your great ideas with the world in a beautiful way!\n\n\n> Be fast like Hawk w/…\n\n* Convenient keyboard shortcuts\n* Stylish Touch Bar buttons ¹\n* Detailed syntax-oriented application menu\n\n\n> Be sharp like Hawk w/…\n\n* Automatic syntax highlighting\n* Line numbers\n* Pane with generated HTML code\n* Beautiful preview with various CSS styles \n\n\n> Be smart like Hawk w/…\n\n* Sophisticated Help with Markdown cheatsheet\n* Encoding and adding images as BASE64 strings (jpg, png, gif)\n* Markdown Tables\n\n\n> Be agile like Hawk w/…\n\n* Customizable Toolbar items\n* Easy printing and PDF export\n* Export to HTML\n\n\n## Playground and PRO\n\nHawkmark Playground is free for all users and provides basic features for working with Markdown texts. \nHawkmark PRO In-App Purchase removes restrictions of the Playground version and includes additional useful tools ²\n• Saving Markdown files\n• Export to HTML\n• iCloud Drive support\n• Coping generated HTML code\n\n\n---\n¹ available on new MacBook Pro with macOS 10.12.2 and later\n² PRO features are already unlocked and available for users who originally had purchased Hawkmark before it switched to IAP model", + "artistId": 937929054, + "artistName": "Ivan Korovin", + "genres": [ + "Productivity", + "Developer Tools" + ], + "price": 0.00, + "bundleId": "com.bravecakes.hawkmark", + "version": "1.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/1games/id347530156?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/e4/05/d1/e405d146-19cc-d06e-b267-98b7df0260b5/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/e4/05/d1/e405d146-19cc-d06e-b267-98b7df0260b5/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/26/c0/54/26c05432-b883-26e5-3834-7f373c826e00/mzl.dmzxrsrc.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple6/v4/5b/37/29/5b372916-9172-69e5-b61e-41dfe99bff15/mzl.zwkldkov.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple4/v4/d9/22/cf/d922cf76-b7b1-dc1d-834a-376e6e7f0af7/mzl.zkrpzrip.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple6/v4/41/1b/fd/411bfdd3-9fe1-f2cf-d2e4-bf852ea27d02/mzl.kuiwiaxo.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/v4/81/24/89/8124897d-f0f3-c160-83e7-6273d2e5cf9d/mzl.smzadadw.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/e4/05/d1/e405d146-19cc-d06e-b267-98b7df0260b5/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Life Of Wolf 2014", + "trackViewUrl": "https://apps.apple.com/us/app/life-of-wolf-2014/id821433201?mt=12&uo=4", + "contentAdvisoryRating": "17+", + "averageUserRating": 0, + "minimumOsVersion": "10.6.6", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "115014264", + "sellerUrl": "http://www.playonegames.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "17+", + "trackId": 821433201, + "trackName": "Life Of Wolf 2014", + "genreIds": [ + "6014", + "6016", + "7015", + "7002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$0.99", + "primaryGenreName": "Games", + "releaseDate": "2014-02-28T07:18:43Z", + "currentVersionReleaseDate": "2014-02-28T07:18:43Z", + "primaryGenreId": 6014, + "sellerName": "1Games", + "description": "It was an encounter of destiny. \n\nI was a wandering wolf. \nIt was until the day when I came across the \nhead of the wolf pack which saved me from \nthe evil group of other wolves. \nThe story of how I fought to become the head \nof the wolf pack starts here. \n\nIt is a game that deals with a story of a \nwandering wolf that enters a wolf pack led by \na head wolf. \nAll the things that the wolf must do amongst \nthe wolf pack are included as mission tasks. \n\nYou will go through a minor test in order to \nbecome a part of the wolf pack as well as \nlearn how to survive/hunt and also learn \nhow to group hunt with fellow wolves. \nThere will be times when you will have to \nfight against strong predators on its own but \nit will fight with fellow wolves when going \nagainst big and strong predators. \nIf you wish you experience the life of a wolf, \nthen this game might just be what you have \nbeen looking for. \n\n*Eating prey \nIf you approach a dead animal after \nsucceeding in hunting, you will eat the prey \nand your vital force will go up. \n\n*Hunting method \nPreys bait warning front. Because you move \nto prey back, you should attack slowly.", + "artistId": 347530156, + "artistName": "1Games", + "genres": [ + "Games", + "Entertainment", + "Simulation", + "Adventure" + ], + "price": 0.99, + "bundleId": "co.kr.1games.LifeOfWolf2014Mac", + "version": "1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/wanderful-inc/id533206719?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple6/v4/fc/a4/b0/fca4b042-8260-6846-1376-6ef5a0aa0eab/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple6/v4/fc/a4/b0/fca4b042-8260-6846-1376-6ef5a0aa0eab/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/d2/91/93/d291931e-1bfb-d6b4-f252-a065a9e2f4d5/mzl.bskdyfnw.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/v4/d1/cd/80/d1cd8052-2e86-ca9e-1380-9f2865f0ba77/mzl.dtnqhhfi.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple2/v4/37/51/51/375151c1-433b-5942-2022-ae1bbe8aa5f7/mzl.wuivaxxr.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple2/v4/7a/f8/cd/7af8cd32-6d51-0d28-34b6-e965d4b003b9/mzl.xukkekdy.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple2/v4/29/30/ec/2930ec04-b906-8a85-5e60-217b38384140/mzl.xcaskssb.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple6/v4/fc/a4/b0/fca4b042-8260-6846-1376-6ef5a0aa0eab/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Berenstain Bears Get In a Fight", + "trackViewUrl": "https://apps.apple.com/us/app/berenstain-bears-get-in-a-fight/id612122909?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.6", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "186563186", + "sellerUrl": "http://wanderfulstorybooks.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 612122909, + "trackName": "Berenstain Bears Get In a Fight", + "genreIds": [ + "6017" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$9.99", + "primaryGenreName": "Education", + "releaseDate": "2013-04-04T01:35:19Z", + "currentVersionReleaseDate": "2013-11-05T00:14:24Z", + "releaseNotes": "Corrected issue that users running Mac OS X 10.6 encountered. Users running Mac OS X 10.7 or later were not affected.", + "primaryGenreId": 6017, + "sellerName": "Wanderful, Inc.", + "description": "• Winner of a 2013 PARENTS’ CHOICE Gold Honor Award \n• An interactive animated storybook originally published as the award-winning Living Books \n• A tale of how sibling arguments can sometimes escalate, and how they can be resolved\n• Educational Volume Discount now available\n\nReview: \nThe thought and creativity that was put into the interactivity in Berenstain Bears Get Into a Fight is largely unmatched in any other interactive book. When you combine that with a classic Berenstain Bears children's book you have a complete winner. \n\nThis is one of the best storybook apps available for young children, and there are few people of any age that would not enjoy it. Like Wanderful's other apps, Berenstain Bears Get Into a Fight offers great creativity with a wonderful sense of humanity and heart that transcends age. Multi-lingual families can enjoy the story in either Spanish or Portuguese.\" \n\n- Tim Leverett ©2013 Parents' Choice\n\nHave you ever wished you could play inside a story and really interact with all the characters and words? Now you can! The Berenstain Bears Get In A Fight is an imaginative interactive reading experience with fully animated content featuring the popular Bear Family - Mama Bear, Papa Bear, Brother Bear, and Sister Bear.\n\nWanderful brings every page of this Stan and Jan Berenstain story to life. Read and play along with Brother and Sister as a little morning grumpiness turns into an all-day fight. Even a noisy storm can't stop them from arguing and fighting. Do they even remember why they are fighting? Can anything make them stop? Useful for children of all ages, this story teaches lessons on avoiding arguments and disagreements.\n\nKEY FEATURES:\n• Interactive storybook in English, Spanish and Brazilian Portuguese \n• Change language from any page in the story\n• 12 fully animated pages\n• Virtually every item on each page comes to life when clicked\n• All words are \"active\" for extended word play and language learning - click on any word to hear it spoken\n• A hidden surprise is on each page - can you find \"Buzzy\" the bee?\n• Move between pages with the new scrolling page navigation\n• Two modes: \"Read to Me\" and the fully interactive \"Let Me Play\"\n• Multiple settings to further customize the App for your child's reading experience\n• Special \"About the Authors\" video profiling Jan and Stan Berenstain available from within the App\n• Parental tips to help you get the most out of this Wanderful interactive storybook\n• Teacher resources include a 32 page overview of Wanderful interactive storybooks Classroom Activities and the full 57 page Get In A Fight Classroom Activities guide (English)\n\nWanderful's goal is to help children discover a lasting love of language through story exploration. We hope The Berenstain Bears Get In A Fight provides your family, children and students with hours of delightful story play.\n\nThe Berenstain Bears Get In A Fight is by Stan and Jan Berenstain, authors of over 200 books starring the Bear family: Mama, Papa, Brother and Sister.\n\nPrivacy Disclosure\nWanderful creates engaging interactive storybooks for children that are educational, fun, and above all safe and appropriate. This app:\n• does not collect any information\n• does not contain ads\n• does not contain in-app purchases, but has links to other Wanderful Apps\n• includes active links to websites or social networks, but ONLY from the PARENTS and TEACHERS pages, not from the storybook pages", + "artistId": 533206719, + "artistName": "Wanderful, Inc.", + "genres": [ + "Education" + ], + "price": 9.99, + "bundleId": "com.wanderfulstorybooks.osx.InAFight", + "version": "1.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/furkan-sonmez/id821670888?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple91/v4/04/fa/6a/04fa6a21-a08c-6838-e48d-85ebe5dee3ff/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple91/v4/04/fa/6a/04fa6a21-a08c-6838-e48d-85ebe5dee3ff/source/100x100bb.png", + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple71/v4/fc/c9/d5/fcc9d566-9a1e-297a-31d0-5b156b3aff58/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple62/v4/48/81/dd/4881dd62-c6b4-d945-88a0-bdbc13300d56/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple71/v4/86/eb/7f/86eb7ff6-f8a3-e0c0-0d21-f92a73bdd55b/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple91/v4/04/fa/6a/04fa6a21-a08c-6838-e48d-85ebe5dee3ff/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Dress Up Bear", + "trackViewUrl": "https://apps.apple.com/us/app/dress-up-bear/id1150538527?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.7", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "17566306", + "sellerUrl": "http://www.myarcadegames.net", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1150538527, + "trackName": "Dress Up Bear", + "genreIds": [ + "6014", + "6012" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$0.99", + "primaryGenreName": "Games", + "releaseDate": "2016-09-15T08:15:55Z", + "currentVersionReleaseDate": "2016-09-15T08:15:55Z", + "releaseNotes": "Bug Fix", + "primaryGenreId": 6014, + "sellerName": "Furkan Sonmez", + "description": "A very simple dress up game for kids, with cute HD objects and girl to dress up \n\nKids will love to dress up their very own pet using more then 50 different items. Just drag and drop the items at the desired spot and let your dress up book glow.", + "artistId": 821670888, + "artistName": "Furkan Sonmez", + "genres": [ + "Games", + "Lifestyle" + ], + "price": 0.99, + "bundleId": "com.boogygames.dressupbear", + "version": "1.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/microids/id433861351?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/c2/83/fb/c283fbd4-f36b-a5c2-85e7-48e62d1c40bd/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/c2/83/fb/c283fbd4-f36b-a5c2-85e7-48e62d1c40bd/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple/f9/49/fc/mzl.gnqsfqrz.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/17/49/0c/mzl.qjglysxr.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/12/cc/04/mzl.xvpbbysp.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple/21/cc/81/mzl.oioqdaun.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple/f4/81/69/mzl.obkcqqug.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/c2/83/fb/c283fbd4-f36b-a5c2-85e7-48e62d1c40bd/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Secret of the Lost Cavern", + "trackViewUrl": "https://apps.apple.com/us/app/secret-of-the-lost-cavern/id414018522?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.5", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "EL", + "IT", + "PL", + "RU", + "ES" + ], + "fileSizeBytes": "1623342426", + "sellerUrl": "http://itunes.apple.com/en/artist/microids/id433861351", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 414018522, + "trackName": "Secret of the Lost Cavern", + "genreIds": [ + "6014", + "7002", + "7014" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$9.99", + "primaryGenreName": "Games", + "releaseDate": "2011-03-05T01:59:54Z", + "currentVersionReleaseDate": "2013-11-23T03:48:36Z", + "releaseNotes": "- Optimized for MacOS X 10.9", + "primaryGenreId": 6014, + "sellerName": "microids", + "description": "In 15,000 B.C., strange symbols found while hunting remind Arok of an encounter with a charismatic traveler a long time ago. In order for him to find his long-forgotten friend, the most brilliant painter of Prehistoric times, Arok begins a long and perilous journey. \n\nPlay as Arok and enter a fascinating and bewitching Stone Age adventure. Learn about Prehistoric life, follow the path of your mentor and work with him to recreate the paintings of the renowned Lascaux Cave. \nVenture through a wild time and decipher the symbols left by our ancestors. Hunt, fish, cut stones, paint animated frescoes and take part in mysterious shamanist ceremonies to win your place among the Lascaux Cave artist tribe. \n\nWill you be able to come through our ancestors’ secrets and survive in this wild and harsh world? \n\nFeatures: \n- By the developers of the highly acclaimed adventure game “Return to Mysterious Island” inspired by the Jules Verne Classic. \n- Hyper-realistic graphics and amazing environments including rivers, green valleys, troglodyte caves… \n- Wild animals and many prehistoric characters to interact with in order to achieve your quest. \n- Original soundtrack and sound effects creating an immersive atmosphere. \n- An integrated encyclopaedia created in collaboration with a renowned specialist to learn all the ways, customs and techniques of the prehistoric period. \n- Video, texts and voices in english, french, german, italian and spanish \n\nDON'T FORGET TO CHECK OUT OUR OTHER FANTASTIC ADVENTURE GAMES! \n\nOn Mac, iPad, iPhone: \nNicolas Eymerich Inquisitor - Book 1: The Plague \nAmerzone The Explorer's Legacy \nAtlantis 2: Beyond Atlantis \nAtlantis 3: The New World \nAtlantis 4: Evolution \nAtlantis 5: The Secrets of Atlantis - The Sacred Legacy \nAztec The Curse in the Heart of the City of Gold \nDracula 1: Resurrection \nDracula 2: The Last Sanctuary \nDracula 3: The Path of the Dragon \nDracula 4: The Shadow Of The Dragon \nEgypt 2: The Heliopolis Prophecy \nEgypt 3: The Prophecy \nJules Verne's Journey to the center of the moon \nJules Verne's Mystery of the Nautilus \nJules Verne's Return to Mysterious Island \nJules Verne's Return to Mysterious Island 2 \nLouvre The Messenger \nNecronomicon: The Dawning of Darkness \nNostradamus The Last Prophecy \nRoad to India Between Hell and Nirvana \nNicolas Eymerich Inquisitor - Book 1: The Plague \nVersailles 2 \n\nOnly on Mac: \nStill Life 2 - Director's Cut \n\nFOLLOW US \nMICROIDS \nOn twitter.com/microids_off \nOn facebook.com/microids \nOn microids.com/en \n\nANUMAN INTERACTIVE \nOn twitter.com/anumani \nOn facebook.com/anuman.fr \nOn anuman-interactive.com", + "artistId": 433861351, + "artistName": "Microids", + "genres": [ + "Games", + "Adventure", + "Role Playing" + ], + "price": 9.99, + "bundleId": "com.coladia.SecretOfTheLostCavern", + "version": "1.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/wanderful-inc/id533206719?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple4/v4/5a/fb/81/5afb8182-8161-bb51-8e1a-75af8aad622c/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple4/v4/5a/fb/81/5afb8182-8161-bb51-8e1a-75af8aad622c/source/100x100bb.png", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple2/v4/cb/bc/80/cbbc80b4-aa6d-501d-bbbd-c9f0740f35a4/mzl.jcmjhzqj.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple2/v4/84/c8/4a/84c84a65-5951-e64a-dccd-9a93f0cb5d30/mzl.ksjyvkru.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/ea/87/1a/ea871aea-8a31-32be-0ac2-95b7c85576c9/mzl.mopiaklt.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple2/v4/3c/32/8b/3c328b60-dfe8-f093-8195-0982d273d05d/mzl.dlkqauaf.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple/v4/f4/27/4b/f4274b35-9d97-aa78-2ec5-1ee30331398b/mzl.upyexogm.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple4/v4/5a/fb/81/5afb8182-8161-bb51-8e1a-75af8aad622c/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Berenstain Bears In the Dark", + "trackViewUrl": "https://apps.apple.com/us/app/berenstain-bears-in-the-dark/id612126526?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.6", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "141675129", + "sellerUrl": "http://wanderfulstorybooks.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 612126526, + "trackName": "Berenstain Bears In the Dark", + "genreIds": [ + "6017" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$9.99", + "primaryGenreName": "Education", + "releaseDate": "2013-04-04T01:35:31Z", + "currentVersionReleaseDate": "2013-11-04T23:07:41Z", + "releaseNotes": "Corrected issue that users running Mac OS X 10.6 encountered. Users running Mac OS X 10.7 or later were not affected.", + "primaryGenreId": 6017, + "sellerName": "Wanderful, Inc.", + "description": "• Winner of a 2013 PARENTS’ CHOICE Gold Honor Award\n• An interactive animated storybook originally published by the award-winning Living Books\n• A tale of taking charge of one's imagination, especially when it makes you afraid of the dark\n• Educational Volume Discount now available\n\nReview:\n\"Parents for two generations are familiar with the late Stan and Jan Berenstain's Bears and their over 200 books. Wanderful enlivens those classic stories, creating a rich resource for developing reading skills in an animated interactive app. Our child testers laughed at comic elements and groaned at others, such as a dancing book piping in to say \"Hey! Check me out!\" All ages intuitively grasped navigation of the app, although teacher/parent familiarization with the content rich resource options and customizable settings will go a long way toward optimizing skill development and individualized interface.\n\nAll words are \"active\" in the 'Let Me Play\" mode so a child can tap on an individual word which is then highlighted and pronounced. We had fun making silly sentences with chosen words and word recognition was mastered in child-driven play.\n \nWanderful offers a superb level of interaction with a well-designed app loaded with varying levels of skill development and simple fun appropriate for eager 2 year olds up to age 8.\"\n\n- Parents' Choice ©2013 Parents' Choice \n\nHave you ever wished you could play inside a story and really interact with all the characters and words? Now you can! The Berenstain Bears In the Dark is an imaginative interactive reading experience with fully animated content featuring the popular Bear Family - Mama Bear, Papa Bear, Brother Bear, and Sister Bear.\n\nThis timeless Stan and Jan Berenstain story springs to life on every page. Read and play along as a spooky story Brother Bear reads to Sister Bear keeps her - and eventually the entire family - up all night long. The next day Papa shows Sister how to take charge of her imagination and in the end it's Brother who is a little afraid in the dark. \n\nKEY FEATURES:\n• App and all story content is in English \n• 12 fully animated pages\n• Virtually every item on each page comes to life when clicked\n• All words are \"active\" for extended word play and language learning - click on any word to hear it spoken\n• A hidden surprise is on each page - can you find all the lightning bugs?\n• Move between pages with the new scrolling page navigation\n• Two modes: \"Read to Me\" and the fully interactive \"Let Me Play\"\n• Multiple settings to further customize the App for your child's reading experience\n• Special \"About the Authors\" video profiling Jan and Stan Berenstain available from within the App\n• Parental tips to help you get the most out of this Wanderful interactive storybook\n• Teacher resources include a 32 page overview of Wanderful interactive storybooks Classroom Activities and the full 65 page In The Dark Classroom Activities guide (English)\n\nWanderful's goal is to help children discover a lasting love of language through story exploration. We hope The Berenstain Bears In The Dark provides your family, children and students with hours of delightful story play. \n\nThe Berenstain Bears In The Dark is by Stan and Jan Berenstain, authors of over 200 books starring the Bear family: Mama, Papa, Brother and Sister.\n\nPrivacy Disclosure\nWanderful creates engaging interactive storybooks for children that are educational, fun, and above all safe and appropriate. This app:\n• does not collect any information\n• does not contain ads\n• does not contain in-app purchases, but has links to other Wanderful Apps\n• includes active links to websites or social networks, but ONLY from the PARENTS and TEACHERS pages, not from the storybook pages", + "artistId": 533206719, + "artistName": "Wanderful, Inc.", + "genres": [ + "Education" + ], + "price": 9.99, + "bundleId": "com.wanderfulstorybooks.osx.InTheDark", + "version": "1.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/paragon-technologie-gmbh/id286763421?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/22/90/de/2290de42-8592-e023-866a-3c700d9ac8c1/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/22/90/de/2290de42-8592-e023-866a-3c700d9ac8c1/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple111/v4/cf/2d/40/cf2d401e-1bd0-de76-c959-8b85e5cca71d/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple122/v4/a5/51/a9/a551a960-66b2-fa22-f28c-9bdd1866f5af/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple122/v4/30/16/53/301653bf-e7f2-07e9-5652-6da5a3db3e9d/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple111/v4/95/22/18/95221827-76de-1ff1-0a2e-24b1e96ab15e/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple111/v4/91/39/07/91390708-6416-e86e-f986-c4a501ee061b/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/22/90/de/2290de42-8592-e023-866a-3c700d9ac8c1/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Irish <> English Dictionaries", + "trackViewUrl": "https://apps.apple.com/us/app/irish-english-dictionaries/id638178026?mt=12&uo=4", + "contentAdvisoryRating": "12+", + "averageUserRating": 0, + "minimumOsVersion": "10.9", + "languageCodesISO2A": [ + "AR", + "EN", + "FR", + "DE", + "IT", + "RU", + "ES", + "TR" + ], + "fileSizeBytes": "25881443", + "sellerUrl": "http://slovoed.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "12+", + "trackId": 638178026, + "trackName": "Irish <> English Dictionaries", + "genreIds": [ + "6006", + "6017" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Reference", + "releaseDate": "2013-06-03T14:08:54Z", + "currentVersionReleaseDate": "2018-10-29T06:11:04Z", + "releaseNotes": "macOS Mojave support", + "primaryGenreId": 6006, + "sellerName": "Paragon Technologie GmbH", + "description": "Irish-English and English-Irish dictionaries available for in-app purchase\nFull wordlist and 100 sample translations of each dictionary are available to preview before buying\n_____\n\nThe app allows you to easily and quickly navigate through and try out any dictionaries, as well as experience the most advanced search, learning and translation features.\n\nNow you can make sure that a dictionary complies with your language level and contains all words you need before purchase. Full-fledged versions are available for buying with the in-app dictionary catalog.\n\nSearch and translate features:\n\n• Search through dictionary headwords\n• List of similar words in case of misspelling\n• Wildcard Search if you are unsure of the exact word spelling. Use “?” and “*” symbols to replace the missing letters\n• English morphology module helps to translate words in any grammatical form\n• Look up from other applications - while working in other applications you can easily and quickly look up any desired word without leaving that application\n• Search through Favorites\n• Search history - while you are using the dictionary, it saves all looked up and viewed words/phrases in the History\n\nLearning features:\n\n• English audio pronunciations recorded by native speakers\n• English irregular verbs\n• English word forms\n\nInterface features:\n\n• Quick access to virtual keyboard\n• Synchronization of dictionary language with the keyboard input source\n• Favorites - to quickly access frequently searched words\n• Enlarge or reduce font size for your comfort\n\nDictionary compatibility: Mac OS 10.7 (Lion) and higher\n_____\n\nAbout Focalbeo\n\nThe Focalbeo dictionary is the product of several years of comprehensive research. At this stage it is a comprehensive and definitive English-Irish-English Dictionary. It consists of an English-Irish dictionary and a reverse Irish-English dictionary that work together to provide fast and accurate Irish language translation.\nIt is primarily intended for use on mobile phones and it is an invaluable utility for people with a reasonable knowledge of Irish. As the screenspace on mobile phones is limited in most cases it is designed to appear clear and uncluttered on these devices. It works on all mobile platforms and on PCs/Macs. This dictionary was designed and built from the ground up and it innovative in many respects.\nThe advanced version of the dictionary contains a combined total of 199,353 headword translations. It is the most comprehensive Irish dictionary in terms of headword count, new words and terminology available at present.", + "artistId": 286763421, + "artistName": "Paragon Technologie GmbH", + "genres": [ + "Reference", + "Education" + ], + "price": 0.00, + "bundleId": "com.slovoed.focalbeo-mac-inapp", + "version": "8.7.556", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/gluten-free-games/id698937431?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple/v4/49/ff/1b/49ff1b07-360c-a391-16c2-12d0f54c01bb/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple/v4/49/ff/1b/49ff1b07-360c-a391-16c2-12d0f54c01bb/source/100x100bb.png", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple6/v4/73/bd/e3/73bde332-43dc-cf22-4c9e-85133647dd90/mzl.jkgtvypq.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple6/v4/62/51/a0/6251a056-3452-5e3c-2b08-67be13f59d08/mzl.mvjuaxwm.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple6/v4/d2/ac/1e/d2ac1ea3-94f1-9998-14cb-dff24005922a/mzl.wimhxaxk.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple/v4/49/ff/1b/49ff1b07-360c-a391-16c2-12d0f54c01bb/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Build A Teddy Bear", + "trackViewUrl": "https://apps.apple.com/us/app/build-a-teddy-bear/id792252100?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.6.6", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "25549418", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 792252100, + "trackName": "Build A Teddy Bear", + "genreIds": [ + "6014", + "6016", + "7009" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$0.99", + "primaryGenreName": "Games", + "releaseDate": "2014-01-07T03:03:52Z", + "currentVersionReleaseDate": "2014-01-07T03:03:52Z", + "primaryGenreId": 6014, + "sellerName": "Gluten Free Games LLC", + "description": "Design and dress up your very own stuffed bear with Build a Teddy Bear! Everyone remembers their very first childhood teddy bear. Soft and cuddly, always there to keep you safe when you fall asleep at night. Now your kids can customize a bear of their own! \n\nGet Build a Teddy Bear today while it's 50% OFF for a very limited time!\n\nWORKSHOP FEATURES:\n+ 10 UNIQUE FABRICS - Build your very own teddy bear to love forever!\n+ 100's OF COMBINATIONS - Funny hats, adorable outfits, silly faces and much more!\n+ SAVE YOUR FAVORITES - Save up to 5 of your favorite teddies!\n+ KID FRIENDLY FUN - An easy-to-use family game for all ages!\n+ HD GRAPHICS - Stunning high definition interface!\n\nDownload Build a Teddy Bear and make your very own cute and cuddly teddy to love forever!\n\nBig thanks to Kevin MacLeod for providing great music:\nMining by Moonlight by Kevin MacLeod (Incompetech.com)", + "artistId": 698937431, + "artistName": "Gluten Free Games", + "genres": [ + "Games", + "Entertainment", + "Family" + ], + "price": 0.99, + "bundleId": "com.glutenfreegames.buildabearmac", + "version": "1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/hyperjeff-inc/id426618328?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/4e/fa/a5/4efaa532-b99f-29bd-554e-d30bb7414bea/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/4e/fa/a5/4efaa532-b99f-29bd-554e-d30bb7414bea/source/100x100bb.png", + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/6b/9b/32/6b9b32b9-460f-e567-91cd-4809879e637e/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/c5/97/f9/c597f9eb-c292-d6b2-352e-716c3e476f51/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/01/be/50/01be50b9-580f-400c-f12b-6e8146857684/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/1d/8c/be/1d8cbe9a-452b-87d6-4cea-384db51d1b5b/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/ab/49/b0/ab49b094-3db1-2ae6-0fb2-92dbd7d9c12a/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/12/10/57/12105764-a06e-f728-acc9-97baceb784a5/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/4e/fa/a5/4efaa532-b99f-29bd-554e-d30bb7414bea/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Reggy Bear", + "trackViewUrl": "https://apps.apple.com/us/app/reggy-bear/id1481784692?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.13", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "6634059", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1481784692, + "trackName": "Reggy Bear", + "genreIds": [ + "6026", + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "$3.99", + "primaryGenreName": "Developer Tools", + "releaseDate": "2020-01-31T08:00:00Z", + "currentVersionReleaseDate": "2020-01-31T23:39:33Z", + "primaryGenreId": 6026, + "sellerName": "HyperJeff, Inc", + "description": "Reggy Bear provides a modern, elegant environment for exploring and testing regular expressions.\n\nThere are many regex testers out there, but this one is designed to be especially nice for Mac coders. Each regular expression can be saved individually, along with text examples and notes. Save them with your projects, version them as they evolve over time, and pass them around.\n\nIt makes using patterns effortless in any language, even ones that require escaping elements for use in strings, as in Swift and Objective-C.\n\nReggy Bear features:\n\n» Save regex, text, and notes together\n» Scope-based colorization\n» Contextual input menu of common syntax\n» Detailed match results\n» Copy/paste shortcuts\n» Unicode support\n» Multiline regex support\n» Persistent edit history\n» File editing\n» File/folder renaming\n» Dark mode support\n\nYou can also use Reggy Bear to directly edit text, files, and even use it as a sophisticated file renamer (with undo!). And you can save your favorite hard-won regex for the future.\n\nYou can use saved files to effectively give you a unit test set for every regex. You can then improve and expand your formulas without losing any progress you've made.", + "artistId": 426618328, + "artistName": "HyperJeff, Inc", + "genres": [ + "Developer Tools", + "Utilities" + ], + "price": 3.99, + "bundleId": "com.hyperjeff.reggybear", + "version": "1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/koji-murata/id875202476?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/ef/6a/bb/ef6abbab-ce04-d465-e52f-6dd1e9bcf71e/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/ef/6a/bb/ef6abbab-ce04-d465-e52f-6dd1e9bcf71e/source/100x100bb.png", + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/ef/ad/ec/efadecd1-4555-e116-0b5f-734a7e449f3f/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/ef/6a/bb/ef6abbab-ce04-d465-e52f-6dd1e9bcf71e/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "trackCensoredName": "Annay", + "trackViewUrl": "https://apps.apple.com/us/app/annay/id1377999007?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "minimumOsVersion": "10.14", + "languageCodesISO2A": [ + "EN", + "JA" + ], + "fileSizeBytes": "11577942", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "trackId": 1377999007, + "trackName": "Annay", + "genreIds": [ + "6007", + "6002" + ], + "isVppDeviceBasedLicensingEnabled": true, + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2019-03-26T04:27:19Z", + "currentVersionReleaseDate": "2019-08-01T22:44:11Z", + "releaseNotes": "- Change default CSS\n- Select File Type\n- CSS File monitor\n- Crash", + "primaryGenreId": 6007, + "sellerName": "Koji Murata", + "description": "Annay is a note application with Markdwon.\nThis is made for the following people.\n\n- Note data should not go to the server\n- I want to use Dropbox or Box Sync for synchronization\n- I want to change the synchronization destination for private and for business\n- I do not want to touch the mouse\n- I want to use natively-made apps\n- I want to use an open source app\n\nAnnay is an MIT licensed open source software.\nI am waiting for the Pull Request!\nhttps://github.com/malt03/annay\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "artistId": 875202476, + "artistName": "Koji Murata", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "org.annay", + "version": "1.2.3", + "wrapperType": "software", + "userRatingCount": 0 + } + ] + } diff --git a/MasKitTests/JSON/search/deliveries.json b/MasKitTests/JSON/search/deliveries.json new file mode 100644 index 000000000..8bd9a1ee1 --- /dev/null +++ b/MasKitTests/JSON/search/deliveries.json @@ -0,0 +1,2059 @@ +{ + "resultCount": 30, + "results": [ + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/0e/48/c3/0e48c31c-e417-2d5c-c801-c6653361b179/mzl.jsphygfe.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/1b/ab/9b/1bab9b1f-0369-ead4-7b5f-a5cfd58b5898/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/72/8f/ba/728fba08-7b37-a609-3cb8-91f6563d25b4/mzl.tunlcyty.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/48/b1/56/48b15626-c15f-e2f9-b24f-65fa33c4ef95/mzl.ujpwilsx.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/c0/d2/26/c0d226a7-8c86-d780-dd63-c95c63d32fe0/mzl.oqtrdume.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/1b/f7/fe/1bf7fe65-58fa-d633-ec58-7e19c4df9645/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/junecloud-llc/id290986016?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/1b/f7/fe/1bf7fe65-58fa-d633-ec58-7e19c4df9645/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/1b/f7/fe/1bf7fe65-58fa-d633-ec58-7e19c4df9645/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "21318737", + "sellerUrl": "https://junecloud.com/software/mac/deliveries.html", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "JA" + ], + "trackId": 924726344, + "trackName": "Deliveries 3", + "minimumOsVersion": "10.11", + "formattedPrice": "$4.99", + "primaryGenreName": "Utilities", + "releaseDate": "2014-10-16T23:55:17Z", + "genreIds": [ + "6002", + "6007" + ], + "releaseNotes": "• Improved results for La Poste, Apple, and Amazon.\n• Improved link detection for Post Austria.\n• Improved HLG tracking number detection.\n• Updated for compatibility with future service updates.", + "currentVersionReleaseDate": "2020-05-28T00:41:27Z", + "sellerName": "Junecloud LLC", + "primaryGenreId": 6002, + "trackCensoredName": "Deliveries 3", + "trackViewUrl": "https://apps.apple.com/us/app/deliveries-3/id924726344?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "3.2.3", + "wrapperType": "software", + "artistId": 290986016, + "artistName": "Junecloud LLC", + "genres": [ + "Utilities", + "Productivity" + ], + "price": 4.99, + "description": "Deliveries helps you keep track of all your packages, so you always know when they’re going to arrive. Whether it's the latest gadget you've preordered online, or a new graphic novel you can't wait to dive into, Deliveries will keep tabs on it so you don't miss the doorbell.\n\nThe main list shows a summary of all your shipments and counts down the days. Select a delivery for more information, and see where it is on a map. If you like you can view the shipping company’s web page, or easily share your shipment over email, iMessage, or AirDrop. Deliveries can even add estimated delivery dates to your calendar, and a Notification Center widget lets you quickly check your packages without opening the app. All your old deliveries are archived so you can look them up again if you need to.\n\nDeliveries supports dozens of services, including UPS, FedEx, US Postal Service, DHL, TNT, Canada Post, and many more. You can also track orders from services like Amazon and Apple, even before they ship. (Some services are limited to specific countries—visit junecloud.com/services for details.) If you have packages from other services, just select “Other” and enter a delivery date and web site—so you can check on them when you need to and still keep everything in one place.\n\nDeliveries is also available for iOS, in a Universal app that supports iPhone and iPad. You can sync your deliveries between devices with iCloud or our own Junecloud sync. If you create a Junecloud account, you can add new shipments from any web browser.\n\nHave any questions? Just visit junecloud.com/sync and click Help.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.junecloud.mac.Deliveries", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/af/23/20/af23205b-b8e9-930e-e480-95434f77126e/mzl.shybmjhx.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/75/75/9a/75759a19-6d96-441e-a65f-3939aa1899f7/mzl.mdkxocml.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/b5/9d/50/b59d5011-6536-768b-19cd-2796d6caa9ae/mzl.fiuqtcrx.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/6c/20/ff/6c20ffe9-75ae-0dbf-43f8-e68c694b60c4/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/2a/fa/b4/2afab42a-cbf1-36f1-bbf5-3b692cd4d295/mzl.wpqkckju.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/26/c3/d226c3a1-8d78-e611-eb82-403004c04624/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/ivan-pavlov-pty-ltd/id375311513?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/26/c3/d226c3a1-8d78-e611-eb82-403004c04624/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/26/c3/d226c3a1-8d78-e611-eb82-403004c04624/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "4457753", + "sellerUrl": "https://parcelapp.net", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "CA", + "DA", + "NL", + "EN", + "FI", + "FR", + "DE", + "IT", + "JA", + "PL", + "PT", + "RU", + "ES", + "SV", + "UK" + ], + "trackId": 639968404, + "trackName": "Parcel - Delivery Tracking", + "minimumOsVersion": "10.13", + "formattedPrice": "Free", + "primaryGenreName": "Utilities", + "releaseDate": "2013-05-05T23:58:12Z", + "genreIds": [ + "6002", + "6006" + ], + "releaseNotes": "Delivery Descriptions for Amazon Packages Added Using Parcel Email\n\nIf you are using our Parcel Email service to get Amazon deliveries added automatically to the app, you have probably noticed that they no longer have proper descriptions like they used to.\n\nThis is because Amazon no longer provides order descriptions in its emails.\n\nWith this update, if you select a delivery from Amazon that was added using Parcel Email (with an order number in its name), you will see the option to sign in to Amazon. If you sign in, all future deliveries like that will be renamed automatically on your device.\n\nPlease note that your credentials are not saved in the app and are not sent anywhere else. It is a safe feature from a security point of view.\n\nIf you have not previously used Parcel Email, here is more information about it:\nhttps://parcelapp.net/parcel-email.html", + "currentVersionReleaseDate": "2020-06-27T02:37:12Z", + "sellerName": "Ivan Pavlov Pty Ltd", + "primaryGenreId": 6002, + "trackCensoredName": "Parcel - Delivery Tracking", + "trackViewUrl": "https://apps.apple.com/us/app/parcel-delivery-tracking/id639968404?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "6.4", + "wrapperType": "software", + "artistId": 375311513, + "artistName": "Ivan Pavlov Pty Ltd", + "genres": [ + "Utilities", + "Reference" + ], + "price": 0.00, + "description": "With this application you can promptly access tracking information for 300 delivery services, including UPS, USPS, FedEx, DHL, TNT, LaserShip, Aramex, OnTrac, China Post, SingPost and many other postal services. Full list of supported carriers is available at: http://parcelapp.net/#services \n\nTracking data is collected on our server, so you will get it right to your device with a click of a button. With unique carrier automatic recognition function, adding new delivery is just a matter of seconds. \n\nPush notifications provided by Parcel are more convenient than from any other app. They arrive simultaneously on your Mac and iOS devices. You can also locate your delivery on the map or manage your deliveries using Web Access (web.parcelapp.net) - easy and simple.\n\nParcel utilizes the power of macOS to provide you the best possible user experience. You can use Spotlight to look for your deliveries and widget to add new deliveries or see expected deliveries for today or tomorrow (when there is an estimated delivery date available).\n\nParcel for iOS can be downloaded for free in the iOS App Store.\n\nPlease use the same Parcel account on all Mac and iOS devices to sync your purchases and deliveries.\n\nSome features, such as push notifications and tracking more than 3 deliveries are limited to premium subscribers. Current price for the premium subscription is $2.99 per year, and may vary from country to country. Parcel's privacy policy, as well as subscription terms are available at https://parcelapp.net/privacy-with-terms.html.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.mr-brightside.ParcelOSX", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/1d/65/f7/1d65f785-f729-6fd4-b339-e60b5cba8f0a/efc94b1e-3e36-455b-9b31-b7e7773336ce_1_Settings_New_Resized.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/3c/ed/c7/3cedc734-a5d7-33ba-544f-e53acd4e0bf8/e1c37373-8bf7-45c8-8cbf-e99fe383dce6_2_Custom_LUT_NEW_Resized.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/d9/eb/b0/d9ebb0e0-c6a9-0f57-c5f1-d281f9b2a33e/4c256a5a-1981-4118-a02d-90098c8aae62_4_Captions_NEW_Resized.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/d6/c0/ee/d6c0ee24-b720-f876-8864-1ad6c32a1af3/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/apple/id284417353?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/d6/c0/ee/d6c0ee24-b720-f876-8864-1ad6c32a1af3/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/d6/c0/ee/d6c0ee24-b720-f876-8864-1ad6c32a1af3/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "288017625", + "sellerUrl": "http://www.apple.com/finalcutpro/compressor/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "JA", + "ZH", + "ES" + ], + "trackId": 424390742, + "trackName": "Compressor", + "minimumOsVersion": "10.14.6", + "formattedPrice": "$49.99", + "primaryGenreName": "Photo & Video", + "releaseDate": "2011-06-21T14:09:15Z", + "genreIds": [ + "6008" + ], + "releaseNotes": "Camera log conversion\n\t•\tConvert log-encoded video to SDR and HDR color spaces.\n\t•\tChoose from built-in Camera LUTs for Panasonic, Sony, Canon, Blackmagic, Nikon and ARRI log \n\t•\tAdd a custom Camera LUT to achieve accurate conversions for cameras without a built-in option or to match on-set looks\n\nCustom LUT effect\n\t•\tApply third-party creative LUTs to footage to add a custom look during compression\n\t•\tSupport for .cube, .mga, and .m3d file formats\n\t•\tSet the output color space to SDR or HDR\n\nOther new features\n\t•\tImproved speed and reliability using distributed processing over SMB\n\t•\tCreate ProRes IMF Packages including support for multiple languages", + "currentVersionReleaseDate": "2020-08-25T15:03:26Z", + "sellerName": "Apple Inc.", + "primaryGenreId": 6008, + "trackCensoredName": "Compressor", + "trackViewUrl": "https://apps.apple.com/us/app/compressor/id424390742?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "4.4.7", + "wrapperType": "software", + "artistId": 284417353, + "artistName": "Apple", + "genres": [ + "Photo & Video" + ], + "price": 49.99, + "description": "Compressor integrates tightly with Final Cut Pro and Motion to add power and flexibility to your video conversions. Quickly customize output settings, enhance images, and package your film for sale on the iTunes Store. For even faster conversions, easily set up distributed encoding using other Mac computers.\n\nAdvanced Encoding for Final Cut Pro\n\t•\tUse Compressor to customize encoding settings for use in Final Cut Pro and Motion\n\t•\tSet up batch processes to streamline the encoding of large numbers of files\n\t•\tBuild custom Destinations to combine encoding with additional tasks such as copying files\n\t•\tCreate self-contained Droplets to encode on the desktop with drag-and-drop ease\n\t•\tShare settings with other editors, even if Compressor isn't installed on their systems\n\niTunes Store Package Creation\n\t•\tImport and organize your movie, trailer, closed captions, audio descriptions, and subtitles into an iTunes Store-compliant package for submission to an Apple-certified iTunes delivery partner\n\t•\tAudition video with any audio, caption, or subtitle to verify sync\n\t•\tBuilt-in error detection helps you identify issues with your iTunes Store Package\n\t•\tDeliver HDR video as P3 D65 PQ, Rec. 2020 HLG, and Rec. 2020 PQ for HDR10\n\t•\tSupport in the iTunes Store Package to link a Dolby Vision graded video file to a Dolby Vision XML\n\nSupport for Industry Standards\n\t•\tEncode to a broad range of industry standard formats including HEVC, MPEG-4, H.264, MXF and ProRes\n\t•\tWork with a choice of themed menus to encode and burn a DVD or Blu-ray disc\n\t•\tImport Targa, DPX, TIFF, PSD, PNG or OpenEXR image sequences and encode them to any setting\n\t•\tView, adjust, and deliver closed captions in CEA-608, SRT, and iTT formats\n\nPristine Format Conversions\n\t•\tConvert any file between formats — such as NTSC to PAL, SD to HD or progressive to interlaced video\n\t•\tImport and manipulate wide color video, then deliver in standard Rec. 601 and Rec. 709 color spaces or in wide Rec. 2020 color space\n\t•\tDeliver High Dynamic Range (HDR) video with controls for color space conversions and HDR metadata\n\t•\tDeliver HDR video as P3 D65 PQ, Rec. 2020 HLG, and Rec. 2020 PQ\n\t•\tAdd effects to your content like custom LUTs, a timecode overlay, and watermarks\n\t•\tSpeed up video, slow it down, or adjust the frame rate to make the duration match a runtime\n\t•\tConvert log-encoded video to SDR and HDR color spaces using built in camera LUTs for Panasonic, Sony, Canon, Blackmagic, Nikon and ARRI or add a custom camera LUT\n\t•\tConvert ProRes Raw and ProRes Raw HQ media to other professional file formats\n\nDistributed Encoding\n\t•\tSave time by distributing encoding work among multiple workstations\n\t•\tInstall Compressor on any Mac to activate it as a node for distributed encoding\n\nSystem Requirements: macOS 10.14.6 or 10.15.6 or later, 4GB of RAM (8GB recommended for 4K editing, 3D titles, and 360° video editing), Metal-capable graphics card, 1GB of VRAM recommended for 4K editing, 3D titles, and 360° video editing, 1.2GB of available disk space. ProRes RAW requires a Mac computer that supports Metal.\n\nSome features require Internet access; fees may apply. Blu-ray recorder required for burning Blu-ray discs.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.apple.Compressor", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/51/62/23/51622359-6991-0f1f-a7c1-1db437fc9290/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/28/37/84/2837843a-a8e2-5464-0328-dcd540e7974a/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/83/48/58/8348580d-1c32-51da-d76b-09fadaae5f59/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/40/00/ee/4000eef3-74d8-eb08-04a9-4d4847cce576/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/ea/06/d0/ea06d0e1-178d-52d5-c2e0-8841da02698d/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/apple/id284417353?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/ea/06/d0/ea06d0e1-178d-52d5-c2e0-8841da02698d/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/ea/06/d0/ea06d0e1-178d-52d5-c2e0-8841da02698d/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "110681779", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "NL", + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "ZH", + "ES", + "ZH" + ], + "trackId": 1450874784, + "trackName": "Transporter", + "minimumOsVersion": "10.13", + "formattedPrice": "Free", + "primaryGenreName": "Developer Tools", + "releaseDate": "2019-10-15T07:00:00Z", + "genreIds": [ + "6026", + "6002" + ], + "releaseNotes": "Bug fixes and stability improvements.", + "currentVersionReleaseDate": "2020-02-25T22:23:05Z", + "sellerName": "Apple Inc.", + "primaryGenreId": 6026, + "trackCensoredName": "Transporter", + "trackViewUrl": "https://apps.apple.com/us/app/transporter/id1450874784?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.1.1", + "wrapperType": "software", + "artistId": 284417353, + "artistName": "Apple", + "genres": [ + "Developer Tools", + "Utilities" + ], + "price": 0.00, + "description": "Transporter is the simple and easy way to deliver content to Apple. Easily send apps, music, movies, TV shows, or books for distribution on the App Store, Apple Music, Apple TV app, Apple Books, or iTunes Store.\n\n • Simply drag and drop your content into Transporter to get started.\n • Validate and upload multiple files simultaneously for fast delivery.\n • View delivery progress, including validation warnings, errors, and delivery logs, so you can quickly fix any issues.\n • See a history of past deliveries, including date and time.\n\nAn App Store Connect, iTunes Connect, or encoding house account is required.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.apple.TransporterApp", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple/33/ad/a6/mzl.ojdwflfm.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/61/32/c8/mzl.vlycxldk.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple/06/fc/e3/mzl.wkjreqhy.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/56/60/a9/mzl.knsggbmt.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/ab/7f/30/mzl.fazbywlk.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/30/63/a6/3063a6d9-fbca-7fef-b857-71aed53f8fce/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/glu-games-inc/id284419051?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/30/63/a6/3063a6d9-fbca-7fef-b857-71aed53f8fce/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/30/63/a6/3063a6d9-fbca-7fef-b857-71aed53f8fce/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "401517175", + "sellerUrl": "http://www.glu.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 433191920, + "trackName": "Avenue Flo: Special Delivery", + "minimumOsVersion": "10.6.6", + "formattedPrice": "$6.99", + "primaryGenreName": "Games", + "releaseDate": "2011-05-19T07:00:00Z", + "genreIds": [ + "6014", + "7012", + "7002" + ], + "currentVersionReleaseDate": "2011-05-19T07:00:00Z", + "sellerName": "Glu Games Inc", + "primaryGenreId": 6014, + "trackCensoredName": "Avenue Flo: Special Delivery", + "trackViewUrl": "https://apps.apple.com/us/app/avenue-flo-special-delivery/id433191920?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.0", + "wrapperType": "software", + "artistId": 284419051, + "artistName": "Glu Games Inc", + "genres": [ + "Games", + "Puzzle", + "Adventure" + ], + "price": 6.99, + "description": "The DinerTown family is growing! Join Flo and the cast in Avenue Flo: Special Delivery, a fun new addition to PlayFirst's exciting adventure series. Vicky's due date is fast approaching... and so is the baby shower extravaganza Quinn is planning. But ten fingers, ten toes aren't enough to pull this off: Quinn needs a hand from Flo and you! Will puppies on the loose topple the cake? Will Mr. Big pull the plug on the party? Oh, and where's the guest-of-honor? Dash across town with Flo, collecting missing items for the DinerTown characters in need, all to create the mother of all showers for mom-to-be Vicky.\n\n• Interact with a whole cast of DinerTown citizens!\n• Quirky situations to solve\n• Vibrant neighborhoods and locales to explore\n• Challenging puzzles and mini games", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.playfirst.mac.avenueflo2", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/98/f8/03/98f80334-5fc2-43fb-7f11-56149ae7d3a0/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/fc/60/6f/fc606f44-d5f2-cb26-459a-0902b88558ec/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/66/89/0a/66890a45-df58-98eb-2b5c-27f0358f9ebd/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/15/9d/94/159d94de-515c-930c-4e9d-a0ca3bb60c1e/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/c3/f2/9d/c3f29dd0-23a6-01cd-9b3b-c6b7e963dc28/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/carob-apps-llc/id387597632?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/c3/f2/9d/c3f29dd0-23a6-01cd-9b3b-c6b7e963dc28/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/c3/f2/9d/c3f29dd0-23a6-01cd-9b3b-c6b7e963dc28/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "27887875", + "sellerUrl": "http://carobapps.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "ES" + ], + "trackId": 1476902521, + "trackName": "inRoute Route Planner", + "minimumOsVersion": "10.15", + "formattedPrice": "Free", + "primaryGenreName": "Travel", + "releaseDate": "2019-11-16T08:00:00Z", + "genreIds": [ + "6003", + "6000" + ], + "releaseNotes": "- Routing improvements for better arrival at the front of addresses \n- Fixed an issue routing to pins added using a coordinate search", + "currentVersionReleaseDate": "2020-08-11T00:21:04Z", + "sellerName": "Carob Apps, LLC", + "primaryGenreId": 6003, + "trackCensoredName": "inRoute Route Planner", + "trackViewUrl": "https://apps.apple.com/us/app/inroute-route-planner/id1476902521?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "7.3.2", + "wrapperType": "software", + "artistId": 387597632, + "artistName": "Carob Apps, LLC", + "genres": [ + "Travel", + "Business" + ], + "price": 0.00, + "description": "Plan optimal routes or chart your own course using weather, elevation, curves and more. Then navigate safely with voice-guided, turn-by-turn directions that automatically check your route for severe weather. \n\n***As seen on the TODAY show in the Traveling This Summer segment***\n\n“adding to both the safety of the ride and the pleasure of knowing beforehand what to expect” - Florin Tibu, “autoevolution”\n\n“I used InRoute for planning six world record attempts. No weather app gives you more information, period.” - Carl Reese, Multiple World Record Holder\n\nKey Features (some require inRoute Pro--see below):\n• Voice guided navigation of up to 150 locations on your iOS device, with automatic severe weather alerts (alerts are currently available in the US, Canada, and EU)\n• Optimize waypoint order for fastest time, or manually reorder\n• Import from XLSX, GPX and KML files\n• Create custom routes based on weather, elevation and curviness, or build your own route from available alternates on each leg of a route\n• Interactive charts showing route elevation, curviness, weather (temperature, humidity, precipitation, wind speed/direction, severe weather alerts), and sunrise/sunset times\n• Search along a route—the whole route, every x miles/hours, or the next x miles/hours from a place—find gas, hotels, campgrounds or places to eat close to a route\n• Set Departure and Layover Times—weather forecasts, road conditions (e.g. congestion), and travel times accurately reflect conditions throughout the trip\n• Save your favorite routes and places, sync between devices, organize into folders, and share with family and friends\n• Easily add places to the map using a Dropped pin, Search, or Contacts\n• Export routes to Apple Maps, Google Maps, Navigon, and Waze. Some apps use inRoute's \"Agenda Nav\" feature. See the in-app FAQ for more info\n• Export to GPS devices and apps compatible with GPX files\n• Routes are stored on your device so you can access them even if you lose connection\n\ninRoute Pro (for iPhone, iPad & Mac):\n- $3.99 monthly, or $29.99 annually. 1 week free trial\n- Create routes with up to 150 locations (8 in free version)\n- Sync routes and pins between devices\n- Weather charts/custom routes\n- Severe weather alerts during navigation (US, Canada, EU areas)\n- Export/share routes as GPX files\n\nPrice may vary by location. Subscriptions will be charged to your credit card through your iTunes account. Your subscription will automatically renew unless canceled at least 24 hours before the end of the current period. Manage your subscriptions in Account Settings after purchase.\n\nPrivacy Policy and Terms of Use: http://carobapps.com/privacy-policy", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "maccatalyst.com.CarobApps.inRoute", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/a8/8a/dc/a88adc49-3ce7-6c92-af8c-f43e5ddede45/mzl.jxybfvaw.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple125/v4/bd/b8/38/bdb83873-a6d0-f29c-f02d-a202509f4e0b/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/questionmark-computing-limited/id538427522?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple125/v4/bd/b8/38/bdb83873-a6d0-f29c-f02d-a202509f4e0b/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple125/v4/bd/b8/38/bdb83873-a6d0-f29c-f02d-a202509f4e0b/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "4151926", + "sellerUrl": "https://www.questionmark.com/go/questionmarksecure", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "AR", + "BG", + "CA", + "CS", + "DA", + "NL", + "EN", + "ET", + "FI", + "FR", + "DE", + "EL", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KO", + "LV", + "LT", + "MS", + "MT", + "NB", + "FA", + "PL", + "PT", + "RO", + "RU", + "ZH", + "SK", + "SL", + "ES", + "SV", + "TH", + "ZH", + "TR", + "UK", + "UR", + "VI" + ], + "trackId": 538427519, + "trackName": "Questionmark Secure", + "minimumOsVersion": "10.10", + "formattedPrice": "Free", + "primaryGenreName": "Education", + "releaseDate": "2012-08-10T16:54:11Z", + "genreIds": [ + "6017", + "6000" + ], + "releaseNotes": "Compatibility update", + "currentVersionReleaseDate": "2018-08-08T16:48:48Z", + "sellerName": "Questionmark Corporation", + "primaryGenreId": 6017, + "trackCensoredName": "Questionmark Secure", + "trackViewUrl": "https://apps.apple.com/us/app/questionmark-secure/id538427519?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "6.0.19", + "wrapperType": "software", + "artistId": 538427522, + "artistName": "Questionmark Computing Limited", + "genres": [ + "Education", + "Business" + ], + "price": 0.00, + "description": "Questionmark Secure is a lock-down browser that people (candidates) use to take online tests and exams. Questionmark Secure, is used in conjunction with an organization’s Questionmark OnDemand service or Questionmark Perception on-premise software to help candidates focus on using their own cognition to answer questions and prevents them from accessing other applications during the exam.\n \nQuestionmark OnDemand/Perception and Questionmark Secure are designed to work together to provide a secure environment for online exams that reduces the risk of cheating and complements an organization’s other defenses for mitigating threats to content security and results integrity.\n \nAcademic institutions, businesses and governmental organizations use Questionmark’s technologies to create, deliver and report on online tests and exams. These online assessments may be delivered via a standard browser, such as Safari, Firefox, Internet Explorer, etc. However, certain high-stakes tests and exams warrant the additional protections provided by Questionmark Secure, including: preventing the copying or printing exam material; accidentally exiting a test; and gaining access to materials (either locally or Internet-based) that could give an unfair advantage. Questionmark Secure delivers online assessment content while disabling key system functions such as task-switching, right click options, screen captures, menus, printing and other functions that might jeopardize the fair and secure completion of the assessment.\n \nFor more information, visit the Questionmark website at http://www.questionmark.com/secure/", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.questionmark.secure.browser", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple117/v4/f6/c6/c2/f6c6c22e-2314-f751-10a0-a557ec777c6a/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple127/v4/96/84/df/9684dfd6-6574-c814-43d2-c398b50f271e/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple117/v4/78/93/b8/7893b8db-0630-bc29-9820-0b3d05235fc1/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple127/v4/56/46/99/56469923-334e-b78b-6a8a-6e47bde3979b/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple117/v4/d4/a3/f7/d4a3f738-c928-2b48-9687-d8db9680681f/mzl.oodlgfvx.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/7f/cd/23/7fcd237b-c77e-4cc8-1df9-375991ffffa9/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/raj-kumar-shaw/id387611149?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/7f/cd/23/7fcd237b-c77e-4cc8-1df9-375991ffffa9/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/7f/cd/23/7fcd237b-c77e-4cc8-1df9-375991ffffa9/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "9542247", + "sellerUrl": "http://www.ilifetouch.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 1172699646, + "trackName": "iBuy from Amazon", + "minimumOsVersion": "10.10", + "formattedPrice": "$1.99", + "primaryGenreName": "Utilities", + "releaseDate": "2016-12-06T21:36:24Z", + "genreIds": [ + "6002", + "6005" + ], + "releaseNotes": "- Minor bug fixes.\n- Improved version.", + "currentVersionReleaseDate": "2017-10-03T20:33:51Z", + "sellerName": "Raj Kumar Shaw", + "primaryGenreId": 6002, + "trackCensoredName": "iBuy from Amazon", + "trackViewUrl": "https://apps.apple.com/us/app/ibuy-from-amazon/id1172699646?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.2.1", + "wrapperType": "software", + "artistId": 387611149, + "artistName": "Raj Kumar Shaw", + "genres": [ + "Utilities", + "Social Networking" + ], + "price": 1.99, + "description": "iBuy from Amazon allows you to access Amazon on your Mac, at anytime, in anywhere. It provides a responsive App layout from where you can browse products and shop on Amazon. It becomes very easy for users to shop on Amazon on the app rather than on a web browser. PrimeApp for Amazon comes with useful custom buttons which will help you in accessing Amazon with ease. With just a single click on Dock icon, you will be able to go right into Amazon in seconds.\n\nFeatures:\n- Instant access to Amazon on a super responsive app environment.\n- Seamless design\n- Starts on startup.\n- Multiple sizes\n- Open multiple window\n- Download product images inside app. No need to visit web browser.\n- Access Amazon Smile from the app. Please go to Menu bar options and click on Accounts to go to Amazon Smile store. Or you can simply press Alt+S from your keyboard to access Amazon Smile. \n\nSo, download iBuy from Amazon today and have access to millions of products online at your fingertips. \n\nDisclaimer: Amazon was not associated with the development of the app. All the Amazon Logo, name, artworks are property of their respective owners.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.appease.amazon", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/39/84/2f/39842fdb-bcf2-f26c-e3d8-94c532990294/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/3f/46/b1/3f46b13e-80ff-77f7-3104-7172ac2d75b1/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/deliveryslip/id1262528147?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/3f/46/b1/3f46b13e-80ff-77f7-3104-7172ac2d75b1/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/3f/46/b1/3f46b13e-80ff-77f7-3104-7172ac2d75b1/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "70736472", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "AM", + "AR", + "BN", + "BG", + "CA", + "HR", + "CS", + "DA", + "NL", + "EN", + "ET", + "FI", + "FR", + "DE", + "EL", + "GU", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KN", + "KO", + "LV", + "LT", + "MS", + "ML", + "MR", + "NB", + "FA", + "PL", + "PT", + "RO", + "RU", + "SR", + "ZH", + "SK", + "SL", + "ES", + "SW", + "SV", + "TA", + "TE", + "TH", + "ZH", + "TR", + "UK", + "VI" + ], + "trackId": 1262528148, + "trackName": "DeliverySlip", + "minimumOsVersion": "10.9.0", + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2017-07-26T16:28:39Z", + "genreIds": [ + "6007", + "6000" + ], + "releaseNotes": "7.14 Release Notes:\n---\nNEW - Download All:\n* Includes secure files and documents for approval.\n* Creates a ZIP file for easy download.\n* Marks all attachments as downloaded (tracking).\nNEW - Approvals & ElectronicSignature Workflow:\n* Set a signing order for signatories of documentsfor approval.\n* Ensure documents are signed & approved in the order required by your internal workflows.\n\nIMPROVEMENTS:\n- Stability and performance increases.\n- Optimization for the new Gmail interface", + "currentVersionReleaseDate": "2019-03-01T17:17:12Z", + "sellerName": "DeliverySlip Inc.", + "primaryGenreId": 6007, + "trackCensoredName": "DeliverySlip", + "trackViewUrl": "https://apps.apple.com/us/app/deliveryslip/id1262528148?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "7.14.05601", + "wrapperType": "software", + "artistId": 1262528147, + "artistName": "DeliverySlip", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.00, + "description": "Send secure messages from inside your existing email (Mail, Office 365, Outlook, Gmail). Take the pain out of sharing valuable information for both you and your recipients.\n\nWith DeliverySlip you’ll:\n\n1. Protect every message and attachment with bank-grade AES 256-bit encryption. In this age of ever increasing data security threats, it’s the prudent thing to do. \n\n2. Turbocharge your existing email and be able to: \n•\tSecurely send, receive, track and control email on all your devices,\n•\tRequest secure E-Signatures and E-Approvals,\n•\tDrag, drop and share any file of up to 5GBs without clogging your inbox,\n•\tRestrict what a recipient can do with your message and attachments including:\n i.\tforward freeze,\n ii.\treply freeze, \n iii.\tadd an additional password or code for ultra-sensitive content,\n iv.\tset deadlines on your messages for time sensitive information,\n v.\tinstantly revoking messages at any time, even after they have been opened.\n\n•\tReceive real-time activity notifications the moment your message is:\n i.\tread, replied to, forwarded or deleted by recipients,\n ii.\tInstantly revoke messages at any time, even after they have been opened,\n iii.\tStop recipients from replying to or forwarding your message,\n iv.\tAdd a password for ultra-sensitive content.\n\n•\tEasily support your compliance, audit and legal processes with unique record identifiers a UUID (Universally Unique Identifier) assigned to each email message and individual attachment,\n\nWhy not send all your messages securely? With DeliverySlip you can.\n\nDeliverySlip works with AppRiver’s Cipherpost Pro, Cirius Secure email, DeliverySlip secure emaill and other Corporate secure messaging platforms.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.deliveryslip.app", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple1/v4/54/09/67/5409675e-2c6e-d377-39d6-08b90c324bc9/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple3/v4/6c/c5/db/6cc5db4a-2948-c520-cf74-3fe52fb8e6ab/mzl.tdxgaixh.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple3/v4/3e/29/33/3e293349-ffa3-9a85-6338-ffb57bb8d74a/mzl.xhknunit.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple5/v4/9b/be/2c/9bbe2cc9-9827-4421-a103-e6737a2a2b15/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple3/v4/84/39/8b/84398bd6-66f0-f383-a091-7b16f286e682/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/study-net-corporation/id387914202?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple3/v4/84/39/8b/84398bd6-66f0-f383-a091-7b16f286e682/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple3/v4/84/39/8b/84398bd6-66f0-f383-a091-7b16f286e682/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "1567344", + "sellerUrl": "http://www.study.net", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 674154420, + "trackName": "Study.Net", + "minimumOsVersion": "10.10", + "formattedPrice": "Free", + "primaryGenreName": "Education", + "releaseDate": "2013-07-27T20:47:56Z", + "genreIds": [ + "6017" + ], + "releaseNotes": "Bug fixes.", + "currentVersionReleaseDate": "2015-02-17T14:55:44Z", + "sellerName": "Study.Net Corporation", + "primaryGenreId": 6017, + "trackCensoredName": "Study.Net", + "trackViewUrl": "https://apps.apple.com/us/app/study-net/id674154420?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "2.0.1", + "wrapperType": "software", + "artistId": 387914202, + "artistName": "Study.Net Corporation", + "genres": [ + "Education" + ], + "price": 0.00, + "description": "Study.Net for OS X provides easy and convenient access to Study.Net course materials. \n\nFEATURES \n\n- Download and save course material files\n\n- Annotate downloaded PDF files\n\n- Save annotations to Study.Net cloud for backup and versioning.\n\n- Your Study.Net Cloud Service annotations are accessible from any iPad using the Study.Net iPad app or from any Mac using the Study.Net Mac app, allowing you to easily move annotations across your iPad devices or Mac OS X laptops.\n\n- Print course materials", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "net.studynet.StudyNet-OSX", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/71/a1/26/71a12633-9bd8-915a-d27d-f5a3a3edb1bd/30244205-e45d-45cf-bf6f-2a4477befaf3_tt4.jpg/392x696bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/a8/c2/4c/a8c24ca5-f0f6-65d3-7eb0-f1a9a81ad241/a9b0f4c4-5f08-4ea9-b903-4304dbb5782c_tt3.jpg/392x696bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/de/fe/55/defe550a-8705-78d9-e489-de7d3b8b8f6f/cc236858-3996-4cd9-8292-2a885805f9b3_tt5.jpg/392x696bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/3c/bd/cc/3cbdcc57-4122-16aa-831a-ee2fd2226095/7f480172-72d7-41b8-9534-188dea175021_tt1.jpg/392x696bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/06/e3/23/06e32399-f5e4-966f-3b11-6a5615f5237b/1c6ae899-3831-4b09-943b-f800c595efd3_tt2.jpg/392x696bb.jpg" + ], + "ipadScreenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/c7/8a/1d/c78a1db4-cae3-995a-c4af-8432a2671448/d1bd9bdd-2987-4639-bbaf-7d65d647343a_zz4.jpg/576x768bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/f0/ae/e5/f0aee55d-5bea-ea1c-1219-b360e058a093/f4201129-5472-46b0-b4b9-18372a00fbc5_zz5.jpg/576x768bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/89/09/62/890962cd-f91b-417e-6fb4-65d19a2634fe/2e414850-0108-40cf-9e0f-c2b5141f6d35_zz2.jpg/576x768bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/03/dd/d9/03ddd98d-9bcf-fec0-1f1c-4378915a470f/185896cf-d07a-4b9a-9a1b-fb7768bdd8b5_zz3.jpg/576x768bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/a5/2f/73/a52f731d-ca8e-0e27-64cc-87686d3a9a65/b4e788b6-378b-4bb0-bc1f-e0486cd7651e_zz1.jpg/576x768bb.jpg" + ], + "appletvScreenshotUrls": [], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/4c/35/50/4c355030-0fb4-e4dd-463a-623f66506d2e/source/512x512bb.jpg", + "isGameCenterEnabled": false, + "supportedDevices": [ + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone8-iPhone8", + "iPhone6-iPhone6", + "iPhoneXSMax-iPhoneXSMax", + "MacDesktop-MacDesktop", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPhone8Plus-iPhone8Plus", + "iPhone11-iPhone11", + "iPadMini3-iPadMini3", + "iPad74-iPad74", + "iPad71-iPad71", + "iPad878-iPad878", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadProFourthGen-iPadProFourthGen", + "iPadPro97-iPadPro97", + "iPhoneXR-iPhoneXR", + "iPhone11Pro-iPhone11Pro", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadAir3Cellular-iPadAir3Cellular", + "iPad834-iPad834", + "iPhone7-iPhone7", + "iPad612-iPad612", + "iPad76-iPad76", + "iPhoneX-iPhoneX", + "iPhone11ProMax-iPhone11ProMax", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPhone6Plus-iPhone6Plus", + "iPhone6sPlus-iPhone6sPlus", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPad856-iPad856", + "iPadMiniRetina-iPadMiniRetina", + "iPadAirCellular-iPadAirCellular", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPad75-iPad75", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadMini4-iPadMini4", + "iPadPro-iPadPro", + "iPadMini5-iPadMini5", + "iPad72-iPad72", + "iPadAir-iPadAir", + "iPadPro97Cellular-iPadPro97Cellular", + "iPhoneXS-iPhoneXS", + "iPhone5s-iPhone5s", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPad812-iPad812", + "iPad73-iPad73", + "iPad611-iPad611", + "iPadAir2-iPadAir2", + "iPhoneSE-iPhoneSE", + "iPhone7Plus-iPhone7Plus", + "iPadAir3-iPadAir3", + "iPadProSecondGen-iPadProSecondGen", + "iPadAir2Cellular-iPadAir2Cellular", + "iPadProCellular-iPadProCellular", + "iPhone6s-iPhone6s", + "iPadSeventhGen-iPadSeventhGen" + ], + "advisories": [], + "artistViewUrl": "https://apps.apple.com/us/developer/starkode-limited-company/id874698946?uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/4c/35/50/4c355030-0fb4-e4dd-463a-623f66506d2e/source/60x60bb.jpg", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/4c/35/50/4c355030-0fb4-e4dd-463a-623f66506d2e/source/100x100bb.jpg", + "kind": "software", + "features": [ + "iosUniversal" + ], + "currency": "USD", + "fileSizeBytes": "31782912", + "sellerUrl": "https://www.starkode.com/app/business/iphone-ipad/shipping-for-business/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "AR", + "HR", + "CS", + "DA", + "NL", + "EN", + "FI", + "FR", + "DE", + "EL", + "HI", + "HU", + "IT", + "JA", + "KO", + "NB", + "PL", + "PT", + "RO", + "RU", + "ZH", + "SK", + "ES", + "SV", + "ZH", + "TR" + ], + "trackId": 1520308763, + "trackName": "Shipping for Business", + "minimumOsVersion": "11.0", + "formattedPrice": "Free", + "primaryGenreName": "Business", + "releaseDate": "2020-07-10T07:00:00Z", + "genreIds": [ + "6000", + "6007" + ], + "releaseNotes": "This update includes fixes and improvements.", + "currentVersionReleaseDate": "2020-07-14T17:12:53Z", + "sellerName": "Starkode Limited Company", + "primaryGenreId": 6000, + "trackCensoredName": "Shipping for Business", + "trackViewUrl": "https://apps.apple.com/us/app/shipping-for-business/id1520308763?uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "13.94", + "wrapperType": "software", + "artistId": 874698946, + "artistName": "Starkode Limited Company", + "genres": [ + "Business", + "Productivity" + ], + "price": 0.00, + "description": "Shipping for Business let you organize and ship orders easily, print address labels, check reports, communicate with customers and receive notifications right from your iPhone, iPad or Mac.\n\nSHIPPINGS\n- Manage Shippings and Customers.\n- Create and print address labels in standard A4/US Letter labels.\n\nSECURITY\n- Manage users from the app, assign roles, and monitor access.\n- Authorize each device before use.\n- Touch ID ready, for fast and secure access.\n\nREPORTS \n- Export your shippings to sleek PDF Reports. \n- Share reports via Email, iBooks or many other compatible apps. \n- Print reports directly using AirPrint. \n- Customize header and footer information in reports.\n\nCUSTOMIZABLE\n- Create your own set of attributes for shippings.\n- Show user photo or company logo on sign in.\n- Define users and roles (Administrator, Manager, Worker).\n\nROLES\n- Predefined roles are the easiest way to limit users to perform a specific task, such as viewing, creating or modifying timesheets or projects.\n\nACCESS LISTS\n- Allows you to grant access to each project.\n- Assign users, roles, and branches to lists in just a few steps.\n\nBRANCHES\n- Allows you to limit access and separate operations by branches, whether a branch is a store, location or department.\n\nSUBSCRIPTION\n- The license and usage model is provided as a software service, licensed with a monthly subscription and hosted in the cloud.\n- Payment will be charged to iTunes Account at confirmation of purchase.\n- Subscription automatically renews unless auto-renew is turned off at least 24-hours before the end of the current period.\n- Account will be charged for renewal within 24-hours prior to the end of the current period, and identify the cost of the renewal.\n- Subscriptions may be managed by the user and auto-renewal may be turned off by going to the user's Account Settings after purchase.\n- Any unused portion of a free trial period, if offered, will be forfeited when the user purchases a subscription to that publication, where applicable.\n- Privacy Policy (https://www.starkode.com/app/business/privacy/) and Terms of Use (https://www.starkode.com/app/business/terms/).", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "Starkode.Business.Shipping", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple/v4/cd/f9/11/cdf9119f-459c-ffe3-93f5-10826bdb919e/mzl.ubqghdot.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple/v4/f2/0e/cd/f20ecd52-3a0a-66bd-fe71-44e55a6ccf46/mzl.sbewfqdf.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/f0/fc/43/f0fc4330-6669-48d9-4ba3-6ea5a237a5e6/mzl.gloxajyr.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/e9/3d/90/e93d904f-271f-3069-3ec0-f84229a0f121/mzl.vappdtgr.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/v4/ec/37/3b/ec373b90-0f2d-43e4-fece-6f1e6cd8c181/mzl.lctzfjlh.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/7d/8f/29/7d8f2991-5896-e039-2918-80dbea01de14/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/tractus/id870804567?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/7d/8f/29/7d8f2991-5896-e039-2918-80dbea01de14/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/7d/8f/29/7d8f2991-5896-e039-2918-80dbea01de14/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "1366916", + "sellerUrl": "http://tractusonline.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 459681011, + "trackName": "Secret Delivery", + "minimumOsVersion": "10.8", + "formattedPrice": "$1.99", + "primaryGenreName": "Utilities", + "releaseDate": "2011-09-06T17:44:20Z", + "genreIds": [ + "6002", + "6000" + ], + "releaseNotes": "• Bug Fixes and Improvements\n• Support for Dark Mode and various other modern macOS features", + "currentVersionReleaseDate": "2019-12-18T03:16:57Z", + "sellerName": "Tractus, Inc", + "primaryGenreId": 6002, + "trackCensoredName": "Secret Delivery", + "trackViewUrl": "https://apps.apple.com/us/app/secret-delivery/id459681011?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.3", + "wrapperType": "software", + "artistId": 870804567, + "artistName": "Tractus", + "genres": [ + "Utilities", + "Business" + ], + "price": 1.99, + "description": "Wish you could securely send sensitive information over email without knowing who will see it? Wish you could password protect an important document, or a private picture? Easily password protect any text, or file to be retrieved only by someone with the app and the corresponding password. \n\nQuickly encrypt, send, and decrypt messages and files! This app is a must have, it allows you to password protect emails, documents, pictures, movies, music, or any other kind of message or file you can think of.\n\nSimply write or drag your message into the app, or drag your file into the app, push the encrypt button, enter a password, and send your Secret Delivery! \n\nThis app is perfect for everyone!\n\nSend Secret Delivery Today.\n\nNote: Secret Delivery uses AES Encryption, a standard encryption algorithm, commonly used by governments and businesses.\n\nReminder: Recipients must have the application to decrypt any messages/files encrypted with Secret Delivery.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.Tractus.Secret-Delivery-Mac", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple49/v4/6b/59/4f/6b594f1e-9aed-5757-7b28-de85c994d4bf/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple69/v4/8e/6b/85/8e6b85c0-89d3-7e32-5b52-86c453d81fd7/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple7/v4/87/c9/53/87c953f4-45e3-a8ae-d400-f5fecff9521d/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple7/v4/ad/99/98/ad99980b-afb5-9117-cc63-25f55cc0ff84/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple7/v4/28/f5/cb/28f5cb6f-1baf-2b18-0a0d-c90c0c1b298f/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple49/v4/08/11/6f/08116f7a-220d-fb84-bb09-306c4b49d6af/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/app-viper-inc/id641369312?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple49/v4/08/11/6f/08116f7a-220d-fb84-bb09-306c4b49d6af/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple49/v4/08/11/6f/08116f7a-220d-fb84-bb09-306c4b49d6af/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "55376484", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "9+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 1067627466, + "trackName": "Pizza Bomb", + "minimumOsVersion": "10.10", + "formattedPrice": "Free", + "primaryGenreName": "Games", + "releaseDate": "2016-01-28T10:13:21Z", + "genreIds": [ + "6014", + "7001", + "7003", + "6016" + ], + "releaseNotes": "- Increased difficulty of gameplay", + "currentVersionReleaseDate": "2016-04-04T21:41:36Z", + "sellerName": "App Viper Inc.", + "primaryGenreId": 6014, + "trackCensoredName": "Pizza Bomb", + "trackViewUrl": "https://apps.apple.com/us/app/pizza-bomb/id1067627466?mt=12&uo=4", + "contentAdvisoryRating": "9+", + "averageUserRating": 0, + "version": "1.2", + "wrapperType": "software", + "artistId": 641369312, + "artistName": "App Viper Inc.", + "genres": [ + "Games", + "Action", + "Casual", + "Entertainment" + ], + "price": 0.00, + "description": "Chef Zube is making a pizza delivery in the city and he needs your help!\n\nCatch as many pizzas and coins as you can while avoiding the bombs. The more points you score the closer you get to the delivery location.\n\nCan you complete all 5 levels and successfully deliver the pizza?", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.zubairhassan.pizzabombmac", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple122/v4/8e/77/10/8e771083-4c13-8133-51f8-4c9a0d8fa0aa/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple122/v4/6f/36/8e/6f368e26-2917-ce9a-a5d4-0f456186dd41/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple111/v4/e0/b5/37/e0b53756-e9b7-d847-e5b8-d14b600ac105/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple111/v4/df/ca/a4/dfcaa4ee-8021-7b8c-e1aa-f72cd500c1e6/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple122/v4/78/1e/2f/781e2f16-8b18-6825-0b4e-86ca81161d4d/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/skript-llc/id484021784?mt=12&uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple122/v4/78/1e/2f/781e2f16-8b18-6825-0b4e-86ca81161d4d/source/60x60bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple122/v4/78/1e/2f/781e2f16-8b18-6825-0b4e-86ca81161d4d/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "48093802", + "sellerUrl": "http://buymeapie.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "AM", + "AR", + "BN", + "BG", + "CA", + "HR", + "CS", + "DA", + "NL", + "EN", + "ET", + "FI", + "FR", + "DE", + "EL", + "GU", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KN", + "KO", + "LV", + "LT", + "MS", + "ML", + "MR", + "NB", + "FA", + "PL", + "PT", + "RO", + "RU", + "SR", + "ZH", + "SK", + "SL", + "ES", + "SW", + "SV", + "TA", + "TE", + "TH", + "ZH", + "TR", + "UK", + "VI" + ], + "trackId": 1208019955, + "trackName": "Buy Me a Pie! – Grocery Shopping List", + "minimumOsVersion": "10.9.0", + "formattedPrice": "$14.99", + "primaryGenreName": "Productivity", + "releaseDate": "2017-04-17T06:41:21Z", + "genreIds": [ + "6007", + "6012" + ], + "releaseNotes": "- Sharing lists", + "currentVersionReleaseDate": "2017-04-26T07:04:03Z", + "sellerName": "National Business Group Ltd", + "primaryGenreId": 6007, + "trackCensoredName": "Buy Me a Pie! – Grocery Shopping List", + "trackViewUrl": "https://apps.apple.com/us/app/buy-me-a-pie-grocery-shopping-list/id1208019955?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.1", + "wrapperType": "software", + "artistId": 484021784, + "artistName": "Skript, LLC", + "genres": [ + "Productivity", + "Lifestyle" + ], + "price": 14.99, + "description": "We help over 6 million users around the world do their shopping routines with joy and pleasure.\n\nThe Washington Post: \"Buy Me a Pie! lets users see their lists and update in real time.\"\n\nThe Next Web: \"This is a neat, easy-to-use app that’s beautifully designed. But where Buy Me a Pie really comes in to its own is that a single account can be synced across multiple iOS devices.\"\n\nLifehacker: \"Perfect for grocery lists, Buy Me a Pie! ensures that you will never miss an item on your shopping list again.\"\n\nAppScout: \"...attractive, fast, and has plenty of features. This should be your first stop when searching for a grocery list app.\"\n\nGeek.com: \"There are simple apps that let you just make a list, but Buy Me a Pie! is tailor-made for the experience and it’s a nice looking app, too.\" \n\n======================================\nYou definitely need this app if you know the value of: \n======================================\n\n* Time: a well-planned list updated in real time saves precious minutes and hours in a store\n\n* Money: when you know what to buy you're safe from spontaneous purchases and a waste of money\n\n* High spirits: we are sure you'll be happier without frustration caused by double purchases or forgotten items to buy\n\n* Environment: paper shopping lists are made of trees. Our lists are made of lines of program code\n\n==========\nApp features:\n==========\n\n* Multi-platform: use it on your Mac, iPhone, iPad and any other device via Buymeapie.com website.\n* Elegant simplicity: do not think how to use the app. Just enjoy using it.\n* Smart grouping: group your products by aisles with the help of colors assigned to the items, and the app will group the items in the list automatically.\n* Built-in self-learning dictionary: entered items are automatically stored in the dictionary for future fast entry. Sort the dictionary the way you prefer – alphabetically, by color groups and by the frequency of use.\n* Word prompter: The app will automatically suggest a word upon entering a few letters so you can quickly add items to a list \n* Ability to use together with your friends or family.\n* Easy lists management.\n* Automatic synchronization in the background: edit your lists, and we will take care of delivering the changes to your family or friends.\n* Multiple shopping lists: see the preview of your lists' content in a convenient list of lists.\n\nBring your shopping experience to the new level of convenience and style!", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.buymeapie.bmapmac", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/33/14/52/331452d7-0ed6-2e43-752e-044ee923a43e/c3848317-c058-4175-a95c-e48a1024b7f3_1.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/59/80/b1/5980b178-bee1-87a1-dc21-01004fc43310/560d40fd-fd7c-453b-ae72-a7ebd8709b26_2.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/16/26/08/16260872-dc90-ac66-375c-4910c2f53b48/3589003e-1df4-470e-9b39-8ae72e387f37_3.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/b5/9c/06/b59c06b1-b043-8d08-736d-007c7ce9fb7c/3792f556-20bd-4562-8a1f-30113b962e8b_4.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/b2/ea/8c/b2ea8c11-65f2-41be-e907-363befe80a65/ca965162-13af-4e2c-9d6b-513c884678f6_5.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/08/5a/19/085a19f4-5000-bd31-78b3-5591dee07a79/b7387aa3-a79c-4fa0-b5fa-bbe2e0935a1a_6.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/0f/da/60/0fda60f8-319c-f7c3-5e77-27823e2c406d/703c931d-4840-4e62-9693-a5651b1840aa_7.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/97/05/b5/9705b57d-ec3a-1ca9-5402-5bb53429bdd0/ac3049d8-aa7d-4d9e-b33d-67e0c31bae4f_8.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/b3/1e/5a/b31e5ab3-d686-35a6-f257-e6d388cbd093/b9a21902-4e63-4122-8d74-8ad2a8c6fa16_1.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/a4/37/ff/a437ff6e-0a2c-9685-85e3-32e6a45606b1/16de1e8c-c3ce-4b9e-b501-8d00ed630179_2.png/552x414bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/46/59/f6/4659f683-43e4-5d19-fbb6-9904e81e0dbd/c074b044-d94f-49d2-9ed4-d4fc3f30a685_3.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/40/e9/eb/40e9eb85-fd3a-dbaf-71a5-94e25c5a47f2/2a269bcb-da41-4f93-9bc4-8110ce7c8d8b_4.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/9b/63/aa/9b63aa72-54d7-9820-e5f5-141a2fe4034e/6641a98c-baec-4100-8f24-75df2d2f5bdc_5.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/16/4f/98/164f982f-f22e-e02e-ee12-ae58fe1884e5/553b999b-39a5-481d-a86b-346084482a26_6.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/91/70/d9/9170d9f5-a134-68f6-0b98-6f1459ed1f7b/9e4a32e9-40a4-4d38-9055-431be7696465_7.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/b0/0b/27/b00b27f3-5bed-91a9-2f5c-2a3557dccc19/48ca89b8-187a-461e-acae-be5650a0d5f1_8.png/552x414bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/2d/c8/f9/2dc8f943-fce1-b814-97c6-224fff34327b/source/512x512bb.jpg", + "isGameCenterEnabled": false, + "supportedDevices": [ + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone8-iPhone8", + "iPhone6-iPhone6", + "iPhoneXSMax-iPhoneXSMax", + "MacDesktop-MacDesktop", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPhone8Plus-iPhone8Plus", + "iPhone11-iPhone11", + "iPadMini3-iPadMini3", + "iPad74-iPad74", + "iPad71-iPad71", + "iPad878-iPad878", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadProFourthGen-iPadProFourthGen", + "iPadPro97-iPadPro97", + "iPhoneXR-iPhoneXR", + "iPhone11Pro-iPhone11Pro", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadAir3Cellular-iPadAir3Cellular", + "iPad834-iPad834", + "iPhone7-iPhone7", + "iPad612-iPad612", + "iPad76-iPad76", + "iPhoneX-iPhoneX", + "iPhone11ProMax-iPhone11ProMax", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPhone6Plus-iPhone6Plus", + "iPhone6sPlus-iPhone6sPlus", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPad856-iPad856", + "iPadMiniRetina-iPadMiniRetina", + "iPadAirCellular-iPadAirCellular", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPad75-iPad75", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadMini4-iPadMini4", + "iPadPro-iPadPro", + "iPadMini5-iPadMini5", + "iPad72-iPad72", + "iPadAir-iPadAir", + "iPadPro97Cellular-iPadPro97Cellular", + "iPhoneXS-iPhoneXS", + "iPhone5s-iPhone5s", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPad812-iPad812", + "iPad73-iPad73", + "iPad611-iPad611", + "iPadAir2-iPadAir2", + "iPhoneSE-iPhoneSE", + "iPhone7Plus-iPhone7Plus", + "iPadAir3-iPadAir3", + "iPadProSecondGen-iPadProSecondGen", + "iPadAir2Cellular-iPadAir2Cellular", + "iPadProCellular-iPadProCellular", + "iPhone6s-iPhone6s", + "iPadSeventhGen-iPadSeventhGen" + ], + "advisories": [], + "artistViewUrl": "https://apps.apple.com/us/developer/noelle-nagle/id1509693664?uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/2d/c8/f9/2dc8f943-fce1-b814-97c6-224fff34327b/source/60x60bb.jpg", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/2d/c8/f9/2dc8f943-fce1-b814-97c6-224fff34327b/source/100x100bb.jpg", + "kind": "software", + "features": [ + "iosUniversal" + ], + "currency": "USD", + "fileSizeBytes": "5404672", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 1519873373, + "trackName": "iPostMaster | Parcel Tracker", + "minimumOsVersion": "13.4", + "formattedPrice": "Free", + "primaryGenreName": "Utilities", + "releaseDate": "2020-07-17T07:00:00Z", + "genreIds": [ + "6002", + "6006" + ], + "releaseNotes": "Version 1.0.6 is just a small incremental update the fix/update some things from Version 1.0.5, specifically;\n\n• Updated the ‘Share’ information to include the tracking link (iOS and iPadOS only)\n• The I’m Ready!’ button text in the ‘Onboarding’ view now reads ‘Get Started!’\n• Fixed an issue prevented beta devices from using the ‘Track’ function of iPostMaster\n\nThank you for continuing to use iPostMaster. More updates are coming soon!", + "currentVersionReleaseDate": "2020-08-23T13:43:12Z", + "sellerName": "Noelle Nagle", + "primaryGenreId": 6002, + "trackCensoredName": "iPostMaster | Parcel Tracker", + "trackViewUrl": "https://apps.apple.com/us/app/ipostmaster-parcel-tracker/id1519873373?uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.0.6", + "wrapperType": "software", + "artistId": 1509693664, + "artistName": "Noelle Nagle", + "genres": [ + "Utilities", + "Reference" + ], + "price": 0.00, + "description": "Introducing iPostMaster - the friendly, easy-to-use, and helpful app designed to serve as a hub for all your incoming and outgoing deliveries, parcels, and more! \n\nDESIGN\n\niPostMaster was designed to be as friendly, easy-to-use, and as appealing to the eye as possible. Engineered and created using Apple’s incredible SwiftUI framework, iPostMaster utilises a gorgeous minimalistic user interface consisting of simple and easy-to-view colours. Accessibility is a must and utilises Dynamic Type, Smart Invert, and more.\n\nCreating an interface without any clutter that feels instantly natural to everyone was a priority in the core design of iPostMaster, and the app truly delivers on this desire. Whether you are a first-time user, or an app-master, iPostMaster will feel unbelievably natural every time you open it.\n\nSUPPORTED COURIERS\n\niPostMaster supports over 80 of the biggest international carriers across the UK, Europe, the USA, Canada, Australia, and New Zealand, including, but certainly not limited to, Apple, Royal Mail, ParcelForce, UPS, Hermes, DHL, An Post, USPS, and many more.\n\nOrder a new MacBook Pro? Or a new iPhone? Or new AirPods? You can even track your order from the Apple Online Store in iPostMaster!\n\nAlongside this, if you have a tracking number from a courier not supported by iPostMaster, you can use the ‘Other’ option, which still allows you to store your tracking numbers within the app and add an ETA so you’ll get a notification when it is scheduled to arrive!\n\nPRIVACY\n\nPrivacy was perhaps the most central concept in the creation of iPostMaster. It was designed to keep your privacy intact, and all information is stored on device, and is not (and never will be) uploaded, sold, collected, or otherwise shared with anyone. \n\nThere is nothing in the app that will compromise your security. I designed this app so that all users could feel confident using iPostMaster and know that their information will be safe.\n\nWhen you use the ‘Track’ feature and you are navigated to a courier’s website, your privacy still remains intact. The URL is opened through Apple’s highly-secure web browser, Safari, inside iPostMaster. Your data, tracking numbers, and anything else on the app is not, and never will be, shared with any of the couriers. It should be noted that when you go to a couriers website, you are consenting to their Privacy Policy and Terms and Conditions. We are not responsible for these couriers or their practices.\n\nWORKS ACROSS ALL YOUR DEVICES\n\niPostMaster stores your tracking numbers in iCloud for safe keeping. This also means that your tracking numbers will appear across your iPhone, iPad, iPod, and Mac!\n\nCreate a new entry on your iPhone. Boom - there it is on your iPad, iPod, and Mac! Or vice versa!\n\nWHAT ELSE?\n\n- iPostMaster has a ‘Privacy Mode’, which locks the app until you authentication with Face ID, Touch ID, or your device password\n- Enter the ETA of your delivery so you get a notification on the date you entered\n- You can share all the details of your package so anyone can track your parcels super quickly\n- Regular updates that add new features, couriers, and much much more! iPostMaster is always being updated and improved!\n- and it’s free to download!\n\n\nEXTRAS - Buy Once, Own Forever.\n\nIf you are enjoying iPostMaster and you would like to store more than 5 tracking numbers in the app at one time, you can get an upgrade for a very good price.\n\nThis upgrade allows you to store an unlimited amount of tracking numbers in iPostMaster. Even better than that, once you buy it, you own it forever. No tricks. No subscriptions. No hidden costs. Just a one-off payment.\n\nFINALLY\n\nI have loved building this app for everyone, and I really hope you enjoy using it as much as I have loved building it for you. I really hope it helps you in your daily life.\n\niPostMaster - Designed with Love in LDN.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.seannagle.PostMaster", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/ca/a4/24/caa42432-cc2e-69b1-242d-b5db3e9698e4/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/45/0f/12/450f12b1-bba0-2d84-d695-c3206420878b/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/02/cd/ed/02cded9a-0f93-fadb-0d3b-b3892874c8c4/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/5e/6e/fc/5e6efcde-7fd0-4296-e5fc-5d8ea901002c/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/what3words-ltd/id657878533?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/5e/6e/fc/5e6efcde-7fd0-4296-e5fc-5d8ea901002c/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/5e/6e/fc/5e6efcde-7fd0-4296-e5fc-5d8ea901002c/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "32581172", + "sellerUrl": "https://what3words.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "AF", + "AR", + "BN", + "BS", + "BG", + "ZH", + "HR", + "CS", + "DA", + "NL", + "EN", + "FI", + "FR", + "DE", + "EL", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KN", + "KO", + "MS", + "ML", + "MR", + "MN", + "NB", + "PL", + "PT", + "RO", + "RU", + "SR", + "ES", + "SW", + "SV", + "TA", + "TE", + "TH", + "TR", + "UR", + "XH", + "ZU" + ], + "trackId": 1482771079, + "trackName": "what3words", + "minimumOsVersion": "10.15", + "formattedPrice": "Free", + "primaryGenreName": "Travel", + "releaseDate": "2019-11-05T08:00:00Z", + "genreIds": [ + "6003", + "6002" + ], + "releaseNotes": "Use the app to:\n- Find your way to anywhere in the world, even where street addresses don’t exist\n- Tell your friends precisely where your picnic is\n- Tell your taxi exactly where you want to go\n- Plan and share your off-roading or hiking waypoints\n- Know exactly where you parked your car\n- Get deliveries to a specific entrance", + "currentVersionReleaseDate": "2019-11-24T22:48:54Z", + "sellerName": "What3Words Limited", + "primaryGenreId": 6003, + "trackCensoredName": "what3words", + "trackViewUrl": "https://apps.apple.com/us/app/what3words/id1482771079?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.0.7", + "wrapperType": "software", + "artistId": 657878533, + "artistName": "what3words Ltd.", + "genres": [ + "Travel", + "Utilities" + ], + "price": 0.00, + "description": "The what3words app for Mac helps you find, share and navigate to any precise location.\n\nWe’ve given every 3m x 3m in the world a unique 3 word address. This simple and accurate way to talk about location makes it easier to meet up with friends, discover and tell others about amazing places, and explore the world without getting lost. \n\nYou’ll see 3 word addresses displayed by hotels, restaurants, travel guides and websites. They can be used in 30+ languages and are much simpler to remember, use and communicate than regular addresses. They’re also far more accurate and reliable.\n\nUse the app to:\n- Find your way to anywhere in the world, even where street addresses don’t exist\n- Tell your friends precisely where your picnic is\n- Tell your taxi exactly where you want to go\n- Plan and share your off-roading or hiking waypoints\n- Know exactly where you parked your car\n- Get deliveries to a specific entrance\n\nKey App Features:\n- Compatible with Apple Maps navigation\n- TouchBar support for quick actions\n- Quickly jump to a 3 word address from Spotlight\n- Search for 3 word addresses or street addresses\n- Save your favourite locations and organise them with lists\n- AutoSuggest feature prevents mistakes\n- Available in 30+ languages\n\nIf you experience any problems or have any questions, please get in touch with support@what3words.com", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "maccatalyst.com.what3words.ios.mac", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/c1/24/4e/c1244e0b-ae64-9f2b-8f39-49337654283f/tns.euroesst.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/d9/40/45/d94045be-9a42-25a9-3204-4ea4dda0cc67/630dba84-57bc-46c1-a4e4-3dbf8e45188a_Simulator_Screen_Shot_-_iPhone_8_Plus_-_2020-08-07_at_00.43.40.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/8b/de/8c/8bde8c31-70d1-4e9a-cbcb-2ea12a68c63c/835de54f-4684-4d41-bd92-a880e4ad29a3_Simulator_Screen_Shot_-_iPhone_8_Plus_-_2020-08-07_at_00.43.41.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/6a/e8/7f/6ae87fbe-5781-9091-f898-a0a955a5ea21/tns.lghaahsh.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/65/55/b3/6555b3f3-bbf7-a21a-6d08-579ccf9cb7b1/tns.gjkvksdq.png/576x768bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/a7/af/13/a7af1353-5fd9-9b08-60d4-c54c566b9c7f/25f543e7-faa0-458c-8cdf-b26ac3815795_Simulator_Screen_Shot_-_iPad_Pro__U002812.9-inch_U0029__U00282nd_generation_U0029_-_2020-08-07_at_00.47.28.png/576x768bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/85/28/df/8528df95-254a-1079-6308-61ae339ef70b/86525527-1a53-4ae3-a487-d4c0005c084d_Simulator_Screen_Shot_-_iPad_Pro__U002812.9-inch_U0029__U00282nd_generation_U0029_-_2020-08-07_at_00.47.30.png/576x768bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/ac/c8/30/acc83056-3891-eb85-e92b-c3cd4d7f4bd3/tns.ewslisbc.png/576x768bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/82/23/9f/82239fc7-29f4-c031-1da7-b32fd4e9c02a/source/512x512bb.jpg", + "isGameCenterEnabled": false, + "supportedDevices": [ + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone8-iPhone8", + "iPhone6-iPhone6", + "iPhoneXSMax-iPhoneXSMax", + "MacDesktop-MacDesktop", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPhone8Plus-iPhone8Plus", + "iPhone11-iPhone11", + "iPadMini3-iPadMini3", + "iPad74-iPad74", + "iPad71-iPad71", + "iPad878-iPad878", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadProFourthGen-iPadProFourthGen", + "iPadPro97-iPadPro97", + "iPhoneXR-iPhoneXR", + "iPhone11Pro-iPhone11Pro", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadAir3Cellular-iPadAir3Cellular", + "iPad834-iPad834", + "iPhone7-iPhone7", + "iPad612-iPad612", + "iPad76-iPad76", + "iPhoneX-iPhoneX", + "iPhone11ProMax-iPhone11ProMax", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPhone6Plus-iPhone6Plus", + "iPhone6sPlus-iPhone6sPlus", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPad856-iPad856", + "iPadMiniRetina-iPadMiniRetina", + "iPadAirCellular-iPadAirCellular", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPad75-iPad75", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadMini4-iPadMini4", + "iPadPro-iPadPro", + "iPadMini5-iPadMini5", + "iPad72-iPad72", + "iPadAir-iPadAir", + "iPadPro97Cellular-iPadPro97Cellular", + "iPhoneXS-iPhoneXS", + "iPhone5s-iPhone5s", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPad812-iPad812", + "iPad73-iPad73", + "iPad611-iPad611", + "iPadAir2-iPadAir2", + "iPhoneSE-iPhoneSE", + "iPhone7Plus-iPhone7Plus", + "iPadAir3-iPadAir3", + "iPadProSecondGen-iPadProSecondGen", + "iPadAir2Cellular-iPadAir2Cellular", + "iPadProCellular-iPadProCellular", + "iPhone6s-iPhone6s", + "iPadSeventhGen-iPadSeventhGen" + ], + "advisories": [ + "Infrequent/Mild Alcohol, Tobacco, or Drug Use or References" + ], + "artistViewUrl": "https://apps.apple.com/us/developer/lifted-software-ug-haftungsbeschraenkt/id453211140?uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/82/23/9f/82239fc7-29f4-c031-1da7-b32fd4e9c02a/source/60x60bb.jpg", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/82/23/9f/82239fc7-29f4-c031-1da7-b32fd4e9c02a/source/100x100bb.jpg", + "kind": "software", + "features": [ + "iosUniversal" + ], + "currency": "USD", + "fileSizeBytes": "20374528", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "12+", + "languageCodesISO2A": [ + "EN", + "DE" + ], + "trackId": 1507602536, + "trackName": "eatAround - order food", + "minimumOsVersion": "13.0", + "formattedPrice": "Free", + "primaryGenreName": "Food & Drink", + "releaseDate": "2020-06-26T07:00:00Z", + "genreIds": [ + "6023", + "6012" + ], + "releaseNotes": "- macOS support\nReally - search for \"eatAround\" on the Mac App Store!\n\n- small improvements", + "currentVersionReleaseDate": "2020-08-30T06:10:50Z", + "sellerName": "Lifted Software UG (haftungsbeschraenkt)", + "primaryGenreId": 6023, + "trackCensoredName": "eatAround - order food", + "trackViewUrl": "https://apps.apple.com/us/app/eataround-order-food/id1507602536?uo=4", + "contentAdvisoryRating": "12+", + "averageUserRating": 0, + "version": "1.7", + "wrapperType": "software", + "artistId": 453211140, + "artistName": "Lifted Software UG (haftungsbeschraenkt)", + "genres": [ + "Food & Drink", + "Lifestyle" + ], + "price": 0.00, + "description": "Get the best food in Berlin delivered to you.\nWe are starting with the restaurant \"Bahadur\". There are many people, who consider this restaurant to be the best north Indian restaurant in Berlin. You should try it right away!", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "software.lifted.foodrunner", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple5/v4/29/61/84/29618425-c2a8-65fc-1cde-ca75bf9703d9/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple7/v4/ef/43/84/ef438463-8d27-e726-9a33-78408c2fb2b7/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple5/v4/e1/7a/64/e17a6400-d691-13e7-a793-703a15dd757a/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/gabriel-arjones/id908485294?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple5/v4/e1/7a/64/e17a6400-d691-13e7-a793-703a15dd757a/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple5/v4/e1/7a/64/e17a6400-d691-13e7-a793-703a15dd757a/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "2366042", + "sellerUrl": "http://wistats.arjones.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 991208515, + "trackName": "wiStats", + "minimumOsVersion": "10.10", + "formattedPrice": "$1.99", + "primaryGenreName": "Utilities", + "releaseDate": "2015-06-02T21:21:58Z", + "genreIds": [ + "6002", + "6007" + ], + "releaseNotes": "- Bug fixes and internal improvements", + "currentVersionReleaseDate": "2015-06-06T21:43:56Z", + "sellerName": "Gabriel Arjones", + "primaryGenreId": 6002, + "trackCensoredName": "wiStats", + "trackViewUrl": "https://apps.apple.com/us/app/wistats/id991208515?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.0.1", + "wrapperType": "software", + "artistId": 908485294, + "artistName": "Gabriel Arjones", + "genres": [ + "Utilities", + "Productivity" + ], + "price": 1.99, + "description": "wiStats is a Today Extension Widget that will show information about the currently connected WiFi network and run internet speed tests.\n\nwiStats will quickly tell you your:\n\n- Local IP;\n- Network security;\n- WiFi link speed;\n- Signal strength;\n- Download traffic stats;\n- Upload traffic stats;\n- Internet service provider;\n- Real IP;\n- Internet latency (PING);\n- Download speed (bandwidth);\n- Upload speed (bandwidth);", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.arjones.wiStats", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple117/v4/bd/92/16/bd9216e1-bbac-fe5f-27d1-7c6cd2755f13/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple117/v4/74/66/ac/7466ac21-9dd0-cb5c-1f26-3a93b04420c6/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple117/v4/5c/65/79/5c657924-682a-595e-7379-74b9c6aeb419/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple127/v4/e9/49/ea/e949ea58-15e9-a833-7476-e10d5de19068/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/1e/3c/1e/1e3c1e86-c4a6-6ef5-99ec-e59dffefc2f4/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/shoichi-takahashi/id1196139544?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/1e/3c/1e/1e3c1e86-c4a6-6ef5-99ec-e59dffefc2f4/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/1e/3c/1e/1e3c1e86-c4a6-6ef5-99ec-e59dffefc2f4/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "55163464", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN", + "JA" + ], + "trackId": 1196139545, + "trackName": "SCONE Diff", + "minimumOsVersion": "10.10.0", + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2017-07-14T03:17:58Z", + "genreIds": [ + "6007" + ], + "releaseNotes": "- If the output directory is not specified or does not exist when the extract button is pressed, a dialog for selecting the output directory is displayed.\n By specifying the output directory, you can continue the extraction process.\n- Bug fixes.", + "currentVersionReleaseDate": "2019-05-16T02:37:09Z", + "sellerName": "Shoichi Takahashi", + "primaryGenreId": 6007, + "trackCensoredName": "SCONE Diff", + "trackViewUrl": "https://apps.apple.com/us/app/scone-diff/id1196139545?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.0.9", + "wrapperType": "software", + "artistId": 1196139544, + "artistName": "Shoichi Takahashi", + "genres": [ + "Productivity" + ], + "price": 0.00, + "description": "Do you want to deliver only selected necessary files? Then SCONE diff is for you! \n\nSCONE diff can extract files freely based on conditions such as date/time (you can specify up to seconds). \nThe extracted file can be copied to another place while maintaining the directory structure.\n\n* In the basic edition, options other than \"Specify the date and time (from)\" can not be used. For more detailed output, purchase the professional edition.\n\n[Disclaimer]\nSCONE Diff does not collect or publish any personal information.\nTeam SCONE are not responsible for any damage caused by using this application.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.sconeapp.diff", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple4/v4/45/fa/8e/45fa8ed0-a323-90bc-6a99-59bf672304cc/mzl.axslxfrx.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple4/v4/4c/9e/39/4c9e39d7-4874-4a9d-25f3-d56884717ca4/mzl.vnokswli.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple6/v4/16/73/95/16739510-d566-60a4-135c-2fd82da18061/mzl.mbkdxtfa.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple6/v4/ce/74/e9/ce74e9df-b457-e3eb-4086-d34ea3b917ad/mzl.lsvsiubo.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/b7/89/87/b7898795-e63e-35e6-4006-58c1796631b7/mzl.oqdltoma.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/2a/4d/3c/2a4d3cc0-2d4d-719c-b445-fa3311cc2b2c/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/macrobian-games/id950173977?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/2a/4d/3c/2a4d3cc0-2d4d-719c-b445-fa3311cc2b2c/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/2a/4d/3c/2a4d3cc0-2d4d-719c-b445-fa3311cc2b2c/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "52804208", + "sellerUrl": "http://www.macrobiangames.com/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 815017078, + "trackName": "Truck Transporter Simulator 3D", + "minimumOsVersion": "10.8", + "formattedPrice": "$1.99", + "primaryGenreName": "Games", + "releaseDate": "2014-02-14T06:26:03Z", + "genreIds": [ + "6014", + "7013", + "7001", + "6016" + ], + "releaseNotes": "- New OS Compatible.\n- Minor bug fixes.", + "currentVersionReleaseDate": "2018-04-10T19:45:53Z", + "sellerName": "Macrobian Games", + "primaryGenreId": 6014, + "trackCensoredName": "Truck Transporter Simulator 3D", + "trackViewUrl": "https://apps.apple.com/us/app/truck-transporter-simulator-3d/id815017078?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.1", + "wrapperType": "software", + "artistId": 950173977, + "artistName": "Macrobian Games", + "genres": [ + "Games", + "Racing", + "Action", + "Entertainment" + ], + "price": 1.99, + "description": "Download and Play our new Trucker Transporter 3D game.\n\nYou are playing a driver of a truck. Your job is to deliver deliverable stuff\u2028 without falling or crash.\n\nFeatures:\n*Excellent graphics and amazing environment\n*Real truck physics\n*Three amazing trucks with deliverable stuff\n*Unique, different and smooth levels\n*Amazing obstacles and Beautiful design tracks in each level\n*Addictive game play with ultra smooth tilt controls\n*Game Services integrated for leader boards", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.gameocean.ttmac", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple/v4/98/43/dd/9843dd1a-4816-c299-7d89-e6a6fc6f6b70/mzl.gneqqrhu.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/32/c6/de/32c6de0e-2615-7f9b-d8c6-88c320ac9665/mzl.woqqaway.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/04/61/9d/04619daa-ccb7-fbe3-3ba6-1183ef36fb51/mzl.jtbrbgmo.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple4/v4/5f/84/64/5f846487-a3ae-6c3d-50c8-2eecb08ca929/mzl.jnbeuqxu.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple6/v4/f5/b1/60/f5b1600f-4bc3-3a2c-84b1-97c6674a7f08/mzl.wnjbboga.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple125/v4/11/c5/6b/11c56be1-3d95-f33c-01fa-ac83ade29dae/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/macrobian-games/id950173977?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple125/v4/11/c5/6b/11c56be1-3d95-f33c-01fa-ac83ade29dae/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple125/v4/11/c5/6b/11c56be1-3d95-f33c-01fa-ac83ade29dae/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "48446062", + "sellerUrl": "http://www.macrobiangames.com/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 815021291, + "trackName": "Army Trucker Transporter 3D", + "minimumOsVersion": "10.8", + "formattedPrice": "$1.99", + "primaryGenreName": "Games", + "releaseDate": "2014-03-27T22:25:27Z", + "genreIds": [ + "6014", + "7013", + "7001", + "6016" + ], + "releaseNotes": "bug Solve", + "currentVersionReleaseDate": "2018-06-05T16:38:24Z", + "sellerName": "Macrobian Games", + "primaryGenreId": 6014, + "trackCensoredName": "Army Trucker Transporter 3D", + "trackViewUrl": "https://apps.apple.com/us/app/army-trucker-transporter-3d/id815021291?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.1", + "wrapperType": "software", + "artistId": 950173977, + "artistName": "Macrobian Games", + "genres": [ + "Games", + "Racing", + "Action", + "Entertainment" + ], + "price": 1.99, + "description": "Download and Play our new Army Trucker Transporter 3D game.\n\nYou are playing a driver of a army truck. Your job is to deliver deliverable stuff\u2028 without falling or crash.\n\nFeatures:\n* Excellent graphics and amazing environment\n* Real army truck physics\n* Three amazing army trucks with deliverable stuff\n* Unique, different and smooth levels\n* Amazing obstacles and beautiful design tracks in each level\n* Addictive game play with ultra smooth controls\n* Game Services integrated for leader boards\n\u2028* Unlock new level after every level", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.gameocean.armytruckermac", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple2/v4/b1/a3/cc/b1a3cc6f-adbc-e4fa-4942-51acd7f5567b/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple69/v4/79/33/0e/79330edb-e83d-218e-7040-0cd14b8afd6f/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple2/v4/ce/57/50/ce575088-edbe-d13e-1baf-ea0ae2ed670a/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple2/v4/d1/c0/9b/d1c09bcb-1159-77cd-dc78-fc9a10ffc9c9/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple2/v4/76/0d/21/760d21ee-9b2f-8c5d-5a08-21dbf2c6ae46/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/35/99/84/35998466-6f6b-779f-ced1-bf6b218bae9d/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/vladimir-romanov/id836501789?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/35/99/84/35998466-6f6b-779f-ced1-bf6b218bae9d/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/35/99/84/35998466-6f6b-779f-ced1-bf6b218bae9d/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "133155434", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "RU", + "ES" + ], + "trackId": 1063406790, + "trackName": "Delivery Service", + "minimumOsVersion": "10.9", + "formattedPrice": "$27.99", + "primaryGenreName": "Finance", + "releaseDate": "2015-12-11T06:02:14Z", + "genreIds": [ + "6015", + "6000" + ], + "releaseNotes": "stability improvements", + "currentVersionReleaseDate": "2018-04-30T13:12:48Z", + "sellerName": "Vladimir Romanov", + "primaryGenreId": 6015, + "trackCensoredName": "Delivery Service", + "trackViewUrl": "https://apps.apple.com/us/app/delivery-service/id1063406790?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "2.01.08", + "wrapperType": "software", + "artistId": 836501789, + "artistName": "Vladimir Romanov", + "genres": [ + "Finance", + "Business" + ], + "price": 27.99, + "description": "The program makes it possible to optimize all business processes of your delivery service. The system \"Delivery Service\" helps to organize the operational work at every stage of the order process. \"Delivery Service\" - a simple solution for quick processing of orders, transmit them to the kitchen / assembly department / warehouse, and then the distribution of orders between the couriers.\n\nThe user interface is designed for comfortable work with the system.\nEach order contains a status field of the payment. The orders and the order items have their own status. Each state has its own colour, which can be configured individually by the user. By creating a new order, the specifications and the customer's wishes can be considered. When calculating the price policy, you can add a variety of discounts and promotions. Discounts may be listed both in currency and interest rates, and the periods of price action may depend on the day of the week and time of day.\n\nThe program includes a flexible data management tool. There are several ways to enter the data quickly, such as hot-buttons, auto input of the information from a database, etc.\nA function of flexible and easy information search by various parameters of the database program will facilitate the work considerably.\n\nAn important feature is the implementation of a detailed customer database, with their addresses, phone numbers, identification numbers, etc. The program will also keep records of all your employees, with their contact details, photos and additional information and notes.\n\nThe program has a built-in function to check the inventory of the stock. When specifying the order quantity of available dishes / items, the program will calculate the remaining amount. This means that the order will be rejected by the system, if the dish / item ran out.\n\nIn the program \"Delivery Service\" it is possible to create a variety of reports and graphics for the required period. The overview can be according to different categories, and can be presented in the form of charts, graphs and tables. Accordingly, it will be easy to create the income statement of your company.\n\nThe program includes a convenient function of printing of bills and receipts. It is noteworthy that at each stage of order processing own receipt can be printed out. For example, in the receipt for the courier is the customer address specified.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "de.temia.tm16en", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple5/v4/06/85/06/06850652-d73f-88dc-d3e9-a12a4ba6a93f/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple3/v4/7b/3e/1b/7b3e1bc1-a6cf-47aa-c0cc-6678272dfcf9/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple3/v4/00/b4/8f/00b48faa-7874-3b10-576e-e0e656aea7b4/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple1/v4/95/9d/61/959d61f6-c723-5a5a-0663-3a5aaeb56240/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple1/v4/10/48/9c/10489cf9-3959-3c2f-c7a4-73a1ffe5b0c4/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/75/b4/71/75b47106-dc9c-53c5-9648-81b955707f18/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/vladimir-romanov/id836501789?mt=12&uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/75/b4/71/75b47106-dc9c-53c5-9648-81b955707f18/source/60x60bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/75/b4/71/75b47106-dc9c-53c5-9648-81b955707f18/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "133200470", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "ZH", + "EN", + "FI", + "IT", + "SE", + "NO", + "PT", + "ES" + ], + "trackId": 927646990, + "trackName": "Stock Accounting for Store", + "minimumOsVersion": "10.9", + "formattedPrice": "$33.99", + "primaryGenreName": "Business", + "releaseDate": "2014-10-22T06:45:22Z", + "genreIds": [ + "6000", + "6015" + ], + "releaseNotes": "stability improvements", + "currentVersionReleaseDate": "2019-07-24T21:52:44Z", + "sellerName": "Vladimir Romanov", + "primaryGenreId": 6000, + "trackCensoredName": "Stock Accounting for Store", + "trackViewUrl": "https://apps.apple.com/us/app/stock-accounting-for-store/id927646990?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "2.01.22", + "wrapperType": "software", + "artistId": 836501789, + "artistName": "Vladimir Romanov", + "genres": [ + "Business", + "Finance" + ], + "price": 33.99, + "description": "If you want to simplify the inventory accounting of your shop and warehouse, use our program. The program will help you to keep accounts of your product range in easy manner. You will have a possibility to assign to each product its own number, name, to add necessary description, bar code and also to split your products into categories and subcategories. Also it is possible to add numerous categories such as status, different prices and unlimited number of photos.\n\nIt is possible to filter your products by any necessary criteria and look up them directly in the search field by specific feature. Among other things you can save the list of products in PDF-format, export it into CSV-format and to print.\n\nThe function of easy changing the number of products in your warehouse will be also appreciated by you. To make the changing it is necessary to create a new supply with supplier data and required products. The products will be added to the warehouse automatically and the information about their direct location will be indicated. This function can be also performed by direct adding of the specific products, by changing and removing the existing ones in the dialog mode with stockholding. By doing so all the value parameters of the user are described in change history record of stockholding management. Some additional features can be defined for supplies, for example, outside and local number, status, suppliers, accounts, payment status and methods of payment.\n\nThis program provides an easy way to add and browse the suppliers. In addition to the basic information about each supplier, you can also see his tax identification number, contact information, notes, photos and other details. The program allows you to make sorting of suppliers into various groups or adding status for them. All the mentioned functions are also can be applied to clients catalogues.\n\nIn the stockholding tab of the program it is allowed to browse the position, quantity of available products and the its price. Using the guiding function you can easy add, modify or remove some single elements, number, price or storage position.\n\nThe program has a special function – order list dialogue. You can add a new order into the list or modify the current one. It is possible to add to each order various documents such as account, commercial offer or order confirmation. Each order has its own status. The list of available status also can be modified by the user.\n\nThe program allows you to create easily your own bills of loading and invoices with the header and logo. The distance between lines and displayed columns you can set by yourself. If you want you can also use the ready-made available templates and the only thing to do is to enter your data. The program maintains different tax rates in invoices. The program automatically assigns a number to each document, or the numbers can be assigned manually.\n\nUsing different variants of general view it is possible to display the contents of your warehouse by products categories or status. Also the full review of supplies and products is available. All this information can be displayed graphically over a special period of time.\n\nThe next important peculiarity of the program is integrated back-up function that automatically indicates the possibility to back-up your data in the definitive period of time. Any of the created documents can be printed or saved in PDF-format.\n\nAs you know all our programs have help-function. If you have any problem you can contact us any time via our integrated support service. We can help you quickly and effectively.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "de.temia.tm02en", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/ed/62/5b/ed625b50-2ca7-f2a5-6fba-7dc0a9ed9b91/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/3e/ca/a2/3ecaa2a6-e575-c0f5-c607-0ab68f3a1bb5/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/3b/bf/5e/3bbf5ed2-54d6-c8aa-68ca-f8ec66872292/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/ae/51/ce/ae51ce79-254e-a9af-bf0b-1b6196dc7a77/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/30/ac/ad/30acadbf-fc06-23bb-3c07-19581b42003f/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/0e/ca/1b/0eca1b72-2593-e605-e1d7-41f2e3764415/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/0b/fe/e2/0bfee2bc-e871-bde0-0dc2-1519cfd40b92/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/7d/e4/81/7de4816e-da29-cb73-9c28-6f7c6dafa83a/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/boardroom-pty-limited/id1089830708?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/7d/e4/81/7de4816e-da29-cb73-9c28-6f7c6dafa83a/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/7d/e4/81/7de4816e-da29-cb73-9c28-6f7c6dafa83a/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "34537046", + "sellerUrl": "https://www.boardroomlimited.com/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 1495603956, + "trackName": "BoardRoom DashBoard", + "minimumOsVersion": "10.15", + "formattedPrice": "Free", + "primaryGenreName": "Business", + "releaseDate": "2020-02-12T08:00:00Z", + "genreIds": [ + "6000" + ], + "releaseNotes": "• Adds ability to resend authentication code for initial registration or subsequent device registration via email if SMS not received\n• Fixed issue if first item was indented (and should not be)\n• Fixed issue with resolution where signing was not on the first page\n• A number of performance enhancements", + "currentVersionReleaseDate": "2020-07-24T23:25:07Z", + "sellerName": "Boardroom Pty Limited", + "primaryGenreId": 6000, + "trackCensoredName": "BoardRoom DashBoard", + "trackViewUrl": "https://apps.apple.com/us/app/boardroom-dashboard/id1495603956?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.1.6", + "wrapperType": "software", + "artistId": 1089830708, + "artistName": "Boardroom Pty Limited", + "genres": [ + "Business" + ], + "price": 0.00, + "description": "Ensure your next board meeting is secure with DashBoard, a document creation and consumption tool protected by the Lockbox Technologies Secure Storage Platform. \n\nWe deliver outstanding customer experiences for board members and administrators. Unlike the competitors, your data is so secure on the Lockbox Technologies Secure Storage Platform that not even the Lockbox team can decrypt it.\n\nFor demonstration mode; enter the username 'demo'. NOTE: Not all features are available in demonstration mode.\n\nOther benefits:\n \n• Securely download agenda items including documents, minutes, resolutions, votes and video\n• Our resolutions feature allows secure, certificate signed, board resolutions\n• Secure offline access of all items\n• Intelligent downloads ensure you can get what you need to read in the order that matters to you\n• Stay up to date with built-in calendar\n• Files are for commonly accessed company policies, charters, governance and other documents\n• Secure cross device syncing of notes and annotations\n• Advanced side by side document comparison\n• Annotate documents with ink, sticky notes, text, comments, shapes and more\n• Write, type or dictate notes alongside your documents with our secure notes feature which can be optionally printed and exported\n• Advanced progress bar for easy access to all documents within a board binder\n• Agenda available when viewing items", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "maccatalyst.au.com.boardroomlimited.dashboard", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/03/9c/fa/039cfab3-dc3b-778e-3ee6-e8b8647a0f5f/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/fa/d6/09/fad60932-dce9-7814-bd5c-3aa09054e820/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/48/60/c1/4860c1ca-e2a1-9e02-2d15-1e4fec8330f3/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/e9/89/60/e98960e9-0009-d761-a6a5-6e7286bcf277/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/3c/de/d3/3cded30b-acea-59dc-8ab4-d7909f32ceff/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/ee/98/c8/ee98c834-86ce-6b4f-8d9b-391d4f332518/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/34/d2/8b/34d28be1-5744-a038-16cf-f6113d40187a/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/1f/72/77/1f727766-205a-e734-24dc-5b7562d00934/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/lockbox-technologies-p-l/id1439126397?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/1f/72/77/1f727766-205a-e734-24dc-5b7562d00934/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/1f/72/77/1f727766-205a-e734-24dc-5b7562d00934/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "46886620", + "sellerUrl": "https://www.athenaboard.com/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 1482354553, + "trackName": "Athena Board", + "minimumOsVersion": "10.15", + "formattedPrice": "Free", + "primaryGenreName": "Business", + "releaseDate": "2019-12-19T08:00:00Z", + "genreIds": [ + "6000" + ], + "releaseNotes": "• Adds ability to resend authentication code for initial registration or subsequent device registration via email if SMS not received\n• A number of performance enhancements", + "currentVersionReleaseDate": "2020-07-24T23:26:06Z", + "sellerName": "Lockbox Technologies Pty Ltd", + "primaryGenreId": 6000, + "trackCensoredName": "Athena Board", + "trackViewUrl": "https://apps.apple.com/us/app/athena-board/id1482354553?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.1.9", + "wrapperType": "software", + "artistId": 1439126397, + "artistName": "Lockbox Technologies P/L", + "genres": [ + "Business" + ], + "price": 0.00, + "description": "Ensure your next board meeting is secure with Athena Board, a document creation and consumption tool protected by the Lockbox Technologies Secure Storage Platform. \n\nWe deliver outstanding customer experiences for board members and administrators. Unlike the competitors, your data is so secure on the Lockbox Technologies Secure Storage Platform that not even the Lockbox team can decrypt it.\n\nFor demonstration mode; enter the username 'demo'. NOTE: Not all features are available in demonstration mode.\n\nOther benefits:\n \n• Securely download agenda items including documents, minutes, resolutions, votes and video\n• Our resolutions feature allows secure, certificate signed, board resolutions\n• Secure offline access of all documents\n• Intelligent downloads ensure you can get what you need to read in the order that matters to you\n• Stay up to date with built-in calendar\n• Files are for commonly accessed company policies, charters, governance and other documents\n• Advanced side by side document comparison\n• Annotate documents with ink, sticky notes, text, comments, shapes and more\n• Write, type or dictate notes alongside your documents with our secure notes feature which can be optionally printed and exported\n• Advanced progress bar for easy access to all documents within a board binder\n• Agenda available when viewing documents", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "maccatalyst.au.com.lockboxtech.athena", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/a6/84/cf/a684cfed-7a3f-691c-bd3a-b6815f4af936/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/a8/62/90/a86290b1-3f0d-4747-7769-710aeec22829/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/7c/8b/7b/7c8b7b3f-134b-7143-0012-03d99fa45f8b/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/shoichi-takahashi/id1196139544?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/7c/8b/7b/7c8b7b3f-134b-7143-0012-03d99fa45f8b/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/7c/8b/7b/7c8b7b3f-134b-7143-0012-03d99fa45f8b/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "55093841", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN", + "JA" + ], + "trackId": 1463910241, + "trackName": "SCONE Extract", + "minimumOsVersion": "10.10.0", + "formattedPrice": "Free", + "primaryGenreName": "Productivity", + "releaseDate": "2019-06-15T07:58:36Z", + "genreIds": [ + "6007" + ], + "currentVersionReleaseDate": "2019-06-15T07:58:36Z", + "sellerName": "Shoichi Takahashi", + "primaryGenreId": 6007, + "trackCensoredName": "SCONE Extract", + "trackViewUrl": "https://apps.apple.com/us/app/scone-extract/id1463910241?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.0.0", + "wrapperType": "software", + "artistId": 1196139544, + "artistName": "Shoichi Takahashi", + "genres": [ + "Productivity" + ], + "price": 0.00, + "description": "SCONE Extract is a tool for developers that extracts files based on file list.\nIf you know in advance the files you want to deliver, save the file list!\nFor example, you can get the path of the required file from the git repository and quickly extract the file.\nFrom now on, there is no need to copy files or input complicated commands.\nIf you have trouble extracting files, please let SCONE Extract!\n\n* This description is an introduction to the application in SCONE Extract Pro. In this application (Basic version), we have set an upper limit on the number of lists that can be read. For an unlimited number, order SCONE Extract Pro.\n\n[Disclaimer]\nSCONE Extract does not collect or publish any personal information.\nTeam SCONE are not responsible for any damage caused by using this application.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.sconeapp.extract", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple127/v4/24/17/bb/2417bb31-527c-d9e1-1d26-cf510305011b/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple127/v4/db/62/c3/db62c385-db05-7a5a-e4d8-43b9626e5d87/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple127/v4/23/a1/39/23a1398e-d038-c781-1812-37ed8e1c04dc/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple127/v4/49/64/ff/4964ffc2-4914-a02f-8d4a-6b8c609d7c67/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/c2/ce/a1/c2cea1cc-32c7-e636-6a0f-2da781a6ceda/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/shoichi-takahashi/id1196139544?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/c2/ce/a1/c2cea1cc-32c7-e636-6a0f-2da781a6ceda/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/c2/ce/a1/c2cea1cc-32c7-e636-6a0f-2da781a6ceda/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "55167568", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN", + "JA" + ], + "trackId": 1234926679, + "trackName": "SCONE Diff Pro", + "minimumOsVersion": "10.10.0", + "formattedPrice": "$7.99", + "primaryGenreName": "Productivity", + "releaseDate": "2017-07-14T07:43:48Z", + "genreIds": [ + "6007" + ], + "releaseNotes": "- If the output directory is not specified or does not exist when the extract button is pressed, a dialog for selecting the output directory is displayed.\n By specifying the output directory, you can continue the extraction process.\n- Bug fixes.", + "currentVersionReleaseDate": "2019-05-16T02:36:16Z", + "sellerName": "Shoichi Takahashi", + "primaryGenreId": 6007, + "trackCensoredName": "SCONE Diff Pro", + "trackViewUrl": "https://apps.apple.com/us/app/scone-diff-pro/id1234926679?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.0.9", + "wrapperType": "software", + "artistId": 1196139544, + "artistName": "Shoichi Takahashi", + "genres": [ + "Productivity" + ], + "price": 7.99, + "description": "SCONE diff is an application that can extract differential files.\n\nSuch as cases where there is no version control, or having to deliver only image files.... ?\nSCONE diff can extract files freely based on conditions such as date/time (you can specify up to seconds), extensions, and regular expressions. \nIt can also exclude invisible files (files starting with \".\"), \"_notes\" generated by Adobe © Dreamweaver, exclude files that you do not want to deliver such as Sass and JavaScript before compression etc. in a clean state.\nThe extracted file can be copied to another place while maintaining the directory structure.\nIn addition, since it is capable of saving the file list, we can deliver upgraded notes such as attaching \"complete delivery file\" to the client.\n\nSCONE Diff does not collect or publish any personal information.\n\n[DISCLAIMER]\nSCONE Diff does not collect or publish any personal information.\nTeam SCONE are not responsible for any damage caused by using this application.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.sconeapp.diff.pro", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/9d/9e/ab/9d9eab2c-3d59-0675-bc5c-e62ea34b0ab6/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/f5/ba/e4/f5bae45d-8aae-8fd5-bfec-4e1cbd9b2fe8/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/49/45/ca/4945caef-d347-3efd-ab4b-97c113ce23ac/mzl.gxehxcow.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/da/e2/29/dae2296d-ca11-4f31-8311-7d9593c3edef/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/31/5f/ec/315fecd0-46d6-57e7-97b4-1226f389ca3c/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/roman-volinsky/id977951850?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/31/5f/ec/315fecd0-46d6-57e7-97b4-1226f389ca3c/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/31/5f/ec/315fecd0-46d6-57e7-97b4-1226f389ca3c/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "1318487", + "sellerUrl": "http://www.volard.wordpress.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 1343776514, + "trackName": "Liposome Suite", + "minimumOsVersion": "10.15", + "formattedPrice": "$4.99", + "primaryGenreName": "Education", + "releaseDate": "2018-02-02T23:18:23Z", + "genreIds": [ + "6017", + "6002" + ], + "releaseNotes": "Compatibility update.", + "currentVersionReleaseDate": "2020-05-04T15:38:15Z", + "sellerName": "Roman Volinsky", + "primaryGenreId": 6017, + "trackCensoredName": "Liposome Suite", + "trackViewUrl": "https://apps.apple.com/us/app/liposome-suite/id1343776514?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "2.1", + "wrapperType": "software", + "artistId": 977951850, + "artistName": "Roman Volinsky", + "genres": [ + "Education", + "Utilities" + ], + "price": 4.99, + "description": "Liposome Suite is a Mac application that helps in preparation and parameterization of complex lipid systems. App includes database to store lipids molar masses and formulations, comprising of various lipid solutions.\n \nConcentrations (molarity and mg/ml), components moles, final solution volume etc. are calculated based upon initial data provided, such as: initial concentrations of the stock solutions, initial volumes and desired molar ratios.\n \nThe Calculator follows the common liposome preparation procedure, discussed at www.volard.wordpress.com:\n \n· Stock solutions of lipids (or any other compound) are mixed in appropriate molar ratios.\n· Obtained mixture is purged with nitrogen and organic solvent is finally evacuated under vacuum.\n· Obtained lipid mixture is hydrated and extruded or sonicated, according to the needs.\n \n \nCalculator features:\n \nApplication is fully interactive: calculations initiated by ► button are sensitive to the recently updated data. For example: final molar concentration and lipid molar fractions (%) of the components can be adjusted at any time if molar concentrations of starting solutions and final suspension volume are provided. Upon any of the aforementioned changes, the application will calculate the volumes of the initial solutions to match the desired final parameters. \n \nIf molecular weights (Mw, \"g/mole\") of solutes (lipids) are provided, then concentrations in the units of grams of solute per liter of solution (\"g/l\" equivalent to \"mg/ml\") can be used and calculated.\n \nIf lipid name exists in database, then application will suggest to autocomplete name and fill in molar mass field, as the name is typed.\n \nOnce calculations are accomplished, the final lipid (and not only) formulation can be stored for future needs, by providing formulation name and pressing “¯” button. To restore formulation data back to calculator, specific entry should be selected and “­” button should be pressed.\n \nTo save lipid molar mass data to the database, the fields for lipid name and molar mass should be filled in, followed by pressing “V” button.\n \nThe lipid molar mass entries can be edited by double clicking the specific entry and editing the value in molar mass field and the pressing the “V” button.\n \nThe formulation entry and lipid entry can be removed by selecting the specific entry and pressing the corresponding “X” button.\n \n \nImportant points:\n \nThe user should follow the simple rule to ensure proper functionality: all known data should be provided in the following order: solution or solute name (optional) -> Mw (if needed) -> initial concentrations (must!) -> volumes (if known) -> molar ratios (if known) -> Total Molarity (if known) -> Total Volume (if known).\n \nSum of stock solution volumes doesn't have to be equal to final suspension volume (Refer to the procedure)!\n \nWatch the molar ratios to ensure that all starting components are included! Program will skip components for which insufficient data is provided! Thus, for example concentration in g/l cannot be included in calculations if Mw of solute is not provided.\n \nIf user updates molar ratios (percents only), program will not start calculations until sum of the ratios will be 100 exactly and obviously, not before than initial concentrations are provided.\n \nTotal Concentration in \"g/l\" and Total Moles fields are for output only.\n \nPlease use \"Done\" button in keyboard or \"Enter\" button to let application know that data is ready. Application is not sensitive to an unconfirmed input for a good reason.\n \nApplication assigns dot as a decimal separator.\n\nLiposome Analysis:\n\nThe window is divided into data panel (left) and results panel (right).\n \nThe data parameters:\nLipid concentration, solution volume, liposome outer diameter,\nbilayer Thickness and molecular Area\n\nThe results parameters:\nAverage number of lipid molecules in a single liposome, \nTotal number of liposomes in the analyzed solution, Inner Volume, Surface Area, Encapsulation", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.macVR.LiposomeSuite", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/69/a1/9b/69a19b08-4615-a9ec-9152-81cd7b8cc704/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/c5/fc/33/c5fc3306-d404-1a6f-15aa-4fd7d155aaf0/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/93/48/09/93480918-6394-23e9-2d3d-97699cd8469f/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/shoichi-takahashi/id1196139544?mt=12&uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/93/48/09/93480918-6394-23e9-2d3d-97699cd8469f/source/60x60bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/93/48/09/93480918-6394-23e9-2d3d-97699cd8469f/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "55093839", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "languageCodesISO2A": [ + "EN", + "JA" + ], + "trackId": 1463910399, + "trackName": "SCONE Extract Pro", + "minimumOsVersion": "10.10.0", + "formattedPrice": "$7.99", + "primaryGenreName": "Productivity", + "releaseDate": "2019-06-15T07:59:00Z", + "genreIds": [ + "6007" + ], + "currentVersionReleaseDate": "2019-06-15T07:59:00Z", + "sellerName": "Shoichi Takahashi", + "primaryGenreId": 6007, + "trackCensoredName": "SCONE Extract Pro", + "trackViewUrl": "https://apps.apple.com/us/app/scone-extract-pro/id1463910399?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "version": "1.0.0", + "wrapperType": "software", + "artistId": 1196139544, + "artistName": "Shoichi Takahashi", + "genres": [ + "Productivity" + ], + "price": 7.99, + "description": "SCONE Extract is a tool for developers that extracts files based on file list.\nIf you know in advance the files you want to deliver, save the file list!\nFor example, you can get the path of the required file from the git repository and quickly extract the file.\nFrom now on, there is no need to copy files or input complicated commands.\nIf you have trouble extracting files, please let SCONE Extract!\n\n[Disclaimer]\nSCONE Extract does not collect or publish any personal information.\nTeam SCONE are not responsible for any damage caused by using this application.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "com.sconeapp.extract.pro", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple125/v4/a8/a4/09/a8a4091f-b738-1041-cc60-3e395920aa17/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple125/v4/47/36/3f/47363f10-0c57-03e7-a1dc-7502c13d97e2/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple115/v4/ed/c8/bd/edc8bd42-d041-e736-ceb0-370390dcccf0/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple115/v4/01/8c/d1/018cd149-372c-e7ea-d3eb-172cd73a610c/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple115/v4/a5/7a/f4/a57af4e6-c825-a335-a7b2-b02f37d3d0ff/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple115/v4/84/07/2c/84072c63-0a43-9b62-9977-a39817e0f5e6/source/512x512bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/manal-abuelazaem/id1006873357?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple115/v4/84/07/2c/84072c63-0a43-9b62-9977-a39817e0f5e6/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple115/v4/84/07/2c/84072c63-0a43-9b62-9977-a39817e0f5e6/source/100x100bb.png", + "kind": "mac-software", + "currency": "USD", + "fileSizeBytes": "19544703", + "sellerUrl": "http://manalsoft.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "17+", + "languageCodesISO2A": [ + "EN" + ], + "trackId": 1381161462, + "trackName": "Pregnancy Calculator", + "minimumOsVersion": "10.10", + "formattedPrice": "$8.99", + "primaryGenreName": "Utilities", + "releaseDate": "2018-05-19T02:51:03Z", + "genreIds": [ + "6002", + "6020" + ], + "currentVersionReleaseDate": "2018-05-19T02:51:03Z", + "sellerName": "Manal Abuelazaem", + "primaryGenreId": 6002, + "trackCensoredName": "Pregnancy Calculator", + "trackViewUrl": "https://apps.apple.com/us/app/pregnancy-calculator/id1381161462?mt=12&uo=4", + "contentAdvisoryRating": "17+", + "averageUserRating": 0, + "version": "1.0", + "wrapperType": "software", + "artistId": 1006873357, + "artistName": "Manal Abuelazaem", + "genres": [ + "Utilities", + "Medical" + ], + "price": 8.99, + "description": "Simple, accurate, and reliable due-date calculator. Easily calculate pregnancy due date, trimester, conception, fertility, and gestational age. Get detailed date time with explanatory text, images, and videos.", + "isVppDeviceBasedLicensingEnabled": true, + "bundleId": "ManalSoft.Pregnancy-Calculator-Mac", + "userRatingCount": 0 + } + ] + } diff --git a/MasKitTests/JSON/search/fantastical.json b/MasKitTests/JSON/search/fantastical.json index 1cce48477..554a8a9f7 100644 --- a/MasKitTests/JSON/search/fantastical.json +++ b/MasKitTests/JSON/search/fantastical.json @@ -1,64 +1,65 @@ { "resultCount": 1, "results": [ - { - "screenshotUrls": [ - "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/57/10/c9/5710c972-cf82-9445-f377-5f25006d9eb2/source/800x500bb.jpg", - "https://is1-ssl.mzstatic.com/image/thumb/Purple122/v4/93/0a/17/930a17cc-dd94-861e-e815-76b18c6ff1f4/source/800x500bb.jpg", - "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/7c/b4/5b/7cb45b6f-f91d-b4b2-3921-b0008192a689/source/800x500bb.jpg", - "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/89/3e/de/893ede7d-d207-6199-6821-425fea169ae3/source/800x500bb.jpg", - "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/c8/40/1f/c8401fba-7d29-4fcd-8405-daf31d3638c1/source/800x500bb.jpg" - ], - "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/2a/00/31/2a0031dc-bf1b-7528-ca6a-700321af8244/source/60x60bb.png", - "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/2a/00/31/2a0031dc-bf1b-7528-ca6a-700321af8244/source/512x512bb.png", - "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/2a/00/31/2a0031dc-bf1b-7528-ca6a-700321af8244/source/100x100bb.png", - "artistViewUrl": "https://itunes.apple.com/us/developer/flexibits-inc/id435003924?mt=12&uo=4", - "kind": "mac-software", - "trackCensoredName": "Fantastical 2", - "languageCodesISO2A": [ - "EN", - "FR", - "DE", - "IT", - "JA", - "ES" - ], - "fileSizeBytes": "14768764", - "sellerUrl": "https://flexibits.com/fantastical?pk_campaign=macappstore&pk_kwd=website", - "contentAdvisoryRating": "4+", - "userRatingCountForCurrentVersion": 33, - "trackViewUrl": "https://itunes.apple.com/us/app/fantastical-2/id975937182?mt=12&uo=4", - "trackContentRating": "4+", - "averageUserRatingForCurrentVersion": 4.5, - "releaseNotes": "- Added support for Tabloid and Tabloid Oversize paper sizes when printing\n- Fixed control-clicking in the Day, Week, or Month view sometimes causing a mouse drag to begin\n- Fixed completed reminder checkbox appearing the wrong color in some situations\n- Various fixes and improvements\n\nBy the way, App Store reviews are very helpful to us. If you think Fantastical is worthy, would you mind taking a moment to write a nice review? We'd greatly appreciate it. Thanks for using Fantastical! :)", - "currentVersionReleaseDate": "2018-11-05T01:18:50Z", - "formattedPrice": "$24.99", - "sellerName": "Flexibits Inc.", - "isVppDeviceBasedLicensingEnabled": true, - "trackId": 975937182, - "trackName": "Fantastical 2", - "currency": "USD", - "wrapperType": "software", - "version": "2.5.6", - "releaseDate": "2015-03-25T12:11:28Z", - "minimumOsVersion": "10.11", - "primaryGenreName": "Productivity", - "genreIds": [ - "12014", - "12001" - ], - "artistId": 435003924, - "artistName": "Flexibits Inc.", - "genres": [ - "Productivity", - "Business" - ], - "price": 24.99, - "description": "Designed exclusively for macOS, Fantastical 2 includes powerful features such as an incredibly intuitive parsing engine, a full calendar window (with day, week, month, and year views), a quick access mini window, iCloud reminders support, time zone support, and much, much more.\n\n\"Fantastical 2 is the calendar app your Mac has been waiting for.\" - The Verge\n\"Terrific new version of one of my very favorite apps.\" - John Gruber (Daring Fireball)\n\"It's my favorite calendar app for OS X.\" - MacStories\n\"The calendar app you've been waiting for.\" - iMore\n\"Fantastical 2 is a crazy-powerful calendar app for your Mac.\" - Wired\n\nFantastical 2's natural language event and reminder creation, beautiful calendar views, and ultra-smart event list make it the best calendar and reminders app you'll ever use. Just type in that you have \"Lunch with John on Friday at 1pm\" and Fantastical 2 will schedule it! Or type in \"remind me to Buy Milk on Tuesday\" and Fantastical 2 will create a reminder with a due date! \n\nWHAT'S NEW IN FANTASTICAL 2\n\n• Beautiful, all-new design exclusively for macOS\n• Full calendar window with Day, Week, Month, and Year views\n• macOS Today Widget, Action Extension, and Share Extension\n• Handoff support between Fantastical 2 for Mac, Fantastical 2 for iPhone, and Fantastical 2 for iPad\n• Calendar sets - quickly toggle multiple calendars on or off with a simple click or automatically when you leave or arrive, based on location\n• Maps are now displayed for your locations\n• Improved iCloud reminders with a separate reminders list and support for geofenced location-based reminders\n• Multiple parser improvements including improved repeating event and reminder support, the ability to add alerts (like \"Meeting 3pm alert 1 hour\"), time zones, and many other improvements\n• Time zone support including floating time zone support\n• Dark and light themes\n• And much, much more!\n\nTHE EASIEST WAY TO ADD EVENTS AND REMINDERS\n\n• Open Fantastical 2 with a single click or keystroke\n• Type in your event or reminder details and press return\n• That's it! \n\nSTAY ON TOP OF YOUR DAY\n\n• The infinite scrolling event list and calendar let you easily locate and plan all of your events and reminders\n• Today's past events fade to gray so you can focus on your upcoming events\n• Add event notes, URLs, or locations to new or existing events\n• Use search to instantly locate your events\n\nWORKS THE WAY YOU DO\n\n• Works with your favorite calendar services with native CalDAV support including iCloud, Google, Yahoo, and more\n• Automatically add alarms to your new events\n• Fantastical 2 is fully localized in English, French, German, Italian, Spanish, and for the first time ever, Japanese\n• Start typing your event or reminder in any of these languages and Fantastical will automagically understand!\n\nFantastical 2 — the frustration of calendaring has been solved.", - "primaryGenreId": 12014, - "bundleId": "com.flexibits.fantastical2.mac", - "averageUserRating": 4, - "userRatingCount": 1342 - } + { + "artistViewUrl": "https://apps.apple.com/us/developer/butleroy-gmbh/id1211182002?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/97/45/f3/9745f37a-62dc-9001-ee13-fbf273a2af47/source/60x60bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/fe/d5/89/fed5890c-9185-af44-353e-67179b6fb7b6/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/e3/67/96/e36796af-6618-d223-9c40-7b8b6f6e5a3a/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/d2/fc/c1/d2fcc169-93de-c963-8fb4-c84776f361bc/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/18/59/e9/1859e9c8-db2b-2fe4-eb86-86e6ba6cf09c/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/dc/35/e1/dc35e11e-97f3-3939-01d1-b50052bb0e55/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/37/31/81/37318183-04ab-2bd3-ca46-24b8ac882440/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/88/37/0a/88370aaf-ee2b-766f-fe56-6956101a64a4/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/97/45/f3/9745f37a-62dc-9001-ee13-fbf273a2af47/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/97/45/f3/9745f37a-62dc-9001-ee13-fbf273a2af47/source/100x100bb.png", + "kind": "mac-software", + "trackCensoredName": "Butleroy: Calendar & To-dos", + "languageCodesISO2A": [ + "DA", + "EN", + "DE", + "PL", + "ES" + ], + "fileSizeBytes": "10567882", + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/butleroy-calendar-to-dos/id1479057646?mt=12&uo=4", + "trackContentRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "formattedPrice": "$8.99", + "primaryGenreName": "Productivity", + "trackId": 1479057646, + "trackName": "Butleroy: Calendar & To-dos", + "currentVersionReleaseDate": "2020-07-19T20:58:21Z", + "releaseNotes": "You can now plan your day with ease. This update allows you to select all to-dos that you want to get done today and Roy plans them automatically.\n\nYou can also set a duration for Reminders now. They are saved into the notes of the reminder as well, so you can even see them in the original app.", + "isVppDeviceBasedLicensingEnabled": true, + "genreIds": [ + "6007", + "6000" + ], + "userRatingCountForCurrentVersion": 0, + "releaseDate": "2019-10-30T07:00:00Z", + "sellerUrl": "https://butleroy.com", + "minimumOsVersion": "10.15", + "primaryGenreId": 6007, + "sellerName": "Butleroy GmbH", + "contentAdvisoryRating": "4+", + "currency": "USD", + "description": "Hi! I am Roy, your personal assistant.\n\nAt times, there are simply not enough hours in the day. This is the app that helps you in everyday life. Whether it’s to keep track of your to-dos, to find the best restaurants or to see all your calendars in one place. I am an artificial intelligence that helps to plan your daily life more efficiently, from to-do's to booking a restaurant, from calendars to events I have you covered.\n\nHere’s how I can help you to be your most productive self:\n\n** First smart to-do list **\n- Automatically scheduled to-dos at the best possible time. I'll consider things like your schedule, work hours, holidays, the weather and more.\n- Don't worry if you forget about a to-do. This sometimes happens. I'll make sure to reschedule it for you automatically.\n- Tag your to-dos to get even more organized.\n- Drag and drop your to-dos in the Eisenhower matrix and I will take care of the rest.\n- One step to-do creation.\n\n** Beautiful agenda and dark mode **\n- Butleroy supports the native iOS dark mode feature and comes in a beautiful dark color scheme (if you want)\n- Calendar marries to-do. It's 2019 and you can finally see your calendar events and to-dos in one place.\n- Powerful filter options, so you only see the right things at the right time.\n- Access to over 9.5 million calendars of sport teams, tv shows, moon phases, public holidays and more. From NFL to second league volleyball in Slovakia, we have them all.\n\n** Powerful integrations **\n- Combine your favourite calendars and other apps in one. \n- Integrate Google Calendar/Tasks, Microsoft To-Do and Outlook to see your tasks next to your events.\n- See your iOS Reminder so you have the best possible overview.\n- Hook up Todoist to make use of the intelligent scheduling and to see your to-dos right in your calendar.\n- Connect Trello \"cards\" so you can see everything that is going on today at a glance.\n- Wunderlist To-dos\n- Hubspot tasks\n\n** Smart personal assistant **\n- If you need an Uber or a Lyft to your next event or simply the directions, I have your back.\n- Parking near your appointments is shown whenever you need it.\n- Find the best restaurants in town from Google Places and Foursquare.\n- Citymapper shows you the best way to get to your appointment.\n- Message all event attendees at once with one click.\n- Siri shortcuts allow you to automate tasks, schedule your to-dos even quicker or get an overview of your appointments and to-dos. All controlled with your voice and Siri.\n\n** Interesting calendar subscription **\nShould you choose to integrate interesting calendars, payments will be charged to your iTunes account at confirmation of purchase. Your yearly subscription is $2.99 USD per year (price may vary by location). You may receive access to the subscription benefits at no charge for a specified trial period, after which you will be charged until you cancel your subscription.\n\nYour subscription renews automatically unless cancelled at least 24 hours prior to the end of the current period and cancellation of the current active subscription period is not allowed.\n\nAuto-renewal may be turned off in your Account Settings in iTunes after purchase.\n\nYou can read our privacy policy at https://butleroy.com/privacy-policy/\nYou can read our terms of service at https://butleroy.com/terms-and-conditions/\n\nIf you have any questions or requests, let us know. We appreciate your feedback a lot. You can either use the “Send feedback” option within the app or simply write to support@butleroy.com", + "artistId": 1211182002, + "artistName": "Butleroy GmbH", + "genres": [ + "Productivity", + "Business" + ], + "price": 8.99, + "bundleId": "maccatalyst.io.myalfred.app.ios.myAlfred", + "version": "1.2.0", + "wrapperType": "software", + "userRatingCount": 0 + } ] -} + } diff --git a/MasKitTests/JSON/search/mojave.json b/MasKitTests/JSON/search/mojave.json new file mode 100644 index 000000000..b20acd0dc --- /dev/null +++ b/MasKitTests/JSON/search/mojave.json @@ -0,0 +1,837 @@ +{ + "resultCount": 16, + "results": [ + { + "artistViewUrl": "https://apps.apple.com/us/developer/noteboom-productions-ltd/id384558310?mt=12&uo=4", + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/fd/6a/7b/fd6a7bc8-4d39-355b-b750-db6b58473693/source/60x60bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/fd/6a/7b/fd6a7bc8-4d39-355b-b750-db6b58473693/source/100x100bb.png", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/06/51/b4/0651b434-45e1-a145-3535-ba8640630e80/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/53/d2/6d/53d26d0e-d3ec-5932-0708-2ca021b20e1d/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/5a/9d/f6/5a9df6b2-bbbe-4e52-1589-7d1caef12604/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/3e/d8/0f/3ed80f58-3c1f-bb2b-eb68-6cb3300a788e/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/4c/14/f9/4c14f95f-2dde-228c-02e2-ea81002d8d01/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/fd/6a/7b/fd6a7bc8-4d39-355b-b750-db6b58473693/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.12", + "trackId": 1457870984, + "trackName": "Tutor for Mojave", + "formattedPrice": "$4.99", + "sellerName": "Noteboom Productions, Ltd.", + "primaryGenreId": 6006, + "genreIds": [ + "6006", + "6017" + ], + "releaseDate": "2019-05-16T21:48:23Z", + "primaryGenreName": "Reference", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2019-05-16T21:48:23Z", + "trackCensoredName": "Tutor for Mojave", + "trackViewUrl": "https://apps.apple.com/us/app/tutor-for-mojave/id1457870984?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "5794397", + "sellerUrl": "https://www.noteboomtutorials.com/tutorial/tutor-for-macos-mojave/", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.0", + "wrapperType": "software", + "artistId": 384558310, + "artistName": "Noteboom Productions, Ltd.", + "genres": [ + "Reference", + "Education" + ], + "price": 4.99, + "description": "Learn how to get the most our of macOS Mojave, the latest operating system for your Mac. I'll guide you through macOS Mojave with more than 80 video tutorials and more than 8 hours of video instruction. I begin by showing you the basics of getting around the Mac. I then cover features of the Mac in more detail including the Menu Bar, Dock. I also cover working with Finder windows, applications, documents, and other features.\n\nWith each tutorial I demonstrate what I am describing and then I sum it up at the end of each lesson. You can follow along and try out what I am demonstrating for yourself.\n\nWhat you'll learn:\n• How to get around your Mac with the Finder and Finder windows.\n• How to keep your files and folders organized.\n• How to find, install, and remove Applications.\n• How to backup your Mac and restore files from a backup.\n• How to customize your Mac with System Preferences.\n• How to troubleshoot your Mac with Help and Force Quitting Apps.\n• How to use macOS features including Notifications, Today View, Mission Control, and more.\n• How to use new Mojave features like Dark Mode, Desktop Stacks, Continuity Camera, Quick Actions and much more.\n\nApp features include:\n• All videos are in HD.\n• Videos stream to keep space requirements low.\n• Individual Lessons can be downloaded for offline viewing.\n• All lessons include descriptions.\n• All lessons and descriptions are indexed and searchable.\n• Videos can be viewed in full-screen.\n• Videos can be Airplay to an Apple TV\n• Includes over 80 lessons\n\nWho this course is for:\n• This course will help new Mac users become more comfortable with their Mac.\n• This course will help current Mac users expand their knowledge of the Mac.\n• This course will help current Mac users learn the new features in macOS Mojave.\n• This course is not designed for those who already have extensive knowledge of their Mac.\n\nThe lessons are created by myself, Dan Wassink. I've been creating tutorials for over 10 years and have helped thousands learn more about their Apple devices through Noteboom Tutorials, the App Store, and iBooks store.", + "bundleId": "com.noteboomproductions.com.tutor-mojave", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/wptrnpt-ltd/id997011621?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/c3/ce/cc/c3cecc0c-4d22-56c8-b2a1-b984321f3c54/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/c3/ce/cc/c3cecc0c-4d22-56c8-b2a1-b984321f3c54/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/74/8c/1c/748c1c34-9393-bae5-e52c-88edd86d04e0/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/1c/c4/fc/1cc4fc44-90db-4008-c31c-af874a979ebc/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/45/c9/15/45c9153d-1c70-e506-2710-c3737bdf50bd/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/11/8f/64/118f6456-99d9-f0c3-1324-3b9fa439b68a/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/60/d7/27/60d72714-442b-2b4b-64f5-9e87bbc11353/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/c3/ce/cc/c3cecc0c-4d22-56c8-b2a1-b984321f3c54/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.11", + "trackId": 1352696344, + "trackName": "Connect my tablet", + "formattedPrice": "$9.99", + "sellerName": "WPTRNPT LTD.", + "primaryGenreId": 6027, + "genreIds": [ + "6027", + "6008" + ], + "releaseDate": "2018-03-09T20:03:42Z", + "primaryGenreName": "Graphics & Design", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2020-08-17T21:45:34Z", + "releaseNotes": "We are happy to present Version 3.0 of Connect my tablet to you - connecting now over 2000 combinations of various Wacom tablets with macOS El Capitan, Sierra, High Sierra, Mojave and Catalina. Working with iMacs, MacBook Pros, MacBook Air, Mac Minis or Mac Pros. The 3.x series of Connect my tablet is a very efficient expert system - based on more than 2 years of experience of connecting older Wacom tablets, that now are unsupported. Step by step instructions lead you to connection; extensive troubleshooting helps you should not all be going as well as planned- and if all fails - just contact us for help at enquiry@wptrnpt.co.uk! \nConnect my tablet will save your money, enables you to work with the tablet that you are used to, saves a bit of waste and therefore our planet, and - in these times - makes working from home more efficient.\nV3.0: We further simplified instructions to connect older Wacom tablets with newer macOS versions. We also adapted instructions to the latest security updates and updated some driver recommendations. Most importantly, we included for Cintiq (21 upwards) and Intuos3 users instructions as to how to change tablet button settings as well in Catalina. Finally we found and fixed a bug in our last release. Please read the App Description for more information.", + "trackCensoredName": "Connect my tablet", + "trackViewUrl": "https://apps.apple.com/us/app/connect-my-tablet/id1352696344?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "3548505", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "3.0", + "wrapperType": "software", + "artistId": 997011621, + "artistName": "WPTRNPT LTD.", + "genres": [ + "Graphics & Design", + "Photo & Video" + ], + "price": 9.99, + "description": "Connect my tablet is doing exactly that: It connects your Wacom (TM) tablet to your Mac and restores at least its critical functionality to be creative with Photoshop (TM) and other programmes in Catalina, Mojave, HighSierra, Sierra and El Capitan. For many models and macOS versions, the Wacom preference pane, and therefore previous functionality, will be working again. For others, Connect my tablet provides a tool to let you change the most important pen and tablet settings.\n\nIn Catalina, as in the latest macOS versions, the pen functions and pen buttons work perfectly for all listed tablet types, as well as most setting options for those pen buttons - after using Connect my tablet. And now Connect my tablet also allows the change of settings of the tablet buttons for Cintiq (21 upwards) and Intuos3 tablet users. In addition, we offer (upon contact) an additional tool for Bamboo CTH users to change their tablet button settings (beta version). That leaves very few tablets, where pen and most important functions are already restored, but tablet buttons cannot yet be programmed – but we keep working on it.\nIf your preference pane stopped already working in earlier macOS versions, you can continue to use Connect my tablet to change your pen and some tablet settings.\nAlso for the oldest tablets, the Utility programme from Wacom is no longer supported in Catalina. It was mainly useful to create backups of the preference settings. Our additional utility tool (available upon request and in beta version stage) allows you now to save and restore them.\n\nAs you might have to install and de-install tablet drivers, you will have to have full admin rights on your computer.\n\nWith version 3.x you now get an expert system, guiding you step by step through the reconnection process - or, if needed - the change of settings.\n\nCurrently Connect my tablet supports and is tested on:\nBamboo: including CTH-460/461/470/661/670, CTL 460/470, MTE-450, CTE-450/650 , CTF-430\nIntuos: including USB GD and XD series (0 and 2 series); Intuos3 PTZ-430/431/630/631/930/1231W; CTH-series and many Intuos4 (e.g. PTK) and Intuos5 tablets (e.g. PTH)\nGraphire: 2,3 (Sapphire) and 4 series\nCintiq: including 18SX, 20WSX, 21UX, 13HD, DTU-2231 and others\nBut it works for many more tablets and you can always ask us at enquiry@wptrnpt.co.uk\n\nCurrent capabilities for those tablets that not only need reconnection (and then their preference pane works again) but also require settings to be changed via Connect my tablet:\n\n• Tablet/ Stylus connected\n• One group of settings for all applications (although with different backups you can be application specific)\n• Pen Pressure Sensitivity selectable\n• Pen Buttons programmable (keystrokes, modifiers, clicks)\n• Eraser programmable\n• Double click assistance can be switched off/on\n• Definition of the active tablet area\n• Definition of the active monitor (currently for up to 3 monitors)\n• Definition of the pen/stylus to switch to mouse mode from pen mode\n• Change of tablet landscape orientations or to portrait mode (some tablets)\n• Pan (Pan/Scroll) mode for pen buttons (for most tablets)\n• Definition of tablet buttons (Intuos3, Cintiq 21UX upwards via Connect my tablet, Bamboo CTH via an additional tool) NEW\n\nWe may add further settings for change if required and feasible. Again, just contact us at: enquiry@wptrnpt.co.uk", + "bundleId": "com.wptrnpt.TabletLinksToHighSierra", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/xiang-he/id1278994432?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/d7/d8/d0/d7d8d0b9-b102-9c7b-52eb-506616a0fdb1/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/d7/d8/d0/d7d8d0b9-b102-9c7b-52eb-506616a0fdb1/source/100x100bb.png", + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/31/c4/8e/31c48ea2-d287-1cec-d062-e0d5fa18a2f9/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/f3/2c/15/f32c15f8-7d9a-df29-2607-e4815a0e69bf/mzl.xouiplez.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/d7/d8/d0/d7d8d0b9-b102-9c7b-52eb-506616a0fdb1/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.10", + "trackId": 1434172933, + "trackName": "Kaka", + "formattedPrice": "Free", + "sellerName": "Xiang He", + "primaryGenreId": 6012, + "genreIds": [ + "6012", + "6002" + ], + "releaseDate": "2018-08-29T18:25:14Z", + "primaryGenreName": "Lifestyle", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2019-01-15T08:33:53Z", + "releaseNotes": "new feature: Customize your own menu.\nbug fixed.", + "trackCensoredName": "Kaka", + "trackViewUrl": "https://apps.apple.com/us/app/kaka/id1434172933?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN", + "ZH", + "ZH" + ], + "fileSizeBytes": "14117499", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.1.4", + "wrapperType": "software", + "artistId": 1278994432, + "artistName": "Xiang He", + "genres": [ + "Lifestyle", + "Utilities" + ], + "price": 0.00, + "description": "Kaka is a cute lion and also a desktop assistant with some useful features standing on your screen.\n\nFeatures:\n1. Display Desktop: You can hide all applications with one click to go back to desktop.\n2. Hide Desktop Icons: If you are a person who pays great attention to privacy, you may like this feature when someone is looking at your screen.(Support multi-screen)\n3. Turn Off Display: NOT SLEEP, just ONLY turn off your monitor.\n4. Prevent System From Falling Asleep: You may want to have a cup of coffee, but every time you come back, the system sleeps makes you very unhappy.\n5. Prevent sleep even when lid is CLOSED: Someone like me needs this feature :)\n6. Hide The Mouse Cursor Automatically: When you browse a page or watch streaming, the mouse will be hidden automatically.\n7. Hide Desktop Icons Automatically: Basically get rid of people who peek at the computer screen. Double click back to screen.\n8. Custom Shortcuts\n\nLots of animations designed for 'Kaka', Let's explore Kaka together!\n\n***Need any help, please contact hsiangho@foxmail.com***", + "bundleId": "com.HyperartFlow.Kaka", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/minglebit/id1081052622?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/15/86/dc/1586dce4-9a47-4aa5-9675-7ec5e2f5777f/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/15/86/dc/1586dce4-9a47-4aa5-9675-7ec5e2f5777f/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/5c/08/b8/5c08b824-12eb-e0b6-22fb-0e234f396b9e/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/f3/34/0e/f3340e21-714c-0a17-4437-73ba1828cbba/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/15/86/dc/1586dce4-9a47-4aa5-9675-7ec5e2f5777f/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.14", + "trackId": 1438547269, + "trackName": "Dynamic wallpaper", + "formattedPrice": "Free", + "sellerName": "MingleBit SRL", + "primaryGenreId": 6016, + "genreIds": [ + "6016", + "6012" + ], + "releaseDate": "2018-10-18T14:59:47Z", + "primaryGenreName": "Entertainment", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2019-12-28T02:06:21Z", + "releaseNotes": "We update the app regularly so we can make it better for you. This version includes several bug fixes and performance improvements. Thanks for using Dynamic wallpaper.", + "trackCensoredName": "Dynamic wallpaper", + "trackViewUrl": "https://apps.apple.com/us/app/dynamic-wallpaper/id1438547269?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "1185703221", + "sellerUrl": "https://minglebit.com/products/dynamicwallpaper.php", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "2.2", + "wrapperType": "software", + "artistId": 1081052622, + "artistName": "MingleBit", + "genres": [ + "Entertainment", + "Lifestyle" + ], + "price": 0.00, + "description": "Looking for an awesome new wallpaper? Get the power of new dynamic wallpaper feature available in macOS Mojave and choose from our collection the one that you like. \n\nDynamic wallpaper offers you a collection of high quality wallpapers for you desktop.\n\nIn essence, a dynamic wallpaper is made using more photos taken in the same place at different intervals of times, or, in our app you will find some sets of wallpapers that have the same theme.", + "bundleId": "com.minglebit.DynamicWallpaper", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/marek-hru%C5%A1ovsk%C3%BD/id491390887?mt=12&uo=4", + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/52/58/d9/5258d9bb-1d95-5caf-fb73-0b9f45fb8076/source/60x60bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/52/58/d9/5258d9bb-1d95-5caf-fb73-0b9f45fb8076/source/100x100bb.png", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/24/75/d0/2475d0ba-d22e-bfb5-9190-9635713e65a4/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/d0/bf/38/d0bf3803-ddba-ec59-eb47-2d90044cb49a/mzl.vwujfjck.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/cb/6c/55/cb6c551c-c063-be2b-0cb2-27a5f9b53b38/mzl.zmivcouh.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/0b/c5/32/0bc5320f-12f8-b679-90bc-863c184dcf7a/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/1c/b1/d2/1cb1d291-9364-1e7d-b905-e535992ccf7a/mzl.amwatodg.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/25/ef/1a/25ef1ab9-9854-1773-2f71-3a31a100bc6d/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/52/58/d9/5258d9bb-1d95-5caf-fb73-0b9f45fb8076/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.14", + "trackId": 1435296403, + "trackName": "Dynaper - Dynamic Wallpapers", + "formattedPrice": "Free", + "sellerName": "MAREK HRUSOVSKY", + "primaryGenreId": 6027, + "genreIds": [ + "6027", + "6002" + ], + "releaseDate": "2018-10-05T04:46:46Z", + "primaryGenreName": "Graphics & Design", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2020-03-09T01:35:02Z", + "releaseNotes": "NEW:\n- added Chinese localization ( 非常感谢承刚!)", + "trackCensoredName": "Dynaper - Dynamic Wallpapers", + "trackViewUrl": "https://apps.apple.com/us/app/dynaper-dynamic-wallpapers/id1435296403?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "13584872", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.4.1", + "wrapperType": "software", + "artistId": 491390887, + "artistName": "Marek Hrušovský", + "genres": [ + "Graphics & Design", + "Utilities" + ], + "price": 0.00, + "description": "Create your own dynamic desktop wallpaper (time-shifting/solar-shifting) on macOS Mojave & Catalina.\n\nDynaper makes it easy to create a native time/solar-shifting HEIC wallpaper that changes throughout the day. Wallpapers made by Dynaper are supported by macOS Mojave & Catalina and can be set as wallpaper in System Preferences.\n\nSimply drag&drop your images and change the display time for each image. Dynaper will change time automatically if image contains EXIF metadata or contains time suffix in the filename. For a quick time change use the autosuggest feature. For solar-shifting wallpaper run Solar Wizard where you can export it.\n\nDragging image out of Dynaper will create time-shifting text that contains normalized time and parameters that one can use for manual HEIC creation. \n\nHelper tools:\n- time helper (convert time to normalized time)\n- solar helper (convert location to solar data: altitude and azimuth)\n- solar wizard (convert many locations to solar data: altitude and azimuth)\n- HEIC metadata (view HEIC metadata used for wallpaper display)\n- strip still images helper (removes Dark/Light appearance metadata from dynamic image)\n\nSolar Wizard is accessible from top menu (Utilities-> Solar Wizard).\n\nAutomatic Time Detector:\nTo save your time Dynaper automatically recognises timestamps in your filename or metadata. If your filename doesn't have valid time Dynaper will look at EXIF metadata (date of creation) to find valid time. Just append your filename with suffix HH_mm, where H is hour and m is minute. 24 hour format is being used for detection and last 5 character of filename are being checked. \n\nExample of valid filenames:\nimage001_16_45.jpg\nimage001_16_45\nscreenshot_16.45.05.jpg\nscreenshot_16.45.05\n\nWide-gamut colors:\nWide-gamut color devices display more vivid and lifelike hues. This is important as all of the recent Apple devices can display these colors so it's best if you provide pictures that have been captured with wide-gamut colors. Whether you provide images with sRGB color profile or P3 display color profile, Dynaper will automatically choose the best color profile for you. Mind that dynamic wallpapers created on web don't support wide-gamut colors. \n\nStill images:\nDynaper has ability to export dynamic wallpaper with still dark image and still light image. Right click in table view to select light/dark image or select still images during export. Since macOS Catalina the system will prefer dark still image on dark appearance. User must enable this feature (add still images) in preferences.\n\nPlease note that exported HEIC images include watermark. Removing the watermark is possible with in-app purchase.\n\nExample of image display time:\n1. 00:05AM-01:00AM (for time 00:05)\n\u20282. 01:00AM-03:00AM (for time 01:00)\n\u20283. 03:00AM-04:00AM\u2028 (for time 03:00)\n4. 04:00AM-00:05AM (for time 04:00)", + "bundleId": "com.hrubasko.Dynamic-Wallpaper-Studio", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/dian-agus-triadi/id439570777?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/35/80/df/3580dfd1-aa66-bbc9-6e7e-a2ca2540567c/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/35/80/df/3580dfd1-aa66-bbc9-6e7e-a2ca2540567c/source/100x100bb.png", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/43/b5/6a/43b56a32-57bb-8e65-7670-82dd293039dd/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/c8/88/b6/c888b631-c1e5-aa82-65b9-0c9392d69c95/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/49/32/c2/4932c246-6bf1-b43b-d2d0-370058c37c11/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/87/7f/11/877f1195-1420-7778-6bff-9e010c66e4db/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/c6/07/a6/c607a624-610d-2fb2-9775-1278065f4f61/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/68/a4/d3/68a4d314-7f90-fec0-fa47-2c150f56ba65/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/21/69/d0/2169d025-a5c8-3500-fa1d-6ea42accd02d/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/f8/6b/f5/f86bf53c-26c3-2371-496d-c4c4d9300da5/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/35/80/df/3580dfd1-aa66-bbc9-6e7e-a2ca2540567c/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.11", + "trackId": 1145215534, + "trackName": "Kelir", + "formattedPrice": "Free", + "sellerName": "Dian Agus Triadi", + "primaryGenreId": 6026, + "genreIds": [ + "6026", + "6027" + ], + "releaseDate": "2016-09-09T10:09:13Z", + "primaryGenreName": "Developer Tools", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2018-10-16T23:45:11Z", + "releaseNotes": "We have added more features that we are sure you gonna love it.\n\n- Added shade colors\n- Added tint colors\n- Added color harmony\n- Added color info which includes: Triadic colors, Analogous colors, Complimentary color, and the related colors\n- Redesign the color page\n- Fixed the palette page where the like button didn't show up", + "trackCensoredName": "Kelir", + "trackViewUrl": "https://apps.apple.com/us/app/kelir/id1145215534?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "9923180", + "sellerUrl": "http://rimbunesia.com/apps/kelir", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.5", + "wrapperType": "software", + "artistId": 439570777, + "artistName": "Dian Agus Triadi", + "genres": [ + "Developer Tools", + "Graphics & Design" + ], + "price": 0.00, + "description": "Compatible with macOS 10.14 Mojave Dark Theme!\n\nKelir enable you to choose any color from everywhere on your screen using the unique picker with a preview which color you are selecting. Once you pick a color, any code will be available for you to paste it.\n\nAs we wanted to make your workflow efficient, we saved every color you picked, you may like it to keep all colors organized.\n\nNot only colors, Kelir provide you with a color palletes that you could generate from an image or pick the colors by yourself. \n\nKelir provide you with ranges generated code as below:\n- Hexa code\n- UIColor RGB & HSB both Objective C and Swift\n- NSColor RGB & HSB both Objective C and Swift\n- NSColor Calibrated RGB & HSB both Objective C and Swift\n- NSColor Device RGB & HSB both Objective C and Swift\n- Android RGB\n- Android ARGB\n- Android XML\n- CSS RGB\n\nOur key feature:\n- We support your Touch Bar\n- We have calculated to give you Triadic colors, Analogous colors, Complimentary color, Shade colors, and Tint colors\n- Kelir sits on your menubar. So you could get access from everywhere\n- Kelir provide range of color codes you might want to choose (see above)\n- Kelir has Pallete which you could generated from a picker or an image\n- Kelir has Gradient colors which you could generate from 2 colors (PRO)\n- Generated Code available on your clipboard once you picked a color\n- Retina Support\n- Show colors from other Kelir’s users (PRO)\n- Show palletes from other Kelir’s users (PRO)\n- Generate Pallete colors to CSS, LESS, SASS, XML Colors, and SVG\n- Generate Gradient colors to CSS, Swift UIView, Swift NSView, Android XML, and SVG Gradient\n\nKelir requires Mac OSX 10.11 or later", + "bundleId": "com.rimbunesia.osx.Kelir", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/marek-hru%C5%A1ovsk%C3%BD/id491390887?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/bf/c1/ab/bfc1ab06-216d-cadc-60bf-defd5d3f9985/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/bf/c1/ab/bfc1ab06-216d-cadc-60bf-defd5d3f9985/source/100x100bb.png", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/26/85/8e/26858ec9-2387-e25e-38f9-713027b5e7e5/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/f5/4b/28/f54b288b-d8cd-2bf3-8a7a-c1c2355481ce/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/51/e4/6c/51e46ce8-1ccb-1745-3dfd-68553de26bfd/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/bf/c1/ab/bfc1ab06-216d-cadc-60bf-defd5d3f9985/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.14", + "trackId": 1447636342, + "trackName": "Day & Night World Map Studio", + "formattedPrice": "Free", + "sellerName": "MAREK HRUSOVSKY", + "primaryGenreId": 6002, + "genreIds": [ + "6002", + "6008" + ], + "releaseDate": "2018-12-28T02:12:22Z", + "primaryGenreName": "Utilities", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2020-01-12T23:05:31Z", + "releaseNotes": "NEW:\n- compatibility with macOS Catalina", + "trackCensoredName": "Day & Night World Map Studio", + "trackViewUrl": "https://apps.apple.com/us/app/day-night-world-map-studio/id1447636342?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "19301414", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.1.3", + "wrapperType": "software", + "artistId": 491390887, + "artistName": "Marek Hrušovský", + "genres": [ + "Utilities", + "Photo & Video" + ], + "price": 0.00, + "description": "Create gorgeous day & night map that matches time of the day at your timezone. Works natively in Mojave & Catalina. Map also updates on your lock screen and will impress all by-passers.\n\nDay & Night World Map Studio will create a dynamic wallpaper based on your timezone and it will also update its clock to match time of the day at your location. Quick & easy solution to get stunning map.\n\nFeatures:\n- Export day & night dynamic wallpaper\n- Export single day & night wallpaper that matches app launch time\n- Export map as series of images (Accessible from File menu)\n- Take a map snapshot of at current time (Accessible from File menu)\n- Adjust date to match solar situation*\n- Adjust the frequency of images (time interval)\n- Focus map on America/Asia/Prime Meridian or on your timezone\n\n\nTo create map that matches different daylight than your timezone/location just change system timezone to the desired one. \n\nExport Quality:\n- 512px (Free)\n- 1024px, 2048px, 4096px, 5120px (In-App purchase)\n\n*Solar inclination changes every day. To have a perfect map we recommend to update it to current date every 2 weeks.", + "bundleId": "com.hrubasko.Day-night-map", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/jingwei-wan/id1415704055?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/d3/c3/ba/d3c3baac-ae9a-80aa-1c44-66f808298f9b/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/d3/c3/ba/d3c3baac-ae9a-80aa-1c44-66f808298f9b/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/e1/57/07/e15707d5-beb0-11bf-6511-f75642c3241b/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/85/15/32/8515325f-becb-b5d0-c2ac-fa6c58850bb3/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/d3/c3/ba/d3c3baac-ae9a-80aa-1c44-66f808298f9b/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.12", + "trackId": 1437487517, + "trackName": "Zoom Me - Desktop Magnifier", + "formattedPrice": "Free", + "sellerName": "JINGWEI WAN", + "primaryGenreId": 6007, + "genreIds": [ + "6007" + ], + "releaseDate": "2018-10-01T09:05:33Z", + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2018-10-01T09:05:33Z", + "trackCensoredName": "Zoom Me - Desktop Magnifier", + "trackViewUrl": "https://apps.apple.com/us/app/zoom-me-desktop-magnifier/id1437487517?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "9681514", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.0", + "wrapperType": "software", + "artistId": 1415704055, + "artistName": "JINGWEI WAN", + "genres": [ + "Productivity" + ], + "price": 0.00, + "description": "Zoom Me is a simple application that allows you to put a magnifier on the screen without having to zoom your entire screen. Fully support Mojave!\n\nMain Features:\n\n● Show/Hide \n● Increase magnification level up to 500%\n● Lens size from 200px to 1200px\n● Use graphical border\n● All features support shortcuts", + "bundleId": "com.imthekingofmac.ZoomMe", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/jingwei-wan/id1415704055?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/4f/0d/7f/4f0d7f8e-9cc9-8da6-d187-6307e100cbaa/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/4f/0d/7f/4f0d7f8e-9cc9-8da6-d187-6307e100cbaa/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/cf/b1/03/cfb1039a-bf1d-497a-fe70-38b0bc2ef5cb/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/4f/0d/7f/4f0d7f8e-9cc9-8da6-d187-6307e100cbaa/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.12", + "trackId": 1441911007, + "trackName": "Quick Launcher - Easy Launch", + "formattedPrice": "Free", + "sellerName": "JINGWEI WAN", + "primaryGenreId": 6007, + "genreIds": [ + "6007" + ], + "releaseDate": "2018-11-12T08:25:06Z", + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2018-11-17T12:38:39Z", + "releaseNotes": "Bug fixed.", + "trackCensoredName": "Quick Launcher - Easy Launch", + "trackViewUrl": "https://apps.apple.com/us/app/quick-launcher-easy-launch/id1441911007?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "5368428", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.1", + "wrapperType": "software", + "artistId": 1415704055, + "artistName": "JINGWEI WAN", + "genres": [ + "Productivity" + ], + "price": 0.00, + "description": "Are you upset about the messy icons on the Dock? Quick Launcher can solve this problem very well.\n\nPlace a floating window on your desktop, add \"applications, system preferences, directories, and files\" to it, and then simply double-click the icon to quickly launch these items. Is it very convenient. The window can be collapsed or expanded to the top without occupying the place; and the color and transparency can be adjusted without affecting the current operation.\n\nHere are the main features of Quick Launcher:\n● Open window with shortcut key , \"option + space\" by default\n● Pin/Unpin, collapse/expand the window, adjust its color and transparency\n● Add \"Applications, System Preferences, Directories, and Files.\" You can then double-click to launch these items, preview item or reveal it in the Finder.\n\nTip: You may need to authorize directory access when previewing or opening a file. Click \"Allow\" to continue.\n\nQ: Which category can be previewed and selected in Finder?\n\nA: All the categories can be selected in Finder, and the \"Files\" and be previewed.\n\n \nQ: What kinds of items can be queried with Quick Launcher?\n\nA: Quick Launcher can query \"Applications\", \"System Preferences Panel\", \"Text Files\",\"Folders\",\"Images\" and \"Documents\".\n\nIf you have any comments or suggestions during the process, please send an email to imthekingofmac@gmail.com", + "bundleId": "com.imthekingofmac.Launcher", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/woojooin/id529798258?mt=12&uo=4", + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/49/87/3b/49873ba6-551b-17b9-745d-a201cc546282/source/60x60bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/49/87/3b/49873ba6-551b-17b9-745d-a201cc546282/source/100x100bb.png", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/74/34/7f/74347f32-0e60-c416-d6ff-906db78abbfe/mzl.aykmthfi.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/ef/fe/dd/effeddfc-4229-34c8-182c-cab2ec273828/mzl.xygwryoh.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/c5/7b/f1/c57bf108-437e-3d71-3848-c6aeb69fdbcd/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/bb/b3/76/bbb3761a-a8b3-4ed1-cf3b-9925e93e9161/mzl.erowwkwa.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/a7/16/6d/a7166d06-4986-0808-a948-6f62b84a08c5/mzl.kinguycy.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/49/87/3b/49873ba6-551b-17b9-745d-a201cc546282/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.10", + "trackId": 540356531, + "trackName": "zCommander - File Manager", + "formattedPrice": "$9.99", + "sellerName": "SANG H SUNG", + "primaryGenreId": 6007, + "genreIds": [ + "6007", + "6002" + ], + "releaseDate": "2013-10-16T09:36:47Z", + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2020-08-31T17:38:36Z", + "releaseNotes": "- minor bug fixes.", + "trackCensoredName": "zCommander - File Manager", + "trackViewUrl": "https://apps.apple.com/us/app/zcommander-file-manager/id540356531?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN", + "KO" + ], + "fileSizeBytes": "2132557", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "4.61", + "wrapperType": "software", + "artistId": 529798258, + "artistName": "woojooin", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 9.99, + "description": "zCommander is advanced and comprehensive file management software. It looks like simple but is actually beautiful and powerful and rapid.\nMust-have Software for all users (especially for immigrators from PC and power-users).\nNo more searching for Total Commander in Mac World.\nHere is zCommander !!\n\nMain Features:\n\n- Familiar double pane for file list view and each pane can have multiple tabs.\n- Sorted items by elements (Name, Extension, Date, etc, …)\n- You can do most of file operations with only keyboard interface so it’s simple and fast. (Of course you can customise input interface or do it with mouse action)\n- Copy & Paste file work support like Windows Explorer.\n- Advanced filtering support in file work.\n- Quick & Easy to Preview on fingertip.\n- Quick searching by typing.\n- Multithreaded file work support (copy, move, delete)\n- Advanced file searching (by name matching, date, size and contents)\n- Easy and fast folder bookmark and history management.\n- You can customise look-and-feel to what you want.\n- zip & unzip files & folders.\n\nWhen you manage many files and folders zCommander will be greatest helper for you.", + "bundleId": "com.woojooin.zCommander", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/woojooin/id529798258?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/e1/5d/a3/e15da3fa-5ab9-90d5-79bb-bf0fc0ba0214/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/e1/5d/a3/e15da3fa-5ab9-90d5-79bb-bf0fc0ba0214/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/59/10/0f/59100fe4-7886-1c3b-2640-5c5022f064b2/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/be/9b/5d/be9b5d2a-6e96-268c-b05f-e7c572e8ed28/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/c0/d1/34/c0d134e1-5edc-ac88-1534-eb4c2f5123d8/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/c1/0a/6e/c10a6ea9-9be3-3e11-2d70-4642f542ba8b/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/e1/5d/a3/e15da3fa-5ab9-90d5-79bb-bf0fc0ba0214/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.7", + "trackId": 702923456, + "trackName": "zGallery - Image Viewer", + "formattedPrice": "$9.99", + "sellerName": "SANG H SUNG", + "primaryGenreId": 6008, + "genreIds": [ + "6008", + "6027" + ], + "releaseDate": "2013-10-08T16:54:22Z", + "primaryGenreName": "Photo & Video", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2020-05-18T21:31:59Z", + "releaseNotes": "- File system event handling bug when Korean named path fixed.", + "trackCensoredName": "zGallery - Image Viewer", + "trackViewUrl": "https://apps.apple.com/us/app/zgallery-image-viewer/id702923456?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN", + "KO" + ], + "fileSizeBytes": "3937071", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "3.66", + "wrapperType": "software", + "artistId": 529798258, + "artistName": "woojooin", + "genres": [ + "Photo & Video", + "Graphics & Design" + ], + "price": 9.99, + "description": "zGallery is the elegant software that shows, browses and edits images and photos in your folder and disk.\nIt is very easy to use but provides all must-have powerful functions.\n\nIf you’re looking for the solutions for managing images and photos,\nzGallery will be the best choice.\n\nMain Features:\n- Shows almost every common format image\n- Thumbnail browsing for all type of file. (even video image files)\n- Folder search browsing in tree panel\n- Zooming in/out\n- Fullscreen mode\n- Slide show\n- File management functions such as copy, move, delete and so forth\n- Image editing functions such as rotate, flip, resizing, changing format and so forth\n- Copy & Paste, Drag & Drop support like Finder\n- Set image as desktop wallpaper\n- Extraction frames from animation gif\n- Folder with images thumbnail support\n\nIt is really fast loading and showing images and also gives you essential editing functions.\nWith familiar interface such as folder tree and thumbnail view, you can quickly find images or photos and work with them.\nYou don't need to use file management app privately to copy, move, delete. zGallery will all do that including drag & drop operations.\nYou can change your desktop wallpaper very easily during viewing images.", + "bundleId": "com.woojooin.zGallery", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/aykut-korkmaz/id1440150614?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/be/6d/cb/be6dcb2f-8ad1-3330-11fe-22b77f96f565/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/be/6d/cb/be6dcb2f-8ad1-3330-11fe-22b77f96f565/source/100x100bb.png", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/8a/c5/60/8ac56022-9daf-e809-0899-4d6320acd940/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/0e/a4/65/0ea4651c-2fc8-dc1a-3334-7b7e199fc038/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/be/6d/cb/be6dcb2f-8ad1-3330-11fe-22b77f96f565/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.13", + "trackId": 1440150615, + "trackName": "Night Reader - Dark Mode", + "formattedPrice": "$1.99", + "sellerName": "Aykut Korkmaz", + "primaryGenreId": 6007, + "genreIds": [ + "6007", + "6002" + ], + "releaseDate": "2018-11-21T13:08:45Z", + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2019-03-28T23:03:38Z", + "releaseNotes": "Bug fix.", + "trackCensoredName": "Night Reader - Dark Mode", + "trackViewUrl": "https://apps.apple.com/us/app/night-reader-dark-mode/id1440150615?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "7957066", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.7.3", + "wrapperType": "software", + "artistId": 1440150614, + "artistName": "Aykut Korkmaz", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 1.99, + "description": "At night, we are annoyed by bright websites. Night Reader is the solution.\n\nYour eyes are protected because Night Reader turns them dark.\n\nIt can automatically sync with your system dark mode.\nYou can use shortcuts to turn on/off dark mode completely or selectively per site.\nIntelligent page suggestions available.\n\nEnjoy the Night!", + "bundleId": "com.hivemind.nr", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/pawan-dixit/id1439015043?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/79/b8/9a/79b89a97-6ecb-bf8b-2400-358e16f81d30/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/79/b8/9a/79b89a97-6ecb-bf8b-2400-358e16f81d30/source/100x100bb.png", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/01/d6/d4/01d6d47a-2661-ae31-8082-b45d37037a81/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/7d/16/8a/7d168a56-f9a3-1c18-fe3c-d8da2eb2f98c/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/79/b8/9a/79b89a97-6ecb-bf8b-2400-358e16f81d30/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.12", + "trackId": 1456462718, + "trackName": "Auto Brightness for Dark Mode", + "formattedPrice": "$4.99", + "sellerName": "Pawan Dixit", + "primaryGenreId": 6007, + "genreIds": [ + "6007", + "6002" + ], + "releaseDate": "2019-03-22T01:56:04Z", + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2019-09-29T19:47:20Z", + "releaseNotes": "Added night and day mode.\nIncreased efficiency.", + "trackCensoredName": "Auto Brightness for Dark Mode", + "trackViewUrl": "https://apps.apple.com/us/app/auto-brightness-for-dark-mode/id1456462718?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "6662336", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.4", + "wrapperType": "software", + "artistId": 1439015043, + "artistName": "Pawan Dixit", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 4.99, + "description": "If you use your macOS in Dark mode, you may have noticed bright pages can make you uncomfortable. Default Auto brightness in your Mac settings does not account for bright or dark pages on the screen. This one does. It takes bright or dark content on your screen into account while setting the brightness level. You don't have to adjust any settings, Smart Brightness works as expected out of the box.", + "bundleId": "com.pawan.SmartBrightness", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/nebula-srl/id1207353088?mt=12&uo=4", + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/0a/07/4e/0a074e24-7b29-5d4d-5cb2-7022377bc6db/source/60x60bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/0a/07/4e/0a074e24-7b29-5d4d-5cb2-7022377bc6db/source/100x100bb.png", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/2f/b0/1d/2fb01ddb-8160-c1c1-5a58-8e2dca7f12c7/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/72/07/0c/72070c18-30ac-1ecf-bc66-555f0856e3b3/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/0a/07/4e/0a074e24-7b29-5d4d-5cb2-7022377bc6db/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.14", + "trackId": 1453295546, + "trackName": "Markdown Editor Pro", + "formattedPrice": "$8.99", + "sellerName": "Nebula S.r.L.", + "primaryGenreId": 6026, + "genreIds": [ + "6026" + ], + "releaseDate": "2019-02-27T04:33:37Z", + "primaryGenreName": "Developer Tools", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2019-03-12T20:45:39Z", + "releaseNotes": "- BugFix", + "trackCensoredName": "Markdown Editor Pro", + "trackViewUrl": "https://apps.apple.com/us/app/markdown-editor-pro/id1453295546?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "12134990", + "sellerUrl": "http://www.markdowneditorpro.app", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.0.2", + "wrapperType": "software", + "artistId": 1207353088, + "artistName": "Nebula SRL", + "genres": [ + "Developer Tools" + ], + "price": 8.99, + "description": "Markdown Editor Pro is a responsive, easy-to-use Markdown editor for Mac.\n\nIt integrates with Finder and your existing file system. Markdown Editor Pro features:\n\n- live preview pane (can be toggled on or off) with five themes\n- ability to toggle editor pane between light and dark appearance\n- PDF and HTML export\n- collaborative iCloud editing (via File/Share/Add People)\n- escape key (or command + period) to bring up the ​quick-entry menu for Markdown shortcuts\n- support for multiple tabs\n- (optional) line numbers at left of the editor pane\n\nMarkdown Editor Pro supports syntax for:\n\n- six heading levels\n- bold, italic, and strikethrough\n- ordered and unordered lists\n- links\n- lines\n- blockquotes (including nested quotes)\n- code\n- tables\n\nThe app also features a unique Type menu that allows operations on selected text:\n\n- convert to upper case, lower case, title case\n- in lists, sort text by alphabetical (\"ascending\") or reverse alphabetical (\"descending\") order\n- in lists, remove duplicates \n- make selected text one paragraph\n- remove white lines between text", + "bundleId": "com.MarkdownEditorPro", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/mohammad-fathi/id713139240?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/1d/ab/b9/1dabb95e-049f-5577-8bac-678668e48226/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/1d/ab/b9/1dabb95e-049f-5577-8bac-678668e48226/source/100x100bb.png", + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/9e/8e/21/9e8e2133-3189-bb14-a421-7980d6b4f0c0/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/23/09/75/23097527-7eae-8c5e-bfa3-3ca5393e4feb/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/b1/fb/7a/b1fb7ab8-3ea3-a6fc-c695-2a913dabec3c/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/c4/0f/db/c40fdb27-74a8-bd9f-646e-58dc17dc1f43/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/a4/e8/62/a4e8629d-5572-8bb0-7b2e-6d7835daa010/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/1d/ab/b9/1dabb95e-049f-5577-8bac-678668e48226/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.14", + "trackId": 1437062023, + "trackName": "Dynamic", + "formattedPrice": "$9.99", + "sellerName": "Mohammad Fathi", + "primaryGenreId": 6002, + "genreIds": [ + "6002", + "6008" + ], + "releaseDate": "2018-09-29T12:51:22Z", + "primaryGenreName": "Utilities", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2018-10-02T01:28:31Z", + "releaseNotes": "This update includes the ability to specify start and end times for hourly wallpapers.", + "trackCensoredName": "Dynamic", + "trackViewUrl": "https://apps.apple.com/us/app/dynamic/id1437062023?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "7203431", + "sellerUrl": "http://dynamic-wallpapers.com", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.0.1", + "wrapperType": "software", + "artistId": 713139240, + "artistName": "Mohammad Fathi", + "genres": [ + "Utilities", + "Photo & Video" + ], + "price": 9.99, + "description": "Dynamic Wallpaper Creator\n\nCreate stunning dynamic wallpapers made specifically for macOS Mojave.\nUse Dynamic to create your own Mojave-like wallpapers that change appearance throughout the day, depending on your local time, location, or even the appearance of your Mac. \n\nDynamic supports three types of wallpapers:\n\nHourly - Create wallpapers that change throughout the day at set intervals\nSolar - Make wallpapers that change depending on the sun's relative location throughout the day\nDark/Light - Display separate wallpapers for macOS Mojave's Dark/Light appearance modes", + "bundleId": "com.mohssenfathi.Dynamic-Mac", + "userRatingCount": 0 + }, + { + "artistViewUrl": "https://apps.apple.com/us/developer/xiang-he/id1278994432?mt=12&uo=4", + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/21/0b/0f/210b0f6f-35d4-d6ea-93f4-097460f1133a/source/60x60bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/21/0b/0f/210b0f6f-35d4-d6ea-93f4-097460f1133a/source/100x100bb.png", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/4c/1d/35/4c1d3581-f0d3-2661-4cbc-dc3a7349564f/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/aa/c7/ff/aac7ffe3-4bf3-ed88-b5fd-43020ca21d62/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/68/6c/5d/686c5dda-732d-a0c7-8ff5-b1ce20d72ee3/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/c8/61/24/c86124b2-6639-2d69-8dd0-c114f9b070f3/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/3c/1e/a9/3c1ea9e5-9bd1-f167-9d3e-7fd586d2b2be/pr_source.png/800x500bb.jpg" + ], + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/21/0b/0f/210b0f6f-35d4-d6ea-93f4-097460f1133a/source/512x512bb.png", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.9", + "trackId": 1444854113, + "trackName": "App Maker", + "formattedPrice": "$2.99", + "sellerName": "Xiang He", + "primaryGenreId": 6026, + "genreIds": [ + "6026", + "6007" + ], + "releaseDate": "2018-12-06T06:01:35Z", + "primaryGenreName": "Developer Tools", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2018-12-06T06:01:35Z", + "trackCensoredName": "App Maker", + "trackViewUrl": "https://apps.apple.com/us/app/app-maker/id1444854113?mt=12&uo=4", + "contentAdvisoryRating": "4+", + "averageUserRating": 0, + "languageCodesISO2A": [ + "EN", + "ZH", + "ZH" + ], + "fileSizeBytes": "514662", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "trackContentRating": "4+", + "version": "1.0", + "wrapperType": "software", + "artistId": 1278994432, + "artistName": "Xiang He", + "genres": [ + "Developer Tools", + "Productivity" + ], + "price": 2.99, + "description": "Make the apps you need with App Maker.\nUsing a combination of some files and scripts(AppleScript, shell), we’ve made a lot of powerful automation. It’s great BUT…\nIt can not be launched as a normal app with 1-click.\nIt can not be customized such as changing icons.\nIt can not be a single bundle containing all your own resources.\nSo why not use these automation as full applications?\nJust try to make your own automation apps.\nWith 1-click, Do Everything.\n\n***Need any help, please contact hsiangho@foxmail.com***", + "bundleId": "com.HyperartFlow.AppMaker", + "userRatingCount": 0 + } + ] + } diff --git a/MasKitTests/JSON/search/notability.json b/MasKitTests/JSON/search/notability.json index cc9a729be..cbf9c1591 100644 --- a/MasKitTests/JSON/search/notability.json +++ b/MasKitTests/JSON/search/notability.json @@ -1,72 +1,1405 @@ { - "resultCount": 1, + "resultCount": 20, "results": [ - { - "screenshotUrls": [ - "https://is1-ssl.mzstatic.com/image/thumb/Purple49/v4/9c/22/c9/9c22c974-9fe3-5a88-a7c7-d3c49ed91a82/source/800x500bb.jpg", - "https://is2-ssl.mzstatic.com/image/thumb/Purple49/v4/5e/9c/56/5e9c569d-0378-da5d-c5df-f340e3cf200b/source/800x500bb.jpg", - "https://is2-ssl.mzstatic.com/image/thumb/Purple69/v4/74/4c/ac/744cac64-f973-fb39-f222-6da5dfec6292/source/800x500bb.jpg", - "https://is5-ssl.mzstatic.com/image/thumb/Purple49/v4/03/cc/41/03cc413c-013d-48f5-0fa3-9c3d533dd20d/source/800x500bb.jpg", - "https://is4-ssl.mzstatic.com/image/thumb/Purple7/v4/da/2f/92/da2f92e7-5676-530b-c26c-7e81dc1ec067/source/800x500bb.jpg" - ], - "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/64/d0/80/64d0800e-8935-d266-7659-7b6e2b62745c/source/60x60bb.png", - "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/64/d0/80/64d0800e-8935-d266-7659-7b6e2b62745c/source/512x512bb.png", - "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/64/d0/80/64d0800e-8935-d266-7659-7b6e2b62745c/source/100x100bb.png", - "artistViewUrl": "https://itunes.apple.com/us/developer/ginger-labs/id318126112?mt=12&uo=4", - "kind": "mac-software", - "averageUserRatingForCurrentVersion": 3.5, - "trackCensoredName": "Notability", - "languageCodesISO2A": [ - "NL", - "EN", - "FR", - "DE", - "IT", - "JA", - "KO", - "NB", - "PT", - "RU", - "ZH", - "ES", - "ZH", - "TR" - ], - "fileSizeBytes": "93178480", - "sellerUrl": "http://www.gingerlabs.com", - "contentAdvisoryRating": "4+", - "userRatingCountForCurrentVersion": 39, - "trackViewUrl": "https://itunes.apple.com/us/app/notability/id736189492?mt=12&uo=4", - "trackContentRating": "4+", - "currentVersionReleaseDate": "2018-11-26T16:55:36Z", - "trackId": 736189492, - "trackName": "Notability", - "formattedPrice": "$9.99", - "sellerName": "Ginger Labs, Inc.", - "isVppDeviceBasedLicensingEnabled": true, - "releaseDate": "2014-08-28T01:47:26Z", - "primaryGenreName": "Productivity", - "genreIds": [ - "12014", - "12003" - ], - "primaryGenreId": 12014, - "currency": "USD", - "wrapperType": "software", - "version": "3.1", - "releaseNotes": "*** What's new in 3.1 ***\nYou asked for these features and we listened! We've added powerful new features: custom colors, a color dropper to match any color in your note, increased note security using Apple's Touch ID, in-app file conversion, and dark mode.\n\nCustom Colors & Color Dropper\n• Custom colors have arrived - the rainbow is the limit! Expand your color palette by saving up to 32 additional custom colors. \n• Colors can be chosen with a color wheel or by entering a HEX value.\n• The color dropper easily allows you to select any color in your note and save that as one of your custom colors.\n\nNew Locking Feature \n• Our security just got amped with Touch ID to unlock subjects. \n\nIn-app File Conversion\n• Notability now converts Microsoft Office files to PDFs on your device for added privacy and security.\n• Quicker and more reliable conversion.\n\nDark Mode\n• Notability now supports the system wide dark mode introduced in Mojave.", - "minimumOsVersion": "10.12", - "artistId": 318126112, - "artistName": "Ginger Labs", - "genres": [ - "Productivity", - "Education" - ], - "price": 9.99, - "description": "Welcome to Notability: powerful, yet wonderfully simple note-taking and annotation. Apple's Mac App of The Year! Apple Editors' Choice on iPad, iPhone, and Mac!\n\nStudents, teachers, and business professionals use Notability daily to enrich their lives. It is uniquely designed for each device to provide the best note-taking experience at school, home, and work.\n\nSTREAMLINE YOUR WORKFLOW\n• Become fully paper-free, in the classroom, office, and at home.\n• Complete, sign, and share documents in Notability.\n• Quickly create and edit notes by dragging and dropping documents, photos, or audio recordings from the desktop.\n• Get more done with keyboard shortcuts.\n• Secure and lock your notes using Touch ID.\n\nSEARCH AND CONVERT HANDWRITTEN NOTES\n• Search for handwritten words from the Library and in the note view in any of our 14 supported languages.\n• Convert handwriting to text.\n• It all happens on your device, so your information stays private.\n\nSAVE TIME WITH MULTI-NOTE\n• Multi-Note lets you open multiple notes at once in new windows.\n• Easily access your recently opened notes in the Recent Notes subject.\n\nESSENTIAL FEATURES\n• Notability includes full-featured, left-aligned typing with a wide range of fonts, sizes, and colors.\n• Create outlines, interactive checklists, and text boxes.\n• Fully express your artistic side with custom colors and match any color with the color dropper.\n• Handwriting has been fine-tuned to be smooth and expressive using a trackpad or mouse.\n• Ink can be scaled, transformed, rotated, nudged (with arrow keys), and restyled.\n\nIMPORT AND SHARE\n• Import PDFs, DOCs, PPTs, images, GIFs, and more - conversion to PDF happens on your device, so your information stays private.\n• Annotate imported pictures, lecture slides, and meeting agendas, or complete class assignments.\n• Share notes via email, AirDrop, Dropbox, Google Drive, Box, OneDrive, and more.\n\nRECORD AND PLAYBACK AUDIO\n• Get more out of your lectures and meetings when you record them.\n• Notes are automatically synced with audio recordings so during playback you can listen to what was happening as you wrote. \n\nAUTO-BACKUP AND ICLOUD SYNC\n• Use iCloud to automatically sync your notes to Notability on iPad, iPhone, and Mac, or to retrieve previous versions of your notes.\n• Use Auto-backup to send your notes to a cloud service for archiving or recovery. Dropbox, Google Drive, Box, and OneDrive are all supported! \n\niOS app sold separately.\n\nNotability is a registered trademark of Ginger Labs, Inc.", - "bundleId": "com.gingerlabs.NotabilityMac", - "averageUserRating": 3.5, - "userRatingCount": 1840 - } + { + "features": [ + "iosUniversal" + ], + "isGameCenterEnabled": false, + "supportedDevices": [ + "iPad612-iPad612", + "iPadMini4-iPadMini4", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadAir3-iPadAir3", + "iPhoneXR-iPhoneXR", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPadPro97Cellular-iPadPro97Cellular", + "iPad72-iPad72", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhoneX-iPhoneX", + "iPad74-iPad74", + "iPad834-iPad834", + "iPhone7Plus-iPhone7Plus", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPhone6sPlus-iPhone6sPlus", + "iPadMini3-iPadMini3", + "iPadSeventhGen-iPadSeventhGen", + "iPad71-iPad71", + "iPadAir3Cellular-iPadAir3Cellular", + "iPad812-iPad812", + "iPad856-iPad856", + "iPadPro-iPadPro", + "iPadAir2-iPadAir2", + "iPhone8Plus-iPhone8Plus", + "iPhone11Pro-iPhone11Pro", + "iPadAirCellular-iPadAirCellular", + "iPhoneXSMax-iPhoneXSMax", + "iPhone6Plus-iPhone6Plus", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadAir-iPadAir", + "iPad73-iPad73", + "iPad878-iPad878", + "iPhoneXS-iPhoneXS", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadProSecondGen-iPadProSecondGen", + "iPhone6-iPhone6", + "iPad611-iPad611", + "iPadPro97-iPadPro97", + "iPad76-iPad76", + "iPhone11-iPhone11", + "iPadProFourthGen-iPadProFourthGen", + "iPadMiniRetina-iPadMiniRetina", + "iPadProCellular-iPadProCellular", + "iPodTouchSixthGen-iPodTouchSixthGen", + "MacDesktop-MacDesktop", + "iPadAir2Cellular-iPadAir2Cellular", + "iPadMini5-iPadMini5", + "iPhone11ProMax-iPhone11ProMax", + "iPhone5s-iPhone5s", + "iPhone6s-iPhone6s", + "iPad75-iPad75", + "iPhone7-iPhone7", + "iPhoneSE-iPhoneSE", + "iPhone8-iPhone8" + ], + "advisories": [], + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/92/b4/52/92b45239-c29b-f8dd-89c5-038723853d6d/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/91/35/bb/9135bbc5-4f87-0ec1-0054-b6a5c0bb5c41/pr_source.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/22/e8/cc/22e8cc65-51c2-5423-c019-7643d02daacf/pr_source.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/6a/c5/74/6ac574dd-020a-07f2-7ce9-9dddcfda9758/pr_source.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/6c/44/f2/6c44f234-0110-1fe4-13e5-a4c9ac6b6f91/pr_source.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/96/44/42/9644420f-cd53-3fea-d360-97029c6b6f70/pr_source.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/ae/b3/81/aeb38130-5ab8-9a93-8290-79c7f01292e5/pr_source.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/15/a6/a9/15a6a93e-486d-accb-3af2-3b7ea39db84a/pr_source.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/bb/13/b1/bb13b1b9-c4ff-c65a-31ce-858f03f8d35c/pr_source.png/576x768bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/9d/71/94/9d7194bc-4049-6b65-e65d-ac4f2dfc00d7/pr_source.png/576x768bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/e5/94/1e/e5941e3a-3556-8393-0063-3ae56b5b2646/pr_source.png/576x768bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/6b/26/3c/6b263c16-afc0-eba7-21b3-e1d472a90be5/pr_source.png/576x768bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/b8/43/21/b8432187-0c7f-952e-5dc9-292e686126e2/pr_source.png/576x768bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/39/8c/9f/398c9f89-e24a-73af-35a9-54c88ca1a74c/pr_source.png/576x768bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/7a/95/04/7a950402-99da-f2cf-dbee-0bfa980f00d9/pr_source.png/576x768bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/7e/30/6c/7e306c6b-a96d-d35b-52dc-750164c6b85d/pr_source.png/576x768bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/51/f6/45/51f64584-a07c-3ccc-ec50-10939cc52b66/pr_source.png/576x768bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/b7/01/0d/b7010dfa-e168-c815-7a35-fce5cf6c7ff3/source/60x60bb.jpg", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/b7/01/0d/b7010dfa-e168-c815-7a35-fce5cf6c7ff3/source/512x512bb.jpg", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/b7/01/0d/b7010dfa-e168-c815-7a35-fce5cf6c7ff3/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/time-base-technology-limited/id424587624?uo=4", + "kind": "software", + "currency": "USD", + "minimumOsVersion": "12.0", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 1444383602, + "trackName": "GoodNotes 5", + "releaseDate": "2019-01-15T09:36:27Z", + "sellerName": "Time Base Technology Limited", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "Bugfixes and performance improvements", + "currentVersionReleaseDate": "2020-09-02T14:52:16Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "$7.99", + "trackCensoredName": "GoodNotes 5", + "languageCodesISO2A": [ + "NL", + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES", + "TH", + "ZH", + "TR" + ], + "fileSizeBytes": "326528000", + "sellerUrl": "https://www.goodnotes.com/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 4.80341000000000040159875425160862505435943603515625, + "userRatingCountForCurrentVersion": 116322, + "averageUserRating": 4.80341000000000040159875425160862505435943603515625, + "trackViewUrl": "https://apps.apple.com/us/app/goodnotes-5/id1444383602?uo=4", + "trackContentRating": "4+", + "version": "5.5.5", + "wrapperType": "software", + "artistId": 424587624, + "artistName": "Time Base Technology Limited", + "genres": [ + "Productivity", + "Business" + ], + "price": 7.99, + "description": "Transform your iPad into smart digital paper. Take handwritten notes in digital notebooks, on imported PDF, PowerPoint, and Word documents, or on images and photos. All notes are searchable and you'll never have to worry about losing or misplacing them again. GoodNotes is one of the top paid iPad apps worldwide and is frequently featured on the App Store, making it a must-have for your iPad.\n\n\nWRITE NATURALLY - LIKE ON REAL PAPER\n* Fluent, precise, and completely natural writing experience thanks to GoodNotes pioneering vector ink engine\n* Write with the Apple Pencil, Logitech Crayon, or with many capacitive styluses and even your finger\n* Select and customize your pen color, thickness, and style (fountain pen, ballpoint, brush pen)\n* Easily switch between pen, highlighter, and eraser\n\nALWAYS FIND WHAT YOU WROTE\n* Everything is indexed: Search your handwritten notes, typed text, PDF text, document outlines, folder titles, and document titles\n* Convert your handwriting to text to share it with other apps or add it to the page as a text box to continue typing with your keyboard\n\nNEVER LOSE YOUR NOTES AGAIN\n* All your notes with you at all times thanks to iCloud Sync\n\nVIEW DOCUMENTS SIDE BY SIDE (requires iPadOS)\n* open GoodNotes in multiple windows to view two documents or two pages side by side\n* use tabs to quickly switch between open documents\n\nESCAPE THE LIMITS OF ANALOG PAPER\n* Move, resize, and rotate your handwriting or change colors\n* Draw perfect shapes and lines with the Shapes Tool \n* unlimited undo & redo including gesture control for faster corrections\n* powerful & smart eraser tool: Choose to erase the entire stroke or only parts of it. Set it to \"Erase Highlighter Only\" to leave the ink intact\n* Pinch to zoom and write more precisely\n* Navigate through imported PDFs with existing hyperlinks\n\nCUSTOMIZE YOUR NOTEBOOKS\n* Choose from a large set of beautiful covers and paper templates: Essentials, writing paper, Cornell paper, dark paper, checklists, planners, and more\n* Import any PDF or image as a custom template for more customization\n\nGO PAPERLESS\n* import PDF, PowerPoint, Word, images, photos and more to annotate them right on your iPad\n* export documents and share them with others for a fully digital workflow\n* scan your paper documents and recognize the text\n\nEFFORTLESS DOCUMENT MANAGEMENT\n* Organize your documents in folders and create unlimited subfolders\n* Mark your most important documents, pages, and folders as Favorites to access them quickly\n* Create custom outlines for easier navigation through your documents\n\nCONVERT YOUR IPAD INTO A DISTRACTION-FREE DIGITAL WHITEBOARD\n* Keep your audience focused on what's important: Presentation mode lets you hide all distractions on an external screen when you connect your device via HDMI or AirPlay \n* Use all of GoodNotes' tools, including the Laser Pointer on the iPad, while your audience only sees the page and the content\n* GoodNotes empowers you to give more engaging presentations, lectures, and lessons. You can move around freely and interact with the audience while adding new information to the digital whiteboard for everyone to see\n\nVisit our website at goodnotes.com for more information, or follow us on Twitter and Instagram as @goodnotesapp.", + "bundleId": "com.goodnotesapp.x", + "userRatingCount": 116322 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/bc/e5/af/bce5af5a-2551-4885-c3d0-bee4e8a07cc4/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/75/28/c1/7528c12e-62fc-4a03-8a3c-4bb525d934e0/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/ce/4e/61/ce4e619b-2bdc-57b1-04f1-3828d97ee5f7/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/3f/17/e8/3f17e80f-1356-3a82-53af-205622078d1d/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/42/67/ae/4267ae1b-17a2-c805-0a8f-27426514b393/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/0d/dd/4d/0ddd4df3-99f5-0839-691e-d63366d96230/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/0d/dd/4d/0ddd4df3-99f5-0839-691e-d63366d96230/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/0d/dd/4d/0ddd4df3-99f5-0839-691e-d63366d96230/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/ginger-labs/id318126112?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.13", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 736189492, + "trackName": "Notability", + "releaseDate": "2014-08-28T01:47:26Z", + "sellerName": "Ginger Labs, Inc.", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "- Miscellaneous bug fixes and improvements", + "currentVersionReleaseDate": "2020-08-31T03:38:29Z", + "genreIds": [ + "6007", + "6017" + ], + "formattedPrice": "$1.99", + "trackCensoredName": "Notability", + "languageCodesISO2A": [ + "NL", + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "NB", + "PT", + "RU", + "ZH", + "ES", + "TH", + "ZH", + "TR" + ], + "fileSizeBytes": "98876628", + "sellerUrl": "http://www.gingerlabs.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/notability/id736189492?mt=12&uo=4", + "trackContentRating": "4+", + "version": "4.4", + "wrapperType": "software", + "artistId": 318126112, + "artistName": "Ginger Labs", + "genres": [ + "Productivity", + "Education" + ], + "price": 1.99, + "description": "Welcome to Notability: powerful, yet wonderfully simple note-taking and annotation. Apple's Mac App of The Year! Apple Editors' Choice on iPad, iPhone, and Mac!\n\nStudents, teachers, and business professionals use Notability daily to enrich their lives. It is uniquely designed for each device to provide the best note-taking experience at school, home, and work.\n\nSTREAMLINE YOUR WORKFLOW\n• Become fully paper-free, in the classroom, office, and at home.\n• Complete, sign, and share documents in Notability.\n• Quickly create and edit notes by dragging and dropping documents, photos, or audio recordings from the desktop.\n• Get more done with keyboard shortcuts.\n• Secure and lock your notes using Touch ID.\n\nSEARCH AND CONVERT HANDWRITTEN NOTES\n• Search for handwritten words from the Library and in the note view in any of our 14 supported languages.\n• Convert handwriting to text.\n• It all happens on your device, so your information stays private.\n\nSAVE TIME WITH MULTI-NOTE\n• Multi-Note lets you open multiple notes at once in new windows.\n• Easily access your recently opened notes in the Recent Notes subject.\n\nESSENTIAL FEATURES\n• Notability includes full-featured, left-aligned typing with a wide range of fonts, sizes, and colors.\n• Create outlines, interactive checklists, and text boxes.\n• Fully express your artistic side with custom colors and match any color with the color dropper.\n• Easily create perfect shapes and precisely erase all ink in varied brush sizes\n• Handwriting has been fine-tuned to be smooth and expressive using a trackpad or mouse.\n• Ink can be scaled, transformed, rotated, nudged (with arrow keys), and restyled.\n\nIMPORT AND SHARE\n• Import PDFs, DOCs, PPTs, images, GIFs, and more - conversion to PDF happens on your device, so your information stays private.\n• Annotate imported pictures, lecture slides, and meeting agendas, or complete class assignments.\n• Share notes via email, AirDrop, Dropbox, Google Drive, Box, OneDrive, and more.\n\nRECORD AND PLAYBACK AUDIO\n• Get more out of your lectures and meetings when you record them.\n• Notes are automatically synced with audio recordings so during playback you can listen to what was happening as you wrote. \n\nAUTO-BACKUP AND ICLOUD SYNC\n• Use iCloud to automatically sync your notes to Notability on iPad, iPhone, and Mac, or to retrieve previous versions of your notes.\n• Use Auto-backup to send your notes to a cloud service for archiving or recovery. Dropbox, Google Drive, Box, and OneDrive are all supported! \n\niOS app sold separately.\n\nNotability is a registered trademark of Ginger Labs, Inc.", + "bundleId": "com.gingerlabs.NotabilityMac", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/05/4f/f0/054ff049-29df-c85b-429c-5a442946298d/mzl.sxqmntka.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/07/d0/c5/07d0c5c2-3fdf-b318-89fe-e4443cbef91d/mzl.whbcadba.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/25/27/37/25273783-a408-f9fb-c63e-7c891ab59590/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/ff/70/b6/ff70b69b-7a1c-e2ed-9c50-88c6ab7feb71/mzl.ruheihrk.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/49/ed/b4/49edb46f-0acb-f73d-53a7-da30f174aeae/mzl.bbyezctq.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/40/0c/e6/400ce61f-216c-a5c5-7e6b-afcaa5177152/mzl.itqdfxeq.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/86/e4/f8/86e4f866-a0e7-bd1e-670b-7efd1fc7cd93/mzl.tusutbxr.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/6b/01/08/6b01080b-6e8a-0718-af9e-f0f6341de3d0/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/6b/01/08/6b01080b-6e8a-0718-af9e-f0f6341de3d0/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/6b/01/08/6b01080b-6e8a-0718-af9e-f0f6341de3d0/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/evernote/id281796111?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.13", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 406056744, + "trackName": "Evernote", + "releaseDate": "2010-12-30T02:41:26Z", + "sellerName": "Evernote", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "Fixed\nSometimes the app would get stuck loading a note (usually a web clip or shared note) until finally it gave up and assumed you were offline. But now your notes should load fast enough to make you smile.\nIf you updated to macOS Catalina then tried to highlight text inside a PDF, it would look like there was nothing selected. You could say it was a big fail, but on the bright side, we fixed it.", + "currentVersionReleaseDate": "2019-12-17T02:36:37Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "trackCensoredName": "Evernote", + "languageCodesISO2A": [ + "DA", + "NL", + "EN", + "FI", + "FR", + "DE", + "ID", + "IT", + "JA", + "KO", + "MS", + "PL", + "PT", + "RU", + "ZH", + "ES", + "SV", + "TH", + "ZH", + "TR", + "VI" + ], + "fileSizeBytes": "57769623", + "sellerUrl": "http://www.evernote.com/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/evernote/id406056744?mt=12&uo=4", + "trackContentRating": "4+", + "version": "7.14", + "wrapperType": "software", + "artistId": 281796111, + "artistName": "Evernote", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "description": "Evernote helps you focus on what matters most and have access to your information when you need it. Input typed notes or scan handwritten notes. Add to-do’s, photos, images, web pages, or audio ... and it’s all instantly searchable. Organize notes any way you want and share with anyone. And Evernote syncs across your devices so your information is always with you, everywhere you go.\n\n---\n\n“Use Evernote as the place you put everything… Don’t ask yourself which device it’s on—it’s in Evernote” – The New York Times\n\n“When it comes to taking all manner of notes and getting work done, Evernote is an indispensable tool.” – PC Mag\n\n---\n\nGET ORGANIZED\nEvernote gives you the tools you need to keep your work effortlessly organized:\n• Write, collect and capture ideas as searchable notes, notebooks, checklists and to-do lists\n• Take notes in a variety of formats, including: text, sketches, photos, audio, video, PDFs, web clippings and more\n• Use the camera to effortlessly scan, digitize, and organize your paper documents, business cards, handwritten notes and drawings\n• Use Evernote as a digital notepad and easy-to-format word processor for all your thoughts as they come\n\nSYNC ANYWHERE\nEvernote gives you the ability to sync your content across devices:\n• Sync everything automatically across any computer, phone or tablet\n• Start your task working on one device and continue on another without ever missing a beat\n• Add a passcode lock to the mobile app for more privacy\n\nSHARE YOUR IDEAS\nEvernote gives you the tools to share, discuss and collaborate productively with others:\n• Create, share and discuss with the people who help get your work done, all in one app\n• Search within pictures and annotate images to give quick feedback\n• Develop your projects faster and let multiple participants work on different aspects\n\nEVERNOTE IN EVERYDAY LIFE\n• Make personal checklists to keep your thoughts organized\n• Set reminders to keep on top of activities and write to-do lists\n• Gather, capture and store every thought you need to stay productive\n• Plan events such as holidays, weddings or parties\n\nEVERNOTE IN BUSINESS\n• Create agendas, write memos and craft presentations\n• Annotate documents with comments and thoughts during team meetings, then share with colleagues\n• Get your projects underway faster and maximise productivity by letting multiple participants access and work on different aspects alongside each other\n\nEVERNOTE IN EDUCATION\n• Keep up with lecture notes so you don’t miss a vital thought\n• Clip and highlight articles from the web for academic research\n• Plan and collaborate for better academic group work\n\n---\n\nAlso available from Evernote:\n\nEVERNOTE PREMIUM - The ultimate workspace.\n• 10 GB of new uploads each month\n• Unlimited number of devices\n• Access your notes and notebooks offline on your mobile device\n• Save emails to Evernote\n• Search inside Office docs and attachments\n• Annotate PDFs\n• Scan and digitize business cards\n• Show notes as presentations, instantly\n$7.99 monthly, $69.99 annually\n\n---\n\nPrice may vary by location. Subscriptions will be charged to your credit card through your iTunes account. Your subscription will automatically renew unless canceled at least 24 hours before the end of the current period. You will not be able to cancel the subscription once activated. Manage your subscriptions in Account Settings after purchase.\n\n---\n\nPrivacy Policy: https://evernote.com/legal/privacy.php \nTerms of Service: https://evernote.com/legal/tos.php", + "bundleId": "com.evernote.Evernote", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/05/10/c3/0510c3e6-6c56-9cf3-9000-cf1c58eef21e/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/fd/a5/10/fda51085-4b7b-f818-864b-5e1ad16365bd/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/f5/48/d2f54873-bf8c-788f-0b5f-e80553a6640d/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/4a/1c/fa/4a1cfa15-ad2e-2d5f-d8a1-b7052b7ce1df/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/02/ea/db/02eadbbb-9ff2-bf80-77ce-532ff6b58d76/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/a2/51/9b/a2519bfa-5bed-6812-64ab-b807e73eb5d0/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/60/4b/89/604b89e5-d76c-908e-ff6a-307f3ba69771/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/c9/0e/3c/c90e3c3b-9b91-e210-de84-61c4dda4da07/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/c9/0e/3c/c90e3c3b-9b91-e210-de84-61c4dda4da07/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/c9/0e/3c/c90e3c3b-9b91-e210-de84-61c4dda4da07/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/digital-workroom-ltd/id941209527?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.13", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 1446580517, + "trackName": "Noted․", + "releaseDate": "2019-01-17T05:48:01Z", + "sellerName": "Digital Workroom Ltd", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "Noted 1.6 continues its adventures into Web Notes - a new way to share notes with your friends and colleagues!\n\nYou can now create a web link directly from the app, and make your recordings available to anyone, even if they don't have Noted.\n\nThis update also adds the option to disable \"Automatically add new line\" while using Dictation and some bug fixes.\n\n---\n\nIf you enjoy using Noted, please consider rating the app and leaving us a nice review! We'd really appreciate it and helps us reach for the stars :)\n\nWe’re always listening to your feedback, feel free to tweet us @EverythingNoted or drop an email to support@notedapp.io", + "currentVersionReleaseDate": "2020-07-18T07:54:45Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "Free", + "trackCensoredName": "Noted․", + "languageCodesISO2A": [ + "AR", + "NL", + "EN", + "FR", + "DE", + "HE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES", + "SV", + "ZH", + "TR" + ], + "fileSizeBytes": "84379546", + "sellerUrl": "https://www.notedapp.io/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/noted/id1446580517?mt=12&uo=4", + "trackContentRating": "4+", + "version": "1.6.2", + "wrapperType": "software", + "artistId": 941209527, + "artistName": "Digital Workroom Ltd", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.00, + "description": "Bring your notes and audio together with Noted.\n\nNoted is a fully-integrated audio recording and note-taking app. Perfect for lectures, meetings, interviews and conferences, everything you type is time-stamped to your audio recording – giving you an instant overview of all the important details.\n\nBy bringing them together, you never need to worry about trawling through pages of notes or hours of audio ever again. Just add a #TimeTag, so you can return to key moments instantly, and keep everything neat and tidy.\n\nStreamline your note-taking with the effortless note and audio syncing app for iOS and macOS.\n\nStudy smarter\nTake your lectures and seminars to the next level. By tagging specific moments you can come back and fill in any blanks later - you'll never miss an important point from your professor again. When revising, there’s no need to listen back through hours of recordings. Your tags let you skip to the right moment instantly.\n\nPerfect for professionals\nBoost your productivity with better, more efficient note-taking. Noted lets you stay fully engaged during long business meetings and interviews, then review and share specific points afterwards with colleagues. Intelligent syncing lets you switch easily between smartphone and laptop, ideal for moments when using your phone could appear unprofessional.\n\nRecord and playback\n- Skip to the precise moment you want with #TimeTag and avoid endless scrubbing\n- Adjust playback speed (0.5x, 1x, 1.5x, 2x)\n- Remove unwanted background noise\n\nTake notes, add images\n- Format your notes with rich text editing \n- Highlight key sections\n- Capture or import useful images, then mark them up\n- Drag and drop content from other apps\n\nDictation\n- You speak, we write!\n- Transform your voice into text using Dictation. Take notes even more effortlessly by speaking into the microphone in the language of your choice - and we'll do the rest!\n\nStay organised\n- Pin your most important notebooks for easier access\n- Search all your notes in one place\n- Lock individual notes with a password or Touch ID\n\nSync and share\n- Sync seamlessly and securely across devices using iCloud\n- Export note in various formats\n- Export audio as .m4a format, and share via AirDrop and more\n\nNoted Basic\nKeep it simple with all the core features including full editing, indexing and exporting.\n\nNoted+\nSubscribe and get a whole lot more:\n- Export to PDF\n- Reduce background noise\n- Improve recording quality \n- Audio equalizer for better playback \n- Dictation\n- Intelligent playback\n- Attach documents\n- Adjust skip forward / backward time\n- And more!\n\nSubscription Options\n1) Monthly subscription – Auto renew subscription with 7 days free trial to unlock all Noted+ features (USD 2.49)\n2) Yearly subscription – Auto renew subscription with 1 month free trial to unlock all Noted+ features (USD 23.99)\n\nSubscription Details:\n- Noted+ is enabled via an auto-renewing subscription.\n- Price may vary depending on location.\n- Payment will be charged to iTunes Account at confirmation of purchase.\n- Subscription automatically renews unless auto-renew is turned off at least 24-hours before the end of the current period.\n- Account will be charged for renewal within 24-hours prior to the end of the current period\n- Subscriptions may be managed by the user and auto-renewal may be turned off by going to the user’s Account Settings after purchase\n- Any unused portion of a free trial period, if offered, will be forfeited when the user purchases a subscription\n\n---\n\nHave a question? Our support team is here to help and attentively listening to your feedback.\nEmail: support@notedapp.io\nWebsite: http://www.notedapp.io/\n\nFollow us for exciting updates and more note-taking tips!\nFacebook: www.facebook.com/EverythingNoted\nTwitter: @EverythingNoted\n\nPrivacy Policy: http://www.notedapp.io/privacy-policy/\nTerms of Service: http://www.notedapp.io/terms-of-use/", + "bundleId": "com.digitalworkroom.noted.mac", + "userRatingCount": 0 + }, + { + "features": [ + "iosUniversal" + ], + "isGameCenterEnabled": false, + "supportedDevices": [ + "iPad612-iPad612", + "iPadMini4-iPadMini4", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadAir3-iPadAir3", + "iPhoneXR-iPhoneXR", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPadPro97Cellular-iPadPro97Cellular", + "iPad72-iPad72", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhoneX-iPhoneX", + "iPad74-iPad74", + "iPad834-iPad834", + "iPhone7Plus-iPhone7Plus", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPhone6sPlus-iPhone6sPlus", + "iPadMini3-iPadMini3", + "iPadSeventhGen-iPadSeventhGen", + "iPad71-iPad71", + "iPadAir3Cellular-iPadAir3Cellular", + "iPad812-iPad812", + "iPad856-iPad856", + "iPadPro-iPadPro", + "iPadAir2-iPadAir2", + "iPhone8Plus-iPhone8Plus", + "iPhone11Pro-iPhone11Pro", + "iPadAirCellular-iPadAirCellular", + "iPhoneXSMax-iPhoneXSMax", + "iPhone6Plus-iPhone6Plus", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadAir-iPadAir", + "iPad73-iPad73", + "iPad878-iPad878", + "iPhoneXS-iPhoneXS", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadProSecondGen-iPadProSecondGen", + "iPhone6-iPhone6", + "iPad611-iPad611", + "iPadPro97-iPadPro97", + "iPad76-iPad76", + "iPhone11-iPhone11", + "iPadProFourthGen-iPadProFourthGen", + "iPadMiniRetina-iPadMiniRetina", + "iPadProCellular-iPadProCellular", + "iPodTouchSixthGen-iPodTouchSixthGen", + "MacDesktop-MacDesktop", + "iPadAir2Cellular-iPadAir2Cellular", + "iPadMini5-iPadMini5", + "iPhone11ProMax-iPhone11ProMax", + "iPhone5s-iPhone5s", + "iPhone6s-iPhone6s", + "iPad75-iPad75", + "iPhone7-iPhone7", + "iPhoneSE-iPhoneSE", + "iPhone8-iPhone8" + ], + "advisories": [], + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/fd/86/8e/fd868e78-28f2-2514-e9f0-c0ec158b63e5/pr_source.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/87/1e/9b/871e9b10-01dc-9871-24dc-0d4f5eda5687/pr_source.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/89/29/53/892953b5-9000-e4eb-4132-c622a6d8d52b/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/13/96/48/1396482c-06b5-2e3c-271e-6c87992e7f29/pr_source.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/ed/6c/8f/ed6c8f04-4eee-3809-d579-58cbf38c3af0/pr_source.png/576x768bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/c3/57/a4/c357a4da-7b25-e48e-f7a2-b5e84864e3ba/pr_source.png/576x768bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/c3/40/c0/c340c021-01c2-1505-c5bd-72ad69a06522/pr_source.png/576x768bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/f7/ef/e8/f7efe85b-0876-959e-658d-6895b5ecc8c0/pr_source.png/576x768bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/b0/ae/e6/b0aee6ca-3ccd-2093-67c7-3c81984e5786/source/60x60bb.jpg", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/b0/ae/e6/b0aee6ca-3ccd-2093-67c7-3c81984e5786/source/512x512bb.jpg", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/b0/ae/e6/b0aee6ca-3ccd-2093-67c7-3c81984e5786/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/legolas-wang/id1319085476?uo=4", + "kind": "software", + "currency": "USD", + "minimumOsVersion": "13.0", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 1481732301, + "trackName": "Blankbook - Paper Note", + "releaseDate": "2019-12-15T08:00:00Z", + "sellerName": "Legolas Wang", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "Update for iPad, iPhone, Mac 5.2.0 dedicated to my dad \"Wang Chengge\".\n\nToday is June 18, 2020, your favorite auspicious number, Dad. You had a brain hemorrhage and all of a sudden you're in heaven. My dad was an ordinary man, extraordinarily kind-hearted, carried stress, but always had a smile for life. You support my dreams and Mom's dreams with all you've got, and support our family. You loved rocks, and when I agreed with you to support your dream and make you a video you just suddenly left. Dad, you left too soon, you probably just wanted to rest and go see Grandma, maybe our turtle Raffles is waiting for you over there too.\n\nYour last waking hours before you left were spent worrying about my schooling, Dad, rest assured that with your support, I have indeed learned all the What I want to learn: development, music theory, linguistics, film history, design, psychology, photography, game design and development, translation, and writing. , economics, leadership, business, etc.... I'm probably one of the few people who has seen all the faculty courses at the university. And I have a clear vision of what I want to study in the future. Learning comes a few days later at WWDC, and don't worry Dad, I'll keep up the lifelong learning, which is already fun.\n\nThis app has probably been the most talked about topic you and I have had in recent months, Dad. You don't have the equipment to use it yourself, but you're always there with suggestions and ideas for me to make a good product for users, and when I do, I'm sure you'll be there to help me. Don't go down with me when I say not to rush, encourage me to be patient and take my time. Your support and love is very real to me, and I will also pass on your expectations and support to every user. I will take your support and trust, Dad, and your heart to this application and all future products, and share it with the world! .\n\nThis update is dedicated to you, the announcement has been translated into all the languages of the world to bring users around the world, this update announcement will also be in Apple's entire On iPad, iPhone, and Mac, let users around the world know you're the guy behind it all. I have a wonderful father named Wang Chengge. I, Wang Yuxing, am proud to be your son, and I will still be your son in my next life. I hope that everyone who reads this announcement will love those around them, just like the last moment of their lives. Remind your family to take care of your health and develop good habits.\n\nMiss you a lot, Dad, and you take care of yourself over there too. Mom and I love you.", + "currentVersionReleaseDate": "2020-06-19T16:39:28Z", + "genreIds": [ + "6007", + "6027" + ], + "formattedPrice": "Free", + "trackCensoredName": "Blankbook - Paper Note", + "languageCodesISO2A": [ + "AR", + "CS", + "NL", + "EN", + "FR", + "DE", + "HE", + "HI", + "IT", + "JA", + "KO", + "NB", + "FA", + "PL", + "PT", + "RU", + "ZH", + "ES", + "ZH", + "TR", + "VI" + ], + "fileSizeBytes": "42945536", + "sellerUrl": "https://www.legolas.me/blankbook-english", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 4.42856000000000005201172825763933360576629638671875, + "userRatingCountForCurrentVersion": 35, + "averageUserRating": 4.42856000000000005201172825763933360576629638671875, + "trackViewUrl": "https://apps.apple.com/us/app/blankbook-paper-note/id1481732301?uo=4", + "trackContentRating": "4+", + "version": "5.2.0", + "wrapperType": "software", + "artistId": 1319085476, + "artistName": "Legolas Wang", + "genres": [ + "Productivity", + "Graphics & Design" + ], + "price": 0.00, + "description": "Blankbook reduces the clutter and reproduce the essence of an extraordinary handwriting experience.\n\nIt features a well-thought design that makes your content speak. The bookshelf offers a see-through preview that allows you to see your content directly. \n\nCanvas: Infinite scrolling canvas allows your creativity flow, you’ll never be bothered by manually creating a new page over and over again. \n\nPaper: It offers 7 static paper types. All with dark and light variants. Dotted, squared, watercolor papers, etc. We get you covered. \n\nTools: Pen, pencil, marker, lasso for copy and cut, ruler, pixel eraser and vector eraser. All powered by the best Apple Pencil technology.\n\nShortcuts: Want quick access to your favorite tools without adjusting the setting repeatedly? We offer you three quick-access slots per note. Add any tools to it and it saves for you. \n\nIntuitiveness: Tap the title name your note, long press to reorder, two-finger tap to undo, two-finger pinch to zoom. It’s that easy! \n\nDark mode: The color scheme will match the system setting automatically. Or you can use iOS dark/light switch to set it to your preferences. \n\nHave fun writing!\n\n-----------------\n“You’ve got the brownie when night is coming, huh~ It's not a dessert\". Licensed from artist Yuanyu Zhou(Ins: @frost.tree), Bookbook iMessage app integrates with her \"Brownie\" series of emoji packs.\n\nTerm of service: https://www.legolas.me/paperworks/blankbook-terms-of-service\n\nPrivacy Policy: https://www.legolas.me/paperworks/blankbook-privacy-policy\n\nDeveloper: Yuxiao Wang\nSpecial thanks: @Yuanyu Zhou, @Minja. For ideas, testing and feedbacks.", + "bundleId": "me.legolas.papery", + "userRatingCount": 35 + }, + { + "features": [ + "iosUniversal" + ], + "isGameCenterEnabled": false, + "supportedDevices": [ + "iPad612-iPad612", + "iPadMini4-iPadMini4", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadAir3-iPadAir3", + "iPhoneXR-iPhoneXR", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPadPro97Cellular-iPadPro97Cellular", + "iPad72-iPad72", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhoneX-iPhoneX", + "iPad74-iPad74", + "iPad834-iPad834", + "iPhone7Plus-iPhone7Plus", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPhone6sPlus-iPhone6sPlus", + "iPadMini3-iPadMini3", + "iPadSeventhGen-iPadSeventhGen", + "iPad71-iPad71", + "iPadAir3Cellular-iPadAir3Cellular", + "iPad812-iPad812", + "iPad856-iPad856", + "iPadPro-iPadPro", + "iPadAir2-iPadAir2", + "iPhone8Plus-iPhone8Plus", + "iPhone11Pro-iPhone11Pro", + "iPadAirCellular-iPadAirCellular", + "iPhoneXSMax-iPhoneXSMax", + "iPhone6Plus-iPhone6Plus", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadAir-iPadAir", + "iPad73-iPad73", + "iPad878-iPad878", + "iPhoneXS-iPhoneXS", + "iPadMini3Cellular-iPadMini3Cellular", + "iPadProSecondGen-iPadProSecondGen", + "iPhone6-iPhone6", + "iPad611-iPad611", + "iPadPro97-iPadPro97", + "iPad76-iPad76", + "iPhone11-iPhone11", + "iPadProFourthGen-iPadProFourthGen", + "iPadMiniRetina-iPadMiniRetina", + "iPadProCellular-iPadProCellular", + "iPodTouchSixthGen-iPodTouchSixthGen", + "MacDesktop-MacDesktop", + "iPadAir2Cellular-iPadAir2Cellular", + "iPadMini5-iPadMini5", + "iPhone11ProMax-iPhone11ProMax", + "iPhone5s-iPhone5s", + "iPhone6s-iPhone6s", + "iPad75-iPad75", + "iPhone7-iPhone7", + "iPhoneSE-iPhoneSE", + "iPhone8-iPhone8" + ], + "advisories": [], + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/9c/23/e0/9c23e042-a454-8b87-ee6c-a4b3b497bbc8/314905e5-2d99-4b3e-8428-0bd3c9b48bc5_iphone1.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/07/a5/21/07a521fe-59bb-47d8-57f8-0e9ee7c4f743/bdefceed-10fb-45cc-92f3-2438cc483f77_iphone2.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/0a/55/1c/0a551cf2-2905-ba9d-3749-606d880d9487/249dd591-d1af-4b16-b7fc-26f0a510bf7d_iphone3.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/dd/d0/f0/ddd0f0ef-c91c-530e-0a14-35ee9c90fd57/d2aa3806-83f7-4e6f-963e-7cfcd571f07f_iphone4.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/77/35/b2/7735b2f5-d8a4-7816-29d1-872f05061dce/bb0a1768-6a1b-482d-b0f7-805abc73ab3d_ipad1.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/b8/50/6d/b8506d82-e5df-7299-b043-25d2137119ef/64b5b730-76d9-4153-a91f-24dad103f621_ipad2.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/85/80/4a/85804a23-e0b8-00fc-cd66-88d7799f0dae/ac9174f6-e2b1-4fe1-a821-1f44d435000b_ipad3.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/bc/22/2e/bc222e57-77db-c984-2bb4-b62d5759132c/1ad8fe1d-03ba-4448-b1e7-e22b18b09684_ipad4.png/552x414bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/b4/46/59/b4465990-317e-b6bc-ec21-8580075ac0d7/source/60x60bb.jpg", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/b4/46/59/b4465990-317e-b6bc-ec21-8580075ac0d7/source/512x512bb.jpg", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/b4/46/59/b4465990-317e-b6bc-ec21-8580075ac0d7/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/ser-int/id525443615?uo=4", + "kind": "software", + "currency": "USD", + "minimumOsVersion": "13.0", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 1434184098, + "trackName": "Penman Speech to text note app", + "releaseDate": "2018-12-06T06:06:04Z", + "sellerName": "sobhan eskandari", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "## Our BIGGEST update to Penman is available now!\nWe have recreated Penman from ground up; bringing a new experience while maintaining Penman's core values.\nlet’s dive into the new features: \n\n# Continuity\nNow, you can have Penman on all of your devices: iPhone, iPad and Mac, taking you to a whole new level of efficiency. \n\n# Universe Purchase \nPurchase premium once and enjoy it on all your devices no matter iPhone iPad or even Mac\n\n# Fresh Design\nWith this version, we’ve modernized and revamped almost every part of Penman. Giving users a whole new experience while maintaining our commitment to a simplicity and efficiency.\n\n# New Sync system \nWe’ve developed a whole new save and sync system for premium users to make sure you never loose your notes. \n\n# Trash\nYour notes will now be added to the trash after you delete them. You can recover deleted notes from the trash. \n\n# New Editor\nWe have completely revamped our editor system.\n\n# New Notebooks\nMake sure to checkout our new Notebooks; more beautiful than ever and still the best place to save your notes.\n\nBe sure to download the update and enjoy Penman!", + "currentVersionReleaseDate": "2020-08-12T20:34:03Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "trackCensoredName": "Penman Speech to text note app", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "41207808", + "sellerUrl": "https://penman.app", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 3.5892900000000000915179043659009039402008056640625, + "userRatingCountForCurrentVersion": 56, + "averageUserRating": 3.5892900000000000915179043659009039402008056640625, + "trackViewUrl": "https://apps.apple.com/us/app/penman-speech-to-text-note-app/id1434184098?uo=4", + "trackContentRating": "4+", + "version": "3.0", + "wrapperType": "software", + "artistId": 525443615, + "artistName": "SER_INT", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "description": "-- Tell your story --\nWith the power of Googles speech to text software, you can seamlessly convert your words to notes and write in over 120 different languages!\nJust start it and tell your story.\n\n-- Write your story --\nWe have implemented a powerful text editor that pens your thoughts into text easily and in a way that is visually stunning. Additionally our software support bidirectional writing as well as a number of features that you can take advantage of during the process of turning your speech into convertible text.\n\n-- Stay Organized --\nYou can categorize, group and coordinate your notebooks, in order to distinguish between them and seamlessly move through your ideas, lists and stories in a way that fits your lifestyle.\n\n-- Stay Synced --\nWith the power of iCloud, all of your notes are saved and synced with your iCloud account where you can access them across all of your devices.\n\n-- Stay Secure --\nAs you write your story we use iCloud to save your notes so they are always safe and never lost.\n\n-- Stay Global --\nUsing penman you can convert your working file into the following formats:\n• PDF\n• TXT\n• Image\n• Html\n\n-- Penman Premium --\nUnlock your full potential by upgrading to premium :\n\n• Turn your speech to text quickly and easily\n• Export to various formats like pdf,html,jpg\n• Sync and backup all your notes in iCloud\n• Customize your notes with great fonts\n\n$2.99 monthly, $17.99 annually (an 20% savings!)\n\n---- ---\n\nSubscriptions will be charged to your credit card through your iTunes account. Your subscription will automatically renew unless canceled at least 24 hours before the end of the current period. You will not be able to cancel the subscription once activated. After purchase, manage your subscriptions in App Store Account Settings. Any unused portion of a free trial period, will be forfeited when the user purchases a subscription.\n\n$2.99 monthly, includes a 3 day free trial\n$17.99 annually, includes a 3 day free trial\n.\n- Terms of use: https://penman.app/terms-of-service.html\n- Privacy policy: https://penman.app/privacy.html", + "bundleId": "com.aurora.Penman", + "userRatingCount": 56 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/18/79/6b/18796b2b-a944-75ce-2aca-6b1bb4bff09a/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/3f/27/a0/3f27a05a-de6d-dfc5-0ce5-51adf4c18426/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/37/20/13/3720130e-855a-5c2e-d68e-b909f90e7f1c/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/3b/b1/ea/3bb1ea68-d5e3-ba86-370a-2e805241d801/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/e5/42/9c/e5429c15-08aa-5df1-9115-d10962d08e2c/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/c9/7a/9b/c97a9b68-3109-383a-3875-a51c2dd84fd6/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/56/08/2f/56082fcb-6037-e54c-6f0d-f04114a38e24/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/56/08/2f/56082fcb-6037-e54c-6f0d-f04114a38e24/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/56/08/2f/56082fcb-6037-e54c-6f0d-f04114a38e24/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/improvision/id1440448854?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.12", + "primaryGenreId": 6002, + "primaryGenreName": "Utilities", + "trackId": 1040463631, + "trackName": "Oh My Schedule! I'm a Student", + "releaseDate": "2015-10-03T13:36:35Z", + "sellerName": "IMPROVIZHN, OOO", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "We’ve updated the app! In the new version:\n- less bugs;\n- minor changes in the interface;\n- some general improvements.\nYour opinion is important to us! Please, leave your feedback - we will gladly consider all your wishes and suggestions.", + "currentVersionReleaseDate": "2020-07-23T20:25:02Z", + "genreIds": [ + "6002", + "6007" + ], + "formattedPrice": "Free", + "trackCensoredName": "Oh My Schedule! I'm a Student", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "47475008", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/oh-my-schedule-im-a-student/id1040463631?mt=12&uo=4", + "trackContentRating": "4+", + "version": "3.1.1", + "wrapperType": "software", + "artistId": 1440448854, + "artistName": "Improvision", + "genres": [ + "Utilities", + "Productivity" + ], + "price": 0.00, + "description": "Oh my Schedule! I'm a Student is a smart calendar planner. It's a perfect tool for those who want to become more productive and successful.\n\nPLAN A FEW STEPS AHEAD\n- Use calendar for quick navigation;\n- Create templates to organize courses faster;\n- Apply colors to every course;\n- Keep control over course duration.\n\nMAKE YOUR STUDY LIFE EASIER TO MANAGE\n- Keep track of your homework;\n- Leave comments if necessary;\n- Add single or regular lessons.\n\nKeep track of your schedule to get the most out of your education process!\n\nPrivacy Policy: http://improvisionapps.com/privacy\nTerms Of Use: https://improvisionapps.com/tos", + "bundleId": "mobi.ittop.OhMyScheduleImaStudentcln", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple71/v4/0e/74/bb/0e74bb9a-5ac2-5d5f-516a-5f1c12e95328/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple71/v4/36/54/f0/3654f064-4013-95e6-2683-c89ab8e51102/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple71/v4/1a/75/86/1a758637-9db5-007c-595b-b724e9083321/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b0/7b/ed/b07bed5e-d977-6655-7a6a-d35a90901fba/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b0/7b/ed/b07bed5e-d977-6655-7a6a-d35a90901fba/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b0/7b/ed/b07bed5e-d977-6655-7a6a-d35a90901fba/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/any-case-solutions/id1396419026?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.10", + "primaryGenreId": 6000, + "primaryGenreName": "Business", + "trackId": 1063681909, + "trackName": "Task Planner - To Do List", + "releaseDate": "2016-01-07T00:04:36Z", + "sellerName": "Any Case Solutions, OOO", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "We’ve updated the app! In the new version:\n- less bugs;\n- minor changes in the interface;\n- some general improvements.\nYour opinion is important to us! Please, leave your feedback - we will gladly consider all your wishes and suggestions.", + "currentVersionReleaseDate": "2020-07-17T23:48:12Z", + "genreIds": [ + "6000", + "6007" + ], + "formattedPrice": "Free", + "trackCensoredName": "Task Planner - To Do List", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "27930644", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/task-planner-to-do-list/id1063681909?mt=12&uo=4", + "trackContentRating": "4+", + "version": "2.1.2", + "wrapperType": "software", + "artistId": 1396419026, + "artistName": "Any Case Solutions", + "genres": [ + "Business", + "Productivity" + ], + "price": 0.00, + "description": "Plan Your Tasks is a productivity tool that allows you to capture your ideas and duties in one place. \nManage everything you have to do while working with many different tasks!\n\nEasy task management - create, organize, and prioritize tasks;\n- Set notifications;\n- Add comments;\n- Sort tasks by categories;\n- Track due dates.\n\nNew approach to agenda\n- Build-in calendar;\n- Coherent tutorial mode;\n- Magic Trackpad 2 support.\n\nCapture all your flash ideas and duties in the calendar and manage your to dos while working with many tasks more effectively.\n\n\nPrivacy Policy: https://anycasesolutions.com/privacy\nTerms Of Use: https://anycasesolutions.com/tos", + "bundleId": "com.newtechnologies.iPlanTasksinapp", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/2f/21/84/2f2184cb-628b-890f-39e3-9c4e84136e19/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/ed/cf/41/edcf41eb-6d7c-8d11-87be-fc02443c69c7/947d3c21-c192-4ede-bacd-752ce6466778_3.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/92/fa/db/92fadb36-8c71-3e8d-5f64-6c9ad5a4217f/0ffe74b5-9a2f-4ff8-84ab-f59c6f03bded_2.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/b4/b3/b2/b4b3b28f-e13e-f3c8-de6e-2162ade812d7/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/12/35/8e/12358e76-8f5e-3400-07fe-6e4b32b822d6/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/89/3d/f2/893df231-6612-7f8c-d671-0ec559373e58/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/d7/d6/83/d7d68357-509f-8861-f5c7-c095277f8d6b/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/d6/43/fe/d643fe2e-f8c3-3731-43a6-a998fac25e1a/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/a1/64/68/a1646823-eabb-dd96-bddb-500ca5eeb4c4/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/e8/ec/25/e8ec259a-6e26-94f4-e996-5ed4dbf58286/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/c4/6f/05/c46f055c-a1d9-8e7e-ed23-083f373d4de7/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/c4/6f/05/c46f055c-a1d9-8e7e-ed23-083f373d4de7/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/c4/6f/05/c46f055c-a1d9-8e7e-ed23-083f373d4de7/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/%E8%B1%AA-%E6%96%87/id1375960786?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.11", + "primaryGenreId": 6002, + "primaryGenreName": "Utilities", + "trackId": 1456235760, + "trackName": "HuaJian - Live Wallpaper", + "releaseDate": "2019-03-24T11:00:38Z", + "sellerName": "豪 文", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "1. Add \"Global Hotkeys(F8, F9)\" to control wallpaper.\n2. Supports \"keyword searching\", search the live wallpapers you like.\n3. Add more 4K Ultra HD Videos. \n4. Please update to the newest version to fix 'failed to download videos'.", + "currentVersionReleaseDate": "2020-08-22T19:03:38Z", + "genreIds": [ + "6002", + "6012" + ], + "formattedPrice": "Free", + "trackCensoredName": "HuaJian - Live Wallpaper", + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "189384225", + "contentAdvisoryRating": "17+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/huajian-live-wallpaper/id1456235760?mt=12&uo=4", + "trackContentRating": "17+", + "version": "4.8", + "wrapperType": "software", + "artistId": 1375960786, + "artistName": "豪 文", + "genres": [ + "Utilities", + "Lifestyle" + ], + "price": 0.00, + "description": "Live Wallpaper is designed to provide an interesting experience while taking as little system resources as possible. \n\nLive Wallpaper allows you to use live wallpapers on your desktop. You can select either existing video in App or import local video, and use the video as your ScreenSaver.\n\nFeature:\n● 900+ hand-picked videos which are updated every day.\n● Multiple types of 4K Ultra HD videos, anime, scenery, cute, game, creative, Beauty, Ancient, Movie, etc.\n● Supports \"keyword searching\" in videos.\n● Supports \"Dynamic-ScreenSaver\", personalize your lock screen.\n● Easy to import of local video.\n● Supports The playlist, list loop, shuffle loop.\n● Supports multiple screen aspect ratios and video native resolutions. \n● Set different wallpapers on different displays.\n● Manual control, video pause, resume and mute.\n● Supports global hotkeys(F8, F9) to control wallpaper.\n● Auto mode, pause video when other app active, not disturbed at work.\n● Auto mode, pause video when Power Disconnected.\n● Support for hiding desktop icons.\n● Live Wallpaper Engine is designed to provide an interesting experience while consuming as little system resources as possible.\n\n\n\"Works like a charm. Lets me play videos as my wallpaper and overall is easy to use. I would suggest to anyone looking for a wallpaper engine like software for mac.\" —— mono.mirrorz\n\n\"This is a great alternative for Wallpaper Engine and is also incredibly easy to use. The wallpapers are beautiful and clear. The app is updated with different backgrounds often as well. I highly recommend if you have been looking for an app that offers beautiful, dynamic wallpapers! :)\" —— HelloMyNameisNickel", + "bundleId": "whbalzac.Huajian", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple49/v4/3b/14/03/3b1403af-dc41-ce4c-c8ee-9e475179b282/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/f4/ed/92/f4ed92ff-94fd-ec3e-456d-ba10810d95bf/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple49/v4/27/94/ec/2794ecd0-8a9a-9f83-0e54-ba48b70d9caa/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple49/v4/4b/08/75/4b0875a9-33e5-be02-6a48-5aeeed46723c/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple49/v4/b5/f8/72/b5f87282-e38f-5622-e5e1-2a2ce1965140/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/ac/ac/b4/acacb463-c3d8-63f3-121a-c0cee711f67a/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/ac/ac/b4/acacb463-c3d8-63f3-121a-c0cee711f67a/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/ac/ac/b4/acacb463-c3d8-63f3-121a-c0cee711f67a/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/raj-kumar-shaw/id387611149?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.10", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 1098536561, + "trackName": "Notable", + "releaseDate": "2016-04-08T02:48:32Z", + "sellerName": "Raj Kumar Shaw", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "Improved Version.", + "currentVersionReleaseDate": "2020-08-14T14:53:57Z", + "genreIds": [ + "6007", + "6012" + ], + "formattedPrice": "$1.99", + "trackCensoredName": "Notable", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "5474149", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/notable/id1098536561?mt=12&uo=4", + "trackContentRating": "4+", + "version": "1.1", + "wrapperType": "software", + "artistId": 387611149, + "artistName": "Raj Kumar Shaw", + "genres": [ + "Productivity", + "Lifestyle" + ], + "price": 1.99, + "description": "Anything which is noteworthy, it is Notable!\n\nNotable is a simple tool that lets you take notes on a clean and clutter less interface. It will give you a pleasurable, light weight note-taking experience. Write down your thoughts and store your ideas inside Notable efficiently. Format your note with your favorite fonts and give them different colors. \n\nHighlight important text by changing its background color and make your note visibly more stunning. Drop images inside the note area and make your thoughts more vivid. The best part about Notable is that your won’t have to save your notes. It automatically saves all your notes if any changes are made. \n\nTop Features:\n-Easy to add notes with a single click\n-Automatically save your notes.\n-Hide list of notes for a distraction free writing.\n-Choose your favorite fonts and format your notes the way you want.\n-Change text and background color.\n-Turn on Night Mode for better visibility.\n-Share your notes via email.\n-Export notes and save them as pdf.\n-Use bullets to highlight important points.\n-Easily search for a particular note using the built-in search engine.\n\n\nThe best way to learn Notable is to try it. Download Notable today and organize your notes in an easy manner.", + "bundleId": "com.ilifetouch.notable", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/02/c4/b3/02c4b3c2-3897-7d58-42ca-8f759740b258/mzl.chnzmmnj.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/d5/40/37/d540377b-e6cf-f557-3f4f-48e72d973042/mzl.drorrcav.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/65/73/00/65730067-f90d-bccd-8b23-a36a2b933ab4/mzl.uahpaszs.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/38/6f/c4/386fc475-4d3c-82a2-13b1-5d56bf64e4c7/mzl.lewrlpfx.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/18/29/97/182997d5-3d66-e455-0bb5-7df38cf8bf03/mzl.gctclxtb.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/c5/a8/f1/c5a8f17e-b23a-2035-20a5-151870b247f3/mzl.pirpjpxb.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/9e/7a/4f/9e7a4f74-5c40-0237-520d-c5e932e15c37/mzl.abpamoym.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/0b/c6/ab/0bc6abe7-b7db-15ba-3ae0-ac5c225f1884/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/0b/c6/ab/0bc6abe7-b7db-15ba-3ae0-ac5c225f1884/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/0b/c6/ab/0bc6abe7-b7db-15ba-3ae0-ac5c225f1884/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/solaria-srl/id1383011819?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.13", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 1439733892, + "trackName": "Strike - Text Editor", + "releaseDate": "2018-12-03T13:55:14Z", + "sellerName": "Solaria SRL", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "- Bugfix", + "currentVersionReleaseDate": "2020-04-03T23:56:40Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "trackCensoredName": "Strike - Text Editor", + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "14391047", + "sellerUrl": "http://strike-app.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/strike-text-editor/id1439733892?mt=12&uo=4", + "trackContentRating": "4+", + "version": "1.4", + "wrapperType": "software", + "artistId": 1383011819, + "artistName": "Solaria SRL", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "description": "Strike is a modern writing app with powerful features like Smart Markdown, tables, attachments and photos, text sorting, tags, and more. Collaborate with others, password-protect documents, and sync it all with iCloud.\n\nStrike is the next generation of text editing for Mac and iOS\n\nCreate Faster\n\nWrite with Smart Markdown: use simple, plain text characters to add headers, formatting, links, and lists. Strike turns it all into beautiful, styled text.\n\n• Add professional tables and charts\n• Use MathJax to include mathematical equations\n• Attach files and images for easy organization\n• Automatically generate outlines \n• Apply themes and colors to individual files\n• Add inline notes and comments for review\n• Write anywhere with iCloud and Strike for iPad and iPhone (available separately)\n\nCollaborate On Documents\n\n• Edit with up to 10 others in real time\n• No service signups: share a simple iCloud link and start creating together\n• Password-protect sensitive documents\n• Lock files to prevent accidental edits\n• Keep track of versions and revert to previous edits\n\nEdit Faster\n\n• Fix errors quickly with spellcheck and autocorrect\n• Sort lines of text\n• Remove duplicates with one click\n• Convert outlines into paragraphs\n• Convert any text to upper, lower, title, or sentence case\n\nOrganize\n\n• Add tags for quick navigation\n• View document statistics with a click\n• Export attachments and PDFs with ease\n\n\n--------------------\n\nStrike is an auto renewable subscription:\n\n- Publish Online\n- Save\n- Export\n- Unlock the iOS version too\n\n$1.99 monthly, $9.99 annually\n\n————\nPrice may vary by location. Subscriptions will be charged to your credit card through your iTunes account. Your subscription will automatically renew unless canceled at least 24 hours before the end of the current period. Manage your subscriptions in Account Settings after purchase. Any unused portion of a free trial peri​od, will be forfeited when the user purchases a subscription.\n-------\n\nPrivacy Policy: https://www.iubenda.com/privacy-policy/99355866\nTerms of Service: http://strike-app.com/strike-terms.html", + "bundleId": "com.solaria.strikemac", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/2f/bd/48/2fbd48af-54ef-87d0-d8c8-29f324c773d7/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple1/v4/b6/fb/5c/b6fb5c10-2606-b6a5-11b7-07fbf519cd47/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple4/v4/45/9c/30/459c304d-86be-aa9f-5797-6ab3f12d6b02/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple1/v4/98/44/f4/9844f4ad-23a9-550c-248e-cf8c240d8f12/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple19/v4/b2/4a/84/b24a84ca-a5bd-a8d6-cddb-3050248b123c/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple19/v4/b2/4a/84/b24a84ca-a5bd-a8d6-cddb-3050248b123c/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple19/v4/b2/4a/84/b24a84ca-a5bd-a8d6-cddb-3050248b123c/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/shafer-systems-llc/id648469052?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.10", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 1104314294, + "trackName": "Notate - get organized & stay productive", + "releaseDate": "2016-04-26T23:04:29Z", + "sellerName": "Shafer Systems LLC", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "Bug fixes and performance improvements\nSupport for compressed handwriting from iOS Notate and Apple Pencil", + "currentVersionReleaseDate": "2016-11-06T21:44:55Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "Free", + "trackCensoredName": "Notate - get organized & stay productive", + "languageCodesISO2A": [ + "NL", + "EN", + "FR", + "DE", + "IT", + "RU", + "ES" + ], + "fileSizeBytes": "4893296", + "sellerUrl": "http://www.shafersystems.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/notate-get-organized-stay-productive/id1104314294?mt=12&uo=4", + "trackContentRating": "4+", + "version": "2.2.9", + "wrapperType": "software", + "artistId": 648469052, + "artistName": "Shafer Systems LLC", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.00, + "description": "STAY FOCUSED, GET WORK DONE. Notate helps you get organized and stay productive. Start by capturing all your important information. With Notate you can quickly create new notes and tasks, edit notes with a rich text editor, take pictures, easily insert images, and attach audio recordings to individual notes.\n\nSAVE EVERYTHING. Collect everything that matters knowing that you'll always be able to find it. Enhance your notes with text styling, bullets, alignment, font selection and text highlighting. You can also insert documents and images into your notes.\n\nGET MORE DONE with full task management. Organize tasks to help manage your week. Easily set task priority with drag-and-drop positioning. Set reminders notifications for important tasks.\n\nFIND YOUR INFORMATION QUICKLY by organizing your notebooks like folders. Easily search across all notebooks or search for text within notes. The Notate preview mode provides users a quick glance into the note subject matter. Notes are supported with “star” tagging as favorites and most recent edited notes are visible at all times.\n\nSHARE NOTES EASILY as email attachments. Sharing format option includes RTF or PDF and a Zip file for including audio recordings.\n\nNotate helps busy Professionals organize important notes and meetings, improve personal productivity and information sharing. \n\nHighlighted Features\n\n-Advanced rich text editor (styles, bullets, alignment, color palette)\n-Support for various font selections\n-Playback audio recordings\n-Automatic address insert based on location\n-Support for images within notes \n-Auto-Saving for notes in background \n-Individual Notebooks for note organization, with most recent and favorite note tagging options.\n-Text search across notebooks and within notes \n-Built-in note templates for quick note creation\n-Text autocorrect and spell checking (on/off controls)\n-Note text highlighting for identifying priorities\n-Editor redo and undo arrows\n\nSUBSCRIPTION PLANS ARE NOW AVAILABLE! \nNotate enables you to create and edit notes and tasks for free. No user sign-in or purchase is required. To sync your data between devices, and share folders with other users you need a qualifying Notate subscription* which gives you access to the full Notate experience. If you are already a Notate subscriber, you can access your Notate account on your Mac, iPad or iPhone FREE by pressing upgrade and signing in to your existing account.\n\nNotate subscriptions available:\n• 1-month subscription - $1.99 (automatically renewed until cancelled)\n• 6-month subscription - $4.99 (automatically renewed until cancelled)\n• 1-year subscription - $9.99 (automatically renewed until cancelled)\n\nSUBSCRIBERS’ AUTOMATIC-RENEWAL FEATURE: \nYour subscription will be charged to your iTunes account at confirmation of purchase and will automatically renew unless auto-renew is turned off at least 24-hours before the end of your current period. Your iTunes account will automatically be charged at the same price for renewal, as stated above, within 24-hours prior to the end of the current period.\n\nCurrent subscribers may not be canceled during the active subscription period, but you can manage your subscription and/or turn off auto-renewal by visiting your iTunes Account Settings after purchase.\n\nNOTE: WHEN PURCHASING A SUBSCRIPTION OR SINGLE-COPY OF THIS TITLE, YOU AGREE TO THE PRIVACY POLICY AND TERMS OF SERVICE WHICH CAN BE VIEWED BY GOING TO: http://www.shafersystems.com/privacy.html", + "bundleId": "com.shafersystems.notatemacos.Notate", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/16/19/93/161993cd-5f8e-52f5-509c-f0f90e4d8cf5/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/a1/0b/d8/a10bd8a4-434f-55e1-41a3-57012b5e2738/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/07/23/18/072318ab-3054-186e-3829-dadcab7cdbbe/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/70/aa/02/70aa02ed-098b-3f19-da43-ff4361423d46/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/70/aa/02/70aa02ed-098b-3f19-da43-ff4361423d46/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/70/aa/02/70aa02ed-098b-3f19-da43-ff4361423d46/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/%E5%8C%97%E4%BA%AC%E5%8D%B0%E8%B1%A1%E7%AC%94%E8%AE%B0%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8/id1353336040?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.12", + "primaryGenreId": 6002, + "primaryGenreName": "Utilities", + "trackId": 1486141229, + "trackName": "Clipper", + "releaseDate": "2019-12-13T08:00:00Z", + "sellerName": "Beijing Yinxiang Biji Technologies Co., Ltd.", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2019-12-13T14:18:42Z", + "genreIds": [ + "6002", + "6007" + ], + "formattedPrice": "Free", + "trackCensoredName": "Clipper", + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "17997559", + "sellerUrl": "https://www.yinxiang.com/webclipper/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/clipper/id1486141229?mt=12&uo=4", + "trackContentRating": "4+", + "version": "1.0.3", + "wrapperType": "software", + "artistId": 1353336040, + "artistName": "北京印象笔记科技有限公司", + "genres": [ + "Utilities", + "Productivity" + ], + "price": 0.00, + "description": "「印象笔记·剪藏」是保存网页信息的最佳方式。帮助你一站式收集网页图片、文字、链接等信息至印象笔记,永久保存。为你的 Safari 浏览器安装「印象笔记·剪藏」插件,从此摆脱繁复的复制粘贴,高效收集信息。\n\n【剪藏高价值内容】\n- 轻轻一点剪藏任意网页,收集网上信息的好帮手\n- 剪藏内容永久保存,无需担心原文消失\n- 保留网页中的文本超链接,信息收集更全面\n\n【高效整理剪藏】\n- 选择笔记本,剪藏内容分类保存\n- 支持添加标签,有效分类剪藏信息\n- 支持添加注释,当下想法即刻保存\n\n【免受广告干扰】\n- 选择“隐藏广告”格式,仅保存最干净的图文内容,让你免受广告干扰 \n- 多种剪藏格式,支持剪藏整个页面或仅剪藏正文、截图或隐藏广告\n\n【轻松圈出重点】\n- 多种标注工具,圈出网页中的重点信息\n- 支持“高亮、箭头、图章、文字、记号笔”等工具,在截图上添加你的想法\n\n【随时随地查看】\n- 剪藏内容永久保存至「印象笔记」\n- 使用「印象笔记」手机/电脑版随时随地查看和编辑\n\n「印象笔记·剪藏」系适应苹果新操作系统和 Safari 13 而新提交上架的浏览器", + "bundleId": "com.yinxiang.web.clipper", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple60/v4/a8/77/45/a8774519-f17b-1d0c-49fe-b03259a4c2d9/mzm.cwafugvo.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple5/v4/05/a8/33/05a833cb-89c0-8fb9-fe6d-8bac386a534a/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple60/v4/bb/44/45/bb44454b-426c-6395-373c-a20af8fd3fd1/mzm.ekuizfmr.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/ad/a1/ec/ada1ec68-a4c1-abee-1a0a-98c8d88f695f/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/5d/c5/f3/5dc5f37e-c9e9-2919-5af3-a1747e116dd8/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/5d/c5/f3/5dc5f37e-c9e9-2919-5af3-a1747e116dd8/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/5d/c5/f3/5dc5f37e-c9e9-2919-5af3-a1747e116dd8/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/deliverance-software-ltd/id374494333?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.10", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 986761220, + "trackName": "ZoomNotes Desktop", + "releaseDate": "2015-09-21T14:44:20Z", + "sellerName": "Deliverance Software Ltd", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "NEW: Custom digital planner now has layout options for week pages ( columns or rows ).\n\nIf you are enjoying using ZoomNotes Desktop please could you leave a review, thanks.", + "currentVersionReleaseDate": "2020-08-13T20:50:17Z", + "genreIds": [ + "6007", + "6017" + ], + "formattedPrice": "$6.99", + "trackCensoredName": "ZoomNotes Desktop", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "35898717", + "sellerUrl": "http://www.zoom-notes.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/zoomnotes-desktop/id986761220?mt=12&uo=4", + "trackContentRating": "4+", + "version": "8.3.4", + "wrapperType": "software", + "artistId": 374494333, + "artistName": "Deliverance Software Ltd", + "genres": [ + "Productivity", + "Education" + ], + "price": 6.99, + "description": "ZoomNotes Desktop is a note taking and sketching app for Mac OS. It is fully compatible with the iOS version\n(ZoomNotes, and ZoomNotes Lite) and shares a similar user interface for easy learning. It has many unique\nfeatures including\n\n- Write over PDF files or blank paper.\n- Infinite whiteboard mode (aka Infinite Canvas).\n- Handwriting recognition (14 different languages).\n- Sub-documents.\n- Typed Rich Text\n- Layers let you control what is visible on a page, also options for 'master layers' which show on all pages.\n- Near-Infinite zoom range.\n- Record and playback sound.\n- Bookmarks to record view points within documents.\n- Drawing guides for lines and arcs.\n- Symbol library.\n- Polygons, free-hand shapes, tables, arrowed lines, colour fill tool. \n- Documents Management - Documents, Folders and Sub-folders. Tags for documents and pages within\ndocuments.\n- Export as Images, PDF, Video or SVG.\n- Integration with Finder to allow 'Quick preview' and drag-drop of ZND, PDF, ZIP, JPEG, PNG and MOV files.\n- ICloud enabled for easy synchronization between iOS and Mac OS.", + "bundleId": "com.zoomnotes.ZoomNotesX", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/85/11/0b/85110ba0-a146-2163-92c9-88244c6a902d/cb513917-58e3-4359-8510-460e41cfe543_Screenshot_1.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/c5/07/22/c50722e2-e1fb-795c-fcbd-cda54cca2c38/54547d36-81de-4781-97e5-8799b9eaba16_Screenshot_2.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/66/16/4b/66164b75-ee96-c594-9295-efdea5654eca/bfd238ea-d658-4e26-97cc-0333006ca5c2_Screenshot_3.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/59/2a/93/592a934b-3ca1-7568-82dd-033853a9f5bb/a08607f6-6c81-4ce7-9c1e-99cbae0d62df_Screenshot_4.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/0a/80/29/0a8029a4-6961-ca87-2cec-d54065544cca/3d754429-88ea-48ce-b3b6-918e8d37ee61_Screenshot_5.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/ce/a1/ef/cea1ef03-dd1a-c82c-f753-f60393fc0f12/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/ce/a1/ef/cea1ef03-dd1a-c82c-f753-f60393fc0f12/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/ce/a1/ef/cea1ef03-dd1a-c82c-f753-f60393fc0f12/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/fart-inc/id1155342766?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.11", + "primaryGenreId": 6006, + "primaryGenreName": "Reference", + "trackId": 1155342767, + "trackName": "Button Shortcuts", + "releaseDate": "2016-09-21T12:49:12Z", + "sellerName": "Fart Inc.", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "Smart monitor switching in ghost mode.", + "currentVersionReleaseDate": "2020-09-02T22:11:18Z", + "genreIds": [ + "6006", + "6007" + ], + "formattedPrice": "$19.99", + "trackCensoredName": "Button Shortcuts", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "9438974", + "sellerUrl": "http://www.buttonshortcuts.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/button-shortcuts/id1155342767?mt=12&uo=4", + "trackContentRating": "4+", + "version": "2.3.6", + "wrapperType": "software", + "artistId": 1155342766, + "artistName": "Fart Inc.", + "genres": [ + "Reference", + "Productivity" + ], + "price": 19.99, + "description": "A powerful and delightfully simple keyboard shortcuts guide, tailor-made for Mac users.\n\n• Double-tap command anytime to search your app's shortcuts\n• Identify shortcuts you’re learning and already know\n• Perform shortcuts from Button by pressing Enter\n\n---\n\nAll Features:\n\n• Double-tap command to search shortcuts\n• Automatically identify your favorites and knowns\n• Perform shortcuts from Button\n• Beautiful dark mode and flavors for personalization\n• Decode symbols by hovering over them\n• Keep Button visible while working with ghost mode\n• Position and size Button anywhere (works great with multiple monitors!)\n\n---\n\nEmail:\nsupport@buttonshortcuts.com\n\nTwitter:\n@buttonshortcuts\n\n---\n\nTerms of Use & Privacy Policy:\nwww.buttonshortcuts.com/terms-and-privacy", + "bundleId": "com.AustinRyder.Button", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple127/v4/6e/86/57/6e865700-5455-62b5-e6c2-bdd3531f5c50/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple117/v4/9c/f8/70/9cf870f4-a030-840e-2a24-450e5452351c/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple117/v4/ee/17/fc/ee17fc02-a4a9-b21a-0b84-674bac8c3114/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple127/v4/6a/c6/4c/6ac64cb0-fa49-a3a7-e2b8-da52417aa7fe/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple117/v4/25/3b/3d/253b3d3d-524b-30ef-ef76-c6d3d5ab58c1/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/af/3e/d1/af3ed198-4fd5-03d1-54b8-453681157b48/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/af/3e/d1/af3ed198-4fd5-03d1-54b8-453681157b48/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/af/3e/d1/af3ed198-4fd5-03d1-54b8-453681157b48/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/inspiring-life-technologies-private-limited/id1091253731?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.11", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 1115079557, + "trackName": "Notea", + "releaseDate": "2016-05-27T18:42:16Z", + "sellerName": "INSPIRING-LIFE TECHNOLOGIES PRIVATE LIMITED", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "Improved Version.", + "currentVersionReleaseDate": "2020-07-09T23:37:24Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "$0.99", + "trackCensoredName": "Notea", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "8050375", + "sellerUrl": "http://inspiringlife.co", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/notea/id1115079557?mt=12&uo=4", + "trackContentRating": "4+", + "version": "2.1", + "wrapperType": "software", + "artistId": 1091253731, + "artistName": "INSPIRING-LIFE TECHNOLOGIES PRIVATE LIMITED", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.99, + "description": "*** 80% OFF ** SALE ***\n\nNotea is a simple note taking application for Mac. This is quite simply the best notes app you will ever use. Notea has been designed from the ground up to give users the fastest and the most satisfactory experience possible. This is the most efficient way one can take a note on their Mac. Just add a note and start writing. \n\n\nThings that make it stand out from other note apps:\n-The first line of your note will automatically be taken as the headline. \n-As you start typing, the left pane will automatically be hidden, giving you maximum interface for taking notes. \n-Dark mode makes it easy on your eyes.\n-Restore the last deleted note by clicking on Undo.\n-Export and save notes as PDF.\n-Choose from 4 different fonts for your notes.\n-Total word count at the bottom of the app interface.\n\n\nTop Features:\n-Easy to add note\n-Fullscreen mode for comfortable viewing\n-Increase or decrease font size as you preferred \n-Share notes via email from the app.\n-iCloud sync across all your devices. \n\nMake the most out of Notea using Magic Trackpad. \n-Swipe with two finger from right to left on note to hide the left pane.\n-Swipe with two finger from left to right on note to show the left pane.\n-Pinch out on note to increase font size.\n-Swipe right on a title of a note to delete or share.\n-Swipe all the way to right to delete note.\n\nThe moment you start using the app, you will realize the small yet creative details that we have successfully put into making this app. Please share your feedback or comments about Notea so that we can develop a better app for you.", + "bundleId": "co.inspiringlife.noteaOS", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/25/e5/23/25e523a1-3976-fd01-7570-c07529ed1266/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple49/v4/a4/4d/6a/a44d6add-e2ba-17db-c420-d593810fcfd4/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple69/v4/54/b6/0e/54b60ef9-aa82-859a-bcd9-84f920345f1e/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple49/v4/c5/9f/a7/c59fa779-9b76-9853-71c1-8698319ed1d3/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple60/v4/7c/9d/fb/7c9dfb21-0f87-86f1-edbc-7c326d5b2bf0/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple60/v4/7c/9d/fb/7c9dfb21-0f87-86f1-edbc-7c326d5b2bf0/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple60/v4/7c/9d/fb/7c9dfb21-0f87-86f1-edbc-7c326d5b2bf0/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/yi-fei/id1263715741?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.8", + "primaryGenreId": 6000, + "primaryGenreName": "Business", + "trackId": 1095287220, + "trackName": "Notepad Pro - for Highlight, Daily Notes, Markdown", + "releaseDate": "2016-03-24T16:33:23Z", + "sellerName": "YI FEI", + "isVppDeviceBasedLicensingEnabled": true, + "currentVersionReleaseDate": "2016-03-24T16:33:23Z", + "genreIds": [ + "6000", + "6012" + ], + "formattedPrice": "$7.99", + "trackCensoredName": "Notepad Pro - for Highlight, Daily Notes, Markdown", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "14240352", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/notepad-pro-for-highlight-daily-notes-markdown/id1095287220?mt=12&uo=4", + "trackContentRating": "4+", + "version": "1.0", + "wrapperType": "software", + "artistId": 1263715741, + "artistName": "YI FEI", + "genres": [ + "Business", + "Lifestyle" + ], + "price": 7.99, + "description": "++++++ 50% cut off for a limited time! +++++++\n\nNotepad Pro lets you take notes, draw shapes, sketch ideas, sign contracts, fill forms, print documents, and more right on your Mac. Syncs with Evernote and works with all popular cloud services such as Dropbox, Drive and Box.\n\nStudents, teachers, and business professionals use Notepad Pro daily to take notes,mark-up photos, record lectures, provide audio feedback and more. It is uniquely designed for each device to provide the best note taking experience at school, at home, and at work. \n\nNotepad Pro is designed for Mac \n- Quickly create notes by dragging documents, photos, or audio recordings from the desktop and dropping onto the library.\n- Enhance notes by dragging photos, audio recordings, and PDFs from the desktop and dropping onto a note.\n- Get more done with smart keyboard shortcuts.\n\nWrite and manage from one location hundreds or even thousands of texts. Notepad Pro is an app designed specifically to allow you to write and perfectly organize all your texts and notes. Try it now and it will soon become essential for all aspects related to writing texts with your Mac. Designed to support all the latest Apple text technology, Notepad Pro will increase your productivity. Write texts and format them as you like, enhance them with images and export them into various standard file formats. Double-click on one image to edit it on the spot. Double-click on the list to edit the various texts in separate windows while continuing to look up all the other ones in the main window. Quickly find all your texts and notes when you need them thanks to convenient search tools, tags and handy navigable Recents system.\n\nYOU HAVE EVERYTHING IN ONE PLACE\nAs opposed to what happens with other apps for writing. Every document in Notepad Pro may contain hundreds or thousands of texts. For example all the reviews that you wrote for your blog or all the research papers that you wrote for school in the last few years.\n\nIMAGES? EDIT THEM ON THE SPOT!\nHave you added an image to your text and realize that it needs to be cropped or rotated? You don’t need to use another program, just double-click it and you can edit the image right there and then! Would you like to add notes or lines to your image? It’s the easiest thing: open the context menu and do your edits.\n\nQUICKLY FIND THAT TEXT YOU WROTE LAST YEAR\nWhen you open a document in Notepad Pro, within you will find all the texts you wrote about that subject, and not only the last text you wrote as in other applications. But the best part is that Notepad Pro features intuitive tools which are easy to use to immediately find what you are looking for, as well as organizing options, tag view, the possibility to open every text in a separate window, basic or advanced search via Regular Expressions and the quickscrolling through recent texts.\n\nINOTEPAD IMPROVES YOUR EVERYDAY WORK.\nNotepad Pro was born to write and manage multiple texts efficiently and conveniently. Here are the highlights.\n\n-Notepad Pro supports the latest OS X technology to write any text with formatting and images.\n- Notepad Pro documents are designed to gather hundreds or thousands of texts belonging to a specific subject.\n- Optimize your work allowing you to extensively drag and drop from the Finder and from other applications.\n- Manages tags to easily classify, view and export the texts you need during your work.\n- It allows you to export an entire group of texts simply by dragging a tag to the desktop.\n- Easily arranges, manages and organizes tons on notes and texts and allows you to quickly find them when you need them.\n- Easily exports and shares any text or group of texts.", + "bundleId": "com.huayi.note", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple20/v4/9f/38/05/9f38057c-c6d2-dadf-124a-ccc7a26627d9/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple20/v4/d1/7e/58/d17e58da-d27a-3bae-1df3-f4d785bd2362/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple60/v4/7d/72/a3/7d72a3c4-a9af-63d5-b9bf-30a2fbfdb317/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple30/v4/62/a2/c0/62a2c09d-02fb-fca5-16b0-abcd2922c210/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple60/v4/ed/dd/a9/eddda9d9-9e87-921d-2ab5-3b281f29897b/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/ce/20/f8/ce20f888-740b-7682-9231-eb949c6a64af/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/ce/20/f8/ce20f888-740b-7682-9231-eb949c6a64af/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/ce/20/f8/ce20f888-740b-7682-9231-eb949c6a64af/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/raj-kumar-shaw/id387611149?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.11", + "primaryGenreId": 6000, + "primaryGenreName": "Business", + "trackId": 916778804, + "trackName": "TakeNote", + "releaseDate": "2016-05-06T00:49:22Z", + "sellerName": "Raj Kumar Shaw", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "Improved Version.", + "currentVersionReleaseDate": "2020-07-07T16:24:35Z", + "genreIds": [ + "6000", + "6017" + ], + "formattedPrice": "$1.99", + "trackCensoredName": "TakeNote", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "4245942", + "sellerUrl": "http://ilifetouch.com/916778804.html", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/takenote/id916778804?mt=12&uo=4", + "trackContentRating": "4+", + "version": "1.0.3", + "wrapperType": "software", + "artistId": 387611149, + "artistName": "Raj Kumar Shaw", + "genres": [ + "Business", + "Education" + ], + "price": 1.99, + "description": "We often find it very difficult to concentrate when we write something on Mac. Because most of the text editors that we use are full of buttons and tools that we don’t need, which results into distraction. TakeNote is an app which provides you with an easy layout wherein you can write down your thoughts and save them for ever. \n\nJust click on the add button and you are ready to go. It offers you a distraction free interface with features that are needed the most. The app is not cramped with too much information or tools which makes it suitable for story writing, essay writing and writing notes in general. \n\nApp Features:\n- Simple app UI with helpful tools.\n- Easy to create notes with single click.\n- See word count at the right bottom corner of the app.\n- Change font sizes of Title, Heading and Body of a note.\n- Share your saved notes via email or print them by exporting PDFs.\n- Easily access your notes using the built-in search engine.\n- iCloud Sync\n\nTakeNote is definitely going to be your favorite note taking app. This app is ideal for those people who are looking for an easy solution to distraction free writing. It is light weighted, responds quickly and works like a pro. So, download TakeNote now and jot down your thoughts right away.", + "bundleId": "com.ilifetouch.takenotemac", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple122/v4/66/00/7b/66007ba4-3e9f-47a9-2d7b-c809f19eca5a/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple122/v4/e2/dc/8b/e2dc8bf9-14e7-c108-7d97-a65d1fc00c06/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple122/v4/36/a9/ce/36a9ce56-fdf9-c714-a0ae-07a934098abc/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/d4/3c/96/d43c960d-17ea-2599-a482-f5ec7c96de2c/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/d4/3c/96/d43c960d-17ea-2599-a482-f5ec7c96de2c/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/d4/3c/96/d43c960d-17ea-2599-a482-f5ec7c96de2c/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/emanuele-floris/id597490842?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.10", + "primaryGenreId": 6015, + "primaryGenreName": "Finance", + "trackId": 1197361364, + "trackName": "Fast Notes Pro", + "releaseDate": "2017-02-02T00:19:33Z", + "sellerName": "Emanuele Floris", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "Bug fix", + "currentVersionReleaseDate": "2020-07-28T18:18:53Z", + "genreIds": [ + "6015", + "6016" + ], + "formattedPrice": "$1.99", + "trackCensoredName": "Fast Notes Pro", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "4432749", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/fast-notes-pro/id1197361364?mt=12&uo=4", + "trackContentRating": "4+", + "version": "1.5", + "wrapperType": "software", + "artistId": 597490842, + "artistName": "Emanuele Floris", + "genres": [ + "Finance", + "Entertainment" + ], + "price": 1.99, + "description": "Discover the new way to take notes and make lists of things to do!\n\nControls applications with simple gestures.\n\nYou’ll stop using a pen and paper with this innovative app!\n\nEasy, daily use because of its practical design.\n\nClear and comprehensible, whatever the situation.\n\nGuaranteed, because you can sync your notes on Cloud so that you will never lose them and you can sync them with your devices.", + "bundleId": "com.domainname.FastNotesOSX", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/e5/f7/7d/e5f77dad-57bd-9bf2-2a01-0bd7db092988/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/18/59/71/185971b8-a60b-e5d4-ef8d-9ac95a43b76e/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/96/28/72/96287278-57f9-5056-3c81-b51fa1a532ea/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/4a/33/90/4a339097-e456-45c4-2ca3-0f2289b25f25/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/4a/33/90/4a339097-e456-45c4-2ca3-0f2289b25f25/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/4a/33/90/4a339097-e456-45c4-2ca3-0f2289b25f25/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/manar-alhamdy/id886179203?mt=12&uo=4", + "kind": "mac-software", + "currency": "USD", + "minimumOsVersion": "10.15", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "trackId": 1516188598, + "trackName": "Found - Search & Work Tools", + "releaseDate": "2020-05-31T07:00:00Z", + "sellerName": "Manar Alhamdy", + "isVppDeviceBasedLicensingEnabled": true, + "releaseNotes": "Fixed UI glitches with the settings menu", + "currentVersionReleaseDate": "2020-06-01T23:25:06Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "$0.99", + "trackCensoredName": "Found - Search & Work Tools", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "26436507", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/found-search-work-tools/id1516188598?mt=12&uo=4", + "trackContentRating": "4+", + "version": "1.03", + "wrapperType": "software", + "artistId": 886179203, + "artistName": "Manar Alhamdy", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.99, + "description": "Found is a productivity tool aimed to help you perform common workflows like searching, joining meetings, and hiding your messy desktop.\n\n\n● Search\nThe app has as simple interface and a customizable global keyboard shortcut to show you the search window. You can add a shortcut prefix to any website that you like in order to search it. You can add any website with no limitations. You can also customize and change the shortcut prefix at any time.\n\n● Collections\nCollections are a group of websites that you use together a lot. For example, you can customize the app to launch your email and blog with a shortcut -- or if you are feeling social, you can also customize the app to launch your favorite social networking sites together.\n\n● Bookmarks\nThe app can show you a bookmark bar on the interface so you can easily access websites right from the interface. No more browser-specific bookmarks!\n\n● Meetings\nFound also works with your calendar to show you the next meeting on your schedule. The app will list the organizer and other members joining the meeting. If this is a virtual meeting, you can join the meeting right from Found with one click. You can also view the full meeting details without opening a mail or calendar client. \n\n● Desktop\nIf you need to share your desktop with your team but it is a mess, with one click or command shortcut, you can hide your desktop and display a simple color as a background or a beautiful animated live desktop wallpaper.\n\n● Theme\nCustomize the look of the search view with your own theme by choosing a background and foreground color, border options, and more.", + "bundleId": "com.volceontra.found", + "userRatingCount": 0 + } ] -} + } diff --git a/MasKitTests/JSON/search/slack.json b/MasKitTests/JSON/search/slack.json index 9b4e687b6..0f11ad187 100644 --- a/MasKitTests/JSON/search/slack.json +++ b/MasKitTests/JSON/search/slack.json @@ -1,300 +1,2604 @@ { - "resultCount": 6, + "resultCount": 39, "results": [ - { - "artistViewUrl": "https://itunes.apple.com/us/developer/slack-technologies-inc/id453420243?mt=12&uo=4", - "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/84/94/74/84947420-25dc-35e2-2761-9fa2b583c0a5/source/60x60bb.png", - "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/84/94/74/84947420-25dc-35e2-2761-9fa2b583c0a5/source/100x100bb.png", - "screenshotUrls": [ - "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/8d/07/74/8d0774c5-90aa-611c-3701-35f6158fb77e/source/800x500bb.jpg", - "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/6d/86/a7/6d86a74d-5c45-1a61-7828-ff3251360271/source/800x500bb.jpg", - "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/18/c1/38/18c138de-5bf2-586b-34de-c81e05568ea3/source/800x500bb.jpg", - "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/4a/92/50/4a925081-61d0-ff32-eb2a-4b57db03aaab/source/800x500bb.jpg" - ], - "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/84/94/74/84947420-25dc-35e2-2761-9fa2b583c0a5/source/512x512bb.png", - "kind": "mac-software", - "contentAdvisoryRating": "4+", - "trackCensoredName": "Slack", - "trackViewUrl": "https://itunes.apple.com/us/app/slack/id803453959?mt=12&uo=4", - "languageCodesISO2A": [ - "EN", - "FR", - "DE", - "JA", - "ES" - ], - "fileSizeBytes": "74398324", - "sellerUrl": "https://slack.com", - "averageUserRatingForCurrentVersion": 3.5, - "userRatingCountForCurrentVersion": 53, - "trackContentRating": "4+", - "releaseNotes": "All updates are important, of course. This one contains security updates, and as we know, they’re the most important kind of all.", - "sellerName": "Slack Technologies, Inc.", - "genreIds": [ - "12001", - "12014" - ], - "isVppDeviceBasedLicensingEnabled": true, - "currentVersionReleaseDate": "2018-10-02T23:28:05Z", - "formattedPrice": "Free", - "currency": "USD", - "wrapperType": "software", - "version": "3.3.3", - "description": "Slack brings team communication and collaboration into one place so you can get more work done, whether you belong to a large enterprise or a small business. Check off your to-do list and move your projects forward by bringing the right people, conversations, tools, and information you need together. Slack is available on any device, so you can find and access your team and your work, whether you’re at your desk or on the go.\n\nUse Slack to: \n• Communicate with your team and organize your conversations by topics, projects, or anything else that matters to your work\n• Message or call any person or group within your team\n• Share and edit documents and collaborate with the right people all in Slack \n• Integrate into your workflow, the tools and services you already use including Google Drive, Salesforce, Dropbox, Asana, Twitter, Zendesk, and more\n• Easily search a central knowledge base that automatically indexes and archives your team’s past conversations and files\n• Customize your notifications so you stay focused on what matters\n\nScientifically proven (or at least rumored) to make your working life simpler, more pleasant, and more productive. We hope you’ll give Slack a try.\n\nStop by and learn more at: https://slack.com/", - "artistId": 453420243, - "artistName": "Slack Technologies, Inc.", - "genres": [ - "Business", - "Productivity" - ], - "price": 0, - "bundleId": "com.tinyspeck.slackmacgap", - "minimumOsVersion": "10.9", - "primaryGenreId": 12001, - "releaseDate": "2014-01-23T02:46:20Z", - "trackId": 803453959, - "trackName": "Slack", - "primaryGenreName": "Business", - "averageUserRating": 4, - "userRatingCount": 1415 - }, - { - "artistViewUrl": "https://itunes.apple.com/us/developer/hao-li/id621375881?mt=12&uo=4", - "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple18/v4/27/0a/2e/270a2eb0-0c0b-fedf-5142-c6b96fbd3f64/source/60x60bb.png", - "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple18/v4/27/0a/2e/270a2eb0-0c0b-fedf-5142-c6b96fbd3f64/source/100x100bb.png", - "screenshotUrls": [ - "https://is3-ssl.mzstatic.com/image/thumb/Purple30/v4/20/5e/b8/205eb8d4-6c69-3c47-5820-044a093e5027/source/800x500bb.jpg", - "https://is1-ssl.mzstatic.com/image/thumb/Purple20/v4/b4/bf/18/b4bf1833-605e-0d3f-159b-411144836b86/source/800x500bb.jpg", - "https://is3-ssl.mzstatic.com/image/thumb/Purple30/v4/2d/c0/3c/2dc03ca8-6fde-cf1f-551b-fa381a296341/source/800x500bb.jpg" - ], - "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple18/v4/27/0a/2e/270a2eb0-0c0b-fedf-5142-c6b96fbd3f64/source/512x512bb.png", - "kind": "mac-software", - "contentAdvisoryRating": "4+", - "trackCensoredName": "QuickPlan Slack Bot - Project Management team Communication & Collaboration", - "trackViewUrl": "https://itunes.apple.com/us/app/quickplan-slack-bot-project-management-team-communication/id1128645172?mt=12&uo=4", - "languageCodesISO2A": [ - "EN" - ], - "fileSizeBytes": "10635879", - "sellerUrl": "http://www.quickplan.xyz/apps/quickplan-slack-bot/", - "averageUserRatingForCurrentVersion": 1, - "userRatingCountForCurrentVersion": 1, - "trackContentRating": "4+", - "sellerName": "Hao Li", - "genreIds": [ - "12001", - "12014" - ], - "isVppDeviceBasedLicensingEnabled": true, - "currentVersionReleaseDate": "2016-07-04T04:46:43Z", - "formattedPrice": "Free", - "currency": "USD", - "wrapperType": "software", - "version": "1.0", - "description": "QuickPlan Slack BOT, a BOT app connecting to Slack messaging service, which represents a QuickPlan project, to talk with with other Slack users like a human, for team project communication and collaboration. A new way to get simple project management admin work done, spend less time than communicating with team members in meetings, and reduce email to delivery project schedule and collect progress status. That's QuickPlan Slack BOT.\n\n* QuickPlan Slack BOT represents a project plan created by QuickPlan apps (http://quickplan.xyz) \n* QuickPlan Slack BOT is a app running on your Mac device, to communicate with other slack users via Slack BOT service (www.slack.com). \n\nThe simple and cheapest solution for team collaboration for project schedule. \n\nPROJECT MEMBERs via Slack (web, iOS, Mac, Android, Windows apps) to\n・Get help \n・Query in-processing tasks of the project member\n・Query in-processing tasks of the whole project\n・Query details of a specific task\n・Download project file\n・Ask the bot to create partial project to only include the tasks of the project member\n・Update task % complete\n・List task % complete updates \n・Cancel task update\n・Suggest a new task\n・Cancel task suggestions \n・List task suggestions\n\nPROJECT MANAGER via QuickPlan Slack BOT to\n・Import Project (this BOT represents the project) \n・Permission management - grant permission to slack users to access project information (by talking with this BOT) \n・Review (approve or reject) user updates includes % complete updates and task suggests \n・Version management - QuickPlan Slack BOT stores multiple versions of the project, for tracking the changes\n\nThe project file created by QuickPlan apps: \nQuickPlan for Mac - https://itunes.apple.com/app/id1071586133 \nQuickPlan for iPad - https://itunes.apple.com/app/id621375878\nQuickPlan for iPhone - https://itunes.apple.com/app/id699434089", - "artistId": 621375881, - "artistName": "Hao Li", - "genres": [ - "Business", - "Productivity" - ], - "price": 0, - "bundleId": "com.mobilinked.quickplanbot", - "minimumOsVersion": "10.11", - "primaryGenreId": 12001, - "releaseDate": "2016-07-04T04:46:43Z", - "trackId": 1128645172, - "trackName": "QuickPlan Slack Bot - Project Management team Communication & Collaboration", - "primaryGenreName": "Business" - }, - { - "artistViewUrl": "https://itunes.apple.com/us/developer/alberto-moral/id411725171?mt=12&uo=4", - "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/8a/9a/ab/8a9aab0c-b6c0-9844-8d4b-353edc2fc83e/source/60x60bb.png", - "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/8a/9a/ab/8a9aab0c-b6c0-9844-8d4b-353edc2fc83e/source/100x100bb.png", - "screenshotUrls": [ - "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/7e/30/1f/7e301f9e-f19d-7d17-c442-e48063718264/source/800x500bb.jpg", - "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/63/d5/58/63d5582b-ab63-2a00-c30a-aa9fdcce2972/source/800x500bb.jpg" - ], - "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/8a/9a/ab/8a9aab0c-b6c0-9844-8d4b-353edc2fc83e/source/512x512bb.png", - "kind": "mac-software", - "contentAdvisoryRating": "4+", - "trackCensoredName": "Send It - For Slack", - "trackViewUrl": "https://itunes.apple.com/us/app/send-it-for-slack/id1293799461?mt=12&uo=4", - "languageCodesISO2A": [ - "EN" - ], - "fileSizeBytes": "9480816", - "trackContentRating": "4+", - "sellerName": "Alberto Moral", - "genreIds": [ - "12014", - "12019" - ], - "isVppDeviceBasedLicensingEnabled": true, - "currentVersionReleaseDate": "2017-10-14T01:53:04Z", - "formattedPrice": "Free", - "currency": "USD", - "wrapperType": "software", - "version": "1.0", - "description": "Share awesome posts or send messages to your teams with this Safari Extension.", - "artistId": 411725171, - "artistName": "Alberto Moral", - "genres": [ - "Productivity", - "Utilities" - ], - "price": 0, - "bundleId": "com.albertomoral.Slackfari", - "minimumOsVersion": "10.12", - "primaryGenreId": 12014, - "releaseDate": "2017-10-14T01:53:04Z", - "trackId": 1293799461, - "trackName": "Send It - For Slack", - "primaryGenreName": "Productivity" - }, - { - "artistViewUrl": "https://itunes.apple.com/us/developer/islandbit-inc/id1073040697?mt=12&uo=4", - "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/4a/d6/08/4ad60824-ae70-8fcb-261b-be798534e8ab/source/60x60bb.png", - "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/4a/d6/08/4ad60824-ae70-8fcb-261b-be798534e8ab/source/100x100bb.png", - "screenshotUrls": [ - "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/8b/a4/2d/8ba42db5-5dcb-ed54-e41f-6f63e78f668f/source/800x500bb.jpg" - ], - "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/4a/d6/08/4ad60824-ae70-8fcb-261b-be798534e8ab/source/512x512bb.png", - "kind": "mac-software", - "contentAdvisoryRating": "4+", - "trackCensoredName": "Activebot for Slack", - "trackViewUrl": "https://itunes.apple.com/us/app/activebot-for-slack/id1271281910?mt=12&uo=4", - "languageCodesISO2A": [ - "EN" - ], - "fileSizeBytes": "4274788", - "sellerUrl": "https://www.islandbit.com/activebot-for-slack/", - "trackContentRating": "4+", - "sellerName": "Islandbit Inc.", - "genreIds": [ - "12001" - ], - "isVppDeviceBasedLicensingEnabled": true, - "currentVersionReleaseDate": "2017-09-30T10:35:35Z", - "formattedPrice": "Free", - "currency": "USD", - "wrapperType": "software", - "version": "1.0", - "description": "Activebot for Slack prevents Slack from going idle due to inactivity.\n\nNOTES:\nThis application requires Slack authentication using one of the following methods:\n1) \"Activebot for Slack\" app installed for your team\n2) Legacy token\n\nPlease verify you have access to adding apps to your Slack team or generating legacy tokens before purchasing this application at:\n\nhttps://api.slack.com/custom-integrations/legacy-tokens", - "artistId": 1073040697, - "artistName": "Islandbit Inc.", - "genres": [ - "Business" - ], - "price": 0, - "bundleId": "com.islandbit.Activebot", - "minimumOsVersion": "10.9", - "primaryGenreId": 12001, - "releaseDate": "2017-09-30T10:35:35Z", - "trackId": 1271281910, - "trackName": "Activebot for Slack", - "primaryGenreName": "Business" - }, - { - "artistViewUrl": "https://itunes.apple.com/us/developer/eric-delabar/id823959467?mt=12&uo=4", - "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple30/v4/95/83/04/9583045a-665d-a0be-dfc7-89487890d35d/source/60x60bb.png", - "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple30/v4/95/83/04/9583045a-665d-a0be-dfc7-89487890d35d/source/100x100bb.png", - "screenshotUrls": [ - "https://is1-ssl.mzstatic.com/image/thumb/Purple2/v4/a8/a0/45/a8a04557-cbf2-154f-096d-13f2a5cae43b/source/800x500bb.jpg", - "https://is4-ssl.mzstatic.com/image/thumb/Purple7/v4/7e/e4/ff/7ee4ff8f-46bc-6c4c-2b80-5b876485c7d6/source/800x500bb.jpg", - "https://is2-ssl.mzstatic.com/image/thumb/Purple5/v4/52/88/f2/5288f2a6-2f24-9370-5bd7-17b7b8c4c8bc/source/800x500bb.jpg", - "https://is1-ssl.mzstatic.com/image/thumb/Purple5/v4/61/23/e9/6123e974-f5ac-131d-9cb6-07b9b491b454/source/800x500bb.jpg", - "https://is5-ssl.mzstatic.com/image/thumb/Purple7/v4/c6/f7/e2/c6f7e277-9330-59b1-b33d-6883ec6acbc0/source/800x500bb.jpg" - ], - "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple30/v4/95/83/04/9583045a-665d-a0be-dfc7-89487890d35d/source/512x512bb.png", - "kind": "mac-software", - "contentAdvisoryRating": "4+", - "trackCensoredName": "ChannelScrobbler - Real-time scrobble bot for Last.fm/Slack", - "trackViewUrl": "https://itunes.apple.com/us/app/channelscrobbler-real-time-scrobble-bot-for-last-fm-slack/id994537604?mt=12&uo=4", - "languageCodesISO2A": [ - "EN" - ], - "fileSizeBytes": "1202787", - "sellerUrl": "http://ericdelabar.com/projects/channelscrobbler.html", - "trackContentRating": "4+", - "releaseNotes": "* Fixed bug where custom bot name was not saved between application launches.\n* Fixed artist info lookup/sterilization so that if Last.fm lookup fails original scrobble info is displayed instead.\n* Updated some metadata.", - "sellerName": "Eric DeLabar", - "genreIds": [ - "12016", - "12011" - ], - "isVppDeviceBasedLicensingEnabled": true, - "currentVersionReleaseDate": "2016-07-06T01:11:45Z", - "formattedPrice": "$2.99", - "currency": "USD", - "wrapperType": "software", - "version": "1.2", - "description": "ChannelScrobbler is a fun way to post your Last.fm scrobbles to a Slack channel in real-time. Create a music channel and show your friends and co-workers what you're listening to and see their favorites as well. \n\nOther solutions like IFTTT poll the Last.fm feed and only update every 15 minutes or so, ChannelScrobbler allows you to choose your update period and see updates as frequently as every 30 seconds. \n\nChannelScrobbler runs in your status bar and can launch on startup, so it's always there, listing every track you play. Because ChannelScrobbler reads your Last.fm feed scrobbles from your account it will catch new songs from any device that supports scrobbling, not just your computer!\n\n* Includes retina graphics and support for dark status bars!\n* Scrobbles are posted by a bot with customizable name, avatar, and colors.\n\nIf you're having problems using ChannelScrobbler, please email edelabar@gmail.com for support.", - "artistId": 823959467, - "artistName": "Eric DeLabar", - "genres": [ - "Social Networking", - "Music" - ], - "price": 2.99, - "bundleId": "com.ericdelabar.ChannelScrobbler", - "minimumOsVersion": "10.10", - "primaryGenreId": 12016, - "releaseDate": "2015-06-01T17:54:13Z", - "trackId": 994537604, - "trackName": "ChannelScrobbler - Real-time scrobble bot for Last.fm/Slack", - "primaryGenreName": "Social Networking" - }, - { - "artistViewUrl": "https://itunes.apple.com/us/developer/touch-software/id912092172?mt=12&uo=4", - "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/9d/b0/99/9db09926-1335-f117-c325-3809bb49b1a9/source/60x60bb.png", - "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/9d/b0/99/9db09926-1335-f117-c325-3809bb49b1a9/source/100x100bb.png", - "screenshotUrls": [ - "https://is4-ssl.mzstatic.com/image/thumb/Purple125/v4/ac/d4/ac/acd4ac7d-f52d-3adb-0243-f50e2ea84695/source/800x500bb.jpg", - "https://is1-ssl.mzstatic.com/image/thumb/Purple115/v4/f7/64/94/f76494ac-0654-41b3-ab45-fb9d024a7ab0/source/800x500bb.jpg", - "https://is5-ssl.mzstatic.com/image/thumb/Purple115/v4/d7/1b/0c/d71b0c81-6eb3-94ed-2e7c-56b7b2c156ac/source/800x500bb.jpg" - ], - "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/9d/b0/99/9db09926-1335-f117-c325-3809bb49b1a9/source/512x512bb.png", - "kind": "mac-software", - "contentAdvisoryRating": "4+", - "trackCensoredName": "Ratstash - For Slack", - "trackViewUrl": "https://itunes.apple.com/us/app/ratstash-for-slack/id1406123151?mt=12&uo=4", - "languageCodesISO2A": [ - "EN", - "FR", - "DE", - "JA" - ], - "fileSizeBytes": "1870443", - "sellerUrl": "http://ratstash.app", - "trackContentRating": "4+", - "releaseNotes": "Updated app description", - "sellerName": "Touch Software Pty Ltd", - "genreIds": [ - "12001", - "12002" - ], - "isVppDeviceBasedLicensingEnabled": true, - "currentVersionReleaseDate": "2018-10-27T13:58:48Z", - "formattedPrice": "$1.99", - "currency": "USD", - "wrapperType": "software", - "version": "1.3.6", - "description": "Note: Please see Frequently Asked Questions below before installing.\n\nUse Ratstash to:\n\n- Import channels, direct messages and group conversations.\n- Export your messages to CSV or text inside the App.\n- Leave the App running to download new conversations.\n- Find what you want instantly with the powerful grep-style search tool, no more scrolling through hundreds of pages of messages.\n\nSee more at https://ratstash.app.\n\nFrequently Asked Questions\n---------------------------\nQuestion: Do I have to be the workspace administrator to use this this App?\n\nAnswer: No, you don't, however you do need to either:\n- Be able to sign in to your Slack account and request/generate a token here (https://api.slack.com/custom-integrations/legacy-tokens). You will definitely be able to use Ratstash if you have a token (you paste this into the App). Or;\n- Install as an App to your team (https://slack.com/apps/AATHN8U86-ratstashapp). All members except guests are allowed to this. Please check your privileges in your team to confirm.\n\nQuestion: How far back in message history can I export?\nAnswer: It depends.\n- If you're on a free Slack team: Ratstash has the same history limits as what you'd experience using the Slack UI (10k limit). However, once Ratstash retrieves the history, it will be kept forever.\n- If you're on a paid Slack team, you can export all history with Ratstash.", - "artistId": 912092172, - "artistName": "Touch Software", - "genres": [ - "Business", - "Developer Tools" - ], - "price": 1.99, - "bundleId": "app.ratstash.macos.Ratstash", - "minimumOsVersion": "10.13", - "primaryGenreId": 12001, - "releaseDate": "2018-08-03T00:41:16Z", - "trackId": 1406123151, - "trackName": "Ratstash - For Slack", - "primaryGenreName": "Business" - } + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/b6/96/82/b6968256-1ba7-017a-0027-58b8ba76af25/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/48/be/b8/48beb83d-91db-e956-edcd-ba44e5639a40/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/f5/bd/86/f5bd862a-ff6b-b1f7-d7da-149d7de82614/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/7a/75/8b/7a758b1c-7359-26fb-e5d2-1b7971589321/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/1d/d5/9d/1dd59dc1-8537-9471-d617-f0c4d80be440/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/1d/d5/9d/1dd59dc1-8537-9471-d617-f0c4d80be440/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/1d/d5/9d/1dd59dc1-8537-9471-d617-f0c4d80be440/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/slack-technologies-inc/id453420243?mt=12&uo=4", + "kind": "mac-software", + "trackId": 803453959, + "trackName": "Slack", + "releaseDate": "2014-01-23T02:46:20Z", + "genreIds": [ + "6000", + "6007" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10", + "primaryGenreName": "Business", + "currentVersionReleaseDate": "2020-08-07T16:58:01Z", + "releaseNotes": "Bug Fixes\n• In rare cases, Slack would simply fail to start altogether. While we’re sure we could all use a coffee break, we know you could also use an application that runs. So we fixed that.\n• We made the screen you see when you have connection problems more useful. We also spruced it up a bit with a fresh coat of paint.\n• Our notifications system sprung a leak, so we brought it in for a tune-up. Everything should be running smoother now.", + "primaryGenreId": 6000, + "sellerName": "Slack Technologies, Inc.", + "currency": "USD", + "trackCensoredName": "Slack", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "JA", + "PT", + "ES" + ], + "fileSizeBytes": "80596748", + "sellerUrl": "https://slack.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/slack/id803453959?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Slack brings team communication and collaboration into one place so you can get more work done, whether you belong to a large enterprise or a small business. Check off your to-do list and move your projects forward by bringing the right people, conversations, tools, and information you need together. Slack is available on any device, so you can find and access your team and your work, whether you’re at your desk or on the go.\n\nUse Slack to: \n• Communicate with your team and organize your conversations by topics, projects, or anything else that matters to your work\n• Message or call any person or group within your team\n• Share and edit documents and collaborate with the right people all in Slack \n• Integrate into your workflow, the tools and services you already use including Google Drive, Salesforce, Dropbox, Asana, Twitter, Zendesk, and more\n• Easily search a central knowledge base that automatically indexes and archives your team’s past conversations and files\n• Customize your notifications so you stay focused on what matters\n\nScientifically proven (or at least rumored) to make your working life simpler, more pleasant, and more productive. We hope you’ll give Slack a try.\n\nStop by and learn more at: https://slack.com/", + "genres": [ + "Business", + "Productivity" + ], + "artistId": 453420243, + "artistName": "Slack Technologies, Inc.", + "price": 0.00, + "bundleId": "com.tinyspeck.slackmacgap", + "version": "4.8.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/59/9f/b0/599fb00a-794b-2e98-4f8a-8c97e338bed7/mzl.oyxmnyla.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/7f/19/48/7f194831-3555-3def-ae86-a2c77966a12f/mzl.zfzeegwv.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/df/3e/d6/df3ed640-c00f-9b7e-577e-4eea3a36fc94/mzl.ldwdcyjg.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/28/b0/89/28b089ac-da7b-3cd4-66ea-a15dad33a52a/mzl.kbgzprvj.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/fd/3e/8e/fd3e8e76-ec96-c24a-3617-c6e5dd58fe14/mzl.slrwmdjl.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/c8/8c/0e/c88c0e70-cd58-a5fb-a222-35964b660627/mzl.wtqirxur.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/14/a9/20/14a920a6-836e-8213-4557-ed45f2f44042/mzl.keqdwues.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/26/38/45/2638454f-1887-639c-750e-9c6d60d9b9c1/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/03/2b/f6/032bf675-9f4e-1c8f-422b-27a13f1905e4/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/81/86/1f/81861f8c-689a-fd6a-79c0-277817e0b7f2/mzl.zdmmurjb.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/99/82/0b/99820b2f-94cb-c950-ae6d-7f0c2398570c/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/99/82/0b/99820b2f-94cb-c950-ae6d-7f0c2398570c/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/99/82/0b/99820b2f-94cb-c950-ae6d-7f0c2398570c/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/readdle-inc/id285035419?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1176895641, + "trackName": "Spark – Email App by Readdle", + "releaseDate": "2016-11-30T18:24:05Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.13", + "primaryGenreName": "Productivity", + "currentVersionReleaseDate": "2020-09-02T11:52:29Z", + "releaseNotes": "Today's update improves Spark's experience with Microsoft 365 and contains a small fix for the issue with the cursor in the 'say something' field. \n\nIf you feel generous and have a couple of minutes, please leave your review. It makes a difference to us. Thank you in advance. :) \nAnd if you need us you can find us at support@sparkmailapp.com", + "primaryGenreId": 6007, + "sellerName": "Readdle Inc.", + "currency": "USD", + "trackCensoredName": "Spark – Email App by Readdle", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "PT", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "50692261", + "sellerUrl": "https://sparkmailapp.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/spark-email-app-by-readdle/id1176895641?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Spark is the best personal email client and a revolutionary email for teams. You will love your email again! \n\n\"Best of the App Store\" - Apple\n\"It's a combination of polish, simplicity, and depth\" - FastCompany\n\"You can create an email experience that works for you\" - TechCrunch\n\n**Beautiful and Intelligent Email App**\nWe are building the future of email. Modern design, fast, intuitive, collaborative, seeing what’s important, automation and truly personal experience that you love - this is what Spark stands for.\n\n**Farewell to Busy Inbox**\nSmart Inbox lets you quickly see what's important in your inbox and clean up the rest. All new emails are smartly categorized into Personal, Notifications and Newsletters.\n\n**Discuss email privately**\nInvite teammates to discuss specific emails and threads. Ask questions, get answers, and keep everyone in the loop.\n\n**Create email together**\nFor the first time ever, collaborate with your teammates using real-time editor to compose professional emails.\n\n**Schedule emails to be sent later**\nSchedule emails to be sent when your recipient is most likely to read them. It works even if your device is turned off.\n\n**Snooze That One For Later**\nSnooze an email and get back to it when the time is right. Snoozing works across all your Apple devices.\n\n**Find Any Email In An Instant**\nPowerful, natural language search makes it easy to find that email you're looking for. Just search the way you think and let Spark do the rest.\n\n**Get Notified About Important Emails Only**\nSmart Notifications filter out the noise, letting you know when an email is important, saving you from notification overload.\n\n**Powerful Integrations**\nIntegrate Spark into your workflow and take productivity to the next level. Supports Dropbox, Box, iCloud Drive, and more.\n\n**Built-in calendar**\nA full-featured calendar works right in your email to help you always be on top of your schedule. Create events easily using natural language.\n\n**Create links to email**\nCreate secure links to a specific email or conversation. Share the link on Slack, Skype, CRM, or any other medium so your team can see it and collaborate around it.\n\n**Sign Off With A Swipe**\nBefore you send an email, quickly swipe to choose the right signature for the occasion.\n\n**Email with Emotion**\nQuick Replies get the point across with just a tap. Love, like or acknowledge an email in an instant.\n\n**Email Never Looked This Good**\nThat terrible mess in your inbox is now replaced it with a beautiful, threaded message design.\n\n**A Truly Personal Experience**\nCustomize Spark to work as you do. You decide which swipes do what, what cards are shown, and how many emails you want to see.\nYou’ll love your email again!\n \nIf you need us, you can always find us at rdsupport@readdle.com", + "genres": [ + "Productivity", + "Utilities" + ], + "artistId": 285035419, + "artistName": "Readdle Inc.", + "price": 0.00, + "bundleId": "com.readdle.smartemail-Mac", + "version": "2.8.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple111/v4/8c/8b/f8/8c8bf8af-a7ef-eebf-3359-bfca1c8ab7d6/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple91/v4/e2/a4/23/e2a42353-e964-59dd-f578-6eaf7e6db808/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple62/v4/6b/cf/1e/6bcf1e4b-4c74-35d4-c626-9207dfe3ff7f/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple62/v4/6b/cf/1e/6bcf1e4b-4c74-35d4-c626-9207dfe3ff7f/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple62/v4/6b/cf/1e/6bcf1e4b-4c74-35d4-c626-9207dfe3ff7f/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/tenor/id917932199?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1043270657, + "trackName": "GIF Keyboard", + "releaseDate": "2015-10-29T04:29:03Z", + "genreIds": [ + "6002", + "6005" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.11", + "primaryGenreName": "Utilities", + "currentVersionReleaseDate": "2018-03-17T21:10:03Z", + "releaseNotes": "- We've updated our Terms of Service and Privacy Policy. If you have a Tenor account, please make sure to accept the new terms.\n- Tenor GIF Keyboard has been optimized -- the app should now run more smoothly than ever.", + "primaryGenreId": 6002, + "sellerName": "Tenor, Inc.", + "currency": "USD", + "trackCensoredName": "GIF Keyboard", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "4774516", + "sellerUrl": "http://www.tenor.co", + "contentAdvisoryRating": "17+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/gif-keyboard/id1043270657?mt=12&uo=4", + "trackContentRating": "17+", + "description": "Sometimes emojis just don’t cut it. Share your true feelings with GIFs.\n\nDrag and drop GIFs from your menubar directly into iMessage, and collect your favorite GIFs from anywhere by dropping GIFs into your menubar.\n\nIt’s perfect for all those times you wanted to...\n\n- Express just how much you love pizza.\n- Annoy your friends with that one lyric you just can’t stop singing.\n- Tell your crush that cuddling should be in your future. \n\n\nTenor GIF for Mac Features:\n\n* Always send the perfect GIF and video responses to your best friends straight from your menubar! \n\n* Browse through categories like reactions, music, trending and more. \n\n* Search millions of GIFs and videos on Tenor for the perfect moment. You can also tap the emoji icon in the menu to search by your favorite emoji!\n\n* See a GIF you like while browsing the web or receive a GIF from a friend? Drag/Drop the GIF to your Menubar to save for later. That means no saving to clunky desktop folders, and its instantly available from your toolbar\n\n* Works with your favorite messengers and social networks including iMessage, Slack, Email, Telegram, Facebook, and Reddit\n\n* Syncs with Tenor GIF Keyboard on your iPhone. Your GIF collections are instantly available on both your iPhone and Mac so your favorites GIFs are accessible everywhere", + "genres": [ + "Utilities", + "Social Networking" + ], + "artistId": 917932199, + "artistName": "Tenor", + "price": 0.00, + "bundleId": "com.riffsy.GIF-for-Mac", + "version": "2.0.5", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple115/v4/dd/20/f0/dd20f0d6-79d5-3fcc-5a09-fe8a110cdc16/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple115/v4/58/1d/cb/581dcbf0-9709-1efd-cdd2-b7bb065680ae/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple125/v4/b4/36/3c/b4363cd8-2a99-4d0c-6c50-e54fae209938/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple125/v4/ef/63/79/ef63795c-1dea-c772-b5e3-3a2d4dfadfc9/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple115/v4/fc/0c/66/fc0c66b9-4c1c-d08b-dfdb-62f3e10710a5/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/4e/a2/52/4ea25263-c63c-5073-8f3c-c907bbe7b332/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/4e/a2/52/4ea25263-c63c-5073-8f3c-c907bbe7b332/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/4e/a2/52/4ea25263-c63c-5073-8f3c-c907bbe7b332/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/moxtra-inc/id551221476?mt=12&uo=4", + "kind": "mac-software", + "trackId": 991215717, + "trackName": "Moxtra: Business Collaboration", + "releaseDate": "2015-05-13T01:51:40Z", + "genreIds": [ + "6000", + "6007" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.8", + "primaryGenreName": "Business", + "currentVersionReleaseDate": "2019-03-20T23:26:06Z", + "releaseNotes": "- Fixed bugs", + "primaryGenreId": 6000, + "sellerName": "Moxtra, Inc.", + "currency": "USD", + "trackCensoredName": "Moxtra: Business Collaboration", + "languageCodesISO2A": [ + "DA", + "NL", + "EN", + "FI", + "FR", + "DE", + "ID", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES", + "SV", + "TH", + "ZH", + "TR", + "VI" + ], + "fileSizeBytes": "13535823", + "sellerUrl": "http://www.moxtra.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/moxtra-business-collaboration/id991215717?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Moxtra: Accelerating business in the mobile world.\n\nMoxtra is a collaboration solution built to accelerate business. Present, secure feedback, get approvals on content to close business while on the go. Collaborate on documents and content across teams, with customers, partners, and colleagues. Recreate the power of face-to-face meetings with secure messaging, robust document collaboration, video conferencing, electronic signature, and more – in context. Moxtra is an secure, enterprise class service available as a white-label, private cloud, or on-premise solution.", + "genres": [ + "Business", + "Productivity" + ], + "artistId": 551221476, + "artistName": "Moxtra, Inc.", + "price": 0.00, + "bundleId": "com.moxtra.desktop", + "version": "6.0.7", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/9e/fd/73/9efd7364-ffaf-5e20-e1b4-59b036f97cd9/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/a9/8c/4b/a98c4be2-9027-1006-6528-c5dfe1ed885d/mzl.ltakrafq.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/80/e9/f2/80e9f22e-d740-363f-1830-d318f2200984/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/80/e9/f2/80e9f22e-d740-363f-1830-d318f2200984/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/80/e9/f2/80e9f22e-d740-363f-1830-d318f2200984/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/henrik-wenz/id1456462086?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1456462087, + "trackName": "All-in-One Messenger", + "releaseDate": "2019-03-28T00:50:45Z", + "genreIds": [ + "6007", + "6005" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10.0", + "primaryGenreName": "Productivity", + "currentVersionReleaseDate": "2019-04-09T02:15:29Z", + "releaseNotes": "- Frameless window \n- Better design\n- Fixed messenger load bug\n- Use custom protocol (improve security)", + "primaryGenreId": 6007, + "sellerName": "Henrik Wenz", + "currency": "USD", + "trackCensoredName": "All-in-One Messenger", + "languageCodesISO2A": [ + "AM", + "AR", + "BN", + "BG", + "CA", + "HR", + "CS", + "DA", + "NL", + "EN", + "ET", + "FI", + "FR", + "DE", + "EL", + "GU", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KN", + "KO", + "LV", + "LT", + "MS", + "ML", + "MR", + "NB", + "FA", + "PL", + "PT", + "RO", + "RU", + "SR", + "ZH", + "SK", + "SL", + "ES", + "SW", + "SV", + "TA", + "TE", + "TH", + "ZH", + "TR", + "UK", + "VI" + ], + "fileSizeBytes": "59177570", + "sellerUrl": "https://allinone.im/", + "contentAdvisoryRating": "17+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/all-in-one-messenger/id1456462087?mt=12&uo=4", + "trackContentRating": "17+", + "description": "Use messengers like WhatsApp, Telegram, Messenger, Skype and many more in one app.", + "genres": [ + "Productivity", + "Social Networking" + ], + "artistId": 1456462086, + "artistName": "Henrik Wenz", + "price": 0.00, + "bundleId": "im.allinone.messenger", + "version": "0.3.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/7d/31/f4/7d31f44c-5094-b4c8-d630-f218f493058c/mzl.jkthnpaz.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/b3/61/d9/b361d9f7-881e-3692-aac2-b28be0a30ae1/mzl.eznpdmta.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/d7/3b/96/d73b96f0-2c4e-0802-d46a-f30b73db8f2e/mzl.xafzbvqs.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/41/ee/eb/41eeebe8-f759-d786-a952-098d251a3274/mzl.pzxvxjgw.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/a3/9a/fe/a39afe75-0d3f-6445-3c5e-373653a174c8/mzl.lcubnpym.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/f1/f4/2d/f1f42ded-7f57-dffc-961d-5cdde8ea3f7f/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/6e/20/de/6e20de36-06ea-8f38-777d-9b37e6877859/mzl.ydczebqy.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/84/a2/81/84a28150-6acf-171d-fd2d-a4581e94ba2c/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/84/a2/81/84a28150-6acf-171d-fd2d-a4581e94ba2c/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/84/a2/81/84a28150-6acf-171d-fd2d-a4581e94ba2c/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/riva-fzc/id503815096?mt=12&uo=4", + "kind": "mac-software", + "trackId": 883594849, + "trackName": "Flock: Team Communication App", + "releaseDate": "2014-06-05T23:27:57Z", + "genreIds": [ + "6000", + "6007" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10.0", + "primaryGenreName": "Business", + "currentVersionReleaseDate": "2020-05-18T12:00:43Z", + "releaseNotes": "We've added animated stickers! \nWe also squashed some bugs and improved overall performance of the app!\n\nFlock as you were!", + "primaryGenreId": 6000, + "sellerName": "RIVA FZC", + "currency": "USD", + "trackCensoredName": "Flock: Team Communication App", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "84779228", + "sellerUrl": "https://flock.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/flock-team-communication-app/id883594849?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Flock is a powerful business messaging and team collaboration app that brings all your work in one place. \n\nToday, your team’s communication is scattered across emails, meetings, and multiple tools. With Flock you can quickly bring people together, discuss ideas, share information, assign tasks and track team progress, so your team can focus on what they do best. Whether you are a large enterprise, a small business or a high-growth startup, Flock effortlessly adapts to your unique needs. \n\nOver 32,000 organizations love Flock and here’s why you might find it useful too:\n• Team communication made easy through 1-1 chats and group messaging\n• Organize conversations into different channels for projects, departments or topics\n• Find information and share files on-the-go\n• Enjoy video & audio calling along with free screen sharing capabilities\n• Do more with free built-in productivity tools such as to-do’s, reminders and polls\n• Integrates with all your favourite tools and services that you already use including Google \n Drive, Trello, Jira, GitHub, Hubspot, etc.\n• Effortlessly find information that was discussed in a 1-1/team chat using Search \n• Flock is private, safe and secure (We are SOC2 and GDPR compliant)\n\nFlock is free to use for as many users and for as long as you want. You can upgrade to our paid plans for enhanced features and increased user control.\n\nRecommended by experts:\n• Gartner Cool Vendor 2018\n• G2 Crowd Leader Spring 2018 \n• #1 Slack Alternative by PCMag \n• Top rated alternative for Slack by ProductHunt\n\nYou’re in good company.\n- Tim Hortons\n- Avendus\n- Gini and Jony\n- Ricoh\n- Victorinox\n\nAnd here’s what our happy users have to say about Flock:\n\n“I can’t say enough kind things about Flock. Moved the team to it from Slack and couldn’t be happier.”\n- Luke Rodriguez, Modern Horrors\n\n“Flock is convenient and real time and is making communication seamless and easy. My entire team today is on Flock.”\n- Prashant Tandon, CEO and Co-Founder, 1MG\n\n“Flock has become the way our Sales Team communicates. It's fast, reliable, fun and easy to use.”\n- Bryan Morales, CIB Corporation\n\nFollow us on Facebook and Twitter @flock", + "genres": [ + "Business", + "Productivity" + ], + "artistId": 503815096, + "artistName": "RIVA FZC", + "price": 0.00, + "bundleId": "to.go.osx", + "version": "2.2.388", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/40/d6/69/40d6695a-6d55-a6af-2c5a-918baf218ec9/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/cd/1f/5e/cd1f5ef8-b7d9-c5da-3280-45c703d89ec8/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/17/44/1c/17441c02-37d6-d3f6-420b-da5114df9c45/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/6e/05/37/6e0537aa-3438-6bfe-d7d2-e02d30ee8d34/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/b6/24/cd/b624cd52-2079-5118-bea8-94f7fa31a467/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/e1/0b/8d/e10b8d63-660a-2828-3ecb-eb7a197b62fb/mzl.umozqbal.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/96/76/38/96763896-f145-a59b-8bd0-934a7dbce2a3/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/96/76/38/96763896-f145-a59b-8bd0-934a7dbce2a3/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/96/76/38/96763896-f145-a59b-8bd0-934a7dbce2a3/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/bloop-s-r-l/id389546852?mt=12&uo=4", + "kind": "mac-software", + "trackId": 918858936, + "trackName": "Airmail 4", + "releaseDate": "2014-10-16T20:48:01Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.12", + "primaryGenreName": "Productivity", + "currentVersionReleaseDate": "2020-08-04T22:49:54Z", + "releaseNotes": "- Bugfix", + "primaryGenreId": 6007, + "sellerName": "Bloop S.R.L", + "currency": "USD", + "trackCensoredName": "Airmail 4", + "languageCodesISO2A": [ + "AR", + "MY", + "CA", + "CS", + "DA", + "NL", + "EN", + "FI", + "FR", + "GL", + "DE", + "EL", + "HE", + "HU", + "IT", + "JA", + "KO", + "NB", + "NN", + "PL", + "PT", + "RO", + "RU", + "SR", + "ZH", + "SK", + "ES", + "SV", + "ZH", + "TR", + "UK" + ], + "fileSizeBytes": "62121809", + "sellerUrl": "http://airmailapp.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/airmail-4/id918858936?mt=12&uo=4", + "trackContentRating": "4+", + "description": "*** Apple Design Award 2017 Winner ***\n\nAirmail is a mail client designed with performance and intuitive interaction in mind optimized for macOS and iOS!\n\nSupport for iCloud™, MS Exchange, Gmail™, Google™ Apps, IMAP, POP3, Yahoo!™, AOL™, Outlook.com™, Live.com™\n\nAirmail was designed from the ground UP to retain the same experience with a single or multiple accounts and provide a quick, modern user experience. Airmail is clean and allows you to get to your emails without interruption - it's the mail client for the 21st century. \n\nWe have taken usability and function to the next level with Airmail and bring a striking-design with support for all major email services. Switch between accounts like a breeze and quick reply to incoming messages within seconds - email has never been so easy and productive. \n\n- iCloud Account sync\n- Handoff support \n- Today Extension, quick access to your inbox.\n- Action Extension, Airmail Compose, Airmail Share.\n\nAccounting:\n- Unified Inbox\n- Alias with custom SMTP\n- Exchange, iCloud™, Gmail™, IMAP, POP3, Google™ Apps, Yahoo!™, AOL™, Outlook.com™, Live.com™\n- Local Accounts\n- Import from Apple Mail, MBOX archive, EML, EMLX\n\nInteractions:\n- Quick Reply\n- Offline operations\n- Move messages on Different mailboxes\n- Multi Touch gestures\n\nShortcuts:\n- Gmail Shortcuts\n- Custom global shortcuts\n- Quick Label, Move, Label and Archive\n- Quick folder selection\n\nConversations:\n- Group by id\n- Group by subject\n- Chronological Reverse \n- Muted CC’d conversation\n\nVisual:\n- Multiple visual themes\n- Minimal and extended Mode\n- Plain Text Rendering\n\nNotifications:\n- Per account notifications\n- Notification center support\n- Notification alerts with custom actions\n\nAddress:\n- Gmail, Exchange and OS X contacts\n- Contacts Group\n- Filter by address\n- Open Directory search\n\nComposer:\n- Exchange Global Address List\n- Markdown, Html(Html Source for templates), and text only.\n- Bullet and numbered list.\n\nSending:\n- Auto CC, BCC.\n- Send Delay\n- Redirect\n- Send again \n- Bounce\n\nAdvanced:\n- EML Import/Export\n- Applescript\n\nSignatures:\n- Multiple Account Signatures\n- Markdown, Rich text, Html Source, and text only.\n- Signature above or below the quote\n\nSearch & Filtering:\n- Global search for multiple accounts\n- Realtime powerful filters\n- Sort messages, Date, Attachments, Conversations ....\n- Show messages of the same user\n- Flags and filters\n\nFolders, Labels:\n- Nested folders\n- Create, Delete and edit folders\n- Custom colors synced by iCloud\n- Custom folder mappings\n- ToDo, Done, Memo\n\nSend to:\n- Omnifocus\n- Fantastical\n- Evernote\n- Apple Reminder\n- Calendar\n- BusyCal\n- Things\n- 2To\n- Wunderlist \n- Todoist\n\nAirmail 4 include Airmail Pro Subscription.\n\nAirmail Pro Features:\n- Access to iPhone and iPad\n- New Design\n- Smart box\n- New Rendering\n- New Search\n- New Themes\n- Custom Actions\n- Customizable Layout\n- Live Support\n\nNotes:\n• Airmail Pro is free for all users that are subscribed to Airmail Pro for iOS or have purchased Airmail 3 since 1st January 2019.\n• Previous users can still use Airmail with all the features tehy have purchased for under Preferences>General> Airmail Legacy.\n• New Users can try Airmail without Multi Account, and limited capabilities.\n\n$2.99 Monthly, $9.99 Yearly\n\n---\n\n• Price may vary by location and promotion.\n• Subscriptions will be charged to your credit card through your iTunes account. \n• Your subscription will automatically renew unless canceled at least 24 hours before the end of the current period.\n• Manage your subscriptions in Account Settings after purchase. \n• Any unused portion of a free trial peri​od, will be forfeited when the user purchases a subscription.\n• Account will be charged for renewal within 24-hours prior to the end of the current period, and identify the cost of the renewal\n\n\nPrivacy Policy: https://airmailapp.com/privacymac.html\nTerms of Service: https://airmailapp.com/eulamac.html", + "genres": [ + "Productivity", + "Utilities" + ], + "artistId": 389546852, + "artistName": "Bloop S.R.L.", + "price": 0.00, + "bundleId": "it.bloop.airmail2", + "version": "4.1.6", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/4f/fe/c7/4ffec732-9c5c-e861-4ebe-284d67391792/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/3e/aa/5f/3eaa5f22-7306-9848-0aef-9c53013f9bd7/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/f6/af/28/f6af2812-b83e-6c0e-c89c-197381ee1c3b/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/59/e4/dc/59e4dc92-bede-17f4-2933-365f3d60244e/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/de/ad/28/dead28bc-2e1f-b3f3-73a8-e970c1bfce6b/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/a0/68/f8/a068f85a-f72a-1efb-d0ee-0543fb97d48b/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/a0/68/f8/a068f85a-f72a-1efb-d0ee-0543fb97d48b/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/a0/68/f8/a068f85a-f72a-1efb-d0ee-0543fb97d48b/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/rocket-chat-technologies-corp/id1148477217?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1086818840, + "trackName": "Rocket.Chat", + "releaseDate": "2016-03-09T18:02:58Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10.0", + "primaryGenreName": "Productivity", + "currentVersionReleaseDate": "2020-03-13T00:15:30Z", + "releaseNotes": "Improvements:\n- Update to Electron 7\n- Performance tweaks\n- Better handling of power events\n\nBug fixes:\n- Custom spell checking dictionaries\n- Screen sharing in Jitsi\n- TouchBar buttons\n- Embed dialogs\n- Notification avatars", + "primaryGenreId": 6007, + "sellerName": "Rocket.Chat Technologies Corp.", + "currency": "USD", + "trackCensoredName": "Rocket.Chat", + "languageCodesISO2A": [ + "AM", + "AR", + "BN", + "BG", + "CA", + "HR", + "CS", + "DA", + "NL", + "EN", + "ET", + "FI", + "FR", + "DE", + "EL", + "GU", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KN", + "KO", + "LV", + "LT", + "MS", + "ML", + "MR", + "NB", + "FA", + "PL", + "PT", + "RO", + "RU", + "SR", + "ZH", + "SK", + "SL", + "ES", + "SW", + "SV", + "TA", + "TE", + "TH", + "ZH", + "TR", + "UK", + "VI" + ], + "fileSizeBytes": "69450749", + "sellerUrl": "https://rocket.chat/", + "contentAdvisoryRating": "17+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/rocket-chat/id1086818840?mt=12&uo=4", + "trackContentRating": "17+", + "description": "Rocket.Chat is a Web Chat Server, developed in JavaScript, using the Meteor full-stack framework. It is a great solution for communities and companies wanting to privately host their own chat service or for developers looking forward to building and evolve their own chat platforms. With Rocket.Chat, you can send a group message, send 1:1 message, share files, integrate with your favorite products, and more!\n\nKEY FEATURES:\n\n* Free Open Source Software\n* Hassle free MIT license\n* BYOS (bring your own server)\n* Multiple Rooms\n* Direct Messages\n* Private Groups\n* Public Channels\n* Desktop and Mobile Notifications\n* Edit and Delete Sent Messages\n* Mentions\n* Avatars\n* Markdown\n* Emojis\n* Transcripts / History\n* File Upload / Sharing\n* I18n - [Internationalization with Lingohub]\n* Hubot Friendly - [Hubot Integration Project]\n* Media Embeds\n* Link Previews\n* LDAP Authentication\n* REST-full APIs\n* Remote Locations Video Monitoring\n* Native Cross-Platform Desktop Application\n\nNEWS:\n\nFeatured on: Hacker News, Product Hunt, JavaScript Weekly, WWWhatsNew, ClasesDePeriodismo\n\nGET IT NOW:\n\n* Check out at https://rocket.chat\n* ONE-CLICK-DEPLOYMENT – See instruction on our GitHub repository", + "genres": [ + "Productivity", + "Utilities" + ], + "artistId": 1148477217, + "artistName": "Rocket.Chat Technologies Corp.", + "price": 0.00, + "bundleId": "chat.rocket", + "version": "2.17.9", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/8b/59/37/8b593789-a69e-9a22-9477-049f7466917e/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/4b/3a/f6/4b3af6d0-3448-2ee6-f649-fe6221e708bf/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/91/27/54/91275485-91b8-292e-f82b-829b14e9226d/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/e6/de/3f/e6de3ffa-624e-588f-1e1c-623df367f53b/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/2a/93/0b/2a930bef-cbd3-1f03-35e4-6389d5f9d7c5/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/26/78/d9/2678d9e3-4b91-8d9c-7b59-5ebd51847d3d/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/ea/82/b9/ea82b92a-9e6e-6e59-b27b-e204d956fef3/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/ea/82/b9/ea82b92a-9e6e-6e59-b27b-e204d956fef3/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/ea/82/b9/ea82b92a-9e6e-6e59-b27b-e204d956fef3/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/tencent-technology-shenzhen-company-limited/id292374531?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1189898970, + "trackName": "WeCom-Business IM & Work Tools", + "releaseDate": "2018-02-27T07:21:11Z", + "genreIds": [ + "6000", + "6002" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.11", + "primaryGenreName": "Business", + "currentVersionReleaseDate": "2020-09-01T02:01:05Z", + "releaseNotes": "I.Improved Multiple Productivity Tools\n1.WeDoc \n-Optimized question editing and added three new questions: Picture, File, Location and Date. You can support timed repeated collection.\n-A variety of templates are newly added to the template center based on different industries, and custom templates are supported. Users can save any template to the template center.\n-Added comment panel, where you can quickly browse all comments of documents.\n2.WeDrive\n-Added \"Preview only\" permission and watermark settings. You can preview files in mainstream formats. It is supported in WeDrive Pro.\n3.Optimized Event APIs. Companies can obtain events on the calendar created through APIs, allowing data sharing from the existing system.\n4.Live\n-Admins can customize the permission to initiate live video for externals. Only allowed members can initiate live videos for external customers and partners.\n\nII.Optimized Basic OA Apps\n1.Approvals\n-You can set the permissions for approvers to view or edit the approval application fields. In this way, you can hide content from the specified approvers or allow them to modify the application content.\n-When setting the approval process, you can copy the process from other templates.\n-The duration of leave, offsite, business trip, and overtime work can be modified and counted on a daily basis. When the duration is set to \"Working Days\", the overtime and leave duration can be calculated more accurately according to the punch rules for the applicant.", + "primaryGenreId": 6000, + "sellerName": "Tencent Technology (Shenzhen) Company Limited", + "currency": "USD", + "trackCensoredName": "WeCom-Business IM & Work Tools", + "languageCodesISO2A": [ + "EN", + "ZH", + "ZH" + ], + "fileSizeBytes": "87361336", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/wecom-business-im-work-tools/id1189898970?mt=12&uo=4", + "trackContentRating": "4+", + "description": "WeCom is a business communication and office collaboration tool developed by Tencent WeChat Team. WeCom provides the familiar communication experience as WeChat and connects with WeChat in an all-round manner. It also offers productivity tools such as Event, Meeting, WeDoc and WeDrive, and flexible OA apps for effective business communication and management. \nWeCom has been widely adopted by millions of leading organizations, including Rainbow, P&G, Cartier, WalMart, Chow Tai Fook, L'Oreal, IKEA, Bank of China, PICC, Deppon Express, and Changan Automobile.\n\n1. A familiar communication experience\n[Ease of Use] Provides a IM experience consistent with WeChat’s.\n[Reliable Storage] Enables real-time message syncing to PCs, mobiles phones, the cloud, and other devices.\n[Efficient Communication] Allows users to check message read status to ensure effective communication.\n[Corporate Directory] Allows administrators to batch import and manage corporate directory. Finding co-workers has never been easier.\n\n2. Connecting with WeChat\n[Exchange Messages] Add WeChat users as contacts and offer services via private or group chats.\n[Contact Customers] Companies can view and manage customers added by members, and assign customers of former members.\n\n3. Integrated with kinds of efficiency tool\n[Event Management] Simultaneously, through \"Make an Appointment\", you can easily check the idle/busy status of the group members and select the appropriate time to start the event. Members will receive the event invitation in their Event app.\n[Multi-person Meeting] Initiate and join online meetings anytime & anywhere, allowing sharing documents and screens among up to 25 participants, and providing some management features for hosts.\n[WeDoc] Online real-time collaborative docs and sheets. Edits can be updated in real-time, freeing collaborators from transferring the files with each other.\n[WeDrive] Create a shared space with colleagues to keep track of the latest version. Edits can be updated in real-time.Companies can manage all company files in one place and allow audit by members, ensuring company data security.\n[Business Mailbox] Send and receive business emails and forward to Group Chats if needed.\n\n4. Diversified Office Apps\n[Basic Office Apps] Preset ready-to-use office apps such as Attendance, Approvals, Reports, Announcement, and Forum.\n[Third-party Apps] Provide companies with high-quality third-party apps and hardware, covering mobile office, and other fields, as well as smart attendance, unlimited screen casting, and meeting television.\n[APIs] Provide various APIs, making it easier for you to integrate company apps.\n\n5. Strong security capabilities\n[all-round safeguard] Based on the integration of offense and defense capabilities of Tencent over the past 20 years, WeCom is the first domestic office product to pass SOC2Type2 auditing, and has obtained ISO27018, ISO20000, ISO27001, and national three-level certifications to provide reliable data security guarantee for companies.\n\nWeCom, Offering Every Enterprise their own WeChat", + "genres": [ + "Business", + "Utilities" + ], + "artistId": 292374531, + "artistName": "Tencent Technology (Shenzhen) Company Limited", + "price": 0.00, + "bundleId": "com.tencent.WeWorkMac", + "version": "3.0.30", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "supportedDevices": [ + "iPadMini4Cellular-iPadMini4Cellular", + "iPadPro-iPadPro", + "iPhone11ProMax-iPhone11ProMax", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPhone5s-iPhone5s", + "iPadSeventhGen-iPadSeventhGen", + "MacDesktop-MacDesktop", + "iPad611-iPad611", + "iPadAir2Cellular-iPadAir2Cellular", + "iPadMini4-iPadMini4", + "iPadPro97-iPadPro97", + "iPad74-iPad74", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadAir-iPadAir", + "iPad878-iPad878", + "iPadAirCellular-iPadAirCellular", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone11Pro-iPhone11Pro", + "iPadMini5-iPadMini5", + "iPadMini3Cellular-iPadMini3Cellular", + "iPhone6-iPhone6", + "iPadMini3-iPadMini3", + "iPad71-iPad71", + "iPadProSecondGen-iPadProSecondGen", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadAir2-iPadAir2", + "iPhoneXR-iPhoneXR", + "iPhoneSE-iPhoneSE", + "iPadPro97Cellular-iPadPro97Cellular", + "iPad856-iPad856", + "iPadAir3-iPadAir3", + "iPad834-iPad834", + "iPad76-iPad76", + "iPhone8Plus-iPhone8Plus", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPhone11-iPhone11", + "iPadMiniRetina-iPadMiniRetina", + "iPad75-iPad75", + "iPadProCellular-iPadProCellular", + "iPhone8-iPhone8", + "iPhoneX-iPhoneX", + "iPad812-iPad812", + "iPhone7-iPhone7", + "iPhone6sPlus-iPhone6sPlus", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPadAir3Cellular-iPadAir3Cellular", + "iPhone6s-iPhone6s", + "iPhone6Plus-iPhone6Plus", + "iPad72-iPad72", + "iPhoneXS-iPhoneXS", + "iPhoneXSMax-iPhoneXSMax", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPad73-iPad73", + "iPadMini5Cellular-iPadMini5Cellular", + "iPad612-iPad612", + "iPhone7Plus-iPhone7Plus", + "iPadProFourthGen-iPadProFourthGen" + ], + "advisories": [], + "isGameCenterEnabled": false, + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/f5/c7/3d/f5c73d36-4ce5-5d17-41c9-ea7fe465ca71/f3972f46-f6e9-4c09-a114-4d3c3c2c34b0_Main_iPhone_Plus.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/d4/24/0d/d4240dda-e267-ce51-5e4f-7714a2ca5a7a/fabfeffa-a3c0-4651-9823-fc81519ec21c_Discord_iPhone_Plus.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/9d/da/6f/9dda6f0a-2d3f-3b24-ccf3-ea0186a51324/0ff3934b-cd50-4b5c-8ab2-5a5385521508_Slack_iPhone_Plus.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/cb/c6/7f/cbc67f3d-f4fd-44e2-e2ed-053dee565346/ffab9b81-c9c1-4eaf-8cb0-a6ae649725de_Main_-_iPads.png/576x768bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/72/d1/be/72d1be98-b513-1bde-9660-3506068d99f0/52fee114-79d9-470d-999b-d677ac0cdac5_Discord_iPads.png/576x768bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/92/77/66/927766d7-d61a-0133-49ee-f38153335b99/4838fdf7-45a1-4ea1-a1be-cf4ce9e20172_Slack_iPads.png/576x768bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/89/f3/1e/89f31e56-bedd-4f2c-d86b-f3bb775fd7d4/source/60x60bb.jpg", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/89/f3/1e/89f31e56-bedd-4f2c-d86b-f3bb775fd7d4/source/512x512bb.jpg", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/89/f3/1e/89f31e56-bedd-4f2c-d86b-f3bb775fd7d4/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/peroxaan-studios-llc/id1492913322?uo=4", + "features": [ + "iosUniversal" + ], + "kind": "software", + "trackId": 1492913323, + "trackName": "Talon – Webhooks & More", + "releaseDate": "2020-06-28T07:00:00Z", + "genreIds": [ + "6026", + "6002" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "13.0", + "primaryGenreName": "Developer Tools", + "currentVersionReleaseDate": "2020-08-24T14:19:01Z", + "releaseNotes": "Introducing Talon Pro. Talon Pro is an expansion on the current features of Talon. Talon Pro allows you to shorten links, and more! It's $1.99 USD - but more features will be coming to Talon Pro in later updates.\n\nAlso, we've added custom webhooks to the app! You can now run whatever POST Request you'd like.", + "primaryGenreId": 6026, + "sellerName": "Peroxaan Studios, LLC", + "currency": "USD", + "trackCensoredName": "Talon – Webhooks & More", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "27502592", + "sellerUrl": "https://peroxaan.com/Talon", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 4.77777999999999991587174008600413799285888671875, + "userRatingCountForCurrentVersion": 9, + "averageUserRating": 4.77777999999999991587174008600413799285888671875, + "trackViewUrl": "https://apps.apple.com/us/app/talon-webhooks-more/id1492913323?uo=4", + "trackContentRating": "4+", + "description": "Talon is a simple tool for users to use, manage, and work with Webhooks on Discord and Slack. It's very easy to use, and allows a larger audience to work with Webhooks in a simple way, without requiring you to know how to code. Talon gets rid of everything complex, and gives you a nice and easy to use Interface thats familiar to use. We built Talon to take advantage of the features that Discord and Slack offer. Talon allows you to save and copy your links inside of the app, so you don't have to constantly go back and forth just to use the App. Also with Talon, you can run POST Requests to any service, just in case Talon does not yet offer something you have in mind.\n\nFor even more features, you can purchase Talon Pro. Talon Pro is a one time purchase that allows you to shorten links with Talon - and gives you more customizability. Talon Pro will be growing more with future updates.\n\nWant to suggest something for a future Talon update? Contact us!\n\nNow, that sounds pretty cool and all - but this is just the beginning. Stay tuned for future updates that'll bring more features and functionality to Talon!", + "genres": [ + "Developer Tools", + "Utilities" + ], + "artistId": 1492913322, + "artistName": "Peroxaan Studios, LLC", + "price": 0.00, + "bundleId": "com.peroxaan.Talon", + "version": "1.2", + "wrapperType": "software", + "userRatingCount": 9 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/48/6d/7f/486d7fa8-fc1c-b537-9983-7c842da60afb/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/db/40/87/db40870b-a6b5-8952-ab98-acfa27f92166/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/5a/7d/1f/5a7d1f19-4bc4-7309-ae08-a4cce36fef8c/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/ac/b5/27/acb5278b-dcdb-e52b-62f8-c300013fabc3/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b2/98/67/b29867d9-2e76-8ca6-6a12-a1ea8bed2be5/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b2/98/67/b29867d9-2e76-8ca6-6a12-a1ea8bed2be5/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b2/98/67/b29867d9-2e76-8ca6-6a12-a1ea8bed2be5/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/shanghai-best-oray-information-technology-co-ltd/id551941462?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1305707014, + "trackName": "Pgy", + "releaseDate": "2018-01-10T06:10:10Z", + "genreIds": [ + "6002", + "6000" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.12", + "primaryGenreName": "Utilities", + "currentVersionReleaseDate": "2020-08-31T02:19:25Z", + "releaseNotes": "Update : \n\n1. Optimize the interface and icons. \n\n2. Repair known bug", + "primaryGenreId": 6002, + "sellerName": "Shanghai best oray information s&t co.,ltd", + "currency": "USD", + "trackCensoredName": "Pgy", + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "2352150", + "sellerUrl": "https://pgy.oray.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/pgy/id1305707014?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Pgy is a fast to build off-site virtual local area network APP software. Using a new independent research and development of Internet technology, through the network, to bring users a convenient network experience. Through the dandelion can be achieved remote access to local area network under the file, online game and other functions; at the same time can help small and medium enterprises quickly open up the branch or store between the remote network, mobile office, file sharing, remote monitoring, private LAN structures and other functions.\n\nThe main function:\n1. Off-site file sharing: easy to achieve more documents, important data, files and other resource sharing, support anytime, anywhere browsing\n2. Remote real-time view video monitoring: support real-time understanding of the operation of the branch, at any time to remotely view the details of the operation of the branch, video surveillance\n3. Remote mobile office: connect work and life, easy access to the company's OA system, file server, etc., at home to visit the office computer\n\nInstructions:\nAn APP only one step will be able to achieve intelligent networking features:\n== different equipment [such as two mobile phones] at the same time download, install dandelion APP, landing the same oray account, that is, to complete the automatic network.\n\nDandelion, step by step to build a virtual local area network, from the horizon if the neighbors.\nMore games, please pay attention: www.oray.comDandelion is a APP that can quickly build virtual lans. Using the new self-developed network technology, it can penetrate the Intranet and bring convenient network experience to users. Through dandelion can realize remote access LAN files, online game play and other functions; At the same time, it can help small and medium-sized enterprises to quickly open the long-distance network between branches or stores, realizing mobile office, file sharing, remote monitoring, private LAN building and other functions. \n\nMain functions: \n1. To realize file sharing in different places: to easily realize multiple documents, important data, files and other resources to share, and to support browsing each other anytime and anywhere \n2. Remote real-time view of video monitoring: support real-time understanding of the operation of each branch, remotely check the operation details of each branch, video monitoring, etc \n3. Remote mobile office: connect work and life, easy access to the company's OA system, file server, etc., can access the office computer at home \n4. Build personal private LAN: good gay friends love to beat boss, set up personal private LAN, realize multiplayer online games, enjoy the fun of games, gay love not cool \n\nUsage: \nOne APP only takes one step to realize intelligent networking: \nDifferent devices, such as two phones, download and install dandelion APP, and log on to the same oray account, which is to complete the automatic networking. \n\nDandelion, build a virtual LAN step by step, the end of the world. \nFor more, please follow: www.oray.com", + "genres": [ + "Utilities", + "Business" + ], + "artistId": 551941462, + "artistName": "Shanghai Best Oray Information Technology Co., Ltd.", + "price": 0.00, + "bundleId": "com.oray.pgy.PgyVisitorMac", + "version": "3.4.32010", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/f8/42/8d/f8428dc7-22fd-a938-97f9-f1538ce4042a/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/4a/d6/08/4ad60824-ae70-8fcb-261b-be798534e8ab/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/4a/d6/08/4ad60824-ae70-8fcb-261b-be798534e8ab/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/4a/d6/08/4ad60824-ae70-8fcb-261b-be798534e8ab/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/islandbit/id1073040697?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1271281910, + "trackName": "Activebot for Slack", + "releaseDate": "2017-09-30T10:35:35Z", + "genreIds": [ + "6000" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.9", + "primaryGenreName": "Business", + "currentVersionReleaseDate": "2017-09-30T10:35:35Z", + "primaryGenreId": 6000, + "sellerName": "Islandbit Inc.", + "currency": "USD", + "trackCensoredName": "Activebot for Slack", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "4274788", + "sellerUrl": "https://www.islandbit.com/activebot-for-slack/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/activebot-for-slack/id1271281910?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Activebot for Slack prevents Slack from going idle due to inactivity.\n\nNOTES:\nThis application requires Slack authentication using one of the following methods:\n1) \"Activebot for Slack\" app installed for your team\n2) Legacy token\n\nPlease verify you have access to adding apps to your Slack team or generating legacy tokens before purchasing this application at:\n\nhttps://api.slack.com/custom-integrations/legacy-tokens", + "genres": [ + "Business" + ], + "artistId": 1073040697, + "artistName": "Islandbit", + "price": 0.00, + "bundleId": "com.islandbit.Activebot", + "version": "1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple49/v4/dd/08/a4/dd08a4fe-9df6-3265-c2d3-2c0cf68203e0/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple49/v4/8d/ad/b6/8dadb62c-32d2-621c-001d-0f46c57ad7ae/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/a3/94/68/a3946880-3cf4-047e-71be-32f3ce8ea42f/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/a3/94/68/a3946880-3cf4-047e-71be-32f3ce8ea42f/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/a3/94/68/a3946880-3cf4-047e-71be-32f3ce8ea42f/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/gui-ning/id1086339124?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1097510182, + "trackName": "Building Block - Castle & City Craft Simulator", + "releaseDate": "2016-04-01T22:03:42Z", + "genreIds": [ + "6014", + "7017", + "7015" + ], + "formattedPrice": "$2.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.7", + "primaryGenreName": "Games", + "currentVersionReleaseDate": "2016-04-12T00:18:16Z", + "releaseNotes": "bugfixed", + "primaryGenreId": 6014, + "sellerName": "GUI NING", + "currency": "USD", + "trackCensoredName": "Building Block - Castle & City Craft Simulator", + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "2165740", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/building-block-castle-city-craft-simulator/id1097510182?mt=12&uo=4", + "trackContentRating": "4+", + "description": "BuildingBlock is a sandbox game with pixel styles & first-person.\n \n BuildingBlock has no specific goals for the player to accomplish, allowing players a large amount of freedom in choosing how to play the game. BuildingBlock enable players to build constructions out of textured cubes in a 3D procedurally generated world.\n \n Players have unlimited resources to build with and the ability to fly. At the start of the game, the player is placed on the surface of a procedurally generated and virtually infinite game world. The world is divided into biomes ranging from deserts to jungles to snowfields.Players can walk across the terrain consisting of plains, mountains, forests, caves, and various water bodies.\n\n The core gameplay revolves around breaking and placing blocks. The game world is composed of rough 3D objects—mainly cubes—arranged in a fixed grid pattern and representing different materials, such as dirt, stone, various ores, water, lava, tree trunks, etc. While players can move freely across the world, objects can only be placed at fixed locations on the grid. Players can gather these material blocks and place them elsewhere, thus allowing for various constructions.", + "genres": [ + "Games", + "Strategy", + "Simulation" + ], + "artistId": 1086339124, + "artistName": "GUI NING", + "price": 2.99, + "bundleId": "com.gnmac.buildingblock", + "version": "3.6", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple71/v4/6c/28/03/6c280331-3486-49e6-9668-5b15cc05ebcd/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple62/v4/d8/1c/3c/d81c3c7e-9bb0-8e86-f9f1-0395986e66f0/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple71/v4/a5/e1/30/a5e130a9-58e8-b993-63ab-ba43ed816a85/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple71/v4/cc/93/c9/cc93c904-3d54-c25d-5ec4-81900dcb3511/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple62/v4/4c/1e/a0/4c1ea0de-411a-2602-0ea1-040ea79ae172/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/00/1d/03/001d037b-392e-e2d6-126b-21e02f8dc263/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/00/1d/03/001d037b-392e-e2d6-126b-21e02f8dc263/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/00/1d/03/001d037b-392e-e2d6-126b-21e02f8dc263/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/shape-gmbh/id285688937?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1137958278, + "trackName": "IM+ All-in-One Messenger", + "releaseDate": "2016-08-03T13:01:02Z", + "genreIds": [ + "6005", + "6012" + ], + "formattedPrice": "$17.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10.0", + "primaryGenreName": "Social Networking", + "currentVersionReleaseDate": "2020-08-11T16:00:02Z", + "releaseNotes": "- Various UI and counter fixes\n\nEnjoy and let us know your feedback,\nYour IM+ Team :)", + "primaryGenreId": 6005, + "sellerName": "SHAPE GmbH", + "currency": "USD", + "trackCensoredName": "IM+ All-in-One Messenger", + "languageCodesISO2A": [ + "AM", + "AR", + "BN", + "BG", + "CA", + "HR", + "CS", + "DA", + "NL", + "EN", + "ET", + "FI", + "FR", + "DE", + "EL", + "GU", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KN", + "KO", + "LV", + "LT", + "MS", + "ML", + "MR", + "NB", + "FA", + "PL", + "PT", + "RO", + "RU", + "SR", + "ZH", + "SK", + "SL", + "ES", + "SW", + "SV", + "TA", + "TE", + "TH", + "ZH", + "TR", + "UK", + "VI" + ], + "fileSizeBytes": "67130312", + "sellerUrl": "https://plus.im", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/im-all-in-one-messenger/id1137958278?mt=12&uo=4", + "trackContentRating": "4+", + "description": "IM+ supports Zoom, WhatsApp, Telegram, Facebook Messenger, Facebook, Twitter, Slack, Skype, Gmail, Outlook, Hangouts, LinkedIn Messaging, Instagram, SnapMap, WeChat, ChatWork, HipChat, and Facebook Pages in one simple app.\n\nLog in once into your favorite messengers and video communicators, and gone will be the days of endless app switching.\n\nSome of the best features:\nVideo and voice calls on Zoom and Skype from one app\nNavigate through your accounts using the sidebar or hotkeys \nAdd multiple accounts per service, e.g. add a couple Twitter profiles\nDistinguish messengers easier with color tags and filter them by profile tags\nSupport for file sharing\nManage notification settings for all accounts at once or per service \nGreat for remote workers\n\nThe whole IM+ experience was designed for Mac OS X. \nIf IM+ improves your messaging life, we would appreciate an App Store review. Thank you!\n\nIM+ for iPhone has been used by over 10 million people and featured on Wired, Engadget, TechCrunch, Forbes, Bloomberg, The New York Times, and many more. And you will love IM+ on Mac too!\n\nLearn more about IM+ at www.shape.ag\nWe listen to you, so send us your feedback, questions and feature requests on Twitter @implus or Facebook www.facebook.com/plusim", + "genres": [ + "Social Networking", + "Lifestyle" + ], + "artistId": 285688937, + "artistName": "SHAPE GmbH", + "price": 17.99, + "bundleId": "com.shapeservices.implusosx", + "version": "1.13", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple111/v4/00/30/f5/0030f509-ed0f-d322-f24a-133922506d10/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple91/v4/bb/d2/2d/bbd22d87-6f95-b0be-beb6-fb4c0b5e1afc/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple111/v4/f3/42/a7/f342a728-11c0-e736-473a-a183dc3c097b/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple111/v4/09/39/c1/0939c16d-c9e4-6342-16cb-607481f8264f/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple122/v4/35/6f/30/356f3094-6062-7fc9-c237-ab59035fc366/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/ec/6b/6d/ec6b6d54-e990-3468-da0f-e5516c37620b/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/ec/6b/6d/ec6b6d54-e990-3468-da0f-e5516c37620b/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/ec/6b/6d/ec6b6d54-e990-3468-da0f-e5516c37620b/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/d2-nova-corp/id1120545372?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1120731995, + "trackName": "Team.biz - Business Messaging", + "releaseDate": "2016-09-03T10:32:21Z", + "genreIds": [ + "6000", + "6007" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10.0", + "primaryGenreName": "Business", + "currentVersionReleaseDate": "2019-11-14T00:51:05Z", + "releaseNotes": "Function and UI enhancement. Security improvement. Support macOS10.15 Catalina.\nWe are continuing to make updates to Team.Biz in response to your feature requests.", + "primaryGenreId": 6000, + "sellerName": "D2 Nova Corp", + "currency": "USD", + "trackCensoredName": "Team.biz - Business Messaging", + "languageCodesISO2A": [ + "AM", + "AR", + "BN", + "BG", + "CA", + "HR", + "CS", + "DA", + "NL", + "EN", + "ET", + "FI", + "FR", + "DE", + "EL", + "GU", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KN", + "KO", + "LV", + "LT", + "MS", + "ML", + "MR", + "NB", + "FA", + "PL", + "PT", + "RO", + "RU", + "SR", + "ZH", + "SK", + "SL", + "ES", + "SW", + "SV", + "TA", + "TE", + "TH", + "ZH", + "TR", + "UK", + "VI" + ], + "fileSizeBytes": "86876996", + "sellerUrl": "https://www.team.biz", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/team-biz-business-messaging/id1120731995?mt=12&uo=4", + "trackContentRating": "4+", + "description": "This is the messaging platform for professionals. We've brought the power and speed of a modern messaging app and added the capabilities needed for it to make sense within a work environment.\n\nUse Team.biz for free. If you don't already have an account, you can sign up for one for free through the app.\n\n• Create your own private team conversation space\n• Reach anyone on your team with direct messages\n• Have private conversations with a subset of your team\n• Create open topics that are viewable by everyone on your team\n• Safely communicate outside your team by inviting guests to a specific topic or conversation\n• Text out (SMS and MMS) to guests [This feature is limited to US phone numbers]\n• Hold a conversation with team members, guests, and text message participants (SMS and MMS) at the same time \n• Delegate admin responsibility to other users, so that they can manage your account\n• Maintain your message history\n• Share documents and images\n• Quickly see who's online, who's in the conversation, and who’s typing\n• Messages can be edited after they've been sent, so you can correct small errors and mistakes that would otherwise appear unprofessional\n• View the change history for any message, so you always will know what was originally said", + "genres": [ + "Business", + "Productivity" + ], + "artistId": 1120545372, + "artistName": "D2 Nova Corp.", + "price": 0.00, + "bundleId": "com.d2nova.teamasapmac", + "version": "2.0.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/33/f2/fd/33f2fdac-d025-d8e9-4945-5f97e9cc52d6/36ee117c-f4b0-4d22-b961-100f7f5b2ee2_1.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/21/1b/ef/211bef90-4006-c47f-ecf4-fe7045a636ea/062ce278-6bc1-4d63-be85-52293e7ee4ac_2.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/a2/75/b8/a275b835-d9aa-6c8a-f075-11f62788bcdf/89fca711-e8a5-4c1c-86e4-6dade08eead0_3.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/14/01/3b/14013b1f-6047-7072-c8dc-cee3b743f379/633d921a-3778-45b6-b2cd-7fec1c190fb6_4.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/fe/57/3f/fe573f18-6059-d6f0-c486-c448b82e20d4/78736982-88be-4cd2-a8f2-a73030a57d3a_5.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/f9/c1/ae/f9c1ae33-6590-8686-847c-004d6f15bdfb/b2698bb2-c1f9-4059-bf53-d67111704c4d_6.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/f3/06/c9/f306c9c4-9c32-e5c5-6ca2-2e625dde083e/e3be743f-2410-4e3e-af56-cf7b1b02bf40_7.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/d6/e5/04/d6e50418-e1ea-3b13-c060-4c46f7c27462/cf8b7740-bdbb-40d4-b65b-6b5142f11b6a_8.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/db/17/da/db17da9b-efbd-0e95-53ab-b506986dbec3/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/db/17/da/db17da9b-efbd-0e95-53ab-b506986dbec3/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/db/17/da/db17da9b-efbd-0e95-53ab-b506986dbec3/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/works-mobile-corp/id1012129121?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1029784963, + "trackName": "LINE WORKS", + "releaseDate": "2016-07-07T08:07:12Z", + "genreIds": [ + "6000", + "6007" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.12", + "primaryGenreName": "Business", + "currentVersionReleaseDate": "2020-09-02T01:19:27Z", + "releaseNotes": "- Fixed other bugs and improved other features", + "primaryGenreId": 6000, + "sellerName": "WORKS MOBILE Corp.", + "currency": "USD", + "trackCensoredName": "LINE WORKS", + "languageCodesISO2A": [ + "EN", + "JA", + "KO", + "ZH", + "ZH" + ], + "fileSizeBytes": "21001800", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/line-works/id1029784963?mt=12&uo=4", + "trackContentRating": "4+", + "description": "LINE WORKS texting/free calling services via PC version are available. \nCommunicate with your colleagues more conveniently and quickly using the PC version.\n\n[Messaging function optimized for business]\nYou can easily communicate with members in a team/group chat room synced with your company’s organization chart, and share works and files in Notes. You can also communicate for free with LINE users and as well as other LINE WORKS users.\n※ Chatting with other company people is available after approval from the admin.\n\n[Transmission of multi files/photos and Neatly arranged screen]\nYou can easily send many photos or files at once by using Drag & Drop. Were you distracted by many message windows scattered on the screen? It collects many message windows shown on the screen into one and arranges them neatly.\n※ The maximum capacity and number of transmittable files : Maximum 100MB per each file, Maximum 20 files\n※ If you set the feature through Settings > Message / Call > ‘Merge windows’, you can see the collected and arranged message windows from that moment.\n\n[Free voice and video call through PC!]\nIsn’t it hard to explain by using messages? Now you can communicate more easily through free call service. By clicking the call icon from Colleague’s profile photo, you can use free voice and video call services. You can communicate with the Colleague while seeing each other’s faces despite the long distance between you and your Colleague.\n\n※ Available only for Mac OS X 10.12 and above.\n※ In the case Lite products are used, some parts of the features are restricted.", + "genres": [ + "Business", + "Productivity" + ], + "artistId": 1012129121, + "artistName": "WORKS MOBILE Corp.", + "price": 0.00, + "bundleId": "com.naver.WorksOneApp", + "version": "2.9.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/21/00/ae/2100ae81-9e04-5936-f6fa-510ba86560ea/mzl.kcqgyxnk.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/f7/34/e9/f734e9f6-09cb-b523-5f2c-1bde17972491/mzl.fpnstdmz.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/8b/20/97/8b209744-90e0-de25-6b0a-816f0cf03a45/mzl.bhdbkhmo.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/89/d7/36/89d736e4-e616-07fc-b676-243be06a2767/mzl.yoxlprei.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/16/3e/6d/163e6d41-9e4d-02fa-62a2-d9bae16808cf/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/07/f1/47/07f1477d-37a5-c3ff-abed-ed9e8e28a95a/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/07/f1/47/07f1477d-37a5-c3ff-abed-ed9e8e28a95a/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/07/f1/47/07f1477d-37a5-c3ff-abed-ed9e8e28a95a/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/appyogi-software/id1039633008?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1139742811, + "trackName": "One Chat All-in-One Messenger", + "releaseDate": "2016-09-03T13:00:06Z", + "genreIds": [ + "6005", + "6002" + ], + "formattedPrice": "$19.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.11", + "primaryGenreName": "Social Networking", + "currentVersionReleaseDate": "2018-03-01T05:10:31Z", + "releaseNotes": "▸ Implement touch ID Password unlock for macs with touch bar. \n▸ Fixed Skype and WhatsApp freezing issue. \n▸ Fixed Slack notification issue. \n▸ Fixed all the bugs reported on support tickets.\n▸ Major bug fix.\n▸ QQ & WeChat does not work for new accounts as they does not allow to use.\n\nImprovements in Previous versions:\n\n▸ Downloading the audio file in WhatsApp is fixed.\n▸ New messaging service integrated -> Tinder chat\n▸ WhatsApp video recording handled.\n▸ HipChat automatic opening of Members List after new message arrival issue rectified.\n▸ Slack login using single sign-on (SSO) is handled.\n▸ Spelling check for all messaging services is enabled.\n▸ Skype drag and drop image option fixed.\n▸ Telegram image load issue with blue question mark handled\n▸ Facebook two factor authentication login handled\n▸ Added option to Enable/Disable sound notification alerts (in preferences)\n▸ No Internet connection' pop-up showing even for weak signals rectified.\n▸ Option to remember the password. \n▸ New services added are IRC chat, MySMS, Tweetdeck. \n▸ Option to stop GIF prompt while typing the message. \n▸ Option to mark all messages as reading.\n▸ Now you can send GIF instead of just a text message. \n▸ Schedule message to send them later.\n▸ FaceTime calling from WhatsApp\n▸ FaceTime calling from Telegram\n▸ Added Touch bar support for New MacBook Pro(2016)\n▸ Improvements in User Interface\n▸ Improved user preferences for more customisations\n▸ Fixed Skype calling plugin.\n▸▸ Multiple (Unlimited) Accounts for all messaging services.(hope you love it)\n▸ Individual Notifications for every accounts added\n▸ Rearrange messaging services on the menu.\n▸ Fixed shortcuts keys. \n▸ Added indicator for file download. \n▸ Fixed network connection status. \n▸ Take video and selfie from WhatsApp.\n▸ Notification Badges for individual chats services. \n▸ Added Twitter service\n▸ Loading issue resolved\n▸ Fixed Hangouts and Skype calling.\n▸ Fixed upload of media, docs and other files from the folder. \n▸ Added more services, Google Hangouts, HipChat, WeChat \n▸ Supports New MacOS Sierra Version: 10.12\n▸ Password Protection for privacy\n▸ Now use two different accounts of every service(messenger)\n▸ Add/Remove services from the left menu, as per the requirement.\n▸ Customize Notifications as per different accounts.\n▸ Fixed Media(Picture, Video or music) upload and download issue.\n▸ Fixed URL click issue on Facebook messenger.\n\n▸ If you enjoy using \"One Chat\" App, Please review and rate. That keeps us motivated. \n\nNote: Some new and existing features might not work in below MacOS Sierra.\nBut lower OS version users can use it with limited functionality. \n\nCurrent messaging services 22 and more coming:\nWhatsApp, FB Messenger, Hangouts, Telegram, Skype, Slack, WeChat, HipChat, Twitter, Yahoo Chat, ICQ, Discord, GroupMe, QQ, Messenger for Facebook Pages, Fleep, VK, RocketChat, Tinder.\n\nUnder the hood improvements: \n▸ Avg. CPU reduced from 10% to 3% \n▸ Avg. Energy consumption reduced from High to Zero\n\nFeatures in next version: \n▸ More messaging services. (Instagram, Line, Kik, Linkedin, wire, Tinder, Tumbler, XXMP, Steam, Grape)\n▸ And many more surprises.\n\nSpecial Thanks to our all existing user with following users who are helping us with suggestions and support.\nCosmin Miron\nRon Brathwaite\nDirk Gates\nLuis Neves\nRahulmhatre\nwa.k\nAlexander Leijenaar. \n\nWe respect all the suggestions and requests from our users and implement, which we feel are most important and solves the real problems of all users. \n\n\nOverall, using One Chat does provide a couple of advantages when it comes to security.\nIt does not store any messages or logins.", + "primaryGenreId": 6005, + "sellerName": "AppYogi Software", + "currency": "USD", + "trackCensoredName": "One Chat All-in-One Messenger", + "languageCodesISO2A": [ + "DA", + "NL", + "EN", + "FI", + "FR", + "DE", + "EL", + "ID", + "IT", + "JA", + "KO", + "MS", + "NB", + "PT", + "RU", + "ZH", + "ES", + "SV", + "TH", + "ZH", + "TR", + "VI" + ], + "fileSizeBytes": "8149607", + "sellerUrl": "http://appyogi.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/one-chat-all-in-one-messenger/id1139742811?mt=12&uo=4", + "trackContentRating": "4+", + "description": "One App for all messaging services.\n\nWhatsApp, Facebook Messenger, Hangouts, Telegram, Skype, Slack, WeChat, Twitter, YahooChat, ICQ chat, HipChat, Discord, GroupMe, QQ, Facebook Page messenger VK, Fleep, RocketChat, MySMS, IRC Chat, TweetDeck Tinder.\n\nNote: One Chat is a wrapper app, combining all the messaging services. Experience will be 100% similar to web extension of those services, which extra features as follows. \n\n▸ QQ & WeChat only works for old users of them. \n\nFeatures:\n▸ Schedule message to send them at a planned time. \n▸ Send and receive Photos, Videos, doc, PDF..etc\n▸ Use Multiple parallel accounts of the same service.\n▸ Touch Bar support in 10.12 to select messaging services. \n▸ Remember passwords for easy login. \n▸ Get respective Notifications alerts and reply from the same.\n▸ Auto Smart Gifs for messaging friends\n▸ Mark all unread messages read with just one Click. \n▸ Privacy mode to protect your messaging data with touch ID.\n▸ Customize messaging service order in the side menu.\n▸ FaceTime calling from WhatsApp & Telegram numbers.\n▸ Customize notification as per your requirement.\n▸ Shows notifications badges for individual services.\n▸ Check if there are any unread messages, right in the menu bar.\n▸ Go Full-screen! Chat with your friends, distraction-free in the full-screen mode.\n▸ Lightweight all, with minimum installation size.\n▸ Retina Display enabled icons\n▸ Easy to use user-interface(UI) and user-experience(UX)\n\nUpcoming update:\n- More chat services, suggestions most welcome.\n- And much more.\n\n>>>>>>>> Download Now <<<<<<<<\n\nDisclaimer:\nOne Chat is a third party App. The developer of this software is not affiliated with WhatsApp Inc. Facebook Inc. Telegram Inc. Slack Inc. Skype Inc. Google Inc. Atlassian Inc. Tencent Inc. Twitter Inc. V Kontakte. Yahoo Inc. Sleep Inc. Fleep Inc, RocketChat Inc., MySMS Inc, Tinder Inc., in any way.", + "genres": [ + "Social Networking", + "Utilities" + ], + "artistId": 1039633008, + "artistName": "AppYogi Software", + "price": 19.99, + "bundleId": "com.appyogi.onechat", + "version": "4.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/a3/09/1e/a3091e8d-c9fc-efdf-434c-3769715d2a3d/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/8d/8d/6f/8d8d6fcc-5e7d-5978-9be7-2ce6a23b2810/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/12/7a/7f/127a7f31-a9f9-b222-0d1b-c064065f5b65/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/72/84/81/7284818a-5bd3-0429-8658-b0038efbf67d/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/ef/bc/d7/efbcd7a7-3f1e-ba1f-2d55-bbba9b8c55f9/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/62/30/60/6230603f-7698-1cd7-9601-732a3ae74f8d/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/71/3e/2b/713e2ba7-0169-a4f2-b1c5-09252f5fcedd/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/71/3e/2b/713e2ba7-0169-a4f2-b1c5-09252f5fcedd/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/71/3e/2b/713e2ba7-0169-a4f2-b1c5-09252f5fcedd/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/swit-technologies-inc/id1451271780?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1464411410, + "trackName": "Swit - Team collaboration hub", + "releaseDate": "2019-06-04T01:46:30Z", + "genreIds": [ + "6000" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10.0", + "primaryGenreName": "Business", + "currentVersionReleaseDate": "2020-09-01T04:58:09Z", + "releaseNotes": "Updates\n* UI/UX and performance improvements\n \nBug Fixes\n* Other minor bug fixes", + "primaryGenreId": 6000, + "sellerName": "SWIT TECHNOLOGIES INC.", + "currency": "USD", + "trackCensoredName": "Swit - Team collaboration hub", + "languageCodesISO2A": [ + "AM", + "AR", + "BN", + "BG", + "CA", + "HR", + "CS", + "DA", + "NL", + "EN", + "ET", + "FI", + "FR", + "DE", + "EL", + "GU", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KN", + "KO", + "LV", + "LT", + "MS", + "ML", + "MR", + "NB", + "FA", + "PL", + "PT", + "RO", + "RU", + "SR", + "ZH", + "SK", + "SL", + "ES", + "SW", + "SV", + "TA", + "TE", + "TH", + "ZH", + "TR", + "UK", + "VI" + ], + "fileSizeBytes": "106927881", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/swit-team-collaboration-hub/id1464411410?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Swit is one work suite for Chat and Project Management. With Swit, you can replace Slack and Trello (or Asana).\n\nSwit provides seamless workflows coupling chat and tasks in one convenient place. We have all the features that Slack and Trello (or Asana) have - faster, better, and safer.\n\n * Team chat\n * Ideation post\n * To-do kanban\n * Gantt chart\n * Calendar\n * Advanced integrated search\n\nTechCrunch - “a collaboration suite that offers freedom from integrations”\nBusiness Insider - “flexible enough to accommodate the needs of multiple departments within enterprises”\nInfoTech - “one central hub to delineate a wide variety of processes”\nSaaStock - \"Top 4 at the West Coast, Top 10 Rising Stars\"\nFortune - “Swit, a San Francisco-based workplace team collaboration app, raised $6 million in funding.”\nGSVlabs - “Now that everything is in one place it's easy to find conversations had in messages and relate them directly to project tasks.”\nWeb Summit - “The Future of Team Collaboration Apps”\n\nSign up for FREE forever\n\nWork Sweet on Desktop and Mobile!", + "genres": [ + "Business" + ], + "artistId": 1451271780, + "artistName": "SWIT TECHNOLOGIES INC.", + "price": 0.00, + "bundleId": "com.swit.desktop", + "version": "2.9.9", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/a5/e7/65/a5e765b9-6518-c932-fbed-db6d80828adf/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/57/03/ec/5703ecf0-c694-9ccd-52c2-21d37b04e651/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/57/03/ec/5703ecf0-c694-9ccd-52c2-21d37b04e651/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/57/03/ec/5703ecf0-c694-9ccd-52c2-21d37b04e651/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/sai-praneeth/id1071875110?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1510447358, + "trackName": "Slacker - auto mouse mover", + "releaseDate": "2020-06-10T07:00:00Z", + "genreIds": [ + "6002", + "6000" + ], + "formattedPrice": "$2.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.15", + "primaryGenreName": "Utilities", + "currentVersionReleaseDate": "2020-06-11T04:47:14Z", + "primaryGenreId": 6002, + "sellerName": "Sai Praneeth", + "currency": "USD", + "trackCensoredName": "Slacker - auto mouse mover", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "635428", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/slacker-auto-mouse-mover/id1510447358?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Do you work smart, not hard? Well that's great, but your boss and team mates might be forming opinions based on whether you show up as active or available or online on your office's instant messaging tools like Slack, Skype, Microsoft Teams and more. \n\nOnce you stay idle for some time, these messaging tools display your status as away or idle or offline causing your co-workers to suspect you are not in front of your computer all the time. You know how big a problem this is if you WFH (work from home) regularly and can't constantly be in front of your computer.\n\nSlacker solves this by moving your mouse pointer for you whenever you are idle - the result is that you always show as active on any corporate/office instant messaging tools (like Slack or Microsoft Teams) running on your work computer.\n\nThis additionally also means that your screen lock and screensaver will not be activated and your system will not go to sleep just because you step away from your computer while working from home or in the office.", + "genres": [ + "Utilities", + "Business" + ], + "artistId": 1071875110, + "artistName": "Sai Praneeth", + "price": 2.99, + "bundleId": "com.inchwest.Slacker", + "version": "1.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/dd/49/f7/dd49f7b7-7cdd-183e-977f-369d2b638f5a/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/9b/cf/e8/9bcfe870-f18b-73fd-4169-e4b32b7dba4f/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/18/6f/40/186f4019-5989-3f71-6d9f-a0b01b906e1c/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/e9/37/3e/e9373e04-c404-6ff4-05e2-a4f397aa090a/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/7c/fc/83/7cfc83aa-5d6a-b66f-233f-4e6e0da8cc79/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/7c/fc/83/7cfc83aa-5d6a-b66f-233f-4e6e0da8cc79/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/7c/fc/83/7cfc83aa-5d6a-b66f-233f-4e6e0da8cc79/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/qin-hu/id822142008?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1229446984, + "trackName": "MyTasks for Asana", + "releaseDate": "2017-05-19T20:32:20Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "$4.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10", + "primaryGenreName": "Productivity", + "currentVersionReleaseDate": "2018-01-07T20:48:30Z", + "releaseNotes": "Minor bug fixes.", + "primaryGenreId": 6007, + "sellerName": "qin hu", + "currency": "USD", + "trackCensoredName": "MyTasks for Asana", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "330338", + "sellerUrl": "https://enjoyableapps.wordpress.com/mytasks-for-asana", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/mytasks-for-asana/id1229446984?mt=12&uo=4", + "trackContentRating": "4+", + "description": "A native client for Asana on macOS.\n\nFEATURES\n• Create tasks easily.\n• View tasks from the menu-bar.\n--- List of tasks assigned to you.\n--- List of tasks you follow.\n--- List of tasks in a project.\n• Mark tasks as completed.\n• Like and unlike a task.\n• Comment on tasks.\n• Get notifications when there are new tasks and updated tasks.\n• Sort your tasks by due time, created time, updated time, or number of likes.\n• Filter your tasks by projects, tags, or status.\n\nNOTE\nMyTasks for Asana is a 3rd party application for Asana and is in no way endorsed or affiliated with Asana, Inc.", + "genres": [ + "Productivity", + "Business" + ], + "artistId": 822142008, + "artistName": "qin hu", + "price": 4.99, + "bundleId": "com.huqin.MyTasks-for-Asana", + "version": "1.6", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/f4/65/99/f4659920-43c5-3cc1-036b-e569e5fddbcc/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/58/37/f4/5837f430-7748-62ea-f0b7-c4dce867ed8a/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/a4/35/f1/a435f1fc-7ad0-8b09-c082-b514bdcb9033/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/55/dd/4b/55dd4be3-dce8-11c4-8916-97040fddd3b7/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/90/f3/75/90f37528-b79d-0279-5362-4f0e47a354c9/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/90/f3/75/90f37528-b79d-0279-5362-4f0e47a354c9/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/90/f3/75/90f37528-b79d-0279-5362-4f0e47a354c9/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/ubergrape-gmbh/id943855716?mt=12&uo=4", + "kind": "mac-software", + "trackId": 971791845, + "trackName": "Grape - Messenger", + "releaseDate": "2015-04-08T02:17:47Z", + "genreIds": [ + "6000", + "6007" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10.0", + "primaryGenreName": "Business", + "currentVersionReleaseDate": "2020-07-17T17:13:52Z", + "releaseNotes": "- Added support for Polish language.", + "primaryGenreId": 6000, + "sellerName": "UberGrape GmbH", + "currency": "USD", + "trackCensoredName": "Grape - Messenger", + "languageCodesISO2A": [ + "AM", + "AR", + "BN", + "BG", + "CA", + "HR", + "CS", + "DA", + "NL", + "EN", + "ET", + "FI", + "FR", + "DE", + "EL", + "GU", + "HE", + "HI", + "HU", + "ID", + "IT", + "JA", + "KN", + "KO", + "LV", + "LT", + "MS", + "ML", + "MR", + "NB", + "FA", + "PL", + "PT", + "RO", + "RU", + "SR", + "ZH", + "SK", + "SL", + "ES", + "SW", + "SV", + "TA", + "TE", + "TH", + "ZH", + "TR", + "UK", + "VI" + ], + "fileSizeBytes": "83490302", + "sellerUrl": "https://www.grape.io/press/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/grape-messenger/id971791845?mt=12&uo=4", + "trackContentRating": "4+", + "description": "A different messenger.\nSecure video, voice and text conversations that happen inside your favourite business tools.\n\n- Real time messaging, file sharing, supporting private messages and group conversations.\n- Run it inside your favourite tools like Jira, Confluence or Sharepoint.\n- Reimagined Enterprise Search helps you quickly find anything within your business, including services, documents, appointments, files, contacts and more. \n- Instantly synced across all devices.\n- Configurable notifications for desktop, mobile push and email.\n- Host it on-premises or in the secure Euro-Cloud", + "genres": [ + "Business", + "Productivity" + ], + "artistId": 943855716, + "artistName": "UberGrape GmbH", + "price": 0.00, + "bundleId": "com.ChatGrape", + "version": "3.1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/ce/e2/9d/cee29db7-0202-ee16-2d5e-e3beb87323cc/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/49/81/95/4981952e-c172-68ea-38ae-3c082539959e/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/ff/3a/47/ff3a47e3-66a0-91fd-5777-9b58922c1af1/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/41/e8/d6/41e8d6e4-7ba0-ef42-08ec-bd0f6ecd20f7/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/2d/b5/b9/2db5b92b-3aeb-0bf2-5dc3-592c98be60b4/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/ed/b0/c4/edb0c40a-5bc3-c67d-1ef2-9a4aa5a0955d/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/3e/58/7c/3e587cf0-0400-7339-2add-96a7abd91e24/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/5e/9e/c5/5e9ec51a-b500-2da3-5d50-94c2e616b35e/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/09/80/7f/09807fde-00e8-d19f-1a06-d20bbc9f967f/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/09/80/7f/09807fde-00e8-d19f-1a06-d20bbc9f967f/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/09/80/7f/09807fde-00e8-d19f-1a06-d20bbc9f967f/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/octopus-think/id1489816365?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1489816366, + "trackName": "Mic Drop.", + "releaseDate": "2020-04-14T07:00:00Z", + "genreIds": [ + "6002", + "6007" + ], + "formattedPrice": "$6.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.15", + "primaryGenreName": "Utilities", + "currentVersionReleaseDate": "2020-08-03T19:32:54Z", + "releaseNotes": "We fixed a bug that could cause Mic Drop to crash/hang if you were using Loopback audio devices.", + "primaryGenreId": 6002, + "sellerName": "Octopus Think Ltd.", + "currency": "USD", + "trackCensoredName": "Mic Drop.", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "1746857", + "sellerUrl": "https://getmicdrop.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/mic-drop/id1489816366?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Ever been in a video call and needed to turn off your microphone, but couldn’t find the mute button quickly enough?\n\nMic Drop helps you mute (and then unmute!) your microphone with a keyboard shortcut or a menu bar control. It works with every meeting app out there—from Zoom to Slack, FaceTime to Houseparty.\n\nIt also shows your mic status in a menu bar icon, so you'll always know at a glance whether you're muted or not. And it lets you (un)mute yourself even if you don't have your meeting app open.\n\nMic Drop:\n\n- Allows you to define a custom keyboard shortcut that works across your Mac.\n- Works with every app and audio device out there.\n- Automatically keeps you muted (or unmuted!) if you change audio devices.\n- Supports push-to-talk and push-to-mute.\n- Shows your microphone status in the menu bar.\n- Shows your microphone status in an optional floating window.\n- Respects your privacy. Mic Drop never listens to you.\n\nBecause Mic Drop mutes your audio at the system level, it works with any app you can imagine. We’ve tested with:\n\n- Zoom\n- Slack\n- Google Meet\n- Skype\n- Microsoft Teams\n- Discord\n- FaceTime\n- Vidyo\n- Houseparty\n- Cisco Webex\n- and many more.\n\nIt just works. No matter where you’re meeting, Mic Drop’s got you covered.\n\n----------\n\nA note on hardware compatibility:\n\nMic Drop works with just about any audio device out there, but some audio devices can't be muted by macOS, so Mic Drop can't control them. All bluetooth and wired headphones work—it's just some niche USB audio interfaces that Mic Drop won't mute. Mic Drop will warn you if it detects an incompatible device. A list of problematic devices are listed on our support page.", + "genres": [ + "Utilities", + "Productivity" + ], + "artistId": 1489816365, + "artistName": "Octopus Think", + "price": 6.99, + "bundleId": "com.octopusthink.Mic-Drop", + "version": "1.1.6", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/85/61/24/85612409-4ed4-cffc-6df0-1f9cb8098019/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/13/53/65/13536517-9cc2-fe7a-5bcb-1dec9d887a8a/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/17/69/d217692c-c134-debd-d174-12ac27bd85e4/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/bf/38/40/bf3840b3-b4ab-b9ea-f9a3-ede48ad6c69a/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/ae/8c/b5/ae8cb50b-e5ce-2f5c-5347-9b94759a704c/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/b0/2f/ce/b02fce9a-f5bc-e9a6-b4e7-2d25a2876ca3/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/72/67/63/72676353-b09c-b71d-5a9d-f80765f9a5bd/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/a8/b2/54/a8b254b7-9a2d-cef2-5d73-681b6edbd774/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/a8/b2/54/a8b254b7-9a2d-cef2-5d73-681b6edbd774/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/a8/b2/54/a8b254b7-9a2d-cef2-5d73-681b6edbd774/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/sdwr/id560094566?mt=12&uo=4", + "kind": "mac-software", + "trackId": 940239558, + "trackName": "Lists for Trello", + "releaseDate": "2014-11-21T03:38:30Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "$4.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.14", + "primaryGenreName": "Productivity", + "currentVersionReleaseDate": "2020-05-04T17:56:36Z", + "releaseNotes": "- Performance and stability improvements", + "primaryGenreId": 6007, + "sellerName": "Alexey Linkov", + "currency": "USD", + "trackCensoredName": "Lists for Trello", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "3385009", + "sellerUrl": "https://lists4trello.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/lists-for-trello/id940239558?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Lists for Trello keeps you focused on current tasks. Toggle side panels and on-card indicators when you want more context and complexity.\n\n\n* Edit, archive, move and add cards across your lists, start dragging a card to see options.\n\n* Edit, delete or rename lists and boards by right clicking on one of the list items on the left\n\n* You can switch between all cards and only those cards assigned to you across all boards. Use the Crown Switch located on the left pane. \n\n* Cards can be sorted by due date. You can turn off sorting, sort ascending or descending clicking on the stopwatch icon on the left pane.\n\n* Cards can be marked with a special dot. You can choose from several criteria that should be met for the dot to be displayed. By default dot is shown for cards that have open todos, you can change that by opening View -> Show Dot When... in the top app menu\n\n* Due and overdue cards are color coded in list view. Overdue colored red and due are colored amber.\n\n* Color labels for cards are displayed in center pane. Right click on a card to add / remove labels. You can hide labels by going in Menu -> View -> Toggle Labels\n\n* Checklists and todo items for a card are accessible from right pane by flipping the switch on top. You can add, delete, rename and reorder todo items. You can click just once on a todo item to start editing it. Reordering of checklists as well as making a new card from a todo item will be available shortly.\n\n* Today widget\nLeft click on a list in the main application and select \"Show in Today Widget.\" to add it.\n\nUseful shortcuts:\n- CMD+R to reload cards in currently selected list\n- SHIFT+CMD+R to reload all lists and boards\n- CMD+1 to toggle sidebar\n- CMD+0 to toggle card inspector\n- CMD+L to toggle color labels on cards\n\nGive us feedback and see what features / fixes / improvements are coming in the next update by following us on https://www.facebook.com/lists4trello/", + "genres": [ + "Productivity", + "Utilities" + ], + "artistId": 560094566, + "artistName": "SDWR", + "price": 4.99, + "bundleId": "SDWR.Lists", + "version": "2.7", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple5/v4/d2/c3/92/d2c392c5-e08e-7df8-c433-a3b296a6650a/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple5/v4/02/78/4f/02784fb5-7afa-228b-7726-ddf2aaaa0b84/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple5/v4/46/10/45/4610450f-2868-bf20-17c6-b684c49c0c89/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple7/v4/eb/b4/da/ebb4dacc-5062-77f4-5c99-ac9ebdf6ff99/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple7/v4/46/2c/0f/462c0f28-f865-25ad-3164-df261a5c2760/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple30/v4/95/83/04/9583045a-665d-a0be-dfc7-89487890d35d/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple30/v4/95/83/04/9583045a-665d-a0be-dfc7-89487890d35d/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple30/v4/95/83/04/9583045a-665d-a0be-dfc7-89487890d35d/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/eric-delabar/id823959467?mt=12&uo=4", + "kind": "mac-software", + "trackId": 994537604, + "trackName": "ChannelScrobbler - Real-time scrobble bot for Last.fm/Slack", + "releaseDate": "2015-06-01T17:54:13Z", + "genreIds": [ + "6005", + "6011" + ], + "formattedPrice": "$2.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10", + "primaryGenreName": "Social Networking", + "currentVersionReleaseDate": "2016-07-06T01:11:45Z", + "releaseNotes": "* Fixed bug where custom bot name was not saved between application launches.\n* Fixed artist info lookup/sterilization so that if Last.fm lookup fails original scrobble info is displayed instead.\n* Updated some metadata.", + "primaryGenreId": 6005, + "sellerName": "Eric DeLabar", + "currency": "USD", + "trackCensoredName": "ChannelScrobbler - Real-time scrobble bot for Last.fm/Slack", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "1202787", + "sellerUrl": "http://ericdelabar.com/projects/channelscrobbler.html", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/channelscrobbler-real-time-scrobble-bot-for-last-fm-slack/id994537604?mt=12&uo=4", + "trackContentRating": "4+", + "description": "ChannelScrobbler is a fun way to post your Last.fm scrobbles to a Slack channel in real-time. Create a music channel and show your friends and co-workers what you're listening to and see their favorites as well. \n\nOther solutions like IFTTT poll the Last.fm feed and only update every 15 minutes or so, ChannelScrobbler allows you to choose your update period and see updates as frequently as every 30 seconds. \n\nChannelScrobbler runs in your status bar and can launch on startup, so it's always there, listing every track you play. Because ChannelScrobbler reads your Last.fm feed scrobbles from your account it will catch new songs from any device that supports scrobbling, not just your computer!\n\n* Includes retina graphics and support for dark status bars!\n* Scrobbles are posted by a bot with customizable name, avatar, and colors.\n\nIf you're having problems using ChannelScrobbler, please email edelabar@gmail.com for support.", + "genres": [ + "Social Networking", + "Music" + ], + "artistId": 823959467, + "artistName": "Eric DeLabar", + "price": 2.99, + "bundleId": "com.ericdelabar.ChannelScrobbler", + "version": "1.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/bf/08/c7/bf08c74c-2313-d6a8-183e-1d7c23cfada4/5f0c1b7d-ce2f-42dd-a389-5acb3df5d9e5_screen-1.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/d6/e6/d3/d6e6d358-5a28-fe8a-5855-0c3e92fd92d1/6c770e65-6a0a-4ce1-a9a3-a88863128f9d_screen-2.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/0e/5c/0b/0e5c0b2e-24d0-fa91-2abc-a2141e059de9/af39f6ac-209e-434d-bc40-fe9262be4198_screen-3.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/2b/de/5e/2bde5e2e-cb46-4fe6-2ff4-e5487d2d4d35/0d7ddd32-f5ff-4253-8cd8-14170809d8d1_screen-4.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/84/e6/cd/84e6cd75-70ce-7146-7e2b-eca3c014bfb4/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/84/e6/cd/84e6cd75-70ce-7146-7e2b-eca3c014bfb4/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/84/e6/cd/84e6cd75-70ce-7146-7e2b-eca3c014bfb4/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/ilya-shaisultanov/id1155364065?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1524355453, + "trackName": "Thinking Face Emoji Tools", + "releaseDate": "2020-07-24T07:00:00Z", + "genreIds": [ + "6005", + "6002" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.12", + "primaryGenreName": "Social Networking", + "currentVersionReleaseDate": "2020-08-12T21:08:41Z", + "releaseNotes": "Save options across reloads.", + "primaryGenreId": 6005, + "sellerName": "Ilya Shaisultanov", + "currency": "USD", + "trackCensoredName": "Thinking Face Emoji Tools", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "3757555", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/thinking-face-emoji-tools/id1524355453?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Tools that make life as a Slack emoji addict a little easier.\n\nFeatures:\n• Drag & drop emoji upload\n• Bulk emoji deletion\n• Optional prefix and suffix for emoji names\n• Automatically overwrite existing emoji \n• Respect Slack API rate limiting\n\nEver wanted to upload 100 emoji to slack in one fell swoop? Now you can!\n\n1. Install this extension\n2. Go to your Slack's /customize/emoji page\n3. Drag and drop your emoji image files into the new \"Bulk Emoji Uploader\". File names become the emoji name, e.g. meow-party.gif becomes :meow-party: Customize them with an optional prefix or suffix!\n4. You've now got a whole lotta emoji!", + "genres": [ + "Social Networking", + "Utilities" + ], + "artistId": 1155364065, + "artistName": "Ilya Shaisultanov", + "price": 0.00, + "bundleId": "com.diversario.Thinking-Face-Emoji-Tools", + "version": "1.3.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/a5/aa/c5/a5aac5fd-8acc-bc30-47aa-3243d9a37a15/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/89/a0/2c/89a02cfc-d14b-b789-b015-a1611bbd322f/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/61/70/03/6170030f-69b1-33f6-f59e-890d8bbbf648/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/40/1a/c0/401ac066-772a-01df-e339-2aee5e9cc919/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/41/40/5d/41405d96-802f-7f56-54ca-3bea7ce9c715/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/ae/a9/eb/aea9eb7c-b4ab-97e0-3f5d-8881bc65ad67/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/ae/a9/eb/aea9eb7c-b4ab-97e0-3f5d-8881bc65ad67/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/ae/a9/eb/aea9eb7c-b4ab-97e0-3f5d-8881bc65ad67/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/uptech-works-llc/id1190352695?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1487662886, + "trackName": "TeamSmash", + "releaseDate": "2020-01-07T08:00:00Z", + "genreIds": [ + "6007", + "6005" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.14", + "primaryGenreName": "Productivity", + "currentVersionReleaseDate": "2020-04-20T17:00:26Z", + "releaseNotes": "Your team now has more control over when snapshots are taken!\n\n• Opt into manual capture mode to receive a notification as often as you want to remind you to snap a fun photo for your team! Your picture will not be taken automatically. Snap only when you want to!\n• For those of you with automatic capture turned on, you can also receive notifications right before your photo is taken. A perfect reminder to put on that fancy smile, a ridiculous face, or stop the photo altogether. Your choice!\n\nDon't forget, you can always change your capture mode and other settings by going to TeamSmash preferences menu! Oh, and we made some bug fixes and performance enhancements too.", + "primaryGenreId": 6007, + "sellerName": "UpTech Works, LLC", + "currency": "USD", + "trackCensoredName": "TeamSmash", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "5512772", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/teamsmash/id1487662886?mt=12&uo=4", + "trackContentRating": "4+", + "description": "TeamSmash is a companion app for Slack that lets you use video snapshots to enhance your remote working experience. \n\nQuickly see when your teammates are around and available to ask questions - or when they are away from their desk. \n\nYou can either take a picture of yourself manually or have the app take one automatically every so often. \n\nAnd if you need to jump into a video call, it's easy to start a Slack call with one of your co-workers. You are in complete control! \n\nBest of all, you can also use the built-in feed to memorialize any of your teammates with a funny meme of their picture. \n\nWorking remote should not feel lonely. Use TeamSmash and feel connected to your team!", + "genres": [ + "Productivity", + "Social Networking" + ], + "artistId": 1190352695, + "artistName": "UpTech Works, LLC", + "price": 0.00, + "bundleId": "ch.upte.TeamSmash.mac", + "version": "1.2.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/8c/b8/6e/8cb86e19-7cea-205b-af78-b61242766400/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/64/f9/2f/64f92f39-6690-a3e1-c7ff-50978b750431/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/d4/e4/bb/d4e4bbf4-44ef-f844-5efa-f9a720f57c6e/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/cc/22/1c/cc221c0c-6e03-222e-e702-206afba31408/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/31/c6/24/31c6242f-5899-c99d-8062-89ce18beb2b0/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/e1/a2/fc/e1a2fc62-61aa-04cb-82aa-14ac07909a1e/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/c7/15/b6/c715b687-7bd2-0fe5-3f61-43cad60b4b04/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/c7/15/b6/c715b687-7bd2-0fe5-3f61-43cad60b4b04/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/c7/15/b6/c715b687-7bd2-0fe5-3f61-43cad60b4b04/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/simply-good-software/id385251756?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1499496939, + "trackName": "Pyrus", + "releaseDate": "2020-06-11T07:00:00Z", + "genreIds": [ + "6000" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10.0", + "primaryGenreName": "Business", + "currentVersionReleaseDate": "2020-08-20T13:59:50Z", + "releaseNotes": "Minor bug fixes.", + "primaryGenreId": 6000, + "sellerName": "Simply Good Software, Inc", + "currency": "USD", + "trackCensoredName": "Pyrus", + "languageCodesISO2A": [ + "EN", + "RU" + ], + "fileSizeBytes": "80176195", + "sellerUrl": "http://pyrus.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/pyrus/id1499496939?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Pyrus is the team communication tool for your entire business. It incorporates real-time messaging, task delegation, and approval flows. Finally, all your tasks and conversations are in one easy-to-use interface.", + "genres": [ + "Business" + ], + "artistId": 385251756, + "artistName": "Simply Good Software", + "price": 0.00, + "bundleId": "net.pyrus.macosclient", + "version": "1.0.12", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/b8/57/43/b85743bc-16b6-4971-02dd-5b7c2162b5e3/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/81/70/f5/8170f593-ad4e-f377-17b3-ab0c30c279a2/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/72/ae/78/72ae7824-f4a0-4f3b-27e3-656c358e877a/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/f9/a9/26/f9a92636-e348-78c2-e00f-c04d8e319637/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/dd/c0/f7/ddc0f790-b7a5-cebd-30f2-4f55a1d73068/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/6d/5d/d5/6d5dd50e-7a42-8f3b-0c99-f3defe3d153f/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/b2/a8/9e/b2a89eaf-2c84-43b5-013b-29450ee5686d/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/50/03/83/50038321-48f9-3087-b698-733047b17969/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/dd/25/5b/dd255b82-3e85-0a1f-768b-0e0787f846f7/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/67/f1/7d/67f17dbf-9832-01c0-98d7-03e91320de8d/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/67/f1/7d/67f17dbf-9832-01c0-98d7-03e91320de8d/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/67/f1/7d/67f17dbf-9832-01c0-98d7-03e91320de8d/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/intrinsic-properties-llc/id1119328387?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1438864470, + "trackName": "Monitro", + "releaseDate": "2019-10-21T07:00:00Z", + "genreIds": [ + "6002" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.14", + "primaryGenreName": "Utilities", + "currentVersionReleaseDate": "2019-12-08T01:45:12Z", + "releaseNotes": "Minor bug fixes", + "primaryGenreId": 6002, + "sellerName": "Intrinsic Properties, LLC", + "currency": "USD", + "trackCensoredName": "Monitro", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "14008794", + "contentAdvisoryRating": "17+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/monitro/id1438864470?mt=12&uo=4", + "trackContentRating": "17+", + "description": "Monitro is a macOS menu bar app that monitors folders for changes and can also provide simple IMAP mail processing as well.\n\nFor folders you create a list of folders you wish to have monitored. You can select details such as search depth and whether or not aliases should be followed. You can then apply a wide variety of timers to do the comparisons for changes ranging from every minute to something like weekly on Thursday at 2:30 PM. When changes are detected you can send a change report to combination of email addresses, a Slack web hook, or log file. Change detections are based on comparing to a database of file names, created dates, and modified dates. Using a database is important since you can actually quit the app and launch it any time in the future and it will report on any changes since it last saw the folders being monitored at the next reporting times.\n\nFor IMAP email processing you can apply simple rules to any email accounts you want to be monitored. You can query on To, From, CC, BCC, Subject, Body, Has Attachment, Attachment Name, Attachment Type, and for PDF or text files look at text within the attachment itself. When an email is matched you can apply actions on it such as Move, Copy, Delete, Mark Read, Mark Flagged, Mark Answered, or Save Attachments. It is important to note that you can actually Move or Copy messages between completely different IMAP accounts you have defined for access. It is usually very difficult to find these features server side and though some are possible client side with Monitro you do not need to have an email client running 24/7 to provide this level of filtering.\n\nMonitro is FREE for one Folder Monitor and one IMAP Monitor Rule. If you need more than that you can purchase a yearly subscription for $12.99 to unlock Full Access mode which let you run an unlimited number of monitors for folders or rules for IMAP accounts. If $12.99 seems high remember this is a very specific use app that is intended to unlock more time if your life if you find its features useful. It is not expected to attract a large paid user base. However, if the user base proves large enough the targeted use of funds is further feature development based on user feedback.\n\nMonitro is made for Mojave will not work on earlier versions of macOS. Unless you are saving attachments from IMAP accounts the only writing to your file system Monitro will do is to its own private settings and databases. It will not touch or otherwise store any information in the folders you monitor thus it is possible to have more than one monitor for a single folder and still have things work flawlessly. Monitro is made to play well as a sandboxed app but if you are looking to monitor folders applications normally do not have access to you will need to enable Full Disk Access on your own.\n\nHINT: For IMAP Rules saving attachments Monitro pairs perfectly with Haze from Noodlesoft. Hazel is an app from an unrelated developer that watches whatever folders you tell it to, automatically organizing your files according to the rules you create.", + "genres": [ + "Utilities" + ], + "artistId": 1119328387, + "artistName": "Intrinsic Properties, LLC", + "price": 0.00, + "bundleId": "com.intrinsicproperties.Monitro", + "version": "1.0.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/d6/65/04/d66504d2-cde6-9e4f-539b-ed1cd6396003/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/81/b0/da/81b0da6c-f104-4c1f-6310-ed260f8001e1/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/88/16/d5/8816d503-8827-169a-e5ee-604b2fc08ea4/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/5f/7d/f5/5f7df55b-0660-0efc-087c-8940fa6db518/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/55/55/32/55553228-0460-37bd-92ed-4631c52e9583/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/f1/81/0a/f1810a36-68e2-fd1b-31dd-a9f1db88b344/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/f1/81/0a/f1810a36-68e2-fd1b-31dd-a9f1db88b344/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/f1/81/0a/f1810a36-68e2-fd1b-31dd-a9f1db88b344/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/vm-mobile-team/id646128457?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1421835215, + "trackName": "Checkers ◦", + "releaseDate": "2018-08-09T06:24:05Z", + "genreIds": [ + "6014", + "7004", + "7012" + ], + "formattedPrice": "$1.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.11", + "primaryGenreName": "Games", + "currentVersionReleaseDate": "2018-12-13T19:07:37Z", + "releaseNotes": "Bug fixes and performance improvements", + "primaryGenreId": 6014, + "sellerName": "VM Mobile Team", + "currency": "USD", + "trackCensoredName": "Checkers ◦", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "36743790", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/checkers/id1421835215?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Checkers is the timeless game which has delighted young and old alike for thousands of years. At the same time both simple and complex, it has survived despite the popularity of other game genres and is played by thousands of people. \n\nThis powerful app can be enjoyed with family and friends or on your own, and has different settings to suit your preferences. \n\nIts unique, uncluttered design gives the game a realistic look and feel, evoking memories of the checkers you used to play as a child, and thanks to its fast AI you will forget that you’re playing against a program.\n\nKey features:\n- Games against computer (4 levels, color option)\n- 2 players game with time limit\n- Nice look and feel\n- Undo\n- Save/load unfinished game\n- Timer based game\n\nYou will also gain experience points by winning against the AIs (+1 for Easy, +3 for Medium, +5 for Hard, +7 for Very Hard).\n\nA must have if you like strategic board games.", + "genres": [ + "Games", + "Board", + "Puzzle" + ], + "artistId": 646128457, + "artistName": "VM Mobile Team", + "price": 1.99, + "bundleId": "com.vm.osx.checkersus", + "version": "127", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/91/8f/e3/918fe3cc-f08b-910e-7cc8-e78fd2f700e1/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/4c/8a/88/4c8a884e-d6c2-4149-0064-aeafe9d05fb7/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/4c/8a/88/4c8a884e-d6c2-4149-0064-aeafe9d05fb7/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/4c/8a/88/4c8a884e-d6c2-4149-0064-aeafe9d05fb7/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/recursive-illusions/id1502073675?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1502073676, + "trackName": "Boss Alert", + "releaseDate": "2020-04-18T07:00:00Z", + "genreIds": [ + "6002", + "6007" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.14", + "primaryGenreName": "Utilities", + "currentVersionReleaseDate": "2020-04-22T03:57:16Z", + "releaseNotes": "Added a fix for SnapCamera.", + "primaryGenreId": 6002, + "sellerName": "Recursive Illusions LLP", + "currency": "USD", + "trackCensoredName": "Boss Alert", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "27606231", + "sellerUrl": "https://bossalert.app", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/boss-alert/id1502073676?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Boss Alert uses the webcam to detect if someone is standing behind you. The moment someone walks in behind you, it will automatically open a work related app (eg. Excel, Word). \n\n100% Privacy!\n\n- Boss Alert uses your webcam to keep a watch behind your back.\n- But rest assured, we don't store your video anywhere (Not even on your own device).\n- We don't collect or send any info about which apps or how long do you use them.\nIt will always be like this!", + "genres": [ + "Utilities", + "Productivity" + ], + "artistId": 1502073675, + "artistName": "Recursive Illusions", + "price": 0.00, + "bundleId": "com.recursiveillusions.bossalert", + "version": "1.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/81/55/c6/8155c614-6ddc-dd5b-ca40-bfa4689acb30/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/c2/4f/04/c24f0450-b95e-4807-07c8-0d1c27058401/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/aa/e6/24/aae624a4-989e-8cd5-c020-04188adf6dfc/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/db/a0/93/dba093b9-421d-d04c-f2d5-dccad85a7dfb/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/c4/4f/78/c44f7880-0400-313f-2b46-2bd366a41a8b/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/2c/01/05/2c0105a2-8fe5-7e47-fe89-64855de1cbb8/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/6a/3d/4b/6a3d4b7e-e567-4f8b-2db2-1a16ca35da12/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/94/99/15/949915ad-a4b1-47f6-66ab-11c2e3054897/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/7d/42/70/7d42703f-fa1b-8436-e8f6-9297c4e16138/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/fd/fe/d2fdfe77-3210-eae4-8454-d168935eb1cc/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/14/cd/6f/14cd6fac-4bdf-5344-da46-88fd95be187d/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/14/cd/6f/14cd6fac-4bdf-5344-da46-88fd95be187d/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/14/cd/6f/14cd6fac-4bdf-5344-da46-88fd95be187d/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/cogoo-inc/id951657514?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1447215756, + "trackName": "World of Mines!", + "releaseDate": "2018-12-22T12:12:25Z", + "genreIds": [ + "6014", + "7012", + "7004" + ], + "formattedPrice": "$1.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.5.0", + "primaryGenreName": "Games", + "currentVersionReleaseDate": "2019-11-01T01:33:07Z", + "releaseNotes": "- PMA Tournament System Open!!\n- Enjoy special nation package.(Spain, Korea, United Kingdom).", + "primaryGenreId": 6014, + "sellerName": "Cogoo Inc.", + "currency": "USD", + "trackCensoredName": "World of Mines!", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "36325933", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/world-of-mines/id1447215756?mt=12&uo=4", + "trackContentRating": "4+", + "description": "World of Mines is a classic, throwback PC game with a World Map twist. \nInspired by the original game written for many computing platforms since the 1960s. \n\nCOGOO INITIATIVE\nTeam Cogoo has created World of Mines as a small and humble campaign to help promote 2025 Completion Challenge and to raise awareness in our community. Whether you have 10 minutes, one hour, or plenty of time, you can help build a world free of land mines and promote the rights of landmine victims too! \n\nTHE WORLD IS STILL IN DANGER OF LANDMINES\nThe use of land mine is controversial because of their potential as indiscriminate weapons. They can remain dangerous many years after a conflict has ended, harming civilians and the economy. 78 countries are contaminated with land mines and 15000+ people are killed every year. Approximately 80% of land mine casualties are civilian, with children as the most affected age group. Most Killings occur in times of peace. \n\nIf you like old classic games such as chess, checkers, backgammon, solitaire, freecell as well as classic puzzle games like sudoku, tetris and crossword puzzles then this game is for you!\n\nGAME PLAY\n-Save the world from landmines by finding bombs\n-Easy to control \n-Best, smoothest, fastest interface of any Mines game\n-First tap luck\n-Flag Mode: Turn on flag mode to mark tiles you think are bombs quickly\n-177 Countries for hours of fun. (Countries and number of bombs don’t necessarily have a meaning)\n-Variety of map sizes and shapes\n\nHOW TO PLAY\nThe objective of the game is to clear a country map containing hidden “mines” or bombs without detonating any of them, with help from clues about the number or neighboring mines in each field. The player is initially presented with a world map. The Player can select and choose to play a specific country by touching the country on the map. The game is played by revealing squares of the grid by touching each square. If a square containing a mine is revealed, the player loses the game. If no mine is revealed, a digit is instead displayed in the square, indicating how many adjacent squares contains mines. If no mines are adjacent, the square becomes blank, and all adjacent squares will be recursively revealed. The player uses this information to deduce the contents of other squares, and may either safely reveal each square or mark the square as containing a mine. \n\nIf you love the game and care to provide feedback, please join our Facebook group and share you thoughts on future improvements.", + "genres": [ + "Games", + "Puzzle", + "Board" + ], + "artistId": 951657514, + "artistName": "Cogoo Inc.", + "price": 1.99, + "bundleId": "com.cogooland.minesweepermac", + "version": "1.9.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/fe/31/df/fe31df46-a337-8bec-d7e2-b40d2f555d8f/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/bf/0c/df/bf0cdff1-32bc-bbad-054f-58cd41dd1929/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/cf/c9/78/cfc978e8-f95b-0c23-3125-aeb0fdc74a85/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/cf/22/c5/cf22c5dd-3daf-0afa-0388-a3b1856a4ba8/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/fd/6c/a5/fd6ca5f4-2baa-cc0a-dd34-0962273a0307/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/3a/a4/5a/3aa45a85-b305-92b0-59dc-989aa078c24c/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/42/d4/f2/42d4f24e-3031-fb1e-33d6-9a2a6a866b52/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/9d/0d/c2/9d0dc254-4cb7-a464-f76a-4ea62d4d56ad/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/9d/0d/c2/9d0dc254-4cb7-a464-f76a-4ea62d4d56ad/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/9d/0d/c2/9d0dc254-4cb7-a464-f76a-4ea62d4d56ad/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/crystaly-k-k/id380628262?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1342613155, + "trackName": "Quetie for Qiita:Team", + "releaseDate": "2019-03-03T21:13:12Z", + "genreIds": [ + "6026", + "6007" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.13", + "primaryGenreName": "Developer Tools", + "currentVersionReleaseDate": "2019-03-04T00:11:47Z", + "releaseNotes": "- Refine default width of content list", + "primaryGenreId": 6026, + "sellerName": "CRYSTALY, K.K.", + "currency": "USD", + "trackCensoredName": "Quetie for Qiita:Team", + "languageCodesISO2A": [ + "EN", + "JA" + ], + "fileSizeBytes": "6666830", + "sellerUrl": "http://crystaly.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/quetie-for-qiita-team/id1342613155?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Quetie is Qiita:Team Viewer for Mac.\n\nOrganized Tags\n・Slash-separated tags will be displayed hierarchically. You can reach the target tags even if your team has many tags.\n\nSearch\n・Search with considering the high relevance and the newness of articles to reach the target.\n\nOpen Quickly\n・Just type a few letters to open articles, tags, and users quickly.\nEven if there are orthographical variants, it suggests some candidates.\n\nMultiple Teams\n・Quetie supports multiple teams so that you can switch teams quickly.\n\nDark Mode\n・It stands beautifully even in Dark Mode of macOS Mojave.\n\nDesigned exclusively for Mac.\n・Drop to Open\n・AirDrop\n・Sharing Menu\n・Touch Bar\n・Customize Toolbar\n・Drag & Drop\n・Keychain\n・Service Menu\n\n--------------------------------------------------\n\n【Subcription】\nQuetie requires a subscription. \n\nDuration and price of each subscription are displayed in Quetie’ storefront, updated at the time of purchase. Payment will be charged to iTunes account at confirmation of purchase. \n\nTerms of Use and Privacy Policy\nhttp://crystaly.com/terms\nhttp://crystaly.com/privacy", + "genres": [ + "Developer Tools", + "Productivity" + ], + "artistId": 380628262, + "artistName": "CRYSTALY, K.K.", + "price": 0.00, + "bundleId": "com.crystaly.qiity", + "version": "1.2.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/b2/01/17/b2011751-bd84-c2f9-b7aa-f7ff1eb39863/0e4f5b87-361b-4955-a49f-e45a2f92288f_Email_signature.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/86/49/13/86491346-1a25-fc2d-4eb6-56d207f6bdad/565c8234-7a2d-49f1-8d69-53447422e74a_simple_signature.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/34/91/05/34910508-058d-2ccc-05a3-142d4baa5d32/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/34/91/05/34910508-058d-2ccc-05a3-142d4baa5d32/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/34/91/05/34910508-058d-2ccc-05a3-142d4baa5d32/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/gilbert-philippe-andze-tsoungui/id1444832950?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1444833191, + "trackName": "Email Signature Generator", + "releaseDate": "2018-12-03T02:43:00Z", + "genreIds": [ + "6000" + ], + "formattedPrice": "$4.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10", + "primaryGenreName": "Business", + "currentVersionReleaseDate": "2020-08-04T19:08:35Z", + "releaseNotes": "-app resizing bug fixed\n-design improved\n-new email signature template", + "primaryGenreId": 6000, + "sellerName": "Gilbert Philippe Andze Tsoungui", + "currency": "USD", + "trackCensoredName": "Email Signature Generator", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "3344757", + "sellerUrl": "https://www.youtube.com/watch?v=7VNcde5-dCE&feature=youtu.be", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/email-signature-generator/id1444833191?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Building your HTML email signature is as simple as filling a form. It is super simple to use. If you have ever filled an online form, you know how to use this app.\n\nThe app has a simple way to build your email signature; you click your desired icon and then fill the form. \n\nThat how you do to fill your name, contact info, social media link ...\n\nYou can expect the HTML signature code generated by Email Signature Generator to work with all email clients", + "genres": [ + "Business" + ], + "artistId": 1444832950, + "artistName": "Gilbert Philippe Andze Tsoungui", + "price": 4.99, + "bundleId": "COM.GILBERT.Email-Signature", + "version": "2.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/51/2a/47/512a4708-fb83-e3ec-161a-eb2e8d3693cf/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/25/e7/12/25e71218-6b69-067a-5c4e-2651a9ce2862/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/1d/29/4e/1d294e20-0044-eec3-4cf4-807e81fc337c/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/d3/40/29/d3402954-39d9-3d9a-bec8-6efa55b695d6/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/ce/68/b0/ce68b073-4fb0-283e-b7c6-64e546e19681/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/ce/68/b0/ce68b073-4fb0-283e-b7c6-64e546e19681/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/ce/68/b0/ce68b073-4fb0-283e-b7c6-64e546e19681/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/health-science-inc/id1403957258?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1498500983, + "trackName": "LEON - a wellness app", + "releaseDate": "2020-04-16T07:00:00Z", + "genreIds": [ + "6013", + "6020" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.15", + "primaryGenreName": "Health & Fitness", + "currentVersionReleaseDate": "2020-04-16T18:51:42Z", + "primaryGenreId": 6013, + "sellerName": "HEALTH SCIENCE INC", + "currency": "USD", + "trackCensoredName": "LEON - a wellness app", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "3413634", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/leon-a-wellness-app/id1498500983?mt=12&uo=4", + "trackContentRating": "4+", + "description": "LEON gives you access to the best studios and gyms, health risk assessments, wellness recommendations, and a cutting edge gamification engine. Seamlessly book classes, buy memberships, and schedule events.\n\nIf your employer uses LEON, you can easily connect to receive your corporate wellness benefits.", + "genres": [ + "Health & Fitness", + "Medical" + ], + "artistId": 1403957258, + "artistName": "Health Science Inc", + "price": 0.00, + "bundleId": "maccatalyst.co.myleon.app", + "version": "1.6.4", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/0f/07/d9/0f07d94c-3abf-5551-300b-f707258e4a8d/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/f4/fd/d9/f4fdd9f6-c1ec-e6ff-eff0-15a95501d8ce/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/78/ef/26/78ef2601-6cf0-061a-406a-c9aafc728f78/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/19/97/f5/1997f51d-ac6a-bd59-73b7-40553031f5b6/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/0e/80/ef/0e80effc-877d-5f0e-0b0c-20fe888db831/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/0e/80/ef/0e80effc-877d-5f0e-0b0c-20fe888db831/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/0e/80/ef/0e80effc-877d-5f0e-0b0c-20fe888db831/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/vm-mobile-team/id646128457?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1409316060, + "trackName": "Chinese Chess Q", + "releaseDate": "2018-08-27T05:25:40Z", + "genreIds": [ + "6014", + "6016", + "7004", + "7012" + ], + "formattedPrice": "$1.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.11", + "primaryGenreName": "Games", + "currentVersionReleaseDate": "2018-09-28T22:28:16Z", + "releaseNotes": "Bug fixes and performance improvements", + "primaryGenreId": 6014, + "sellerName": "VM Mobile Team", + "currency": "USD", + "trackCensoredName": "Chinese Chess Q", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "38509169", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/chinese-chess-q/id1409316060?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Xiangqi (象棋) also called Chinese Chess, is a strategy board game for two players. It is one of the most popular board games in China and Vietnam, and is in the same family as Western (or international) chess. \n\nThe game represents a battle between two armies, with the object of capturing the enemy's general.\n\nChinese Chess Q brings this great game to your Mac. You can enjoy Chinese Chess in family game time, or you can also enjoy the game by playing with the AIs of varying difficulties. Beware that it is very challenging to beat the best AI in this game!\n\nYou will also gain experience points by winning against the AIs (+1 for Easy, +3 for Medium and +5 for Hard).\n\nFeatures:\n* Undo\n* Save/load unfinished game\n* AIs with 4 levels of difficulties\n* Timer based game", + "genres": [ + "Games", + "Entertainment", + "Board", + "Puzzle" + ], + "artistId": 646128457, + "artistName": "VM Mobile Team", + "price": 1.99, + "bundleId": "com.vm.osx.xiangqi", + "version": "120", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/8e/70/22/8e70229f-a046-3a96-60d0-9de4760d9e87/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/56/bc/02/56bc0215-09d3-e345-7ccb-6e7fb332f7b6/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/57/ee/09/57ee09ff-2a7e-96e0-dfbe-c7c47a0a386c/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/57/ee/09/57ee09ff-2a7e-96e0-dfbe-c7c47a0a386c/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/57/ee/09/57ee09ff-2a7e-96e0-dfbe-c7c47a0a386c/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/rene-rosendahl/id652634280?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1449437805, + "trackName": "TeamTimes", + "releaseDate": "2019-02-01T14:17:26Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "$2.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.13", + "primaryGenreName": "Productivity", + "currentVersionReleaseDate": "2019-04-21T19:04:14Z", + "releaseNotes": "- Meeting duration can now be selected\n- Ability to add contacts from your Mac address book\n- Data is saved automatically at a regular interval\n- Avatar/image can be removed\n- Fixes for sorting and column sizing and tabbing behavior\n- Email address is checked for valid format", + "primaryGenreId": 6007, + "sellerName": "Rene Rosendahl", + "currency": "USD", + "trackCensoredName": "TeamTimes", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "4049495", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/teamtimes/id1449437805?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Are you working with a distributed team? Trouble keeping track of everyone's time zone and scheduling meetings? TeamTimes can help!\n\n- Track all team members with locations.\n- See everyone’s contact info and local time.\n- Find times that work in everyone’s time zones.\n- Schedule meetings right from within the application.\n- Trigger emails to selected team members.\n- Add members right from your address book.", + "genres": [ + "Productivity", + "Business" + ], + "artistId": 652634280, + "artistName": "Rene Rosendahl", + "price": 2.99, + "bundleId": "Rene-Rosendahl.TeamTimes", + "version": "1.0.5", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/a5/11/35/a51135e3-c400-1129-0483-bd9a7cb3d54d/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/55/90/2a/55902aa9-7695-1499-7693-255f6e5343ff/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/55/90/2a/55902aa9-7695-1499-7693-255f6e5343ff/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/55/90/2a/55902aa9-7695-1499-7693-255f6e5343ff/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/naoki-ainoya/id1190031058?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1489576942, + "trackName": "Siro", + "releaseDate": "2019-12-01T08:00:00Z", + "genreIds": [ + "6007", + "6012" + ], + "formattedPrice": "Free", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.14", + "primaryGenreName": "Productivity", + "currentVersionReleaseDate": "2019-12-03T20:43:22Z", + "releaseNotes": "We added Japanese description to AppStore.", + "primaryGenreId": 6007, + "sellerName": "Naoki AINOYA", + "currency": "USD", + "trackCensoredName": "Siro", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "5220947", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/siro/id1489576942?mt=12&uo=4", + "trackContentRating": "4+", + "description": "## Configuration\n\nOn a settings window, please set channel name you'd like to post and your slack legacy token (slack bot token is also available, but message author is marked at bot apps name.) After that, press the save button, and then press message test button to test posting a message to slack\n\n## Usage\n\n- ctrl+shift+M: open a text window\n- write something as you like\n- command+enter: send the text to slack\n- Esc: close text window", + "genres": [ + "Productivity", + "Lifestyle" + ], + "artistId": 1190031058, + "artistName": "Naoki AINOYA", + "price": 0.00, + "bundleId": "io.ainoya.macos.siro", + "version": "0.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "supportedDevices": [ + "iPadMini4Cellular-iPadMini4Cellular", + "iPadPro-iPadPro", + "iPhone11ProMax-iPhone11ProMax", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPhone5s-iPhone5s", + "iPadSeventhGen-iPadSeventhGen", + "MacDesktop-MacDesktop", + "iPad611-iPad611", + "iPadAir2Cellular-iPadAir2Cellular", + "iPadMini4-iPadMini4", + "iPadPro97-iPadPro97", + "iPad74-iPad74", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadAir-iPadAir", + "iPad878-iPad878", + "iPadAirCellular-iPadAirCellular", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone11Pro-iPhone11Pro", + "iPadMini5-iPadMini5", + "iPadMini3Cellular-iPadMini3Cellular", + "iPhone6-iPhone6", + "iPadMini3-iPadMini3", + "iPad71-iPad71", + "iPadProSecondGen-iPadProSecondGen", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPadAir2-iPadAir2", + "iPhoneXR-iPhoneXR", + "iPhoneSE-iPhoneSE", + "iPadPro97Cellular-iPadPro97Cellular", + "iPad856-iPad856", + "iPadAir3-iPadAir3", + "iPad834-iPad834", + "iPad76-iPad76", + "iPhone8Plus-iPhone8Plus", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPhone11-iPhone11", + "iPadMiniRetina-iPadMiniRetina", + "iPad75-iPad75", + "iPadProCellular-iPadProCellular", + "iPhone8-iPhone8", + "iPhoneX-iPhoneX", + "iPad812-iPad812", + "iPhone7-iPhone7", + "iPhone6sPlus-iPhone6sPlus", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPadAir3Cellular-iPadAir3Cellular", + "iPhone6s-iPhone6s", + "iPhone6Plus-iPhone6Plus", + "iPad72-iPad72", + "iPhoneXS-iPhoneXS", + "iPhoneXSMax-iPhoneXSMax", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPad73-iPad73", + "iPadMini5Cellular-iPadMini5Cellular", + "iPad612-iPad612", + "iPhone7Plus-iPhone7Plus", + "iPadProFourthGen-iPadProFourthGen" + ], + "advisories": [], + "isGameCenterEnabled": false, + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/6c/19/e0/6c19e0ad-b983-24f9-c4e6-fb937e4b55f4/3074bff5-66df-4e13-86c3-71d626a03317_1.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/1e/99/c2/1e99c2a5-47b9-1ff5-b30f-808d057010a3/48f4f008-635a-444a-ab0e-dbfeec6ac190_2.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/20/6c/8e/206c8e5f-360b-0d93-4210-d120ff84fbd4/b083af8f-dd42-469e-b5cd-1b60ef7dbaf6_3.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/fb/69/0b/fb690b4d-b552-a176-065c-d04cf6fbbdb1/d74695d0-30cd-4328-b978-25f40f6d53ff_4.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/b0/cf/7f/b0cf7fa9-5c46-f4cd-34d9-6031d6f9138b/8acf8a3f-757f-48b8-83f1-eb4b4e18f87a_5.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/ba/0e/2c/ba0e2c5d-b498-e1e0-d6d7-d81997358097/85e28b81-8df2-4afe-905e-9eef2010da11_6.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/4e/71/b0/4e71b01d-b604-d77f-4d34-b1492c1df8c6/29e0061d-73b3-4e7c-b457-b974faf03061_1.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/90/f7/4b/90f74bc2-ceb5-8f8b-aaa3-07c344336209/c14ea6a7-fdc9-437a-9210-218e01b46584_2.png/552x414bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/c7/a0/e6/c7a0e66e-25b0-821f-5163-eeb677ed1bfd/40b3fc01-7cd9-4a39-9477-2f149c5344af_3.png/552x414bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/4c/1f/32/4c1f32e4-e12e-b630-5235-fed7cca6c81c/2561c659-ef81-4f78-a422-b387658fbe2a_4.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/3d/bf/b0/3dbfb05d-904f-8476-d18f-d8c5a3e1ec83/037bb39d-3998-4db5-895f-4094ff686c4e_5.png/552x414bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/c9/02/cd/c902cd7c-9102-1dec-2eb6-ec1fb88df078/source/60x60bb.jpg", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/c9/02/cd/c902cd7c-9102-1dec-2eb6-ec1fb88df078/source/512x512bb.jpg", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/c9/02/cd/c902cd7c-9102-1dec-2eb6-ec1fb88df078/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/enric-enrich/id857031188?uo=4", + "features": [ + "iosUniversal" + ], + "kind": "software", + "trackId": 1473469253, + "trackName": "Veern", + "releaseDate": "2019-12-18T08:00:00Z", + "genreIds": [ + "6002", + "6000" + ], + "formattedPrice": "$4.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "13.0", + "primaryGenreName": "Utilities", + "currentVersionReleaseDate": "2020-07-27T17:28:53Z", + "releaseNotes": "- You can now mark places as “favorite” to quickly find them in the “Favorites” screen.\n- Veern now also shows you the groups of the Twist teams that you added.", + "primaryGenreId": 6002, + "sellerName": "Enric Enrich", + "currency": "USD", + "trackCensoredName": "Veern", + "languageCodesISO2A": [ + "EN", + "ES" + ], + "fileSizeBytes": "14846976", + "sellerUrl": "https://veern.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 5, + "userRatingCountForCurrentVersion": 1, + "averageUserRating": 5, + "trackViewUrl": "https://apps.apple.com/us/app/veern/id1473469253?uo=4", + "trackContentRating": "4+", + "description": "Veern helps you connect with people around the world.\n\nVeern is divided in two main sections, “Places” and “Teams”:\n\nIn “Places” you can add as many cities as you want to be aware of their current time. If you are logged in to iCloud, all the cities that you add will be synced across your Apple devices.\n\nIn “Teams” you can add up to 10 teams from Twist and Slack. Veern will then fetch your teammates and show you their current time so you can easily schedule meetings or know if it’s the right time to ask them to jump into a video call.", + "genres": [ + "Utilities", + "Business" + ], + "artistId": 857031188, + "artistName": "Enric Enrich", + "price": 4.99, + "bundleId": "com.veern.Veern", + "version": "2020.4", + "wrapperType": "software", + "userRatingCount": 1 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple117/v4/16/0c/d4/160cd4c0-ddde-9f57-b83c-63d8ae3ac6c0/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/bf/b5/4c/bfb54c56-3299-1ce3-70f4-bb52ea9f917c/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/bf/b5/4c/bfb54c56-3299-1ce3-70f4-bb52ea9f917c/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/bf/b5/4c/bfb54c56-3299-1ce3-70f4-bb52ea9f917c/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/lei-liu/id1135200513?mt=12&uo=4", + "kind": "mac-software", + "trackId": 1230762386, + "trackName": "DaysPast", + "releaseDate": "2017-04-28T04:01:03Z", + "genreIds": [ + "6002", + "6007" + ], + "formattedPrice": "$0.99", + "isVppDeviceBasedLicensingEnabled": true, + "minimumOsVersion": "10.10", + "primaryGenreName": "Utilities", + "currentVersionReleaseDate": "2020-02-18T02:42:06Z", + "releaseNotes": "Update copyright info.", + "primaryGenreId": 6002, + "sellerName": "Lei Liu", + "currency": "USD", + "trackCensoredName": "DaysPast", + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "1035846", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/dayspast/id1230762386?mt=12&uo=4", + "trackContentRating": "4+", + "description": "A utility application to show how days pass in year/month.\n\nApp Features: \n- Several styles to choose, also support customized one.\n- Many ways to notify, including date change, Macs wakes up, etc. \n\nWe would love your feedback and comments. Let us know how did you like DaysPast and what changes you want to see in the upcoming updates. We would appreciate it very much.", + "genres": [ + "Utilities", + "Productivity" + ], + "artistId": 1135200513, + "artistName": "Lei Liu", + "price": 0.99, + "bundleId": "com.100hps.dayspast.mas", + "version": "1.0.6", + "wrapperType": "software", + "userRatingCount": 0 + } ] -} + } diff --git a/MasKitTests/JSON/search/things-3.json b/MasKitTests/JSON/search/things-3.json new file mode 100644 index 000000000..348f9246b --- /dev/null +++ b/MasKitTests/JSON/search/things-3.json @@ -0,0 +1,891 @@ +{ + "resultCount": 11, + "results": [ + { + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/69/3b/12/693b12e6-67d5-8252-7607-3438e420bbaa/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/69/3b/12/693b12e6-67d5-8252-7607-3438e420bbaa/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/69/3b/12/693b12e6-67d5-8252-7607-3438e420bbaa/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/cultured-code-gmbh-co-kg/id284971784?mt=12&uo=4", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/6f/4c/e5/6f4ce5d6-7caa-d1eb-bbc9-86558e97d2ba/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/92/b4/f8/92b4f8f5-f133-abd8-db17-135ac27bb1fa/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/72/63/63/726363b9-45ff-f93e-975c-fb69836eaf1a/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/29/fa/63/29fa63e3-3cb2-8b8a-8541-31fa9b7ef27f/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/da/17/5f/da175f95-c2cd-e5df-8cbc-d800d6770c64/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/f1/82/37/f182376c-4f25-6dbb-c6a8-5e6c1c617620/pr_source.png/800x500bb.jpg" + ], + "kind": "mac-software", + "formattedPrice": "$49.99", + "trackId": 904280696, + "trackName": "Things 3", + "primaryGenreName": "Productivity", + "primaryGenreId": 6007, + "minimumOsVersion": "10.13.0", + "sellerName": "Cultured Code GmbH & Co. KG", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2017-05-18T16:42:04Z", + "genreIds": [ + "6007", + "6000" + ], + "releaseNotes": "• Moved the database file to a new location (now at /Library/Group Containers/).\n• Increased the clickable area of items in the sidebar.\n• Improved the formatting of years in Japanese.\n• Fixed some crashes that could occur when hitting Cmd+[ or ] in Quick Entry while the When popover was visible.\n• Updated the crash reporter.\n• Some sync improvements.\n\n\nNEW IN 3.12\n\nWe’re excited to release Things 3.12 – a big update for our Watch app!\n\nWe’ve entirely rebuilt its foundation to allow it to sync and operate without your phone being nearby. We’ve also taken this opportunity to add some often-requested features to the app. For more information about this release, please visit our blog: thingsapp.com\n\nThere are no huge changes in this release for Mac, but there’s one great new feature you should know about: you can now edit the Tags or Deadlines of collapsed to-dos – even for multiple to-dos at once – by hitting Cmd+Shift+T or D. It’s super convenient :)", + "currentVersionReleaseDate": "2020-08-04T07:57:44Z", + "trackCensoredName": "Things 3", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "RU", + "ZH", + "ES", + "ZH" + ], + "fileSizeBytes": "17474797", + "sellerUrl": "https://culturedcode.com/things/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/things-3/id904280696?mt=12&uo=4", + "trackContentRating": "4+", + "version": "3.12.6", + "wrapperType": "software", + "currency": "USD", + "price": 49.99, + "artistId": 284971784, + "artistName": "Cultured Code GmbH & Co. KG", + "genres": [ + "Productivity", + "Business" + ], + "description": "Get things done! The award-winning Things app helps you plan your day, manage your projects, and make real progress toward your goals.\n\nBest of all, it’s easy to use. Within the hour, you’ll have everything off your mind and neatly organized—from routine tasks to your biggest life goals—and you can start focusing on what matters today.\n\n“Things offers the best combination of design and functionality of any app we tested, with nearly all the features of other power user applications and a delightful interface that never gets in the way of your work.”\n—Wirecutter, The New York Times\n\n\nKEY FEATURES\n\n• Your To-Dos\nYour basic building block is the almighty To-Do—each a small step toward a great accomplishment. You can add notes, tag it, schedule it, and break it down into smaller steps.\n\n• Your Projects\nCreate a Project for any big goal, then add the to-dos to reach it. Use headings to structure your list as you outline your plan. There’s also a place to jot down your notes, and a deadline to keep you on schedule.\n\n• Your Areas\nCreate an Area for each sphere of your life, such as Work, Family, Finance, and so on. This keeps everything neatly organized, and helps you see the big picture as you set your plans in motion.\n\n• Your Plan\nEverything on your schedule is neatly laid out in the Today and Upcoming lists, which show your to-dos and calendar events. Each morning, see what you planned for Today and decide what you want to do. The rest is down to you :)\n\n\nMORE THINGS TO LOVE\n\nAs you dive deeper, you’ll find Things packed with helpful features. Here are just a few:\n\n• Reminders — set a time and Things will remind you.\n• Repeaters — automatically repeat to-dos on a schedule you set.\n• This Evening — a special place for your evening plans.\n• Calendar integration — see your events and to-dos together.\n• Tags — categorize your to-dos and quickly filter lists.\n• Quick Entry — create to-dos from anywhere, as soon as the thought hits you.\n• Quick Find — instantly locate to-dos, headings, or tags.\n• Type Travel — jump from list to list with your keyboard; just start typing!\n• Mail to Things — forward an email to Things; now it’s a to-do.\n• And much more!\n\n\nMADE FOR MAC\n\nThings is tailored to the Mac with deep system integrations as well. A great example is Quick Entry with Autofill: a shortcut that grabs content from other apps and adds it to Things for you, such as a link to a website or an email you want to get back to.\n\nYou can also enjoy a beautiful dark mode at sunset, connect your calendars, enable a Things widget, use your Mac’s Touch Bar, import from Reminders—Things can do it all! There’s even AppleScript support if you need powerful automation.\n\n\nSTAY PRODUCTIVE ON THE GO\n\nThings has full-featured apps for iPhone, iPad, and Apple Watch as well (sold separately). All your devices sync seamlessly via our free Things Cloud service. It’s great to have everything at your fingertips when you need it!\n\n\nAWARD-WINNING DESIGN\n\nMade in Stuttgart, with two Apple Design Awards to its name, Things is a fine example of German engineering: designed, not only to look fantastic, but to be perfectly functional as well. Every detail is thoughtfully considered, then polished to perfection.\n\n“It’s like the unicorn of productivity tools: deep enough for serious work, surprisingly easy to use, and gorgeous enough to enjoy staring at.”\n—Apple\n\n\nGET THINGS TODAY\n\nWhatever it is you want to accomplish in life, Things can help you get there. Install the app today and see what you can do!\n\nVisit our website now and get a free 15-day trial for your Mac: thingsapp.com\n\nIf you have any questions, please get in touch. We provide professional support and will be glad to help you!", + "bundleId": "com.culturedcode.ThingsMac", + "userRatingCount": 0 + }, + { + "supportedDevices": [ + "iPadAir2-iPadAir2", + "iPadProFourthGen-iPadProFourthGen", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMini5-iPadMini5", + "iPhone6Plus-iPhone6Plus", + "iPadAir2Cellular-iPadAir2Cellular", + "iPadMini5Cellular-iPadMini5Cellular", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone11-iPhone11", + "iPhoneXS-iPhoneXS", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPad73-iPad73", + "iPad812-iPad812", + "iPhone11ProMax-iPhone11ProMax", + "iPadSeventhGen-iPadSeventhGen", + "iPadAir3-iPadAir3", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPad856-iPad856", + "iPad71-iPad71", + "Watch4-Watch4", + "iPadPro97Cellular-iPadPro97Cellular", + "iPhoneSE-iPhoneSE", + "iPhone8-iPhone8", + "iPad834-iPad834", + "iPhone11Pro-iPhone11Pro", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadMiniRetina-iPadMiniRetina", + "iPadMini3Cellular-iPadMini3Cellular", + "iPad74-iPad74", + "iPadProSecondGen-iPadProSecondGen", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPhoneXR-iPhoneXR", + "iPhoneXSMax-iPhoneXSMax", + "iPadProCellular-iPadProCellular", + "iPhone7-iPhone7", + "iPadPro97-iPadPro97", + "iPhoneX-iPhoneX", + "iPhone6-iPhone6", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPad76-iPad76", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone5s-iPhone5s", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadMini4-iPadMini4", + "MacDesktop-MacDesktop", + "iPhone6sPlus-iPhone6sPlus", + "iPad72-iPad72", + "iPhone6s-iPhone6s", + "iPadMini3-iPadMini3", + "iPadPro-iPadPro", + "iPad611-iPad611", + "iPad878-iPad878", + "iPadAir-iPadAir", + "iPad612-iPad612", + "iPad75-iPad75", + "iPadAirCellular-iPadAirCellular", + "iPhone7Plus-iPhone7Plus", + "iPhone8Plus-iPhone8Plus" + ], + "advisories": [], + "isGameCenterEnabled": true, + "ipadScreenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/43/19/bb/4319bb4b-5700-0f6b-2c19-7bd386bf186c/pr_source.jpg/552x414bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/5d/51/1a/5d511a30-7fab-fd18-6967-c0caf9674d55/pr_source.jpg/552x414bb.jpg" + ], + "appletvScreenshotUrls": [], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/42/50/53/425053d8-2b26-c28a-72db-40323cc62aeb/source/60x60bb.jpg", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/42/50/53/425053d8-2b26-c28a-72db-40323cc62aeb/source/512x512bb.jpg", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/42/50/53/425053d8-2b26-c28a-72db-40323cc62aeb/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/kevin-reutter/id1273424431?uo=4", + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/95/33/5f/95335f94-26d3-3567-93ac-77d60ab821dd/pr_source.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/03/53/b9/0353b9b1-ef2a-7ff1-a1b8-4124867af41b/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/ef/63/ce/ef63ce41-371a-2508-b101-fb99e9c7758f/pr_source.png/392x696bb.png" + ], + "kind": "software", + "features": [ + "gameCenter", + "iosUniversal" + ], + "formattedPrice": "Free", + "trackId": 1289070327, + "trackName": "Planny 3 - Smart To Do List", + "primaryGenreName": "Productivity", + "primaryGenreId": 6007, + "minimumOsVersion": "13.0", + "sellerName": "Kevin Reutter", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2017-10-13T19:16:40Z", + "genreIds": [ + "6007", + "6002" + ], + "releaseNotes": "Stay tuned! Planny 4 ships in a few week and will be a free update with many great features!\n\n• SwiftUI \nNow Planny uses SwiftUI in some parts of the app. SwiftUI is an innovative, exceptionally simple way to build user interfaces across all Apple platforms with the power of Swift. Over time more and more of the app will be created with SwiftUI to avoid crashes and improve performance. \n\n• Advanced Cursor Support\nWhen using a Trackpad on iPadOS or on the Mac, specific Elements become larger when you come closer to make clicking easier\n\n• Alternative App icons\nChoose the icon color you’d like in settings (iOS for iPhone only)\n\n• New Onboarding Experience\nA new tutorial shows the key features \n\n• New Purchase View\nThe purchase view is now much simpler. Feel free to subscribe :) \n\n• Fixed deadlines on macOS\n• Direct Deadlines now support days and time \n• Fixed issues with overdue tasks \n\nDo you have any wishes for Planny 4? Feel free to submit ideas on the website!", + "currentVersionReleaseDate": "2020-07-30T17:37:31Z", + "trackCensoredName": "Planny 3 - Smart To Do List", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "RU", + "ZH", + "ES", + "TR" + ], + "fileSizeBytes": "47687680", + "sellerUrl": "https://www.kevinreutter.de/planny-3/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 4.3897300000000001318767317570745944976806640625, + "userRatingCountForCurrentVersion": 331, + "averageUserRating": 4.3897300000000001318767317570745944976806640625, + "trackViewUrl": "https://apps.apple.com/us/app/planny-3-smart-to-do-list/id1289070327?uo=4", + "trackContentRating": "4+", + "version": "3.4.2", + "wrapperType": "software", + "currency": "USD", + "price": 0.00, + "artistId": 1273424431, + "artistName": "Kevin Reutter", + "genres": [ + "Productivity", + "Utilities" + ], + "description": "++ Planny was part of Apples favorite Apps from October ++\n\nPlanny is all new and has been rethought from the ground up.\n\nPlanny is your new friend helping you to be more productive. Planny learned everything important from common to do list apps but combines them with intelligence and gamification. In the morning and during the day Planny intelligently recommends tasks and also reminds you if you tend to forget them. You earn productivity points for adding and completing tasks, and also lose them if you shift tasks or forget them. Users can compare their productivity with friends over the week. \n\nPlanny also features all the important features like deadlines, lists / projects, tagging, location based reminders, notes and attachments, routines and more. \n\nKey features\n• Daily list to focus on today's tasks\n• Assistant for creating a productive daily plan\n• Daily review of the last day\n• Routines to train your habits\n• Deadlines and reminders\n• Smart reminders if you tend to forget your tasks\n• Notes for your tasks\n• Weekly productivity ranking of your contacts\n• Rewards\n• Dark mode\n• Lists\n• Siri support\n• Advanced Apple Watch app\n\nPlanny Premium offers additional features like:\n• Calendar view\n• Teamwork with your friends\n• Add Photos from your library to tasks\n• Add Photos from your camera to tasks\n• Location based reminders\n• iCloud sync\n• iCloud backup \n• FaceID Unlock\n• More than 2 lists\n• Printing\n• Sketches\n• Review your recent days\n• Tagging\n\n+++ Planny Premium - Unlock all features and use Planny on iPhone, iPad and Apple Watch (Mac soon) - And get free feature updates over time! +++ \n\nA Planny Premium subscription unlocks all features. Note that iCloud features require an iCloud-Account. \n\nPlanny offers two auto-renewing subscriptions\n\nPremium 3 Months\n$6,99 / 3 Months (may differ in your country & currency)\n\nPremium Annual\n$19,99 / Year (may differ in your country & currency)\n\nPayment will be charged to iTunes Account at confirmation of purchase\nSubscription automatically renews unless auto-renew is turned off at least 24-hours before the end of the current period\nAccount will be charged for renewal within 24-hours prior to the end of the current period, and identify the cost of the renewal\n\nSubscriptions may be managed by the user and auto-renewal may be turned off by going to the user's Account Settings after purchase\n\nWhen your subscription is cancelled and expires, all the features of Planny Pro won't be available any longer. Any unused portion of a free trial period, if offered, will be forfeited when the user purchases a subscription to that publication, where applicable.\n\nPrivacy policy for Planny: http://kevinreutter.de/privacy\nTerms of use / Conditions: http://kevinreutter.de/privacy", + "bundleId": "com.kevinreutter.Callisto", + "userRatingCount": 331 + }, + { + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/71/6f/f0/716ff030-f8ec-536c-41ca-f5116ae1f497/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/71/6f/f0/716ff030-f8ec-536c-41ca-f5116ae1f497/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/71/6f/f0/716ff030-f8ec-536c-41ca-f5116ae1f497/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/the-omni-group/id281731738?mt=12&uo=4", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/a8/e9/42/a8e942ec-8eea-03b3-ea37-cc6e2837fb5e/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/5f/62/5c/5f625c38-c559-3b8d-5042-94e241735ef1/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/aa/a1/e7/aaa1e746-e660-2b6e-6833-d751e7879752/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/c0/6f/7d/c06f7de4-17b9-7475-8778-22a97c13cdce/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/84/3d/8d/843d8de0-6257-7bf0-6a66-6f3ce41af803/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/ad/0d/28/ad0d28c6-ff1d-c394-266a-fdff0b8e9cc6/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/36/28/a3/3628a3e9-6073-0ce4-17d7-9d9a5f479c64/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/a9/ac/b9/a9acb983-76e2-d76d-fbc8-c35388dcee48/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/8f/41/90/8f4190f5-ebb8-370b-c8a6-afb47c56140d/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/09/37/83/09378396-de11-2185-24f4-360be20dbcac/pr_source.png/800x500bb.jpg" + ], + "kind": "mac-software", + "formattedPrice": "Free", + "trackId": 1346203938, + "trackName": "OmniFocus 3", + "primaryGenreName": "Productivity", + "primaryGenreId": 6007, + "minimumOsVersion": "10.14", + "sellerName": "The Omni Group", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2018-09-24T12:28:36Z", + "genreIds": [ + "6007", + "6000" + ], + "releaseNotes": "OmniFocus 3.9.2 is a minor update focused on bug fixes.\n\n• Omni Automation — OmniFocus now recognizes simple plug-ins that use the .omnifocusjs file extention.\n• First Run — Improved reliability of the first run flow.\n• Notice Bar — Fixed bugs related to the Trial Mode & Free Viewer notice bars.\n\nIf you have any feedback or questions, we’d love to hear from you! The Omni Group offers free tech support; you can email omnifocus@omnigroup.com, call 1–800–315–6664 or 1–206–523–4152, or tweet @OmniFocus.\n\nIf OmniFocus empowers you, we would appreciate an App Store review. Your review will help other people find OmniFocus and make them more productive too.", + "currentVersionReleaseDate": "2020-08-27T17:54:49Z", + "trackCensoredName": "OmniFocus 3", + "languageCodesISO2A": [ + "NL", + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "64931473", + "sellerUrl": "https://www.omnigroup.com/omnifocus/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/omnifocus-3/id1346203938?mt=12&uo=4", + "trackContentRating": "4+", + "version": "3.9.2", + "wrapperType": "software", + "currency": "USD", + "price": 0.00, + "artistId": 281731738, + "artistName": "The Omni Group", + "genres": [ + "Productivity", + "Business" + ], + "description": "Two-week free trial! OmniFocus Standard and Pro are in-app purchases, with discounts for people who bought earlier versions of OmniFocus for Mac through the Mac App Store. Or you can get OmniFocus for iOS, Mac, and web for just one price with the OmniFocus Subscription. Download the app for details.\n\nUse OmniFocus to accomplish more every day. Create projects and tasks, organize them with tags, focus on what you can do right now — and get stuff done.\n\nOmniFocus — now celebrating 10 years as the trusted, gold-standard to-do list app — brings unrivaled power and flexibility to your Mac, making it easy to work the way you want to work.\n\nOmniFocus manages everything in your busy life. Use projects to organize tasks naturally, and then add tags to organize across projects. Easily enter tasks when you’re on the go, and process them when you have time. Tap the Forecast view — which shows both tasks and calendar events — to get a handle on your day. Use the Review perspective to keep your projects and tasks on track.\n\nThen let our free syncing system make sure your data is the same on every Mac. (And on OmniFocus for iOS and Web, available separately.) Because your data is encrypted, it’s safe in the cloud.\n\nSTANDARD FEATURES (VIA IN-APP PURCHASE)\n\n• NEW: Tags add a powerful additional organizing tool. Create tags for people, energy levels, priorities, locations, and more.\n• NEW: The Forecast view shows your tasks and calendar events in order, so you can better see what’s coming up in your day.\n• NEW: Enhanced repeating tasks are easier than ever to set up — and they work with real-world examples such as the first weekday of the month.\n• NEW: The Modern, fresh-but-familiar design helps you focus on your content.\n• Inbox is where you quickly add tasks — save them when you think of them, and organize them later.\n• Syncing supports end-to-end encryption so that your data is safe wherever it’s stored, on our server or yours.\n• Notes can be attached to your tasks, so you have all the information you need.\n• Attachments — graphics, video, audio, whatever you want — add richness to your tasks.\n• View Options let you customize each perspective by deciding what it should show and how it should filter your tasks.\n• The Review perspective takes you through your projects and tasks — so you stay on track.\n• OmniFocus Mail Drop adds tasks via email and works with services like IFTTT and Zapier (if you’re using our free syncing server).\n• The Today Widget shows you your most important items — you don’t even have to switch to the app to know what’s up.\n• Support for TaskPaper Text and omnifocus:///add and /paste lets you automate using URLs.\n\nPro features make OmniFocus even more powerful:\n\nPRO FEATURES (VIA IN-APP PURCHASE)\n\n• Custom perspectives help you create new ways to see your data by filtering and grouping projects and tags. NEW: The filtering rules are simpler to use while being more powerful than ever, letting you combine rules with “all,” “any,” and “none.” You can also choose any image to use as your custom perspective’s icon, and a custom tint color to go with it.\n• NEW: Today’s Forecast can include items with a specific tag, and you can reorder those tasks however you choose, so you can plan your day better.\n• The customizable sidebar lets you organize your perspectives the way you want to, for super-fast access.\n• The Today Widget shows a perspective of your choice in Notification Center.\n• AppleScript support opens up a world of automation, using Apple’s Mac scripting language.\n\nDownload OmniFocus right now and start your free trial! The app includes a manual, and there’s plenty more documentation on the website.\n\nSUPPORT\n\nIf you have feedback or questions, our Support Humans would love to hear from you! Send email to omnifocus@omnigroup.com, call us at at 1-800-315-6664 or +1-206-523-4152, or reach us on Twitter at @omnifocus.\n\n\nSubscription Terms of Service: https://www.omnigroup.com/legal", + "bundleId": "com.omnigroup.OmniFocus3.MacAppStore", + "userRatingCount": 0 + }, + { + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/e9/3d/96/e93d964a-d5c2-9020-c2cc-f15dd5a2d309/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/e9/3d/96/e93d964a-d5c2-9020-c2cc-f15dd5a2d309/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/e9/3d/96/e93d964a-d5c2-9020-c2cc-f15dd5a2d309/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/ciarlo-software-llc/id1066322955?mt=12&uo=4", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/b5/d0/e0/b5d0e04e-380a-19e7-e1ea-42d9090306a2/22518e83-8e14-495b-b780-843bb635a853_Desktop_01.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/99/03/09/990309a8-f057-8553-aaf6-9289dfa6cdec/ad0253ed-cdb3-4202-9afd-656f9b574d7d_Desktop_02.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/13/3a/5f/133a5f6c-d302-9af7-0859-d82f9cee2330/5b80f3aa-8722-414c-a621-58a97cf82103_Desktop_03.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/05/aa/6b/05aa6b80-9dbb-4968-9444-874cb9583fc7/de77889b-3f4d-438b-adb8-4c6bb715d6df_Desktop_04.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/86/c3/d7/86c3d72b-6e29-bc68-729c-7e0bc29290cb/668c81b6-a7db-402d-a036-e31bb109ffc7_Desktop_05.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/17/b8/c3/17b8c3bc-ab5b-6532-e59e-c804f70f40ad/f802848c-264f-4cbb-a322-a699dd0b69c2_Desktop_06.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/82/7b/5a/827b5acc-ea24-4ffc-ad2d-f008131dbedc/9d573032-de53-4221-b1d9-9195c845d6c9_Desktop_07.png/800x500bb.jpg" + ], + "kind": "mac-software", + "formattedPrice": "$9.99", + "trackId": 1515371334, + "trackName": "Doo 3: Get Things Done", + "primaryGenreName": "Productivity", + "primaryGenreId": 6007, + "minimumOsVersion": "10.14", + "sellerName": "Ciarlo Software, LLC", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2020-08-25T07:00:00Z", + "genreIds": [ + "6007" + ], + "releaseNotes": "Fixes a bug that prevented scrolling of tasks", + "currentVersionReleaseDate": "2020-08-29T18:17:38Z", + "trackCensoredName": "Doo 3: Get Things Done", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "PT", + "ZH", + "ES", + "ZH" + ], + "fileSizeBytes": "3021396", + "sellerUrl": "https://www.getdooapp.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/doo-3-get-things-done/id1515371334?mt=12&uo=4", + "trackContentRating": "4+", + "version": "3.0.2", + "wrapperType": "software", + "currency": "USD", + "price": 9.99, + "artistId": 1066322955, + "artistName": "Ciarlo Software, LLC", + "genres": [ + "Productivity" + ], + "description": "Doo is a simple way to be more productive. Create a card for each of your tasks. The best cards are easy to start and have a clear goal. Pick a few tasks each day and snooze the rest. Doo helps you build consistent, sustainable habits that keep you focused. Over time, your completed cards become finished projects, without the stress and anxiety of an endless list.\n\nFEATURE HIGHLIGHTS\n• Be more productive with a unique, card-based interface\n• Separate cards into custom groups\n• Create open-ended, calendar, or location-based tasks\n• Create tasks within other apps with the share extension\n• Schedule tasks with custom intervals and alerts\n• Sync with iCloud across iOS and Mac devices\n• Collaborate on tasks with other Doo users (requires iCloud)\n• View upcoming tasks with the Doo Widget\n• Complete or snooze tasks from notifications\n• Run Doo from the dock or menu bar", + "bundleId": "com.mciarlo.Everyminder.CiarloMacDoo3", + "userRatingCount": 0 + }, + { + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple62/v4/a1/d0/12/a1d012c4-8ece-c61a-e6e7-4a27a3d740fa/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple62/v4/a1/d0/12/a1d012c4-8ece-c61a-e6e7-4a27a3d740fa/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple62/v4/a1/d0/12/a1d012c4-8ece-c61a-e6e7-4a27a3d740fa/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/explain-3d/id1019479194?mt=12&uo=4", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple69/v4/24/cb/ac/24cbac33-03a6-c33c-3c7e-f1d3acff2d74/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple69/v4/e8/08/8f/e8088f7d-c688-7663-b738-efd7b64ce6ad/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple69/v4/f2/c3/32/f2c3323c-db7a-5015-5a36-8cb4ee8d6d5d/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple49/v4/be/98/fd/be98fd4a-75e9-22e9-819b-c006d09badef/pr_source.png/800x500bb.jpg" + ], + "kind": "mac-software", + "formattedPrice": "$3.99", + "trackId": 1020146983, + "trackName": "Explain 3D How things work", + "primaryGenreName": "Education", + "primaryGenreId": 6017, + "minimumOsVersion": "10.6.6", + "sellerName": "ePic design s.r.o.", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2015-07-30T05:32:31Z", + "genreIds": [ + "6017", + "6014", + "7015" + ], + "releaseNotes": "- added settings so you can adjust move, rotation and zoom speed\n- small performance fixes", + "currentVersionReleaseDate": "2016-09-03T02:14:31Z", + "trackCensoredName": "Explain 3D How things work", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "90413684", + "sellerUrl": "http://explain3d.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/explain-3d-how-things-work/id1020146983?mt=12&uo=4", + "trackContentRating": "4+", + "version": "2.4", + "wrapperType": "software", + "currency": "USD", + "price": 3.99, + "artistId": 1019479194, + "artistName": "Explain 3D", + "genres": [ + "Education", + "Games", + "Simulation" + ], + "description": "Explain3D success:\n***TOP 25 GEW - Global start up competition finalist 2013 (http://www.cnbc.com/id/101168347/page/6)***\n\nSimulations:\n- Car workshop - 4 stroke engine, Car clutch, Manual transmission, Disc brakes, Ignition system\n- Discover the Universe - ISS space station, Space shuttle, Solar system\n- Electricity around us - Hydroelectric dam, Wind turbine, Nuclear power plant\n- Transport simulations - Railroad switch, Submarine, Jet engine\n- Our homes - Lock and key, Elevator, Toilet, Desk Lamp\n- Tools - Jackhammer, Hand pump\n\nExplain3D is system of interactive simulations, that can help you to explain, how things work. Simulations are built in interactive 3D environment, which brings fun to education and helps understand the stuff. \n\nFeatures:\n- Interactive 3D environment\n- simple and intuitive interface\n- description of main parts of simulations / objects\n- nice 3D models and animations\n- great to make education more engaging and interesting", + "bundleId": "com.Explain3D.HowThingsWork", + "userRatingCount": 0 + }, + { + "supportedDevices": [ + "iPadAir2-iPadAir2", + "iPadProFourthGen-iPadProFourthGen", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMini5-iPadMini5", + "iPhone6Plus-iPhone6Plus", + "iPadAir2Cellular-iPadAir2Cellular", + "iPadMini5Cellular-iPadMini5Cellular", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone11-iPhone11", + "iPhoneXS-iPhoneXS", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPad73-iPad73", + "iPad812-iPad812", + "iPhone11ProMax-iPhone11ProMax", + "iPadSeventhGen-iPadSeventhGen", + "iPadAir3-iPadAir3", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPad856-iPad856", + "iPad71-iPad71", + "iPadPro97Cellular-iPadPro97Cellular", + "iPhoneSE-iPhoneSE", + "iPhone8-iPhone8", + "iPad834-iPad834", + "iPhone11Pro-iPhone11Pro", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadMiniRetina-iPadMiniRetina", + "iPadMini3Cellular-iPadMini3Cellular", + "iPad74-iPad74", + "iPadProSecondGen-iPadProSecondGen", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPhoneXR-iPhoneXR", + "iPhoneXSMax-iPhoneXSMax", + "iPadProCellular-iPadProCellular", + "iPhone7-iPhone7", + "iPadPro97-iPadPro97", + "iPhoneX-iPhoneX", + "iPhone6-iPhone6", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPad76-iPad76", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone5s-iPhone5s", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadMini4-iPadMini4", + "MacDesktop-MacDesktop", + "iPhone6sPlus-iPhone6sPlus", + "iPad72-iPad72", + "iPhone6s-iPhone6s", + "iPadMini3-iPadMini3", + "iPadPro-iPadPro", + "iPad611-iPad611", + "iPad878-iPad878", + "iPadAir-iPadAir", + "iPad612-iPad612", + "iPad75-iPad75", + "iPadAirCellular-iPadAirCellular", + "iPhone7Plus-iPhone7Plus", + "iPhone8Plus-iPhone8Plus" + ], + "advisories": [], + "isGameCenterEnabled": false, + "ipadScreenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/bd/50/cf/bd50cf55-97ad-adec-55ec-e43ed2f26b44/594b53a3-48bd-4745-a1a3-d6457e03a426_ipad-v-1.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/69/01/0b/69010bd8-f9ce-05a4-80ac-beba32694866/861e0887-e2d3-40fe-bfba-041ab513fd50_ipad-v-2.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/91/16/ea/9116eaaa-3ded-38b1-a4d8-e1d89313b031/c156ce19-989c-4f5b-93bc-a9307fa0a9be_ipad-v-3.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/4a/cf/42/4acf4251-f8da-bdea-724c-5384be8ddb87/fb9c1e3d-856a-4fa4-9314-ea7ae0f790b4_ipad-v-4.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/ca/39/35/ca393565-6225-5729-18d2-3ea2d23abc52/4d9c971d-6096-459e-9ee2-f0af77ff6bfb_ipad-v-5.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/bc/c0/82/bcc0822b-ce04-33ff-d9bd-2380477b52a0/7795ceea-43bf-41c6-828e-5bd91d6bf4e7_ipad-v-6.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/d4/62/8e/d4628ebd-2504-6506-1e60-637beda2fcbb/ae1d6142-b2a1-45e3-8a3d-30984c075daf_ipad-v-7.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/fa/d3/43/fad3436d-30c4-daff-dc10-5c7d4d5da752/f90faa3c-4351-43bc-be53-6da74403e829_ipad-v-8.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/63/e4/d0/63e4d099-5ba4-ac02-6ac6-c56969003f66/c46efc17-1b62-43a9-8974-0bede1a4766f_ipad-v-9.png/552x414bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d1/2d/6f/d12d6fc4-f740-0c2e-99bc-f69f897e1302/source/60x60bb.jpg", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d1/2d/6f/d12d6fc4-f740-0c2e-99bc-f69f897e1302/source/512x512bb.jpg", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d1/2d/6f/d12d6fc4-f740-0c2e-99bc-f69f897e1302/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/easylife-srls/id1459685996?uo=4", + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/0c/8f/c8/0c8fc884-c87a-7004-f44a-e3b333222e38/40f0748e-65b8-412e-b055-c74f457a8be7_i8-1.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/6d/12/99/6d12990d-2c4a-a09f-17a2-ab53b05004ba/91a4eb3f-6d59-480b-8926-a10b54dc200c_i8-2.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/cf/d0/76/cfd07658-e436-69be-dad1-f40a1d858855/97bc8ecd-7411-4eae-8a79-ccb18eecd5bf_i8-3.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/91/02/8a/91028ab6-979a-04ec-0e06-3cfc9957e754/33ef7be7-bd63-4d0e-a8e3-05bfed454285_i8-4.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/b9/a1/94/b9a194da-8062-7139-429a-c41336f46052/0a8e5d96-36ef-4e68-8460-060fb6532871_i8-5.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/83/91/27/8391279d-43e4-399b-373a-5ea2740da32b/0bd98917-79f5-436a-9e59-3aae11a966c4_i8-6.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/0b/8f/6e/0b8f6e54-2469-388c-6113-05e6c5a3692a/92d898e0-06ba-45b3-8ccd-3da8b20df8de_i8-7.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/5f/db/33/5fdb336c-82ed-fa17-a821-90027a51db67/8a478a41-3be5-4d73-a2aa-1e365a146e5f_i8-8.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/dd/9f/e4/dd9fe411-85c4-298b-60da-4b373ee5740c/05a10972-3a84-447c-9ea5-bf44268efefa_i8-9.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/25/2f/0c/252f0c7d-4c9f-d411-bf16-d415ecec293f/d1425972-f4d6-46d1-a868-f09a9f6572ef_i8-10.png/392x696bb.png" + ], + "kind": "software", + "features": [ + "iosUniversal" + ], + "formattedPrice": "Free", + "trackId": 1459685997, + "trackName": "easyPlanner 3 - Task manager", + "primaryGenreName": "Productivity", + "primaryGenreId": 6007, + "minimumOsVersion": "11.0", + "sellerName": "easyLife Srl Semplificata", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2019-04-30T21:02:33Z", + "genreIds": [ + "6007", + "6000" + ], + "releaseNotes": "Added \"Urgent\" quick button in task's page.\n\n• Fixed minor bugs.", + "currentVersionReleaseDate": "2020-08-25T19:35:33Z", + "trackCensoredName": "easyPlanner 3 - Task manager", + "languageCodesISO2A": [ + "EN", + "FR", + "IT", + "RU", + "ZH" + ], + "fileSizeBytes": "90359808", + "sellerUrl": "https://www.easylife.biz", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 4.888889999999999957935870043002068996429443359375, + "userRatingCountForCurrentVersion": 9, + "averageUserRating": 4.888889999999999957935870043002068996429443359375, + "trackViewUrl": "https://apps.apple.com/us/app/easyplanner-3-task-manager/id1459685997?uo=4", + "trackContentRating": "4+", + "version": "3.0.6", + "wrapperType": "software", + "currency": "USD", + "price": 0.00, + "artistId": 1459685996, + "artistName": "easyLife Srls", + "genres": [ + "Productivity", + "Business" + ], + "description": "easyPlanner is the innovative app that will manage for you the things to do using the tasks and projects and the things you need to remember using memos. You can manage your appointments and tasks on multiple levels (multi-levels) as your mind would! You can also monitor your progress with the Reports and see how productive you are. If you are not happy with what you are producing you can try to increase your productivity by using our FocusTimer, a tool that will allow you to maintain concentration and carry out more tasks simultaneously.\neasyPlanner aims to make your life easier and “to work” in place of your memory. Getting organized means having more free time for you and for those you love, dedicating the time you have saved to create unforgettable moments with the people of your life.\n\nMANAGE THE THINGS YOU HAVE TO DO AND THE THINGS YOU HAVE TO REMEMBER\u2028\n\nWe provide you tasks, projects and memos management in a single app.\n\nTASKS\n\neasyPlanner allows you to manage the “things you need to do” through our “Tasks”. Each task can contain infinite sub-tasks (multi-tasks) and can be grouped into folders. \n\nPROJECTS\n\nWhen a certain number of tasks are closely related to each other and they concern significant commitments, it is possible to manage them as a single project. Even the project, like the task, can contain infinite sub-tasks (multi-tasks).\n\nMEMOS\n\neasyPlanner allows you to manage the “things you need to remember” both in free format and in a structured format using memos.\n\nMONITOR YOUR REPETITIVE TASKS WITH REPORT\u2028\n\nThe \"Report\" function was born of the need to represent a set of complex data or complex tasks in the form of a table so that they can be printed and read more easily. Thanks to this function you will be able to graphically visualize a set of recurring tasks in a simple way and you will be able to monitor the progress of these tasks daily.\n\n\nINCREASE YOUR PRODUCTIVITY WITH FOCUS TIMER\n\nFocus Timer has been designed after a careful study based on several time management theories. It is a very advanced “time management” system which consists in dividing time into intervals, each of which is characterized by a task that you have to do. This division leads the subjects who use it to be much more efficient, to better manage their time and to constantly develop their mental abilities.\n\nAGENDA\n\u2028Thanks to the Agenda view easyPlanner will allow you to keep track of your schedule and your appointments at any time.\nAgenda will also integrate the Apple calendar. \nYou can add your events in the calendars directly from here in a practical and fast way.\nYou can decide which calendars to see and which to hide.\n\nICLOUD SYNC\n\nWith easyPlanner you can archive your photos, your documents, your tasks, etc. on ICloud and you can synchronize all your devices automatically and simultaneously. Regardless of the device you are using (IPhone or IPad), you will always have the latest version of your documents available.\n\nDELEGATE\n\nDelegate urgent tasks to other people by sharing them by email.\n\nAND SO MUCH MORE…\n\nYou will find out many more features trying our app or going to our website www.easyLife.biz/easyPlanner.\u2028\nCHOOSE THE VERSION THAT BEST SUITS YOU AND YOUR NEEDS\n\nTry easyPlanner – Task manager for free.\u2028You can use this version without time limits and in all its functions in order to appreciate all its features. However this version only allows 40 entries.\u2028If you start to get tight, upgrade to the easyPlanner – PRO version, available via in-app purchase or as a stand-alone version.\u2028easyPlanner – PRO Version allows you to get an unlimited number of entries, giving you the opportunity to always have everything you need with you and to take advantage of Reports over time. \nOne-time purchase. Without subscription. \n\nIf you have any question, any suggestions or if you want to tell us what you thing of easyPlanner you can contact us:\u2028\n\nwww.easylife.biz\nsupport@easylife.biz\n\nTerms of service: https://www.easylife.biz/terms/", + "bundleId": "com.easyPlanner", + "userRatingCount": 9 + }, + { + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/b5/12/3e/b5123ec8-9852-1200-2deb-8abf24007720/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/b5/12/3e/b5123ec8-9852-1200-2deb-8abf24007720/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/b5/12/3e/b5123ec8-9852-1200-2deb-8abf24007720/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/quizmine-com/id356028414?mt=12&uo=4", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple4/v4/7a/3f/6b/7a3f6b92-efce-f50e-1909-ab79d0e26499/mzl.hojyvtti.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple4/v4/9b/07/67/9b076790-a47c-9cbe-33bb-e87354d65050/mzl.wpoyvzzg.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple4/v4/2e/b2/8b/2eb28b72-312c-2102-2713-eede0117e375/mzl.xcblpeaz.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple4/v4/e1/bb/bd/e1bbbde6-929f-608a-ef7a-10337d528e9f/mzl.kaxvxemz.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple/v4/73/47/a2/7347a2e0-c436-cd11-bdd9-4c1f3497c7d5/mzl.dwwsmmlj.png/800x500bb.jpg" + ], + "kind": "mac-software", + "formattedPrice": "Free", + "trackId": 814960961, + "trackName": "Complete Grade 3 (Math, English and Science) - A simpleNeasyApp by WAGmob", + "primaryGenreName": "Education", + "primaryGenreId": 6017, + "minimumOsVersion": "10.7", + "sellerName": "Pollmine.Com", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2014-02-11T21:58:51Z", + "genreIds": [ + "6017", + "6006" + ], + "currentVersionReleaseDate": "2014-02-11T21:58:51Z", + "trackCensoredName": "Complete Grade 3 (Math, English and Science) - A simpleNeasyApp by WAGmob", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "23304823", + "sellerUrl": "http://wagmob.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/complete-grade-3-math-english-science-simpleneasyapp/id814960961?mt=12&uo=4", + "trackContentRating": "4+", + "version": "1.0", + "wrapperType": "software", + "currency": "USD", + "price": 0.00, + "artistId": 356028414, + "artistName": "Quizmine.Com", + "genres": [ + "Education", + "Reference" + ], + "description": "* * * * * WAGmob: An eBook and app platform for learning, teaching and training is offering 50% DISCOUNT for a limited time only.\n\nDownload today!!! * * * * * \n\nWAGmob brings you simpleNeasy, on-the-go learning app for \"Complete Grade 3 (Math, English and Science)\".\n\nYou have limited access to the content provided.\n\nIn this mode you can access 2 tutorials, 1 quiz, and 1 set of flashcards.\n\nFor full access to the content, please purchase this application.\n\nYou can purchase \"Grade 3 Math, Grade 3 English and Grade 3 Science\" application from within this app just for $0.99 each.\n\nThe app provides: \n\n1. Snack sized chapters for easy learning.\n2. Bite sized flashcards to memorize key concepts.\n3. Simple and easy quizzes for self-assessment.\n\nThis app provides a quick summary of essential concepts in Grade 3 (Math, English and Science) via easy to grasp snack sized chapters:\n \n\"Grade 3 Math\" includes:\n\nNumbers,\nPlace Value,\nAddition and Subtraction,\nMultiplication and Division,\nFractions,\nRounding and Estimation,\nPatterns and Variables,\nMoney and Time,\nMeasurement and Conversion,\nGeometric Figures,\nCongruence and Perimeter,\nTransformations,\nStatistics,\nLine, Plots and Pictographs.\n\n\"Grade 3 English\" includes:\n\nSentence, Subjects and Predicates,\nSingular and Plural Nouns,\nKinds of Nouns,\nVerbs, Singular and Plural Pronouns,\nAdjectives, Article and Adverb,\nContraction and Punctuations,\nPrepositions,\nGenders,\nTenses,\nPoem- Good Morning and Puppy and I,\nPoem-How Creatures Move,\nShort Story-A Little Fish and The Yellow Butterfly,\nShort Story-The Ship of the Desert,\nReading Comprehension,\nHow to Write a Letter,\nParagraph Writing,\nVocabulary.\n\n\"Grade 3 Science\" includes:\n\nLiving and Non-Living,\nPlants,\nAnimals,\nFood Chain,\nFood and Nutrition,\nHuman Body,\nEarth, Sun, Moon and Stars,\nSolar System,\nMatter,\nForce, Motion and Energy,\nLight and Sounds,\nSimple Machines.\n\n\nAbout WAGmob apps:\n\n1) A companion app for on-the-go, bite-sized learning.\n2) Over Three million paying customers from 175+ countries.\n\nWhy WAGmob apps: \n1) Beautifully simple, Amazingly easy, Massive selection of apps.\n2) Effective, Engaging and Entertaining apps.\n3) An incredible value for money. Lifetime of free updates!\n\n* * * WAGmob Vision : simpleNeasy apps for a lifetime of on-the-go learning.* * * \n\n* * * WAGmob Mission : A simpleNeasy WAGmob app in every hand.* * *\n\n* * * WAGmob Platform: A unique platform to create and publish your own apps & e-Books.* * *\n\nPlease visit us at www.wagmob.com or write to us at Team@wagmob.com.\n\nWe would love to improve our app and app platform.", + "bundleId": "com.wagmob.CompleteGrade3", + "userRatingCount": 0 + }, + { + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/97/df/6c/97df6c6c-c310-9ae4-3435-1ef0d24bd52a/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/97/df/6c/97df6c6c-c310-9ae4-3435-1ef0d24bd52a/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/97/df/6c/97df6c6c-c310-9ae4-3435-1ef0d24bd52a/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/publicspace-net/id294322622?mt=12&uo=4", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/e7/b7/53/e7b75380-5333-ab38-3118-59adcd9d0ec0/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/42/c3/74/42c37490-0380-b063-1581-041e96a1d641/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/ff/9e/e0/ff9ee000-b217-80c3-5580-4943a34923e2/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/09/c8/5b/09c85bef-2a69-2b92-ee65-17c782cfb4cb/pr_source.png/800x500bb.jpg" + ], + "kind": "mac-software", + "formattedPrice": "$27.99", + "trackId": 1450245043, + "trackName": "Vitamin-R 3", + "primaryGenreName": "Productivity", + "primaryGenreId": 6007, + "minimumOsVersion": "10.11", + "sellerName": "Frank Reiff", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2019-01-28T15:06:56Z", + "genreIds": [ + "6007", + "6000" + ], + "releaseNotes": "- fixes Things integration\n- alphabetically sorts tags\n- modernizes CSV output\n- adds menu item and shortcuts to make it easier to start an informal break\n- fix for a rare timing problem on wake", + "currentVersionReleaseDate": "2020-08-18T17:54:43Z", + "trackCensoredName": "Vitamin-R 3", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "59736672", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/vitamin-r-3/id1450245043?mt=12&uo=4", + "trackContentRating": "4+", + "version": "3.18", + "wrapperType": "software", + "currency": "USD", + "price": 27.99, + "artistId": 294322622, + "artistName": "publicspace.net", + "genres": [ + "Productivity", + "Business" + ], + "description": "▷ 4.5/5 Stars, Macworld May 2015\n\nRecapture the Lost Art of Joyful Concentration. Overcome Procrastination. Get Motivated.\n\nVitamin-R creates optimal conditions for your brain by structuring your work into short bursts of distraction-free, highly-focused activity alternating with opportunities for renewal, reflection and intuition.\n\nThe built-in task logging and analysis features create positive momentum towards productivity by providing you with visible feedback on your progress and achievements.\n\n▷ Slices Up Daunting Tasks into Manageable Chunks\n\nVitamin-R breaks down large, vaguely defined tasks into a series of short \"time slices\" of between 10 and 30 minutes, each with a specific, easily reachable and actionable objective.\n\n▷ Keeps You Focused\n\nVitamin-R features an array of highly configurable visual, audio and speech notifications that prod you back to your task as soon as your attention starts to wander.\n\n▷ Gets You Started, Keeps You Motivated\n\nVitamin-R allows you to break through the resistance of procrastination and create a positive feedback loop of small achievements that get you closer to your ultimate aims.\n\n▷ Effective Task Switching\n\nTask switching is a big, but often unavoidable productivity killer. Vitamin-R makes it as efficient as possible and the built-in \"breadcrumbing\" technique helps you pick up where you left off.\n\n▷ Productive Breaks\n\nRegular breaks are not for slackers. In fact, they are especially important for people who work with high focus. Vitamin-R's timed breaks make sure that your renewal break does not turn into a free afternoon and the \"priming\" technique allows your intuition to work overtime before you even start on an objective.\n\n▷ Find Your Rhythm\n\nEach one of us is different. Find out what works best for you and unlock the key to true productivity. Vitamin-R provides the tools to gain improved awareness of your preferred work methods and rhythms. Armed with this new knowledge, you can eliminate unproductive work patterns. \n\n▷ Get It Out of Your Head Quickly\n\nDid you know that your short term memory can only hold 4-6 \"chunks\" of information? The slightest interruption and it's all gone and you have to start from scratch. That's why Vitamin-R provides you with the \"Now & Later Board\", complete with FastType magic, to give you a place to quickly dump all those things that go through your head and allow you to quickly return to your task. \n\n▷ Make It Your Own\n\nVitamin-R plugs into your life rather than trying to take it over. You can use it occasionally to overcome procrastination or mental blocks or re-organize your entire working life around the concepts that it embodies.\n\n▷ Works with OmniFocus, Things & The Hit List\n\nVitamin-R integrates with traditional to-do list managers rather than trying to replace them. \n\n▷ Block Out Noise\n\nThe built-in noise machine can block out irritating coworkers and create energizing soundscapes.\n\n▷ Syncs with all your Mac OS X and iOS Devices\n\nVitamin-R for Mac seamlessly syncs with the iPhone version and multiple Macs via its simple Dropbox integration, so you can log your time slices wherever you are.\n\n▷ Ideal for Pomodoro Technique Aficionados\n\nVitamin-R provides everything you need to implement the Pomodoro Technique: sophisticated timer, log book and analysis component.\n\n▷ Attention Deficit Disorder\n\nWhile Vitamin-R was never specifically designed with ADHD \"sufferers\" in mind, many ADHD-ers have found its approach to focusing attention invaluable.", + "bundleId": "net.publicspace.mas.vitaminr3", + "userRatingCount": 0 + }, + { + "supportedDevices": [ + "iPadAir2-iPadAir2", + "iPadProFourthGen-iPadProFourthGen", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPadMini5-iPadMini5", + "iPhone6Plus-iPhone6Plus", + "iPadAir2Cellular-iPadAir2Cellular", + "iPadMini5Cellular-iPadMini5Cellular", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone11-iPhone11", + "iPhoneXS-iPhoneXS", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPad73-iPad73", + "iPad812-iPad812", + "iPhone11ProMax-iPhone11ProMax", + "iPadSeventhGen-iPadSeventhGen", + "iPadAir3-iPadAir3", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPad856-iPad856", + "iPad71-iPad71", + "iPadPro97Cellular-iPadPro97Cellular", + "iPhoneSE-iPhoneSE", + "iPhone8-iPhone8", + "iPad834-iPad834", + "iPhone11Pro-iPhone11Pro", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadMiniRetina-iPadMiniRetina", + "iPadMini3Cellular-iPadMini3Cellular", + "iPad74-iPad74", + "iPadProSecondGen-iPadProSecondGen", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPhoneXR-iPhoneXR", + "iPhoneXSMax-iPhoneXSMax", + "iPadProCellular-iPadProCellular", + "iPhone7-iPhone7", + "iPadPro97-iPadPro97", + "iPhoneX-iPhoneX", + "iPhone6-iPhone6", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPad76-iPad76", + "iPadMini4Cellular-iPadMini4Cellular", + "iPhone5s-iPhone5s", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPadMini4-iPadMini4", + "MacDesktop-MacDesktop", + "iPhone6sPlus-iPhone6sPlus", + "iPad72-iPad72", + "iPhone6s-iPhone6s", + "iPadMini3-iPadMini3", + "iPadPro-iPadPro", + "iPad611-iPad611", + "iPad878-iPad878", + "iPadAir-iPadAir", + "iPad612-iPad612", + "iPad75-iPad75", + "iPadAirCellular-iPadAirCellular", + "iPhone7Plus-iPhone7Plus", + "iPhone8Plus-iPhone8Plus" + ], + "advisories": [], + "isGameCenterEnabled": false, + "ipadScreenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/91/cd/f7/91cdf74e-acf2-a1e3-8e07-7319e01dc670/568c01b2-a004-4a01-a0e0-c897f79f63d7_ipad-v-1.png/552x414bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/ca/4a/e0/ca4ae050-3685-5c0c-8673-97d5d1ddcbca/12a8e7b3-0985-4996-a86d-a304aa14aed3_ipad-v-2.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/c2/aa/ee/c2aaeeef-b7d3-3650-8fdc-ad60c57d018d/ee63f808-7a29-4d13-ae00-f671949e1e60_ipad-v-3.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/65/3d/8c/653d8cab-1798-b39b-4f2a-0662c83fe73a/51c0de26-69b1-4c01-9a39-2123d2a91e06_ipad-v-4.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/60/6b/22/606b220a-6b2f-c416-c3db-d9f951fae7a9/93ef3749-3530-406e-9d49-c09a534e14c4_ipad-v-5.png/552x414bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/4e/65/17/4e651712-0220-de26-446b-1b3a2d5f63e4/24abb295-b2bd-4454-968b-56f32f1a03a1_ipad-v-6.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/ed/0a/0b/ed0a0b60-9553-dd7a-1c8d-33c74f83e636/d4960063-47d3-416e-8dd7-32949625ae87_ipad-v-7.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/66/c9/90/66c990ad-700c-828a-acf0-a5db34fd25ed/4ffc662e-17a0-45cf-8c24-7bc29f6ce518_ipad-v-8.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/fd/0b/a9/fd0ba9ed-460a-2d0e-626b-6645a2920634/738e4181-a9a6-4c68-ada0-e3bcccd4820e_ipad-v-9.png/552x414bb.png" + ], + "appletvScreenshotUrls": [], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/55/39/97/5539970a-d813-3b0a-74c5-e8bca3fd4343/source/60x60bb.jpg", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/55/39/97/5539970a-d813-3b0a-74c5-e8bca3fd4343/source/512x512bb.jpg", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/55/39/97/5539970a-d813-3b0a-74c5-e8bca3fd4343/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/easylife-srls/id1459685996?uo=4", + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/97/b3/bb/97b3bb23-2adc-f99b-ff85-5f52dbb17d15/81d51b12-54f2-4112-991c-a1a39c265e9c_i8-1.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/25/2c/b5/252cb57a-7764-1d40-99ca-4a7a925b7ba6/cd4b4549-9818-49eb-b6ec-0d9b550dce14_i8-2.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/99/99/46/9999464a-bd11-46e2-94a0-8aa056eb67ab/2da23c93-7ee4-4725-973f-eab46f717d4c_i8-3.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/1a/16/72/1a167259-6a9e-372f-869e-20dd8dbb589a/1bcf99aa-5453-498c-bb34-ad3df72889c8_i8-4.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/f4/ee/f3/f4eef391-8a17-d834-a239-c136fa020d09/4e170d48-d341-420c-95b1-e0ed885b67e4_i8-5.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/1e/95/0a/1e950ab2-d55d-69b6-cfee-2cbc58e6d57c/8a6dd4ef-bb77-4284-b106-f6ef913f337a_i8-6.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/c1/b9/c1/c1b9c1b0-eadf-b493-759a-9983e47b409d/3ec0554b-f038-47fe-a1c7-316b4198b857_i8-7.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/e9/71/53/e9715303-fb5f-41ce-5324-802e9f31d5bd/a2d50c15-8f37-479b-9102-64487664a2e6_i8-8.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/fb/a0/9a/fba09aa9-4a8a-c2eb-f474-931584933350/64393c7f-c547-48b0-8f2f-53454cbfd040_i8-9.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/57/49/14/5749144e-ee2e-8aa9-7ff1-82c67f647851/810e7bec-7fef-42d9-8709-387f71a43153_i8-10.png/392x696bb.png" + ], + "kind": "software", + "features": [ + "iosUniversal" + ], + "formattedPrice": "$35.99", + "trackId": 1468243432, + "trackName": "easyPlanner 3 - PRO", + "primaryGenreName": "Productivity", + "primaryGenreId": 6007, + "minimumOsVersion": "11.0", + "sellerName": "easyLife Srl Semplificata", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2019-06-14T17:39:17Z", + "genreIds": [ + "6007", + "6000" + ], + "releaseNotes": "Added \"Urgent\" quick button in task's page.\n\n• Fixed minor bugs.", + "currentVersionReleaseDate": "2020-08-25T19:15:13Z", + "trackCensoredName": "easyPlanner 3 - PRO", + "languageCodesISO2A": [ + "EN", + "FR", + "IT", + "RU", + "ZH" + ], + "fileSizeBytes": "90386432", + "sellerUrl": "https://www.easylife.biz", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 1.5, + "userRatingCountForCurrentVersion": 2, + "averageUserRating": 1.5, + "trackViewUrl": "https://apps.apple.com/us/app/easyplanner-3-pro/id1468243432?uo=4", + "trackContentRating": "4+", + "version": "3.0.6", + "wrapperType": "software", + "currency": "USD", + "price": 35.99, + "artistId": 1459685996, + "artistName": "easyLife Srls", + "genres": [ + "Productivity", + "Business" + ], + "description": "easyPlanner is the innovative app that will manage for you the things to do using the tasks and projects and the things you need to remember using memos. You can manage your appointments and tasks on multiple levels (multi-levels) as your mind would! You can also monitor your progress with the Reports and see how productive you are. If you are not happy with what you are producing you can try to increase your productivity by using our FocusTimer, a tool that will allow you to maintain concentration and carry out more tasks simultaneously.\neasyPlanner aims to make your life easier and “to work” in place of your memory. Getting organized means having more free time for you and for those you love, dedicating the time you have saved to create unforgettable moments with the people of your life.\n\nMANAGE THE THINGS YOU HAVE TO DO AND THE THINGS YOU HAVE TO REMEMBER\u2028\n\nWe provide you tasks, projects and memos management in a single app.\n\nTASKS\n\neasyPlanner allows you to manage the “things you need to do” through our “Tasks”. Each task can contain infinite sub-tasks (multi-tasks) and can be grouped into folders. \n\nPROJECTS\n\nWhen a certain number of tasks are closely related to each other and they concern significant commitments, it is possible to manage them as a single project. Even the project, like the task, can contain infinite sub-tasks (multi-tasks).\n\nMEMOS\n\neasyPlanner allows you to manage the “things you need to remember” both in free format and in a structured format using memos.\n\nMONITOR YOUR REPETITIVE TASKS WITH REPORT\u2028\n\nThe \"Report\" function was born of the need to represent a set of complex data or complex tasks in the form of a table so that they can be printed and read more easily. Thanks to this function you will be able to graphically visualize a set of recurring tasks in a simple way and you will be able to monitor the progress of these tasks daily.\n\n\nINCREASE YOUR PRODUCTIVITY WITH FOCUS TIMER\n\nFocus Timer has been designed after a careful study based on several time management theories. It is a very advanced “time management” system which consists in dividing time into intervals, each of which is characterized by a task that you have to do. This division leads the subjects who use it to be much more efficient, to better manage their time and to constantly develop their mental abilities.\n\nAGENDA\n\u2028Thanks to the Agenda view easyPlanner will allow you to keep track of your schedule and your appointments at any time.\nAgenda will also integrate the Apple calendar. \nYou can add your events in the calendars directly from here in a practical and fast way.\nYou can decide which calendars to see and which to hide.\n\nICLOUD SYNC\n\nWith easyPlanner you can archive your photos, your documents, your tasks, etc. on ICloud and you can synchronize all your devices automatically and simultaneously. Regardless of the device you are using (IPhone or IPad), you will always have the latest version of your documents available.\n\nDELEGATE\n\nDelegate urgent tasks to other people by sharing them by email.\n\nAND SO MUCH MORE…\n\nYou will find out many more features trying our app or going to our website www.easyLife.biz/easyPlanner.\u2028\n\nCHOOSE THE VERSION THAT BEST SUITS YOU AND YOUR NEEDS\n\neasyPlanner – PRO Version allows you to get an unlimited number of entries, giving you the opportunity to always have everything you need with you and to take advantage of Reports over time. \n\nOne-time purchase. Without subscription. \n\nIf you have any question, any suggestions or if you want to tell us what you thing of easyPlanner you can contact us:\u2028\n\nwww.easylife.biz\nsupport@easylife.biz", + "bundleId": "com.easyPlanner.gold", + "userRatingCount": 2 + }, + { + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/81/ff/4b/81ff4b9e-53e9-cc0f-9ec3-18e468a0b7b0/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/81/ff/4b/81ff4b9e-53e9-cc0f-9ec3-18e468a0b7b0/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/81/ff/4b/81ff4b9e-53e9-cc0f-9ec3-18e468a0b7b0/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/the-omni-group/id281731738?mt=12&uo=4", + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/05/8d/14/058d1491-5115-0bfe-c405-ee1bf5fd9683/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/6b/e6/f8/6be6f81d-504e-54f0-3611-c7a1b3386de2/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/d5/dd/5f/d5dd5fc4-a4ad-c585-7085-1f63ce2c5fbf/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/0d/d9/7a/0dd97a20-a76a-ef3f-ade4-3922a66eadda/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/25/3d/e4/253de428-c333-21ef-df3d-291d6d373edc/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/f3/fd/cb/f3fdcb11-863f-abb5-4105-aa1efa566dc6/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/44/5d/7d/445d7d4f-4cb0-3931-2f9d-7282310664a1/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/46/31/87/46318762-2f6f-0ebe-7ec3-0fa1a3985f3f/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/e1/be/79/e1be7906-0ba7-6121-dbac-f2ac69f7156e/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/6a/15/79/6a1579fb-61ba-2b7b-bf95-0bd6bd910738/pr_source.png/800x500bb.jpg" + ], + "kind": "mac-software", + "formattedPrice": "$99.99", + "trackId": 1474135619, + "trackName": "OmniFocus 3 Enterprise", + "primaryGenreName": "Productivity", + "primaryGenreId": 6007, + "minimumOsVersion": "10.14", + "sellerName": "The Omni Group", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2019-11-05T08:00:00Z", + "genreIds": [ + "6007", + "6000" + ], + "releaseNotes": "OmniFocus 3.9.2 is a minor update focused on bug fixes.\n\n• Omni Automation — OmniFocus now recognizes simple plug-ins that use the .omnifocusjs file extention.\n• First Run — Improved reliability of the first run flow.\n• Notice Bar — Fixed bugs related to the Trial Mode & Free Viewer notice bars.\n\nIf you have any feedback or questions, we’d love to hear from you! The Omni Group offers free tech support; you can email omnifocus@omnigroup.com, call 1–800–315–6664 or 1–206–523–4152, or tweet @OmniFocus.\n\nIf OmniFocus empowers you, we would appreciate an App Store review. Your review will help other people find OmniFocus and make them more productive too.", + "currentVersionReleaseDate": "2020-08-27T17:55:09Z", + "trackCensoredName": "OmniFocus 3 Enterprise", + "languageCodesISO2A": [ + "NL", + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "64696470", + "sellerUrl": "https://www.omnigroup.com/omnifocus/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/omnifocus-3-enterprise/id1474135619?mt=12&uo=4", + "trackContentRating": "4+", + "version": "3.9.2", + "wrapperType": "software", + "currency": "USD", + "price": 99.99, + "artistId": 281731738, + "artistName": "The Omni Group", + "genres": [ + "Productivity", + "Business" + ], + "description": "OmniFocus 3 Enterprise simplifies deployment for customers who wish to pay full-price for the Pro edition up front. For most customers, we recommend our normal edition — which uses in-app purchases to support free two-week trials, two levels of functionality (Standard and Pro), and upgrade discounts. The list price and the functionality of OmniFocus Pro are the same in both apps.\n\nUse OmniFocus to accomplish more every day. Create projects and tasks, organize them with tags, focus on what you can do right now — and get stuff done.\n\nOmniFocus — now celebrating 10 years as the trusted, gold-standard to-do list app — brings unrivaled power and flexibility to your Mac, making it easy to work the way you want to work.\n\nOmniFocus manages everything in your busy life. Use projects to organize tasks naturally, and then add tags to organize across projects. Easily enter tasks when you’re on the go, and process them when you have time. Tap the Forecast view — which shows both tasks and calendar events — to get a handle on your day. Use the Review perspective to keep your projects and tasks on track.\n\nThen let our free syncing system make sure your data is the same on every Mac. (And on OmniFocus for iOS and Web, available separately.) Because your data is encrypted, it’s safe in the cloud.\n\nFEATURES\n\n• NEW: Tags add a powerful additional organizing tool. Create tags for people, energy levels, priorities, locations, and more.\n• NEW: The Forecast view shows your tasks and calendar events in order, so you can better see what’s coming up in your day.\n• NEW: Enhanced repeating tasks are easier than ever to set up — and they work with real-world examples such as the first weekday of the month.\n• NEW: The Modern, fresh-but-familiar design helps you focus on your content.\n• NEW: Today’s Forecast can include items with a specific tag, and you can reorder those tasks however you choose, so you can plan your day better.\n• Inbox is where you quickly add tasks — save them when you think of them, and organize them later.\n• Syncing supports end-to-end encryption so that your data is safe wherever it’s stored, on our server or yours.\n• Notes can be attached to your tasks, so you have all the information you need.\n• Attachments — graphics, video, audio, whatever you want — add richness to your tasks.\n• View Options let you customize each perspective by deciding what it should show and how it should filter your tasks.\n• The Review perspective takes you through your projects and tasks — so you stay on track.\n• Custom perspectives help you create new ways to see your data by filtering and grouping projects and tags. NEW: The filtering rules are simpler to use while being more powerful than ever, letting you combine rules with “all,” “any,” and “none.” You can also choose any image to use as your custom perspective’s icon, and a custom tint color to go with it.\n• OmniFocus Mail Drop adds tasks via email and works with services like IFTTT and Zapier (if you’re using our free syncing server).\n• The Today Widget shows you your most important items — you don’t even have to switch to the app to know what’s up.\n• Support for TaskPaper Text and omnifocus:///add and /paste lets you automate using URLs.\n• The customizable sidebar lets you organize your perspectives the way you want to, for super-fast access.\n• The Today Widget shows a perspective of your choice in Notification Center.\n• AppleScript support opens up a world of automation, using Apple’s Mac scripting language.\n\nThe app includes a manual, and there’s plenty more documentation on the website.\n\nSUPPORT\n\nIf you have feedback or questions, our Support Humans would love to hear from you! Send email to omnifocus@omnigroup.com, call us at at 1-800-315-6664 or +1-206-523-4152, or reach us on Twitter at @omnifocus.", + "bundleId": "com.omnigroup.OmniFocus3.enterprise", + "userRatingCount": 0 + }, + { + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/30/07/fb/3007fb34-ec4e-7a5a-21b0-6516c92ded8c/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/30/07/fb/3007fb34-ec4e-7a5a-21b0-6516c92ded8c/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/30/07/fb/3007fb34-ec4e-7a5a-21b0-6516c92ded8c/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/eun-seong-kim/id807341286?mt=12&uo=4", + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple62/v4/cd/b5/0f/cdb50fab-3352-b1a2-5926-f53d03381ba2/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/73/e2/a8/73e2a8e6-2999-0d2c-e94e-8d192ac07039/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/65/8a/75/658a7540-2277-791c-4fd6-13e1562c6c2b/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple62/v4/c6/e4/95/c6e4951f-4a9c-4067-29c1-5b6d1d3077d6/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/b3/04/6a/b3046a10-e216-a685-7cde-c17da8168173/pr_source.png/800x500bb.jpg" + ], + "kind": "mac-software", + "formattedPrice": "$5.99", + "trackId": 1341353800, + "trackName": "Mono Day", + "primaryGenreName": "Lifestyle", + "primaryGenreId": 6012, + "minimumOsVersion": "10.13", + "sellerName": "Eun Seong Kim", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2018-01-31T18:20:45Z", + "genreIds": [ + "6012", + "6007" + ], + "releaseNotes": "Added 5 more themes\nDaily view sorting option feature\nReload when date changes function", + "currentVersionReleaseDate": "2018-02-23T03:07:35Z", + "trackCensoredName": "Mono Day", + "languageCodesISO2A": [ + "EN", + "JA", + "KO" + ], + "fileSizeBytes": "4189219", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/mono-day/id1341353800?mt=12&uo=4", + "trackContentRating": "4+", + "version": "1.1", + "wrapperType": "software", + "currency": "USD", + "price": 5.99, + "artistId": 807341286, + "artistName": "Eun Seong Kim", + "genres": [ + "Lifestyle", + "Productivity" + ], + "description": "Mono Day is a to-do app to make your daily life simple and satisfied.\n\nWhat's the difference?\n\nIT'S OKAY TO DELAY OR MISS THINGS\nWe miss, delay, forget things almost every day and it's okay. Instead of giving you red flags, this app automatically move around and rearrange the ones you might feel some pressure by. \n\nBE FREE FROM NIGHTMARE OF UNCERTAINTY\nYou don't need to feel pressured to fill out every small detail to just list up your tasks. You can EASILY add more details whenever you want.\n\nThe habit of managing things is more important than ending the task itself.\nMONO DAY IS A HABIT-MAKING APP.\n\n::::FEATURES::::\n\n- Focus on today's tasks\nEach day, the app will automatically hide tasks that you don't need to worry about.\n\n- Do it tomorrow\nYou can easily delay them by a single swipe.\n\n- Manage all tasks in one view\nYou can view all tasks in a list, regardless of the date.\n\n- Weekly and monthly overview\nTo give you a whole picture, weekly and monthly view will provide an overview of what you have done and what you have to do by each date.\n\n- Memo on the date\nEveryone knows that sometimes you need write a memo (not a to-do) to stick it on a date.\n\n- Do it any time\nMost of times, you don't know when it's gonna be done, but you just got to put it down somewhere. 'Any time' option automatically follows your today, without any other information.\n\n- Repeat every week same weekdays\nYou know what? I need to take my dog for a walking every Monday and Thursday.\n\n- Repeat every week any 1...7 days\nAnd I need to clean toilet at least twice a week. How about you?\n\n- Do it by date(s)\nWell, this is what usually other to-do apps only have. But Mono Day can set many different dates for just one task. Who knows that you gonna attend only a few days for a week long conference.\n\n- Search\nLooking for something? Mono Day has a search feature.\n\n- iCloud sync \nOf course. Be more productive with Mono Day iPhone app!\n\n- Themes\nWe are all unique. Personalize the app with themes.\n\n- Font size\nMy mom needs a bigger font size.\n\n- Fresh start\nForget the past, you can always delete whole data and start fresh.\n\n- First weekday\nSunday? Monday?\n\n- Highlight important task\nYup, the good old star mark is right there for you.\n\nMono Day is built by a one man team, and I love to bringing you frequent feature updates. I would love to hear about how to make your life even more productive. So please share your thoughts to playmatters.co@gmail.com.\n\nAlso looking for people who can help me on localize the language. Currently fully supported languages are English, Korean, and Japanese.", + "bundleId": "co.playmatters.Mono", + "userRatingCount": 0 + } + ] + } diff --git a/MasKitTests/JSON/search/things-that-go-bump.json b/MasKitTests/JSON/search/things-that-go-bump.json new file mode 100644 index 000000000..c413b225a --- /dev/null +++ b/MasKitTests/JSON/search/things-that-go-bump.json @@ -0,0 +1,57 @@ +{ + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/36/fe/ff/36feffbc-a07b-e61e-f0e5-88dcc4455871/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/c6/85/09/c68509b2-c2c8-3000-bf85-4ead056b26f3/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/18/42/aa/1842aab5-0500-b08b-b9a5-fc364f83fbdb/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/de/b9/99/deb99962-f1d0-a7ad-0fc8-ef4bf906515b/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/41/70/7d/41707d88-8ba1-5a28-1f2f-0f2e43a73706/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/be/a3/a2/bea3a233-d82f-34bf-b0cd-38f262b04939/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/e5/41/b4/e541b49d-06ed-9ec6-1544-3df88c8dc340/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/8f/08/49/8f0849f4-7d20-567f-47e6-ef1bfb901619/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/7d/74/8a/7d748af9-50fa-e009-39a8-b5eb7774b2be/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d4/b9/74/d4b974d7-0c4c-1515-49ec-ecedec84c5a0/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d4/b9/74/d4b974d7-0c4c-1515-49ec-ecedec84c5a0/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d4/b9/74/d4b974d7-0c4c-1515-49ec-ecedec84c5a0/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/tinybop-inc/id682046582?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.15.0", + "trackName": "Things That Go Bump", + "trackId": 1472954003, + "sellerName": "Tinybop Inc.", + "releaseNotes": "* BOOM *, this is a BIG update. The house spawns a game room, complete with video games you can ENTER INTO. It's fun and a little bit weird! Try it! \n»-(¯`·.·´¯)->", + "primaryGenreId": 6014, + "primaryGenreName": "Games", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2019-10-18T07:00:00Z", + "genreIds": [ + "6014", + "7001", + "7009" + ], + "currentVersionReleaseDate": "2020-03-18T17:39:23Z", + "trackCensoredName": "Things That Go Bump", + "languageCodesISO2A": [ + "EN" + ], + "sellerUrl": "http://tinybop.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/things-that-go-bump/id1472954003?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Have you ever heard something go bump in the night? \nPerhaps you’ve caught wind of a spirit or sprite. \nWhen the house is asleep,\nand there’s dark all around, \nspirits from objects awake and abound. \n\nThe spirits are crafty and like to cause trouble. \nThey're called yōkai and together, they double. \nMixing and mashing, they join to fight. \nCan you help them conquer this mysterious night? \n\nPlay with one person, two, three or four. \nFirst you’ll need to escape the dark junk drawer. \n\n. . . . . . . . . . . . . . . . . . . .\nIn Things That go Bump, familiar objects and rooms come to life every night, and nothing looks quite as does in the day. Create your creature, and battle your friends, but beware the house spirits! They can destroy and they can give life. Battle, create, and make your way through the rooms of the house, and slowly you will unravel the secret of Things that Go Bump. \n\nFeatures:\n * Spirits wake up objects and create yōkai (spirit creatures)\n * Combine everyday objects like umbrellas, staplers, cheese graters and more to create everchanging characters \n * Connect to other players via Game Center and face-off against other spirit creatures and house spirits\n * Add or swap objects to give your spirit creature new skills\n * Gain energy by making mischief, defeating other yōkai, and conquering the house spirits\n * Advance through the house (new rooms will be added throughout the year)\n * Test your curiosity and creativity with new challenges in every room\n * Play with 1-4 players across iPads, iPhones, iPods, AppleTVs and Macs\n * Fun and challenging for the whole family\n * Intuitive, safe, hilarious kid-friendly design\n * New levels introduced roughly every 2 months\n * Original artwork by Adrian Fernandez\n * Original sound design\n\nTinybop, Inc. is a Brooklyn-based studio of designers, engineers, and artists. We make toys for tomorrow. We’re all over the internet.\n\n Visit us: www.tinybop.com\n Follow us: twitter.com/tinybop\n Like us: facebook.com/tinybop\n Peek behind the scenes: instagram.com/tinybop\n\nWe love hearing your stories! If you have ideas, or something isn’t working as you expect it to, please contact us: support@tinybop.com.\n\nPsst! It's not Tiny Bop, or Tiny Bob, or Tiny Pop. It's Tinybop. :)", + "currency": "USD", + "artistId": 682046582, + "artistName": "Tinybop Inc.", + "genres": [ + "Games", + "Action", + "Family" + ], + "bundleId": "uikitformac.com.tinybop.thingamabops", + "version": "1.3.0", + "wrapperType": "software", + "userRatingCount": 0 +} diff --git a/MasKitTests/JSON/search/things.json b/MasKitTests/JSON/search/things.json index bcf88b5ee..091e35d13 100644 --- a/MasKitTests/JSON/search/things.json +++ b/MasKitTests/JSON/search/things.json @@ -1,68 +1,3333 @@ { - "resultCount": 1, + "resultCount": 50, "results": [ - { - "screenshotUrls": [ - "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/62/45/33/6245335c-3ef7-d4a3-d373-a674b49b027f/source/800x500bb.jpg", - "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/2c/eb/f0/2cebf00c-dbeb-dd48-7e37-47d50f7ec8e3/source/800x500bb.jpg", - "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/8d/fc/05/8dfc054d-8d88-e831-6947-6f7c3ae57a4b/source/800x500bb.jpg", - "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/c9/44/29/c94429d9-d11f-400d-d239-1267a16f7e67/source/800x500bb.jpg", - "https://is5-ssl.mzstatic.com/image/thumb/Purple118/v4/b8/f1/ac/b8f1ac0f-3751-7a38-edb2-2e70dc343555/source/800x500bb.jpg", - "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/d8/83/38/d88338ad-f084-0c27-56da-1df2e44ccfb9/source/800x500bb.jpg" - ], - "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/54/91/e3/5491e3a9-dd4f-69eb-29bb-aa54449c7bc4/source/60x60bb.png", - "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/54/91/e3/5491e3a9-dd4f-69eb-29bb-aa54449c7bc4/source/512x512bb.png", - "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/54/91/e3/5491e3a9-dd4f-69eb-29bb-aa54449c7bc4/source/100x100bb.png", - "artistViewUrl": "https://itunes.apple.com/us/developer/cultured-code-gmbh-co-kg/id284971784?mt=12&uo=4", - "kind": "mac-software", - "averageUserRatingForCurrentVersion": 5, - "trackCensoredName": "Things 3", - "languageCodesISO2A": [ - "EN", - "FR", - "DE", - "IT", - "JA", - "RU", - "ZH", - "ES", - "ZH" - ], - "fileSizeBytes": "14822461", - "sellerUrl": "https://culturedcode.com/things/mac/", - "contentAdvisoryRating": "4+", - "userRatingCountForCurrentVersion": 30, - "trackViewUrl": "https://itunes.apple.com/us/app/things-3/id904280696?mt=12&uo=4", - "trackContentRating": "4+", - "currentVersionReleaseDate": "2018-12-12T15:08:04Z", - "formattedPrice": "$49.99", - "sellerName": "Cultured Code GmbH & Co. KG", - "releaseNotes": "This update accompanies our 3.8 release for iOS, which brings Dark Mode to our mobile apps. On your iPhone and iPad, you can now choose between three beautiful appearances – Light, Dark, and Black – or have it switch automatically based on your display brightness.\n\nHere on the Mac, where Dark Mode was added in 3.7, some users requested an extra option to run Things in Light appearance even when the operating system was set to Dark. This is now possible from the View menu. This update also includes various other fixes and stability improvements.\n\nFrom all of us here at Things, Happy Holidays! Thanks for a great year and see you in 2019.", - "isVppDeviceBasedLicensingEnabled": true, - "currency": "USD", - "wrapperType": "software", - "version": "3.8", - "primaryGenreName": "Productivity", - "genreIds": [ - "12014", - "12001" - ], - "releaseDate": "2017-05-18T16:42:04Z", - "minimumOsVersion": "10.11.0", - "trackId": 904280696, - "artistId": 284971784, - "artistName": "Cultured Code GmbH & Co. KG", - "genres": [ - "Productivity", - "Business" - ], - "price": 49.99, - "description": "Meet the all-new Things! A complete rethinking of the original, award-winning task manager – with a perfect balance between simplicity and power, incredible new features, delightful interactions, and a timeless new design.\n\n*** APPLE DESIGN AWARD WINNER 2017 ***\n\n\nHERE’S HOW THINGS WORKS\n\nIf you’re new to Things, this is the basic workflow:\n\n1. Collect Your Thoughts\nGet things off your mind quickly: no matter what app you’re in, a keyboard shortcut instantly reveals Quick Entry. Type your thoughts and save them to the Inbox. Or just talk to Siri on any device (“Remind me to...”) and import from Reminders.\n\n2. Get Organized\nCreate a project for each of your goals, then add the steps to reach them. For clarity, add structure with headings. Then group your projects by areas of responsibility, such as “Family”, “Work”, or “Health”. Review these regularly to stay on top of things.\n\n3. Plan Your Time\nSee your calendar events alongside your to-dos and plan your time effectively. Create repeating to-dos for things you do every few days, weeks, or months – Things will remind you on the right day.\n\n4. Make the Most of Your Day\nEvery morning, grab a coffee and prepare your list for “Today”: review previously planned to-dos and make quick decisions on what to tackle. Pick some more steps from your projects and then get going. The Today list is the only place you’ll need to look for the rest of the day.\n\n5. Customize Your Workflow\nUse tags to categorize your to-dos or add context. For example, tag places like “Office” or “Home”, or tag all your “Errands”, or everything you’re working on with “Kate”. You can easily find everything you’ve tagged via filtering or search.\n\n\nHERE’S WHY WE THINK YOU’LL LOVE THINGS\n\n1. It stays out of your way.\nAs you start using Things, you’ll quickly notice how seamlessly all the features fit together to give you an uncluttered, focused experience. There are no unnecessary frills. No pointless gimmicks or useless controls. In fact, you’ll hardly notice the app – it’s just you and your to-dos.\n\n2. Everything revolves around your to-dos.\nIn Things, each of your to-dos are special. In a list, they simply show a checkbox and the title of your to-do. But when you open them, they extend into a beautiful white piece of paper that’s ready to hold your thoughts. Additional details (checklists, tags, reminders, deadline) are nicely tucked away in the corner until you need them.\n\n3. It’s got a touch of magic.\nThings removes friction in magical ways. As an example, take Type Travel, a remarkable new way to navigate your lists. You just start typing where you want to go – the name of any project, area, or to-do – and instantly you’re transported there. Or look at the Natural Date Input – just type “Tom(orrow)”, “Sat(urday)”, “in fou(r days)”, “Au(gust 1)”., and it will jump to all the right conclusions.\n\n4. It’s got all the power of macOS.\nThings is fully integrated with all the latest macOS technologies: Touch Bar, Today Widget, Calendars, Siri & Reminders, Share Extension, Handoff, and AppleScript.\n\n5. And much more...\nEveryone’s got their favorite feature, it’s impossible to list them all. See what our users love about Things – visit our website at: thingsapp.com\n\n\nWHAT’S NEW?\n\nThis is a truly incredible update, with dozens of powerful new features. See the “What’s New” section below for a full list.\n\n\nSTAY PRODUCTIVE ON THE GO\n\nGet Things for iPad, iPhone, and Apple Watch and stay productive on the go (sold separately). The apps all stay updated via Things Cloud – the push sync service that we custom-built for Things.\n\n\nQUESTIONS?\n\nIf you have any questions, or run into any trouble – please contact us. We provide world-class, professional support for Things, and we’ll be glad to help you.", - "bundleId": "com.culturedcode.ThingsMac", - "primaryGenreId": 12014, - "trackName": "Things 3", - "averageUserRating": 4.5, - "userRatingCount": 1412 - } + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/6f/4c/e5/6f4ce5d6-7caa-d1eb-bbc9-86558e97d2ba/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/92/b4/f8/92b4f8f5-f133-abd8-db17-135ac27bb1fa/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/72/63/63/726363b9-45ff-f93e-975c-fb69836eaf1a/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/29/fa/63/29fa63e3-3cb2-8b8a-8541-31fa9b7ef27f/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/da/17/5f/da175f95-c2cd-e5df-8cbc-d800d6770c64/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/f1/82/37/f182376c-4f25-6dbb-c6a8-5e6c1c617620/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/69/3b/12/693b12e6-67d5-8252-7607-3438e420bbaa/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/69/3b/12/693b12e6-67d5-8252-7607-3438e420bbaa/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/69/3b/12/693b12e6-67d5-8252-7607-3438e420bbaa/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/cultured-code-gmbh-co-kg/id284971784?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.13.0", + "trackName": "Things 3", + "trackId": 904280696, + "sellerName": "Cultured Code GmbH & Co. KG", + "releaseNotes": "• Moved the database file to a new location (now at /Library/Group Containers/).\n• Increased the clickable area of items in the sidebar.\n• Improved the formatting of years in Japanese.\n• Fixed some crashes that could occur when hitting Cmd+[ or ] in Quick Entry while the When popover was visible.\n• Updated the crash reporter.\n• Some sync improvements.\n\n\nNEW IN 3.12\n\nWe’re excited to release Things 3.12 – a big update for our Watch app!\n\nWe’ve entirely rebuilt its foundation to allow it to sync and operate without your phone being nearby. We’ve also taken this opportunity to add some often-requested features to the app. For more information about this release, please visit our blog: thingsapp.com\n\nThere are no huge changes in this release for Mac, but there’s one great new feature you should know about: you can now edit the Tags or Deadlines of collapsed to-dos – even for multiple to-dos at once – by hitting Cmd+Shift+T or D. It’s super convenient :)", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2017-05-18T16:42:04Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "$49.99", + "currentVersionReleaseDate": "2020-08-04T07:57:44Z", + "trackCensoredName": "Things 3", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "RU", + "ZH", + "ES", + "ZH" + ], + "fileSizeBytes": "17474797", + "sellerUrl": "https://culturedcode.com/things/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/things-3/id904280696?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Get things done! The award-winning Things app helps you plan your day, manage your projects, and make real progress toward your goals.\n\nBest of all, it’s easy to use. Within the hour, you’ll have everything off your mind and neatly organized—from routine tasks to your biggest life goals—and you can start focusing on what matters today.\n\n“Things offers the best combination of design and functionality of any app we tested, with nearly all the features of other power user applications and a delightful interface that never gets in the way of your work.”\n—Wirecutter, The New York Times\n\n\nKEY FEATURES\n\n• Your To-Dos\nYour basic building block is the almighty To-Do—each a small step toward a great accomplishment. You can add notes, tag it, schedule it, and break it down into smaller steps.\n\n• Your Projects\nCreate a Project for any big goal, then add the to-dos to reach it. Use headings to structure your list as you outline your plan. There’s also a place to jot down your notes, and a deadline to keep you on schedule.\n\n• Your Areas\nCreate an Area for each sphere of your life, such as Work, Family, Finance, and so on. This keeps everything neatly organized, and helps you see the big picture as you set your plans in motion.\n\n• Your Plan\nEverything on your schedule is neatly laid out in the Today and Upcoming lists, which show your to-dos and calendar events. Each morning, see what you planned for Today and decide what you want to do. The rest is down to you :)\n\n\nMORE THINGS TO LOVE\n\nAs you dive deeper, you’ll find Things packed with helpful features. Here are just a few:\n\n• Reminders — set a time and Things will remind you.\n• Repeaters — automatically repeat to-dos on a schedule you set.\n• This Evening — a special place for your evening plans.\n• Calendar integration — see your events and to-dos together.\n• Tags — categorize your to-dos and quickly filter lists.\n• Quick Entry — create to-dos from anywhere, as soon as the thought hits you.\n• Quick Find — instantly locate to-dos, headings, or tags.\n• Type Travel — jump from list to list with your keyboard; just start typing!\n• Mail to Things — forward an email to Things; now it’s a to-do.\n• And much more!\n\n\nMADE FOR MAC\n\nThings is tailored to the Mac with deep system integrations as well. A great example is Quick Entry with Autofill: a shortcut that grabs content from other apps and adds it to Things for you, such as a link to a website or an email you want to get back to.\n\nYou can also enjoy a beautiful dark mode at sunset, connect your calendars, enable a Things widget, use your Mac’s Touch Bar, import from Reminders—Things can do it all! There’s even AppleScript support if you need powerful automation.\n\n\nSTAY PRODUCTIVE ON THE GO\n\nThings has full-featured apps for iPhone, iPad, and Apple Watch as well (sold separately). All your devices sync seamlessly via our free Things Cloud service. It’s great to have everything at your fingertips when you need it!\n\n\nAWARD-WINNING DESIGN\n\nMade in Stuttgart, with two Apple Design Awards to its name, Things is a fine example of German engineering: designed, not only to look fantastic, but to be perfectly functional as well. Every detail is thoughtfully considered, then polished to perfection.\n\n“It’s like the unicorn of productivity tools: deep enough for serious work, surprisingly easy to use, and gorgeous enough to enjoy staring at.”\n—Apple\n\n\nGET THINGS TODAY\n\nWhatever it is you want to accomplish in life, Things can help you get there. Install the app today and see what you can do!\n\nVisit our website now and get a free 15-day trial for your Mac: thingsapp.com\n\nIf you have any questions, please get in touch. We provide professional support and will be glad to help you!", + "currency": "USD", + "artistId": 284971784, + "artistName": "Cultured Code GmbH & Co. KG", + "genres": [ + "Productivity", + "Business" + ], + "price": 49.99, + "bundleId": "com.culturedcode.ThingsMac", + "version": "3.12.6", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/c9/5d/af/c95daf17-c405-56f0-90f5-9411828e44d2/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/94/32/3b/94323b37-f81b-7ba8-a280-b951e7e840de/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/82/f1/35/82f1356d-1e68-8f9d-3967-566e256f9265/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/dc/ad/83/dcad839b-7705-e4c0-180a-2f97cb68054d/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/21/50/6a/21506a09-c48c-d25e-dfa5-c0d6aa4cdd9d/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/09/64/61/096461c1-f392-ec7d-13dd-2caa927d8244/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/09/64/61/096461c1-f392-ec7d-13dd-2caa927d8244/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/09/64/61/096461c1-f392-ec7d-13dd-2caa927d8244/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/appest-limited/id434073155?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.12", + "trackName": "TickTick: Things & Tasks To Do", + "trackId": 966085870, + "sellerName": "Appest Limited", + "releaseNotes": "- Bug fixes and improvements.\n\nRecent Updates:\n- Customizable Section in List View.\n- Tag names can be capitalized.\n- The number of Pomos can now be estimated beforehand.\n- Lists under different folders can share the same name.\n- New city themes! Los Angeles and Cairo.\n\nThanks for using TickTick! We'll bring regular updates to give you more pleasant experience with performance and stability.\nWe'll read all reviews in App Store and evaluate your feedbacks carefully. Any issues encountered during the use, you may write to us via Avatar -> Feedback & Suggestions -> Submit feedback, we will get back to you asap.\nTickTick team with love.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2016-03-04T06:37:31Z", + "genreIds": [ + "6007" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-08-27T01:27:34Z", + "trackCensoredName": "TickTick: Things & Tasks To Do", + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "24698702", + "sellerUrl": "https://ticktick.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/ticktick-things-tasks-to-do/id966085870?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Design exclusively for macOS, TickTick is your daily must-have to-do & task list to get all things done.\nTickTick can be accessed on more than 10 different platforms including Mac, iPhone, iPad, Apple Watch which enables you to manage tasks on all your devices/Web.\n\nKey features: \n- Add task via shortcut (Command+Shift+A)\n- Instant reminder\n- Set priority levels to tasks\n- Set flexible recurring tasks \n- Create checklists within tasks \n- Sort tasks by order/date/name/priority \n- Sync all your tasks across all devices \n\nTickTick is free but you can also upgrade to Premium account for full access of premium features for $2.99 a month or $27.99 a year through an auto-renewing subscription.\n\nPremium Features: \n- Grid view and Timeline view of calendar\n- Duration\n- Custom Smart List\n- Description for checklist\n- Reminders for sub-tasks\n- More lists and tasks (299 lists, 999 tasks in each list, 199 subtasks in each task)\n- Add at most 5 reminders to each task\n- Share a task list up to 19 members for better task collaboration\n- Upload up to 99 attachments every day\n\nSubscriptions for Premium account will be charged to your credit card through your iTunes account. Your subscription will automatically renew unless cancelled at least 24-hours before the end of the current period. You will not be able to cancel a subscription during the active period. You can manage your subscriptions in the Account Settings after purchase. \n\nHow TickTick makes you productive: \n- Get all things done \n- Never miss a schedule\n- Make work more productive \n- Keep life on track \n\nConnect with us: \nFacebook: https://www.facebook.com/TickTickApp\nTwitter: https://twitter.com/TickTickTeam @TickTickTeam\nHelp Center: https://help.ticktick.com/\n\nPrivacy Policy: https://www.ticktick.com/about/privacy\nTerms of Use: https://www.ticktick.com/about/tos", + "currency": "USD", + "artistId": 434073155, + "artistName": "Appest Limited", + "genres": [ + "Productivity" + ], + "price": 0.00, + "bundleId": "com.TickTick.task.mac", + "version": "3.7.11", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple1/v4/79/5c/63/795c63aa-698c-1c6c-b6da-e7ebba718d01/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple30/v4/15/4d/40/154d4071-4a6f-dcd7-0d15-2e495f6f4710/mzm.mvtkjcyn.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple2/v4/e0/31/dc/e031dc74-ce06-afe3-fd8e-8693f6c7c50c/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple1/v4/fc/8d/23/fc8d2367-725d-11dd-6da9-816a7780a1d9/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple71/v4/ff/4d/6b/ff4d6b03-2f12-e12d-9bb3-b3607bcd8ad8/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple71/v4/ff/4d/6b/ff4d6b03-2f12-e12d-9bb3-b3607bcd8ad8/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple71/v4/ff/4d/6b/ff4d6b03-2f12-e12d-9bb3-b3607bcd8ad8/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/antlogic/id364746702?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.6", + "trackName": "Simple Antnotes", + "trackId": 846599902, + "sellerName": "Mykola Olshevskyi", + "releaseNotes": "- added option to disable gradient background\n- added option to create new notes in bottom left/right corners\n- changed delay for close/options buttons showing\n- some minor compatibility and UI fixes\n- fixed German localisation", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2014-03-28T12:49:14Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2016-09-24T17:06:52Z", + "trackCensoredName": "Simple Antnotes", + "languageCodesISO2A": [ + "EN", + "DE", + "RU", + "UK" + ], + "fileSizeBytes": "1002100", + "sellerUrl": "https://www.antlogic.com/apps/antnotes", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/simple-antnotes/id846599902?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Antnotes are like paper notes: they are glued to your monitor, but from the other side of the screen.\n\nThis nice and handy application lives in the menu bar for faster access and has the following features:\n\n- customizable background, font and text color\n- pin note to desktop to make it stay atop of other windows\n- translucent notes\n- make new notes by dragging text, images and files to the menu bar icon\n- drag images and sounds to note contents\n- automatically hide notes when inactive\n- quick access via menu bar icon\n- configurable global shortcuts to create new note or show/hide all notes\n- integration with services: create new note from any text in any application\n- snap to screen bounds and other notes\n- archive with all closed notes - do not lose your information by accidentally closing a note\n- smart position choosing for different display configurations\n\nWant more features? Let us know, or check out our Antnotes application!\n\nVisit our support forums: https://www.antlogic.com/forum/", + "currency": "USD", + "artistId": 364746702, + "artistName": "AntLogic", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "ua.com.AntLogic.SimpleAntnotes", + "version": "1.6.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "appletvScreenshotUrls": [], + "supportedDevices": [ + "iPadMini4-iPadMini4", + "iPadProSecondGen-iPadProSecondGen", + "iPhone11-iPhone11", + "iPad71-iPad71", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPhone8Plus-iPhone8Plus", + "iPhone6sPlus-iPhone6sPlus", + "iPadMini5-iPadMini5", + "iPadProFourthGen-iPadProFourthGen", + "iPhoneXS-iPhoneXS", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadAir3-iPadAir3", + "iPadMini4Cellular-iPadMini4Cellular", + "iPadProCellular-iPadProCellular", + "MacDesktop-MacDesktop", + "iPadMini3-iPadMini3", + "iPhoneXR-iPhoneXR", + "iPhoneSE-iPhoneSE", + "iPad611-iPad611", + "iPhone7-iPhone7", + "iPad73-iPad73", + "iPad812-iPad812", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhoneX-iPhoneX", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadPro97-iPadPro97", + "iPad834-iPad834", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPhone5s-iPhone5s", + "iPad75-iPad75", + "iPadMini3Cellular-iPadMini3Cellular", + "iPad878-iPad878", + "iPhone6-iPhone6", + "iPadAir-iPadAir", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadSeventhGen-iPadSeventhGen", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPhoneXSMax-iPhoneXSMax", + "iPad612-iPad612", + "iPadPro-iPadPro", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone11ProMax-iPhone11ProMax", + "iPadMiniRetina-iPadMiniRetina", + "iPad76-iPad76", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad74-iPad74", + "iPhone6s-iPhone6s", + "iPhone7Plus-iPhone7Plus", + "iPadAir2-iPadAir2", + "iPad72-iPad72", + "iPhone6Plus-iPhone6Plus", + "iPadAirCellular-iPadAirCellular", + "Watch4-Watch4", + "iPhone8-iPhone8", + "iPad856-iPad856", + "iPhone11Pro-iPhone11Pro" + ], + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/2b/ce/8f/2bce8ffa-545b-050c-1dd9-2aeef532facd/pr_source.png/406x228bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/fb/36/14/fb36142e-17ba-fdab-90c6-e8f9d3c080ef/pr_source.png/406x228bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/4e/e2/de/4ee2de74-d0ef-010b-19f6-63755aa0175c/pr_source.png/406x228bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/46/8e/bd/468ebdd3-73a9-ec6a-b4da-6931ce887cff/pr_source.png/406x228bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/a4/9c/fa/a49cfa14-69e0-f1cf-3924-6ff878027b2d/pr_source.png/406x228bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/c1/94/cc/c194ccb6-c15a-c0a5-47a6-3ddd625fd98d/pr_source.png/406x228bb.png" + ], + "ipadScreenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/3f/23/5e/3f235e16-c049-8ee8-ebdc-3d52f25f2636/pr_source.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/80/48/1d/80481dff-e404-721c-920e-4688f860cf27/pr_source.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/58/a2/c9/58a2c970-1bd3-6f4d-1bdc-502f75faaa6a/pr_source.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/2c/a6/06/2ca606eb-8b40-219a-34c5-626f79b7e593/pr_source.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/c7/d7/04/c7d70441-51bd-1417-c7bf-a5d2702380e4/pr_source.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/87/e0/75/87e075fd-a979-6151-5744-56ab76ac8f18/pr_source.png/552x414bb.png" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b3/ce/e9/b3cee939-9c28-6e05-f600-2e1b9419e0d2/source/60x60bb.jpg", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b3/ce/e9/b3cee939-9c28-6e05-f600-2e1b9419e0d2/source/512x512bb.jpg", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b3/ce/e9/b3cee939-9c28-6e05-f600-2e1b9419e0d2/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/volodymyr-yahenskyi/id961335645?uo=4", + "isGameCenterEnabled": false, + "advisories": [], + "features": [ + "iosUniversal" + ], + "kind": "software", + "minimumOsVersion": "11.0", + "trackName": "Random: Lists & Decision Maker", + "trackId": 1128190780, + "sellerName": "Volodymyr Yahenskyi", + "releaseNotes": "• Fixed crash when adding items to a new list\n• Fixed lists sync on Apple Watch\n\nThanks for using the Random!\nThis release also contains bug fixes and performance improvements.", + "primaryGenreId": 6012, + "primaryGenreName": "Lifestyle", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2016-07-05T22:00:04Z", + "genreIds": [ + "6012", + "7009", + "6014", + "7004" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-08-29T19:21:51Z", + "trackCensoredName": "Random: Lists & Decision Maker", + "languageCodesISO2A": [ + "EN", + "RU", + "UK" + ], + "fileSizeBytes": "76392448", + "sellerUrl": "https://yahenskyi.dev/random/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 4.6104900000000004212097337585873901844024658203125, + "userRatingCountForCurrentVersion": 1525, + "averageUserRating": 4.6104900000000004212097337585873901844024658203125, + "trackViewUrl": "https://apps.apple.com/us/app/random-lists-decision-maker/id1128190780?uo=4", + "trackContentRating": "4+", + "description": "Need a random number? Or can’t you decide what to do? Random is a powerful app that will solve all such problems.\n\nFeatures:\n• Number generator (from a range 0 - 999999999)\n• Letter generator\n• Dice roller (roll up to 4 regular dices in one go)\n• A custom item from a list generator\n• Yes or No \n• Coin flipper\n• Card generator\n• Rock-Paper-Scissors\n• Map Point\n\nGenerate a new random number simply by tapping a ​randomize button or by touching the Apple Watch screen. For those who want a bit of additional exercise, shaking your iOS device will also result in a new random response.\n\nUse Force Touch for setting the minimum or maximum values in your Apple Watch app. Same for the number of dices​, cards, and selection of lists.\n\nRandom Premium subscription benefits:\n• Sync: Get access to your data from all your devices.\n• Themes: Customize the app with various themes and background images.\n• No advertising.\n\nIf you decide to get Random Premium subscription, your purchase will be charged to your iTunes account. 1 month costs $2.99 and 1 year costs $11.99. Active subscriptions will be auto-renewed 24 hours before the expiry date. You can manage subscriptions from Account in iTunes after subscribing, you’ll also be able to cancel the auto-renewing subscription from there at any time. Any unused portion of the free trial period will be forfeited if you purchase a subscription to Random Premium before your trial expires.\n\nTerms & Conditions: https://yahenskyi.dev/terms-conditions/\nPrivacy Policy: https://yahenskyi.dev/privacy-policy/", + "currency": "USD", + "artistId": 961335645, + "artistName": "Volodymyr Yahenskyi", + "genres": [ + "Lifestyle", + "Family", + "Games", + "Board" + ], + "price": 0.00, + "bundleId": "com.yahenskyi.random", + "version": "2.2.10", + "wrapperType": "software", + "userRatingCount": 1525 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple71/v4/0e/74/bb/0e74bb9a-5ac2-5d5f-516a-5f1c12e95328/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple71/v4/36/54/f0/3654f064-4013-95e6-2683-c89ab8e51102/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple71/v4/1a/75/86/1a758637-9db5-007c-595b-b724e9083321/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b0/7b/ed/b07bed5e-d977-6655-7a6a-d35a90901fba/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b0/7b/ed/b07bed5e-d977-6655-7a6a-d35a90901fba/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b0/7b/ed/b07bed5e-d977-6655-7a6a-d35a90901fba/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/any-case-solutions/id1396419026?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "Task Planner - To Do List", + "trackId": 1063681909, + "sellerName": "Any Case Solutions, OOO", + "releaseNotes": "We’ve updated the app! In the new version:\n- less bugs;\n- minor changes in the interface;\n- some general improvements.\nYour opinion is important to us! Please, leave your feedback - we will gladly consider all your wishes and suggestions.", + "primaryGenreId": 6000, + "primaryGenreName": "Business", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2016-01-07T00:04:36Z", + "genreIds": [ + "6000", + "6007" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-07-17T23:48:12Z", + "trackCensoredName": "Task Planner - To Do List", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "27930644", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/task-planner-to-do-list/id1063681909?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Plan Your Tasks is a productivity tool that allows you to capture your ideas and duties in one place. \nManage everything you have to do while working with many different tasks!\n\nEasy task management - create, organize, and prioritize tasks;\n- Set notifications;\n- Add comments;\n- Sort tasks by categories;\n- Track due dates.\n\nNew approach to agenda\n- Build-in calendar;\n- Coherent tutorial mode;\n- Magic Trackpad 2 support.\n\nCapture all your flash ideas and duties in the calendar and manage your to dos while working with many tasks more effectively.\n\n\nPrivacy Policy: https://anycasesolutions.com/privacy\nTerms Of Use: https://anycasesolutions.com/tos", + "currency": "USD", + "artistId": 1396419026, + "artistName": "Any Case Solutions", + "genres": [ + "Business", + "Productivity" + ], + "price": 0.00, + "bundleId": "com.newtechnologies.iPlanTasksinapp", + "version": "2.1.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/69/a0/58/69a0583d-02fd-1d37-cb33-19b80578e9e5/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/09/be/29/09be2981-4d08-a021-423a-29cc212c1b59/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple7/v4/28/5a/f4/285af4d8-37e6-118a-ff28-a4211eeb1122/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple3/v4/50/4d/52/504d520c-4f8c-b011-d1e0-18addb5700a8/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple3/v4/f2/6e/07/f26e0760-efb1-0353-3ebd-9fd2803f4b3d/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple69/v4/ac/6e/9a/ac6e9aea-8f4b-66bd-6046-c1735f27806f/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple69/v4/ac/6e/9a/ac6e9aea-8f4b-66bd-6046-c1735f27806f/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple69/v4/ac/6e/9a/ac6e9aea-8f4b-66bd-6046-c1735f27806f/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/realmac-software/id310591643?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "Clear – Tasks, Reminders & To-Do Lists", + "trackId": 504544917, + "sellerName": "Realmac Software Limited", + "releaseNotes": "Thanks for using Clear! Just two small enhancements in today’s update:\n\n- We’ve tweaked (increased) the delay before “Click to Clear” appears.\n- We’ve ensured compatibility with OS X El Capitan.\n\nStay productive, and follow @realmacsoftware on Twitter for the latest news!", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2012-11-08T08:00:00Z", + "genreIds": [ + "6007", + "6012" + ], + "formattedPrice": "$9.99", + "currentVersionReleaseDate": "2015-08-19T14:05:32Z", + "trackCensoredName": "Clear – Tasks, Reminders & To-Do Lists", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "13109875", + "sellerUrl": "http://impending.com/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/clear-tasks-reminders-to-do-lists/id504544917?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Over 2.5 million people de-clutter their lives with Clear, so stop stalling and start organizing your daily routine.\n\nClear is the revolutionary to-do and reminders app that makes you more productive. Just start typing to add to-dos, and once you start organizing your life with Clear you’ll wonder how you ever managed without it.\n\n- Simple gestural design that allows you to focus on your to-dos. Designed for the Magic Trackpad, but works great with a mouse too!\n- Full keyboard navigation. Just start typing to create to-dos.\n- Use separate lists to organize every aspect of your life.\n- iCloud sync built-in so you can be productive everywhere.\n- Set reminders so you’ll never forget important tasks.\n- Personalize your Clear lists with themes and make them your own.\n- Syncs with Clear for iOS (available separately on the App Store).\n\nClear is built by a small team, dedicated to bringing you frequent free feature updates. We’d love to know how we can make you even more productive, so get in touch via the App Store “Support” link, or tweet us @UseClear.\n\nClear for Mac and Clear for iOS are not affiliated with or endorsed by CLEAR Wireless.", + "currency": "USD", + "artistId": 310591643, + "artistName": "Realmac Software", + "genres": [ + "Productivity", + "Lifestyle" + ], + "price": 9.99, + "bundleId": "com.realmacsoftware.clear.mac", + "version": "1.1.7", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/cd/bd/44/cdbd44af-06eb-21d6-a793-43dae1077c47/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/e9/8f/17/e98f17c6-787b-b180-6f8d-fb8385ceedd3/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/43/12/a2/4312a25b-f773-9c1a-ddd4-2515d948cc27/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/97/0d/b4/970db444-bbd9-ed77-439e-001bce006e17/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/6b/f0/58/6bf058c1-90ab-5bdf-7c06-18de305efd6d/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/6b/f0/58/6bf058c1-90ab-5bdf-7c06-18de305efd6d/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/6b/f0/58/6bf058c1-90ab-5bdf-7c06-18de305efd6d/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/shenzhen-tomato-software-technology-co-ltd/id966057212?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.12", + "trackName": "Focus To-Do: Pomodoro & Tasks", + "trackId": 1258530160, + "sellerName": "Shenzhen Tomato Software Technology Co., Ltd.", + "releaseNotes": "1.Support new languages\n2.Bug fix", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2017-08-02T03:45:26Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-05-03T04:38:29Z", + "trackCensoredName": "Focus To-Do: Pomodoro & Tasks", + "languageCodesISO2A": [ + "CS", + "EN", + "FR", + "DE", + "ID", + "IT", + "JA", + "KO", + "PL", + "PT", + "RO", + "RU", + "ZH", + "ES", + "ZH", + "TR", + "VI" + ], + "fileSizeBytes": "12135791", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/focus-to-do-pomodoro-tasks/id1258530160?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Focus To-Do combines Pomodoro Timer with Task Management, it is a science-based app that will motivate you to stay focused and get things done. \n\nIt brings Pomodoro Technique and To Do List into one place, you can capture and organize tasks into your todo lists, start focus timer and focus on work & study, set reminders for important tasks and errands, check the time spent at work. \n\nIt's the ultimate app for managing Tasks, Reminders, Lists, Calendar events, Grocery lists, checklist, helping you focus on work & study and tracking your working hours.\n\nFocus To-Do syncs between your phone and computer, so you can access your lists from anywhere.\n\nHow it works:\n 1. Pick a task you need to accomplish.\n 2. Set a timer for 25 minutes, keep focused and start working.\n 3. When the pomodoro timer rings, take a 5 minute break.\n \nKey Features:\n\n- Pomodoro Timer:Stay focused and get more things done.\n Pause and resume Pomodoro\n Customizable pomodoro/breaks lengths\n Notification before the end of a Pomodoro\n Support for short and long breaks\n Skip a break after the end of a Pomodoro\n Continuous Mode\n \n- Tasks Management: Task Organizer, Schedule Planner, Reminder, Habit Tracker, Time Tracker\n Tasks and projects: Organise your day with Focus To-Do and complete your to do, study, work, homework or housework you need to get done.\n Recurring tasks: Build lasting habits with powerful recurring due dates like \"Every Monday\".\n Reminders: Setting a Reminder ensures you never forget important things ever again, you can set up recurring due dates to remind you each and every time. \n Sub-tasks: Break down your task into smaller, actionable items or add a checklist .\n Task Priority: Highlight your day’s most important To-Do with color-coded priority levels.\n Estimated Pomodoro Number: Estimate the workload or set a goal.\n Note: Record more detailed about the task.\n\n- Report: Detailed statistics of your time distribution, tasks completed.\n Support the calculation of the total time of Focus Time.\n Gantt Chart of the Focus Time.\n Statistics on completed To Do. \n Statistics on time distribution of project.\n Trend chart of the completed To Do and the focus time.\n\n- All-Platform synchronization: View and manage your goals wherever you are for better goal achieving.\n Support seamless synchronization within iPhone、Mac、iPad、Apple Watch and other platforms.\n \n- Various Reminding:\n Focus Timer finished alarm, vibration reminding.\n Various white noise to help you focus on work & study.\n\nContact Us: focustodo@163.com, reply within 24 hours.\nWebsite: http://www.focustodo.cn\nPomodoro ™ and Pomodoro Technique ® are registered trademarks of Francesco Cirillo. This app is not affiliated with Francesco Cirillo.\n\nUsers have been focused on our app for 200 million hours, join us and we help you to be focused and increase your productivity, reduce procrastination and anxiety.", + "currency": "USD", + "artistId": 966057212, + "artistName": "Shenzhen Tomato Software Technology Co., Ltd.", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.macpomodoro", + "version": "6.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "appletvScreenshotUrls": [], + "supportedDevices": [ + "iPadMini4-iPadMini4", + "iPadProSecondGen-iPadProSecondGen", + "iPhone11-iPhone11", + "iPad71-iPad71", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPhone8Plus-iPhone8Plus", + "iPhone6sPlus-iPhone6sPlus", + "iPadMini5-iPadMini5", + "iPadProFourthGen-iPadProFourthGen", + "iPhoneXS-iPhoneXS", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadAir3-iPadAir3", + "iPadMini4Cellular-iPadMini4Cellular", + "iPadProCellular-iPadProCellular", + "MacDesktop-MacDesktop", + "iPadMini3-iPadMini3", + "iPhoneXR-iPhoneXR", + "iPhoneSE-iPhoneSE", + "iPad611-iPad611", + "iPhone7-iPhone7", + "iPad73-iPad73", + "iPad812-iPad812", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhoneX-iPhoneX", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadPro97-iPadPro97", + "iPad834-iPad834", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPhone5s-iPhone5s", + "iPad75-iPad75", + "iPadMini3Cellular-iPadMini3Cellular", + "iPad878-iPad878", + "iPhone6-iPhone6", + "iPadAir-iPadAir", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadSeventhGen-iPadSeventhGen", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPhoneXSMax-iPhoneXSMax", + "iPad612-iPad612", + "iPadPro-iPadPro", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone11ProMax-iPhone11ProMax", + "iPadMiniRetina-iPadMiniRetina", + "iPad76-iPad76", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad74-iPad74", + "iPhone6s-iPhone6s", + "iPhone7Plus-iPhone7Plus", + "iPadAir2-iPadAir2", + "iPad72-iPad72", + "iPhone6Plus-iPhone6Plus", + "iPadAirCellular-iPadAirCellular", + "Watch4-Watch4", + "iPhone8-iPhone8", + "iPad856-iPad856", + "iPhone11Pro-iPhone11Pro" + ], + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/95/33/5f/95335f94-26d3-3567-93ac-77d60ab821dd/pr_source.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/03/53/b9/0353b9b1-ef2a-7ff1-a1b8-4124867af41b/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/ef/63/ce/ef63ce41-371a-2508-b101-fb99e9c7758f/pr_source.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/43/19/bb/4319bb4b-5700-0f6b-2c19-7bd386bf186c/pr_source.jpg/552x414bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/5d/51/1a/5d511a30-7fab-fd18-6967-c0caf9674d55/pr_source.jpg/552x414bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/42/50/53/425053d8-2b26-c28a-72db-40323cc62aeb/source/60x60bb.jpg", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/42/50/53/425053d8-2b26-c28a-72db-40323cc62aeb/source/512x512bb.jpg", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/42/50/53/425053d8-2b26-c28a-72db-40323cc62aeb/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/kevin-reutter/id1273424431?uo=4", + "isGameCenterEnabled": true, + "advisories": [], + "features": [ + "gameCenter", + "iosUniversal" + ], + "kind": "software", + "minimumOsVersion": "13.0", + "trackName": "Planny 3 - Smart To Do List", + "trackId": 1289070327, + "sellerName": "Kevin Reutter", + "releaseNotes": "Stay tuned! Planny 4 ships in a few week and will be a free update with many great features!\n\n• SwiftUI \nNow Planny uses SwiftUI in some parts of the app. SwiftUI is an innovative, exceptionally simple way to build user interfaces across all Apple platforms with the power of Swift. Over time more and more of the app will be created with SwiftUI to avoid crashes and improve performance. \n\n• Advanced Cursor Support\nWhen using a Trackpad on iPadOS or on the Mac, specific Elements become larger when you come closer to make clicking easier\n\n• Alternative App icons\nChoose the icon color you’d like in settings (iOS for iPhone only)\n\n• New Onboarding Experience\nA new tutorial shows the key features \n\n• New Purchase View\nThe purchase view is now much simpler. Feel free to subscribe :) \n\n• Fixed deadlines on macOS\n• Direct Deadlines now support days and time \n• Fixed issues with overdue tasks \n\nDo you have any wishes for Planny 4? Feel free to submit ideas on the website!", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2017-10-13T19:16:40Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-07-30T17:37:31Z", + "trackCensoredName": "Planny 3 - Smart To Do List", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "RU", + "ZH", + "ES", + "TR" + ], + "fileSizeBytes": "47687680", + "sellerUrl": "https://www.kevinreutter.de/planny-3/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 4.3897300000000001318767317570745944976806640625, + "userRatingCountForCurrentVersion": 331, + "averageUserRating": 4.3897300000000001318767317570745944976806640625, + "trackViewUrl": "https://apps.apple.com/us/app/planny-3-smart-to-do-list/id1289070327?uo=4", + "trackContentRating": "4+", + "description": "++ Planny was part of Apples favorite Apps from October ++\n\nPlanny is all new and has been rethought from the ground up.\n\nPlanny is your new friend helping you to be more productive. Planny learned everything important from common to do list apps but combines them with intelligence and gamification. In the morning and during the day Planny intelligently recommends tasks and also reminds you if you tend to forget them. You earn productivity points for adding and completing tasks, and also lose them if you shift tasks or forget them. Users can compare their productivity with friends over the week. \n\nPlanny also features all the important features like deadlines, lists / projects, tagging, location based reminders, notes and attachments, routines and more. \n\nKey features\n• Daily list to focus on today's tasks\n• Assistant for creating a productive daily plan\n• Daily review of the last day\n• Routines to train your habits\n• Deadlines and reminders\n• Smart reminders if you tend to forget your tasks\n• Notes for your tasks\n• Weekly productivity ranking of your contacts\n• Rewards\n• Dark mode\n• Lists\n• Siri support\n• Advanced Apple Watch app\n\nPlanny Premium offers additional features like:\n• Calendar view\n• Teamwork with your friends\n• Add Photos from your library to tasks\n• Add Photos from your camera to tasks\n• Location based reminders\n• iCloud sync\n• iCloud backup \n• FaceID Unlock\n• More than 2 lists\n• Printing\n• Sketches\n• Review your recent days\n• Tagging\n\n+++ Planny Premium - Unlock all features and use Planny on iPhone, iPad and Apple Watch (Mac soon) - And get free feature updates over time! +++ \n\nA Planny Premium subscription unlocks all features. Note that iCloud features require an iCloud-Account. \n\nPlanny offers two auto-renewing subscriptions\n\nPremium 3 Months\n$6,99 / 3 Months (may differ in your country & currency)\n\nPremium Annual\n$19,99 / Year (may differ in your country & currency)\n\nPayment will be charged to iTunes Account at confirmation of purchase\nSubscription automatically renews unless auto-renew is turned off at least 24-hours before the end of the current period\nAccount will be charged for renewal within 24-hours prior to the end of the current period, and identify the cost of the renewal\n\nSubscriptions may be managed by the user and auto-renewal may be turned off by going to the user's Account Settings after purchase\n\nWhen your subscription is cancelled and expires, all the features of Planny Pro won't be available any longer. Any unused portion of a free trial period, if offered, will be forfeited when the user purchases a subscription to that publication, where applicable.\n\nPrivacy policy for Planny: http://kevinreutter.de/privacy\nTerms of use / Conditions: http://kevinreutter.de/privacy", + "currency": "USD", + "artistId": 1273424431, + "artistName": "Kevin Reutter", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.kevinreutter.Callisto", + "version": "3.4.2", + "wrapperType": "software", + "userRatingCount": 331 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple/v4/4f/ff/f9/4ffff968-2932-48af-431f-fd1b086026cf/mzl.srudbvwp.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple4/v4/2a/4f/9f/2a4f9fad-c1a7-fa80-56d7-fea2d3beaa0a/mzl.dcyubghz.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple6/v4/56/3a/a7/563aa771-8288-e21a-cfe8-e28e77ffad83/mzl.lzjpfyct.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple4/v4/1e/8d/4e/1e8d4eaa-17f7-5295-1f36-975b62164d19/mzl.yufjavxy.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple4/v4/fb/9b/85/fb9b851d-6ef5-792f-0945-ff2f1a78ce7a/mzl.gycjiioz.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/6b/67/f2/6b67f2d4-2603-ec03-504c-fd408d3577d7/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/6b/67/f2/6b67f2d4-2603-ec03-504c-fd408d3577d7/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/6b/67/f2/6b67f2d4-2603-ec03-504c-fd408d3577d7/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/antlogic/id364746702?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.6.6", + "trackName": "To-do Lists", + "trackId": 416993121, + "sellerName": "Mykola Olshevskyi", + "releaseNotes": "fixed accidentally broken compatibility for Mac OS 10.6-10.7", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2011-03-01T03:09:22Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "$4.99", + "currentVersionReleaseDate": "2015-04-16T19:07:37Z", + "trackCensoredName": "To-do Lists", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "RU", + "UK" + ], + "fileSizeBytes": "2095731", + "sellerUrl": "http://www.antlogic.com/apps/todo-lists/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/to-do-lists/id416993121?mt=12&uo=4", + "trackContentRating": "4+", + "description": "To-do Lists provides simple but powerful interface for tasks management.\n\nTo-do Lists features:\n- Quick, one-click tasks addition/removal.\n- Rich-text editing, in-text links support.\n- Seamless iCloud Reminders synchronization.\n- DropBox synchronization between computers and To-do Lists Mobile for iOS\n- Import/export of to-do lists via text files.\n- Printing of to-do lists or mailing them directly from the application.\n- Backup and restore of whole to-do database.\n- Full drag'n'drop support (make new to-do from web link, file, document, e-mail, or any other text by simply dropping them on to-do list).\n- System services support (make new to-do from any text in any application).\n- Rolled-up, translucent or floating to-do lists.\n- Customized background color, text color, font and checkbox appearance.\n- Reminders.\n- Quick-access icon in system menu.\n\nTo-do Lists usage video:\nhttp://youtu.be/5KB-4sYcelo (or http://youtube.com/AntlogicCompany )\n\nFor more information, visit our site at http://www.antlogic.com/\nor Facebook page:\nhttp://facebook.com/AntlogicCompany\n\nIf you have any problems or questions using To-do Lists - visit our support forums at http://www.antlogic.com/forum/", + "currency": "USD", + "artistId": 364746702, + "artistName": "AntLogic", + "genres": [ + "Productivity", + "Business" + ], + "price": 4.99, + "bundleId": "ua.com.AntLogic.ToDoLists", + "version": "1.7.7", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/a8/e9/42/a8e942ec-8eea-03b3-ea37-cc6e2837fb5e/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/5f/62/5c/5f625c38-c559-3b8d-5042-94e241735ef1/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/aa/a1/e7/aaa1e746-e660-2b6e-6833-d751e7879752/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/c0/6f/7d/c06f7de4-17b9-7475-8778-22a97c13cdce/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/84/3d/8d/843d8de0-6257-7bf0-6a66-6f3ce41af803/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/ad/0d/28/ad0d28c6-ff1d-c394-266a-fdff0b8e9cc6/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/36/28/a3/3628a3e9-6073-0ce4-17d7-9d9a5f479c64/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/a9/ac/b9/a9acb983-76e2-d76d-fbc8-c35388dcee48/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/8f/41/90/8f4190f5-ebb8-370b-c8a6-afb47c56140d/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/09/37/83/09378396-de11-2185-24f4-360be20dbcac/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/71/6f/f0/716ff030-f8ec-536c-41ca-f5116ae1f497/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/71/6f/f0/716ff030-f8ec-536c-41ca-f5116ae1f497/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/71/6f/f0/716ff030-f8ec-536c-41ca-f5116ae1f497/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/the-omni-group/id281731738?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.14", + "trackName": "OmniFocus 3", + "trackId": 1346203938, + "sellerName": "The Omni Group", + "releaseNotes": "OmniFocus 3.9.2 is a minor update focused on bug fixes.\n\n• Omni Automation — OmniFocus now recognizes simple plug-ins that use the .omnifocusjs file extention.\n• First Run — Improved reliability of the first run flow.\n• Notice Bar — Fixed bugs related to the Trial Mode & Free Viewer notice bars.\n\nIf you have any feedback or questions, we’d love to hear from you! The Omni Group offers free tech support; you can email omnifocus@omnigroup.com, call 1–800–315–6664 or 1–206–523–4152, or tweet @OmniFocus.\n\nIf OmniFocus empowers you, we would appreciate an App Store review. Your review will help other people find OmniFocus and make them more productive too.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2018-09-24T12:28:36Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-08-27T17:54:49Z", + "trackCensoredName": "OmniFocus 3", + "languageCodesISO2A": [ + "NL", + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "64931473", + "sellerUrl": "https://www.omnigroup.com/omnifocus/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/omnifocus-3/id1346203938?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Two-week free trial! OmniFocus Standard and Pro are in-app purchases, with discounts for people who bought earlier versions of OmniFocus for Mac through the Mac App Store. Or you can get OmniFocus for iOS, Mac, and web for just one price with the OmniFocus Subscription. Download the app for details.\n\nUse OmniFocus to accomplish more every day. Create projects and tasks, organize them with tags, focus on what you can do right now — and get stuff done.\n\nOmniFocus — now celebrating 10 years as the trusted, gold-standard to-do list app — brings unrivaled power and flexibility to your Mac, making it easy to work the way you want to work.\n\nOmniFocus manages everything in your busy life. Use projects to organize tasks naturally, and then add tags to organize across projects. Easily enter tasks when you’re on the go, and process them when you have time. Tap the Forecast view — which shows both tasks and calendar events — to get a handle on your day. Use the Review perspective to keep your projects and tasks on track.\n\nThen let our free syncing system make sure your data is the same on every Mac. (And on OmniFocus for iOS and Web, available separately.) Because your data is encrypted, it’s safe in the cloud.\n\nSTANDARD FEATURES (VIA IN-APP PURCHASE)\n\n• NEW: Tags add a powerful additional organizing tool. Create tags for people, energy levels, priorities, locations, and more.\n• NEW: The Forecast view shows your tasks and calendar events in order, so you can better see what’s coming up in your day.\n• NEW: Enhanced repeating tasks are easier than ever to set up — and they work with real-world examples such as the first weekday of the month.\n• NEW: The Modern, fresh-but-familiar design helps you focus on your content.\n• Inbox is where you quickly add tasks — save them when you think of them, and organize them later.\n• Syncing supports end-to-end encryption so that your data is safe wherever it’s stored, on our server or yours.\n• Notes can be attached to your tasks, so you have all the information you need.\n• Attachments — graphics, video, audio, whatever you want — add richness to your tasks.\n• View Options let you customize each perspective by deciding what it should show and how it should filter your tasks.\n• The Review perspective takes you through your projects and tasks — so you stay on track.\n• OmniFocus Mail Drop adds tasks via email and works with services like IFTTT and Zapier (if you’re using our free syncing server).\n• The Today Widget shows you your most important items — you don’t even have to switch to the app to know what’s up.\n• Support for TaskPaper Text and omnifocus:///add and /paste lets you automate using URLs.\n\nPro features make OmniFocus even more powerful:\n\nPRO FEATURES (VIA IN-APP PURCHASE)\n\n• Custom perspectives help you create new ways to see your data by filtering and grouping projects and tags. NEW: The filtering rules are simpler to use while being more powerful than ever, letting you combine rules with “all,” “any,” and “none.” You can also choose any image to use as your custom perspective’s icon, and a custom tint color to go with it.\n• NEW: Today’s Forecast can include items with a specific tag, and you can reorder those tasks however you choose, so you can plan your day better.\n• The customizable sidebar lets you organize your perspectives the way you want to, for super-fast access.\n• The Today Widget shows a perspective of your choice in Notification Center.\n• AppleScript support opens up a world of automation, using Apple’s Mac scripting language.\n\nDownload OmniFocus right now and start your free trial! The app includes a manual, and there’s plenty more documentation on the website.\n\nSUPPORT\n\nIf you have feedback or questions, our Support Humans would love to hear from you! Send email to omnifocus@omnigroup.com, call us at at 1-800-315-6664 or +1-206-523-4152, or reach us on Twitter at @omnifocus.\n\n\nSubscription Terms of Service: https://www.omnigroup.com/legal", + "currency": "USD", + "artistId": 281731738, + "artistName": "The Omni Group", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.00, + "bundleId": "com.omnigroup.OmniFocus3.MacAppStore", + "version": "3.9.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/1a/72/1d/1a721d98-fbc4-ed9e-2aae-ef9d5b538693/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/a2/b1/10/a2b110fd-aa90-286a-658b-2abd85bd1c68/mzl.menowpkq.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/26/f3/32/26f3322f-8ef9-6171-2864-715f571300e6/mzl.qxibkqwt.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/a4/1b/12/a41b12dc-6e1d-74ff-7ad3-1d6888c31462/mzl.fdlcjqnh.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/83/83/24/83832412-85d1-78ff-a9ab-86a37b31121d/mzl.ateekpxr.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/e6/7c/c7/e67cc703-d274-a1fc-88af-b5a8ce9cbfd8/mzl.grtjmgef.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/18/a8/f2/18a8f211-61b5-7b7e-b343-784b260de31d/mzl.ulsghntx.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/5a/cf/6c/5acf6c83-c496-d5fb-2445-96ef44f13a82/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/5a/cf/6c/5acf6c83-c496-d5fb-2445-96ef44f13a82/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/5a/cf/6c/5acf6c83-c496-d5fb-2445-96ef44f13a82/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/masterbuilders/id896347016?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.14", + "trackName": "Focus - Time Management", + "trackId": 777233759, + "sellerName": "Masterbuilders", + "releaseNotes": "Subscription status is now properly unlocked on all devices.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2013-12-19T19:16:50Z", + "genreIds": [ + "6007", + "6017" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-02-12T20:37:50Z", + "trackCensoredName": "Focus - Time Management", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "JA", + "ZH", + "ES" + ], + "fileSizeBytes": "24637530", + "sellerUrl": "https://www.focusapp.io", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/focus-time-management/id777233759?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Meet Focus: the best time manager for iPhone, iPad, Apple Watch and Mac. Focus is the most elegant and professional way to get more wore done, working in highly efficient work sessions, one task at a time.\n\n“[…] a tool that can genuinely make people more productive\" – MacStories.net\n\n“[…] a must-have for anyone who finds themselves easily getting distracted or forgetting to take occasional breaks.\" – iDownloadBlog.com\n\n======================\nFEATURES\n======================\n\nFOCUS SESSIONS\nFocus Sessions are a highly efficient way to work. Focus for 25 minutes, then take a short break to relax your mind. After four sessions, take a 15 to 20 minute break. This method maximizes energy, stimulates creativity and promotes a sense of achievement.\n\nTASK MANAGER\nFocus includes a lightweight task manager that lets you organize the things you want to work on intuitively. By working on one task at a time, you won’t be distracted and can focus all your attention towards completing that goal. That way you’ll be perfectly organized on your path to success.\n\nIN-DEPTH STATISTICS\nCheck what you’ve already done! Focus keeps track of your work and offers in-depth and motivating statistics. See your daily, weekly and monthly activity so you don’t lose sight of the big picture. \n\nFOCUS EVERYWHERE\nSeamlessly use Focus on your Mac, iPad, iPhone, and Apple Watch. Sync across your devices using iCloud; use Handoff to pick up your current work on another device and get up-to-the-second data with iCloud Push. You can also use the Today widget to quickly glance at your progress, import tasks using the handy Action extension, and more.\n\nFOCUS & APPLE WATCH: A PERFECT FIT\nUsing Focus on your wrist is a natural fit. The independent Apple Watch app is made for for easy and lightweight interactions that lets you control sessions and track your progress throughout the day. With the Focus complication, you can customize your watch face to see your current progress at a glance.\n\nBEAUTIFUL INTERFACE\nThe name says it all: Focus draws your attention to the most important things. It’s designed to be unobtrusive, accessible and easy-to-use. You’ll intuitively master its collection of features just by using them.\n\n======================\nSUBSCRIPTION PRICING\n======================\n\nFocus offers two subscription options: \nFocus Monthly at $4.99/ month \nFocus Yearly at $39.99/ year\n\nThe subscription unlocks all features on all devices (Mac, iPhone, iPad and Apple Watch).\n\nTRY IT FREE \nFocus Monthly comes with a 3-day free trial period, Focus Yearly with a 7-day free trial period. If you cancel before the end of the trial, you will not be charged for the subscription.\n\nSUBSCRIPTION TERMS\nPayment will be charged to your Apple ID account at the confirmation of purchase or after the free trial period if offered. \n\nYou subscription will automatically renew unless it is canceled at least 24 hours before the end of the current period. Your account will be charged 24 hours prior to the end of the current period. \n\nYou can manage and cancel your subscriptions by going to your account settings in the App Store after purchase. Any unused portion of a free trial will be forfeited when you purchase a subscription\n\n======================\nCONTACT\n======================\n\nIf you have any questions or ideas, please write us at hello@masterbuilders.io\n\nTwitter: @focusappio\nhttps://www.masterbuilders.io\n\n\n\nPrivacy Policy: https://www.masterbuilders.io/privacy\nTerms of Service: https://www.masterbuilders.io/terms", + "currency": "USD", + "artistId": 896347016, + "artistName": "Masterbuilders", + "genres": [ + "Productivity", + "Education" + ], + "price": 0.00, + "bundleId": "com.malteundjan.focus-osx", + "version": "6.2.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/35/03/5a/35035a62-e2da-2f4b-6ece-63475bd7cd02/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/b5/ac/1f/b5ac1fe2-431d-e45d-63e0-57ddbfbd525f/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/6c/18/ee/6c18eeff-ca66-2b01-82f3-f81576336ab7/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/12/30/fb/1230fb0c-42fd-1a80-9379-29be0ba0f612/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/12/30/fb/1230fb0c-42fd-1a80-9379-29be0ba0f612/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/12/30/fb/1230fb0c-42fd-1a80-9379-29be0ba0f612/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/niklas-behrens/id969210609?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "1Focus: Website & App Blocker", + "trackId": 969210610, + "sellerName": "Niklas Behrens", + "releaseNotes": "- Allows updating 1Focus while blocking is active\n- Fixed toolbar overflow on macOS High Sierra\n- Improved status item width\n- Fixed quick start menu starting wrong task\n- Other bug fixes", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2015-03-15T05:54:46Z", + "genreIds": [ + "6007", + "6017" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-07-18T23:51:25Z", + "trackCensoredName": "1Focus: Website & App Blocker", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "JA", + "KO", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "8338821", + "sellerUrl": "https://onefocusapp.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/1focus-website-app-blocker/id969210610?mt=12&uo=4", + "trackContentRating": "4+", + "description": "1Focus creates an oasis for focused work by disabling access to specific websites and apps. Use it to schedule a bit of automated self-restraint when you find yourself clicking away from what really needs to get done. Ideal for students, freelancers and writers.\n\n\"If you find yourself on Facebook or checking your email every five minutes, you need 1Focus.\" – Pagoda Technologies\n\n\"1Focus is one of the best apps for tuning out the diversions that are most distracting for you.\" – Tyler Horvath, CEO of Tyton Media\n\n\nFREE FEATURES\n\n• Block websites in Google Chrome, Safari, Opera, Microsoft Edge and Brave\n• Block apps (e.g. email, games)\n• Block internet access by blocking web browsers\n• You cannot cancel active blocks once you close the 1Focus window\n• Create your own task presets (up to 2)\n• Dark Mode\n\n\n1FOCUS PRO\n\n• Schedule recurring block events (e.g. Mon - Fri)\n• Work break timer\n• Unlimited task presets\n• Block all websites/apps except specific ones\n• Suspend blocking for a limited time\n• Block URL keywords (e.g. *gaming*)\n• Block popular websites by category (e.g. Social Media)\n\nTry it free for 14 days. $1.99/month or $9.99/year after.\n\nPrices may vary by location. Subscriptions are charged to your iTunes Account. They automatically renew unless you cancel them in your Account Settings at least 24 hours before the end of the current period. Your Account is charged for renewal within 24 hours prior to the end of the current period. Terms of use: https://onefocusapp.com/terms\n\n\nCUSTOMER SUPPORT\n\nDo you have any questions or suggestions?\nonefocusapp.com/support", + "currency": "USD", + "artistId": 969210609, + "artistName": "Niklas Behrens", + "genres": [ + "Productivity", + "Education" + ], + "price": 0.00, + "bundleId": "com.onefocusapp.OneFocus", + "version": "3.4.4", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/5f/6c/af/5f6cafb3-8f9d-5165-285e-b3da4d640d58/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/9e/15/3a/9e153a86-f869-6972-5144-9c45c699678a/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/52/bd/4b/52bd4b45-da16-b678-19e1-76ff109252b4/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/ec/24/3f/ec243f38-e6a5-88ed-ca7e-e503042e2888/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/a8/a8/a8/a8a8a8be-4d88-e2aa-8683-fcfc2c6c8e63/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/9d/07/bf/9d07bf3a-c2f0-f3ef-083e-1745e69c8274/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/9d/07/bf/9d07bf3a-c2f0-f3ef-083e-1745e69c8274/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/9d/07/bf/9d07bf3a-c2f0-f3ef-083e-1745e69c8274/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/nozbe-com/id303308791?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.12", + "trackName": "Nozbe: Productive team", + "trackId": 508957583, + "sellerName": "apivision.com", + "releaseNotes": "• Fixed a problem with stats for completed tasks", + "primaryGenreId": 6000, + "primaryGenreName": "Business", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2012-05-23T07:00:00Z", + "genreIds": [ + "6000", + "6007" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-02-03T09:32:43Z", + "trackCensoredName": "Nozbe: Productive team", + "languageCodesISO2A": [ + "NL", + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PL", + "PT", + "RU", + "ZH", + "ES", + "ZH", + "TR" + ], + "fileSizeBytes": "9348964", + "sellerUrl": "https://nozbe.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/nozbe-productive-team/id508957583?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Nozbe – Collaborate with your team efficiently and get everything done!\n\nKEY NOZBE FEATURES: FOR TEAMS AND INDIVIDUALS\n\nAn invaluable project management app for teams\n\n• Collaborate to get your work done – quickly create and share projects with your team \n• Communicate smoothly and ditch chaotic e-mails – use task comments to exchange information with your colleagues and customers, and have all the info required in one safe system\n• Stay up-to-date – set up reminders and productivity reports\n• Move your projects forward – delegate tasks, and use deadlines and handy integrations\n• Organize your team's work – using a flat structure, task categories and project labels\n• Access your team projects from anywhere – install Nozbe on your desktop and mobile devices\n• Make sure your data is safe – all Nozbe connections are secure and encrypted using SSL\n• Integrations – Dropbox, Box, One Drive, Google Drive, Evernote, Google Calendar\n\nPersonal to-do list and task manager\n\n• Easily add 'to-do's and tasks on the go – with Siri, through e-mail and more\n• Access your tasks from anywhere – install Nozbe on all your devices, including Apple Watch\n• Manage your priorities – add deadlines, time needed and categories\n• Run your projects efficiently – keep all tasks, comments and files in one place, manage projects, and use labels\n• Never miss a thing thanks to reminders and calendar integrations\n• Use templates and repeat tasks to automate things and save your time\n• Work offline and have your data synchronized once you're back online\n\nJoin over 500,000 professionals and their teams from all over the world in using Nozbe and boost your efficiency. Use Nozbe's flexibility to create your own productivity system. Get your projects done on time and stay organized – alone and with your team.\n\nNOZBE Subscriptions (monthly or yearly):\n\n• NOZBE FREE – The full version of the app with up to 5 active projects and max. 100MB of data. Available after 30 days of the Nozbe Trial. Exclusively for single-user accounts.\n• NOZBE SOLO/DUO - For busy professionals, unlimited projects, shared projects, unlimited storage.\n• NOZBE SMALL BUSINESS - For small growing teams, unlimited projects, shared projects, unlimited storage.\n• NOZBE BUSINESS - For growing teams and businesses, additional shared projects features, more comprehensive productivity reports, dedicated premium support.\n\nYour payment will be charged to your iTunes Account once you confirm your purchase. Your iTunes account will be charged again when your subscription automatically, renews at the end of your current subscription period unless auto-renew is turned off at least 24 hours prior to the end of the current period. You can manage or turn off auto-renew in your Apple ID Account Settings at any time after purchase.\n\nTerms and Privacy policy: nozbe.com/terms", + "currency": "USD", + "artistId": 303308791, + "artistName": "Nozbe.com", + "genres": [ + "Business", + "Productivity" + ], + "price": 0.00, + "bundleId": "com.nozbe.mac", + "version": "3.13", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/cd/0a/55/cd0a552e-00e7-a1ef-b9be-8cf55a1f22bd/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/da/df/a2/dadfa2c7-67de-d41b-c862-c860be7ec80b/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple128/v4/89/89/3b/89893baf-cb17-bc37-da1b-4acaac52313e/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/ac/71/9f/ac719fb2-2e24-c746-3e3c-e1990ae45430/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/cf/c9/6f/cfc96f41-5169-ba4e-7c91-d306a7affdbf/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/ec/cf/bf/eccfbf43-32ed-9df3-5f59-251a326d6522/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/71/73/d27173b8-0b26-2ea4-b072-a45a4403d331/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/71/73/d27173b8-0b26-2ea4-b072-a45a4403d331/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/71/73/d27173b8-0b26-2ea4-b072-a45a4403d331/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/ind-ie/id1042780453?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.11", + "trackName": "Better Blocker", + "trackId": 1121192229, + "sellerName": "Article 12", + "releaseNotes": "# Good news!\n\nIn the last update, we informed you that that version would be the last update to Better under the Ind.ie account as we are moving to Small Technology Foundation. Since then, Apple has stepped in and answered our call for help so we can keep updating the app from our current account.\n\n## What this means for you:\n\n - Everything will continue as before, you don’t need to do anything.\n - This app will continue to get updates.\n - At some point, you will see our organisation name change from Ind.ie (Article 12) to Small Technology Foundation.\n\nLaura and I would like to take this opportunity to thank all of you who expressed your support during this period and donated to our not for profit to help us during this difficult time.", + "primaryGenreId": 6002, + "primaryGenreName": "Utilities", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2016-09-22T02:55:17Z", + "genreIds": [ + "6002", + "6007" + ], + "formattedPrice": "$1.99", + "currentVersionReleaseDate": "2020-01-20T21:31:19Z", + "trackCensoredName": "Better Blocker", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "10318394", + "sellerUrl": "https://better.fyi", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/better-blocker/id1121192229?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Better is a privacy tool for Safari that protects you from trackers and privacy-eroding ads on the web.\n\nMake your web experience safer, lighter, and faster in Safari on Mac. \n\nHow is Better different?\n• Blocks tracking scripts, tracking pixels, and behavioural advertising.\n• Uses our unique, hand-curated, and open tracker database based on our own web crawls. Browse the encyclopaedia-like tracker entries on our web site if you fancy learning more. \n• We identify and block the most prevalent trackers. This makes Better’s block list lightweight and effective.\n• We base our blocking decisions on the principles of the Ethical Design Manifesto (https://ind.ie/ethical-design). \n• Developed and curated by Ind.ie – that’s Laura and Aral – a tiny two-person-and-one-husky not-for-profit striving for social justice in the digital age.\n• Open, transparent, and free as in freedom.\n\nOther features:\n• Improves the readability of popular web sites. \n• Spotlights the worst offenders… Did you know that the worst site we found on the web had 172 trackers? Better blocks them all and makes that site 4× lighter and 15.8× faster!\n• Blocks blocker blockers (try saying that quickly a few times!) Whenever we can, we try to protect you from sites that try to put you at risk by forcing you to turn off your privacy tools.\n• Your personal Do Not Block list enables you to turn Better off for sites that don’t play well with Better. Easily contact us about those sites so we can fix the experience for everyone.\n\n5 star App Store reviews from around the world:\n• “Best blocker I've tried yet: Clear and straight forward business model plus actually works. Feel safe blocking trackers and knowing the developers won't sell you out. Can't beat that.” (USA)\n• “This app does everything it promises to do and sets a new gold standard in content blockers.” (Belgium)\n• “This piece of software is just THE most essential thing to stay sane on today’s world wide web.” (Germany)\n• “Thanks for such an incredibly simple app to make the web just that bit better!” (UK)\n• “I love better, I use it on my phone and I’m very happy to see it on the Mac!” (Germany)\n• “Does exactly what it advertises, constantly updated, and I really support the mission of this company.” (USA)\n• “Fantastic blocker with a rational, ethical approach to privacy and monetization in this digital age.” (USA)\n• “Honest privacy: Thanks for defending the public against surveillance capitalism!” (USA)\n• “Buying this not only benefits you, it actively supports the ethos of internet privacy.” (USA)\n• “Fantastic: The best adblocker I have tried.” (USA)\n• “Best Adblocker out there: Unobtrusive. Works fast & reliable” (Germany)\n• “It just works!” (Germany)\n• “A fantastic approach to ad blocking & preservation of user privacy” (Australia)\n• “Thanks to these two brave people who made this app. It gives me at least some peace of mind about the nasty surveillance practises of the big tech companies.” (Netherlands)\n• “Better web: Fixes so many sites without you even noticing it.” (Finland)\n• “Best ad & tracking blocker-type app I've used on the appstore!” (Norway)\n• “Great app: Does exactly as described, works it’s magic in the background whilst I’m browsing the web.” (Sweden)\n• “Speed and privacy: Easy to install and does exactly what it’s supposed to: frees your browsing of megabytes of privacy-invading tracking. Even if you don’t mind unknown third parties building up and selling profiles of your browsing behaviour (and everything that can be inferred form it), the speed increases of both download and rendering by removing those trackers really surprised me. It’s simply made browsing the web far quicker and is worth the money for that alone.” (UK)\n• “It's good to see such nice people stand up to tracking and malvertising. This app does everything it promises to do and sets a new gold standard in content blockers. Spend a few bucks to take back the web from disrespectful business models. You won't regret it.” (Belgium)", + "currency": "USD", + "artistId": 1042780453, + "artistName": "Ind.ie", + "genres": [ + "Utilities", + "Productivity" + ], + "price": 1.99, + "bundleId": "better.fyi.mac", + "version": "2020.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple5/v4/e4/4a/75/e44a75a7-624c-d60b-0e40-3f0e655da61a/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple1/v4/34/9e/03/349e0304-90fc-3838-9cec-6c706efc92ea/mzl.zwihxdxb.tif/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple5/v4/1f/23/2e/1f232eaf-95d1-e5af-1f9e-2d7c4061bb55/mzl.qvfjfjne.tif/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple3/v4/8d/6c/0b/8d6c0b27-fc9e-c290-1329-7e2049f34412/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/ce/62/8f/ce628f72-a55d-cbca-5544-a327e12762be/mzl.pqwcptst.tif/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple6/v4/68/d7/4e/68d74e3e-919e-bf82-6c4f-b57ec0ea30e9/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple6/v4/68/d7/4e/68d74e3e-919e-bf82-6c4f-b57ec0ea30e9/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple6/v4/68/d7/4e/68d74e3e-919e-bf82-6c4f-b57ec0ea30e9/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/delullo-software-llc/id409729333?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "All Things Money Lite", + "trackId": 892274130, + "sellerName": "DeLullo Software, LLC", + "releaseNotes": "The All Things Money Lite 1.4.0 update improves functionality and stability, and is recommended for all users.\n\nNew features include:\n\n- Enabled QFX files with transactions to be imported.\n- When importing a file, if transaction categories are not specified then they will be automatically set to the last category used by the payee.\n- Added stock market technical indicators for Aroon, Money Flow, Relative Strength, and Fast Stochastic.\n- Added the ability to simultaneously view weekly and daily stock technicals.\n\nStability improvements include:\n\n- Added support for importing files with international character encodings.\n- Fixed two bugs that affected printing functionality.\n- Fixed QIF exports, which incorrectly had a percent symbol in the date field.\n- Fixed international currency formatting of the payment and deposit columns.\n\nFor detailed release notes, please visit: http://www.delullosoftware.com/apps/AllThingsMoney/ReleaseNotes.pdf", + "primaryGenreId": 6015, + "primaryGenreName": "Finance", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2014-07-07T07:00:00Z", + "genreIds": [ + "6015", + "6000" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2015-09-15T12:55:11Z", + "trackCensoredName": "All Things Money Lite", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "1358452", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/all-things-money-lite/id892274130?mt=12&uo=4", + "trackContentRating": "4+", + "description": "All Things Money (ATM) was created with the mindset that good finance software doesn’t need to be expensive, to contain advertisements, or to log into your bank account. It should be comprehensive and provide interconnected services. It should also be efficient by supporting multiple input formats, auto-completing certain fields, and automatically logging recurring transactions. ATM delivers on these goals and more.\n\nIf you are curious, please give it a try. Download All Things Money Lite for free to determine whether ATM is a good fit for you. When you want to upgrade, use the export and import menu options to transfer data between apps.\n\nATM capabilities include the following.\n\nAccount Dashboard\n- The innovative layout gives perspective to all of your liquid assets.\n- Track bank, credit card, stock market, and U.S. savings bond accounts.\n- Calculate net worth.\n- Sort transactions.\n- Split transactions.\n- Add memos to transactions.\n- Import bank, credit card, and stock market transactions from QIF and CSV files.\n- Import bank and credit card transactions from OFX files. (At this time, stock market transactions are not supported via OFX imports.)\n- Import U.S. savings bonds from treasurydirect.gov HTML files.\n- ATM auto-fills payee names and categories.\n- The bank-account paradigm enables you to earmark money.\n\nBill Planner\n- Track payments and deposits.\n- Track automatic stock market trades that are typical of 401k-type accounts.\n- Elect to automatically move up bill dates to avoid weekends and U.S. holidays. \n- ATM supports the following payment intervals: daily, weekly, bi-weekly, semi-monthly, monthly, bi-monthly, quarterly, once every four months, semi-annually, annually, bi-annually.\n\nStay on Budget\n- Create a budget based on transactions from the prior year.\n- Update budget goals based on your expected bills and deposits.\n- Update actuals from account transactions.\n- ATM supports annual, monthly, and custom-period budgets.\n- ATM provides color-coded alerts to track spending excess.\n\nPlan for Retirement\n- Seed the retirement calculator with your account information.\n- Calculate how much money you will have when you retire.\n- Calculate the annuity that your retirement will generate.\n- ATM also includes a general-purpose, compound-interest calculator that has six unique equations and two combination options for expediency. This calculator enables reverse computations; it calculates how much money you need to retire based on your desired annuity, interest rate, and life expectancy.\n\nMonitor the Stock Market\n- Create a watch list that saves stock symbols and time intervals.\n- Display a stock’s price and volume alongside technical indicators like Bollinger Bands and Moving Average Convergence Divergence (MACD).\n- ATM supports daily and weekly stock charts.\n\nMortgage Analysis\n- Create an amortization table and track your mortgage balance as you pay down principal. \n- Compare the costs of buying and renting.\n\nInventory Tracking\n- Keep track of your collections.\n\nCreate Reports\n- Generate plots of net worth and stock prices.\n\nLite Version Restrictions\n- One bank\n- Two accounts\n- Three bills\n- Two stock watch list entries\n- Two inventory categories with three items each\n- Two retirement calculations per session\n- One compound-interest calculation per session\n- One amortization calculation per session\n\nMinimum requirements: screen resolution of 1280 x 800 or higher.", + "currency": "USD", + "artistId": 409729333, + "artistName": "DeLullo Software, LLC", + "genres": [ + "Finance", + "Business" + ], + "price": 0.00, + "bundleId": "com.delullosoftware.AllThingsMoneyLite", + "version": "1.4.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/36/fe/ff/36feffbc-a07b-e61e-f0e5-88dcc4455871/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/c6/85/09/c68509b2-c2c8-3000-bf85-4ead056b26f3/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/18/42/aa/1842aab5-0500-b08b-b9a5-fc364f83fbdb/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/de/b9/99/deb99962-f1d0-a7ad-0fc8-ef4bf906515b/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/41/70/7d/41707d88-8ba1-5a28-1f2f-0f2e43a73706/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/be/a3/a2/bea3a233-d82f-34bf-b0cd-38f262b04939/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/e5/41/b4/e541b49d-06ed-9ec6-1544-3df88c8dc340/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/8f/08/49/8f0849f4-7d20-567f-47e6-ef1bfb901619/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/7d/74/8a/7d748af9-50fa-e009-39a8-b5eb7774b2be/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d4/b9/74/d4b974d7-0c4c-1515-49ec-ecedec84c5a0/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d4/b9/74/d4b974d7-0c4c-1515-49ec-ecedec84c5a0/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d4/b9/74/d4b974d7-0c4c-1515-49ec-ecedec84c5a0/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/tinybop-inc/id682046582?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.15.0", + "trackName": "Things That Go Bump", + "trackId": 1472954003, + "sellerName": "Tinybop Inc.", + "releaseNotes": "* BOOM *, this is a BIG update. The house spawns a game room, complete with video games you can ENTER INTO. It's fun and a little bit weird! Try it! \n»-(¯`·.·´¯)->", + "primaryGenreId": 6014, + "primaryGenreName": "Games", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2019-10-18T07:00:00Z", + "genreIds": [ + "6014", + "7001", + "7009" + ], + "currentVersionReleaseDate": "2020-03-18T17:39:23Z", + "trackCensoredName": "Things That Go Bump", + "languageCodesISO2A": [ + "EN" + ], + "sellerUrl": "http://tinybop.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/things-that-go-bump/id1472954003?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Have you ever heard something go bump in the night? \nPerhaps you’ve caught wind of a spirit or sprite. \nWhen the house is asleep,\nand there’s dark all around, \nspirits from objects awake and abound. \n\nThe spirits are crafty and like to cause trouble. \nThey're called yōkai and together, they double. \nMixing and mashing, they join to fight. \nCan you help them conquer this mysterious night? \n\nPlay with one person, two, three or four. \nFirst you’ll need to escape the dark junk drawer. \n\n. . . . . . . . . . . . . . . . . . . .\nIn Things That go Bump, familiar objects and rooms come to life every night, and nothing looks quite as does in the day. Create your creature, and battle your friends, but beware the house spirits! They can destroy and they can give life. Battle, create, and make your way through the rooms of the house, and slowly you will unravel the secret of Things that Go Bump. \n\nFeatures:\n * Spirits wake up objects and create yōkai (spirit creatures)\n * Combine everyday objects like umbrellas, staplers, cheese graters and more to create everchanging characters \n * Connect to other players via Game Center and face-off against other spirit creatures and house spirits\n * Add or swap objects to give your spirit creature new skills\n * Gain energy by making mischief, defeating other yōkai, and conquering the house spirits\n * Advance through the house (new rooms will be added throughout the year)\n * Test your curiosity and creativity with new challenges in every room\n * Play with 1-4 players across iPads, iPhones, iPods, AppleTVs and Macs\n * Fun and challenging for the whole family\n * Intuitive, safe, hilarious kid-friendly design\n * New levels introduced roughly every 2 months\n * Original artwork by Adrian Fernandez\n * Original sound design\n\nTinybop, Inc. is a Brooklyn-based studio of designers, engineers, and artists. We make toys for tomorrow. We’re all over the internet.\n\n Visit us: www.tinybop.com\n Follow us: twitter.com/tinybop\n Like us: facebook.com/tinybop\n Peek behind the scenes: instagram.com/tinybop\n\nWe love hearing your stories! If you have ideas, or something isn’t working as you expect it to, please contact us: support@tinybop.com.\n\nPsst! It's not Tiny Bop, or Tiny Bob, or Tiny Pop. It's Tinybop. :)", + "currency": "USD", + "artistId": 682046582, + "artistName": "Tinybop Inc.", + "genres": [ + "Games", + "Action", + "Family" + ], + "bundleId": "uikitformac.com.tinybop.thingamabops", + "version": "1.3.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/8d/13/b2/8d13b22b-e96a-a0dd-219c-892ec2ba6f60/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/bf/53/6a/bf536a44-dd1e-43c3-89d0-5fc1928001e8/mzl.lphzucrn.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/7e/09/9c/7e099c9b-f7c8-3079-f1a0-a0fac192807b/mzl.fpmmmnpy.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/16/a9/6c/16a96c08-ad0d-fd57-4b66-baeb37cd02a2/mzl.jaithmaa.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/0e/13/90/0e139010-77ef-9d9e-2171-1d146d4467ad/mzl.kquqgdzh.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/36/07/3f/36073f03-7e1e-208d-35c4-9b1e3f57029a/mzl.skrcrjvg.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/3d/06/42/3d0642af-9593-5788-5f31-4a8433e6eb97/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/3d/06/42/3d0642af-9593-5788-5f31-4a8433e6eb97/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/3d/06/42/3d0642af-9593-5788-5f31-4a8433e6eb97/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/adolfo-vera-blasco/id898601649?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.14", + "trackName": "All Things Done", + "trackId": 1062002496, + "sellerName": "Adolfo Vera Blasco", + "releaseNotes": "New year, new name\n\nSay hello to All Thing Done", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2015-12-17T01:13:07Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "$2.99", + "currentVersionReleaseDate": "2019-03-25T05:37:45Z", + "trackCensoredName": "All Things Done", + "languageCodesISO2A": [ + "EN", + "ZH", + "ES" + ], + "fileSizeBytes": "8243793", + "sellerUrl": "http://tomates.desappstre.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/all-things-done/id1062002496?mt=12&uo=4", + "trackContentRating": "4+", + "description": "All Things Done helps you to improve your productivity using one of the most effective management method in personal or pair working environments.\n\nThe app is highly configurable in aspects like time for breaks or tasks, notifications, task series, all of it in a beautiful and detailed interface.\n\nWe say Hi! to Touch Bar\nProud to announce All Things Done adds support to Touch Bar on the new MacBook Pro.\n\nInternational.\nSince version 5 we speak english and Español también.\n\nInside All Things Done you will find...\n+ iCloud sync with all your devices\n+ Theme support\n+ Reports to compare your productivity\n+ Beautiful graphs to check your progress in a blink of an eye\n+ Customize task time\n+ Customize short and long break time\n+ Choose to play a sound or not when a break or a task has finished\n+ Set how many tasks are a Work Serie\n+ The task timer can be paused/resumed/reseted\n+ Session and Goal counters can be reseted", + "currency": "USD", + "artistId": 898601649, + "artistName": "Adolfo Vera Blasco", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 2.99, + "bundleId": "com.desappstre.Pomodoro", + "version": "10", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/0e/b3/3f/0eb33fce-c85e-01ca-93ad-951ad273c1d9/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/6e/6e/84/6e6e8457-d30d-8055-cd0b-3064bbdba0cf/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/78/e7/e4/78e7e488-2a0a-8a13-75cd-6dac68e52e3e/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/e2/29/99/e2299950-e368-2b21-3de9-6ef021488150/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/d7/50/0f/d7500f21-56b5-9884-3f4b-018b17bddc85/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/44/72/40/44724058-efac-9d28-950c-e546dfc772be/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/2c/c0/05/2cc0056c-97cf-3cf8-f596-0ca192744dd4/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/96/9c/3b/969c3b88-3180-6daf-7766-9c3b626a8ca8/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/41/7b/68/417b68f8-e692-dd05-e8e4-032aa225d43a/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/ee/09/11/ee091117-a13d-9517-b03a-a2ffc62b8f7b/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/ee/09/11/ee091117-a13d-9517-b03a-a2ffc62b8f7b/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/ee/09/11/ee091117-a13d-9517-b03a-a2ffc62b8f7b/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/eduard-metzger/id1137020763?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.12", + "trackName": "NotePlan 2", + "trackId": 1137020764, + "sellerName": "Eduard Metzger", + "releaseNotes": "- Fixed sidebar crash.", + "primaryGenreId": 6000, + "primaryGenreName": "Business", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2016-10-18T11:04:27Z", + "genreIds": [ + "6000", + "6007" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-07-22T23:44:00Z", + "trackCensoredName": "NotePlan 2", + "languageCodesISO2A": [ + "EN", + "DE" + ], + "fileSizeBytes": "15096159", + "sellerUrl": "http://noteplan.co", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/noteplan-2/id1137020764?mt=12&uo=4", + "trackContentRating": "4+", + "description": "NotePlan is the All in One Digital Planner to help you organize your life, your work, and everything in between. You can manage your calendar, notes, and tasks all in one intelligent interface on both Mac and iOS (sold separately). Try NotePlan for free for 14 days, no payment info required. \n\nINCREDIBLE FEATURES\n\n- Integrates with your iCloud Calendars (supporting Google Calendar, Exchange, Yahoo, and more.)\n- Dynamic tasks allow you to schedule tasks, see upcoming, overdue, and unscheduled.\n- Syncs with your Apple Reminders, use Siri on the go to create reminders in NotePlan.\n- Powerful calendar views to see events, reminders, and tasks in one place.\n- Organize thoughts in Nested Tags\n- Easily Add (and remove) image attachments to your notes.\n- Syncs your notes via iCloud Drive to all your Apple devices (this is your data, not ours!).\n- Global search across calendar events, reminders, tasks, and notes.\n- Multiple dark and light themes to suit your style. \n- Works offline, no internet required (sync does require connection).\n- Built from day one to support Markdown editing within notes!\n\n\nQUOTES FROM OUR AMAZING CUSTOMERS\n\n- “To keep up with all the stuff I have to do, I have tried most to-do apps. The simplicity of NotePlan’s approach makes it the winner in this category for me.”\n- “The new design and layout is awesome. I’m a big fan of NotePlan and this makes information even more accessible and logically laid out.”\n- “This is a fantastic app that solves a lot of pain points for me. You can start small and gather complexity at your own pace.”\n- “Finally, an app that does exactly what I want.”\n\n\nDownload and try today for 14 days, no signup required, no payment info required. NotePlan is a one time purchase (no subscription) if you like the app!\n\nHERE IS THE BACKSTORY\n\nIf you’re like us, work life and personal life is starting to merge. Managing meetings, notes, next steps, projects, tasks, reminders in multiple apps, sites, or tools - can be pretty hard - but it doesn’t have to be! With NotePlan for the Mac and iOS, you can manage your calendar, notes, and tasks in one place. Instead of constantly context switching, you can stay focused and accomplish what you set your mind to.\n\nWe recommend starting by getting everything out of your head and captured in one place - such as a “Planning” note. After gathering your thoughts, NotePlan allows you to seamlessly translate items into tasks. Set dates to these tasks, such as “tomorrow” or a specific day of the week. \n\nBy integrating with Apple’s Calendar and Reminders, NotePlan can show you your meetings and events next to the tasks you set. Weekly or Monthly calendar view gives you a quick snapshot of what is scheduled, and where you may have gaps in your day so you can quickly schedule additional things to accomplish. \n \nReviewing and managing open tasks and deadlines is incredibly easy. On top of that, notes are perfect for brainstorming, saving links, taking meeting notes, or storing reference materials. NotePlan is highly-customizable too with handsome light and dark themes as well as tagging for organizing and wiki-style linking between notes.\n\n\nQUESTIONS?\n\nIf you have any questions, suggestions or problems, please contact us. We provide fast and professional support: hello@noteplan.co", + "currency": "USD", + "artistId": 1137020763, + "artistName": "Eduard Metzger", + "genres": [ + "Business", + "Productivity" + ], + "price": 0.00, + "bundleId": "co.noteplan.NotePlan", + "version": "2.4.6", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple1/v4/9f/ec/16/9fec16c9-a8e4-109f-68da-bcdbdbac0f02/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple5/v4/18/81/9f/18819f96-b13a-5194-db9f-998ed8831875/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple7/v4/61/27/25/6127254c-5515-2d34-20cb-ec4c0f778053/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple7/v4/61/27/25/6127254c-5515-2d34-20cb-ec4c0f778053/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple7/v4/61/27/25/6127254c-5515-2d34-20cb-ec4c0f778053/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/adam-mathes/id453295387?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "DoOneThing - Single Task Manager", + "trackId": 464910442, + "sellerName": "Adam Mathes", + "releaseNotes": "Bug fixes, dark mode support, icon change", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2011-09-16T18:48:52Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2015-07-22T03:11:21Z", + "trackCensoredName": "DoOneThing - Single Task Manager", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "834152", + "sellerUrl": "http://mermodynamics.com/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/doonething-single-task-manager/id464910442?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Instead of being a source of constant distraction, your computer should help you accomplish what's most important to you every day.\n\nIt's easy to spend hours sitting in front of a computer immersed in doing little things, while avoiding the most important one.\n\nDoOneThing won't nag you, or beep at you, or harass you.\n\nIts presence at the top of your screen in a place of primacy, near the time, is intended to bring your focus back to what is most important for the day, to make your primary goal present in your computer screen and life.", + "currency": "USD", + "artistId": 453295387, + "artistName": "Adam Mathes", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.mermodynamics.DoOneThing", + "version": "2.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/9a/f3/34/9af334d9-953f-52b6-2943-5e7105edd267/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/7a/73/fc/7a73fc94-5100-48f6-947a-a9d487e73b50/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/d3/88/f0/d388f0a9-8b1a-761b-8c95-d56985c422bd/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/85/a6/cf/85a6cfd6-6c45-e5f1-5189-cff16a2796a8/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/ac/f1/45/acf1450b-9380-b2b9-db1c-770f2ed81f76/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/1f/bb/de/1fbbde79-a7d4-e630-a51b-b389fceffd51/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/f0/9d/d2f09d29-df16-296c-d0a3-02586ca581fa/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/f0/9d/d2f09d29-df16-296c-d0a3-02586ca581fa/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/d2/f0/9d/d2f09d29-df16-296c-d0a3-02586ca581fa/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/busy-apps-fze/id409966805?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.11", + "trackName": "BusyCal", + "trackId": 1173663647, + "sellerName": "Busy Apps FZE", + "releaseNotes": "* NEW: Accessibility option added to Appearance Preferences for turning on darker grid lines\n* NEW: Optionally switch between Apple Contacts or BusyContacts for Birthdays / Anniversaries from under General Preferences\n* NEW: URL links, inside of notes displayed in the menu bar helper app, are now clickable\n* NEW: Clickable and selectable links / urls / locations in events displayed in the Menu app\n* Improved email address validation checks when dragging and dropping from Apple Contacts\n* Sound alarm option disabled for Google Calendar as these are not supported by Google and would get silently ignored\n* Attendee email parsing improved for emails containing apostrophes\n* Fixed a crash experienced by some users when importing large .ics files\n* Fixed a bug where manually selecting \"email attendees\" would open multiple copies of the compose email sheet\n* Fixed duplicate set of snooze options displaying when using Notification Center alerts\n* Fixed a macOS 10.11 issue with NotificationCenter and alerts\n* Ongoing stability and performance improvements", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2016-11-21T02:20:39Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "$49.99", + "currentVersionReleaseDate": "2020-06-26T02:53:21Z", + "trackCensoredName": "BusyCal", + "languageCodesISO2A": [ + "NL", + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "ZH", + "ES" + ], + "fileSizeBytes": "24084319", + "sellerUrl": "https://www.busymac.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/busycal/id1173663647?mt=12&uo=4", + "trackContentRating": "4+", + "description": "BusyCal 3 is the most powerful, flexible, reliable calendar app for macOS. It's packed with innovative, time-saving features including customizable views, calendar sets, integrated to dos, travel time, smart filters, natural language input, weather, moons, graphics, tags, do not disturb mode and much more.\n\nCUSTOMIZABLE VIEWS\n\nBusyCal displays your calendar in Day, Week, Month, Year and List views. What makes BusyCal unique is its ability to customize these views to more precisely meet your needs. You can choose the number of weeks shown per month, or days shown per week, and you can even customize the calendar's appearance by choosing a font face and size, calendar colors, time format and more.\n\nINTEGRATED TO DOS\n\nIn BusyCal, To Dos are integrated into your calendar, display on the date or time they are due, and carry forward until completed. You can also display a To Do List in the sidebar. NOTE: Reminders in iOS 13 / macOS 10.15 is not compatible with BusyCal.\n\nINFO PANEL\n\nBusyCal's info panel enables you to quickly view and edit event details with speed and precision. The info panel can be displayed in the sidebar, as a popup or a floating window. And it's completely customizable, you can choose from a wide range of attributes to display including time zones, tags, maps, private notes, last edit time and more.\n\nNATURAL LANGUAGE INPUT\n\nBusyCal enables you to create events and to dos using natural language. A preview of the event details are displayed while you type as it recognizes titles, dates and times, locations and more. You can even use it to add contacts or attendees to an event, set alarms, add URLs, and to indicate the calendar to create the event on.\n\nTRAVEL TIME\n\nBusyCal allows you to block out time for walking, driving or taking mass transit to an event or location. You can set a fixed amount of travel time or determine it automatically using the integrated support for Location Services and Apple Maps. You can even receive alerts when it's time to leave as traffic conditions change.\n\nMENU BAR APP\n\nThe BusyCal menu bar app is always running, even when the main BusyCal app is not running, so you always have access to your schedule. \n\nSMART FILTERS\n\nBusyCal's Smart Filters are a powerful tool for managing your calendar. Smart Filters can be accessed with a keyboard shortcut or a button on the toolbar to display calendar sets (showing/hiding multiple calendars), perform saved searches (events that contain 'Joe'), apply view settings (an 8-week month view) and much more.\n\nALARMS\n\nBusyCal displays alarms in a movable, resizable floating window that offers the ability to snooze an alarm for any number of minutes from now or before the start of an event, or snooze multiple alarms at once. And BusyCal Alarms trigger even when the main BusyCal app isn't running, so you'll never miss an important appointment.\n\nWEATHER & MOONS\n\nBusyCal displays a live 10-day weather forecast, phases of the moon, and sunrise and sunset times. \n\nGRAPHICS\n\nBusyCal lets you add graphics to your calendar to highlight holidays and special events. You can choose from the built-in Emoji and IconFinder images, or drag images from your desktop or web.\n\nBUSYCONTACTS INTEGRATION\n\nBusyCal integrates with its sister app, BusyContacts, forming a flexible easy-to-use CRM solution. By adding contacts to events in BusyCal, you have instant access to a contact's email address and phone number, as well as a record in BusyContacts of your interactions with them.\n\nSYNC AND SHARE CALENDARS\n\nBusyCal supports iCloud, Reminders, Google, Exchange, Office 365, CalDAV, LAN sharing as well as WebDAV subscriptions, enabling you to sync calendars with other Macs and iOS devices running BusyCal or the built-in Calendar app. This includes the ability to share calendars, schedule meetings, and view the availability of others.", + "currency": "USD", + "artistId": 409966805, + "artistName": "Busy Apps FZE", + "genres": [ + "Productivity", + "Business" + ], + "price": 49.99, + "bundleId": "com.busymac.busycal3", + "version": "3.10.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple3/v4/b1/75/14/b17514b7-25fd-2aa6-b147-a1ede3bc2952/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple3/v4/d0/0c/d6/d00cd62c-9865-6602-3f1d-e7a50e62067a/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple5/v4/f3/f0/39/f3f03912-aa89-8b53-81b0-8faa70b5611f/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple5/v4/1d/3b/78/1d3b780c-d23a-78de-d6fc-d03985d772dd/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple3/v4/9f/7a/e3/9f7ae3e3-40d1-6880-c27b-6e293cd39656/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/ad/5f/87/ad5f872c-f86c-26b1-db29-ce1c9d9286ab/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/ad/5f/87/ad5f872c-f86c-26b1-db29-ce1c9d9286ab/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/ad/5f/87/ad5f872c-f86c-26b1-db29-ce1c9d9286ab/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/massimo-moiso/id566833668?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "InerziaThings Lite", + "trackId": 642103566, + "sellerName": "Massimo Moiso", + "releaseNotes": "New\n- added a \"Measure\" field. It can contain dimensions info as \"12x3 inch\" or similar. You can add it also to already present objects.\n\nBug fixes\n- Some locale string was missed.\n- Fixed a bug when importing from proprietary files on OS 10.10 through 10.13\n- Some optimisation.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2013-05-07T17:54:45Z", + "genreIds": [ + "6007", + "6006" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-08-04T18:49:46Z", + "trackCensoredName": "InerziaThings Lite", + "languageCodesISO2A": [ + "EN", + "FR", + "IT" + ], + "fileSizeBytes": "6157827", + "sellerUrl": "https://inerziasoft.eu/products/showcase/inerziathings/0", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/inerziathings-lite/id642103566?mt=12&uo=4", + "trackContentRating": "4+", + "description": "If you need assistance, please refer to our Technical Support Team by clicking the link on the right of this page.\nIf you have an idea for a new feature that could be useful for you, please contact us and we will be glad to consider it!\n\n===\n\nInerziaThings is your personal archive to keep all your Things under control.\n\nWhen did I purchase my new Mac? How much did I pay my last car? When the warranty of the washing machine will expire? I would like to read the technical data of the audio amplifier without having to remove the whole rack...\n\nInerziaThings can answer to all of these questions!\n\nKey features:\n\n• Management of all the important data (name, brand, model, serial number, warranty expiring date, shop, the date we sold it at what price, etc….)\n\n• Formatted free text notes.\n\n• Tags management (name change, one or more tag per Thing, automatic tag creation, auto-complete while typing).\n\n• Insert and manage images linked to a Thing: import, export, delete, open in default application.\n\n• Assign a Thing to a room within a place; a place can have more than one room. A Thing can be assigned to nowhere (not related to a room).\n\n• Search by name, brand, model, text within notes\n\n• Filter Things on place, room, tags.\n\n• Searching and filtering are one another compatible (that is: I want to find all objects in a room of a defined brand and with certain tags).\n\n• Automatic calculation of the total value of the visible objects\n\n• Unified management of more than one identical Things and their partial selling in one record\n\n• Complete Undo support.\n\n• Export Things in a text file (comma or tab delimited, ready to be imported in a Office suite).\n\n• Export all Things data, with Tag and Images in a proprietary format for backup or transport purposes\n\n• Objects multi-page print.\n\n• Dark theme support\n\n• New exciting features to come!\n\n\nNOTE: This Lite version is limited with regards to the number of Places, Room and Things.", + "currency": "USD", + "artistId": 566833668, + "artistName": "Massimo Moiso", + "genres": [ + "Productivity", + "Reference" + ], + "price": 0.00, + "bundleId": "eu.inerziasoft.InerziaThings-Lite", + "version": "3.7.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/b5/d0/e0/b5d0e04e-380a-19e7-e1ea-42d9090306a2/22518e83-8e14-495b-b780-843bb635a853_Desktop_01.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/99/03/09/990309a8-f057-8553-aaf6-9289dfa6cdec/ad0253ed-cdb3-4202-9afd-656f9b574d7d_Desktop_02.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/13/3a/5f/133a5f6c-d302-9af7-0859-d82f9cee2330/5b80f3aa-8722-414c-a621-58a97cf82103_Desktop_03.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/05/aa/6b/05aa6b80-9dbb-4968-9444-874cb9583fc7/de77889b-3f4d-438b-adb8-4c6bb715d6df_Desktop_04.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/86/c3/d7/86c3d72b-6e29-bc68-729c-7e0bc29290cb/668c81b6-a7db-402d-a036-e31bb109ffc7_Desktop_05.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/17/b8/c3/17b8c3bc-ab5b-6532-e59e-c804f70f40ad/f802848c-264f-4cbb-a322-a699dd0b69c2_Desktop_06.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/82/7b/5a/827b5acc-ea24-4ffc-ad2d-f008131dbedc/9d573032-de53-4221-b1d9-9195c845d6c9_Desktop_07.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/e9/3d/96/e93d964a-d5c2-9020-c2cc-f15dd5a2d309/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/e9/3d/96/e93d964a-d5c2-9020-c2cc-f15dd5a2d309/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/e9/3d/96/e93d964a-d5c2-9020-c2cc-f15dd5a2d309/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/ciarlo-software-llc/id1066322955?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.14", + "trackName": "Doo 3: Get Things Done", + "trackId": 1515371334, + "sellerName": "Ciarlo Software, LLC", + "releaseNotes": "Fixes a bug that prevented scrolling of tasks", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2020-08-25T07:00:00Z", + "genreIds": [ + "6007" + ], + "formattedPrice": "$9.99", + "currentVersionReleaseDate": "2020-08-29T18:17:38Z", + "trackCensoredName": "Doo 3: Get Things Done", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "PT", + "ZH", + "ES", + "ZH" + ], + "fileSizeBytes": "3021396", + "sellerUrl": "https://www.getdooapp.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/doo-3-get-things-done/id1515371334?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Doo is a simple way to be more productive. Create a card for each of your tasks. The best cards are easy to start and have a clear goal. Pick a few tasks each day and snooze the rest. Doo helps you build consistent, sustainable habits that keep you focused. Over time, your completed cards become finished projects, without the stress and anxiety of an endless list.\n\nFEATURE HIGHLIGHTS\n• Be more productive with a unique, card-based interface\n• Separate cards into custom groups\n• Create open-ended, calendar, or location-based tasks\n• Create tasks within other apps with the share extension\n• Schedule tasks with custom intervals and alerts\n• Sync with iCloud across iOS and Mac devices\n• Collaborate on tasks with other Doo users (requires iCloud)\n• View upcoming tasks with the Doo Widget\n• Complete or snooze tasks from notifications\n• Run Doo from the dock or menu bar", + "currency": "USD", + "artistId": 1066322955, + "artistName": "Ciarlo Software, LLC", + "genres": [ + "Productivity" + ], + "price": 9.99, + "bundleId": "com.mciarlo.Everyminder.CiarloMacDoo3", + "version": "3.0.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple71/v4/af/ee/c4/afeec4b1-a276-3845-148d-78a0862331a5/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple62/v4/59/9f/22/599f22d1-b0c5-d6b0-8c67-7e59609d9a68/pr_source.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple41/v4/3b/5b/db/3b5bdbe0-ee09-7933-e6f1-24ee0d6a0f55/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple62/v4/68/10/9c/68109c13-9add-40b9-5c7e-1bc2b4a1898c/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/1a/ca/3b/1aca3b35-1082-082d-0a14-ba9643e4c683/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/1a/ca/3b/1aca3b35-1082-082d-0a14-ba9643e4c683/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple114/v4/1a/ca/3b/1aca3b35-1082-082d-0a14-ba9643e4c683/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/new-technologies/id762050392?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "Oh! My Mind Mapping: Idea Flow", + "trackId": 1140048806, + "sellerName": "New Technologies, LLC.", + "releaseNotes": "This update \n• Includes bug fixes and feature enhancements.\n• Fixes several stability issues.\nThanks to everyone for your support! It really helps us out!", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2016-09-03T19:18:06Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-08-14T07:52:27Z", + "trackCensoredName": "Oh! My Mind Mapping: Idea Flow", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "13457808", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/oh-my-mind-mapping-idea-flow/id1140048806?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Pick all your ideas together and create a clear mind map. Visual diagrams will help you keep in mind any flow of information! \n\nDIFFERENT PRE-INSTALLED TYPES OF VISUALIZATION\n- One-sided map;\n- Tree structured;\n- Fish-shaped;\n- Sun-shaped.\n\nSMART REPRESENTATION\n- Different layout structures vary depending on the purpose;\n- 3 elements to work with: arrows, stickers and images;\n- Applying images or icons to stickers;\n- Opportunity to interconnect stickers.\n\nVISUAL BRAINSTORMING RESULTS\n- Instant Saving & Sharing;\n- You can also print out your projects.\n\nWith user-friendly control and understandable functions of Oh! My Mind Mapping 2 the brainstorming process becomes easy and convenient!\n\nOur app offers subscription:\nhttps://newtech-ltd.com/privacy\nhttps://newtech-ltd.com/tos", + "currency": "USD", + "artistId": 762050392, + "artistName": "New Technologies", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.newtechnologies.OhMyMindMapping2lessia", + "version": "1.7.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple4/v4/98/2f/a7/982fa7f4-3dbe-7039-d2a0-b788eff5aaa0/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple4/v4/4b/23/ea/4b23eab3-063f-6ed0-03d1-0ea71f779bb6/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple1/v4/5d/cb/a3/5dcba3bd-eb2e-3cc2-5c13-307fd6203b2c/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple2/v4/e2/2d/ca/e22dcadd-d7d5-3150-03c1-9f4a43c3b0f4/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple71/v4/d2/f4/4c/d2f44c49-12e3-7bc7-e382-0cd9ec74d6fe/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple71/v4/d2/f4/4c/d2f44c49-12e3-7bc7-e382-0cd9ec74d6fe/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple71/v4/d2/f4/4c/d2f44c49-12e3-7bc7-e382-0cd9ec74d6fe/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/antlogic/id364746702?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.6", + "trackName": "Antnotes", + "trackId": 808734429, + "sellerName": "Mykola Olshevskyi", + "releaseNotes": "- added option to disable gradient background\n- added option to create new notes in bottom left/right corners\n- changed delay for close/options buttons showing\n- some minor compatibility and UI fixes\n- fixed German localisation", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2014-03-08T02:52:03Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "$2.99", + "currentVersionReleaseDate": "2016-09-24T17:04:28Z", + "trackCensoredName": "Antnotes", + "languageCodesISO2A": [ + "EN", + "DE", + "RU", + "UK" + ], + "fileSizeBytes": "1014384", + "sellerUrl": "https://www.antlogic.com/apps/antnotes", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/antnotes/id808734429?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Antnotes are like paper notes: they are glued to your monitor, but from the other side of the screen.\n\nThis nice and handy application lives in the menu bar for faster access and has the following features:\n\n- customizable background, font and text color\n- snap to screen bounds and other notes\n- translucent notes\n- attach note to any application so it will be shown when this application is activated/hidden when switching to other application\n- automatically hide notes when inactive\n- pin note to desktop to make it stay atop of other windows\n- quick access via the menu bar icon\n- make new notes by dragging text, images, files to menu bar icon\n- integration with services: create new note from any text in any application\n- drag images and sounds to note contents\n- configurable global shortcuts to create new note or show/hide all notes\n- resizable\n- archive with all closed notes - do not lose your information by accidentally closing a note\n- smart position choosing for different display configurations\n\nWant more features? Just let us know, we'll consider almost anything unless it’s cooking, coffee making or walking your dog!\n\nVideo on how to use Antnotes: http://youtu.be/E7wKKeGZDFw ( or http://www.youtube.com/AntlogicCompany )\nFor more information visit our site: http://www.antlogic.com/ or Facebook page: http://facebook.com/AntlogicCompany\n\nIf you need support, have feature request or any complaints, you are welcome to our support forums: http://www.antlogic.com/forum/", + "currency": "USD", + "artistId": 364746702, + "artistName": "AntLogic", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 2.99, + "bundleId": "ua.com.AntLogic.Antnotes", + "version": "1.6.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple6/v4/47/e2/1a/47e21af8-c05e-57d5-98a4-3a596c897646/mzl.hflpafaz.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple1/v4/e1/40/16/e1401647-5ee0-4819-20cd-2a4b6188b38c/mzl.mobmauoe.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple5/v4/3e/14/4e/3e144eb6-08f4-eb44-9465-c6cad39ef787/mzl.tnfvxdpb.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/43/b9/13/43b91374-695d-9ead-f634-2b7d545ca6bf/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/43/b9/13/43b91374-695d-9ead-f634-2b7d545ca6bf/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/43/b9/13/43b91374-695d-9ead-f634-2b7d545ca6bf/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/appigo/id282769260?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.8", + "trackName": "Todo", + "trackId": 408975584, + "sellerName": "Appigo, Inc.", + "releaseNotes": "Easier to share lists with co-workers, and edit list information.\nBug fixes.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2011-06-03T01:41:59Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "$14.99", + "currentVersionReleaseDate": "2016-01-14T21:39:56Z", + "trackCensoredName": "Todo", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "PT", + "RU", + "ZH", + "ES", + "ZH" + ], + "fileSizeBytes": "8661615", + "sellerUrl": "http://www.appigo.com/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/todo/id408975584?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Todo® empowers millions of people around the world to get things done. Todo’s beautiful and intuitive interface enables you to easily create and share tasks, checklists and projects. Whether you are managing a complex work project with a team, planning a family reunion or simply sharing a shopping list, Todo has what you need.\n\n\nKEY FEATURES\n· Automatically sync tasks across the computers and devices you use\n· Share Lists: Create lists and share them with your co-workers, family and friends\n· Collaboration: Add comments to tasks that will be seen by everyone in your shared task list\n· Stay Informed: Receive email notifications when someone in your shared list updates a task\n· Simply reply to task emails and your comments will automatically be added to that task\n\nSO MUCH MORE…\n· Geofence your tasks with Todo and your iPhone alerts you when you arrive\n· Share Tasks: Delegate tasks and get things done as a team\n· Manage Advanced Projects: Use checklists inside of your projects for better organization\n· Keep Tasks Updated: Tasks are updated at lightning speed to each of your devices \n· Drag and drop content from emails to quickly create tasks\n· Multiple reminder alerts\n· Organize with projects and checklists (subtasks)\n· Schedule repeating tasks\n· Starred tasks\n· Drag and drop sorting\n· Full task searching including notes\n· GTD support with contexts and tags\n\nTODO SYNCS WITH \n· Todo-Cloud (premium paid sync service)\n· iCloud (Note: iCloud is used for synchronizing tasks to other copies of the Todo app on iOS and Mac).\n· Dropbox\n· Toodledo.com\n· Wi-Fi\n\nMaximize Todo’s power with a Todo-Cloud Premium Account. Download the Todo app and try Todo-Cloud syncing service with a free 14 day trial. Todo is also available for iPhone, iPad, and iPod touch on the App Store. Additionally, you can always access your tasks online at www.todo-cloud.com, even without a premium account.\n\n\nEXCELLENT CUSTOMER SUPPORT\n\nWe value our customers and strive to answer every question, however, we are unable to reply directly to app reviews. If you are looking for help or have a specific question, please send us a message by visiting our Help Center. If you love to get things done, feel free to help others understand how this app has helped you by writing a review on the App Store. \n\nAppigo Help Center: http://help.appigo.com/\n\n\nSTAY IN THE KNOW\n\nBe sure to follow us online! We frequently publish updates about what's new and what's coming in the app on Facebook and Twitter.\n\nhttp://twitter.com/appigo\nhttp://www.facebook.com/appigo", + "currency": "USD", + "artistId": 282769260, + "artistName": "Appigo", + "genres": [ + "Productivity", + "Business" + ], + "price": 14.99, + "bundleId": "com.appigo.todomac", + "version": "3.0.7", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "appletvScreenshotUrls": [], + "supportedDevices": [ + "iPadMini4-iPadMini4", + "iPadProSecondGen-iPadProSecondGen", + "iPhone11-iPhone11", + "iPad71-iPad71", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPhone8Plus-iPhone8Plus", + "iPhone6sPlus-iPhone6sPlus", + "iPadMini5-iPadMini5", + "iPadProFourthGen-iPadProFourthGen", + "iPhoneXS-iPhoneXS", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadAir3-iPadAir3", + "iPadMini4Cellular-iPadMini4Cellular", + "iPadProCellular-iPadProCellular", + "MacDesktop-MacDesktop", + "iPadMini3-iPadMini3", + "iPhoneXR-iPhoneXR", + "iPhoneSE-iPhoneSE", + "iPad611-iPad611", + "iPhone7-iPhone7", + "iPad73-iPad73", + "iPad812-iPad812", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhoneX-iPhoneX", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadPro97-iPadPro97", + "iPad834-iPad834", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPhone5s-iPhone5s", + "iPad75-iPad75", + "iPadMini3Cellular-iPadMini3Cellular", + "iPad878-iPad878", + "iPhone6-iPhone6", + "iPadAir-iPadAir", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadSeventhGen-iPadSeventhGen", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPhoneXSMax-iPhoneXSMax", + "iPad612-iPad612", + "iPadPro-iPadPro", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone11ProMax-iPhone11ProMax", + "iPadMiniRetina-iPadMiniRetina", + "iPad76-iPad76", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad74-iPad74", + "iPhone6s-iPhone6s", + "iPhone7Plus-iPhone7Plus", + "iPadAir2-iPadAir2", + "iPad72-iPad72", + "iPhone6Plus-iPhone6Plus", + "iPadAirCellular-iPadAirCellular", + "iPhone8-iPhone8", + "iPad856-iPad856", + "iPhone11Pro-iPhone11Pro" + ], + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/2b/3b/ae/2b3baea6-3b6a-5575-9201-7b1f9374b59e/25d73a4f-71f0-4651-9a8d-d05a1438c099_iPhone-8Plus-1-final.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/40/95/c3/4095c368-0233-609c-cfbf-f7b8e54b1680/d66420dd-510c-4b78-9c73-fbf6f1732c69_iPhone-8Plus-2-final_3.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/57/f2/57/57f257ec-f627-c968-70f4-c65d1c6f8f13/8caf2452-0f43-4631-9561-8742fc682b83_iPhone-8Plus-3-final.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple124/v4/b6/f4/a1/b6f4a184-95bc-ecae-6d7e-46155694ca2b/52661be5-0db9-4231-90d1-0673bfe42bb7_iPhone-8Plus-4-final.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/81/9a/73/819a739d-a936-3c80-aa89-3393c5fc5835/7044a241-d38d-4da6-abca-03afc47d06dc_iPhone-8Plus-5-final.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple114/v4/ec/6e/32/ec6e32ff-d2ee-e5c5-adda-0a93c256a749/146a5b09-1775-498d-b16a-48b05b6d52be_iPad-Pro-1-final.png/576x768bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/ce/f6/1c/cef61c51-bd09-0a33-5a10-f33ac328a772/c2057935-2438-4efc-9d85-f8d72756376e_iPad-Pro-2-final_3.png/576x768bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/4e/1b/88/4e1b88b2-6f91-5996-5aa3-52bbb8fd3a71/c49adc41-3b71-4301-933d-671384616ede_iPad-Pro-3-final.png/576x768bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/08/3a/99/083a9917-7ac1-2503-dc51-b1f84a1cba7f/54b5f7cd-d35b-4bfe-a300-5e8621085081_iPad-Pro-4-final.png/576x768bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/2b/9d/d8/2b9dd8fc-afa4-2194-37a0-6490cbe9db63/2ea461a8-57cd-4bf8-b6fe-aeef6e9914f0_iPad-Pro-5-final.png/576x768bb.png" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b7/fd/ca/b7fdcac2-0b2c-8346-d321-42cc61292205/source/60x60bb.jpg", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b7/fd/ca/b7fdcac2-0b2c-8346-d321-42cc61292205/source/512x512bb.jpg", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/b7/fd/ca/b7fdcac2-0b2c-8346-d321-42cc61292205/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/volodymyr-yahenskyi/id961335645?uo=4", + "isGameCenterEnabled": false, + "advisories": [], + "features": [ + "iosUniversal" + ], + "kind": "software", + "minimumOsVersion": "11.0", + "trackName": "Tally Counter & Habit Tracker", + "trackId": 1412716242, + "sellerName": "Volodymyr Yahenskyi", + "releaseNotes": "Thanks for using my app!\nThis release contains bug fixes and performance improvements.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2018-09-08T04:54:49Z", + "genreIds": [ + "6007", + "7009", + "6014", + "7004" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-08-29T14:09:17Z", + "trackCensoredName": "Tally Counter & Habit Tracker", + "languageCodesISO2A": [ + "EN", + "RU", + "UK" + ], + "fileSizeBytes": "11422720", + "sellerUrl": "https://yahenskyi.dev/tally/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 4.89655000000000040216718844021670520305633544921875, + "userRatingCountForCurrentVersion": 29, + "averageUserRating": 4.89655000000000040216718844021670520305633544921875, + "trackViewUrl": "https://apps.apple.com/us/app/tally-counter-habit-tracker/id1412716242?uo=4", + "trackContentRating": "4+", + "description": "Tally Counter & Habit Tracker will help you to count items, days, score points of games, count drinks you've been drinking, count training sessions, or anything else.\n\nFeatures:\n• Simple interface\n• Dark mode\n• Counting history\n• Total counters value\n• Last change timer\n• Colorful app icons\n• Reorder counters using a long press gesture\n• Rename each counter as you want\n• Assign different colors to each counter\n• Sound confirmation of counts\n• Haptic feedback on supported devices\n• Select the step size for your count\n• Reset, delete and export all counter data at once\n\nMultiple counters, as many as you need. To delete, reset or edit the counter, just swipe left on it. To increase or decrease the counter value, tap at any point on the ​left or right side of it. Long press to reorder counters.\n\nTally Premium benefits:\n• iCloud sync\n• Unlimited counters\n• Export to CSV/Excel\n\nTerms & Conditions: https://yahenskyi.dev/terms-conditions/\nPrivacy Policy: https://yahenskyi.dev/privacy-policy/", + "currency": "USD", + "artistId": 961335645, + "artistName": "Volodymyr Yahenskyi", + "genres": [ + "Productivity", + "Family", + "Games", + "Board" + ], + "price": 0.00, + "bundleId": "com.yahenskyi.tally", + "version": "1.6.4", + "wrapperType": "software", + "userRatingCount": 29 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple18/v4/5e/ae/76/5eae7683-6038-ba05-121b-4b6d77bc6a55/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple20/v4/6f/2d/83/6f2d8388-00eb-cb2b-6d10-905d823021c0/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple30/v4/14/09/5c/14095c40-9a33-3685-cd67-7e0c8d5f6421/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple60/v4/b6/43/26/b6432664-84ce-ce21-c592-f6d2b137abdf/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/43/9a/5e/439a5e44-c71e-44e0-7b2e-535a1a953dec/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/43/9a/5e/439a5e44-c71e-44e0-7b2e-535a1a953dec/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/43/9a/5e/439a5e44-c71e-44e0-7b2e-535a1a953dec/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/ping-lv/id1436949017?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.7", + "trackName": "iLove Sticky Notes", + "trackId": 1096650860, + "sellerName": "Ping Lv", + "releaseNotes": "1 Some minor improvements", + "primaryGenreId": 6012, + "primaryGenreName": "Lifestyle", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2016-05-23T02:32:02Z", + "genreIds": [ + "6012", + "6007" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-08-05T19:39:54Z", + "trackCensoredName": "iLove Sticky Notes", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "988745", + "sellerUrl": "http://ilovemacapp.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/ilove-sticky-notes/id1096650860?mt=12&uo=4", + "trackContentRating": "4+", + "description": "iLove Sticky Notes is a very useful memo assistant for Mac users. With iLove Sticky Notes you can pin notes to your desktop which can help remind you of something urgent or important! You can customize the background color of your notes and it always stay in sight so you won't forget them.\n\nHow to use:\n1. Open iLove Sticky Notes.\n2. Click on the app icon on system tray to go into Edit Mode. \n3. Click on the top left \"Add\" button of note to create a new one, hit the top right \"cross\" button to delete the note.\n4. Click on the app icon on system tray to Quit Edit Mode.", + "currency": "USD", + "artistId": 1436949017, + "artistName": "Ping Lv", + "genres": [ + "Lifestyle", + "Productivity" + ], + "price": 0.00, + "bundleId": "com.ilove.desktopnotes", + "version": "2.1.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple125/v4/5d/cf/06/5dcf06fc-2767-3b5e-ce1a-ae71d65d7949/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple125/v4/20/8a/d6/208ad6df-1f33-2ec5-fb54-33dc416bebb8/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/0e/5c/5f/0e5c5fb1-24e6-2d77-4ba3-97c62a95014e/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/0e/5c/5f/0e5c5fb1-24e6-2d77-4ba3-97c62a95014e/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/0e/5c/5f/0e5c5fb1-24e6-2d77-4ba3-97c62a95014e/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/fiplab-ltd/id320240050?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "TaskTab: Simple To Do List", + "trackId": 1395414535, + "sellerName": "FIPLAB Ltd", + "releaseNotes": "- Bug fixes", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2018-07-23T03:22:17Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2019-09-06T19:50:30Z", + "trackCensoredName": "TaskTab: Simple To Do List", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "2261951", + "sellerUrl": "https://fiplab.com/apps/task-tab-for-mac", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/tasktab-simple-to-do-list/id1395414535?mt=12&uo=4", + "trackContentRating": "4+", + "description": "TaskTab places the focus squarely on your to do list. We've intentionally kept the app as simple as possible to allow you to quickly add, check off and manage your tasks without being distracted by pointless features that overly complicate the key purpose of a to do list app. The app lives in your menubar and is available at a click of a button or via its customizable hot key.\n\n- A beautifully designed native app for macOS that supports both light and dark mode. \n\n- You can easily import a to do list as well as export them to share with others.\n\n- You can optionally choose to show the number of remaining items in your menubar.\n\nWe've worked hard to make TaskTab as powerful and efficient as possible for you to use. We would love to hear your thoughts via email and make any improvements to future versions of this app. We intend to have an active development cycle powered by your feedback and support!", + "currency": "USD", + "artistId": 320240050, + "artistName": "FIPLAB Ltd", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.fiplab.tasktabmac", + "version": "1.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple/v4/d9/b6/7a/d9b67a64-4d35-ab91-6d9a-f31050c96b29/x5ijyUu7fLDtHIabWVSOW0-temp-upload.nuezlxgp.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/v4/24/a4/fc/24a4fc65-960e-8c82-c129-bf0ef04b0fc6/mza_7830980125492921569.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/fb/ed/cf/fbedcfe1-9b32-a73c-41b2-8a17f98e9f75/mza_6440831072027067066.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple/v4/e1/a1/d5/e1a1d549-8810-7bce-9bae-4cb7de91b02d/mza_4557184267443726008.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple/v4/56/38/4c/56384c59-f7b4-2d9d-4dce-edbd66d63737/mza_5206003488144523712.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple/v4/c2/58/79/c25879b3-7495-f5d7-b111-c6e922979fa2/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple/v4/c2/58/79/c25879b3-7495-f5d7-b111-c6e922979fa2/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple/v4/c2/58/79/c25879b3-7495-f5d7-b111-c6e922979fa2/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/midnight-beep-softworks/id364896535?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.6.6", + "trackName": "Inbox Classic", + "trackId": 528008223, + "sellerName": "Midnight Beep Softworks", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2012-06-11T21:16:59Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2012-06-11T21:16:59Z", + "trackCensoredName": "Inbox Classic", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "8862330", + "sellerUrl": "http://www.midnightbeep.com/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/inbox-classic/id528008223?mt=12&uo=4", + "trackContentRating": "4+", + "description": "This is the original version of Midnight Inbox that brings Getting Things Done (GTD) productivity to the desktop in true delicious style, now updated for the latest versions of Mac OS X with native support for 10.6 and 10.7! And now available for free!\n\nWe have new versions of Inbox for the iPhone and iPad for you to check out, and are working on a whole new desktop version of Midnight Inbox. See what's new with Inbox on our website: http://www.midnightbeep.com\n\nThe workflow.\nTop to bottom, Inbox provides an automated workflow of simple input, intuitive organizing, and contextual outputs. Just jump right to the part that best fits your situation: from collecting your thoughts, to concentrating on your work.\n\nAutomatic zero.\nGetting to the bottom of your inbox is what this app is all about. As things pile up you need to get them sorted and acted upon; Inbox makes this quick and easy by giving you shortcuts to the places where things need to be, and the assistance to get them done.\n\nGTD complete.\nMidnight Inbox is inspired by the Getting Things Done methodologies created by David Allen. If you've never heard of GTD, just let Inbox be your guide. It will help you be stress-free, following the GTD workflow for you, so you can concentrate on what really matters.\n\nPLEASE NOTE:\n• Inbox Classic is -not- compatible with current iOS versions (Inbox Mobile for iPhone, Inbox Touch for iPad) for data or syncing. The forthcoming version \"Midnight Inbox 2\" will bring full feature parity and iCloud-based syncing to the desktop version of Inbox, and import of Classic version's data.\n• Support for Mac OS 10.4 and 10.5 and PowerPC-based Macs is available in version 1.5.1 of Inbox Classic from our Web site.", + "currency": "USD", + "artistId": 364896535, + "artistName": "Midnight Beep Softworks", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.00, + "bundleId": "com.midnightbeep.InboxClassic", + "version": "1.6.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/16/c9/0d/16c90d93-849c-f870-5eed-d92500ca8ab8/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple1/v4/68/77/5b/68775b4c-55b6-2dae-b4f8-358515f1ecfe/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/1b/ca/ad/1bcaad31-57fb-52fe-5b8b-2693d59ed311/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/1b/ca/ad/1bcaad31-57fb-52fe-5b8b-2693d59ed311/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/1b/ca/ad/1bcaad31-57fb-52fe-5b8b-2693d59ed311/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/busy-apps-fze/id409966805?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.11", + "trackName": "BusyContacts", + "trackId": 964258399, + "sellerName": "Busy Apps FZE", + "releaseNotes": "* Fixed a bug where column sizes in List view would not correctly restore for some users\n* Fixed a bug where new tags for a new contact syncing to a Google account would not sync correctly\n* Fixed a bug where manually selecting \"email\" from the share menu would open multiple copies of the compose email sheet\n* Ongoing stability and performance improvements", + "primaryGenreId": 6000, + "primaryGenreName": "Business", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2015-03-06T23:53:17Z", + "genreIds": [ + "6000", + "6002" + ], + "formattedPrice": "$49.99", + "currentVersionReleaseDate": "2020-06-10T23:58:36Z", + "trackCensoredName": "BusyContacts", + "languageCodesISO2A": [ + "NL", + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "ZH", + "ES" + ], + "fileSizeBytes": "12809192", + "sellerUrl": "https://www.busymac.com/busycontacts/index.html", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/busycontacts/id964258399?mt=12&uo=4", + "trackContentRating": "4+", + "description": "BusyContacts is a contact manager for macOS that makes creating, finding, and managing contacts faster and more efficient.\n\nBusyContacts brings to contact management the same power, flexibility, and sharing capabilities that BusyCal users have enjoyed with their calendars. What's more, BusyContacts integrates seamlessly with BusyCal forming a flexible, easy to use CRM solution that works the way you do.\n\nBusyContacts syncs with the built-in Contacts app on macOS and iOS and supports all leading cloud services, including iCloud, Google, Exchange, Facebook & Twitter.\n\nCUSTOMIZABLE VIEWS\n\nContacts can be displayed in two views: A single column list view, or a multi-column table view that allows you to control the columns displayed (e.g. company, last name, first name, email, phone, etc.) and the sort order.\n\nTAGS\n\nTags are an extremely flexible way to manage contacts in BusyContacts. You can assign multiple tags to each contact and a tag cloud allows you to easily filter the list of contacts by tag (e.g. family, client, prospect, coworker, etc.).\n\nACTIVITY LIST\n\nThe Activity List shows a chronological listing of activities associated with the selected contact including meetings, to dos and other calendar events (requires BusyCal), communication through email and messaging, and social network posts. Note: Email communication is only available on macOS 10.14 and below.\n\nBUSYCAL INTEGRATION\n\nBusyContacts integrates with BusyCal allowing you to link contacts to events and to dos in your calendar, providing flexible CRM capabilities for scheduling meetings, follow up tasks, and tracking past activities.\n\nSOCIAL NETWORK INTEGRATION\n\nBusyContacts syncs with leading social networks including Facebook, Twitter and LinkedIn, allowing you to integrate photos, birthdays and other information from social networks with your contacts.\n\nSMART FILTERS\n\nSmart Filters are a powerful tool for filtering contacts and creating saved searches that can be applied with a single click. You can create Smart Filters to display contacts that match certain conditions, such as a text string, tag, or birthdate. Or you can create Smart Filters to remember view settings such as columns displayed and sort order.\n\nSYNC\n\nBusyContacts syncs with all leading cloud services including iCloud, Google, Exchange, and other CardDAV servers, and syncs with the built-in Contacts app on macOS and iOS.\n\nSHARE\n\nBusyContacts allows you to share address books with other BusyContacts users with read-only or read/write privileges. Address Books can be shared through Exchange, Fruux, Kerio, over the LAN, and through other CardDAV servers that support sharing.", + "currency": "USD", + "artistId": 409966805, + "artistName": "Busy Apps FZE", + "genres": [ + "Business", + "Utilities" + ], + "price": 49.99, + "bundleId": "com.busymac.busycontacts", + "version": "1.4.8", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple1/v4/19/ed/39/19ed390e-0d46-20a9-3a07-959f5da8fef2/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple1/v4/1a/ad/11/1aad1160-0e74-6135-14bf-1d43839ee5b8/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple5/v4/24/2a/a4/242aa49d-ca64-c44a-46bd-b826a2114b56/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple3/v4/05/3e/45/053e45b0-97a9-69bd-eb2d-1f5de77e8b2a/mzl.vcqfhklr.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/13/71/b3/1371b391-df3e-0928-cc3b-241b74f052d5/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/13/71/b3/1371b391-df3e-0928-cc3b-241b74f052d5/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/13/71/b3/1371b391-df3e-0928-cc3b-241b74f052d5/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/whetstone-apps/id460983180?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "DayMap", + "trackId": 460983177, + "sellerName": "Whetstone Apps, LLC", + "releaseNotes": "Support for dark system appearance. (e.g. Dark Mode).", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2011-11-17T07:39:46Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "$12.99", + "currentVersionReleaseDate": "2019-09-04T22:42:44Z", + "trackCensoredName": "DayMap", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "ZH" + ], + "fileSizeBytes": "1988675", + "sellerUrl": "https://www.daymapapp.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/daymap/id460983177?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Have you ever been confused by your day planner? Do you think and plan visually? We created DayMap because we believe visual people deserve an organizer tailored to their strengths.\n\nDayMap is a visual planning app which helps you plan your days and weeks for optimum productivity. The project outliner places your projects side by side in columns so that you can see more information with less scrolling.\n\nThe calendar located below the project outliner makes it easy to schedule important todo’s.\n\n- Sync your DayMap data between your Mac and iPhone (or any iOS Device) thanks to integrated iCloud sync support! (Requires iOS 8 or later and Mac OS X Yosemite or later)\n- System-wide keyboard shortcut to quickly add new tasks to inbox without having to switch apps.\n- Create deep hierarchies of tasks with subtasks.\n- View all your projects and tasks at a glance.\n\nDayMap helps you make the most of every day, every week.\n\nWe are interested in hearing what you think, so share your feedback with us on our website.", + "currency": "USD", + "artistId": 460983180, + "artistName": "Whetstone Apps", + "genres": [ + "Productivity", + "Business" + ], + "price": 12.99, + "bundleId": "com.whetstoneapps.daymap", + "version": "2.1.5", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "appletvScreenshotUrls": [], + "supportedDevices": [ + "iPadMini4-iPadMini4", + "iPadProSecondGen-iPadProSecondGen", + "iPhone11-iPhone11", + "iPad71-iPad71", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPhone8Plus-iPhone8Plus", + "iPhone6sPlus-iPhone6sPlus", + "iPadMini5-iPadMini5", + "iPadProFourthGen-iPadProFourthGen", + "iPhoneXS-iPhoneXS", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadAir3-iPadAir3", + "iPadMini4Cellular-iPadMini4Cellular", + "iPadProCellular-iPadProCellular", + "MacDesktop-MacDesktop", + "iPadMini3-iPadMini3", + "iPhoneXR-iPhoneXR", + "iPhoneSE-iPhoneSE", + "iPad611-iPad611", + "iPhone7-iPhone7", + "iPad73-iPad73", + "iPad812-iPad812", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhoneX-iPhoneX", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadPro97-iPadPro97", + "iPad834-iPad834", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPhone5s-iPhone5s", + "iPad75-iPad75", + "iPadMini3Cellular-iPadMini3Cellular", + "iPad878-iPad878", + "iPhone6-iPhone6", + "iPadAir-iPadAir", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadSeventhGen-iPadSeventhGen", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPhoneXSMax-iPhoneXSMax", + "iPad612-iPad612", + "iPadPro-iPadPro", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone11ProMax-iPhone11ProMax", + "iPadMiniRetina-iPadMiniRetina", + "iPad76-iPad76", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad74-iPad74", + "iPhone6s-iPhone6s", + "iPhone7Plus-iPhone7Plus", + "iPadAir2-iPadAir2", + "iPad72-iPad72", + "iPhone6Plus-iPhone6Plus", + "iPadAirCellular-iPadAirCellular", + "Watch4-Watch4", + "iPhone8-iPhone8", + "iPad856-iPad856", + "iPhone11Pro-iPhone11Pro" + ], + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/4a/8b/b1/4a8bb1a9-54fc-7214-4b40-7bb92fc9f2bc/pr_source.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/ec/5b/41/ec5b4185-2f49-1bb3-1441-637595930db9/pr_source.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/18/3b/26/183b2664-2c17-1bac-1e8b-5759df726eeb/pr_source.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/21/ab/f2/21abf2ea-672e-517a-9941-bd8057196b77/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/7f/a0/03/7fa00345-db22-bf9b-31b2-4d22490ca1f6/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/4a/6d/ab/4a6dab7d-1162-0235-6012-207038d00244/pr_source.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/63/35/7b/63357bc9-3e1c-7758-83d2-f36bb05ac12c/pr_source.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/11/c4/a4/11c4a431-474c-1c52-93df-2a2b948bc4e7/pr_source.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/79/9c/bd/799cbdc4-b67f-7d7f-e54f-0b2b24ac185a/pr_source.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/87/c4/f6/87c4f65a-62c1-ea9d-036a-e77cf4921423/pr_source.png/552x414bb.png" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/bc/8f/d7/bc8fd793-aad2-b60b-d174-44cba7754342/source/60x60bb.jpg", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/bc/8f/d7/bc8fd793-aad2-b60b-d174-44cba7754342/source/512x512bb.jpg", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/bc/8f/d7/bc8fd793-aad2-b60b-d174-44cba7754342/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/shihab-mehboob/id1012903170?uo=4", + "isGameCenterEnabled": false, + "advisories": [], + "features": [ + "iosUniversal" + ], + "kind": "software", + "minimumOsVersion": "13.0", + "trackName": "Allegory", + "trackId": 1470828583, + "sellerName": "Shihab Mehboob", + "releaseNotes": "- Added a new default app icon\n- Added cursor support for iPad\n- Pulling down when viewing a full-screen list will now dismiss the list\n- Improved iCloud sync\n- Improved accessibility and contrast across the app\n- Improved keyboard shortcut commands\n- Added more alternative app icons\n- Fixed various issues where the app may crash\n- Minor UI changes\n- Various bug fixes and improvements\n\nIf you have any questions or feedback, please get in touch. Allegory was created by an incredibly small team of one and I'd love to hear your thoughts. I'm available through email: shihab@allegoryapp.info or Twitter: @AllegoryApp or @JPEGuin.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2019-09-19T07:00:00Z", + "genreIds": [ + "6007", + "6012" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-05-29T17:39:24Z", + "trackCensoredName": "Allegory", + "languageCodesISO2A": [ + "AR", + "NL", + "EN", + "FR", + "DE", + "HE", + "IT", + "PL", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "21512192", + "sellerUrl": "https://www.allegoryapp.info/press", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 4.07017000000000006565414878423325717449188232421875, + "userRatingCountForCurrentVersion": 57, + "averageUserRating": 4.07017000000000006565414878423325717449188232421875, + "trackViewUrl": "https://apps.apple.com/us/app/allegory/id1470828583?uo=4", + "trackContentRating": "4+", + "description": "Allegory is a powerful notes app with a beautiful iOS-centric UI. The minimal and focused writing experience, combined with an impressive set of powerful features, makes this the ideal choice for everyone. Allegory removes the complexity of most markdown editors, presenting a minimal UI that’s welcoming for casual writers and note-takers as well as more attuned authors, making it a great app for you to pick up regardless of your background and skill level.\n\n—\n\nWHY YOU'LL LOVE ALLEGORY:\n\nAllegory immediately launches to the clean and simple note editor screen, boosting your productivity and reducing friction between wanting to write down what you’ve just thought of, and actually getting it written down. Support for valid markdown as well as custom markdown makes it easier to create your best work.\n\nAllegory also includes a brilliant hand-crafted drawing area which lets you select from a variety of colors, long-holding on any of the tools brings them into focus with sliders to adjust their opacity and stroke size with gorgeous animations that strike awe.\n\nYou can bookmark and set due dates on any note from anywhere in the app regardless of where you are, which makes performing essential actions entirely seamless, further reducing friction for users. Seamless iCloud sync adds upon the notion of keeping your notes exactly where they need to be. Notes can be searched for within the app in ways that make sense to you, by words and dates, or by using language that comes naturally such as ‘today’, ‘yesterday’, and ‘last week’. A summary of your current note also provides further context on your writing by displaying character/word/line/paragraph counts, sentiment analysis to portray how positive or negative your writing is, quick links to open the specific note, and more.\n\nInspiration can strike anywhere, and that is why Allegory supports custom action extensions that allow creating notes and putting down ideas from other apps. You can also use Siri to do the same. Scan documents and text to convert it to notes, or add images within notes to provide more context. When you want to share your work with the world, use one of the many export options to create files that work best for you, from TXT and MD, to HTML and PDF. Or simply export as an image or plain text. It's built in ways that make sense to your workflow.\n\nTweak and adjust the app to make it look and behave the way that you want. From app icons and tints, to markdown settings and haptics, there's a settings option to make the app your own. URL schemes and Siri shortcuts allow you to perform useful actions in Allegory from anywhere. Allegory is available on your iPhone, your iPad, and your Apple Watch, and supports seamless iCloud sync to share notes without lifting a finger.\n\nAll the power of iOS is in your hands with Allegory. It is fully integrated with the latest technologies such as Dark Mode, a standalone Apple Watch app, Siri, Today Widget, Quick Actions, Action Extension, Context Menus, iCloud sync, Notifications, document scanning, biometric locks, custom haptics, Pencil support, keyboard shortcuts, URL schemes, custom app icons, iMessage stickers, fully accessible, and more.\n\n—\n\nGET IN TOUCH:\n\nIf you have any questions or feedback, please get in touch. Allegory was created by an incredibly small team of one and I'd love to hear your thoughts. I'm available through email shihab@allegoryapp.info or Twitter @AllegoryApp or @JPEGuin.\n\nhttps://www.allegoryapp.info/terms\nhttps://www.allegoryapp.info/privacy", + "currency": "USD", + "artistId": 1012903170, + "artistName": "Shihab Mehboob", + "genres": [ + "Productivity", + "Lifestyle" + ], + "price": 0.00, + "bundleId": "com.shi.Allegory", + "version": "1.2.8", + "wrapperType": "software", + "userRatingCount": 57 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple/e4/aa/fe/mzl.rpignxpp.jpeg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/5e/01/c1/mzl.rifpmnid.jpeg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple/9f/ea/f4/mzl.jdgitdao.jpeg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple/6f/e8/97/mzl.grngihjg.jpeg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple/d8/a8/a1/mzl.seplyubx.jpeg/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple/v4/cf/5f/3a/cf5f3af7-75bb-38a4-7ac8-72267ee4e066/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple/v4/cf/5f/3a/cf5f3af7-75bb-38a4-7ac8-72267ee4e066/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple/v4/cf/5f/3a/cf5f3af7-75bb-38a4-7ac8-72267ee4e066/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/focus-home-interactive/id406173890?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.6", + "trackName": "The Next Big Thing - Lite", + "trackId": 435972315, + "sellerName": "Focus Home Interactive SAS", + "primaryGenreId": 6014, + "primaryGenreName": "Games", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2011-06-02T08:38:51Z", + "genreIds": [ + "6014", + "7002", + "6016", + "7012" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2011-06-02T08:38:51Z", + "trackCensoredName": "The Next Big Thing - Lite", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "ES" + ], + "fileSizeBytes": "858856057", + "sellerUrl": "http://www.thenextbig-game.com", + "contentAdvisoryRating": "12+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/the-next-big-thing-lite/id435972315?mt=12&uo=4", + "trackContentRating": "12+", + "description": "The Next BIG Thing is the new, hilarious adventure gem from the creators of Runaway. A great adventure game in high definition, loaded with laughs, tributes, mysteries and wacky puzzles!\n \nThanks to a production worthy of a great animated movie, an awesome soundtrack, delightful dialogue and a great art style, The Next BIG Thing will make you live an unforgettable adventure which brilliantly takes players across the fantastic movie genres of a totally crazy Hollywood.\n \nHollywood\nWhat if horror movies' monsters were actually played by real monsters? And what if they were now forced to play in movies for kids, romantic comedies or even musicals? And what would happen if, eventually, they were to rebel?\n \nIn that context, Liz Allaire, talented journalist who can't count up to 4, and Dan Murray, a tough macho who can't stand beetles, attend the horror movies award ceremony… there is the starting point of an incredible story, full of twists and turns! Help Liz and Dan solve the numerous mysteries of an amazing adventure that you won't forget any time soon!\n \n- Solve numerous puzzles and mysteries\n \n- Meet wacky characters and monsters\n \n- Explore dozens of colorful places\n \n- A production worthy of a great animated movie\n \n- Movie-like musical score and English voice-over", + "currency": "USD", + "artistId": 406173890, + "artistName": "FOCUS HOME INTERACTIVE", + "genres": [ + "Games", + "Adventure", + "Entertainment", + "Puzzle" + ], + "price": 0.00, + "bundleId": "com.focushome.TNBTD", + "version": "1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple122/v4/b8/2c/8b/b82c8b3c-9b55-1c06-b735-80fb423912e7/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple122/v4/fb/ef/b4/fbefb447-7011-d6d9-1064-8fad269e6cdc/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple122/v4/5e/7f/b1/5e7fb1a8-db6c-c17f-7522-87832c29ab28/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple111/v4/39/fe/f8/39fef803-5fee-7074-e0f7-9e58a366aa59/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple122/v4/24/6e/4c/246e4c5e-3aa3-4dc3-2feb-7533c7676fc8/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/97/a8/e1/97a8e163-ae77-9fdb-67d0-bf1406869387/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/97/a8/e1/97a8e163-ae77-9fdb-67d0-bf1406869387/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/97/a8/e1/97a8e163-ae77-9fdb-67d0-bf1406869387/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/new-technologies/id762050392?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "iMap Builder - Mind Mapping", + "trackId": 1108898500, + "sellerName": "New Technologies, LLC.", + "releaseNotes": "We made some changes one can't see with a nude eye, which improve the app's performance and will help us to provide more good quality content in the future.", + "primaryGenreId": 6000, + "primaryGenreName": "Business", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2016-05-17T05:23:15Z", + "genreIds": [ + "6000", + "6007" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-05-26T22:38:59Z", + "trackCensoredName": "iMap Builder - Mind Mapping", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "IT", + "JA", + "KO", + "PT", + "RU", + "ZH", + "ES" + ], + "fileSizeBytes": "26579691", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/imap-builder-mind-mapping/id1108898500?mt=12&uo=4", + "trackContentRating": "4+", + "description": "iMap Builder is a simple app designed for bringing your thoughts in order. Pick all your ideas together and create a clear mind map.\n\nUNIVERSAL DATABASE\n- Storage of any thought and ideas;\n- Images and diagrams adding;\n- Convenient built-in calendar;\n- Quick and easy tutorial;\n\nWORKFLOW ORGANIZATION\n- create several \"central\" blocks inside of your project;\n- add different colors to your subtasks;\n- set due dates for each block;\n- add icons or pictures to your blocks;\n\nSMART REPRESENTATION\n- 3 different templates to work with (1 basic hierarchy and 2 additional templates to unlock to organize your thoughts more creatively);\n- mark your tasks as done;\n- connect different elements of blocks into one \"cloud\";\n- make comments for any connections;\n- share your project in social media;\n\nNECESSARY TOOLS\n- search for necessary objects inside your mind map;\n- export to PNG file or print out your projects;\n- Fonts, colors, icon – everything is adjustable;\n- Delete, undo/redo, export – full set of operations.\n\nNo good idea will ever be lost with iMap Builder.\n\n\nPREMIUM ACCESS\n- The length of subscription is 1, 6 or 12 months.\n- Your subscription will be automatically renewed within 1 day before the current subscription ends. \n- Auto-renew option can be turned off in your iTunes Account Settings. \n- Payment will be charged to iTunes Account at confirmation of purchase. \n- No cancellation of the current subscription is allowed during active subscription period.\n\nPrivacy Policy: https://newtech-ltd.com/privacy\n\nTerms Of Use: https://newtech-ltd.com/tos", + "currency": "USD", + "artistId": 762050392, + "artistName": "New Technologies", + "genres": [ + "Business", + "Productivity" + ], + "price": 0.00, + "bundleId": "com.newtechnologies.iMapBuilderlessia", + "version": "2.2.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/91/39/5e/91395ebc-f4fe-74c6-c171-27b735574bca/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/b5/e8/53/b5e8534e-850c-07ba-896e-19d2b40e41e0/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/bc/9c/e9/bc9ce902-e5c8-e96c-c911-b37867105070/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/04/1e/cf/041ecfa3-2352-b6c9-0a84-fcb2fc5dfddb/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/c7/07/2a/c7072a47-f560-ab3c-0444-19d6ac98c23e/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/fe/bf/a0/febfa032-a116-7597-c0db-d32b966c1fc9/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/fe/bf/a0/febfa032-a116-7597-c0db-d32b966c1fc9/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/fe/bf/a0/febfa032-a116-7597-c0db-d32b966c1fc9/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/dorian-brown/id1240209534?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.15", + "trackName": "Guso - Quick Web Search", + "trackId": 1434234265, + "sellerName": "Dorian Brown", + "releaseNotes": "- Added new search feature, you can quickly search Amazon, Youtube, Pinterest, Stackoverflow, Reddit...\n- Improved performance and stability \n- Minor Bug fixes", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2018-08-30T12:01:47Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-04-24T22:40:06Z", + "trackCensoredName": "Guso - Quick Web Search", + "languageCodesISO2A": [ + "EN", + "ES" + ], + "fileSizeBytes": "5658895", + "contentAdvisoryRating": "17+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/guso-quick-web-search/id1434234265?mt=12&uo=4", + "trackContentRating": "17+", + "description": "Google at your fingertips\n\nTake your productivity and efficiency to the next level with Guso.\n\nKey Features:\n- Search Amazon, Youtube, Pinterest, Stackoverflow\n- Lightweight and extremely fast!\n- Instant search suggestions from Google\n- Keyboard shortcut to help you search faster\n- Support All Browsers (Safari, Chrome, Firefox, Internet...)\n- Operated via Menu Bar Icon\n- Beautiful & Intuitive User Interface\n- Dark Mode Support!\n\n\n \"Build for Google lovers\" \n\nIf you have any questions or feedback, please feel free to get in touch. Guso was created by an incredibly small team of one.\n\n\n\n\nNote: Guso is NOT affiliated with, funded, sponsored, or in any way associated with the prominent technology company known as \"Google\".", + "currency": "USD", + "artistId": 1240209534, + "artistName": "Dorian Brown", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.suji.googler", + "version": "1.0.12", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/3c/51/4a/3c514a48-7fd2-ddc4-c945-889cd3612867/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple5/v4/18/54/8d/18548da9-05b0-be27-7eb6-8c7484385d88/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple3/v4/4a/9d/ff/4a9dff6d-7b3e-7f49-f534-1bf59f8bf122/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/e3/a7/45/e3a745b0-1ddd-1480-8b9c-3cf32ae5716a/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple3/v4/6c/a9/cf/6ca9cfc2-69e9-9450-3b6e-83bf9c30ecfb/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/74/f6/77/74f677ae-f3b0-9fbf-839e-41fd8251f415/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/74/f6/77/74f677ae-f3b0-9fbf-839e-41fd8251f415/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple118/v4/74/f6/77/74f677ae-f3b0-9fbf-839e-41fd8251f415/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/karelia-software-llc/id404126469?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.9.5", + "trackName": "The Hit List", + "trackId": 432764806, + "sellerName": "Karelia Software LLC", + "releaseNotes": "• Mojave compatibility fixes\n• Improved handling of sync push notifications", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2011-05-10T07:00:00Z", + "genreIds": [ + "6007", + "6012" + ], + "formattedPrice": "$49.99", + "currentVersionReleaseDate": "2018-09-27T07:32:52Z", + "trackCensoredName": "The Hit List", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "5761638", + "sellerUrl": "http://www.karelia.com/products/the-hit-list/mac.html", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/the-hit-list/id432764806?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Powerful, flexible and simple task management that is a pleasure to use, The Hit List can handle personal tasks and professional projects. Use it with The Hit List for iPhone v2.3 (available on the iOS App Store) which includes The Hit List for Apple Watch and enjoy fast, reliable sync service included with the purchase of the app.\n\nIt is as easy to use as making lists.\n\nNeutralize chaos, and recapture your time and focus. Your life is complicated enough as it is. The tool to manage your life shouldn't be. The Hit List keeps things simple by not forcing you to learn a system. It can be as simple as just keeping a list of things to do as you would on a piece of paper. However, if you do use a task management system such as Getting Things Done by David Allen, The Hit List is flexible enough to support you.\n\nCapture and forget what you need to do later with The Hit List and get your \"now\" back, with confidence.\n\nThe Hit List includes sync service to sync with The Hit List for iPhone and The Hit List for Apple Watch (sold separately on the iOS App Store) or other Macs.", + "currency": "USD", + "artistId": 404126469, + "artistName": "Karelia Software LLC", + "genres": [ + "Productivity", + "Lifestyle" + ], + "price": 49.99, + "bundleId": "com.potionfactory.TheHitList", + "version": "1.1.32", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple1/v4/4c/c2/59/4cc25958-545b-21be-4358-81949570b2c9/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple5/v4/ad/c7/0f/adc70f0a-beb9-92a9-5280-14b2d6ecd215/mzl.rfwynuee.tif/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple4/v4/b1/de/d9/b1ded952-9ca7-fdd5-fb5b-8c2a706843d2/mzl.kwhtbdtp.tif/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple1/v4/32/97/39/32973957-855d-8d20-c0c2-04877a933a99/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple3/v4/b4/32/c7/b432c76a-1def-d380-062d-928571cc50cd/mzl.bqwyjhwr.tif/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple30/v4/d8/33/20/d8332020-6bbd-80be-fbe3-291dd78f78ea/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple30/v4/d8/33/20/d8332020-6bbd-80be-fbe3-291dd78f78ea/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple30/v4/d8/33/20/d8332020-6bbd-80be-fbe3-291dd78f78ea/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/delullo-software-llc/id409729333?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "All Things Money", + "trackId": 782925777, + "sellerName": "DeLullo Software, LLC", + "releaseNotes": "The All Things Money 1.4.0 update improves functionality and stability, and is recommended for all users.\n\nNew features include:\n\n- Enabled QFX files with transactions to be imported.\n- When importing a file, if transaction categories are not specified then they will be automatically set to the last category used by the payee.\n- Added stock market technical indicators for Aroon, Money Flow, Relative Strength, and Fast Stochastic.\n- Added the ability to simultaneously view weekly and daily stock technicals.\n\nStability improvements include:\n\n- Added support for importing files with international character encodings.\n- Fixed two bugs that affected printing functionality.\n- Fixed QIF exports, which incorrectly had a percent symbol in the date field.\n- Fixed international currency formatting of the payment and deposit columns.\n\nFor detailed release notes, please visit: http://www.delullosoftware.com/apps/AllThingsMoney/ReleaseNotes.pdf", + "primaryGenreId": 6015, + "primaryGenreName": "Finance", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2014-02-07T23:58:42Z", + "genreIds": [ + "6015", + "6000" + ], + "formattedPrice": "$9.99", + "currentVersionReleaseDate": "2015-09-15T13:07:44Z", + "trackCensoredName": "All Things Money", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "1456751", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/all-things-money/id782925777?mt=12&uo=4", + "trackContentRating": "4+", + "description": "All Things Money (ATM) was created with the mindset that good finance software doesn’t need to be expensive, to contain advertisements, or to log into your bank account. It should be comprehensive and provide interconnected services. It should also be efficient by supporting multiple input formats, auto-completing certain fields, and automatically logging recurring transactions. ATM delivers on these goals and more.\n\nIf you are curious, please give it a try. Download All Things Money Lite for free to determine whether ATM is a good fit for you. When you want to upgrade, use the export and import menu options to transfer data between apps.\n\nATM capabilities include the following.\n\nAccount Dashboard\n- The innovative layout gives perspective to all of your liquid assets.\n- Track bank, credit card, stock market, and U.S. savings bond accounts.\n- Calculate net worth.\n- Sort transactions.\n- Split transactions.\n- Add memos to transactions.\n- Import bank, credit card, and stock market transactions from QIF and CSV files.\n- Import bank and credit card transactions from OFX files. (At this time, stock market transactions are not supported via OFX imports.)\n- Import U.S. savings bonds from treasurydirect.gov HTML files.\n- ATM auto-fills payee names and categories.\n- The bank-account paradigm enables you to earmark money.\n\nBill Planner\n- Track payments and deposits.\n- Track automatic stock market trades that are typical of 401k-type accounts.\n- Elect to automatically move up bill dates to avoid weekends and U.S. holidays. \n- ATM supports the following payment intervals: daily, weekly, bi-weekly, semi-monthly, monthly, bi-monthly, quarterly, once every four months, semi-annually, annually, bi-annually.\n\nStay on Budget\n- Create a budget based on transactions from the prior year.\n- Update budget goals based on your expected bills and deposits.\n- Update actuals from account transactions.\n- ATM supports annual, monthly, and custom-period budgets.\n- ATM provides color-coded alerts to track spending excess.\n\nPlan for Retirement\n- Seed the retirement calculator with your account information.\n- Calculate how much money you will have when you retire.\n- Calculate the annuity that your retirement will generate.\n- ATM also includes a general-purpose, compound-interest calculator that has six unique equations and two combination options for expediency. This calculator enables reverse computations; it calculates how much money you need to retire based on your desired annuity, interest rate, and life expectancy.\n\nMonitor the Stock Market\n- Create a watch list that saves stock symbols and time intervals.\n- Display a stock’s price and volume alongside technical indicators like Bollinger Bands and Moving Average Convergence Divergence (MACD).\n- ATM supports daily and weekly stock charts.\n\nMortgage Analysis\n- Create an amortization table and track your mortgage balance as you pay down principal. \n- Compare the costs of buying and renting.\n\nInventory Tracking\n- Keep track of your collections.\n\nCreate Reports\n- Generate plots of net worth and stock prices.\n\nMinimum requirements: screen resolution of 1280 x 800 or higher.", + "currency": "USD", + "artistId": 409729333, + "artistName": "DeLullo Software, LLC", + "genres": [ + "Finance", + "Business" + ], + "price": 9.99, + "bundleId": "com.delullosoftware.AllThingsMoney", + "version": "1.4.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/35/ab/f3/35abf398-3d14-0260-8aa0-94c8fe338524/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/22/8a/50/228a50d9-e1c0-4c13-2dab-720277a5d135/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/34/3d/a0/343da0fc-14f2-ea17-60a0-18af8e8ef1d2/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/34/3d/a0/343da0fc-14f2-ea17-60a0-18af8e8ef1d2/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/34/3d/a0/343da0fc-14f2-ea17-60a0-18af8e8ef1d2/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/hypercritical-llc/id1493996621?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.15", + "trackName": "SwitchGlass", + "trackId": 1498546559, + "sellerName": "Hypercritical LLC", + "releaseNotes": "• Minor layout adjustments to the Preferences and Exclude windows.\n• Updates to improve support for future operating systems.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2020-02-12T08:00:00Z", + "genreIds": [ + "6007" + ], + "formattedPrice": "$4.99", + "currentVersionReleaseDate": "2020-07-24T16:20:19Z", + "trackCensoredName": "SwitchGlass", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "2955121", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/switchglass/id1498546559?mt=12&uo=4", + "trackContentRating": "4+", + "description": "SwitchGlass adds a dedicated application switcher to your Mac. You can customize its appearance, size, and position on each attached display, including hiding it on selected displays. Use it to bring one or all of an app’s windows to the front, or as a drag-and-drop target to open files.\n\nThe following app switcher attributes can be customized individually for each attached display:\n\n• Visibility - Permanently hide, show, or auto-hide the app switcher. Auto-hide keeps the app switcher hidden until the mouse cursor touches the region of the screen edge where the app switcher is positioned.\n• Position - Move the app switcher to one of eight different positions on each screen.\n• Orientation - Make the app switcher horizontal or vertical in a given position.\n• Material - Change the appearance of the app switcher background to one of four possible choices (see screenshot above) including a mode where it automatically matches the system appearance (e.g, dark when dark mode is active, light otherwise).\n• Corner Style and Radius - Choose from three corner styles: square, circle, or “squircle” (a “continuous” rounded corner style). The corner radius can also be adjusted.\n• Icon Size - Adjust the size of app icons in the switcher from 16 to 256 points.\n• Icon Padding - Adjust the padding between icons from 0% to 100% of the configured icon size.\n• Margin - Adjust the amount of space around the app switcher.\n\nAdditionally, the following global settings may be customized:\n\n• App Sort Order - Sort apps by name or launch order, descending or ascending.\n• App Filtering - Show all apps or just those with windows on the current display.\n• Menu Bar Icon - Choose from three possible menu bar icons.\n• App Exclusions - Select apps that should never appear in the app switcher.\n\nHere’s how the app switcher works in its default configuration:\n\n• Click an app icon to bring all windows from that app to the front.\n• Hold down the Shift key while clicking an app icon to bring just one window from that app to the front.\n• Hold down the Option key while clicking an app icon to hide the current app before bringing the clicked app to the front. (Option-clicking the currently active app will hide it.)\n• Hold down the Option and Shift keys while clicking an app icon to hide the current app before bringing just one window from the clicked app to the front. (Option-Shift-clicking the currently active app will hide it.)\n• Right-click (or Control-click) an app icon to activate a context menu from which you can perform any of the supported actions (described below).\n• Drag one or more files or folders onto an app icon to open those items with the app.\n• Hold down the Command key while clicking on an app icon to reveal the app in the Finder.\n\nThe click and Shift-click actions are configurable. Each may be set to any one of these actions:\n\n• Show All Windows - Activate an app and bring all its window to the front.\n• Activate - Activate an app and bring a single window to the front.\n• Reopen - Activate an app in a way that triggers its “reopen” handler. Apps can choose to do whatever they want in response to a “reopen” action, but most bring a single window to the front, opening a new window (or un-minimizing a window from the Dock) if none are open.\n• Reopen and Show All - This is the same as “Reopen” except that SwitchGlass will also bring all the app’s windows to the front after sending the “reopen” action.\n\nFor more information, click the SwitchGlass menu bar icon and choose “Help”, or visit https://hypercritical.co/switchglass/#help", + "currency": "USD", + "artistId": 1493996621, + "artistName": "Hypercritical LLC", + "genres": [ + "Productivity" + ], + "price": 4.99, + "bundleId": "co.hypercritical.SwitchGlass", + "version": "1.4.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple125/v4/63/5c/bf/635cbf44-3c63-4737-28a7-b5290a7e32b5/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/a6/a3/e6/a6a3e643-f2b1-1110-24a7-be0f1367c143/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/63/74/8f/63748fcc-365e-7a02-09d5-4107c770c6b7/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/46/98/bb/4698bb7e-13b7-684d-c0ab-e31400f65139/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/90/3c/17/903c1770-37ca-0c8a-e22d-bd43b703259a/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/20/d6/b1/20d6b1f9-d3c2-85af-274d-d3762879cf82/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/20/d6/b1/20d6b1f9-d3c2-85af-274d-d3762879cf82/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/20/d6/b1/20d6b1f9-d3c2-85af-274d-d3762879cf82/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/abdusodiq-saidov/id600067303?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.12", + "trackName": "Things for Work - Templates", + "trackId": 1275071331, + "sellerName": "Abdusodiq Saidov", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2019-04-23T04:19:28Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2019-04-23T04:19:28Z", + "trackCensoredName": "Things for Work - Templates", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "11704916", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/things-for-work-templates/id1275071331?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Writing a smart cover letter or resume is not always an easy task. For most people, writing a good resume and letter is tough, and it takes time. \n\nWouldn't it be wonderful if you could figure out how to make a resume that would get you an interview almost every time you applied for a job?\n\nResume is not a log of your job history. It is not a summary of your skills. It is not going to automatically get you a job if you don't prepare them in proper ways.\n\nThis app will help you to prepare better cover letter and resume step-by-step.\n\nIt comes with sample Cover Letters and Resumes.\n\nFeel Free to contact us if you need any other templates!\n\n*** Microsoft Word and/or Pages app is required to work with and open templates ***", + "currency": "USD", + "artistId": 600067303, + "artistName": "Abdusodiq Saidov", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.00, + "bundleId": "com.iconshots.VectorClliparts", + "version": "1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple1/v4/e3/c1/49/e3c1499b-0756-9e1e-51e3-ce92b9ce79b5/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple3/v4/1f/89/e1/1f89e162-34a2-7bfd-41ef-975d13ca5d9b/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple5/v4/30/97/85/30978568-5806-42e3-b541-8c1182f8a152/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple3/v4/67/7d/36/677d368d-fc13-3fe4-4f47-4cd91c1d026e/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple1/v4/3c/39/f0/3c39f04e-187e-4a97-10f7-2538625e7c6f/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/5e/a7/b1/5ea7b10b-dbee-262d-cb05-9a49883664dc/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/5e/a7/b1/5ea7b10b-dbee-262d-cb05-9a49883664dc/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/5e/a7/b1/5ea7b10b-dbee-262d-cb05-9a49883664dc/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/lucien-dupont/id292886202?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.9", + "trackName": "Check Off - A Task Manager", + "trackId": 458418895, + "sellerName": "Lucien Dupont", + "releaseNotes": "- fixed a crash when deleting a URL in the notes area. Thanks to Reza for reporting it!", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2011-08-31T07:11:42Z", + "genreIds": [ + "6007", + "6012" + ], + "formattedPrice": "$4.99", + "currentVersionReleaseDate": "2020-06-22T23:20:32Z", + "trackCensoredName": "Check Off - A Task Manager", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "6115501", + "sellerUrl": "http://www.chromedomesoftware.com/CheckOff/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/check-off-a-task-manager/id458418895?mt=12&uo=4", + "trackContentRating": "4+", + "description": "CheckOff is a task management application that runs as a stand alone application or a menu bar app. \n\nFeatures: \n\n• Your choice: runs in a menu bar mode so that your dock doesn't get cluttered up, or as a normal application.\n• Tasks can be placed within folders, and have labels attached to each task.\n• Tasks can be put inside other tasks\n• Tasks can have notes with plain text or rich text with fonts, colors, and sizes. \n• Notes can also contain links to websites or local files, allowing one click access to resources that can be used to complete the task. \n• Menu bar icon color can be customized.\n• Hot key support to open the main window.\n• Export your tasks as text, RTF, html and opml\n• Dark mode support for macOS Mojave and Catalina", + "currency": "USD", + "artistId": 292886202, + "artistName": "Lucien Dupont", + "genres": [ + "Productivity", + "Lifestyle" + ], + "price": 4.99, + "bundleId": "com.chromedomesoftware.checkoff", + "version": "5.8.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple4/v4/e2/c3/1e/e2c31ea8-a561-5200-57bb-ca3826c0f670/mzl.jantsuya.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple4/v4/a8/30/32/a830321b-5e72-23e3-eb23-7160c4832b19/mzl.agzqdpdf.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple/v4/83/34/45/83344504-6351-a6c7-5df4-27856a80a0bb/mzl.hckkslpf.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple4/v4/dc/f6/02/dcf602c6-df13-f41f-26ff-69c9fb6beca9/mzl.rrlwevnr.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple6/v4/d9/3d/94/d93d9406-9410-ef3b-8dae-28125d2dad8a/mzl.fkekfvts.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple7/v4/28/51/cb/2851cb6d-1bfc-ec20-aa8d-28e2e366cc6d/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple7/v4/28/51/cb/2851cb6d-1bfc-ec20-aa8d-28e2e366cc6d/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple7/v4/28/51/cb/2851cb6d-1bfc-ec20-aa8d-28e2e366cc6d/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/doit-im/id350974724?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.7", + "trackName": "Doit.im", + "trackId": 533391459, + "sellerName": "Xu Zhe", + "releaseNotes": "Fixed the bug that the background color of Smart Add popup is black.\nFixed the bug that repeat tasks will be created before the repeat strategy start time.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2012-10-23T19:25:14Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2015-07-09T22:51:34Z", + "trackCensoredName": "Doit.im", + "languageCodesISO2A": [ + "EN", + "JA", + "ZH" + ], + "fileSizeBytes": "3971688", + "sellerUrl": "http://doit.im", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/doit-im/id533391459?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Doit.im is the smartest way to manage your tasks with the implementation of Getting Things Done (GTD) methodology. It helps you efficiently handle your tasks, whether you are busy executives or smart staff.\n\nWe’ve redesigned the user interface to make it simpler and more convenient. The brand-new task view of Today and Next Actions makes our tasks more focused and organized. Doit.im supports for multi-platforms, including Web/iOS/Mac etc, with Mac version exclusive for the Pro members.\n\nFeatures:\n \n 1. Keep your tasks in sync with Doit.im Cloud to make you in control of your tasks anywhere, anytime.\n 2. Completely implement GTD theory.\n 3. Support multi-level views: goals, projects, tasks, subtasks.\n 4. Manually sort your goals, projects, next actions, subtasks and contexts.\n 5. Forward tasks to your companions and track the status of the tasks.\n 6. Support the customization of your avatar.\n 7. Support Daily Plan.\n 8. Support Daily Review and Statistics, which you can share in Twitter and Facebook.\n \n* Still use to do list? It's time to try GTD and enjoy the completely different upgrading!", + "currency": "USD", + "artistId": 350974724, + "artistName": "Doit.im", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.snoworange.Doitim-Mac", + "version": "4.2.3", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/81/95/41/819541ad-9e99-a68d-680a-f6787be06dfb/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/ab/bb/6d/abbb6dd6-e56c-3617-40f2-689b337d7acd/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/5a/d1/05/5ad1059c-7e90-34a4-a257-f5c21c40c065/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/86/1d/bc/861dbc65-4574-6ae2-4e69-eda306db4a45/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/20/c0/52/20c052a4-00fc-db15-3859-1bee09157fd0/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/4e/c2/71/4ec27160-f36d-dd23-66d8-234d77ff0f74/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/ca/2b/36/ca2b36b9-656f-c556-372b-14cf2504e020/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/63/19/9f/63199f56-2cf0-226f-d24a-a710e640329c/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/63/19/9f/63199f56-2cf0-226f-d24a-a710e640329c/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/63/19/9f/63199f56-2cf0-226f-d24a-a710e640329c/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/quantum-quinn/id284974414?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.13", + "trackName": "JotNow - Sticky Note Manager", + "trackId": 402371718, + "sellerName": "Christopher Bess", + "releaseNotes": "Thanks to everyone who reported bugs and unexpected issues!\n\n- Improved email integration, fixes email note bug\n- Fixed accent character input bug\n- Other bug fixes and enhancements", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2011-01-02T01:23:15Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "$2.99", + "currentVersionReleaseDate": "2019-07-05T19:09:03Z", + "trackCensoredName": "JotNow - Sticky Note Manager", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "3795543", + "sellerUrl": "https://www.quantumquinn.com/overview/jotnow", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/jotnow-sticky-note-manager/id402371718?mt=12&uo=4", + "trackContentRating": "4+", + "description": "It's the Stickies-like app you have been waiting for all this time…\n\nPlace notes in notebooks and further organize them with categories. Resize, dock, and collapse notes to keep them out of your way but still in plain sight. Even use your favorite color to add some style to your notes. Why write down notes when you can have JotNow store, search, and organize them?\n\nOrganize your thoughts and find them just as fast. Move between notes just as easy as you create them. Find and display notes with a click of a mouse or the press of a key. So much effort has been put on functionality and simplicity you will wonder how you ever used your computer without JotNow installed.\n\nVideos available at: http://jotnow.com/overview/jotnow\n\nNote Features:\n• Notes can float on top of other windows\n• Syncs note tasks reminders (due dates) with Reminders.app\n• All notes support rich text (RTF). Bold, italic, different font styles, etc.\n• Auto-saves, never worry about notes being saved\n• Note tasks, each note has it's own list of to-dos\n• Auto-indent lists\n• Email note\n• Custom note colors and note transparency, style your notes\n• Dock and collapse notes\n• Resizable (with scrollbars)\n• Dock notes to any part or edge of your screen (multi-monitors supported)\n• Manage notes without using the mouse\n• Search within notes\n• Swipe/flick notes left or right to dock them (trackpad only, two or three fingers)\n• Text-to-speech support for all notes (notes can be read aloud by your Mac)\n\nNote Manager Features:\n• Search Notes\n• Import and export notes (txt, rtf, etc)\n• Drag selected text or existing RTF and Text files to create notes\n• Create notes from empty searches\n• Find recent notes quickly using search operators (:today, :recent, :new)\n• No mouse required to manage notes (keyboard friendly)\n\nGeneral Features:\n• Easy to use\n• Hide dock icon\n• Quickly search for notes from anywhere (using Open Notes window)\n• Can be used without the mouse\n• Print directly from notes\n• Unlimited notes\n• Unlimited notebooks and tags\n• Global/system keyboard shortcuts (hot keys) allow access to JotNow from any application\n• Note trash, safely delete any note, you can see it later, if needed\n• Dock and Status Bar menus to access notes\n• Keyboard user friendly (many helpful shortcuts), you can command key features without touching your mouse\n• Stable and reliable, your notes are safe\n• Resource friendly, low memory footprint\nand much more...\n\nOnline documentation and videos are available in our support section.\nhttp://jotnow.com/overview/jotnow/support/\n\nSoli Deo Gloria", + "currency": "USD", + "artistId": 284974414, + "artistName": "Quantum Quinn", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 2.99, + "bundleId": "com.quantumquinn.JotNowDesktop", + "version": "1.8.2", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/c6/6e/4c/c66e4c72-28ed-8b4d-be7f-a91b41d89b30/ba6f5198-ca10-4672-96b0-e58af9e56c9c_MacOS-1_en.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/0f/92/90/0f9290b2-c11b-ca5d-e772-e891860270b4/1da0f90b-57fe-46b7-9f8d-db0272ab6e9c_MacOS-2_en.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/a1/61/d7/a161d7a1-e500-c169-d240-0bcc6a453b6e/5c43427a-7d9a-4394-b1e2-0a8b030c7e6e_MacOS-3_en.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/38/00/53/380053ec-128f-ba09-2971-6ef163f34c2c/2d5e948e-badb-46d0-81be-97102ecccb9a_MacOS-4_en.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/a8/7b/4c/a87b4c75-e493-635c-6e8b-68a44168c552/bbd91ce7-f028-4434-989c-e7583bc636f7_MacOS-5_en.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/58/33/62/583362d6-3e4d-5bd8-0241-8db2481456e4/e33d62f5-aafb-4281-9f81-610723031b52_MacOS-6_en.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/12/f8/e1/12f8e1cb-c20f-e1d3-3b98-5448130d9654/83d068bb-a3d9-4c96-a43d-830a7bafd964_MacOS-7_en.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/37/b4/86/37b48654-a9b8-1903-209e-b950400875d0/c777c2c3-ace7-46ee-b26b-ba88d9aa7507_MacOS-8_en.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/f5/bb/a4/f5bba445-fa45-e9ff-31c3-7184bc43cdc0/source/60x60bb.png", + "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/f5/bb/a4/f5bba445-fa45-e9ff-31c3-7184bc43cdc0/source/512x512bb.png", + "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/f5/bb/a4/f5bba445-fa45-e9ff-31c3-7184bc43cdc0/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/tarasov-mobile/id547656503?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.13.0", + "trackName": "Chaos Control™: GTD Task List", + "trackId": 1071244525, + "sellerName": "Dmitriy Tarasov", + "releaseNotes": "From now on projects with Due Dates are shown in the Daily Plan section of the app. You can switch off this feature in the Settings menu of the app if you prefer to see tasks only. \n+ various improvements and optimisations.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2016-01-20T20:29:38Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-09-01T21:01:42Z", + "trackCensoredName": "Chaos Control™: GTD Task List", + "languageCodesISO2A": [ + "EN", + "RU" + ], + "fileSizeBytes": "48546730", + "sellerUrl": "http://chaos-control.mobi/?utm_source=appstore&utm_medium=mac&utm_campaign=appstore_mac_ver_1", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/chaos-control-gtd-task-list/id1071244525?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Chaos Control is a task manager based on the best ideas of GTD (Getting Things Done) methodology created by David Allen. Whether you are running a business, launching an app, working on a project or simply planning your holiday trip, Chaos Control is a perfect tool to manage your goals, juggle your priorities, and organize your tasks to get things done. And the best part is, you can handle both heavyweight project planning and simple daily routine like shopping list management in one flexible app. Also, Chaos Control is available across all major mobile and desktop platforms with seamless sync.\n\nHERE IS HOW IT WORKS:\n\n1) MANAGE YOUR PROJECTS\nProject is a goal combined with a set of tasks you need to complete in order to achieve it. Create as many projects as you like to write down all the desired outcomes you have\n\n2) ORGANIZE YOUR GOALS\nCreate unlimited number of projects and group them by category using Folders\n\n3) USE GTD CONTEXTS\nOrganize tasks from different projects using flexible context lists. If you are familiar with GTD you would just love this feature\n\n4) PLAN YOUR DAY\nSet due dates for tasks and make plans for any particular day\n\n5) USE CHAOS BOX\nPut all the incoming tasks, notes and ideas into Chaos Box in order to process them later. It works similar to GTD inbox, but you can use it as a simple to-do list\n\n6) SYNC YOUR DATA\nChaos Control works on both desktop and mobile devices. Setup an account and sync your projects across all of your devices\n\nThis app is designed with creative people in mind. Designers, writers, developers, startup founders, entrepreneurs of all kinds and pretty much anyone with ideas and desire to make them happen. We combined the power of GTD with the convenient interface to help you with:\n• personal goal setting\n• task management\n• time management\n• planning your business and personal activities\n• building your routine\n• handling simple to do lists, checklists and shopping lists\n• catching your ideas and thoughts to process them later\n\nKEY FEATURES\n• Seamless cloud sync across all major mobile and desktop platforms\n• GTD-inspired Projects and Contexts supplemented with Folders, sub-folders and sub-contexts\n• Recurring tasks (daily, weekly, monthly and chosen days of the week)\n• Chaos Box - Inbox for your unstructured tasks, notes, memos, ideas and thoughts. Great tool for staying on track inspired by GTD ideas\n• Notes for tasks, projects, folders and contexts\n• Fast and smart search\n\nHave a productive day!\n\nTerms Of Use:\nhttp://chaos-control.mobi/toc.pdf", + "currency": "USD", + "artistId": 547656503, + "artistName": "Tarasov Mobile", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.00, + "bundleId": "com.tarasovmobile.ChaosControlMac", + "version": "1.10", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "appletvScreenshotUrls": [], + "supportedDevices": [ + "iPadMini4-iPadMini4", + "iPadProSecondGen-iPadProSecondGen", + "iPhone11-iPhone11", + "iPad71-iPad71", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPhone8Plus-iPhone8Plus", + "iPhone6sPlus-iPhone6sPlus", + "iPadMini5-iPadMini5", + "iPadProFourthGen-iPadProFourthGen", + "iPhoneXS-iPhoneXS", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadAir3-iPadAir3", + "iPadMini4Cellular-iPadMini4Cellular", + "iPadProCellular-iPadProCellular", + "MacDesktop-MacDesktop", + "iPadMini3-iPadMini3", + "iPhoneXR-iPhoneXR", + "iPhoneSE-iPhoneSE", + "iPad611-iPad611", + "iPhone7-iPhone7", + "iPad73-iPad73", + "iPad812-iPad812", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhoneX-iPhoneX", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadPro97-iPadPro97", + "iPad834-iPad834", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPhone5s-iPhone5s", + "iPad75-iPad75", + "iPadMini3Cellular-iPadMini3Cellular", + "iPad878-iPad878", + "iPhone6-iPhone6", + "iPadAir-iPadAir", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadSeventhGen-iPadSeventhGen", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPhoneXSMax-iPhoneXSMax", + "iPad612-iPad612", + "iPadPro-iPadPro", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone11ProMax-iPhone11ProMax", + "iPadMiniRetina-iPadMiniRetina", + "iPad76-iPad76", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad74-iPad74", + "iPhone6s-iPhone6s", + "iPhone7Plus-iPhone7Plus", + "iPadAir2-iPadAir2", + "iPad72-iPad72", + "iPhone6Plus-iPhone6Plus", + "iPadAirCellular-iPadAirCellular", + "iPhone8-iPhone8", + "iPad856-iPad856", + "iPhone11Pro-iPhone11Pro" + ], + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/6e/8d/56/6e8d56ea-494a-23ca-cfdd-0ba065d8e8f2/pr_source.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/6e/ed/49/6eed4931-c254-abba-7823-1e8ebd7d652c/pr_source.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/e8/77/3f/e8773fd7-7541-e9e4-2882-65c400434ad5/pr_source.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/68/62/71/686271c4-38df-ea7b-f95f-90fad57c6def/pr_source.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/6d/a5/53/6da55373-9f5e-671f-eaf4-7f32ad79123b/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/a0/6c/07/a06c07bd-7542-f57e-92d0-49067c144111/pr_source.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/68/1a/4d/681a4d23-d0df-ea50-8afa-0b2959640395/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/93/4f/86/934f86be-be87-63a1-af42-b1183dca6f93/pr_source.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/1a/f4/77/1af4771a-e086-5085-d937-8458a2356e43/pr_source.png/392x696bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/40/7d/ba/407dba14-e345-9644-8c49-6ea8d07ee73f/pr_source.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/2a/3e/df/2a3edf37-3580-b911-ece9-b22afba71583/pr_source.png/552x414bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/48/43/f0/4843f065-030a-9721-5d08-971021f3c922/pr_source.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/37/db/25/37db2594-602c-d411-1826-fc0446632cd3/pr_source.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/6c/8e/0a/6c8e0ab0-1519-474e-d7c4-c81e44be3925/pr_source.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/c1/72/4e/c1724e7a-07e9-b9ff-7e1a-3dc3296a70dd/pr_source.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/e1/4d/6d/e14d6dee-571b-a277-5a6f-4e8a1966b235/pr_source.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/24/63/30/246330e7-7632-5f13-4288-ec4847c524fc/pr_source.png/552x414bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/7f/12/47/7f124738-f363-4d4d-e35c-05777ee3e472/pr_source.png/552x414bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/93/95/cf/9395cf14-4ae2-7303-61ac-d83a72c85af6/pr_source.png/552x414bb.png", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/94/cb/2d/94cb2d43-9999-3eda-22ff-8eadf003b561/pr_source.png/552x414bb.png" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/fa/9c/04/fa9c04ca-ff25-d039-2b39-c4a0585c05ee/source/60x60bb.jpg", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/fa/9c/04/fa9c04ca-ff25-d039-2b39-c4a0585c05ee/source/512x512bb.jpg", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/fa/9c/04/fa9c04ca-ff25-d039-2b39-c4a0585c05ee/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/tiger-ng/id356989572?uo=4", + "isGameCenterEnabled": false, + "advisories": [], + "features": [ + "iosUniversal" + ], + "kind": "software", + "minimumOsVersion": "11.4", + "trackName": "Book Generator", + "trackId": 1471872257, + "sellerName": "Tiger Ng", + "releaseNotes": "New features:\n1. Import Microsoft Word Document\n2. Import Google Docs\n3. Import Google Sheets\n4. Import Google Classroom's assignment submissions by students\n5. CSV: start from scratch & import from clipboard\n6. Markdown: start from scratch & import from clipboard\n7. Bug fix", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2019-07-25T07:00:00Z", + "genreIds": [ + "6007", + "6017" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2019-09-16T14:30:50Z", + "trackCensoredName": "Book Generator", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "16542720", + "sellerUrl": "https://getbookgenerator.blogspot.com/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 1, + "userRatingCountForCurrentVersion": 1, + "averageUserRating": 1, + "trackViewUrl": "https://apps.apple.com/us/app/book-generator/id1471872257?uo=4", + "trackContentRating": "4+", + "description": "Book Generator is a new way to convert OneNote notebooks, Trello boards, Word Documents, Excel spreadsheets, Google Docs, Google Sheets, Google Classroom, CSV and Markdown files into EPUB or PDF.\n\nCore Features\n* OneNote: each notebook represents a book, each section represents a group, each page represents a chapter.\n* Trello: each board represents a book, each list represents a chapter, each card represents an element.\n* Word: each heading represents a page.\n* Excel: each row represents a page, each record represents an element.\n* Google Docs: each heading represents a page.\n* Google Sheets: each row represents a page, each record represents an element.\n* Google Classroom: each classwork represents a book, each assignment submission represents a page.\n* CSV: each row represents a page, each record represents an element.\n* Markdown: convert to HTML\n* Support image, video and audio attachment.\n\nBasic Editing Features\n* Edit cover image.\n* Edit book style.\n* Configure book information.\n* Delete chapter.\n* Reorder chapter.\n\nThe generated book can be imported into Creative Book Builder for further editing.", + "currency": "USD", + "artistId": 356989572, + "artistName": "Tiger Ng", + "genres": [ + "Productivity", + "Education" + ], + "price": 0.00, + "bundleId": "com.tigernghk.ios.bookgenerator", + "version": "1.2", + "wrapperType": "software", + "userRatingCount": 1 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/fb/ca/09/fbca09ec-b32e-57f0-1b1f-7d81d40a9151/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple114/v4/98/82/fa/9882fa60-c5ee-1885-032b-a1c1b84e8b00/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/13/d4/c2/13d4c2b0-1a22-d904-e3e7-043f1e557fdd/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/e1/d8/be/e1d8bee3-051b-6e5f-1e7d-27962dbf2def/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/16/eb/ab/16ebab10-9ef3-728e-7a07-1e61f51729dd/source/60x60bb.png", + "artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/16/eb/ab/16ebab10-9ef3-728e-7a07-1e61f51729dd/source/512x512bb.png", + "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Purple114/v4/16/eb/ab/16ebab10-9ef3-728e-7a07-1e61f51729dd/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/haibo-tang/id1501309035?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.15", + "trackName": "TomatoThings 2", + "trackId": 1501309036, + "sellerName": "Haibo Tang", + "primaryGenreId": 6002, + "primaryGenreName": "Utilities", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2020-03-03T08:00:00Z", + "genreIds": [ + "6002", + "6007" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-03-03T21:17:35Z", + "trackCensoredName": "TomatoThings 2", + "languageCodesISO2A": [ + "EN", + "ZH" + ], + "fileSizeBytes": "4494776", + "sellerUrl": "http://ihugo.cc", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/tomatothings-2/id1501309036?mt=12&uo=4", + "trackContentRating": "4+", + "description": "一款结合TODO和番茄工作法的工具。让您能够专注的进行工作。第一个版本包含一些基础的功能比如TODO,番茄工作法,统计。\n\n这是我个人的第一款应用。我想长期进行维护。所以您如果有任何想法,请通过邮件直接和我进行联系。\n\n联系方式: dusty@vip.qq.com", + "currency": "USD", + "artistId": 1501309035, + "artistName": "Haibo Tang", + "genres": [ + "Utilities", + "Productivity" + ], + "price": 0.00, + "bundleId": "cc.ihugo.app.TomatoThings2", + "version": "1.0", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple/5e/01/c1/mzl.ycuysdmk.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/9f/ea/f4/mzl.kllojlbn.jpg/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple/d8/a8/a1/mzl.rdtnfjfa.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple/e4/aa/fe/mzl.qaehltfv.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple/6f/e8/97/mzl.vhjtxmra.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple/v4/9a/00/9a/9a009a64-82dc-85af-7f7d-92199ed9b97c/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple/v4/9a/00/9a/9a009a64-82dc-85af-7f7d-92199ed9b97c/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple/v4/9a/00/9a/9a009a64-82dc-85af-7f7d-92199ed9b97c/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/focus-home-interactive/id406173890?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.6", + "trackName": "The Next Big Thing", + "trackId": 430203668, + "sellerName": "Focus Home Interactive SAS", + "releaseNotes": "Update 1.1: The game is now playable with voices in English, French and German.", + "primaryGenreId": 6014, + "primaryGenreName": "Games", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2011-06-02T07:00:00Z", + "genreIds": [ + "6014", + "7009", + "6016", + "7002" + ], + "formattedPrice": "$9.99", + "currentVersionReleaseDate": "2011-06-17T00:48:43Z", + "trackCensoredName": "The Next Big Thing", + "languageCodesISO2A": [ + "EN", + "FR", + "DE", + "ES" + ], + "fileSizeBytes": "5271779975", + "sellerUrl": "http://www.thenextbig-game.com/", + "contentAdvisoryRating": "12+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/the-next-big-thing/id430203668?mt=12&uo=4", + "trackContentRating": "12+", + "description": "The Next BIG Thing is the new, hilarious adventure gem from the creators of Runaway. A great adventure game in high definition, loaded with laughs, tributes, mysteries and wacky puzzles!\n \nThanks to a production worthy of a great animated movie, an awesome soundtrack, delightful dialogue and a great art style, The Next BIG Thing will make you live an unforgettable adventure which brilliantly takes players across the fantastic movie genres of a totally crazy Hollywood.\n \nHollywood\nWhat if horror movies' monsters were actually played by real monsters? And what if they were now forced to play in movies for kids, romantic comedies or even musicals? And what would happen if, eventually, they were to rebel?\n \nIn that context, Liz Allaire, talented journalist who can't count up to 4, and Dan Murray, a tough macho who can't stand beetles, attend the horror movies award ceremony… there is the starting point of an incredible story, full of twists and turns! Help Liz and Dan solve the numerous mysteries of an amazing adventure that you won't forget any time soon!\n \n- Solve numerous puzzles and mysteries\n \n- Meet wacky characters and monsters\n \n- Explore dozens of colorful places\n \n- A production worthy of a great animated movie\n \n- Movie-like musical score and English voice-over", + "currency": "USD", + "artistId": 406173890, + "artistName": "FOCUS HOME INTERACTIVE", + "genres": [ + "Games", + "Family", + "Entertainment", + "Adventure" + ], + "price": 9.99, + "bundleId": "com.focus-home.TNBT", + "version": "1.1", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple69/v4/24/cb/ac/24cbac33-03a6-c33c-3c7e-f1d3acff2d74/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple69/v4/e8/08/8f/e8088f7d-c688-7663-b738-efd7b64ce6ad/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple69/v4/f2/c3/32/f2c3323c-db7a-5015-5a36-8cb4ee8d6d5d/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple49/v4/be/98/fd/be98fd4a-75e9-22e9-819b-c006d09badef/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple62/v4/a1/d0/12/a1d012c4-8ece-c61a-e6e7-4a27a3d740fa/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple62/v4/a1/d0/12/a1d012c4-8ece-c61a-e6e7-4a27a3d740fa/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple62/v4/a1/d0/12/a1d012c4-8ece-c61a-e6e7-4a27a3d740fa/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/explain-3d/id1019479194?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.6.6", + "trackName": "Explain 3D How things work", + "trackId": 1020146983, + "sellerName": "ePic design s.r.o.", + "releaseNotes": "- added settings so you can adjust move, rotation and zoom speed\n- small performance fixes", + "primaryGenreId": 6017, + "primaryGenreName": "Education", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2015-07-30T05:32:31Z", + "genreIds": [ + "6017", + "6014", + "7015" + ], + "formattedPrice": "$3.99", + "currentVersionReleaseDate": "2016-09-03T02:14:31Z", + "trackCensoredName": "Explain 3D How things work", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "90413684", + "sellerUrl": "http://explain3d.com", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/explain-3d-how-things-work/id1020146983?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Explain3D success:\n***TOP 25 GEW - Global start up competition finalist 2013 (http://www.cnbc.com/id/101168347/page/6)***\n\nSimulations:\n- Car workshop - 4 stroke engine, Car clutch, Manual transmission, Disc brakes, Ignition system\n- Discover the Universe - ISS space station, Space shuttle, Solar system\n- Electricity around us - Hydroelectric dam, Wind turbine, Nuclear power plant\n- Transport simulations - Railroad switch, Submarine, Jet engine\n- Our homes - Lock and key, Elevator, Toilet, Desk Lamp\n- Tools - Jackhammer, Hand pump\n\nExplain3D is system of interactive simulations, that can help you to explain, how things work. Simulations are built in interactive 3D environment, which brings fun to education and helps understand the stuff. \n\nFeatures:\n- Interactive 3D environment\n- simple and intuitive interface\n- description of main parts of simulations / objects\n- nice 3D models and animations\n- great to make education more engaging and interesting", + "currency": "USD", + "artistId": 1019479194, + "artistName": "Explain 3D", + "genres": [ + "Education", + "Games", + "Simulation" + ], + "price": 3.99, + "bundleId": "com.Explain3D.HowThingsWork", + "version": "2.4", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple18/v4/a8/55/f1/a855f17c-73a0-3266-561f-c1c2c7fd0dc7/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple30/v4/34/bc/d4/34bcd4cf-4143-9f6c-04d5-de3556bb75a8/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple60/v4/c9/ed/2f/c9ed2f0a-1064-2e6f-7e84-49f9e3d0d79e/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple30/v4/4b/1c/fe/4b1cfee9-6a9b-4fe9-e9fa-41147ba4bc93/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple60/v4/ea/a4/37/eaa4378b-c323-7876-ea9b-992554c58208/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/a7/d1/61/a7d1618a-3af9-3143-d65d-7bf3778c6b28/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/a7/d1/61/a7d1618a-3af9-3143-d65d-7bf3778c6b28/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple118/v4/a7/d1/61/a7d1618a-3af9-3143-d65d-7bf3778c6b28/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/ithought-llc/id936777941?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.9", + "trackName": "Actio: The App for Action.", + "trackId": 994990008, + "sellerName": "iThought LLC", + "releaseNotes": "Bug fixes: Drag 'N Drop Bug & Minor refresh bug.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2015-06-24T18:33:48Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2017-12-05T23:51:13Z", + "trackCensoredName": "Actio: The App for Action.", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "29735536", + "sellerUrl": "http://www.iThought.biz", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/actio-the-app-for-action/id994990008?mt=12&uo=4", + "trackContentRating": "4+", + "description": "Actio: The App for Action\n\nActio is an action tracking app - great for project managers and home users alike. \n\nIt is built to be fast and flexible, intuitive to use and powerful enough for even the largest projects.\n\nYou can try the full version of Actio via in in-App free one month trial and then purchase either a full license (US$19.99*) or a monthly (US$0.99*) or yearly (US$9.99*) auto-renew subscription**. We hope you love using it.\n\nACTIO HELPS YOU:\n\nManage, organize and prioritise your actions\n• Create user-defined Flags.\n• Organize with user-definable Indexing.\n• Filter by Flag, Priority, Owner or item color to quickly focus on the important actions.\n• Sort by Index or Due Date. Hide unimportant actions.\n• Easily Promote and Demote actions into Projects and sub-Projects.\n• Define action owners in Actio, or copy from your Apple Contacts.\n\nGet stuff done quickly and efficiently\n• Fast mouse-free input of large scale projects with multiple levels of sub-projects.\n• Item and Note windows with full typographical control.\n• Unlimited Undo and Redo.\n\nTrack actions with robust detail\n• DueDate automatically colors actions, rolling them up to parent projects to easily see those with priority\n• Per-action customizable RAG (Red/Amber/Green) early warning periods.\n• Use multiple tracker views to show Lists, Details and Pageviews.\n• Rapid drill-down/up into sub-projects.\n• Drag & Drop and Drag & Duplicate actions to quickly reorganize.\n• Drag in Emails and WebPages to keep all your project information in one place.\n• Unlimited notes attached to every action.\n• Search across all title, detail and notes fields.\n• Receive Apple notifications when the state of each action item changes.\n\nGet your small business off the ground...\n• PageView window gives WYSIWYG display and control over included content. Printer ready.\n• Full-screen mode. Meeting ready.\n• File based to allow easy sharing of your project with others (e.g. via email).\n• Print Preview functions of all three views.\n\nOr reign in your priorities at home\n• DueDates, Repeating Dates and Anniversaries.\n• Check off important personal events, holidays and more\n\nUnlock Actio Unlimited via In-App-Purchase for:\n• All Free features\n• Unlimited actions and sub-actions (free version has 25 items).\n• Printing of all three views.\n• Multiple Open Projects (free version has one open project).\n• Project Tabs.\n• Drag and Drop between open Projects.\n• Drag and Duplicate between open Projects.\n• Search all open Projects.\n• Share and sync projects on file sharing servers (e.g. iCloud, Dropbox, GoogleDrive etc).\n• Save detail text to multiple formats (pdf, txt, html, doc etc)\n\nUse Actio for your day-to-day management to ensure that nothing falls through the cracks.\n\n-----------------\n* Denotes pricing on the US App Store. \n-----------------\n**Actio Unlimited Monthly and Yearly are auto-renewing subscriptions and automatically renew unless auto-renew is turned off at least 24-hours before the end of the current period. Subscriptions may be managed by the user in iTunes Account Settings.\n-----------------\nTerms of Use: www.iThought.biz/terms", + "currency": "USD", + "artistId": 936777941, + "artistName": "iThought LLC", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.00, + "bundleId": "biz.iThought.ActioMAS", + "version": "1.4.5", + "wrapperType": "software", + "userRatingCount": 0 + }, + { + "appletvScreenshotUrls": [], + "supportedDevices": [ + "iPadMini4-iPadMini4", + "iPadProSecondGen-iPadProSecondGen", + "iPhone11-iPhone11", + "iPad71-iPad71", + "iPadMiniRetinaCellular-iPadMiniRetinaCellular", + "iPhone8Plus-iPhone8Plus", + "iPhone6sPlus-iPhone6sPlus", + "iPadMini5-iPadMini5", + "iPadProFourthGen-iPadProFourthGen", + "iPhoneXS-iPhoneXS", + "iPadAir3Cellular-iPadAir3Cellular", + "iPadAir3-iPadAir3", + "iPadMini4Cellular-iPadMini4Cellular", + "iPadProCellular-iPadProCellular", + "MacDesktop-MacDesktop", + "iPadMini3-iPadMini3", + "iPhoneXR-iPhoneXR", + "iPhoneSE-iPhoneSE", + "iPad611-iPad611", + "iPhone7-iPhone7", + "iPad73-iPad73", + "iPad812-iPad812", + "iPadAir2Cellular-iPadAir2Cellular", + "iPhoneX-iPhoneX", + "iPadMini5Cellular-iPadMini5Cellular", + "iPadPro97-iPadPro97", + "iPad834-iPad834", + "iPadProSecondGenCellular-iPadProSecondGenCellular", + "iPhone5s-iPhone5s", + "iPad75-iPad75", + "iPadMini3Cellular-iPadMini3Cellular", + "iPad878-iPad878", + "iPhone6-iPhone6", + "iPadAir-iPadAir", + "iPadPro97Cellular-iPadPro97Cellular", + "iPadSeventhGen-iPadSeventhGen", + "iPodTouchSixthGen-iPodTouchSixthGen", + "iPhoneXSMax-iPhoneXSMax", + "iPad612-iPad612", + "iPadPro-iPadPro", + "iPodTouchSeventhGen-iPodTouchSeventhGen", + "iPhone11ProMax-iPhone11ProMax", + "iPadMiniRetina-iPadMiniRetina", + "iPad76-iPad76", + "iPadProFourthGenCellular-iPadProFourthGenCellular", + "iPadSeventhGenCellular-iPadSeventhGenCellular", + "iPhoneSESecondGen-iPhoneSESecondGen", + "iPad74-iPad74", + "iPhone6s-iPhone6s", + "iPhone7Plus-iPhone7Plus", + "iPadAir2-iPadAir2", + "iPad72-iPad72", + "iPhone6Plus-iPhone6Plus", + "iPadAirCellular-iPadAirCellular", + "iPhone8-iPhone8", + "iPad856-iPad856", + "iPhone11Pro-iPhone11Pro" + ], + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/0c/8f/c8/0c8fc884-c87a-7004-f44a-e3b333222e38/40f0748e-65b8-412e-b055-c74f457a8be7_i8-1.png/392x696bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/6d/12/99/6d12990d-2c4a-a09f-17a2-ab53b05004ba/91a4eb3f-6d59-480b-8926-a10b54dc200c_i8-2.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/cf/d0/76/cfd07658-e436-69be-dad1-f40a1d858855/97bc8ecd-7411-4eae-8a79-ccb18eecd5bf_i8-3.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/91/02/8a/91028ab6-979a-04ec-0e06-3cfc9957e754/33ef7be7-bd63-4d0e-a8e3-05bfed454285_i8-4.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/b9/a1/94/b9a194da-8062-7139-429a-c41336f46052/0a8e5d96-36ef-4e68-8460-060fb6532871_i8-5.png/392x696bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/83/91/27/8391279d-43e4-399b-373a-5ea2740da32b/0bd98917-79f5-436a-9e59-3aae11a966c4_i8-6.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/0b/8f/6e/0b8f6e54-2469-388c-6113-05e6c5a3692a/92d898e0-06ba-45b3-8ccd-3da8b20df8de_i8-7.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/5f/db/33/5fdb336c-82ed-fa17-a821-90027a51db67/8a478a41-3be5-4d73-a2aa-1e365a146e5f_i8-8.png/392x696bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/dd/9f/e4/dd9fe411-85c4-298b-60da-4b373ee5740c/05a10972-3a84-447c-9ea5-bf44268efefa_i8-9.png/392x696bb.png", + "https://is2-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/25/2f/0c/252f0c7d-4c9f-d411-bf16-d415ecec293f/d1425972-f4d6-46d1-a868-f09a9f6572ef_i8-10.png/392x696bb.png" + ], + "ipadScreenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/bd/50/cf/bd50cf55-97ad-adec-55ec-e43ed2f26b44/594b53a3-48bd-4745-a1a3-d6457e03a426_ipad-v-1.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/69/01/0b/69010bd8-f9ce-05a4-80ac-beba32694866/861e0887-e2d3-40fe-bfba-041ab513fd50_ipad-v-2.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/91/16/ea/9116eaaa-3ded-38b1-a4d8-e1d89313b031/c156ce19-989c-4f5b-93bc-a9307fa0a9be_ipad-v-3.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/4a/cf/42/4acf4251-f8da-bdea-724c-5384be8ddb87/fb9c1e3d-856a-4fa4-9314-ea7ae0f790b4_ipad-v-4.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/ca/39/35/ca393565-6225-5729-18d2-3ea2d23abc52/4d9c971d-6096-459e-9ee2-f0af77ff6bfb_ipad-v-5.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/bc/c0/82/bcc0822b-ce04-33ff-d9bd-2380477b52a0/7795ceea-43bf-41c6-828e-5bd91d6bf4e7_ipad-v-6.png/552x414bb.png", + "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/d4/62/8e/d4628ebd-2504-6506-1e60-637beda2fcbb/ae1d6142-b2a1-45e3-8a3d-30984c075daf_ipad-v-7.png/552x414bb.png", + "https://is5-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/fa/d3/43/fad3436d-30c4-daff-dc10-5c7d4d5da752/f90faa3c-4351-43bc-be53-6da74403e829_ipad-v-8.png/552x414bb.png", + "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource114/v4/63/e4/d0/63e4d099-5ba4-ac02-6ac6-c56969003f66/c46efc17-1b62-43a9-8974-0bede1a4766f_ipad-v-9.png/552x414bb.png" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d1/2d/6f/d12d6fc4-f740-0c2e-99bc-f69f897e1302/source/60x60bb.jpg", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d1/2d/6f/d12d6fc4-f740-0c2e-99bc-f69f897e1302/source/512x512bb.jpg", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/d1/2d/6f/d12d6fc4-f740-0c2e-99bc-f69f897e1302/source/100x100bb.jpg", + "artistViewUrl": "https://apps.apple.com/us/developer/easylife-srls/id1459685996?uo=4", + "isGameCenterEnabled": false, + "advisories": [], + "features": [ + "iosUniversal" + ], + "kind": "software", + "minimumOsVersion": "11.0", + "trackName": "easyPlanner 3 - Task manager", + "trackId": 1459685997, + "sellerName": "easyLife Srl Semplificata", + "releaseNotes": "Added \"Urgent\" quick button in task's page.\n\n• Fixed minor bugs.", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2019-04-30T21:02:33Z", + "genreIds": [ + "6007", + "6000" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-08-25T19:35:33Z", + "trackCensoredName": "easyPlanner 3 - Task manager", + "languageCodesISO2A": [ + "EN", + "FR", + "IT", + "RU", + "ZH" + ], + "fileSizeBytes": "90359808", + "sellerUrl": "https://www.easylife.biz", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 4.888889999999999957935870043002068996429443359375, + "userRatingCountForCurrentVersion": 9, + "averageUserRating": 4.888889999999999957935870043002068996429443359375, + "trackViewUrl": "https://apps.apple.com/us/app/easyplanner-3-task-manager/id1459685997?uo=4", + "trackContentRating": "4+", + "description": "easyPlanner is the innovative app that will manage for you the things to do using the tasks and projects and the things you need to remember using memos. You can manage your appointments and tasks on multiple levels (multi-levels) as your mind would! You can also monitor your progress with the Reports and see how productive you are. If you are not happy with what you are producing you can try to increase your productivity by using our FocusTimer, a tool that will allow you to maintain concentration and carry out more tasks simultaneously.\neasyPlanner aims to make your life easier and “to work” in place of your memory. Getting organized means having more free time for you and for those you love, dedicating the time you have saved to create unforgettable moments with the people of your life.\n\nMANAGE THE THINGS YOU HAVE TO DO AND THE THINGS YOU HAVE TO REMEMBER\u2028\n\nWe provide you tasks, projects and memos management in a single app.\n\nTASKS\n\neasyPlanner allows you to manage the “things you need to do” through our “Tasks”. Each task can contain infinite sub-tasks (multi-tasks) and can be grouped into folders. \n\nPROJECTS\n\nWhen a certain number of tasks are closely related to each other and they concern significant commitments, it is possible to manage them as a single project. Even the project, like the task, can contain infinite sub-tasks (multi-tasks).\n\nMEMOS\n\neasyPlanner allows you to manage the “things you need to remember” both in free format and in a structured format using memos.\n\nMONITOR YOUR REPETITIVE TASKS WITH REPORT\u2028\n\nThe \"Report\" function was born of the need to represent a set of complex data or complex tasks in the form of a table so that they can be printed and read more easily. Thanks to this function you will be able to graphically visualize a set of recurring tasks in a simple way and you will be able to monitor the progress of these tasks daily.\n\n\nINCREASE YOUR PRODUCTIVITY WITH FOCUS TIMER\n\nFocus Timer has been designed after a careful study based on several time management theories. It is a very advanced “time management” system which consists in dividing time into intervals, each of which is characterized by a task that you have to do. This division leads the subjects who use it to be much more efficient, to better manage their time and to constantly develop their mental abilities.\n\nAGENDA\n\u2028Thanks to the Agenda view easyPlanner will allow you to keep track of your schedule and your appointments at any time.\nAgenda will also integrate the Apple calendar. \nYou can add your events in the calendars directly from here in a practical and fast way.\nYou can decide which calendars to see and which to hide.\n\nICLOUD SYNC\n\nWith easyPlanner you can archive your photos, your documents, your tasks, etc. on ICloud and you can synchronize all your devices automatically and simultaneously. Regardless of the device you are using (IPhone or IPad), you will always have the latest version of your documents available.\n\nDELEGATE\n\nDelegate urgent tasks to other people by sharing them by email.\n\nAND SO MUCH MORE…\n\nYou will find out many more features trying our app or going to our website www.easyLife.biz/easyPlanner.\u2028\nCHOOSE THE VERSION THAT BEST SUITS YOU AND YOUR NEEDS\n\nTry easyPlanner – Task manager for free.\u2028You can use this version without time limits and in all its functions in order to appreciate all its features. However this version only allows 40 entries.\u2028If you start to get tight, upgrade to the easyPlanner – PRO version, available via in-app purchase or as a stand-alone version.\u2028easyPlanner – PRO Version allows you to get an unlimited number of entries, giving you the opportunity to always have everything you need with you and to take advantage of Reports over time. \nOne-time purchase. Without subscription. \n\nIf you have any question, any suggestions or if you want to tell us what you thing of easyPlanner you can contact us:\u2028\n\nwww.easylife.biz\nsupport@easylife.biz\n\nTerms of service: https://www.easylife.biz/terms/", + "currency": "USD", + "artistId": 1459685996, + "artistName": "easyLife Srls", + "genres": [ + "Productivity", + "Business" + ], + "price": 0.00, + "bundleId": "com.easyPlanner", + "version": "3.0.6", + "wrapperType": "software", + "userRatingCount": 9 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/e7/cb/a4/e7cba421-087e-0923-8e7f-3fb2fcff872c/pr_source.jpg/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/2f/2a/e9/2f2ae9f8-6954-dc16-81b8-cf44deb66ac0/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/e3/aa/5c/e3aa5ca0-2625-d0a3-6e30-8d22d058c810/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/6b/5f/14/6b5f14e7-95a7-3c3d-7532-817d844d5f7a/pr_source.jpg/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/c7/01/13/c701130f-ca88-ee48-6f49-dbbad63bcdd3/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/64/3a/4b/643a4b2d-3661-8203-7325-fc47d208f0d7/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/b7/7d/9c/b77d9c68-3707-078b-596e-53d82cc82528/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/ad/f0/f8/adf0f884-e81f-567b-53ec-59d860132354/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/35/b8/48/35b84878-fe4d-61d1-99bb-d87ae71de6c7/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/35/b8/48/35b84878-fe4d-61d1-99bb-d87ae71de6c7/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/35/b8/48/35b84878-fe4d-61d1-99bb-d87ae71de6c7/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/%E6%9D%A8-%E7%94%B0/id1228008538?mt=12&uo=4", + "kind": "mac-software", + "minimumOsVersion": "10.10", + "trackName": "CleanTodo • Simplest Task List", + "trackId": 1228466824, + "sellerName": "杨 田", + "releaseNotes": "Thank you for downloading Clean Todo! Here's what's new: \n- Bug fixes and improvements. \n\nPlease contact us if you have any suggestions. support@cleantodo.com", + "primaryGenreId": 6007, + "primaryGenreName": "Productivity", + "isVppDeviceBasedLicensingEnabled": true, + "releaseDate": "2017-06-22T00:46:33Z", + "genreIds": [ + "6007", + "6002" + ], + "formattedPrice": "Free", + "currentVersionReleaseDate": "2020-04-25T21:38:32Z", + "trackCensoredName": "CleanTodo • Simplest Task List", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "3571392", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/cleantodo-simplest-task-list/id1228466824?mt=12&uo=4", + "trackContentRating": "4+", + "description": "CleanTodo is a very simple app for managing your to-do list.\nThe app provides you two separate lists. One list records all your need to do. The other list only records your important tasks. \n\n\"The platform has a tidy, minimalist look that allows users to keep all of their tasks in one convenient place.\" - The American Genius\n\n\"On top of a simple operation, it also offers you the cleanest interface.\" - KOCPC,TW\n\n\"A simple to-do work list makes writing down important work items easy.\" - iPhone, iPad玩樂誌 Vol.49.\n\n\nThe Benefits of Clean Todo:\n\n• Because recording your tasks has become so simple, you will be happy to write things down and will never forget what you need to do.\n• You decide what you should do every day, rather than being forced to plan ahead and have your software urge you.\n• Avoid wasting time managing your to-do list and save time doing something meaningful.\n• Look at your weekly review and feel a great sense of accomplishment.\n• The simple and elegant software interface accentuates your fine taste.\n\nFeatures:\n\n- The cloud sync feature ensures your data remains exactly the same across devices.\n- No matter how many tasks you have, they are simply divided into to be done now and to be done later. This allows you to check your to-do list and place the important things into your \"Today\" list. Do the most important thing every day.\n- Use tags to distinguish between different categories of tasks. These tags are very easy to create and use.\n- Flip Card View: You can flip through and complete tasks one by one. This helps you focus on the present task.\n- You can create reminders that will be added directly to Calendar, which gives you accurate alerts even without Internet connection.\n- Weekly Review: helps you to check the tasks you’ve completed over the week and export a report easily.\n- Drag&Drop to reorder tasks.\n- Quickly add task, the default shortcut is Ctrl+Cmd+Z.\n\nUpgrade to premium membership to gain access to all the features. Once subscribed, all these features will be available to you for use on all platforms without additional costs.\n\nPremium Subscription: $12.99/Year\n\n• Subscription is auto-renewable which means that once purchased it will be auto-renewed every year until you cancel it 24 hours prior to the end of the current period. \n• Your subscription will be charged to your iTunes account at confirmation of purchase and will automatically renew unless auto-renew is turned off at least 24 hours before the end of the current period.\n• Current subscription may not be canceled during the active subscription period; however, you can manage your subscription and/or turn off auto-renewal by visiting your iTunes Account Settings after purchase.\n\nPrivacy Policy: https://www.cleantodo.com/privacy\nTerms & Conditions: https://www.cleantodo.com/terms", + "currency": "USD", + "artistId": 1228008538, + "artistName": "杨 田", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 0.00, + "bundleId": "com.cleantodo.osx", + "version": "1.10", + "wrapperType": "software", + "userRatingCount": 0 + } ] -} \ No newline at end of file + } diff --git a/MasKitTests/JSON/search/tweetbot.json b/MasKitTests/JSON/search/tweetbot.json new file mode 100644 index 000000000..306126c2e --- /dev/null +++ b/MasKitTests/JSON/search/tweetbot.json @@ -0,0 +1,377 @@ +{ + "resultCount": 7, + "results": [ + { + "screenshotUrls": [ + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/78/f7/97/78f79762-c13c-258a-e4cb-b4ea55f9320d/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/9d/19/3c/9d193c11-f2ce-df67-f394-46bc070973b0/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/1a/d4/63/1ad463ba-36c0-8f01-ae90-16da1c505ca0/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/c0/98/ad/c098ad9a-cab5-9700-1db0-4b5c426f13fb/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/cf/bc/4d/cfbc4d77-9e82-90e3-6558-df6885dcbc8a/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/16/17/10/16171097-d9d1-d4f1-61bb-efc2383bb1bb/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/16/17/10/16171097-d9d1-d4f1-61bb-efc2383bb1bb/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple124/v4/16/17/10/16171097-d9d1-d4f1-61bb-efc2383bb1bb/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/tapbots/id293642940?mt=12&uo=4", + "kind": "mac-software", + "releaseDate": "2018-05-15T16:41:29Z", + "trackId": 1384080005, + "trackName": "Tweetbot 3 for Twitter", + "primaryGenreId": 6005, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/tweetbot-3-for-twitter/id1384080005?mt=12&uo=4", + "trackContentRating": "17+", + "formattedPrice": "$9.99", + "releaseNotes": "Fixed a layout issue with Quote Tweets\n\n-------- 3.4 --------\n- Improved video playback\n- Support for displaying Quote Tweets with Media\n- Various bug fixes", + "sellerName": "Tapbots", + "primaryGenreName": "Social Networking", + "currentVersionReleaseDate": "2020-08-27T20:28:13Z", + "isVppDeviceBasedLicensingEnabled": true, + "genreIds": [ + "6005", + "6009" + ], + "trackCensoredName": "Tweetbot 3 for Twitter", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "7149633", + "sellerUrl": "https://tapbots.com/tweetbot/mac/", + "contentAdvisoryRating": "17+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "currency": "USD", + "version": "3.4.1", + "wrapperType": "software", + "artistId": 293642940, + "artistName": "Tapbots", + "genres": [ + "Social Networking", + "News" + ], + "price": 9.99, + "description": "Tweetbot is an award-winning, full-featured* Twitter client for the Mac. It has a beautiful interface with light & dark themes, multiple-column support and much more.\n\n* Twitter does not grant 3rd party apps access to every single feature that is available on Twitter’s website.\n\n—————————————————\nNotable Features:\n—————————————————\n\nExpandable Sidebar.\nTweetbot’s new optional expanded sidebar provides one-click access to all of your subsections like lists, direct message conversations, and saved searches.\n\nDrag & Drop Columns.\nColumns have been redesigned from the ground up to be faster and easier to use. Just drag the column circle to the right to add columns and back to the left to hide them. Columns persist even when hidden.\n\nBetter Media.\nAutomatically play videos and GIFs in your timeline with a quick mouseover. A click on media opens it up in our lightning fast new media viewer.\n\nDark Theme.\nYour eyes will appreciate the new dark theme in low light situations. And the images and video in your timeline will love the extra attention.\n\nTimeline Filters.\nThe powerful timeline filters from Tweetbot for iOS are finally on the Mac. Quickly filter a timeline to show only tweets with media, retweets, links, or create your own keyword or rules-based filters.\n\nMute Filters.\nHide Tweets in your timelines by specific users, keywords, hashtags, or even the client that published the Tweet. Create limited time filters to avoid spoilers for upcoming blockbuster movies or sporting events.\n\nLists.\nFull support for managing your Twitter lists. Use them as custom curated timelines or even as your main timeline.\n\niCloud Sync.\nTweetbot for Mac syncs your read position and much more with Tweetbot for iOS so your experience is seamless when switching from desktop to mobile and vice versa.\n\nTweet Topics.\nTopics automatically chain together multiple Tweets to easily create tweetstorms or live blog events.\n\nFull Screen.\nOpen Tweetbot fullscreen with columns for a command center-like Twitter experience.\n\nMultiple Accounts.\nQuickly switch between multiple accounts via the quick account picker, menu bar or keyboard shortcuts. Open them in separate windows or full screen spaces.\n\nProfile Notes.\nEver forget why you followed someone or wanted to jot notes on a user for future reference? Create notes on a user's profile that only you can see.\n\nQuick Paste Links.\nPaste Tweet or profile web links directly into Tweetbot to view them instantly.\n\n—————————————————\n\nGet help or send us feedback on Twitter to @tweetbot or email us at support@tapbots.com.", + "bundleId": "com.tapbots.Tweetbot3Mac", + "minimumOsVersion": "10.12", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/f7/51/a4/f751a49f-26bd-644d-24e4-06f3f210e82d/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple118/v4/47/41/ea/4741ea0c-4aaa-49c6-a016-1520c72a6dc8/pr_source.jpg/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple128/v4/26/55/38/265538b7-2171-82c6-5c0c-4b565cfc6db2/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/b2/da/ab/b2daabf1-87b3-de3c-81e0-1c1194993579/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/b2/da/ab/b2daabf1-87b3-de3c-81e0-1c1194993579/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/b2/da/ab/b2daabf1-87b3-de3c-81e0-1c1194993579/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/friendly-app-studio/id639296709?mt=12&uo=4", + "kind": "mac-software", + "releaseDate": "2018-08-04T03:24:14Z", + "trackId": 1418401222, + "trackName": "Friendly for Twitter", + "primaryGenreId": 6009, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/friendly-for-twitter/id1418401222?mt=12&uo=4", + "trackContentRating": "17+", + "formattedPrice": "Free", + "releaseNotes": "⁃ FIX: File upload and download on MacOS Catalina\n⁃ FIX: Global short keys for account switching\n⁃ FIX: Window behavior issues when switching account\n⁃ FIX: Misc performance improvements\n\nWhat's new in 1.5\n\n⁃ NEW: Reload Page menu and keyboard shortcut (cmd-R)\n⁃ NEW: Preference setting to keep the window size when switching between accounts\n⁃ NEW: Right click on account to switch between mobile and desktop Facebook modes\n⁃ FIX: Once closed, the window can be reopened by simply clicking on the dock or menubar icons\n⁃ FIX: Keyboard shortcut for account switching\n⁃ FIX: Full screen bugs\n⁃ FIX: Mobile Facebook site bugs\n⁃ FIX: Misc performance improvements\n\nIf you love the app, please let us know by rating the app in the App Store. This is the way more people can discover Friendly. Thank you!", + "sellerName": "Friendly App Studio LLC", + "primaryGenreName": "News", + "currentVersionReleaseDate": "2020-04-15T01:43:47Z", + "isVppDeviceBasedLicensingEnabled": true, + "genreIds": [ + "6009", + "6007" + ], + "trackCensoredName": "Friendly for Twitter", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "10484953", + "sellerUrl": "http://friendly.io", + "contentAdvisoryRating": "17+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "currency": "USD", + "version": "1.6", + "wrapperType": "software", + "artistId": 639296709, + "artistName": "Friendly App Studio", + "genres": [ + "News", + "Productivity" + ], + "price": 0.00, + "description": "Friendly is a lite and free Twitter app. \n\nYou can easily manage, one or multiple twitter accounts. You can also add all your other social media accounts: Facebook, Messenger, Instagram, Whatsapp, Pinterest, Reddit, Tumblr, etc.\n\nFriendly is built as a lightweight browser app. For Twitter, we provide a light chrome around Twitter Mobile website. It is fast, lite and secure. \n\n\n•  Fast and lite Twitter app\n•  Easily manage multiple twitter accounts\n•  Choose between Twitter Mobile or Tweetdeck experience\n•  Add your other social accounts: Facebook, Instagram, LinkedIn, \n\n\n***************\nFriendly is an alternative app and is no way sponsored, endorsed or administered by, or associated with, Twitter.\n***************", + "bundleId": "io.friendly.friendlyfortwitter", + "minimumOsVersion": "10.13", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is1-ssl.mzstatic.com/image/thumb/Purple71/v4/21/67/fd/2167fd9e-d2ad-e958-15f0-8b7c5ae24412/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple71/v4/b9/b6/25/b9b625ef-7c07-7e86-8523-87053f102981/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple22/v4/8e/3c/a1/8e3ca120-7cd7-eec2-78de-a9c57f527c80/pr_source.png/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple71/v4/f9/ff/2b/f9ff2b11-6b9a-c996-4702-5330d3dcc1c5/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple71/v4/70/3f/09/703f09fa-0d4e-29d2-7785-c1e0d6a9b08e/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/4a/85/35/4a853561-df07-1aad-0bd2-1acebf7276e4/source/60x60bb.png", + "artworkUrl512": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/4a/85/35/4a853561-df07-1aad-0bd2-1acebf7276e4/source/512x512bb.png", + "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Purple124/v4/4a/85/35/4a853561-df07-1aad-0bd2-1acebf7276e4/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/tapbots/id293642940?mt=12&uo=4", + "kind": "mac-software", + "releaseDate": "2016-12-14T18:00:35Z", + "trackId": 1179623856, + "trackName": "Pastebot", + "primaryGenreId": 6007, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/pastebot/id1179623856?mt=12&uo=4", + "trackContentRating": "4+", + "formattedPrice": "$12.99", + "releaseNotes": "- Various bug fixes", + "sellerName": "Tapbots", + "primaryGenreName": "Productivity", + "currentVersionReleaseDate": "2020-08-31T22:03:37Z", + "isVppDeviceBasedLicensingEnabled": true, + "genreIds": [ + "6007", + "6002" + ], + "trackCensoredName": "Pastebot", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "9464106", + "sellerUrl": "https://tapbots.com/pastebot", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "currency": "USD", + "version": "2.3.1", + "wrapperType": "software", + "artistId": 293642940, + "artistName": "Tapbots", + "genres": [ + "Productivity", + "Utilities" + ], + "price": 12.99, + "description": "If copy & paste is a part of your workflow, Pastebot is an indispensible tool to improve your productivity. Quickly recall clippings that you have copied before and apply powerful text filters to format before pasting. You can even queue up multiple copies to paste in sequence. Pastebot is always running and only a keyboard shortcut away to command copy & paste.\n\nClipboard History:\n\nPastebot saves everything you copy so that you can quickly recall them in the future. Save and organize frequently-used clippings into custom pasteboards and create keyboard shortcuts to access pasteboards and paste specific clippings.\n\nPowerful Filters:\n\nBuild powerful filters with a live preview and apply them as you paste. Create keyboard shortcuts to quickly paste using your filters and export your filters to share with other Pastebot users.\n\nQuick Paste Menu:\n\nPastebot is there when you need it and invisible when you don’t. Quickly access your clippings from any app and search, preview, or filter clippings before pasting. You can even set the order of clippings to paste in sequence.\n\niCloud Sync:\n\nWith iCloud enabled, your main clipboard, custom pasteboards and filters sync across all of your computers running Pastebot. Your clipboard and filters will be on every mac you work on.\n\nCustom Pasteboards:\n\nCreate custom pasteboard groups to organize important clippings you want to save and re-use. Assign keyboard shortcuts to clippings you use most often.\n\nWorks with Universal Clipboard:\n\nmacOS Sierra’s Universal Clipboard works alongside Pastebot. Copy a clipping in Pastebot and paste it on your iOS device via Universal Clipboard.\n\nFull Screen Support:\n\nPastebot works in full-screen and split-screen mode. Running in split-screen mode allows you to use Pastebot as a scratch pad.\n\nOptions:\n\nChoose from various quick paste window styles to suit your preferences, always paste in plain text, enable release-to-paste and more.\n\nBlacklist:\n\nThere are apps you copy from that you never want stored in Pastebot. Just add that application to the blacklist and Pastebot will ignore it.\n\nSearch:\n\nFind a clipping quickly with Pastebot’s powerful search capabilities. Search based on content or metadata. You can search by application, date, data type and more.\n\nKeyboard Shortcuts:\n\nPastebot features many keyboard shortcuts to satisfy any copy & paste maestro. Paste the previous item on the clipboard or paste the current clipping while applying the last used filter.", + "bundleId": "com.tapbots.Pastebot2Mac", + "minimumOsVersion": "10.12", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is4-ssl.mzstatic.com/image/thumb/Purple5/v4/9d/e2/7c/9de27ce7-897f-0083-f32a-8fad6eb99ea3/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple3/v4/2d/32/45/2d3245ec-062d-e02b-fadd-d1e1027dc964/pr_source.png/800x500bb.jpg", + "https://is1-ssl.mzstatic.com/image/thumb/Purple3/v4/d3/5e/44/d35e443c-1ddb-54f8-b616-2b472cf18fd7/pr_source.png/800x500bb.jpg", + "https://is5-ssl.mzstatic.com/image/thumb/Purple1/v4/a1/ca/cf/a1cacfbc-fffd-08bc-1551-2bc2b51f594b/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/34/f1/46/34f146eb-a26e-a7f6-3e16-d2a901db72a9/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/34/f1/46/34f146eb-a26e-a7f6-3e16-d2a901db72a9/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple118/v4/34/f1/46/34f146eb-a26e-a7f6-3e16-d2a901db72a9/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/tapbots/id293642940?mt=12&uo=4", + "kind": "mac-software", + "releaseDate": "2014-11-06T16:13:01Z", + "trackId": 931657367, + "trackName": "Calcbot - The Smart Calculator", + "primaryGenreId": 6002, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/calcbot-the-smart-calculator/id931657367?mt=12&uo=4", + "trackContentRating": "4+", + "formattedPrice": "$4.99", + "releaseNotes": "- Fixed a couple of High Sierra display issues", + "sellerName": "Tapbots", + "primaryGenreName": "Utilities", + "currentVersionReleaseDate": "2018-02-23T02:34:37Z", + "isVppDeviceBasedLicensingEnabled": true, + "genreIds": [ + "6002", + "6007" + ], + "trackCensoredName": "Calcbot - The Smart Calculator", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "3353188", + "sellerUrl": "http://tapbots.com/software/calcbot/mac/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "currency": "USD", + "version": "1.0.7", + "wrapperType": "software", + "artistId": 293642940, + "artistName": "Tapbots", + "genres": [ + "Utilities", + "Productivity" + ], + "price": 4.99, + "description": "Calcbot is an intelligent calculator and unit converter for the rest of us. Featuring an easy-to-read history tape, expression view, intuitive conversion, and much more!\n\nHistory Tape.\nEvery calculation you enter gets saved to the history tape and optionally sent to your clipboard for quick pasting. Refer to calculations later or send them right back to the calculator.\n\nExpression View.\nCalcbot’s original expression view allows you to see everything you have typed so you’ll never forget what you entered or miss a typo.\n\nConversion.\nConvert any of your calculations with over 500 units across 22 different categories including auto-updating currency rates.\n\nFavorites.\nFave a calculation and get instant access to its result via the Favorites Key. No more cryptic memory keys.\n\nScientific Functions.\nCalcbot supports common scientific functions in case you ever need them.\n\nConstants.\nGet instant access to scientific constants like Pi, Atomic Mass or add your own.\n\nRound for Currency.\nHave all of your results rounded to two decimal places.\n\niCloud Sync.\nSync your history tape, constants, and faves across multiple Macs and all of your iOS devices.\n\nSounds & Animations.\nSound effects & animations to provide positive feedback when performing calculations.", + "bundleId": "com.tapbots.CalcbotMac", + "minimumOsVersion": "10.10", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/b2/05/ec/b205ec34-3626-6fc3-8020-23d8236f6e10/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/d0/e1/d2/d0e1d205-026d-60be-69a5-6bc6b2c32cb0/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/f3/31/96/f3319633-6e74-aeea-724f-ae3c2d61bfe1/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/a5/6c/3b/a56c3b2c-4e1d-51f5-d8a2-5b29f7a3d2d0/source/60x60bb.png", + "artworkUrl512": "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/a5/6c/3b/a56c3b2c-4e1d-51f5-d8a2-5b29f7a3d2d0/source/512x512bb.png", + "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Purple49/v4/a5/6c/3b/a56c3b2c-4e1d-51f5-d8a2-5b29f7a3d2d0/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/swanson-digital-llc/id416190121?mt=12&uo=4", + "kind": "mac-software", + "releaseDate": "2016-03-15T23:01:13Z", + "trackId": 1092715997, + "trackName": "Learn - Twitter Edition", + "primaryGenreId": 6005, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/learn-twitter-edition/id1092715997?mt=12&uo=4", + "trackContentRating": "4+", + "formattedPrice": "$2.99", + "sellerName": "Swanson Digital, LLC", + "primaryGenreName": "Social Networking", + "currentVersionReleaseDate": "2016-03-15T23:01:13Z", + "isVppDeviceBasedLicensingEnabled": true, + "genreIds": [ + "6005", + "6006" + ], + "trackCensoredName": "Learn - Twitter Edition", + "languageCodesISO2A": [ + "EN" + ], + "fileSizeBytes": "320346726", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "currency": "USD", + "version": "1.0", + "wrapperType": "software", + "artistId": 416190121, + "artistName": "Swanson Digital, LLC", + "genres": [ + "Social Networking", + "Reference" + ], + "price": 2.99, + "description": "**This tutorial is also now available within our \"TMU Tutorials\" App for both Mac and iOS (iPad/iPhone). With these Apps you can view tutorials on your Mac, iPad or iPhone! Just search \"TMU\" in the Mac or iOS App Store to download the TMU Tutorials Apps for free!**\n\nIn this HD video training course learn how to use Twitter on the Mac, iPad & iPhone! If you have never used Twitter but are curious about it or if you are already on Twitter but don't fully understand how it works this course is for you! Twitter can be a great way to get news and information or to promote yourself or a product. We start with creating a twitter profile and from there learn all the main features of Twitter. We utilize Twitter.com, the Twitter for Mac App and and the Twitter for iOS App to show you the differences on each platform and device. Learn to use hashtags, likes, tweet photos, retweet, understand various notifications and much more! \n\nCourse Contents...\n\n\t1.\tIntroduction\n\t2.\tWhat is Twitter?\n\t3.\tCreating a Twitter Profile\n\t4.\tFind others to Follow\n\t5.\tPosting a Tweet\n\t6.\tInsert a Link\n\t7.\tAdd Photos and Videos\n\t8.\tTake & Edit a Photo\n\t9.\tGIFs & Polls\n\t10.\tTag a Location or People\n\t11.\tSearch\n\t12.\tHashtags\n\t13.\tRetweets\n\t14.\tLikes\n\t15.\tReplies & Mentions\n\t16.\tDirect Messages\n\t17.\tNotifications\n\t18.\tUnfollow, Block & Mute\n\t19.\tMoments\n\t20.\tLists\n\t21.\tMultiple Accounts\n\t22.\tWrap Up", + "bundleId": "com.themacu.twitter", + "minimumOsVersion": "10.7", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is2-ssl.mzstatic.com/image/thumb/Purple18/v4/5b/71/fd/5b71fdf2-5f28-5ef5-a145-af2721618095/pr_source.png/800x500bb.jpg", + "https://is3-ssl.mzstatic.com/image/thumb/Purple60/v4/99/d6/3f/99d63f76-4866-1e1c-7d50-5025402965de/pr_source.png/800x500bb.jpg", + "https://is4-ssl.mzstatic.com/image/thumb/Purple60/v4/39/99/0d/39990dd1-a976-d40f-8d7c-57712f68f951/pr_source.png/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/79/65/38/79653882-b3d5-5d75-c6ce-5ae3f647a575/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/79/65/38/79653882-b3d5-5d75-c6ce-5ae3f647a575/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/79/65/38/79653882-b3d5-5d75-c6ce-5ae3f647a575/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/y-generation/id1104821435?mt=12&uo=4", + "kind": "mac-software", + "releaseDate": "2016-05-11T02:48:10Z", + "trackId": 1104821436, + "trackName": "RulingScreen", + "primaryGenreId": 6026, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/rulingscreen/id1104821436?mt=12&uo=4", + "trackContentRating": "4+", + "formattedPrice": "$2.99", + "releaseNotes": "Upgraded to High Sierra", + "sellerName": "Y Generation Entertainment Limited", + "primaryGenreName": "Developer Tools", + "currentVersionReleaseDate": "2017-10-30T02:26:26Z", + "isVppDeviceBasedLicensingEnabled": true, + "genreIds": [ + "6026", + "6027" + ], + "trackCensoredName": "RulingScreen", + "languageCodesISO2A": [ + "EN", + "JA", + "ZH", + "ZH" + ], + "fileSizeBytes": "3677165", + "sellerUrl": "http://ygeneration.website/", + "contentAdvisoryRating": "4+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "currency": "USD", + "version": "3.0", + "wrapperType": "software", + "artistId": 1104821435, + "artistName": "Y Generation", + "genres": [ + "Developer Tools", + "Graphics & Design" + ], + "price": 2.99, + "description": "RulingScreen makes you rule your screen. A simple, easy-to-use ruler that lets you develop and design your app easier.\n\nYou can register a shortcut to show/hide your ruler, pretty easily.\n\nYou can also enjoy various features, such as moving ruler to suit your needs, changing the color of the ruler, or show the ruler always on top of the screen.\n\nI originally decided to develop it after I found that it is too painful to measure a window size of various apps on the screen. I wished I got a good ruler to make my OS X app development life more fruitful.\n\nIf you feel sympathy for it, you might get to like the app.\n\nThank you for the support, guys!", + "bundleId": "website.ygeneration.rulingscreen", + "minimumOsVersion": "10.10", + "userRatingCount": 0 + }, + { + "screenshotUrls": [ + "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/00/47/5a/00475abf-775f-3c97-ee3a-821eafd5e822/pr_source.jpg/800x500bb.jpg", + "https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/e2/d5/44/e2d544fa-30b5-6da9-7683-24613683eaab/pr_source.jpg/800x500bb.jpg" + ], + "artworkUrl60": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/ab/77/3c/ab773c5a-fd79-34ec-a4e6-c45fd5c4660b/source/60x60bb.png", + "artworkUrl512": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/ab/77/3c/ab773c5a-fd79-34ec-a4e6-c45fd5c4660b/source/512x512bb.png", + "artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Purple124/v4/ab/77/3c/ab773c5a-fd79-34ec-a4e6-c45fd5c4660b/source/100x100bb.png", + "artistViewUrl": "https://apps.apple.com/us/developer/jian-liu/id1287914885?mt=12&uo=4", + "kind": "mac-software", + "releaseDate": "2019-11-22T08:00:00Z", + "trackId": 1486277260, + "trackName": "ttte for Twitter", + "primaryGenreId": 6005, + "averageUserRating": 0, + "trackViewUrl": "https://apps.apple.com/us/app/ttte-for-twitter/id1486277260?mt=12&uo=4", + "trackContentRating": "12+", + "formattedPrice": "$4.99", + "releaseNotes": "* New picture and video layout style Settings\n* Link preview support\n* Resume playback while preview video plays\n* Tweet reply context support\n* View medias for Lists\n* Search results now can add to Pincuts\n* Known issues fixed and stability improvement", + "sellerName": "Jian Liu", + "primaryGenreName": "Social Networking", + "currentVersionReleaseDate": "2020-08-31T14:27:50Z", + "isVppDeviceBasedLicensingEnabled": true, + "genreIds": [ + "6005", + "6012" + ], + "trackCensoredName": "ttte for Twitter", + "languageCodesISO2A": [ + "EN", + "ZH", + "ZH", + "VI" + ], + "fileSizeBytes": "9008083", + "sellerUrl": "https://svn.app", + "contentAdvisoryRating": "12+", + "averageUserRatingForCurrentVersion": 0, + "userRatingCountForCurrentVersion": 0, + "currency": "USD", + "version": "1.3.0", + "wrapperType": "software", + "artistId": 1287914885, + "artistName": "Jian Liu", + "genres": [ + "Social Networking", + "Lifestyle" + ], + "price": 4.99, + "description": "ttte allows you to browse Timeline at a refresh rate of 60Hz.\nand it also has rich features that you can\n\n* Create new tweets you love, with an amazing built-in image uploader, and more.\n* Add multiple Twitter accounts to browser, post, and comment from.\n* Control the style of your tweets, the size of your text, the spacing, and the shape of your avatar to your liking.。\n* Use fantastic dark mode, Be kind to your eyes.。\n* Add an extra layer of security to the ttte to protect your privacy by selectively adding Touch ID or Face ID unlock.。\n\n* Browsing your timeline, favor, comments, and tweets\n* View the Lists you created and added\n* View favorited tweets\n* View mentions and your Messages\n* View users, follow users\n* Search for tweets and users\n* Translate tweets directly in the list\n and more waiting you to exploring…", + "bundleId": "maccatalyst.grace.app.ttte", + "minimumOsVersion": "10.15", + "userRatingCount": 0 + } + ] + } diff --git a/MasKitTests/Models/SearchResultListSpec.swift b/MasKitTests/Models/SearchResultListSpec.swift new file mode 100644 index 000000000..315d92a9f --- /dev/null +++ b/MasKitTests/Models/SearchResultListSpec.swift @@ -0,0 +1,32 @@ +// +// SearchResultListSpec.swift +// MasKitTests +// +// Created by Ben Chatelain on 9/2/20. +// Copyright © 2020 mas-cli. All rights reserved. +// + +@testable import MasKit +import Quick +import Nimble + +class SearchResultListSpec: QuickSpec { + override func spec() { + describe("search result list") { + it("can parse bbedit") { + let data = Data(from: "search/bbedit.json") + let decoder = JSONDecoder() + let results = try decoder.decode(SearchResultList.self, from: data) + + expect(results.resultCount) == 1 + } + it("can parse things") { + let data = Data(from: "search/things.json") + let decoder = JSONDecoder() + let results = try decoder.decode(SearchResultList.self, from: data) + + expect(results.resultCount) == 50 + } + } + } +} diff --git a/MasKitTests/Models/SearchResultSpec.swift b/MasKitTests/Models/SearchResultSpec.swift new file mode 100644 index 000000000..26d5056e1 --- /dev/null +++ b/MasKitTests/Models/SearchResultSpec.swift @@ -0,0 +1,25 @@ +// +// SearchResultSpec.swift +// MasKitTests +// +// Created by Ben Chatelain on 9/2/20. +// Copyright © 2020 mas-cli. All rights reserved. +// + +@testable import MasKit +import Quick +import Nimble + +class SearchResultSpec: QuickSpec { + override func spec() { + describe("search result") { + it("can parse things") { + let data = Data(from: "search/things-that-go-bump.json") + let decoder = JSONDecoder() + let result = try decoder.decode(SearchResult.self, from: data) + + expect(result.bundleId) == "uikitformac.com.tinybop.thingamabops" + } + } + } +} diff --git a/MasKitTests/Network/NetworkSessionMockFromFile.swift b/MasKitTests/Network/NetworkSessionMockFromFile.swift index b6a9c4561..0e4f2c000 100644 --- a/MasKitTests/Network/NetworkSessionMockFromFile.swift +++ b/MasKitTests/Network/NetworkSessionMockFromFile.swift @@ -26,7 +26,7 @@ class NetworkSessionMockFromFile: NetworkSessionMock { /// - url: unused /// - completionHandler: Closure which is delivered either data or an error. @objc override func loadData(from _: URL, completionHandler: @escaping (Data?, Error?) -> Void) { - guard let fileURL = Bundle.jsonResponse(fileName: responseFile) + guard let fileURL = Bundle.url(for: responseFile) else { fatalError("Unable to load file \(responseFile)") } do { diff --git a/mas-cli.xcodeproj/project.pbxproj b/mas-cli.xcodeproj/project.pbxproj index ccae1eb73..225b8eea7 100644 --- a/mas-cli.xcodeproj/project.pbxproj +++ b/mas-cli.xcodeproj/project.pbxproj @@ -110,6 +110,8 @@ F85DA8B0240C32FA00FE5650 /* SoftwareMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = F85DA8AF240C32FA00FE5650 /* SoftwareMap.swift */; }; F85DA8B2240CBAFE00FE5650 /* CKSoftwareMap+SoftwareMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = F85DA8B1240CBAFE00FE5650 /* CKSoftwareMap+SoftwareMap.swift */; }; F88CB8E12404DAAD00B691B5 /* OpenSystemCommandSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88CB8E02404DAAD00B691B5 /* OpenSystemCommandSpec.swift */; }; + F8D095EA25009640000899E6 /* SearchResultSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8D095E925009640000899E6 /* SearchResultSpec.swift */; }; + F8D095EC250096A6000899E6 /* SearchResultListSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8D095EB250096A6000899E6 /* SearchResultListSpec.swift */; }; F8FB715B20F2B41400F56FDC /* MasKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8FB715220F2B41400F56FDC /* MasKit.framework */; }; F8FB716220F2B41400F56FDC /* MasKit.h in Headers */ = {isa = PBXBuildFile; fileRef = F8FB715420F2B41400F56FDC /* MasKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; F8FB716A20F2B4DD00F56FDC /* Downloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED0F238A1B87569C00AE40CD /* Downloader.swift */; }; @@ -202,7 +204,6 @@ 75FB3E751F9F7841005B6F20 /* Purchase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Purchase.swift; sourceTree = ""; }; 8078FAA71EC4F2FB004B5B3F /* Lucky.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Lucky.swift; sourceTree = ""; }; 900A1E801DBAC8CB0069B1A8 /* Info.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Info.swift; sourceTree = ""; }; - 90CB4069213F4DDD0044E445 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; 90CB406A213F4DDD0044E445 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Quick.framework; sourceTree = ""; }; 90CB406B213F4DDD0044E445 /* Commandant.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Commandant.framework; sourceTree = ""; }; 90CB406C213F4DDD0044E445 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Nimble.framework; sourceTree = ""; }; @@ -326,6 +327,8 @@ F85DA8AF240C32FA00FE5650 /* SoftwareMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoftwareMap.swift; sourceTree = ""; }; F85DA8B1240CBAFE00FE5650 /* CKSoftwareMap+SoftwareMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CKSoftwareMap+SoftwareMap.swift"; sourceTree = ""; }; F88CB8E02404DAAD00B691B5 /* OpenSystemCommandSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenSystemCommandSpec.swift; sourceTree = ""; }; + F8D095E925009640000899E6 /* SearchResultSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultSpec.swift; sourceTree = ""; }; + F8D095EB250096A6000899E6 /* SearchResultListSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchResultListSpec.swift; sourceTree = ""; }; F8FB715220F2B41400F56FDC /* MasKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MasKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F8FB715420F2B41400F56FDC /* MasKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MasKit.h; sourceTree = ""; }; F8FB715520F2B41400F56FDC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -399,7 +402,6 @@ 90CB406B213F4DDD0044E445 /* Commandant.framework */, 90CB406C213F4DDD0044E445 /* Nimble.framework */, 90CB406A213F4DDD0044E445 /* Quick.framework */, - 90CB4069213F4DDD0044E445 /* Result.framework */, ); name = Carthage; path = Carthage/Build/Mac; @@ -626,6 +628,8 @@ B594B12C21D584E800F3AC59 /* Models */ = { isa = PBXGroup; children = ( + F8D095EB250096A6000899E6 /* SearchResultListSpec.swift */, + F8D095E925009640000899E6 /* SearchResultSpec.swift */, B576FDF821E107CA0016B39D /* SoftwareProductMock.swift */, ); path = Models; @@ -909,7 +913,7 @@ DefaultBuildSystemTypeForWorkspace = Latest; LastSwiftMigration = 0730; LastSwiftUpdateCheck = 1000; - LastUpgradeCheck = 1130; + LastUpgradeCheck = 1200; ORGANIZATIONNAME = "mas-cli"; TargetAttributes = { ED031A771B5127C00097692E = { @@ -1083,6 +1087,8 @@ B594B13221D5876200F3AC59 /* ResultPredicates.swift in Sources */, B594B13E21D6D78900F3AC59 /* SearchCommandSpec.swift in Sources */, B55B3D9221ED9B8C0009A1A5 /* SearchResultFormatterSpec.swift in Sources */, + F8D095EC250096A6000899E6 /* SearchResultListSpec.swift in Sources */, + F8D095EA25009640000899E6 /* SearchResultSpec.swift in Sources */, B594B13C21D6D72E00F3AC59 /* SignInCommandSpec.swift in Sources */, B594B13A21D6D70400F3AC59 /* SignOutCommandSpec.swift in Sources */, B576FDF921E107CA0016B39D /* SoftwareProductMock.swift in Sources */, @@ -1139,6 +1145,7 @@ 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; @@ -1172,7 +1179,7 @@ "$(SRCROOT)/App/PrivateHeaders", ); MACOSX_DEPLOYMENT_TARGET = 10.11; - MARKETING_VERSION = 1.7.0; + MARKETING_VERSION = 1.7.1; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.mphys.mas-cli"; @@ -1206,6 +1213,7 @@ 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; @@ -1233,7 +1241,7 @@ "$(SRCROOT)/App/PrivateHeaders", ); MACOSX_DEPLOYMENT_TARGET = 10.11; - MARKETING_VERSION = 1.7.0; + MARKETING_VERSION = 1.7.1; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.mphys.mas-cli"; SDKROOT = macosx; @@ -1257,7 +1265,7 @@ INFOPLIST_FILE = "mas/mas-Info.plist"; INSTALL_PATH = /bin; LD_RUNPATH_SEARCH_PATHS = "@executable_path/. @executable_path/MasKit.framework/Versions/Current/Frameworks /usr/local/Frameworks /usr/local/Frameworks/MasKit.framework/Versions/Current/Frameworks $(inherited)"; - MARKETING_VERSION = 1.7.0; + MARKETING_VERSION = 1.7.1; PRODUCT_BUNDLE_IDENTIFIER = "com.mphys.mas-cli"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_FORCE_DYNAMIC_LINK_STDLIB = YES; @@ -1282,7 +1290,7 @@ INFOPLIST_FILE = "mas/mas-Info.plist"; INSTALL_PATH = /bin; LD_RUNPATH_SEARCH_PATHS = "@executable_path/. @executable_path/MasKit.framework/Versions/Current/Frameworks /usr/local/Frameworks /usr/local/Frameworks/MasKit.framework/Versions/Current/Frameworks $(inherited)"; - MARKETING_VERSION = 1.7.0; + MARKETING_VERSION = 1.7.1; PRODUCT_BUNDLE_IDENTIFIER = "com.mphys.mas-cli"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_FORCE_DYNAMIC_LINK_STDLIB = YES; @@ -1319,7 +1327,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = MasKit/SupportingFiles/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 1.7.0; + MARKETING_VERSION = 1.7.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = at.phatbl.MasKit; @@ -1358,7 +1366,7 @@ INFOPLIST_FILE = MasKit/SupportingFiles/Info.plist; INSTALL_PATH = /Frameworks; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 1.7.0; + MARKETING_VERSION = 1.7.1; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = at.phatbl.MasKit; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; diff --git a/mas-cli.xcodeproj/xcshareddata/xcschemes/MasKit.xcscheme b/mas-cli.xcodeproj/xcshareddata/xcschemes/MasKit.xcscheme index 552fc763f..554cfbc2c 100644 --- a/mas-cli.xcodeproj/xcshareddata/xcschemes/MasKit.xcscheme +++ b/mas-cli.xcodeproj/xcshareddata/xcschemes/MasKit.xcscheme @@ -1,6 +1,6 @@ - - - - - - - - - - - - diff --git a/script/bottle b/script/bottle index d60bbe70e..969fb825f 100755 --- a/script/bottle +++ b/script/bottle @@ -26,7 +26,7 @@ fi # Uninstall if still found on path if command -v mas > /dev/null; then - script/uninstall + script/uninstall || true # ignore failure fi # Purge the Carthage cache to avoid this error from Homebrew sandboxing: @@ -34,6 +34,11 @@ fi # fatal: Unable to create '/Users/ben/Library/Caches/org.carthage.CarthageKit/dependencies/Commandant/./index.lock': Operation not permitted rm -rf ~/Library/Caches/org.carthage.CarthageKit +# Uninstall carthage via Mint +if command -v mint > /dev/null; then + mint uninstall carthage +fi + # Build the formula brew install --build-bottle mas diff --git a/script/brew_formula_update b/script/brew_formula_update index b0479cb27..ebbd18e04 100755 --- a/script/brew_formula_update +++ b/script/brew_formula_update @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash -e # # script/brew_formula_update # mas @@ -29,7 +29,7 @@ fi if test -n "$2"; then REVISION="$2" else - REVISION=$(git rev-parse HEAD) + REVISION=$(git rev-parse "$VERSION") fi echo "Checking to see if this update can be a simple bump." diff --git a/script/brew_update b/script/brew_update new file mode 100755 index 000000000..02f2d46e9 --- /dev/null +++ b/script/brew_update @@ -0,0 +1,14 @@ +#!/bin/bash -e +# +# script/build_artifacts +# mas +# +# Runs all related scripts for generating all artifacts. +# + +VERSION=$(script/version) + +echo "Updating mas $VERSION Homebrew formula" + +script/brew_formula_update +script/bottle diff --git a/script/build_artifacts b/script/build_artifacts new file mode 100755 index 000000000..479ddae10 --- /dev/null +++ b/script/build_artifacts @@ -0,0 +1,17 @@ +#!/bin/bash -e +# +# script/build_artifacts +# mas +# +# Runs all related scripts for generating all artifacts. +# + +VERSION=$(script/version) + +echo "Building mas $VERSION artifacts" + +script/clean +script/build +script/archive +script/install +script/package diff --git a/script/clean b/script/clean index d083f9fb8..2fbaedbd2 100755 --- a/script/clean +++ b/script/clean @@ -10,6 +10,7 @@ BUILD_DIR=build INSTALL_DIR=/tmp/mas-cli.dst main() { + rm -rf Carthage/Build rm -rf ${BUILD_DIR:?} rm -rf ${INSTALL_DIR:?} } diff --git a/script/version b/script/version index 9ab9ea648..467b40fde 100755 --- a/script/version +++ b/script/version @@ -9,4 +9,4 @@ # This no longer works with MARKETING_VERSION build setting in Info.plist # agvtool what-marketing-version -terse1 -echo "1.7.0" +echo "1.7.1"