Skip to content

Commit b166ab6

Browse files
authored
Merge pull request #11 from RxSwiftCommunity/data_not_strings
Data not strings
2 parents 4793d54 + 3b31053 commit b166ab6

File tree

23 files changed

+133
-153
lines changed

23 files changed

+133
-153
lines changed

.travis.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ env:
33
- FRAMEWORK_NAME=RxTask
44
- secure: "IVdTuXiwER2aiRZu9hRMfjhckrw08ddcxfHsTyPW5yOSHdCOU/g37qV27OoGCK0xWY4HayuDSqHjdIky0HCCKoARGHZKcjcZCUnEarxTk5e9GuZ7NRfyKbSCDMwl0onqjuuGyJu3fLIM8ArCFiJrtVreRqkf49wEPE1yoyeNjDAY5RNSyKUGRJtfTVtiyZQf5Z6raVyEKBFMDR8TYXy4xBDU5ieaJS9i9E/d3F/x4X0Gc9g5P5kw9o0Sj5vGXR3e06LpXXtzi28cJsXRxGcayAfo0gpLKFjo+2fseJZVhWohTH8q9bNOaqd6gu3luXdjJZwkUC0+r/zGF1H35i08CS5o0EI3HqSgZgTpcPE3KgfWbgb+1a7ntzDrsBtvZS3KrH8hHDYBv1HCxwDQdVJO+7HoMacZRBAEWQmw0GvyDhl5tmLWfYsXYvDMLN7ndn3xUtWSR3FMhYjKApupeNb9DyKCRpeDGTBP8bbEtLE8J/VQPhwwK78OzgMV+LwRWQ4fihKmbTiwyOMTDpXqriKgecitH/pmDVBXR5bSSk1YQHM5xqfz1An4wxYlM2BskvIrLX0nnnRjhgtSEfRdieasohPyJHAwb0GgmOYN5QZ4hoNICIGWYHVobEdoZWnsgvhGaOHDGE7P+gbYbSkUjP6KTbCAHH/T1jlH0R9D0+IcpwQ="
55

6+
cache:
7+
directories:
8+
- build
9+
- Packages
10+
- Carthage
11+
612
script: placeholder # workaround for https://github.com/travis-ci/travis-ci/issues/4681
713
matrix:
814
include:

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
## Master
2+
3+
##### Breaking
4+
5+
* `stdin`, `stdout`, and `stderr` are now treated as raw `Data`.
6+
Encoding/Decoding is left to the user.
7+
8+
##### Enhancements
9+
10+
* `stdin` is now available when `launch`ing a `Task`.
11+
* `Task` conforms to `CustomStringConvertible` and `Equatable`.
12+
13+
##### Bug Fixes
14+
15+
* None

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,16 @@ that is used to report significant events in the task lifetime. The possible
6868
events are:
6969

7070
* `launch(command: String)`
71-
* `stdOut(String)`
72-
* `stdErr(String)`
71+
* `stdOut(Data)`
72+
* `stdErr(Data)`
7373
* `exit(statusCode: Int)`
7474

7575
** Note: ** Currently an event is only considered successful if it exits with a
7676
`statusCode` of 0. Other exit statuses will be considered a `TaskError`.
7777

7878
#### StdIn
7979

80-
If you create a task that expects input, you can provide an `Observable<String>`
80+
If you create a task that expects input, you can provide an `Observable<Data>`
8181
for `stdin` when you are `launch()`ing the `Task`. Data will be written to
8282
`stdin` as soon as it is emitted by the `Observable`.
8383

@@ -110,7 +110,6 @@ Task(launchPath: "/bin/ls").launch()
110110

111111
* `uncaughtSignal`: The `Task` terminated with an uncaught signal (e.g. `SIGINT`).
112112
* `exit(statusCode: Int)`: The `Task` exited with a non-zero exit code.
113-
* `cannotEncodeInput(String)`: The input string was unable to be encoded into `Data` using UTF8.
114113

115114
## API Reference
116115

Sources/Observable+Task.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public protocol TaskEventType {
1616
var exitStatus: Int? { get }
1717

1818
/// The output of the event if available, `nil` otherwise.
19-
var output: String? { get }
19+
var output: Data? { get }
2020
}
2121

2222
extension TaskEvent: TaskEventType {
@@ -32,7 +32,7 @@ extension TaskEvent: TaskEventType {
3232
}
3333

3434
/// The output of the event if available, `nil` otherwise.
35-
public var output: String? {
35+
public var output: Data? {
3636
switch self {
3737
case .stdErr(let output), .stdOut(let output):
3838
return output
@@ -56,13 +56,13 @@ public extension Observable where Element: TaskEventType {
5656
}
5757

5858
/// Filters out the launch and exit events to just produce and `Observable` of the output (`stdout` and `stderr`).
59-
func justOutput() -> Observable<String> {
60-
return flatMap { event -> Observable<String> in
59+
func justOutput() -> Observable<Data> {
60+
return flatMap { event -> Observable<Data> in
6161
guard let output = event.output else {
62-
return Observable<String>.empty()
62+
return Observable<Data>.empty()
6363
}
6464

65-
return Observable<String>.just(output)
65+
return Observable<Data>.just(output)
6666
}
6767
}
6868
}

Sources/Task.swift

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ public enum TaskEvent {
2626
case launch(command: String)
2727

2828
/// The `Task` has output to `stdout`.
29-
case stdOut(String)
29+
case stdOut(Data)
3030

3131
/// The `Task` has output to `stderr`.
32-
case stdErr(String)
32+
case stdErr(Data)
3333

3434
/// The `Task` exited successfully.
3535
case exit(statusCode: Int)
@@ -57,9 +57,6 @@ extension TaskEvent: Equatable {
5757
/// An error encountered in the execution of a `Task`.
5858
public enum TaskError: Error {
5959

60-
/// Cannot encode input `String` into `Data` (using UTF8)
61-
case cannotEncodeInput(String)
62-
6360
/// An uncaught signal was encountered.
6461
case uncaughtSignal
6562

@@ -72,8 +69,6 @@ extension TaskError: Equatable {
7269
/// Equates two `TaskError`s.
7370
public static func == (lhs: TaskError, rhs: TaskError) -> Bool {
7471
switch (lhs, rhs) {
75-
case let (.cannotEncodeInput(left), .cannotEncodeInput(right)):
76-
return left == right
7772
case (.uncaughtSignal, .uncaughtSignal):
7873
return true
7974
case let (.exit(left), .exit(right)):
@@ -117,11 +112,12 @@ public struct Task {
117112
self.environment = environment
118113
}
119114

120-
/**
115+
/**
121116
Launch the `Task`.
122-
- parameter stdIn: An optional `Observable` to provide `stdin` for the process.
117+
118+
- parameter stdIn: An optional `Observable` to provide `stdin` for the process. Defaults to `nil`.
123119
*/
124-
public func launch(stdIn: Observable<String>? = nil) -> Observable<TaskEvent> {
120+
public func launch(stdIn: Observable<Data>? = nil) -> Observable<TaskEvent> {
125121
let process = Process()
126122
process.launchPath = self.launchPath
127123
process.arguments = self.arguments
@@ -168,29 +164,19 @@ public struct Task {
168164
}
169165
}
170166

171-
private func outPipe(withHandler handler: @escaping (String) -> Void) -> Pipe {
167+
private func outPipe(withHandler handler: @escaping (Data) -> Void) -> Pipe {
172168
let pipe = Pipe()
173169

174-
pipe.fileHandleForReading.readabilityHandler = { fileHandle in
175-
if let string = String(data: fileHandle.availableData, encoding: .utf8) {
176-
handler(string)
177-
}
178-
}
170+
pipe.fileHandleForReading.readabilityHandler = { handler($0.availableData) }
179171

180172
return pipe
181173
}
182174

183-
private func inPipe(stdIn: Observable<String>, errorHandler: @escaping (Error) -> Void) -> Pipe {
175+
private func inPipe(stdIn: Observable<Data>, errorHandler: @escaping (Error) -> Void) -> Pipe {
184176
let pipe = Pipe()
185177

186178
stdIn
187-
.subscribe(onNext: { input in
188-
guard let data = input.data(using: .utf8) else {
189-
errorHandler(TaskError.cannotEncodeInput(input))
190-
return
191-
}
192-
pipe.fileHandleForWriting.write(data)
193-
})
179+
.subscribe(onNext: pipe.fileHandleForWriting.write)
194180
.disposed(by: disposeBag)
195181

196182
return pipe

Tests/RxTaskTests/Observable+TaskTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ class ObservableTaskTests: XCTestCase {
4040
.toArray()
4141

4242
XCTAssertEqual(exitStatus.count, 2)
43-
XCTAssertEqual(exitStatus[0], "hello\n")
44-
XCTAssertEqual(exitStatus[1], "world\n")
43+
XCTAssertEqual(exitStatus[0], "hello\n".data(using: .utf8)!)
44+
XCTAssertEqual(exitStatus[1], "world\n".data(using: .utf8)!)
4545
}
4646

4747
static var allTests: [(String, (ObservableTaskTests) -> () throws -> Void)] {

Tests/RxTaskTests/TaskTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class TaskTests: XCTestCase {
2222

2323
XCTAssertEqual(events.count, 3)
2424
XCTAssertEqual(events[0], .launch(command: script.path))
25-
XCTAssertEqual(events[1], .stdOut("hello world\n"))
25+
XCTAssertEqual(events[1], .stdOut("hello world\n".data(using: .utf8)!))
2626
XCTAssertEqual(events[2], .exit(statusCode: 0))
2727
}
2828

@@ -36,7 +36,7 @@ class TaskTests: XCTestCase {
3636

3737
XCTAssertEqual(events.count, 3)
3838
XCTAssertEqual(events[0], .launch(command: script.path))
39-
XCTAssertEqual(events[1], .stdErr("hello world\n"))
39+
XCTAssertEqual(events[1], .stdErr("hello world\n".data(using: .utf8)!))
4040
XCTAssertEqual(events[2], .exit(statusCode: 0))
4141
}
4242

@@ -87,7 +87,7 @@ class TaskTests: XCTestCase {
8787
"sleep 0.1"
8888
])
8989

90-
let stdIn = Observable.of("hello\n", "world\n")
90+
let stdIn = Observable.of("hello\n", "world\n").map { $0.data(using: .utf8) ?? Data() }
9191

9292
let events = try Task(launchPath: script.path)
9393
.launch(stdIn: stdIn)
@@ -96,8 +96,8 @@ class TaskTests: XCTestCase {
9696

9797
XCTAssertEqual(events.count, 4)
9898
XCTAssertEqual(events[0], .launch(command: script.path))
99-
XCTAssertEqual(events[1], .stdOut("hello\n"))
100-
XCTAssertEqual(events[2], .stdOut("world\n"))
99+
XCTAssertEqual(events[1], .stdOut("hello\n".data(using: .utf8)!))
100+
XCTAssertEqual(events[2], .stdOut("world\n".data(using: .utf8)!))
101101
XCTAssertEqual(events[3], .exit(statusCode: 0))
102102
}
103103

docs/Enums/TaskError.html

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -105,37 +105,6 @@ <h1>TaskError</h1>
105105

106106
<section class="section">
107107
<div class="section-content">
108-
<div class="task-group">
109-
<ul class="item-container">
110-
<li class="item">
111-
<div>
112-
<code>
113-
<a name="/s:FO6RxTask9TaskError17cannotEncodeInputFMS0_FSSS0_"></a>
114-
<a name="//apple_ref/swift/Element/cannotEncodeInput" class="dashAnchor"></a>
115-
<a class="token" href="#/s:FO6RxTask9TaskError17cannotEncodeInputFMS0_FSSS0_">cannotEncodeInput</a>
116-
</code>
117-
</div>
118-
<div class="height-container">
119-
<div class="pointer-container"></div>
120-
<section class="section">
121-
<div class="pointer"></div>
122-
<div class="abstract">
123-
<p>Cannot encode input <code>String</code> into <code>Data</code> (using UTF8)</p>
124-
125-
</div>
126-
<div class="declaration">
127-
<h4>Declaration</h4>
128-
<div class="language">
129-
<p class="aside-title">Swift</p>
130-
<pre class="highlight"><code><span class="k">case</span> <span class="nf">cannotEncodeInput</span><span class="p">(</span><span class="kt">String</span><span class="p">)</span></code></pre>
131-
132-
</div>
133-
</div>
134-
</section>
135-
</div>
136-
</li>
137-
</ul>
138-
</div>
139108
<div class="task-group">
140109
<ul class="item-container">
141110
<li class="item">

docs/Enums/TaskEvent.html

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@ <h4>Declaration</h4>
141141
<li class="item">
142142
<div>
143143
<code>
144-
<a name="/s:FO6RxTask9TaskEvent6stdOutFMS0_FSSS0_"></a>
144+
<a name="/s:FO6RxTask9TaskEvent6stdOutFMS0_FV10Foundation4DataS0_"></a>
145145
<a name="//apple_ref/swift/Element/stdOut" class="dashAnchor"></a>
146-
<a class="token" href="#/s:FO6RxTask9TaskEvent6stdOutFMS0_FSSS0_">stdOut</a>
146+
<a class="token" href="#/s:FO6RxTask9TaskEvent6stdOutFMS0_FV10Foundation4DataS0_">stdOut</a>
147147
</code>
148148
</div>
149149
<div class="height-container">
@@ -158,7 +158,7 @@ <h4>Declaration</h4>
158158
<h4>Declaration</h4>
159159
<div class="language">
160160
<p class="aside-title">Swift</p>
161-
<pre class="highlight"><code><span class="k">case</span> <span class="nf">stdOut</span><span class="p">(</span><span class="kt">String</span><span class="p">)</span></code></pre>
161+
<pre class="highlight"><code><span class="k">case</span> <span class="nf">stdOut</span><span class="p">(</span><span class="kt">Data</span><span class="p">)</span></code></pre>
162162

163163
</div>
164164
</div>
@@ -172,9 +172,9 @@ <h4>Declaration</h4>
172172
<li class="item">
173173
<div>
174174
<code>
175-
<a name="/s:FO6RxTask9TaskEvent6stdErrFMS0_FSSS0_"></a>
175+
<a name="/s:FO6RxTask9TaskEvent6stdErrFMS0_FV10Foundation4DataS0_"></a>
176176
<a name="//apple_ref/swift/Element/stdErr" class="dashAnchor"></a>
177-
<a class="token" href="#/s:FO6RxTask9TaskEvent6stdErrFMS0_FSSS0_">stdErr</a>
177+
<a class="token" href="#/s:FO6RxTask9TaskEvent6stdErrFMS0_FV10Foundation4DataS0_">stdErr</a>
178178
</code>
179179
</div>
180180
<div class="height-container">
@@ -189,7 +189,7 @@ <h4>Declaration</h4>
189189
<h4>Declaration</h4>
190190
<div class="language">
191191
<p class="aside-title">Swift</p>
192-
<pre class="highlight"><code><span class="k">case</span> <span class="nf">stdErr</span><span class="p">(</span><span class="kt">String</span><span class="p">)</span></code></pre>
192+
<pre class="highlight"><code><span class="k">case</span> <span class="nf">stdErr</span><span class="p">(</span><span class="kt">Data</span><span class="p">)</span></code></pre>
193193

194194
</div>
195195
</div>
@@ -292,9 +292,9 @@ <h4>Declaration</h4>
292292
<li class="item">
293293
<div>
294294
<code>
295-
<a name="/s:vO6RxTask9TaskEvent6outputGSqSS_"></a>
295+
<a name="/s:vO6RxTask9TaskEvent6outputGSqV10Foundation4Data_"></a>
296296
<a name="//apple_ref/swift/Property/output" class="dashAnchor"></a>
297-
<a class="token" href="#/s:vO6RxTask9TaskEvent6outputGSqSS_">output</a>
297+
<a class="token" href="#/s:vO6RxTask9TaskEvent6outputGSqV10Foundation4Data_">output</a>
298298
</code>
299299
</div>
300300
<div class="height-container">
@@ -309,7 +309,7 @@ <h4>Declaration</h4>
309309
<h4>Declaration</h4>
310310
<div class="language">
311311
<p class="aside-title">Swift</p>
312-
<pre class="highlight"><code><span class="kd">public</span> <span class="k">var</span> <span class="nv">output</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span></code></pre>
312+
<pre class="highlight"><code><span class="kd">public</span> <span class="k">var</span> <span class="nv">output</span><span class="p">:</span> <span class="kt">Data</span><span class="p">?</span></code></pre>
313313

314314
</div>
315315
</div>

docs/Extensions/Observable.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,9 @@ <h4>Declaration</h4>
136136
<li class="item">
137137
<div>
138138
<code>
139-
<a name="/s:Fe6RxTaskRxS_13TaskEventTyperC7RxSwift10Observable10justOutputFT_GS2_SS_"></a>
139+
<a name="/s:Fe6RxTaskRxS_13TaskEventTyperC7RxSwift10Observable10justOutputFT_GS2_V10Foundation4Data_"></a>
140140
<a name="//apple_ref/swift/Method/justOutput()" class="dashAnchor"></a>
141-
<a class="token" href="#/s:Fe6RxTaskRxS_13TaskEventTyperC7RxSwift10Observable10justOutputFT_GS2_SS_">justOutput()</a>
141+
<a class="token" href="#/s:Fe6RxTaskRxS_13TaskEventTyperC7RxSwift10Observable10justOutputFT_GS2_V10Foundation4Data_">justOutput()</a>
142142
</code>
143143
</div>
144144
<div class="height-container">
@@ -153,7 +153,7 @@ <h4>Declaration</h4>
153153
<h4>Declaration</h4>
154154
<div class="language">
155155
<p class="aside-title">Swift</p>
156-
<pre class="highlight"><code><span class="kd">func</span> <span class="nf">justOutput</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">Observable</span><span class="o">&lt;</span><span class="kt">String</span><span class="o">&gt;</span></code></pre>
156+
<pre class="highlight"><code><span class="kd">func</span> <span class="nf">justOutput</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">Observable</span><span class="o">&lt;</span><span class="kt">Data</span><span class="o">&gt;</span></code></pre>
157157

158158
</div>
159159
</div>

0 commit comments

Comments
 (0)