├── .codecov.yml ├── .gitignore ├── .jazzy.yaml ├── .swift-version ├── .swiftlint.yml ├── .travis.yml ├── CHANGELOG.md ├── Cartfile ├── Cartfile.resolved ├── LICENSE ├── Package.swift ├── README.md ├── RxTask.xcodeproj ├── RxTaskTests_Info.plist ├── RxTask_Info.plist ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcshareddata │ └── xcschemes │ ├── RxTask.xcscheme │ └── xcschememanagement.plist ├── Sources ├── Observable+Task.swift └── Task.swift ├── Tests ├── LinuxMain.swift └── RxTaskTests │ ├── Observable+TaskTests.swift │ ├── ScriptFile.swift │ └── TaskTests.swift ├── docs ├── Enums.html ├── Enums │ ├── TaskError.html │ └── TaskEvent.html ├── Extensions.html ├── Extensions │ └── Observable.html ├── Protocols.html ├── Protocols │ └── TaskEventType.html ├── Structs.html ├── Structs │ └── Task.html ├── badge.svg ├── css │ ├── highlight.css │ └── jazzy.css ├── docsets │ ├── .docset │ │ └── Contents │ │ │ ├── Info.plist │ │ │ └── Resources │ │ │ ├── Documents │ │ │ ├── Enums.html │ │ │ ├── Enums │ │ │ │ ├── TaskError.html │ │ │ │ └── TaskEvent.html │ │ │ ├── Extensions.html │ │ │ ├── Extensions │ │ │ │ └── Observable.html │ │ │ ├── Protocols.html │ │ │ ├── Protocols │ │ │ │ └── TaskEventType.html │ │ │ ├── Structs.html │ │ │ ├── Structs │ │ │ │ └── Task.html │ │ │ ├── css │ │ │ │ ├── highlight.css │ │ │ │ └── jazzy.css │ │ │ ├── img │ │ │ │ ├── carat.png │ │ │ │ ├── dash.png │ │ │ │ ├── gh.png │ │ │ │ └── spinner.gif │ │ │ ├── index.html │ │ │ ├── js │ │ │ │ ├── jazzy.js │ │ │ │ ├── jazzy.search.js │ │ │ │ ├── jquery.min.js │ │ │ │ ├── lunr.min.js │ │ │ │ └── typeahead.jquery.js │ │ │ ├── search.json │ │ │ └── undocumented.json │ │ │ └── docSet.dsidx │ ├── .tgz │ ├── RxTask.docset │ │ └── Contents │ │ │ ├── Info.plist │ │ │ └── Resources │ │ │ ├── Documents │ │ │ ├── Enums.html │ │ │ ├── Enums │ │ │ │ ├── TaskError.html │ │ │ │ └── TaskEvent.html │ │ │ ├── Extensions.html │ │ │ ├── Extensions │ │ │ │ └── Observable.html │ │ │ ├── Protocols.html │ │ │ ├── Protocols │ │ │ │ └── TaskEventType.html │ │ │ ├── Structs.html │ │ │ ├── Structs │ │ │ │ └── Task.html │ │ │ ├── badge.svg │ │ │ ├── css │ │ │ │ ├── highlight.css │ │ │ │ └── jazzy.css │ │ │ ├── img │ │ │ │ ├── carat.png │ │ │ │ ├── dash.png │ │ │ │ ├── gh.png │ │ │ │ └── spinner.gif │ │ │ ├── index.html │ │ │ ├── js │ │ │ │ ├── jazzy.js │ │ │ │ ├── jazzy.search.js │ │ │ │ ├── jquery.min.js │ │ │ │ ├── lunr.min.js │ │ │ │ └── typeahead.jquery.js │ │ │ ├── search.json │ │ │ └── undocumented.json │ │ │ └── docSet.dsidx │ └── RxTask.tgz ├── img │ ├── carat.png │ ├── dash.png │ ├── gh.png │ └── spinner.gif ├── index.html ├── js │ ├── jazzy.js │ ├── jazzy.search.js │ ├── jquery.min.js │ ├── lunr.min.js │ └── typeahead.jquery.js ├── search.json └── undocumented.json └── scripts ├── upstall-carthage.sh └── upstall-swiftlint.sh /.codecov.yml: -------------------------------------------------------------------------------- 1 | ignore: 2 | - Tests/ 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | Packages/ 37 | # Package.pins 38 | .build/ 39 | 40 | # Carthage 41 | Carthage 42 | *.framework.zip 43 | -------------------------------------------------------------------------------- /.jazzy.yaml: -------------------------------------------------------------------------------- 1 | author: RxSwiftCommunity 2 | module: RxTask 3 | github_url: https://github.com/RxSwiftCommunity/RxTask 4 | theme: fullwidth 5 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 3.0.2 2 | -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | excluded: 2 | - Carthage 3 | - Packages 4 | 5 | line_length: 150 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | env: 2 | global: 3 | - FRAMEWORK_NAME=RxTask 4 | - secure: "IVdTuXiwER2aiRZu9hRMfjhckrw08ddcxfHsTyPW5yOSHdCOU/g37qV27OoGCK0xWY4HayuDSqHjdIky0HCCKoARGHZKcjcZCUnEarxTk5e9GuZ7NRfyKbSCDMwl0onqjuuGyJu3fLIM8ArCFiJrtVreRqkf49wEPE1yoyeNjDAY5RNSyKUGRJtfTVtiyZQf5Z6raVyEKBFMDR8TYXy4xBDU5ieaJS9i9E/d3F/x4X0Gc9g5P5kw9o0Sj5vGXR3e06LpXXtzi28cJsXRxGcayAfo0gpLKFjo+2fseJZVhWohTH8q9bNOaqd6gu3luXdjJZwkUC0+r/zGF1H35i08CS5o0EI3HqSgZgTpcPE3KgfWbgb+1a7ntzDrsBtvZS3KrH8hHDYBv1HCxwDQdVJO+7HoMacZRBAEWQmw0GvyDhl5tmLWfYsXYvDMLN7ndn3xUtWSR3FMhYjKApupeNb9DyKCRpeDGTBP8bbEtLE8J/VQPhwwK78OzgMV+LwRWQ4fihKmbTiwyOMTDpXqriKgecitH/pmDVBXR5bSSk1YQHM5xqfz1An4wxYlM2BskvIrLX0nnnRjhgtSEfRdieasohPyJHAwb0GgmOYN5QZ4hoNICIGWYHVobEdoZWnsgvhGaOHDGE7P+gbYbSkUjP6KTbCAHH/T1jlH0R9D0+IcpwQ=" 5 | 6 | cache: 7 | directories: 8 | - build 9 | - Packages 10 | - Carthage 11 | 12 | script: placeholder # workaround for https://github.com/travis-ci/travis-ci/issues/4681 13 | matrix: 14 | include: 15 | - script: 16 | - carthage bootstrap --platform mac 17 | - set -o pipefail && xcodebuild -scheme $FRAMEWORK_NAME -project $FRAMEWORK_NAME.xcodeproj clean build-for-testing test | xcpretty 18 | env: JOB=Xcode 19 | os: osx 20 | osx_image: xcode8.2 21 | language: objective-c 22 | before_install: 23 | - ./scripts/upstall-carthage.sh 24 | - ./scripts/upstall-swiftlint.sh 25 | after_success: 26 | - bash <(curl -s https://codecov.io/bash) 27 | before_deploy: 28 | - carthage build --no-skip-current 29 | - carthage archive $FRAMEWORK_NAME 30 | - script: 31 | - swift test 32 | env: JOB=SPM 33 | os: osx 34 | osx_image: xcode8.2 35 | language: objective-c 36 | # - script: 37 | # - swift test 38 | # env: JOB=Linux 39 | # sudo: required 40 | # dist: trusty 41 | # language: generic 42 | # install: 43 | # - eval "$(curl -sL https://gist.githubusercontent.com/kylef/5c0475ff02b7c7671d2a/raw/9f442512a46d7a2af7b850d65a7e9bd31edfb09b/swiftenv-install.sh)" 44 | 45 | exclude: 46 | - script: placeholder # workaround for https://github.com/travis-ci/travis-ci/issues/4681 47 | 48 | deploy: 49 | provider: releases 50 | api_key: 51 | secure: JVMI8VRlw0naEi3KcQgU+hqLB0L0FdeqLBCHAetjDeqhKqAGkjiKc+JaHqbt24KK64Bny+WwMle/4o3BgYo38W7fim8vIq+15PdR426cY2TyTSFH7EzY/gRta5ljvkR8R8YN/pYRlZR829mDKdUB7nEIS6bNY9t9bVn3gfn6Qg1rB3GsNjOlkoVKidPGAMEwTG0sScfkgi9v0yLIvOuf76ZWhWP1knPpw/HEiUNg20okRmnXqy0hLH3u2TTT63x0XEDK6eJyJo/MbN+O0oA2AFk96ZxVutanwE6Vud0oTT1YOzaGhkkr7iQRDBmP4/dJDfJ37KjqSjL+t6W8/Zv+i3ydKhqqDXPEC6bryLGwbL+MDWXmqCEi1EhXGlf9B1Zg/ozpZfR0MVJhj+Cgq5QYkD+MrWlFM8F/QEnr/dywXh6Q6QCDSsQOPIDVNavUB9A3gqD3+ZEh37P+9uIS2W4ejcqKj53bG9QwIPGY/ej1cwo88huTk8Mv04LXcLxedPEj0COU3aVIxN3D5Y74BwHOcMvl2hTKcz54hUr2j4tJ1JVz/eBg9QMpMkjhXn4XmxsZ80qbPqpDbAxOnqNXD5gzYhhYp+mzWTu6/enS/zBRbeb66oe5Y9KXFtXucf56IfU+3+OoI9xMhnu+mBnN12uFJ4ugn5mXl1F4jUeJSWqHcVQ= 52 | file: $FRAMEWORK_NAME.framework.zip 53 | skip_cleanup: true 54 | on: 55 | repo: RxSwiftCommunity/$FRAMEWORK_NAME 56 | tags: true 57 | condition: $JOB = Xcode 58 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## Master 2 | 3 | ##### Breaking 4 | 5 | * None 6 | 7 | ##### Enhancements 8 | 9 | * None 10 | 11 | ##### Bug Fixes 12 | 13 | * None 14 | 15 | ## 0.2.0 16 | 17 | ##### Breaking 18 | 19 | * `stdin`, `stdout`, and `stderr` are now treated as raw `Data`. 20 | Encoding/Decoding is left to the user. 21 | 22 | ##### Enhancements 23 | 24 | * `stdin` is now available when `launch`ing a `Task`. 25 | * `Task` conforms to `CustomStringConvertible` and `Equatable`. 26 | 27 | ##### Bug Fixes 28 | 29 | * None 30 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "ReactiveX/RxSwift" ~> 3.2 2 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "ReactiveX/RxSwift" "3.2.0" 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 RxSwiftCommunity 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | import PackageDescription 2 | 3 | let package = Package( 4 | name: "RxTask", 5 | dependencies: [ 6 | .Package(url: "https://github.com/ReactiveX/RxSwift.git", majorVersion: 3, minor: 2) 7 | ] 8 | ) 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RxTask 2 | An [RxSwift](https://github.com/ReactiveX/RxSwift) implementation of a command line task runner. 3 | 4 | [![GitHub release](https://img.shields.io/github/release/RxSwiftCommunity/RxTask.svg)]() 5 | [![Build Status](https://travis-ci.org/RxSwiftCommunity/RxTask.svg?branch=master)](https://travis-ci.org/RxSwiftCommunity/RxTask) 6 | [![codecov](https://codecov.io/gh/RxSwiftCommunity/RxTask/branch/master/graph/badge.svg)](https://codecov.io/gh/RxSwiftCommunity/RxTask) 7 | [![docs](https://cdn.rawgit.com/RxSwiftCommunity/RxTask/master/docs/badge.svg)](https://RxSwiftCommunity.github.io/RxTask/) 8 | [![carthage compatible](https://img.shields.io/badge/carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 9 | [![swift package manager compatible](https://img.shields.io/badge/spm-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) 10 | ![platform macOS](https://img.shields.io/badge/platform-macOS-blue.svg) 11 | [![language swift 3.0](https://img.shields.io/badge/language-Swift%203.0-orange.svg)](https://swift.org) 12 | 13 | ## Linux Compatibility 14 | 15 | Currently, RxTask does not support Linux. RxTask relies on some functionality 16 | in `Foundation` that is currently not available in the Linux port. This will be 17 | re-evaluated after the Swift 3.1 release. PRs in this area are quite welcome! 👍 18 | 19 | ## Installation 20 | 21 | ### Carthage 22 | 23 | ```shell 24 | github "RxSwiftCommunity/RxTask" 25 | ``` 26 | 27 | ### SPM 28 | 29 | ```swift 30 | import PackageDescription 31 | 32 | let package = Package( 33 | name: "YOUR_PROJECT_NAME", 34 | targets: [], 35 | dependencies: [ 36 | .Package(url: "https://github.com/RxSwiftCommunity/RxSwift.git", majorVersion: 0) 37 | ] 38 | ) 39 | ``` 40 | 41 | ## Usage 42 | 43 | ### Create A Task 44 | 45 | Creating a task is as simple as providing a `launchPath` to the executable. 46 | 47 | ```swift 48 | let task = Task(launchPath: "/bin/ls") 49 | ``` 50 | 51 | Optionally, you can provide `arguments`, a `workingDirectory`, and an 52 | `environment`. 53 | 54 | ```swift 55 | let task = Task(launchPath: "/bin/echo", arguments: ["$MESSAGE"], environment: ["MESSAGE": "Hello World!"]) 56 | ``` 57 | 58 | ### Launch A Task 59 | 60 | `Task`s can be launched with the `launch()` method. This produces a 61 | self-contained process. This means the same task can be `launch()`ed multiple 62 | times producing separate processes. 63 | 64 | #### TaskEvent 65 | 66 | The output of `launch()` is a `Observable`. `TaskEvent` is an `enum` 67 | that is used to report significant events in the task lifetime. The possible 68 | events are: 69 | 70 | * `launch(command: String)` 71 | * `stdOut(Data)` 72 | * `stdErr(Data)` 73 | * `exit(statusCode: Int)` 74 | 75 | **Note:** Currently an event is only considered successful if it exits with a 76 | `statusCode` of 0. Other exit statuses will be considered a `TaskError`. 77 | 78 | #### StdIn 79 | 80 | If you create a task that expects input, you can provide an `Observable` 81 | for `stdin` when you are `launch()`ing the `Task`. Data will be written to 82 | `stdin` as soon as it is emitted by the `Observable`. 83 | 84 | #### Filtering TaskEvents 85 | 86 | If you are only concerned with whether a `Task` has completed successfully, you 87 | can use the built-in operator `justExitStatus()`. 88 | 89 | ```swift 90 | Task(launchPath: "/bin/ls").launch() 91 | .justExitStatus() 92 | .subscribe(onNext: { exitStatus in /* ... */ }) 93 | .disposed(by: disposeBag) 94 | ``` 95 | 96 | Alternatively, if you are only interested in the output of a `Task`, you can use 97 | the operator `justOutput()`. *This will send the output of both `stdout` and 98 | `stderr`*. 99 | 100 | ```swift 101 | Task(launchPath: "/bin/ls").launch() 102 | .justOutput() 103 | .subscribe(onNext: { output in /* ... */ }) 104 | .disposed(by: disposeBag) 105 | ``` 106 | 107 | #### TaskError 108 | 109 | `TaskError` is an `Error` that will be emitted under the following situations: 110 | 111 | * `uncaughtSignal`: The `Task` terminated with an uncaught signal (e.g. `SIGINT`). 112 | * `exit(statusCode: Int)`: The `Task` exited with a non-zero exit code. 113 | 114 | ## API Reference 115 | 116 | Full docs can be found [here](https://RxSwiftCommunity.github.io/RxTask/). 117 | -------------------------------------------------------------------------------- /RxTask.xcodeproj/RxTaskTests_Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | CFBundleDevelopmentRegion 5 | en 6 | CFBundleExecutable 7 | $(EXECUTABLE_NAME) 8 | CFBundleIdentifier 9 | $(PRODUCT_BUNDLE_IDENTIFIER) 10 | CFBundleInfoDictionaryVersion 11 | 6.0 12 | CFBundleName 13 | $(PRODUCT_NAME) 14 | CFBundlePackageType 15 | BNDL 16 | CFBundleShortVersionString 17 | 1.0 18 | CFBundleSignature 19 | ???? 20 | CFBundleVersion 21 | $(CURRENT_PROJECT_VERSION) 22 | NSPrincipalClass 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /RxTask.xcodeproj/RxTask_Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /RxTask.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RxTask.xcodeproj/xcshareddata/xcschemes/RxTask.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 34 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 74 | 75 | 77 | 78 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /RxTask.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SchemeUserState 5 | 6 | RxRunner.xcscheme 7 | 8 | 9 | SuppressBuildableAutocreation 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Sources/Observable+Task.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+Task.swift 3 | // RxTask 4 | // 5 | // Created by Scott Hoyt on 2/20/17. 6 | // 7 | // 8 | 9 | import Foundation 10 | import RxSwift 11 | 12 | /// A protocol encapsulated `TaskEvent`. Necessary to create `Observable` operators and not intended for public use. 13 | public protocol TaskEventType { 14 | 15 | /// The exit status code if available, `nil` otherwise. 16 | var exitStatus: Int? { get } 17 | 18 | /// The output of the event if available, `nil` otherwise. 19 | var output: Data? { get } 20 | } 21 | 22 | extension TaskEvent: TaskEventType { 23 | 24 | /// The exit status code if available, `nil` otherwise. 25 | public var exitStatus: Int? { 26 | switch self { 27 | case .exit(let statusCode): 28 | return statusCode 29 | default: 30 | return nil 31 | } 32 | } 33 | 34 | /// The output of the event if available, `nil` otherwise. 35 | public var output: Data? { 36 | switch self { 37 | case .stdErr(let output), .stdOut(let output): 38 | return output 39 | default: 40 | return nil 41 | } 42 | } 43 | } 44 | 45 | public extension Observable where Element: TaskEventType { 46 | 47 | /// Filters out the output and launch events to produce just an `Observable` of the exit status. 48 | func justExitStatus() -> Observable { 49 | return flatMap { event -> Observable in 50 | guard let exitStatus = event.exitStatus else { 51 | return Observable.empty() 52 | } 53 | 54 | return Observable.just(exitStatus) 55 | } 56 | } 57 | 58 | /// Filters out the launch and exit events to just produce and `Observable` of the output (`stdout` and `stderr`). 59 | func justOutput() -> Observable { 60 | return flatMap { event -> Observable in 61 | guard let output = event.output else { 62 | return Observable.empty() 63 | } 64 | 65 | return Observable.just(output) 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Sources/Task.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Runner.swift 3 | // RxTask 4 | // 5 | // Created by Scott Hoyt on 2/18/17. 6 | // 7 | // 8 | 9 | import Foundation 10 | import RxSwift 11 | 12 | #if os(Linux) 13 | typealias Process = Foundation.Task 14 | 15 | extension Process { 16 | var isRunning: Bool { 17 | return running 18 | } 19 | } 20 | #endif 21 | 22 | /// Event emitted by a launched `Task`. 23 | public enum TaskEvent { 24 | 25 | /// The `Task` has launched. 26 | case launch(command: String) 27 | 28 | /// The `Task` has output to `stdout`. 29 | case stdOut(Data) 30 | 31 | /// The `Task` has output to `stderr`. 32 | case stdErr(Data) 33 | 34 | /// The `Task` exited successfully. 35 | case exit(statusCode: Int) 36 | } 37 | 38 | extension TaskEvent: Equatable { 39 | 40 | /// Equates two `TaskEvent`s. 41 | public static func == (lhs: TaskEvent, rhs: TaskEvent) -> Bool { 42 | switch (lhs, rhs) { 43 | case let (.launch(left), .launch(right)): 44 | return left == right 45 | case let (.stdOut(left), .stdOut(right)): 46 | return left == right 47 | case let (.stdErr(left), .stdErr(right)): 48 | return left == right 49 | case let (.exit(left), .exit(right)): 50 | return left == right 51 | default: 52 | return false 53 | } 54 | } 55 | } 56 | 57 | /// An error encountered in the execution of a `Task`. 58 | public enum TaskError: Error { 59 | 60 | /// An uncaught signal was encountered. 61 | case uncaughtSignal 62 | 63 | /// The `Task` exited unsuccessfully. 64 | case exit(statusCode: Int) 65 | } 66 | 67 | extension TaskError: Equatable { 68 | 69 | /// Equates two `TaskError`s. 70 | public static func == (lhs: TaskError, rhs: TaskError) -> Bool { 71 | switch (lhs, rhs) { 72 | case (.uncaughtSignal, .uncaughtSignal): 73 | return true 74 | case let (.exit(left), .exit(right)): 75 | return left == right 76 | default: 77 | return false 78 | } 79 | } 80 | } 81 | 82 | /// Encapsulates launching a RxSwift powered command line task. 83 | public struct Task { 84 | 85 | /// The location of the executable. 86 | let launchPath: String 87 | 88 | /// The arguments to be passed to the executable. 89 | let arguments: [String] 90 | 91 | /// The working directory of the task. If `nil`, this will inherit from the parent process. 92 | let workingDirectory: String? 93 | 94 | /// The environment to launch the task with. If `nil`, this will inherit from the parent process. 95 | let environment: [String: String]? 96 | 97 | private let disposeBag = DisposeBag() 98 | 99 | /** 100 | Create a new task. 101 | 102 | - parameters: 103 | - launchPath: The location of the executable. 104 | - arguments: The arguments to be passed to the executable. 105 | - workingDirectory: The working directory of the task. If not used, this will inherit from the parent process. 106 | - environment: The environment to launch the task with. If not used, this will inherit from the parent process. 107 | */ 108 | public init(launchPath: String, arguments: [String] = [], workingDirectory: String? = nil, environment: [String: String]? = nil) { 109 | self.launchPath = launchPath 110 | self.arguments = arguments 111 | self.workingDirectory = workingDirectory 112 | self.environment = environment 113 | } 114 | 115 | /** 116 | Launch the `Task`. 117 | 118 | - parameter stdIn: An optional `Observable` to provide `stdin` for the process. Defaults to `nil`. 119 | */ 120 | public func launch(stdIn: Observable? = nil) -> Observable { 121 | let process = Process() 122 | process.launchPath = self.launchPath 123 | process.arguments = self.arguments 124 | 125 | if let workingDirectory = workingDirectory { process.currentDirectoryPath = workingDirectory } 126 | if let environment = environment { process.environment = environment } 127 | 128 | return Observable.create { observer in 129 | process.standardOutput = self.outPipe { observer.onNext(.stdOut($0)) } 130 | process.standardError = self.outPipe { observer.onNext(.stdErr($0)) } 131 | 132 | if let stdIn = stdIn { 133 | process.standardInput = self.inPipe(stdIn: stdIn, errorHandler: observer.onError) 134 | } 135 | 136 | process.terminationHandler = self.terminationHandler(observer: observer) 137 | 138 | observer.onNext(.launch(command: self.description)) 139 | process.launch() 140 | 141 | return Disposables.create { 142 | if process.isRunning { 143 | process.terminate() 144 | } 145 | } 146 | } 147 | } 148 | 149 | private func terminationHandler(observer: AnyObserver) -> (Process) -> Void { 150 | // Handle process termination and determine if it was a normal exit 151 | // or an error. 152 | return { process in 153 | switch process.terminationReason { 154 | case .exit: 155 | if process.terminationStatus == 0 { 156 | observer.onNext(.exit(statusCode: Int(process.terminationStatus))) 157 | observer.onCompleted() 158 | } else { 159 | observer.onError(TaskError.exit(statusCode: Int(process.terminationStatus))) 160 | } 161 | case .uncaughtSignal: 162 | observer.onError(TaskError.uncaughtSignal) 163 | } 164 | } 165 | } 166 | 167 | private func outPipe(withHandler handler: @escaping (Data) -> Void) -> Pipe { 168 | let pipe = Pipe() 169 | 170 | pipe.fileHandleForReading.readabilityHandler = { handler($0.availableData) } 171 | 172 | return pipe 173 | } 174 | 175 | private func inPipe(stdIn: Observable, errorHandler: @escaping (Error) -> Void) -> Pipe { 176 | let pipe = Pipe() 177 | 178 | stdIn 179 | .subscribe(onNext: pipe.fileHandleForWriting.write) 180 | .disposed(by: disposeBag) 181 | 182 | return pipe 183 | } 184 | } 185 | 186 | extension Task: CustomStringConvertible { 187 | 188 | /// A `String` describing the `Task`. 189 | public var description: String { 190 | return ([launchPath] + arguments).joined(separator: " ") 191 | } 192 | } 193 | 194 | extension Task: Equatable { 195 | 196 | /// Whether or not two `Task`s are equal. 197 | public static func == (lhs: Task, rhs: Task) -> Bool { 198 | return lhs.launchPath == rhs.launchPath && 199 | lhs.arguments == rhs.arguments && 200 | lhs.workingDirectory == rhs.workingDirectory && 201 | envsEqual(lhs: lhs.environment, rhs: rhs.environment) 202 | } 203 | 204 | private static func envsEqual(lhs: [String: String]?, rhs: [String: String]?) -> Bool { 205 | switch (lhs, rhs) { 206 | case (nil, nil): 207 | return true 208 | case let (.some(left), .some(right)): 209 | return left == right 210 | default: 211 | return false 212 | } 213 | } 214 | } 215 | -------------------------------------------------------------------------------- /Tests/LinuxMain.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import RxRunnerTests 3 | 4 | XCTMain([ 5 | testCase(TaskTests.allTests), 6 | testCase(ObservableTaskTests.allTests) 7 | ]) 8 | -------------------------------------------------------------------------------- /Tests/RxTaskTests/Observable+TaskTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+TaskTests.swift 3 | // RxTask 4 | // 5 | // Created by Scott Hoyt on 2/20/17. 6 | // 7 | // 8 | 9 | import XCTest 10 | @testable import RxTask 11 | import RxBlocking 12 | 13 | class ObservableTaskTests: XCTestCase { 14 | func testJustExitStatus() throws { 15 | let script = try ScriptFile(commands: [ 16 | "echo hello", 17 | "echo world" 18 | ]) 19 | 20 | let exitStatus = try Task(launchPath: script.path).launch() 21 | .justExitStatus() 22 | .toBlocking() 23 | .toArray() 24 | 25 | XCTAssertEqual(exitStatus.count, 1) 26 | XCTAssertEqual(exitStatus[0], 0) 27 | } 28 | 29 | func testJustOutput() throws { 30 | let script = try ScriptFile(commands: [ 31 | "echo hello", 32 | "sleep 0.1", 33 | "echo world", 34 | "sleep 0.1" 35 | ]) 36 | 37 | let exitStatus = try Task(launchPath: script.path).launch() 38 | .justOutput() 39 | .toBlocking() 40 | .toArray() 41 | 42 | XCTAssertEqual(exitStatus.count, 2) 43 | XCTAssertEqual(exitStatus[0], "hello\n".data(using: .utf8)!) 44 | XCTAssertEqual(exitStatus[1], "world\n".data(using: .utf8)!) 45 | } 46 | 47 | static var allTests: [(String, (ObservableTaskTests) -> () throws -> Void)] { 48 | return [ 49 | ("testJustExitStatus", testJustExitStatus), 50 | ("testJustOutput", testJustOutput) 51 | ] 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Tests/RxTaskTests/ScriptFile.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScriptFile.swift 3 | // RxTask 4 | // 5 | // Created by Scott Hoyt on 2/20/17. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | class ScriptFile { 12 | private let url: URL 13 | 14 | var path: String { 15 | return url.path 16 | } 17 | 18 | init(commands: [String]) throws { 19 | let fileName = UUID().uuidString + ".sh" 20 | let fileURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent(fileName) 21 | 22 | let shebang = "#!/bin/bash" 23 | let contents = ([shebang] + commands).joined(separator: "\n") 24 | try contents.write(to: fileURL, atomically: true, encoding: .utf8) 25 | 26 | let permissions = Int16(0o0770) 27 | try FileManager.default.setAttributes([.posixPermissions: permissions], ofItemAtPath: fileURL.path) 28 | url = fileURL 29 | } 30 | 31 | deinit { 32 | try? FileManager.default.removeItem(at: url) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Tests/RxTaskTests/TaskTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaskTests.swift 3 | // RxTask 4 | // 5 | // Created by Scott Hoyt on 2/20/17. 6 | // 7 | // 8 | 9 | import XCTest 10 | @testable import RxTask 11 | import RxSwift 12 | import RxBlocking 13 | 14 | class TaskTests: XCTestCase { 15 | func testStdOut() throws { 16 | let script = try ScriptFile(commands: [ 17 | "echo hello world", 18 | "sleep 0.1" 19 | ]) 20 | 21 | let events = try getEvents(for: script) 22 | 23 | XCTAssertEqual(events.count, 3) 24 | XCTAssertEqual(events[0], .launch(command: script.path)) 25 | XCTAssertEqual(events[1], .stdOut("hello world\n".data(using: .utf8)!)) 26 | XCTAssertEqual(events[2], .exit(statusCode: 0)) 27 | } 28 | 29 | func testStdErr() throws { 30 | let script = try ScriptFile(commands: [ 31 | "echo hello world 1>&2", 32 | "sleep 0.1" 33 | ]) 34 | 35 | let events = try getEvents(for: script) 36 | 37 | XCTAssertEqual(events.count, 3) 38 | XCTAssertEqual(events[0], .launch(command: script.path)) 39 | XCTAssertEqual(events[1], .stdErr("hello world\n".data(using: .utf8)!)) 40 | XCTAssertEqual(events[2], .exit(statusCode: 0)) 41 | } 42 | 43 | func testExitsWithFailingStatusErrors() throws { 44 | let script = try ScriptFile(commands: ["exit 100"]) 45 | 46 | do { 47 | _ = try getEvents(for: script) 48 | 49 | // If we get this far it is a failure 50 | XCTFail() 51 | } catch { 52 | if let error = error as? TaskError { 53 | XCTAssertEqual(error, .exit(statusCode: 100)) 54 | } else { 55 | XCTFail() 56 | } 57 | } 58 | } 59 | 60 | func testUncaughtSignalErrors() throws { 61 | let script = try ScriptFile(commands: [ 62 | "kill $$", 63 | "sleep 10" 64 | ]) 65 | 66 | do { 67 | _ = try getEvents(for: script) 68 | 69 | // If we get this far it is a failure 70 | XCTFail() 71 | } catch { 72 | if let error = error as? TaskError { 73 | XCTAssertEqual(error, .uncaughtSignal) 74 | } else { 75 | XCTFail() 76 | } 77 | } 78 | } 79 | 80 | func testStdIn() throws { 81 | let script = try ScriptFile(commands: [ 82 | "read var1", 83 | "echo $var1", 84 | "sleep 0.1", 85 | "read var2", 86 | "echo $var2", 87 | "sleep 0.1" 88 | ]) 89 | 90 | let stdIn = Observable.of("hello\n", "world\n").map { $0.data(using: .utf8) ?? Data() } 91 | 92 | let events = try Task(launchPath: script.path) 93 | .launch(stdIn: stdIn) 94 | .toBlocking() 95 | .toArray() 96 | 97 | XCTAssertEqual(events.count, 4) 98 | XCTAssertEqual(events[0], .launch(command: script.path)) 99 | XCTAssertEqual(events[1], .stdOut("hello\n".data(using: .utf8)!)) 100 | XCTAssertEqual(events[2], .stdOut("world\n".data(using: .utf8)!)) 101 | XCTAssertEqual(events[3], .exit(statusCode: 0)) 102 | } 103 | 104 | func testTaskEquality() { 105 | let task1 = Task(launchPath: "/bin/echo", arguments: ["$MESSAGE"], workingDirectory: "/", environment: ["MESSAGE": "Hello World!"]) 106 | let task2 = Task(launchPath: "/bin/echo", arguments: ["$MESSAGE"], workingDirectory: "/", environment: ["MESSAGE": "Hello World!"]) 107 | let task3 = Task(launchPath: "/bin/echo", arguments: ["$MESSAGE"], workingDirectory: "/") 108 | let task4 = Task(launchPath: "/bin/echo", arguments: ["$MESSAGE"], workingDirectory: "/") 109 | 110 | XCTAssertEqual(task1, task2) 111 | XCTAssertEqual(task3, task4) 112 | 113 | XCTAssertNotEqual(task1, task3) 114 | } 115 | 116 | static var allTests: [(String, (TaskTests) -> () throws -> Void)] { 117 | return [ 118 | ("testStdOut", testStdOut), 119 | ("testStdErr", testStdErr), 120 | ("testExitsWithFailingStatusErrors", testExitsWithFailingStatusErrors), 121 | ("testUncaughtSignalErrors", testUncaughtSignalErrors) 122 | ] 123 | } 124 | 125 | // MARK: Helpers 126 | 127 | func getEvents(for script: ScriptFile) throws -> [TaskEvent] { 128 | return try Task(launchPath: script.path).launch() 129 | .toBlocking() 130 | .toArray() 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /docs/Enums.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Enums Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | RxTask Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 |

35 | 36 | 37 | View on GitHub 38 | 39 |

40 | 41 |
42 | 43 | 48 | 49 |
50 | 89 |
90 | 91 |
92 |
93 |

Enums

94 |

The following enums are available globally.

95 | 96 |
97 |
98 | 99 |
100 |
101 |
102 |
    103 |
  • 104 |
    105 | 106 | 107 | 108 | TaskEvent 109 | 110 |
    111 |
    112 |
    113 |
    114 |
    115 |
    116 |

    Event emitted by a launched Task.

    117 | 118 | See more 119 |
    120 |
    121 |

    Declaration

    122 |
    123 |

    Swift

    124 |
    public enum TaskEvent
    125 | 126 |
    127 |
    128 |
    129 |
    130 |
  • 131 |
  • 132 |
    133 | 134 | 135 | 136 | TaskError 137 | 138 |
    139 |
    140 |
    141 |
    142 |
    143 |
    144 |

    An error encountered in the execution of a Task.

    145 | 146 | See more 147 |
    148 |
    149 |

    Declaration

    150 |
    151 |

    Swift

    152 |
    public enum TaskError: Error
    153 | 154 |
    155 |
    156 |
    157 |
    158 |
  • 159 |
160 |
161 |
162 |
163 | 164 |
165 |
166 | 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /docs/Extensions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Extensions Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | RxTask Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 |

35 | 36 | 37 | View on GitHub 38 | 39 |

40 | 41 |
42 | 43 | 48 | 49 |
50 | 89 |
90 | 91 |
92 |
93 |

Extensions

94 |

The following extensions are available globally.

95 | 96 |
97 |
98 | 99 |
100 |
101 |
102 |
    103 |
  • 104 |
    105 | 106 | 107 | 108 | Observable 109 | 110 |
    111 |
    112 |
    113 |
    114 |
    115 |
    116 | 117 | See more 118 |
    119 |
    120 |

    Declaration

    121 |
    122 |

    Swift

    123 |
    class Observable<Element> : ObservableType
    124 | 125 |
    126 |
    127 |
    128 |
    129 |
  • 130 |
131 |
132 |
133 |
134 | 135 |
136 |
137 | 141 | 142 | 143 | 144 | -------------------------------------------------------------------------------- /docs/Extensions/Observable.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Observable Extension Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |

23 | 24 | RxTask Docs 25 | 26 | (100% documented) 27 |

28 | 29 |

30 |

31 | 32 |
33 |

34 | 35 |

36 | 37 | 38 | View on GitHub 39 | 40 |

41 | 42 |
43 | 44 | 49 | 50 |
51 | 90 |
91 | 92 |
93 |
94 |

Observable

95 |
96 |
97 |
class Observable<Element> : ObservableType
98 | 99 |
100 |
101 | 102 |
103 |
104 | 105 |
106 |
107 |
108 |
    109 |
  • 110 |
    111 | 112 | 113 | 114 | justExitStatus() 115 | 116 |
    117 |
    118 |
    119 |
    120 |
    121 |
    122 |

    Filters out the output and launch events to produce just an Observable of the exit status.

    123 | 124 |
    125 |
    126 |

    Declaration

    127 |
    128 |

    Swift

    129 |
    func justExitStatus() -> Observable<Int>
    130 | 131 |
    132 |
    133 |
    134 |
    135 |
  • 136 |
  • 137 |
    138 | 139 | 140 | 141 | justOutput() 142 | 143 |
    144 |
    145 |
    146 |
    147 |
    148 |
    149 |

    Filters out the launch and exit events to just produce and Observable of the output (stdout and stderr).

    150 | 151 |
    152 |
    153 |

    Declaration

    154 |
    155 |

    Swift

    156 |
    func justOutput() -> Observable<Data>
    157 | 158 |
    159 |
    160 |
    161 |
    162 |
  • 163 |
164 |
165 |
166 |
167 | 168 |
169 |
170 | 174 | 175 | 176 | 177 | -------------------------------------------------------------------------------- /docs/Protocols.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Protocols Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | RxTask Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 |

35 | 36 | 37 | View on GitHub 38 | 39 |

40 | 41 |
42 | 43 | 48 | 49 |
50 | 89 |
90 | 91 |
92 |
93 |

Protocols

94 |

The following protocols are available globally.

95 | 96 |
97 |
98 | 99 |
100 |
101 |
102 |
    103 |
  • 104 |
    105 | 106 | 107 | 108 | TaskEventType 109 | 110 |
    111 |
    112 |
    113 |
    114 |
    115 |
    116 |

    A protocol encapsulated TaskEvent. Necessary to create Observable operators and not intended for public use.

    117 | 118 | See more 119 |
    120 |
    121 |

    Declaration

    122 |
    123 |

    Swift

    124 |
    public protocol TaskEventType
    125 | 126 |
    127 |
    128 |
    129 |
    130 |
  • 131 |
132 |
133 |
134 |
135 | 136 |
137 |
138 | 142 | 143 | 144 | 145 | -------------------------------------------------------------------------------- /docs/Protocols/TaskEventType.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | TaskEventType Protocol Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |

23 | 24 | RxTask Docs 25 | 26 | (100% documented) 27 |

28 | 29 |

30 |

31 | 32 |
33 |

34 | 35 |

36 | 37 | 38 | View on GitHub 39 | 40 |

41 | 42 |
43 | 44 | 49 | 50 |
51 | 90 |
91 | 92 |
93 |
94 |

TaskEventType

95 |
96 |
97 |
public protocol TaskEventType
98 | 99 |
100 |
101 |

A protocol encapsulated TaskEvent. Necessary to create Observable operators and not intended for public use.

102 | 103 |
104 |
105 | 106 |
107 |
108 |
109 |
    110 |
  • 111 |
    112 | 113 | 114 | 115 | exitStatus 116 | 117 |
    118 |
    119 |
    120 |
    121 |
    122 |
    123 |

    The exit status code if available, nil otherwise.

    124 | 125 |
    126 |
    127 |

    Declaration

    128 |
    129 |

    Swift

    130 |
    var exitStatus: Int?
    131 | 132 |
    133 |
    134 |
    135 |
    136 |
  • 137 |
  • 138 |
    139 | 140 | 141 | 142 | output 143 | 144 |
    145 |
    146 |
    147 |
    148 |
    149 |
    150 |

    The output of the event if available, nil otherwise.

    151 | 152 |
    153 |
    154 |

    Declaration

    155 |
    156 |

    Swift

    157 |
    var output: Data?
    158 | 159 |
    160 |
    161 |
    162 |
    163 |
  • 164 |
165 |
166 |
167 |
168 | 169 |
170 |
171 | 175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /docs/Structs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Structs Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | RxTask Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 |

35 | 36 | 37 | View on GitHub 38 | 39 |

40 | 41 |
42 | 43 | 48 | 49 |
50 | 89 |
90 | 91 |
92 |
93 |

Structs

94 |

The following structs are available globally.

95 | 96 |
97 |
98 | 99 |
100 |
101 |
102 |
    103 |
  • 104 |
    105 | 106 | 107 | 108 | Task 109 | 110 |
    111 |
    112 |
    113 |
    114 |
    115 |
    116 |

    Encapsulates launching a RxSwift powered command line task.

    117 | 118 | See more 119 |
    120 |
    121 |

    Declaration

    122 |
    123 |

    Swift

    124 |
    public struct Task
    125 | 126 |
    127 |
    128 |
    129 |
    130 |
  • 131 |
132 |
133 |
134 |
135 | 136 |
137 |
138 | 142 | 143 | 144 | 145 | -------------------------------------------------------------------------------- /docs/badge.svg: -------------------------------------------------------------------------------- 1 | documentationdocumentation100%100% -------------------------------------------------------------------------------- /docs/css/highlight.css: -------------------------------------------------------------------------------- 1 | /* Credit to https://gist.github.com/wataru420/2048287 */ 2 | .highlight { 3 | /* Comment */ 4 | /* Error */ 5 | /* Keyword */ 6 | /* Operator */ 7 | /* Comment.Multiline */ 8 | /* Comment.Preproc */ 9 | /* Comment.Single */ 10 | /* Comment.Special */ 11 | /* Generic.Deleted */ 12 | /* Generic.Deleted.Specific */ 13 | /* Generic.Emph */ 14 | /* Generic.Error */ 15 | /* Generic.Heading */ 16 | /* Generic.Inserted */ 17 | /* Generic.Inserted.Specific */ 18 | /* Generic.Output */ 19 | /* Generic.Prompt */ 20 | /* Generic.Strong */ 21 | /* Generic.Subheading */ 22 | /* Generic.Traceback */ 23 | /* Keyword.Constant */ 24 | /* Keyword.Declaration */ 25 | /* Keyword.Pseudo */ 26 | /* Keyword.Reserved */ 27 | /* Keyword.Type */ 28 | /* Literal.Number */ 29 | /* Literal.String */ 30 | /* Name.Attribute */ 31 | /* Name.Builtin */ 32 | /* Name.Class */ 33 | /* Name.Constant */ 34 | /* Name.Entity */ 35 | /* Name.Exception */ 36 | /* Name.Function */ 37 | /* Name.Namespace */ 38 | /* Name.Tag */ 39 | /* Name.Variable */ 40 | /* Operator.Word */ 41 | /* Text.Whitespace */ 42 | /* Literal.Number.Float */ 43 | /* Literal.Number.Hex */ 44 | /* Literal.Number.Integer */ 45 | /* Literal.Number.Oct */ 46 | /* Literal.String.Backtick */ 47 | /* Literal.String.Char */ 48 | /* Literal.String.Doc */ 49 | /* Literal.String.Double */ 50 | /* Literal.String.Escape */ 51 | /* Literal.String.Heredoc */ 52 | /* Literal.String.Interpol */ 53 | /* Literal.String.Other */ 54 | /* Literal.String.Regex */ 55 | /* Literal.String.Single */ 56 | /* Literal.String.Symbol */ 57 | /* Name.Builtin.Pseudo */ 58 | /* Name.Variable.Class */ 59 | /* Name.Variable.Global */ 60 | /* Name.Variable.Instance */ 61 | /* Literal.Number.Integer.Long */ } 62 | .highlight .c { 63 | color: #999988; 64 | font-style: italic; } 65 | .highlight .err { 66 | color: #a61717; 67 | background-color: #e3d2d2; } 68 | .highlight .k { 69 | color: #000000; 70 | font-weight: bold; } 71 | .highlight .o { 72 | color: #000000; 73 | font-weight: bold; } 74 | .highlight .cm { 75 | color: #999988; 76 | font-style: italic; } 77 | .highlight .cp { 78 | color: #999999; 79 | font-weight: bold; } 80 | .highlight .c1 { 81 | color: #999988; 82 | font-style: italic; } 83 | .highlight .cs { 84 | color: #999999; 85 | font-weight: bold; 86 | font-style: italic; } 87 | .highlight .gd { 88 | color: #000000; 89 | background-color: #ffdddd; } 90 | .highlight .gd .x { 91 | color: #000000; 92 | background-color: #ffaaaa; } 93 | .highlight .ge { 94 | color: #000000; 95 | font-style: italic; } 96 | .highlight .gr { 97 | color: #aa0000; } 98 | .highlight .gh { 99 | color: #999999; } 100 | .highlight .gi { 101 | color: #000000; 102 | background-color: #ddffdd; } 103 | .highlight .gi .x { 104 | color: #000000; 105 | background-color: #aaffaa; } 106 | .highlight .go { 107 | color: #888888; } 108 | .highlight .gp { 109 | color: #555555; } 110 | .highlight .gs { 111 | font-weight: bold; } 112 | .highlight .gu { 113 | color: #aaaaaa; } 114 | .highlight .gt { 115 | color: #aa0000; } 116 | .highlight .kc { 117 | color: #000000; 118 | font-weight: bold; } 119 | .highlight .kd { 120 | color: #000000; 121 | font-weight: bold; } 122 | .highlight .kp { 123 | color: #000000; 124 | font-weight: bold; } 125 | .highlight .kr { 126 | color: #000000; 127 | font-weight: bold; } 128 | .highlight .kt { 129 | color: #445588; } 130 | .highlight .m { 131 | color: #009999; } 132 | .highlight .s { 133 | color: #d14; } 134 | .highlight .na { 135 | color: #008080; } 136 | .highlight .nb { 137 | color: #0086B3; } 138 | .highlight .nc { 139 | color: #445588; 140 | font-weight: bold; } 141 | .highlight .no { 142 | color: #008080; } 143 | .highlight .ni { 144 | color: #800080; } 145 | .highlight .ne { 146 | color: #990000; 147 | font-weight: bold; } 148 | .highlight .nf { 149 | color: #990000; } 150 | .highlight .nn { 151 | color: #555555; } 152 | .highlight .nt { 153 | color: #000080; } 154 | .highlight .nv { 155 | color: #008080; } 156 | .highlight .ow { 157 | color: #000000; 158 | font-weight: bold; } 159 | .highlight .w { 160 | color: #bbbbbb; } 161 | .highlight .mf { 162 | color: #009999; } 163 | .highlight .mh { 164 | color: #009999; } 165 | .highlight .mi { 166 | color: #009999; } 167 | .highlight .mo { 168 | color: #009999; } 169 | .highlight .sb { 170 | color: #d14; } 171 | .highlight .sc { 172 | color: #d14; } 173 | .highlight .sd { 174 | color: #d14; } 175 | .highlight .s2 { 176 | color: #d14; } 177 | .highlight .se { 178 | color: #d14; } 179 | .highlight .sh { 180 | color: #d14; } 181 | .highlight .si { 182 | color: #d14; } 183 | .highlight .sx { 184 | color: #d14; } 185 | .highlight .sr { 186 | color: #009926; } 187 | .highlight .s1 { 188 | color: #d14; } 189 | .highlight .ss { 190 | color: #990073; } 191 | .highlight .bp { 192 | color: #999999; } 193 | .highlight .vc { 194 | color: #008080; } 195 | .highlight .vg { 196 | color: #008080; } 197 | .highlight .vi { 198 | color: #008080; } 199 | .highlight .il { 200 | color: #009999; } 201 | -------------------------------------------------------------------------------- /docs/css/jazzy.css: -------------------------------------------------------------------------------- 1 | *, *:before, *:after { 2 | box-sizing: inherit; } 3 | 4 | body { 5 | margin: 0; 6 | background: #fff; 7 | color: #333; 8 | font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; 9 | letter-spacing: .2px; 10 | -webkit-font-smoothing: antialiased; 11 | box-sizing: border-box; } 12 | 13 | h1 { 14 | font-size: 2rem; 15 | font-weight: 700; 16 | margin: 1.275em 0 0.6em; } 17 | 18 | h2 { 19 | font-size: 1.75rem; 20 | font-weight: 700; 21 | margin: 1.275em 0 0.3em; } 22 | 23 | h3 { 24 | font-size: 1.5rem; 25 | font-weight: 700; 26 | margin: 1em 0 0.3em; } 27 | 28 | h4 { 29 | font-size: 1.25rem; 30 | font-weight: 700; 31 | margin: 1.275em 0 0.85em; } 32 | 33 | h5 { 34 | font-size: 1rem; 35 | font-weight: 700; 36 | margin: 1.275em 0 0.85em; } 37 | 38 | h6 { 39 | font-size: 1rem; 40 | font-weight: 700; 41 | margin: 1.275em 0 0.85em; 42 | color: #777; } 43 | 44 | p { 45 | margin: 0 0 1em; } 46 | 47 | ul, ol { 48 | padding: 0 0 0 2em; 49 | margin: 0 0 0.85em; } 50 | 51 | blockquote { 52 | margin: 0 0 0.85em; 53 | padding: 0 15px; 54 | color: #858585; 55 | border-left: 4px solid #e5e5e5; } 56 | 57 | img { 58 | max-width: 100%; } 59 | 60 | a { 61 | color: #4183c4; 62 | text-decoration: none; } 63 | a:hover, a:focus { 64 | outline: 0; 65 | text-decoration: underline; } 66 | 67 | table { 68 | background: #fff; 69 | width: 100%; 70 | border-collapse: collapse; 71 | border-spacing: 0; 72 | overflow: auto; 73 | margin: 0 0 0.85em; } 74 | 75 | tr:nth-child(2n) { 76 | background-color: #fbfbfb; } 77 | 78 | th, td { 79 | padding: 6px 13px; 80 | border: 1px solid #ddd; } 81 | 82 | pre { 83 | margin: 0 0 1.275em; 84 | padding: .85em 1em; 85 | overflow: auto; 86 | background: #f7f7f7; 87 | font-size: .85em; 88 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } 89 | 90 | code { 91 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } 92 | 93 | p > code, li > code { 94 | background: #f7f7f7; 95 | padding: .2em; } 96 | p > code:before, p > code:after, li > code:before, li > code:after { 97 | letter-spacing: -.2em; 98 | content: "\00a0"; } 99 | 100 | pre code { 101 | padding: 0; 102 | white-space: pre; } 103 | 104 | .content-wrapper { 105 | display: flex; 106 | flex-direction: column; } 107 | @media (min-width: 768px) { 108 | .content-wrapper { 109 | flex-direction: row; } } 110 | 111 | .header { 112 | display: flex; 113 | padding: 8px; 114 | font-size: 0.875em; 115 | background: #444; 116 | color: #999; } 117 | 118 | .header-col { 119 | margin: 0; 120 | padding: 0 8px; } 121 | 122 | .header-col--primary { 123 | flex: 1; } 124 | 125 | .header-link { 126 | color: #fff; } 127 | 128 | .header-icon { 129 | padding-right: 6px; 130 | vertical-align: -4px; 131 | height: 16px; } 132 | 133 | .breadcrumbs { 134 | font-size: 0.875em; 135 | padding: 8px 16px; 136 | margin: 0; 137 | background: #fbfbfb; 138 | border-bottom: 1px solid #ddd; } 139 | 140 | .carat { 141 | height: 10px; 142 | margin: 0 5px; } 143 | 144 | .navigation { 145 | order: 2; } 146 | @media (min-width: 768px) { 147 | .navigation { 148 | order: 1; 149 | width: 25%; 150 | max-width: 300px; 151 | padding-bottom: 64px; 152 | overflow: hidden; 153 | word-wrap: normal; 154 | background: #fbfbfb; 155 | border-right: 1px solid #ddd; } } 156 | 157 | .nav-groups { 158 | list-style-type: none; 159 | padding-left: 0; } 160 | 161 | .nav-group-name { 162 | border-bottom: 1px solid #ddd; 163 | padding: 8px 0 8px 16px; } 164 | 165 | .nav-group-name-link { 166 | color: #333; } 167 | 168 | .nav-group-tasks { 169 | margin: 8px 0; 170 | padding: 0 0 0 8px; } 171 | 172 | .nav-group-task { 173 | font-size: 1em; 174 | list-style-type: none; 175 | white-space: nowrap; } 176 | 177 | .nav-group-task-link { 178 | color: #808080; } 179 | 180 | .main-content { 181 | order: 1; } 182 | @media (min-width: 768px) { 183 | .main-content { 184 | order: 2; 185 | flex: 1; 186 | padding-bottom: 60px; } } 187 | 188 | .section { 189 | padding: 0 32px; 190 | border-bottom: 1px solid #ddd; } 191 | 192 | .section-content { 193 | max-width: 834px; 194 | margin: 0 auto; 195 | padding: 16px 0; } 196 | 197 | .section-name { 198 | color: #666; 199 | display: block; } 200 | 201 | .declaration .highlight { 202 | overflow-x: initial; 203 | padding: 8px 0; 204 | margin: 0; 205 | background-color: transparent; 206 | border: none; } 207 | 208 | .task-group-section { 209 | border-top: 1px solid #ddd; } 210 | 211 | .task-group { 212 | padding-top: 0px; } 213 | 214 | .task-name-container a[name]:before { 215 | content: ""; 216 | display: block; } 217 | 218 | .item-container { 219 | padding: 0; } 220 | 221 | .item { 222 | padding-top: 8px; 223 | width: 100%; 224 | list-style-type: none; } 225 | .item a[name]:before { 226 | content: ""; 227 | display: block; } 228 | .item .token { 229 | padding-left: 3px; 230 | margin-left: 0px; 231 | font-size: 1rem; } 232 | .item .declaration-note { 233 | font-size: .85em; 234 | color: #808080; 235 | font-style: italic; } 236 | 237 | .pointer-container { 238 | border-bottom: 1px solid #ddd; 239 | left: -23px; 240 | padding-bottom: 13px; 241 | position: relative; 242 | width: 110%; } 243 | 244 | .pointer { 245 | left: 21px; 246 | top: 7px; 247 | display: block; 248 | position: absolute; 249 | width: 12px; 250 | height: 12px; 251 | border-left: 1px solid #ddd; 252 | border-top: 1px solid #ddd; 253 | background: #fff; 254 | transform: rotate(45deg); } 255 | 256 | .height-container { 257 | display: none; 258 | position: relative; 259 | width: 100%; 260 | overflow: hidden; } 261 | .height-container .section { 262 | background: #fff; 263 | border: 1px solid #ddd; 264 | border-top-width: 0; 265 | padding-top: 10px; 266 | padding-bottom: 5px; 267 | padding: 8px 16px; } 268 | 269 | .aside, .language { 270 | padding: 6px 12px; 271 | margin: 12px 0; 272 | border-left: 5px solid #dddddd; 273 | overflow-y: hidden; } 274 | .aside .aside-title, .language .aside-title { 275 | font-size: 9px; 276 | letter-spacing: 2px; 277 | text-transform: uppercase; 278 | padding-bottom: 0; 279 | margin: 0; 280 | color: #aaa; 281 | -webkit-user-select: none; } 282 | .aside p:last-child, .language p:last-child { 283 | margin-bottom: 0; } 284 | 285 | .language { 286 | border-left: 5px solid #cde9f4; } 287 | .language .aside-title { 288 | color: #4183c4; } 289 | 290 | .aside-warning { 291 | border-left: 5px solid #ff6666; } 292 | .aside-warning .aside-title { 293 | color: #ff0000; } 294 | 295 | .graybox { 296 | border-collapse: collapse; 297 | width: 100%; } 298 | .graybox p { 299 | margin: 0; 300 | word-break: break-word; 301 | min-width: 50px; } 302 | .graybox td { 303 | border: 1px solid #ddd; 304 | padding: 5px 25px 5px 10px; 305 | vertical-align: middle; } 306 | .graybox tr td:first-of-type { 307 | text-align: right; 308 | padding: 7px; 309 | vertical-align: top; 310 | word-break: normal; 311 | width: 40px; } 312 | 313 | .slightly-smaller { 314 | font-size: 0.9em; } 315 | 316 | .footer { 317 | padding: 8px 16px; 318 | background: #444; 319 | color: #ddd; 320 | font-size: 0.8em; } 321 | .footer p { 322 | margin: 8px 0; } 323 | .footer a { 324 | color: #fff; } 325 | 326 | html.dash .header, html.dash .breadcrumbs, html.dash .navigation { 327 | display: none; } 328 | html.dash .height-container { 329 | display: block; } 330 | 331 | form[role=search] input { 332 | font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; 333 | font-size: 14px; 334 | line-height: 24px; 335 | padding: 0 10px; 336 | margin: 0; 337 | border: none; 338 | border-radius: 1em; } 339 | .loading form[role=search] input { 340 | background: white url(../img/spinner.gif) center right 4px no-repeat; } 341 | form[role=search] .tt-menu { 342 | margin: 0; 343 | min-width: 300px; 344 | background: #fbfbfb; 345 | color: #333; 346 | border: 1px solid #ddd; } 347 | form[role=search] .tt-highlight { 348 | font-weight: bold; } 349 | form[role=search] .tt-suggestion { 350 | font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; 351 | padding: 0 8px; } 352 | form[role=search] .tt-suggestion span { 353 | display: table-cell; 354 | white-space: nowrap; } 355 | form[role=search] .tt-suggestion .doc-parent-name { 356 | width: 100%; 357 | text-align: right; 358 | font-weight: normal; 359 | font-size: 0.9em; 360 | padding-left: 16px; } 361 | form[role=search] .tt-suggestion:hover, 362 | form[role=search] .tt-suggestion.tt-cursor { 363 | cursor: pointer; 364 | background-color: #4183c4; 365 | color: #fff; } 366 | form[role=search] .tt-suggestion:hover .doc-parent-name, 367 | form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { 368 | color: #fff; } 369 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleIdentifier 6 | com.jazzy. 7 | CFBundleName 8 | 9 | DocSetPlatformFamily 10 | 11 | isDashDocset 12 | 13 | dashIndexFilePath 14 | index.html 15 | isJavaScriptEnabled 16 | 17 | DashDocSetFamily 18 | dashtoc 19 | 20 | 21 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/Enums.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Enums Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 | 35 |
36 | 37 | 42 | 43 |
44 | 83 |
84 | 85 |
86 |
87 |

Enums

88 |

The following enums are available globally.

89 | 90 |
91 |
92 | 93 |
94 |
95 |
96 |
    97 |
  • 98 |
    99 | 100 | 101 | 102 | TaskEvent 103 | 104 |
    105 |
    106 |
    107 |
    108 |
    109 |
    110 |

    Event emitted by a launched Task.

    111 | 112 | See more 113 |
    114 |
    115 |

    Declaration

    116 |
    117 |

    Swift

    118 |
    public enum TaskEvent
    119 | 120 |
    121 |
    122 |
    123 |
    124 |
  • 125 |
  • 126 |
    127 | 128 | 129 | 130 | TaskError 131 | 132 |
    133 |
    134 |
    135 |
    136 |
    137 |
    138 |

    An error encountered in the execution of a Task.

    139 | 140 | See more 141 |
    142 |
    143 |

    Declaration

    144 |
    145 |

    Swift

    146 |
    public enum TaskError: Error
    147 | 148 |
    149 |
    150 |
    151 |
    152 |
  • 153 |
154 |
155 |
156 |
157 | 158 |
159 |
160 | 164 | 165 | 166 | 167 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/Extensions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Extensions Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 | 35 |
36 | 37 | 42 | 43 |
44 | 83 |
84 | 85 |
86 |
87 |

Extensions

88 |

The following extensions are available globally.

89 | 90 |
91 |
92 | 93 |
94 |
95 |
96 |
    97 |
  • 98 |
    99 | 100 | 101 | 102 | Observable 103 | 104 |
    105 |
    106 |
    107 |
    108 |
    109 |
    110 | 111 | See more 112 |
    113 |
    114 |

    Declaration

    115 |
    116 |

    Swift

    117 |
    class Observable<Element> : ObservableType
    118 | 119 |
    120 |
    121 |
    122 |
    123 |
  • 124 |
125 |
126 |
127 |
128 | 129 |
130 |
131 | 135 | 136 | 137 | 138 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/Extensions/Observable.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Observable Extension Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |

23 | 24 | Docs 25 | 26 | (100% documented) 27 |

28 | 29 |

30 |

31 | 32 |
33 |

34 | 35 | 36 |
37 | 38 | 43 | 44 |
45 | 84 |
85 | 86 |
87 |
88 |

Observable

89 |
90 |
91 |
class Observable<Element> : ObservableType
92 | 93 |
94 |
95 | 96 |
97 |
98 | 99 |
100 |
101 |
102 |
    103 |
  • 104 |
    105 | 106 | 107 | 108 | justExitStatus() 109 | 110 |
    111 |
    112 |
    113 |
    114 |
    115 |
    116 |

    Filters out the output and launch events to produce just an Observable of the exit status.

    117 | 118 |
    119 |
    120 |

    Declaration

    121 |
    122 |

    Swift

    123 |
    func justExitStatus() -> Observable<Int>
    124 | 125 |
    126 |
    127 |
    128 |
    129 |
  • 130 |
  • 131 |
    132 | 133 | 134 | 135 | justOutput() 136 | 137 |
    138 |
    139 |
    140 |
    141 |
    142 |
    143 |

    Filters out the launch and exit events to just produce and Observable of the output (stdout and stderr).

    144 | 145 |
    146 |
    147 |

    Declaration

    148 |
    149 |

    Swift

    150 |
    func justOutput() -> Observable<String>
    151 | 152 |
    153 |
    154 |
    155 |
    156 |
  • 157 |
158 |
159 |
160 |
161 | 162 |
163 |
164 | 168 | 169 | 170 | 171 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/Protocols.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Protocols Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 | 35 |
36 | 37 | 42 | 43 |
44 | 83 |
84 | 85 |
86 |
87 |

Protocols

88 |

The following protocols are available globally.

89 | 90 |
91 |
92 | 93 |
94 |
95 |
96 |
    97 |
  • 98 |
    99 | 100 | 101 | 102 | TaskEventType 103 | 104 |
    105 |
    106 |
    107 |
    108 |
    109 |
    110 |

    A protocol encapsulated TaskEvent. Necessary to create Observable operators and not intended for public use.

    111 | 112 | See more 113 |
    114 |
    115 |

    Declaration

    116 |
    117 |

    Swift

    118 |
    public protocol TaskEventType
    119 | 120 |
    121 |
    122 |
    123 |
    124 |
  • 125 |
126 |
127 |
128 |
129 | 130 |
131 |
132 | 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/Protocols/TaskEventType.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | TaskEventType Protocol Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |

23 | 24 | Docs 25 | 26 | (100% documented) 27 |

28 | 29 |

30 |

31 | 32 |
33 |

34 | 35 | 36 |
37 | 38 | 43 | 44 |
45 | 84 |
85 | 86 |
87 |
88 |

TaskEventType

89 |
90 |
91 |
public protocol TaskEventType
92 | 93 |
94 |
95 |

A protocol encapsulated TaskEvent. Necessary to create Observable operators and not intended for public use.

96 | 97 |
98 |
99 | 100 |
101 |
102 |
103 |
    104 |
  • 105 |
    106 | 107 | 108 | 109 | exitStatus 110 | 111 |
    112 |
    113 |
    114 |
    115 |
    116 |
    117 |

    The exit status code if available, nil otherwise.

    118 | 119 |
    120 |
    121 |

    Declaration

    122 |
    123 |

    Swift

    124 |
    var exitStatus: Int?
    125 | 126 |
    127 |
    128 |
    129 |
    130 |
  • 131 |
  • 132 |
    133 | 134 | 135 | 136 | output 137 | 138 |
    139 |
    140 |
    141 |
    142 |
    143 |
    144 |

    The output of the event if available, nil otherwise.

    145 | 146 |
    147 |
    148 |

    Declaration

    149 |
    150 |

    Swift

    151 |
    var output: String?
    152 | 153 |
    154 |
    155 |
    156 |
    157 |
  • 158 |
159 |
160 |
161 |
162 | 163 |
164 |
165 | 169 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/Structs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Structs Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 | 35 |
36 | 37 | 42 | 43 |
44 | 83 |
84 | 85 |
86 |
87 |

Structs

88 |

The following structs are available globally.

89 | 90 |
91 |
92 | 93 |
94 |
95 |
96 |
    97 |
  • 98 |
    99 | 100 | 101 | 102 | Task 103 | 104 |
    105 |
    106 |
    107 |
    108 |
    109 |
    110 |

    Encapsulates launching a RxSwift powered command line task.

    111 | 112 | See more 113 |
    114 |
    115 |

    Declaration

    116 |
    117 |

    Swift

    118 |
    public struct Task
    119 | 120 |
    121 |
    122 |
    123 |
    124 |
  • 125 |
126 |
127 |
128 |
129 | 130 |
131 |
132 | 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css: -------------------------------------------------------------------------------- 1 | /* Credit to https://gist.github.com/wataru420/2048287 */ 2 | .highlight { 3 | /* Comment */ 4 | /* Error */ 5 | /* Keyword */ 6 | /* Operator */ 7 | /* Comment.Multiline */ 8 | /* Comment.Preproc */ 9 | /* Comment.Single */ 10 | /* Comment.Special */ 11 | /* Generic.Deleted */ 12 | /* Generic.Deleted.Specific */ 13 | /* Generic.Emph */ 14 | /* Generic.Error */ 15 | /* Generic.Heading */ 16 | /* Generic.Inserted */ 17 | /* Generic.Inserted.Specific */ 18 | /* Generic.Output */ 19 | /* Generic.Prompt */ 20 | /* Generic.Strong */ 21 | /* Generic.Subheading */ 22 | /* Generic.Traceback */ 23 | /* Keyword.Constant */ 24 | /* Keyword.Declaration */ 25 | /* Keyword.Pseudo */ 26 | /* Keyword.Reserved */ 27 | /* Keyword.Type */ 28 | /* Literal.Number */ 29 | /* Literal.String */ 30 | /* Name.Attribute */ 31 | /* Name.Builtin */ 32 | /* Name.Class */ 33 | /* Name.Constant */ 34 | /* Name.Entity */ 35 | /* Name.Exception */ 36 | /* Name.Function */ 37 | /* Name.Namespace */ 38 | /* Name.Tag */ 39 | /* Name.Variable */ 40 | /* Operator.Word */ 41 | /* Text.Whitespace */ 42 | /* Literal.Number.Float */ 43 | /* Literal.Number.Hex */ 44 | /* Literal.Number.Integer */ 45 | /* Literal.Number.Oct */ 46 | /* Literal.String.Backtick */ 47 | /* Literal.String.Char */ 48 | /* Literal.String.Doc */ 49 | /* Literal.String.Double */ 50 | /* Literal.String.Escape */ 51 | /* Literal.String.Heredoc */ 52 | /* Literal.String.Interpol */ 53 | /* Literal.String.Other */ 54 | /* Literal.String.Regex */ 55 | /* Literal.String.Single */ 56 | /* Literal.String.Symbol */ 57 | /* Name.Builtin.Pseudo */ 58 | /* Name.Variable.Class */ 59 | /* Name.Variable.Global */ 60 | /* Name.Variable.Instance */ 61 | /* Literal.Number.Integer.Long */ } 62 | .highlight .c { 63 | color: #999988; 64 | font-style: italic; } 65 | .highlight .err { 66 | color: #a61717; 67 | background-color: #e3d2d2; } 68 | .highlight .k { 69 | color: #000000; 70 | font-weight: bold; } 71 | .highlight .o { 72 | color: #000000; 73 | font-weight: bold; } 74 | .highlight .cm { 75 | color: #999988; 76 | font-style: italic; } 77 | .highlight .cp { 78 | color: #999999; 79 | font-weight: bold; } 80 | .highlight .c1 { 81 | color: #999988; 82 | font-style: italic; } 83 | .highlight .cs { 84 | color: #999999; 85 | font-weight: bold; 86 | font-style: italic; } 87 | .highlight .gd { 88 | color: #000000; 89 | background-color: #ffdddd; } 90 | .highlight .gd .x { 91 | color: #000000; 92 | background-color: #ffaaaa; } 93 | .highlight .ge { 94 | color: #000000; 95 | font-style: italic; } 96 | .highlight .gr { 97 | color: #aa0000; } 98 | .highlight .gh { 99 | color: #999999; } 100 | .highlight .gi { 101 | color: #000000; 102 | background-color: #ddffdd; } 103 | .highlight .gi .x { 104 | color: #000000; 105 | background-color: #aaffaa; } 106 | .highlight .go { 107 | color: #888888; } 108 | .highlight .gp { 109 | color: #555555; } 110 | .highlight .gs { 111 | font-weight: bold; } 112 | .highlight .gu { 113 | color: #aaaaaa; } 114 | .highlight .gt { 115 | color: #aa0000; } 116 | .highlight .kc { 117 | color: #000000; 118 | font-weight: bold; } 119 | .highlight .kd { 120 | color: #000000; 121 | font-weight: bold; } 122 | .highlight .kp { 123 | color: #000000; 124 | font-weight: bold; } 125 | .highlight .kr { 126 | color: #000000; 127 | font-weight: bold; } 128 | .highlight .kt { 129 | color: #445588; } 130 | .highlight .m { 131 | color: #009999; } 132 | .highlight .s { 133 | color: #d14; } 134 | .highlight .na { 135 | color: #008080; } 136 | .highlight .nb { 137 | color: #0086B3; } 138 | .highlight .nc { 139 | color: #445588; 140 | font-weight: bold; } 141 | .highlight .no { 142 | color: #008080; } 143 | .highlight .ni { 144 | color: #800080; } 145 | .highlight .ne { 146 | color: #990000; 147 | font-weight: bold; } 148 | .highlight .nf { 149 | color: #990000; } 150 | .highlight .nn { 151 | color: #555555; } 152 | .highlight .nt { 153 | color: #000080; } 154 | .highlight .nv { 155 | color: #008080; } 156 | .highlight .ow { 157 | color: #000000; 158 | font-weight: bold; } 159 | .highlight .w { 160 | color: #bbbbbb; } 161 | .highlight .mf { 162 | color: #009999; } 163 | .highlight .mh { 164 | color: #009999; } 165 | .highlight .mi { 166 | color: #009999; } 167 | .highlight .mo { 168 | color: #009999; } 169 | .highlight .sb { 170 | color: #d14; } 171 | .highlight .sc { 172 | color: #d14; } 173 | .highlight .sd { 174 | color: #d14; } 175 | .highlight .s2 { 176 | color: #d14; } 177 | .highlight .se { 178 | color: #d14; } 179 | .highlight .sh { 180 | color: #d14; } 181 | .highlight .si { 182 | color: #d14; } 183 | .highlight .sx { 184 | color: #d14; } 185 | .highlight .sr { 186 | color: #009926; } 187 | .highlight .s1 { 188 | color: #d14; } 189 | .highlight .ss { 190 | color: #990073; } 191 | .highlight .bp { 192 | color: #999999; } 193 | .highlight .vc { 194 | color: #008080; } 195 | .highlight .vg { 196 | color: #008080; } 197 | .highlight .vi { 198 | color: #008080; } 199 | .highlight .il { 200 | color: #009999; } 201 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css: -------------------------------------------------------------------------------- 1 | *, *:before, *:after { 2 | box-sizing: inherit; } 3 | 4 | body { 5 | margin: 0; 6 | background: #fff; 7 | color: #333; 8 | font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; 9 | letter-spacing: .2px; 10 | -webkit-font-smoothing: antialiased; 11 | box-sizing: border-box; } 12 | 13 | h1 { 14 | font-size: 2rem; 15 | font-weight: 700; 16 | margin: 1.275em 0 0.6em; } 17 | 18 | h2 { 19 | font-size: 1.75rem; 20 | font-weight: 700; 21 | margin: 1.275em 0 0.3em; } 22 | 23 | h3 { 24 | font-size: 1.5rem; 25 | font-weight: 700; 26 | margin: 1em 0 0.3em; } 27 | 28 | h4 { 29 | font-size: 1.25rem; 30 | font-weight: 700; 31 | margin: 1.275em 0 0.85em; } 32 | 33 | h5 { 34 | font-size: 1rem; 35 | font-weight: 700; 36 | margin: 1.275em 0 0.85em; } 37 | 38 | h6 { 39 | font-size: 1rem; 40 | font-weight: 700; 41 | margin: 1.275em 0 0.85em; 42 | color: #777; } 43 | 44 | p { 45 | margin: 0 0 1em; } 46 | 47 | ul, ol { 48 | padding: 0 0 0 2em; 49 | margin: 0 0 0.85em; } 50 | 51 | blockquote { 52 | margin: 0 0 0.85em; 53 | padding: 0 15px; 54 | color: #858585; 55 | border-left: 4px solid #e5e5e5; } 56 | 57 | img { 58 | max-width: 100%; } 59 | 60 | a { 61 | color: #4183c4; 62 | text-decoration: none; } 63 | a:hover, a:focus { 64 | outline: 0; 65 | text-decoration: underline; } 66 | 67 | table { 68 | background: #fff; 69 | width: 100%; 70 | border-collapse: collapse; 71 | border-spacing: 0; 72 | overflow: auto; 73 | margin: 0 0 0.85em; } 74 | 75 | tr:nth-child(2n) { 76 | background-color: #fbfbfb; } 77 | 78 | th, td { 79 | padding: 6px 13px; 80 | border: 1px solid #ddd; } 81 | 82 | pre { 83 | margin: 0 0 1.275em; 84 | padding: .85em 1em; 85 | overflow: auto; 86 | background: #f7f7f7; 87 | font-size: .85em; 88 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } 89 | 90 | code { 91 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } 92 | 93 | p > code, li > code { 94 | background: #f7f7f7; 95 | padding: .2em; } 96 | p > code:before, p > code:after, li > code:before, li > code:after { 97 | letter-spacing: -.2em; 98 | content: "\00a0"; } 99 | 100 | pre code { 101 | padding: 0; 102 | white-space: pre; } 103 | 104 | .content-wrapper { 105 | display: flex; 106 | flex-direction: column; } 107 | @media (min-width: 768px) { 108 | .content-wrapper { 109 | flex-direction: row; } } 110 | 111 | .header { 112 | display: flex; 113 | padding: 8px; 114 | font-size: 0.875em; 115 | background: #444; 116 | color: #999; } 117 | 118 | .header-col { 119 | margin: 0; 120 | padding: 0 8px; } 121 | 122 | .header-col--primary { 123 | flex: 1; } 124 | 125 | .header-link { 126 | color: #fff; } 127 | 128 | .header-icon { 129 | padding-right: 6px; 130 | vertical-align: -4px; 131 | height: 16px; } 132 | 133 | .breadcrumbs { 134 | font-size: 0.875em; 135 | padding: 8px 16px; 136 | margin: 0; 137 | background: #fbfbfb; 138 | border-bottom: 1px solid #ddd; } 139 | 140 | .carat { 141 | height: 10px; 142 | margin: 0 5px; } 143 | 144 | .navigation { 145 | order: 2; } 146 | @media (min-width: 768px) { 147 | .navigation { 148 | order: 1; 149 | width: 25%; 150 | max-width: 300px; 151 | padding-bottom: 64px; 152 | overflow: hidden; 153 | word-wrap: normal; 154 | background: #fbfbfb; 155 | border-right: 1px solid #ddd; } } 156 | 157 | .nav-groups { 158 | list-style-type: none; 159 | padding-left: 0; } 160 | 161 | .nav-group-name { 162 | border-bottom: 1px solid #ddd; 163 | padding: 8px 0 8px 16px; } 164 | 165 | .nav-group-name-link { 166 | color: #333; } 167 | 168 | .nav-group-tasks { 169 | margin: 8px 0; 170 | padding: 0 0 0 8px; } 171 | 172 | .nav-group-task { 173 | font-size: 1em; 174 | list-style-type: none; 175 | white-space: nowrap; } 176 | 177 | .nav-group-task-link { 178 | color: #808080; } 179 | 180 | .main-content { 181 | order: 1; } 182 | @media (min-width: 768px) { 183 | .main-content { 184 | order: 2; 185 | flex: 1; 186 | padding-bottom: 60px; } } 187 | 188 | .section { 189 | padding: 0 32px; 190 | border-bottom: 1px solid #ddd; } 191 | 192 | .section-content { 193 | max-width: 834px; 194 | margin: 0 auto; 195 | padding: 16px 0; } 196 | 197 | .section-name { 198 | color: #666; 199 | display: block; } 200 | 201 | .declaration .highlight { 202 | overflow-x: initial; 203 | padding: 8px 0; 204 | margin: 0; 205 | background-color: transparent; 206 | border: none; } 207 | 208 | .task-group-section { 209 | border-top: 1px solid #ddd; } 210 | 211 | .task-group { 212 | padding-top: 0px; } 213 | 214 | .task-name-container a[name]:before { 215 | content: ""; 216 | display: block; } 217 | 218 | .item-container { 219 | padding: 0; } 220 | 221 | .item { 222 | padding-top: 8px; 223 | width: 100%; 224 | list-style-type: none; } 225 | .item a[name]:before { 226 | content: ""; 227 | display: block; } 228 | .item .token { 229 | padding-left: 3px; 230 | margin-left: 0px; 231 | font-size: 1rem; } 232 | .item .declaration-note { 233 | font-size: .85em; 234 | color: #808080; 235 | font-style: italic; } 236 | 237 | .pointer-container { 238 | border-bottom: 1px solid #ddd; 239 | left: -23px; 240 | padding-bottom: 13px; 241 | position: relative; 242 | width: 110%; } 243 | 244 | .pointer { 245 | left: 21px; 246 | top: 7px; 247 | display: block; 248 | position: absolute; 249 | width: 12px; 250 | height: 12px; 251 | border-left: 1px solid #ddd; 252 | border-top: 1px solid #ddd; 253 | background: #fff; 254 | transform: rotate(45deg); } 255 | 256 | .height-container { 257 | display: none; 258 | position: relative; 259 | width: 100%; 260 | overflow: hidden; } 261 | .height-container .section { 262 | background: #fff; 263 | border: 1px solid #ddd; 264 | border-top-width: 0; 265 | padding-top: 10px; 266 | padding-bottom: 5px; 267 | padding: 8px 16px; } 268 | 269 | .aside, .language { 270 | padding: 6px 12px; 271 | margin: 12px 0; 272 | border-left: 5px solid #dddddd; 273 | overflow-y: hidden; } 274 | .aside .aside-title, .language .aside-title { 275 | font-size: 9px; 276 | letter-spacing: 2px; 277 | text-transform: uppercase; 278 | padding-bottom: 0; 279 | margin: 0; 280 | color: #aaa; 281 | -webkit-user-select: none; } 282 | .aside p:last-child, .language p:last-child { 283 | margin-bottom: 0; } 284 | 285 | .language { 286 | border-left: 5px solid #cde9f4; } 287 | .language .aside-title { 288 | color: #4183c4; } 289 | 290 | .aside-warning { 291 | border-left: 5px solid #ff6666; } 292 | .aside-warning .aside-title { 293 | color: #ff0000; } 294 | 295 | .graybox { 296 | border-collapse: collapse; 297 | width: 100%; } 298 | .graybox p { 299 | margin: 0; 300 | word-break: break-word; 301 | min-width: 50px; } 302 | .graybox td { 303 | border: 1px solid #ddd; 304 | padding: 5px 25px 5px 10px; 305 | vertical-align: middle; } 306 | .graybox tr td:first-of-type { 307 | text-align: right; 308 | padding: 7px; 309 | vertical-align: top; 310 | word-break: normal; 311 | width: 40px; } 312 | 313 | .slightly-smaller { 314 | font-size: 0.9em; } 315 | 316 | .footer { 317 | padding: 8px 16px; 318 | background: #444; 319 | color: #ddd; 320 | font-size: 0.8em; } 321 | .footer p { 322 | margin: 8px 0; } 323 | .footer a { 324 | color: #fff; } 325 | 326 | html.dash .header, html.dash .breadcrumbs, html.dash .navigation { 327 | display: none; } 328 | html.dash .height-container { 329 | display: block; } 330 | 331 | form[role=search] input { 332 | font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; 333 | font-size: 14px; 334 | line-height: 24px; 335 | padding: 0 10px; 336 | margin: 0; 337 | border: none; 338 | border-radius: 1em; } 339 | .loading form[role=search] input { 340 | background: white url(../img/spinner.gif) center right 4px no-repeat; } 341 | form[role=search] .tt-menu { 342 | margin: 0; 343 | min-width: 300px; 344 | background: #fbfbfb; 345 | color: #333; 346 | border: 1px solid #ddd; } 347 | form[role=search] .tt-highlight { 348 | font-weight: bold; } 349 | form[role=search] .tt-suggestion { 350 | font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; 351 | padding: 0 8px; } 352 | form[role=search] .tt-suggestion span { 353 | display: table-cell; 354 | white-space: nowrap; } 355 | form[role=search] .tt-suggestion .doc-parent-name { 356 | width: 100%; 357 | text-align: right; 358 | font-weight: normal; 359 | font-size: 0.9em; 360 | padding-left: 16px; } 361 | form[role=search] .tt-suggestion:hover, 362 | form[role=search] .tt-suggestion.tt-cursor { 363 | cursor: pointer; 364 | background-color: #4183c4; 365 | color: #fff; } 366 | form[role=search] .tt-suggestion:hover .doc-parent-name, 367 | form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { 368 | color: #fff; } 369 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/img/carat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/img/dash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/img/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/img/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/.docset/Contents/Resources/Documents/img/spinner.gif -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js: -------------------------------------------------------------------------------- 1 | window.jazzy = {'docset': false} 2 | if (typeof window.dash != 'undefined') { 3 | document.documentElement.className += ' dash' 4 | window.jazzy.docset = true 5 | } 6 | if (navigator.userAgent.match(/xcode/i)) { 7 | document.documentElement.className += ' xcode' 8 | window.jazzy.docset = true 9 | } 10 | 11 | // On doc load, toggle the URL hash discussion if present 12 | $(document).ready(function() { 13 | if (!window.jazzy.docset) { 14 | var linkToHash = $('a[href="' + window.location.hash +'"]'); 15 | linkToHash.trigger("click"); 16 | } 17 | }); 18 | 19 | // On token click, toggle its discussion and animate token.marginLeft 20 | $(".token").click(function(event) { 21 | if (window.jazzy.docset) { 22 | return; 23 | } 24 | var link = $(this); 25 | var animationDuration = 300; 26 | $content = link.parent().parent().next(); 27 | $content.slideToggle(animationDuration); 28 | 29 | // Keeps the document from jumping to the hash. 30 | var href = $(this).attr('href'); 31 | if (history.pushState) { 32 | history.pushState({}, '', href); 33 | } else { 34 | location.hash = href; 35 | } 36 | event.preventDefault(); 37 | }); 38 | 39 | // Dumb down quotes within code blocks that delimit strings instead of quotations 40 | // https://github.com/realm/jazzy/issues/714 41 | $("code q").replaceWith(function () { 42 | return ["\"", $(this).contents(), "\""]; 43 | }); 44 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.search.js: -------------------------------------------------------------------------------- 1 | $(function(){ 2 | var searchIndex = lunr(function() { 3 | this.ref('url'); 4 | this.field('name'); 5 | }); 6 | 7 | var $typeahead = $('[data-typeahead]'); 8 | var $form = $typeahead.parents('form'); 9 | var searchURL = $form.attr('action'); 10 | 11 | function displayTemplate(result) { 12 | return result.name; 13 | } 14 | 15 | function suggestionTemplate(result) { 16 | var t = '
'; 17 | t += '' + result.name + ''; 18 | if (result.parent_name) { 19 | t += '' + result.parent_name + ''; 20 | } 21 | t += '
'; 22 | return t; 23 | } 24 | 25 | $typeahead.one('focus', function() { 26 | $form.addClass('loading'); 27 | 28 | $.getJSON(searchURL).then(function(searchData) { 29 | $.each(searchData, function (url, doc) { 30 | searchIndex.add({url: url, name: doc.name}); 31 | }); 32 | 33 | $typeahead.typeahead( 34 | { 35 | highlight: true, 36 | minLength: 3 37 | }, 38 | { 39 | limit: 10, 40 | display: displayTemplate, 41 | templates: { suggestion: suggestionTemplate }, 42 | source: function(query, sync) { 43 | var results = searchIndex.search(query).map(function(result) { 44 | var doc = searchData[result.ref]; 45 | doc.url = result.ref; 46 | return doc; 47 | }); 48 | sync(results); 49 | } 50 | } 51 | ); 52 | $form.removeClass('loading'); 53 | $typeahead.trigger('focus'); 54 | }); 55 | }); 56 | 57 | var baseURL = searchURL.slice(0, -"search.json".length); 58 | 59 | $typeahead.on('typeahead:select', function(e, result) { 60 | window.location = baseURL + result.url; 61 | }); 62 | }); 63 | -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/search.json: -------------------------------------------------------------------------------- 1 | {"Structs/Task.html#/s:FV6RxTask4TaskcFT10launchPathSS9argumentsGSaSS_16workingDirectoryGSqSS_11environmentGSqGVs10DictionarySSSS___S0_":{"name":"init(launchPath:arguments:workingDirectory:environment:)","abstract":"

Create a new task.

","parent_name":"Task"},"Structs/Task.html#/s:FV6RxTask4Task6launchFT_GC7RxSwift10ObservableOS_9TaskEvent_":{"name":"launch()","abstract":"

Launch the Task.

","parent_name":"Task"},"Structs/Task.html":{"name":"Task","abstract":"

Encapsulates launching a RxSwift powered command line task.

"},"Protocols/TaskEventType.html#/s:vP6RxTask13TaskEventType10exitStatusGSqSi_":{"name":"exitStatus","abstract":"

The exit status code if available, nil otherwise.

","parent_name":"TaskEventType"},"Protocols/TaskEventType.html#/s:vP6RxTask13TaskEventType6outputGSqSS_":{"name":"output","abstract":"

The output of the event if available, nil otherwise.

","parent_name":"TaskEventType"},"Protocols/TaskEventType.html":{"name":"TaskEventType","abstract":"

A protocol encapsulated TaskEvent. Necessary to create Observable operators and not intended for public use.

"},"Extensions/Observable.html#/s:Fe6RxTaskRxS_13TaskEventTyperC7RxSwift10Observable14justExitStatusFT_GS2_Si_":{"name":"justExitStatus()","abstract":"

Filters out the output and launch events to produce just an Observable of the exit status.

","parent_name":"Observable"},"Extensions/Observable.html#/s:Fe6RxTaskRxS_13TaskEventTyperC7RxSwift10Observable10justOutputFT_GS2_SS_":{"name":"justOutput()","abstract":"

Filters out the launch and exit events to just produce and Observable of the output (stdout and stderr).

","parent_name":"Observable"},"Extensions/Observable.html":{"name":"Observable"},"Enums/TaskError.html#/s:FO6RxTask9TaskError14uncaughtSignalFMS0_S0_":{"name":"uncaughtSignal","abstract":"

An uncaught signal was encountered.

","parent_name":"TaskError"},"Enums/TaskError.html#/s:FO6RxTask9TaskError4exitFMS0_FT10statusCodeSi_S0_":{"name":"exit","abstract":"

The Task exited unsuccessfully.

","parent_name":"TaskError"},"Enums/TaskError.html#/s:ZFO6RxTask9TaskErroroi2eeFTS0_S0__Sb":{"name":"==(_:_:)","abstract":"

Equates two TaskErrors.

","parent_name":"TaskError"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent6launchFMS0_FT7commandSS_S0_":{"name":"launch","abstract":"

The Task has launched.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent6stdOutFMS0_FSSS0_":{"name":"stdOut","abstract":"

The Task has output to stdout.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent6stdErrFMS0_FSSS0_":{"name":"stdErr","abstract":"

The Task has output to stderr.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent4exitFMS0_FT10statusCodeSi_S0_":{"name":"exit","abstract":"

The Task exited successfully.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:ZFO6RxTask9TaskEventoi2eeFTS0_S0__Sb":{"name":"==(_:_:)","abstract":"

Equates two TaskEvents.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:vO6RxTask9TaskEvent10exitStatusGSqSi_":{"name":"exitStatus","abstract":"

The exit status code if available, nil otherwise.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:vO6RxTask9TaskEvent6outputGSqSS_":{"name":"output","abstract":"

The output of the event if available, nil otherwise.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html":{"name":"TaskEvent","abstract":"

Event emitted by a launched Task.

"},"Enums/TaskError.html":{"name":"TaskError","abstract":"

An error encountered in the execution of a Task.

"},"Enums.html":{"name":"Enums","abstract":"The following enums are available globally."},"Extensions.html":{"name":"Extensions","abstract":"The following extensions are available globally."},"Protocols.html":{"name":"Protocols","abstract":"The following protocols are available globally."},"Structs.html":{"name":"Structs","abstract":"The following structs are available globally."}} -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/Documents/undocumented.json: -------------------------------------------------------------------------------- 1 | { 2 | "warnings": [ 3 | 4 | ], 5 | "source_directory": "/Users/scottrhoyt/Development/RxTask" 6 | } -------------------------------------------------------------------------------- /docs/docsets/.docset/Contents/Resources/docSet.dsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/.docset/Contents/Resources/docSet.dsidx -------------------------------------------------------------------------------- /docs/docsets/.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/.tgz -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleIdentifier 6 | com.jazzy.rxtask 7 | CFBundleName 8 | RxTask 9 | DocSetPlatformFamily 10 | rxtask 11 | isDashDocset 12 | 13 | dashIndexFilePath 14 | index.html 15 | isJavaScriptEnabled 16 | 17 | DashDocSetFamily 18 | dashtoc 19 | 20 | 21 | -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/Enums.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Enums Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | RxTask Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 |

35 | 36 | 37 | View on GitHub 38 | 39 |

40 | 41 |
42 | 43 | 48 | 49 |
50 | 89 |
90 | 91 |
92 |
93 |

Enums

94 |

The following enums are available globally.

95 | 96 |
97 |
98 | 99 |
100 |
101 |
102 |
    103 |
  • 104 |
    105 | 106 | 107 | 108 | TaskEvent 109 | 110 |
    111 |
    112 |
    113 |
    114 |
    115 |
    116 |

    Event emitted by a launched Task.

    117 | 118 | See more 119 |
    120 |
    121 |

    Declaration

    122 |
    123 |

    Swift

    124 |
    public enum TaskEvent
    125 | 126 |
    127 |
    128 |
    129 |
    130 |
  • 131 |
  • 132 |
    133 | 134 | 135 | 136 | TaskError 137 | 138 |
    139 |
    140 |
    141 |
    142 |
    143 |
    144 |

    An error encountered in the execution of a Task.

    145 | 146 | See more 147 |
    148 |
    149 |

    Declaration

    150 |
    151 |

    Swift

    152 |
    public enum TaskError: Error
    153 | 154 |
    155 |
    156 |
    157 |
    158 |
  • 159 |
160 |
161 |
162 |
163 | 164 |
165 |
166 | 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/Extensions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Extensions Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | RxTask Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 |

35 | 36 | 37 | View on GitHub 38 | 39 |

40 | 41 |
42 | 43 | 48 | 49 |
50 | 89 |
90 | 91 |
92 |
93 |

Extensions

94 |

The following extensions are available globally.

95 | 96 |
97 |
98 | 99 |
100 |
101 |
102 |
    103 |
  • 104 |
    105 | 106 | 107 | 108 | Observable 109 | 110 |
    111 |
    112 |
    113 |
    114 |
    115 |
    116 | 117 | See more 118 |
    119 |
    120 |

    Declaration

    121 |
    122 |

    Swift

    123 |
    class Observable<Element> : ObservableType
    124 | 125 |
    126 |
    127 |
    128 |
    129 |
  • 130 |
131 |
132 |
133 |
134 | 135 |
136 |
137 | 141 | 142 | 143 | 144 | -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/Extensions/Observable.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Observable Extension Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |

23 | 24 | RxTask Docs 25 | 26 | (100% documented) 27 |

28 | 29 |

30 |

31 | 32 |
33 |

34 | 35 |

36 | 37 | 38 | View on GitHub 39 | 40 |

41 | 42 |
43 | 44 | 49 | 50 |
51 | 90 |
91 | 92 |
93 |
94 |

Observable

95 |
96 |
97 |
class Observable<Element> : ObservableType
98 | 99 |
100 |
101 | 102 |
103 |
104 | 105 |
106 |
107 |
108 |
    109 |
  • 110 |
    111 | 112 | 113 | 114 | justExitStatus() 115 | 116 |
    117 |
    118 |
    119 |
    120 |
    121 |
    122 |

    Filters out the output and launch events to produce just an Observable of the exit status.

    123 | 124 |
    125 |
    126 |

    Declaration

    127 |
    128 |

    Swift

    129 |
    func justExitStatus() -> Observable<Int>
    130 | 131 |
    132 |
    133 |
    134 |
    135 |
  • 136 |
  • 137 |
    138 | 139 | 140 | 141 | justOutput() 142 | 143 |
    144 |
    145 |
    146 |
    147 |
    148 |
    149 |

    Filters out the launch and exit events to just produce and Observable of the output (stdout and stderr).

    150 | 151 |
    152 |
    153 |

    Declaration

    154 |
    155 |

    Swift

    156 |
    func justOutput() -> Observable<Data>
    157 | 158 |
    159 |
    160 |
    161 |
    162 |
  • 163 |
164 |
165 |
166 |
167 | 168 |
169 |
170 | 174 | 175 | 176 | 177 | -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/Protocols.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Protocols Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | RxTask Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 |

35 | 36 | 37 | View on GitHub 38 | 39 |

40 | 41 |
42 | 43 | 48 | 49 |
50 | 89 |
90 | 91 |
92 |
93 |

Protocols

94 |

The following protocols are available globally.

95 | 96 |
97 |
98 | 99 |
100 |
101 |
102 |
    103 |
  • 104 |
    105 | 106 | 107 | 108 | TaskEventType 109 | 110 |
    111 |
    112 |
    113 |
    114 |
    115 |
    116 |

    A protocol encapsulated TaskEvent. Necessary to create Observable operators and not intended for public use.

    117 | 118 | See more 119 |
    120 |
    121 |

    Declaration

    122 |
    123 |

    Swift

    124 |
    public protocol TaskEventType
    125 | 126 |
    127 |
    128 |
    129 |
    130 |
  • 131 |
132 |
133 |
134 |
135 | 136 |
137 |
138 | 142 | 143 | 144 | 145 | -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/Protocols/TaskEventType.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | TaskEventType Protocol Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |

23 | 24 | RxTask Docs 25 | 26 | (100% documented) 27 |

28 | 29 |

30 |

31 | 32 |
33 |

34 | 35 |

36 | 37 | 38 | View on GitHub 39 | 40 |

41 | 42 |
43 | 44 | 49 | 50 |
51 | 90 |
91 | 92 |
93 |
94 |

TaskEventType

95 |
96 |
97 |
public protocol TaskEventType
98 | 99 |
100 |
101 |

A protocol encapsulated TaskEvent. Necessary to create Observable operators and not intended for public use.

102 | 103 |
104 |
105 | 106 |
107 |
108 |
109 |
    110 |
  • 111 |
    112 | 113 | 114 | 115 | exitStatus 116 | 117 |
    118 |
    119 |
    120 |
    121 |
    122 |
    123 |

    The exit status code if available, nil otherwise.

    124 | 125 |
    126 |
    127 |

    Declaration

    128 |
    129 |

    Swift

    130 |
    var exitStatus: Int?
    131 | 132 |
    133 |
    134 |
    135 |
    136 |
  • 137 |
  • 138 |
    139 | 140 | 141 | 142 | output 143 | 144 |
    145 |
    146 |
    147 |
    148 |
    149 |
    150 |

    The output of the event if available, nil otherwise.

    151 | 152 |
    153 |
    154 |

    Declaration

    155 |
    156 |

    Swift

    157 |
    var output: Data?
    158 | 159 |
    160 |
    161 |
    162 |
    163 |
  • 164 |
165 |
166 |
167 |
168 | 169 |
170 |
171 | 175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/Structs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Structs Reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |

22 | 23 | RxTask Docs 24 | 25 | (100% documented) 26 |

27 | 28 |

29 |

30 | 31 |
32 |

33 | 34 |

35 | 36 | 37 | View on GitHub 38 | 39 |

40 | 41 |
42 | 43 | 48 | 49 |
50 | 89 |
90 | 91 |
92 |
93 |

Structs

94 |

The following structs are available globally.

95 | 96 |
97 |
98 | 99 |
100 |
101 |
102 |
    103 |
  • 104 |
    105 | 106 | 107 | 108 | Task 109 | 110 |
    111 |
    112 |
    113 |
    114 |
    115 |
    116 |

    Encapsulates launching a RxSwift powered command line task.

    117 | 118 | See more 119 |
    120 |
    121 |

    Declaration

    122 |
    123 |

    Swift

    124 |
    public struct Task
    125 | 126 |
    127 |
    128 |
    129 |
    130 |
  • 131 |
132 |
133 |
134 |
135 | 136 |
137 |
138 | 142 | 143 | 144 | 145 | -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/badge.svg: -------------------------------------------------------------------------------- 1 | documentationdocumentation100%100% -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/css/highlight.css: -------------------------------------------------------------------------------- 1 | /* Credit to https://gist.github.com/wataru420/2048287 */ 2 | .highlight { 3 | /* Comment */ 4 | /* Error */ 5 | /* Keyword */ 6 | /* Operator */ 7 | /* Comment.Multiline */ 8 | /* Comment.Preproc */ 9 | /* Comment.Single */ 10 | /* Comment.Special */ 11 | /* Generic.Deleted */ 12 | /* Generic.Deleted.Specific */ 13 | /* Generic.Emph */ 14 | /* Generic.Error */ 15 | /* Generic.Heading */ 16 | /* Generic.Inserted */ 17 | /* Generic.Inserted.Specific */ 18 | /* Generic.Output */ 19 | /* Generic.Prompt */ 20 | /* Generic.Strong */ 21 | /* Generic.Subheading */ 22 | /* Generic.Traceback */ 23 | /* Keyword.Constant */ 24 | /* Keyword.Declaration */ 25 | /* Keyword.Pseudo */ 26 | /* Keyword.Reserved */ 27 | /* Keyword.Type */ 28 | /* Literal.Number */ 29 | /* Literal.String */ 30 | /* Name.Attribute */ 31 | /* Name.Builtin */ 32 | /* Name.Class */ 33 | /* Name.Constant */ 34 | /* Name.Entity */ 35 | /* Name.Exception */ 36 | /* Name.Function */ 37 | /* Name.Namespace */ 38 | /* Name.Tag */ 39 | /* Name.Variable */ 40 | /* Operator.Word */ 41 | /* Text.Whitespace */ 42 | /* Literal.Number.Float */ 43 | /* Literal.Number.Hex */ 44 | /* Literal.Number.Integer */ 45 | /* Literal.Number.Oct */ 46 | /* Literal.String.Backtick */ 47 | /* Literal.String.Char */ 48 | /* Literal.String.Doc */ 49 | /* Literal.String.Double */ 50 | /* Literal.String.Escape */ 51 | /* Literal.String.Heredoc */ 52 | /* Literal.String.Interpol */ 53 | /* Literal.String.Other */ 54 | /* Literal.String.Regex */ 55 | /* Literal.String.Single */ 56 | /* Literal.String.Symbol */ 57 | /* Name.Builtin.Pseudo */ 58 | /* Name.Variable.Class */ 59 | /* Name.Variable.Global */ 60 | /* Name.Variable.Instance */ 61 | /* Literal.Number.Integer.Long */ } 62 | .highlight .c { 63 | color: #999988; 64 | font-style: italic; } 65 | .highlight .err { 66 | color: #a61717; 67 | background-color: #e3d2d2; } 68 | .highlight .k { 69 | color: #000000; 70 | font-weight: bold; } 71 | .highlight .o { 72 | color: #000000; 73 | font-weight: bold; } 74 | .highlight .cm { 75 | color: #999988; 76 | font-style: italic; } 77 | .highlight .cp { 78 | color: #999999; 79 | font-weight: bold; } 80 | .highlight .c1 { 81 | color: #999988; 82 | font-style: italic; } 83 | .highlight .cs { 84 | color: #999999; 85 | font-weight: bold; 86 | font-style: italic; } 87 | .highlight .gd { 88 | color: #000000; 89 | background-color: #ffdddd; } 90 | .highlight .gd .x { 91 | color: #000000; 92 | background-color: #ffaaaa; } 93 | .highlight .ge { 94 | color: #000000; 95 | font-style: italic; } 96 | .highlight .gr { 97 | color: #aa0000; } 98 | .highlight .gh { 99 | color: #999999; } 100 | .highlight .gi { 101 | color: #000000; 102 | background-color: #ddffdd; } 103 | .highlight .gi .x { 104 | color: #000000; 105 | background-color: #aaffaa; } 106 | .highlight .go { 107 | color: #888888; } 108 | .highlight .gp { 109 | color: #555555; } 110 | .highlight .gs { 111 | font-weight: bold; } 112 | .highlight .gu { 113 | color: #aaaaaa; } 114 | .highlight .gt { 115 | color: #aa0000; } 116 | .highlight .kc { 117 | color: #000000; 118 | font-weight: bold; } 119 | .highlight .kd { 120 | color: #000000; 121 | font-weight: bold; } 122 | .highlight .kp { 123 | color: #000000; 124 | font-weight: bold; } 125 | .highlight .kr { 126 | color: #000000; 127 | font-weight: bold; } 128 | .highlight .kt { 129 | color: #445588; } 130 | .highlight .m { 131 | color: #009999; } 132 | .highlight .s { 133 | color: #d14; } 134 | .highlight .na { 135 | color: #008080; } 136 | .highlight .nb { 137 | color: #0086B3; } 138 | .highlight .nc { 139 | color: #445588; 140 | font-weight: bold; } 141 | .highlight .no { 142 | color: #008080; } 143 | .highlight .ni { 144 | color: #800080; } 145 | .highlight .ne { 146 | color: #990000; 147 | font-weight: bold; } 148 | .highlight .nf { 149 | color: #990000; } 150 | .highlight .nn { 151 | color: #555555; } 152 | .highlight .nt { 153 | color: #000080; } 154 | .highlight .nv { 155 | color: #008080; } 156 | .highlight .ow { 157 | color: #000000; 158 | font-weight: bold; } 159 | .highlight .w { 160 | color: #bbbbbb; } 161 | .highlight .mf { 162 | color: #009999; } 163 | .highlight .mh { 164 | color: #009999; } 165 | .highlight .mi { 166 | color: #009999; } 167 | .highlight .mo { 168 | color: #009999; } 169 | .highlight .sb { 170 | color: #d14; } 171 | .highlight .sc { 172 | color: #d14; } 173 | .highlight .sd { 174 | color: #d14; } 175 | .highlight .s2 { 176 | color: #d14; } 177 | .highlight .se { 178 | color: #d14; } 179 | .highlight .sh { 180 | color: #d14; } 181 | .highlight .si { 182 | color: #d14; } 183 | .highlight .sx { 184 | color: #d14; } 185 | .highlight .sr { 186 | color: #009926; } 187 | .highlight .s1 { 188 | color: #d14; } 189 | .highlight .ss { 190 | color: #990073; } 191 | .highlight .bp { 192 | color: #999999; } 193 | .highlight .vc { 194 | color: #008080; } 195 | .highlight .vg { 196 | color: #008080; } 197 | .highlight .vi { 198 | color: #008080; } 199 | .highlight .il { 200 | color: #009999; } 201 | -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/img/carat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/RxTask.docset/Contents/Resources/Documents/img/carat.png -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/img/dash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/RxTask.docset/Contents/Resources/Documents/img/dash.png -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/img/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/RxTask.docset/Contents/Resources/Documents/img/gh.png -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/img/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/RxTask.docset/Contents/Resources/Documents/img/spinner.gif -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/js/jazzy.js: -------------------------------------------------------------------------------- 1 | window.jazzy = {'docset': false} 2 | if (typeof window.dash != 'undefined') { 3 | document.documentElement.className += ' dash' 4 | window.jazzy.docset = true 5 | } 6 | if (navigator.userAgent.match(/xcode/i)) { 7 | document.documentElement.className += ' xcode' 8 | window.jazzy.docset = true 9 | } 10 | 11 | // On doc load, toggle the URL hash discussion if present 12 | $(document).ready(function() { 13 | if (!window.jazzy.docset) { 14 | var linkToHash = $('a[href="' + window.location.hash +'"]'); 15 | linkToHash.trigger("click"); 16 | } 17 | }); 18 | 19 | // On token click, toggle its discussion and animate token.marginLeft 20 | $(".token").click(function(event) { 21 | if (window.jazzy.docset) { 22 | return; 23 | } 24 | var link = $(this); 25 | var animationDuration = 300; 26 | $content = link.parent().parent().next(); 27 | $content.slideToggle(animationDuration); 28 | 29 | // Keeps the document from jumping to the hash. 30 | var href = $(this).attr('href'); 31 | if (history.pushState) { 32 | history.pushState({}, '', href); 33 | } else { 34 | location.hash = href; 35 | } 36 | event.preventDefault(); 37 | }); 38 | 39 | // Dumb down quotes within code blocks that delimit strings instead of quotations 40 | // https://github.com/realm/jazzy/issues/714 41 | $("code q").replaceWith(function () { 42 | return ["\"", $(this).contents(), "\""]; 43 | }); 44 | -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/js/jazzy.search.js: -------------------------------------------------------------------------------- 1 | $(function(){ 2 | var searchIndex = lunr(function() { 3 | this.ref('url'); 4 | this.field('name'); 5 | }); 6 | 7 | var $typeahead = $('[data-typeahead]'); 8 | var $form = $typeahead.parents('form'); 9 | var searchURL = $form.attr('action'); 10 | 11 | function displayTemplate(result) { 12 | return result.name; 13 | } 14 | 15 | function suggestionTemplate(result) { 16 | var t = '
'; 17 | t += '' + result.name + ''; 18 | if (result.parent_name) { 19 | t += '' + result.parent_name + ''; 20 | } 21 | t += '
'; 22 | return t; 23 | } 24 | 25 | $typeahead.one('focus', function() { 26 | $form.addClass('loading'); 27 | 28 | $.getJSON(searchURL).then(function(searchData) { 29 | $.each(searchData, function (url, doc) { 30 | searchIndex.add({url: url, name: doc.name}); 31 | }); 32 | 33 | $typeahead.typeahead( 34 | { 35 | highlight: true, 36 | minLength: 3 37 | }, 38 | { 39 | limit: 10, 40 | display: displayTemplate, 41 | templates: { suggestion: suggestionTemplate }, 42 | source: function(query, sync) { 43 | var results = searchIndex.search(query).map(function(result) { 44 | var doc = searchData[result.ref]; 45 | doc.url = result.ref; 46 | return doc; 47 | }); 48 | sync(results); 49 | } 50 | } 51 | ); 52 | $form.removeClass('loading'); 53 | $typeahead.trigger('focus'); 54 | }); 55 | }); 56 | 57 | var baseURL = searchURL.slice(0, -"search.json".length); 58 | 59 | $typeahead.on('typeahead:select', function(e, result) { 60 | window.location = baseURL + result.url; 61 | }); 62 | }); 63 | -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/search.json: -------------------------------------------------------------------------------- 1 | {"Structs/Task.html#/s:FV6RxTask4TaskcFT10launchPathSS9argumentsGSaSS_16workingDirectoryGSqSS_11environmentGSqGVs10DictionarySSSS___S0_":{"name":"init(launchPath:arguments:workingDirectory:environment:)","abstract":"

Create a new task.

","parent_name":"Task"},"Structs/Task.html#/s:FV6RxTask4Task6launchFT5stdInGSqGC7RxSwift10ObservableV10Foundation4Data___GS2_OS_9TaskEvent_":{"name":"launch(stdIn:)","abstract":"

Launch the Task.

","parent_name":"Task"},"Structs/Task.html#/s:vV6RxTask4Task11descriptionSS":{"name":"description","abstract":"

A String describing the Task.

","parent_name":"Task"},"Structs/Task.html#/s:ZFV6RxTask4Taskoi2eeFTS0_S0__Sb":{"name":"==(_:_:)","abstract":"

Whether or not two Tasks are equal.

","parent_name":"Task"},"Structs/Task.html":{"name":"Task","abstract":"

Encapsulates launching a RxSwift powered command line task.

"},"Protocols/TaskEventType.html#/s:vP6RxTask13TaskEventType10exitStatusGSqSi_":{"name":"exitStatus","abstract":"

The exit status code if available, nil otherwise.

","parent_name":"TaskEventType"},"Protocols/TaskEventType.html#/s:vP6RxTask13TaskEventType6outputGSqV10Foundation4Data_":{"name":"output","abstract":"

The output of the event if available, nil otherwise.

","parent_name":"TaskEventType"},"Protocols/TaskEventType.html":{"name":"TaskEventType","abstract":"

A protocol encapsulated TaskEvent. Necessary to create Observable operators and not intended for public use.

"},"Extensions/Observable.html#/s:Fe6RxTaskRxS_13TaskEventTyperC7RxSwift10Observable14justExitStatusFT_GS2_Si_":{"name":"justExitStatus()","abstract":"

Filters out the output and launch events to produce just an Observable of the exit status.

","parent_name":"Observable"},"Extensions/Observable.html#/s:Fe6RxTaskRxS_13TaskEventTyperC7RxSwift10Observable10justOutputFT_GS2_V10Foundation4Data_":{"name":"justOutput()","abstract":"

Filters out the launch and exit events to just produce and Observable of the output (stdout and stderr).

","parent_name":"Observable"},"Extensions/Observable.html":{"name":"Observable"},"Enums/TaskError.html#/s:FO6RxTask9TaskError14uncaughtSignalFMS0_S0_":{"name":"uncaughtSignal","abstract":"

An uncaught signal was encountered.

","parent_name":"TaskError"},"Enums/TaskError.html#/s:FO6RxTask9TaskError4exitFMS0_FT10statusCodeSi_S0_":{"name":"exit","abstract":"

The Task exited unsuccessfully.

","parent_name":"TaskError"},"Enums/TaskError.html#/s:ZFO6RxTask9TaskErroroi2eeFTS0_S0__Sb":{"name":"==(_:_:)","abstract":"

Equates two TaskErrors.

","parent_name":"TaskError"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent6launchFMS0_FT7commandSS_S0_":{"name":"launch","abstract":"

The Task has launched.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent6stdOutFMS0_FV10Foundation4DataS0_":{"name":"stdOut","abstract":"

The Task has output to stdout.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent6stdErrFMS0_FV10Foundation4DataS0_":{"name":"stdErr","abstract":"

The Task has output to stderr.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent4exitFMS0_FT10statusCodeSi_S0_":{"name":"exit","abstract":"

The Task exited successfully.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:ZFO6RxTask9TaskEventoi2eeFTS0_S0__Sb":{"name":"==(_:_:)","abstract":"

Equates two TaskEvents.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:vO6RxTask9TaskEvent10exitStatusGSqSi_":{"name":"exitStatus","abstract":"

The exit status code if available, nil otherwise.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:vO6RxTask9TaskEvent6outputGSqV10Foundation4Data_":{"name":"output","abstract":"

The output of the event if available, nil otherwise.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html":{"name":"TaskEvent","abstract":"

Event emitted by a launched Task.

"},"Enums/TaskError.html":{"name":"TaskError","abstract":"

An error encountered in the execution of a Task.

"},"Enums.html":{"name":"Enums","abstract":"The following enums are available globally."},"Extensions.html":{"name":"Extensions","abstract":"The following extensions are available globally."},"Protocols.html":{"name":"Protocols","abstract":"The following protocols are available globally."},"Structs.html":{"name":"Structs","abstract":"The following structs are available globally."}} -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/Documents/undocumented.json: -------------------------------------------------------------------------------- 1 | { 2 | "warnings": [ 3 | 4 | ], 5 | "source_directory": "/Users/scottrhoyt/Development/RxTask" 6 | } -------------------------------------------------------------------------------- /docs/docsets/RxTask.docset/Contents/Resources/docSet.dsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/RxTask.docset/Contents/Resources/docSet.dsidx -------------------------------------------------------------------------------- /docs/docsets/RxTask.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/docsets/RxTask.tgz -------------------------------------------------------------------------------- /docs/img/carat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/img/carat.png -------------------------------------------------------------------------------- /docs/img/dash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/img/dash.png -------------------------------------------------------------------------------- /docs/img/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/img/gh.png -------------------------------------------------------------------------------- /docs/img/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxTask/f6f4110b960a4bf7c36c56303acac5b81f513102/docs/img/spinner.gif -------------------------------------------------------------------------------- /docs/js/jazzy.js: -------------------------------------------------------------------------------- 1 | window.jazzy = {'docset': false} 2 | if (typeof window.dash != 'undefined') { 3 | document.documentElement.className += ' dash' 4 | window.jazzy.docset = true 5 | } 6 | if (navigator.userAgent.match(/xcode/i)) { 7 | document.documentElement.className += ' xcode' 8 | window.jazzy.docset = true 9 | } 10 | 11 | // On doc load, toggle the URL hash discussion if present 12 | $(document).ready(function() { 13 | if (!window.jazzy.docset) { 14 | var linkToHash = $('a[href="' + window.location.hash +'"]'); 15 | linkToHash.trigger("click"); 16 | } 17 | }); 18 | 19 | // On token click, toggle its discussion and animate token.marginLeft 20 | $(".token").click(function(event) { 21 | if (window.jazzy.docset) { 22 | return; 23 | } 24 | var link = $(this); 25 | var animationDuration = 300; 26 | $content = link.parent().parent().next(); 27 | $content.slideToggle(animationDuration); 28 | 29 | // Keeps the document from jumping to the hash. 30 | var href = $(this).attr('href'); 31 | if (history.pushState) { 32 | history.pushState({}, '', href); 33 | } else { 34 | location.hash = href; 35 | } 36 | event.preventDefault(); 37 | }); 38 | 39 | // Dumb down quotes within code blocks that delimit strings instead of quotations 40 | // https://github.com/realm/jazzy/issues/714 41 | $("code q").replaceWith(function () { 42 | return ["\"", $(this).contents(), "\""]; 43 | }); 44 | -------------------------------------------------------------------------------- /docs/js/jazzy.search.js: -------------------------------------------------------------------------------- 1 | $(function(){ 2 | var searchIndex = lunr(function() { 3 | this.ref('url'); 4 | this.field('name'); 5 | }); 6 | 7 | var $typeahead = $('[data-typeahead]'); 8 | var $form = $typeahead.parents('form'); 9 | var searchURL = $form.attr('action'); 10 | 11 | function displayTemplate(result) { 12 | return result.name; 13 | } 14 | 15 | function suggestionTemplate(result) { 16 | var t = '
'; 17 | t += '' + result.name + ''; 18 | if (result.parent_name) { 19 | t += '' + result.parent_name + ''; 20 | } 21 | t += '
'; 22 | return t; 23 | } 24 | 25 | $typeahead.one('focus', function() { 26 | $form.addClass('loading'); 27 | 28 | $.getJSON(searchURL).then(function(searchData) { 29 | $.each(searchData, function (url, doc) { 30 | searchIndex.add({url: url, name: doc.name}); 31 | }); 32 | 33 | $typeahead.typeahead( 34 | { 35 | highlight: true, 36 | minLength: 3 37 | }, 38 | { 39 | limit: 10, 40 | display: displayTemplate, 41 | templates: { suggestion: suggestionTemplate }, 42 | source: function(query, sync) { 43 | var results = searchIndex.search(query).map(function(result) { 44 | var doc = searchData[result.ref]; 45 | doc.url = result.ref; 46 | return doc; 47 | }); 48 | sync(results); 49 | } 50 | } 51 | ); 52 | $form.removeClass('loading'); 53 | $typeahead.trigger('focus'); 54 | }); 55 | }); 56 | 57 | var baseURL = searchURL.slice(0, -"search.json".length); 58 | 59 | $typeahead.on('typeahead:select', function(e, result) { 60 | window.location = baseURL + result.url; 61 | }); 62 | }); 63 | -------------------------------------------------------------------------------- /docs/search.json: -------------------------------------------------------------------------------- 1 | {"Structs/Task.html#/s:FV6RxTask4TaskcFT10launchPathSS9argumentsGSaSS_16workingDirectoryGSqSS_11environmentGSqGVs10DictionarySSSS___S0_":{"name":"init(launchPath:arguments:workingDirectory:environment:)","abstract":"

Create a new task.

","parent_name":"Task"},"Structs/Task.html#/s:FV6RxTask4Task6launchFT5stdInGSqGC7RxSwift10ObservableV10Foundation4Data___GS2_OS_9TaskEvent_":{"name":"launch(stdIn:)","abstract":"

Launch the Task.

","parent_name":"Task"},"Structs/Task.html#/s:vV6RxTask4Task11descriptionSS":{"name":"description","abstract":"

A String describing the Task.

","parent_name":"Task"},"Structs/Task.html#/s:ZFV6RxTask4Taskoi2eeFTS0_S0__Sb":{"name":"==(_:_:)","abstract":"

Whether or not two Tasks are equal.

","parent_name":"Task"},"Structs/Task.html":{"name":"Task","abstract":"

Encapsulates launching a RxSwift powered command line task.

"},"Protocols/TaskEventType.html#/s:vP6RxTask13TaskEventType10exitStatusGSqSi_":{"name":"exitStatus","abstract":"

The exit status code if available, nil otherwise.

","parent_name":"TaskEventType"},"Protocols/TaskEventType.html#/s:vP6RxTask13TaskEventType6outputGSqV10Foundation4Data_":{"name":"output","abstract":"

The output of the event if available, nil otherwise.

","parent_name":"TaskEventType"},"Protocols/TaskEventType.html":{"name":"TaskEventType","abstract":"

A protocol encapsulated TaskEvent. Necessary to create Observable operators and not intended for public use.

"},"Extensions/Observable.html#/s:Fe6RxTaskRxS_13TaskEventTyperC7RxSwift10Observable14justExitStatusFT_GS2_Si_":{"name":"justExitStatus()","abstract":"

Filters out the output and launch events to produce just an Observable of the exit status.

","parent_name":"Observable"},"Extensions/Observable.html#/s:Fe6RxTaskRxS_13TaskEventTyperC7RxSwift10Observable10justOutputFT_GS2_V10Foundation4Data_":{"name":"justOutput()","abstract":"

Filters out the launch and exit events to just produce and Observable of the output (stdout and stderr).

","parent_name":"Observable"},"Extensions/Observable.html":{"name":"Observable"},"Enums/TaskError.html#/s:FO6RxTask9TaskError14uncaughtSignalFMS0_S0_":{"name":"uncaughtSignal","abstract":"

An uncaught signal was encountered.

","parent_name":"TaskError"},"Enums/TaskError.html#/s:FO6RxTask9TaskError4exitFMS0_FT10statusCodeSi_S0_":{"name":"exit","abstract":"

The Task exited unsuccessfully.

","parent_name":"TaskError"},"Enums/TaskError.html#/s:ZFO6RxTask9TaskErroroi2eeFTS0_S0__Sb":{"name":"==(_:_:)","abstract":"

Equates two TaskErrors.

","parent_name":"TaskError"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent6launchFMS0_FT7commandSS_S0_":{"name":"launch","abstract":"

The Task has launched.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent6stdOutFMS0_FV10Foundation4DataS0_":{"name":"stdOut","abstract":"

The Task has output to stdout.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent6stdErrFMS0_FV10Foundation4DataS0_":{"name":"stdErr","abstract":"

The Task has output to stderr.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:FO6RxTask9TaskEvent4exitFMS0_FT10statusCodeSi_S0_":{"name":"exit","abstract":"

The Task exited successfully.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:ZFO6RxTask9TaskEventoi2eeFTS0_S0__Sb":{"name":"==(_:_:)","abstract":"

Equates two TaskEvents.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:vO6RxTask9TaskEvent10exitStatusGSqSi_":{"name":"exitStatus","abstract":"

The exit status code if available, nil otherwise.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html#/s:vO6RxTask9TaskEvent6outputGSqV10Foundation4Data_":{"name":"output","abstract":"

The output of the event if available, nil otherwise.

","parent_name":"TaskEvent"},"Enums/TaskEvent.html":{"name":"TaskEvent","abstract":"

Event emitted by a launched Task.

"},"Enums/TaskError.html":{"name":"TaskError","abstract":"

An error encountered in the execution of a Task.

"},"Enums.html":{"name":"Enums","abstract":"The following enums are available globally."},"Extensions.html":{"name":"Extensions","abstract":"The following extensions are available globally."},"Protocols.html":{"name":"Protocols","abstract":"The following protocols are available globally."},"Structs.html":{"name":"Structs","abstract":"The following structs are available globally."}} -------------------------------------------------------------------------------- /docs/undocumented.json: -------------------------------------------------------------------------------- 1 | { 2 | "warnings": [ 3 | 4 | ], 5 | "source_directory": "/Users/scottrhoyt/Development/RxTask" 6 | } -------------------------------------------------------------------------------- /scripts/upstall-carthage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Update Homebrew 4 | brew update 5 | 6 | # Check for SwiftLint install 7 | VERSIONS=`brew ls --versions carthage` 8 | if [[ -z $VERSIONS ]]; then 9 | echo 'Carthage not installed. Installing.' 10 | brew install carthage 11 | else 12 | echo 'Carthage installed. Upgrading if neccessary.' 13 | brew outdated carthage || brew upgrade carthage 14 | fi 15 | -------------------------------------------------------------------------------- /scripts/upstall-swiftlint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Update Homebrew 4 | brew update 5 | 6 | # Check for SwiftLint install 7 | VERSIONS=`brew ls --versions swiftlint` 8 | if [[ -z $VERSIONS ]]; then 9 | echo 'SwiftLint not installed. Installing.' 10 | brew install swiftlint 11 | else 12 | echo 'SwiftLint installed. Upgrading if neccessary.' 13 | brew outdated swiftlint || brew upgrade swiftlint 14 | fi 15 | --------------------------------------------------------------------------------