Skip to content

Commit 698fc3b

Browse files
authored
Merge pull request #8 from MFB-Technologies-Inc/async-beta
Release async API and remove combine based API
2 parents 78a253d + e8269bf commit 698fc3b

File tree

53 files changed

+432
-2704
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+432
-2704
lines changed

.github/workflows/ci.yml

+13-13
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,26 @@ on:
77
pull_request:
88
branches:
99
- '*'
10+
workflow_dispatch:
1011

1112
jobs:
12-
library:
13+
lint:
14+
runs-on: macos-latest
15+
environment: default
16+
steps:
17+
- uses: actions/checkout@v3
18+
- name: Format lint
19+
run: swiftformat --lint .
20+
- name: Lint
21+
run: swiftlint .
22+
macos-test:
1323
environment: default
1424
strategy:
1525
matrix:
1626
os:
1727
- macos-11
1828
- macos-12
1929
xcode:
20-
- '12.4'
21-
- '12.5.1'
2230
- '13.2'
2331
- '13.4'
2432
- '14.0.1'
@@ -35,23 +43,15 @@ jobs:
3543
xcode: '14.1'
3644
- os: macos-11
3745
xcode: '14.2'
38-
- os: macos-12
39-
xcode: '12.4'
40-
- os: macos-12
41-
xcode: '12.5.1'
4246
runs-on: ${{ matrix.os }}
4347
steps:
44-
- uses: actions/checkout@v2
48+
- uses: actions/checkout@v3
4549
- name: Select Xcode ${{ matrix.xcode }}
4650
run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode }}.app
47-
- name: Format lint
48-
run: swiftformat --lint .
49-
- name: Lint
50-
run: swiftlint .
5151
- name: Run Tests
5252
run: swift test --enable-code-coverage --parallel
5353
- name: Swift Coverage Report
5454
run: xcrun llvm-cov export -format="lcov" .build/debug/NetworkServicePackageTests.xctest/Contents/MacOS//NetworkServicePackageTests -instr-profile .build/debug/codecov/default.profdata > coverage_report.lcov
5555
- uses: codecov/codecov-action@v3
5656
with:
57-
fail_ci_if_error: true # optional (default = false)
57+
fail_ci_if_error: true # optional (default = false)

Package.swift

+53-142
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version:5.3
1+
// swift-tools-version:5.5
22

33
import PackageDescription
44

@@ -10,146 +10,57 @@ let package = Package(
1010
targets: Target.targets
1111
)
1212

13-
#if swift(>=5.5)
14-
extension Product {
15-
static let products: [Product] = [
16-
.library(
17-
name: "NetworkService",
18-
targets: ["NetworkService"]
19-
),
20-
.library(
21-
name: "NetworkServiceTestHelper",
22-
targets: ["NetworkServiceTestHelper"]
23-
),
24-
.library(
25-
name: "NetworkServiceAsyncBeta",
26-
targets: ["NetworkServiceAsyncBeta"]
27-
),
28-
.library(
29-
name: "NetworkServiceTestHelperAsyncBeta",
30-
targets: ["NetworkServiceTestHelperAsyncBeta"]
31-
),
32-
]
33-
}
13+
extension Product {
14+
static let products: [Product] = [
15+
.library(
16+
name: "NetworkService",
17+
targets: ["NetworkService"]
18+
),
19+
.library(
20+
name: "NetworkServiceTestHelper",
21+
targets: ["NetworkServiceTestHelper"]
22+
),
23+
]
24+
}
3425

35-
extension Target {
36-
static let targets: [Target] = [
37-
.target(
38-
name: "NetworkService",
39-
dependencies: []
40-
),
41-
.testTarget(
42-
name: "NetworkServiceTests",
43-
dependencies: [
44-
"NetworkService",
45-
.product(name: "OHHTTPStubs", package: "OHHTTPStubs"),
46-
.product(name: "OHHTTPStubsSwift", package: "OHHTTPStubs"),
47-
]
48-
),
49-
.target(name: "NetworkServiceAsyncBeta"),
50-
.testTarget(
51-
name: "NetworkServiceAsyncBetaTests",
52-
dependencies: [
53-
"NetworkServiceAsyncBeta",
54-
.product(name: "OHHTTPStubs", package: "OHHTTPStubs"),
55-
.product(name: "OHHTTPStubsSwift", package: "OHHTTPStubs"),
56-
]
57-
),
58-
.target(
59-
name: "NetworkServiceTestHelper",
60-
dependencies: [
61-
"NetworkService",
62-
.product(name: "CombineSchedulers", package: "combine-schedulers"),
63-
]
64-
),
65-
.testTarget(
66-
name: "NetworkServiceTestHelperTests",
67-
dependencies: [
68-
"NetworkServiceTestHelper",
69-
.product(name: "CombineSchedulers", package: "combine-schedulers"),
70-
]
71-
),
72-
.target(
73-
name: "NetworkServiceTestHelperAsyncBeta",
74-
dependencies: [
75-
"NetworkServiceAsyncBeta",
76-
.product(name: "CombineSchedulers", package: "combine-schedulers"),
77-
]
78-
),
79-
.testTarget(
80-
name: "NetworkServiceTestHelperAsyncBetaTests",
81-
dependencies: [
82-
"NetworkServiceTestHelperAsyncBeta",
83-
.product(name: "CombineSchedulers", package: "combine-schedulers"),
84-
]
85-
),
86-
]
87-
}
26+
extension Target {
27+
static let targets: [Target] = [
28+
.target(
29+
name: "NetworkService",
30+
dependencies: []
31+
),
32+
.testTarget(
33+
name: "NetworkServiceTests",
34+
dependencies: [
35+
"NetworkService",
36+
.product(name: "OHHTTPStubs", package: "OHHTTPStubs"),
37+
.product(name: "OHHTTPStubsSwift", package: "OHHTTPStubs"),
38+
]
39+
),
40+
.target(
41+
name: "NetworkServiceTestHelper",
42+
dependencies: [
43+
"NetworkService",
44+
.product(name: "CombineSchedulers", package: "combine-schedulers"),
45+
]
46+
),
47+
.testTarget(
48+
name: "NetworkServiceTestHelperTests",
49+
dependencies: [
50+
"NetworkServiceTestHelper",
51+
.product(name: "CombineSchedulers", package: "combine-schedulers"),
52+
]
53+
),
54+
]
55+
}
8856

89-
extension Package.Dependency {
90-
static let dependencies: [Package.Dependency] = [
91-
.package(url: "https://github.com/AliSoftware/OHHTTPStubs.git", from: "9.1.0"),
92-
.package(
93-
name: "combine-schedulers",
94-
url: "https://github.com/pointfreeco/combine-schedulers.git",
95-
.upToNextMajor(from: "0.6.0")
96-
),
97-
]
98-
}
99-
100-
#else
101-
extension Product {
102-
static let products: [Product] = [
103-
.library(
104-
name: "NetworkService",
105-
targets: ["NetworkService"]
106-
),
107-
.library(
108-
name: "NetworkServiceTestHelper",
109-
targets: ["NetworkServiceTestHelper"]
110-
),
111-
]
112-
}
113-
114-
extension Target {
115-
static let targets: [Target] = [
116-
.target(
117-
name: "NetworkService",
118-
dependencies: []
119-
),
120-
.testTarget(
121-
name: "NetworkServiceTests",
122-
dependencies: [
123-
"NetworkService",
124-
.product(name: "OHHTTPStubs", package: "OHHTTPStubs"),
125-
.product(name: "OHHTTPStubsSwift", package: "OHHTTPStubs"),
126-
]
127-
),
128-
.target(
129-
name: "NetworkServiceTestHelper",
130-
dependencies: [
131-
"NetworkService",
132-
.product(name: "CombineSchedulers", package: "combine-schedulers"),
133-
]
134-
),
135-
.testTarget(
136-
name: "NetworkServiceTestHelperTests",
137-
dependencies: [
138-
"NetworkServiceTestHelper",
139-
.product(name: "CombineSchedulers", package: "combine-schedulers"),
140-
]
141-
),
142-
]
143-
}
144-
145-
extension Package.Dependency {
146-
static let dependencies: [Package.Dependency] = [
147-
.package(url: "https://github.com/AliSoftware/OHHTTPStubs.git", from: "9.1.0"),
148-
.package(
149-
name: "combine-schedulers",
150-
url: "https://github.com/pointfreeco/combine-schedulers.git",
151-
.upToNextMinor(from: "0.5.3")
152-
),
153-
]
154-
}
155-
#endif
57+
extension Package.Dependency {
58+
static let dependencies: [Package.Dependency] = [
59+
.package(url: "https://github.com/AliSoftware/OHHTTPStubs.git", from: "9.1.0"),
60+
.package(
61+
name: "combine-schedulers",
62+
url: "https://github.com/pointfreeco/combine-schedulers.git",
63+
.upToNextMajor(from: "0.6.0")
64+
),
65+
]
66+
}

Sources/NetworkService/NetworkService.swift

+6-4
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,17 @@ import Foundation
1212
/// Provides methods for making network requests and processing the resulting responses
1313
public final class NetworkService {
1414
/// `NetworkService`'s error domain
15-
public enum Failure: Error, Hashable {
16-
case url(URLResponse)
17-
case http(HTTPURLResponse)
18-
case cocoa(NSError)
15+
public enum Failure: Error, Hashable, Sendable {
16+
case urlResponse(URLResponse)
17+
case httpResponse(HTTPURLResponse)
18+
case urlError(URLError)
19+
case unknown(NSError)
1920
}
2021

2122
public init() {}
2223
}
2324

2425
// MARK: NetworkService+NetworkServiceClient
2526

27+
@available(swift 5.5)
2628
extension NetworkService: NetworkServiceClient {}

Sources/NetworkService/NetworkServiceClient+Delete.swift

+37-34
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
// This source code is licensed under the MIT license found in the
77
// LICENSE file in the root directory of this source tree.
88

9-
import Combine
109
import Foundation
1110

1211
extension NetworkServiceClient {
@@ -19,40 +18,44 @@ extension NetworkServiceClient {
1918
public func delete(
2019
_ url: URL,
2120
headers: [HTTPHeader] = []
22-
) -> AnyPublisher<Data, Failure> {
23-
var request = URLRequest(url: url)
24-
request.method = .DELETE
25-
headers.forEach { request.addValue($0) }
26-
return start(request)
21+
) async -> Result<Data, Failure> {
22+
let request = URLRequest.build(url: url, headers: headers, method: .DELETE)
23+
return await start(request)
2724
}
25+
}
2826

29-
/// Send a delete request to a `URL`
30-
/// - Parameters:
31-
/// - url: The destination for the request
32-
/// - headers: HTTP headers for the request
33-
/// - decoder: `TopLevelDecoder` for decoding the response body
34-
/// - Returns: Type erased publisher with decoded output and `NetworkService`'s error domain for failure
35-
public func delete<ResponseBody, Decoder>(
36-
_ url: URL,
37-
headers: [HTTPHeader] = [],
38-
decoder: Decoder
39-
) -> AnyPublisher<ResponseBody, Failure>
40-
where ResponseBody: Decodable, Decoder: TopLevelDecoder, Decoder.Input == Data
41-
{
42-
delete(url, headers: headers)
43-
.decode(with: decoder)
44-
.mapToNetworkError()
45-
.eraseToAnyPublisher()
46-
}
27+
#if canImport(Combine)
28+
import Combine
4729

48-
/// Send a delete request to a `URL`
49-
/// - Parameters:
50-
/// - url: The destination for the request
51-
/// - headers: HTTP headers for the request
52-
/// - Returns: Type erased publisher with `TopLevelDecodable` output and `NetworkService`'s error domain for failure
53-
public func delete<ResponseBody>(_ url: URL, headers: [HTTPHeader] = []) -> AnyPublisher<ResponseBody, Failure>
54-
where ResponseBody: TopLevelDecodable
55-
{
56-
delete(url, headers: headers, decoder: ResponseBody.decoder)
30+
extension NetworkServiceClient {
31+
/// Send a delete request to a `URL`
32+
/// - Parameters:
33+
/// - url: The destination for the request
34+
/// - headers: HTTP headers for the request
35+
/// - decoder: `TopLevelDecoder` for decoding the response body
36+
/// - Returns: Type erased publisher with decoded output and `NetworkService`'s error domain for failure
37+
public func delete<ResponseBody, Decoder>(
38+
_ url: URL,
39+
headers: [HTTPHeader] = [],
40+
decoder: Decoder
41+
) async -> Result<ResponseBody, Failure>
42+
where ResponseBody: Decodable, Decoder: TopLevelDecoder, Decoder.Input == Data
43+
{
44+
await delete(url, headers: headers)
45+
.decode(with: decoder)
46+
.mapToNetworkError()
47+
}
48+
49+
/// Send a delete request to a `URL`
50+
/// - Parameters:
51+
/// - url: The destination for the request
52+
/// - headers: HTTP headers for the request
53+
/// - Returns: Type erased publisher with `TopLevelDecodable` output and `NetworkService`'s error domain for
54+
/// failure
55+
public func delete<ResponseBody>(_ url: URL, headers: [HTTPHeader] = []) async -> Result<ResponseBody, Failure>
56+
where ResponseBody: TopLevelDecodable
57+
{
58+
await delete(url, headers: headers, decoder: ResponseBody.decoder)
59+
}
5760
}
58-
}
61+
#endif

0 commit comments

Comments
 (0)