Skip to content

Commit fa085b0

Browse files
committed
Merge pull request #86 from ishkawa/feature/session
Rename `API` to `Session` and reorganize relationship between `Session` and `NSURLSession`
2 parents f2b502e + 9cdc680 commit fa085b0

File tree

6 files changed

+70
-48
lines changed

6 files changed

+70
-48
lines changed

APIKit.xcodeproj/project.pbxproj

+6-6
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
7F0869A11A9787AF001AD3E1 /* ResponseBodyParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FEC5A181A96FE2600B1D3C0 /* ResponseBodyParserTests.swift */; };
1515
7F0869A61A978BCA001AD3E1 /* URLEncodedSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F0869A51A978BCA001AD3E1 /* URLEncodedSerialization.swift */; };
1616
7F0869A71A978BCA001AD3E1 /* URLEncodedSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F0869A51A978BCA001AD3E1 /* URLEncodedSerialization.swift */; };
17-
7F0869A81A979088001AD3E1 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F45FD171A94D085006863BB /* API.swift */; };
17+
7F0869A81A979088001AD3E1 /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F45FD171A94D085006863BB /* Session.swift */; };
1818
7F1B190B1AA2CA1300C7AFCF /* APITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1B190A1AA2CA1300C7AFCF /* APITests.swift */; };
1919
7F1B190C1AA2CA1300C7AFCF /* APITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1B190A1AA2CA1300C7AFCF /* APITests.swift */; };
2020
7F30A8561A975BD600A8C136 /* RequestBodyBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F30A8551A975BD600A8C136 /* RequestBodyBuilderTests.swift */; };
21-
7F45FD181A94D085006863BB /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F45FD171A94D085006863BB /* API.swift */; };
21+
7F45FD181A94D085006863BB /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F45FD171A94D085006863BB /* Session.swift */; };
2222
7F5FA6B51B3C58210090B0AF /* APIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F5FA6B41B3C58210090B0AF /* APIError.swift */; };
2323
7F68ABDA1AC4412E00688D68 /* RequestType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F68ABD91AC4412E00688D68 /* RequestType.swift */; };
2424
7F68ABDB1AC4412E00688D68 /* RequestType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F68ABD91AC4412E00688D68 /* RequestType.swift */; };
@@ -94,7 +94,7 @@
9494
7F45FCE11A94D02C006863BB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9595
7F45FCE21A94D02C006863BB /* APIKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = APIKit.h; sourceTree = "<group>"; };
9696
7F45FCFE1A94D04D006863BB /* APIKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = APIKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
97-
7F45FD171A94D085006863BB /* API.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = "<group>"; };
97+
7F45FD171A94D085006863BB /* Session.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Session.swift; sourceTree = "<group>"; };
9898
7F5FA6B41B3C58210090B0AF /* APIError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIError.swift; sourceTree = "<group>"; };
9999
7F68ABD91AC4412E00688D68 /* RequestType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestType.swift; sourceTree = "<group>"; };
100100
7F68ABDC1AC4414500688D68 /* HTTPMethod.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPMethod.swift; sourceTree = "<group>"; };
@@ -173,7 +173,7 @@
173173
isa = PBXGroup;
174174
children = (
175175
7F45FCE21A94D02C006863BB /* APIKit.h */,
176-
7F45FD171A94D085006863BB /* API.swift */,
176+
7F45FD171A94D085006863BB /* Session.swift */,
177177
7F68ABD91AC4412E00688D68 /* RequestType.swift */,
178178
7F68ABDC1AC4414500688D68 /* HTTPMethod.swift */,
179179
7F5FA6B41B3C58210090B0AF /* APIError.swift */,
@@ -402,7 +402,7 @@
402402
buildActionMask = 2147483647;
403403
files = (
404404
7FCBE9DD1A9734880075AFD9 /* RequestBodyBuilder.swift in Sources */,
405-
7F45FD181A94D085006863BB /* API.swift in Sources */,
405+
7F45FD181A94D085006863BB /* Session.swift in Sources */,
406406
7F68ABDD1AC4414500688D68 /* HTTPMethod.swift in Sources */,
407407
7F68ABDA1AC4412E00688D68 /* RequestType.swift in Sources */,
408408
7FCBE9E01A9734950075AFD9 /* ResponseBodyParser.swift in Sources */,
@@ -417,7 +417,7 @@
417417
files = (
418418
84B5C6BC1B42CD430032068D /* APIError.swift in Sources */,
419419
7FCBE9DE1A9734880075AFD9 /* RequestBodyBuilder.swift in Sources */,
420-
7F0869A81A979088001AD3E1 /* API.swift in Sources */,
420+
7F0869A81A979088001AD3E1 /* Session.swift in Sources */,
421421
7F68ABDE1AC4414500688D68 /* HTTPMethod.swift in Sources */,
422422
7F68ABDB1AC4412E00688D68 /* RequestType.swift in Sources */,
423423
7FCBE9E11A9734950075AFD9 /* ResponseBodyParser.swift in Sources */,

APIKit/API.swift APIKit/Session.swift

+38-16
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
import Foundation
22
import Result
33

4-
public class API {
5-
public class var defaultURLSession: NSURLSession {
6-
return internalDefaultURLSession
4+
public class Session {
5+
public let URLSession: NSURLSession
6+
7+
public init(URLSession: NSURLSession) {
8+
self.URLSession = URLSession
79
}
810

9-
private static let internalDefaultURLSession = NSURLSession(
10-
configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
11-
delegate: URLSessionDelegate(),
12-
delegateQueue: nil
13-
)
14-
1511
// send request and build response object
16-
public static func sendRequest<T: RequestType>(request: T, URLSession: NSURLSession = defaultURLSession, handler: (Result<T.Response, APIError>) -> Void = {r in}) -> NSURLSessionDataTask? {
12+
public func sendRequest<T: RequestType>(request: T, handler: (Result<T.Response, APIError>) -> Void = {r in}) -> NSURLSessionDataTask? {
1713
switch request.buildURLRequest() {
1814
case .Failure(let error):
1915
handler(.Failure(error))
@@ -44,12 +40,8 @@ public class API {
4440
return dataTask
4541
}
4642
}
47-
48-
public static func cancelRequest<T: RequestType>(requestType: T.Type, passingTest test: T -> Bool = { r in true }) {
49-
cancelRequest(requestType, URLSession: defaultURLSession, passingTest: test)
50-
}
51-
52-
public static func cancelRequest<T: RequestType>(requestType: T.Type, URLSession: NSURLSession, passingTest test: T -> Bool = { r in true }) {
43+
44+
public func cancelRequest<T: RequestType>(requestType: T.Type, passingTest test: T -> Bool = { r in true }) {
5345
URLSession.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
5446
let allTasks = dataTasks as [NSURLSessionTask]
5547
+ uploadTasks as [NSURLSessionTask]
@@ -76,6 +68,36 @@ public class API {
7668
}.forEach { $0.cancel() }
7769
}
7870
}
71+
72+
// Shared session for static methods
73+
public static let sharedSession = Session(URLSession: NSURLSession(
74+
configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
75+
delegate: URLSessionDelegate(),
76+
delegateQueue: nil
77+
))
78+
79+
public static func sendRequest<T: RequestType>(request: T, handler: (Result<T.Response, APIError>) -> Void = {r in}) -> NSURLSessionDataTask? {
80+
return sharedSession.sendRequest(request, handler: handler)
81+
}
82+
83+
public static func cancelRequest<T: RequestType>(requestType: T.Type, passingTest test: T -> Bool = { r in true }) {
84+
sharedSession.cancelRequest(requestType, passingTest: test)
85+
}
86+
}
87+
88+
@available(*, unavailable, message="API is renamed as Session.")
89+
public typealias API = Session
90+
91+
extension Session {
92+
@available(*, unavailable, message="Use separated Session instance instead.")
93+
public static func sendRequest<T: RequestType>(request: T, URLSession: NSURLSession, handler: (Result<T.Response, APIError>) -> Void = {r in}) -> NSURLSessionDataTask? {
94+
abort()
95+
}
96+
97+
@available(*, unavailable, message="Use separated Session instance instead.")
98+
public static func cancelRequest<T: RequestType>(requestType: T.Type, URLSession: NSURLSession, passingTest test: T -> Bool = { r in true }) {
99+
abort()
100+
}
79101
}
80102

81103
// MARK: - default implementation of URLSessionDelegate

APIKitTests/APITests.swift

+19-19
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ import APIKit
33
import XCTest
44
import OHHTTPStubs
55

6-
protocol MockAPIRequestType: RequestType {
6+
protocol MockSessionRequestType: RequestType {
77
}
88

9-
extension MockAPIRequestType {
9+
extension MockSessionRequestType {
1010
var baseURL: NSURL {
1111
return NSURL(string: "https://api.github.com")!
1212
}
1313
}
1414

15-
class MockAPI: API {
16-
struct GetRoot: MockAPIRequestType {
15+
class MockSession: Session {
16+
struct GetRoot: MockSessionRequestType {
1717
typealias Response = [String: AnyObject]
1818

1919
var method: HTTPMethod {
@@ -30,7 +30,7 @@ class MockAPI: API {
3030
}
3131
}
3232

33-
class AnotherMockAPI: API {
33+
class AnotherMockSession: Session {
3434

3535
}
3636

@@ -52,9 +52,9 @@ class APITests: XCTestCase {
5252
})
5353

5454
let expectation = expectationWithDescription("wait for response")
55-
let request = MockAPI.GetRoot()
55+
let request = MockSession.GetRoot()
5656

57-
MockAPI.sendRequest(request) { response in
57+
MockSession.sendRequest(request) { response in
5858
switch response {
5959
case .Success(let dictionary):
6060
XCTAssertEqual(dictionary["key"] as? String, "value")
@@ -79,9 +79,9 @@ class APITests: XCTestCase {
7979
})
8080

8181
let expectation = expectationWithDescription("wait for response")
82-
let request = MockAPI.GetRoot()
82+
let request = MockSession.GetRoot()
8383

84-
MockAPI.sendRequest(request) { response in
84+
MockSession.sendRequest(request) { response in
8585
switch response {
8686
case .Success:
8787
XCTFail()
@@ -112,9 +112,9 @@ class APITests: XCTestCase {
112112
})
113113

114114
let expectation = expectationWithDescription("wait for response")
115-
let request = MockAPI.GetRoot()
115+
let request = MockSession.GetRoot()
116116

117-
MockAPI.sendRequest(request) { response in
117+
MockSession.sendRequest(request) { response in
118118
switch response {
119119
case .Success:
120120
XCTFail()
@@ -146,9 +146,9 @@ class APITests: XCTestCase {
146146
})
147147

148148
let expectation = expectationWithDescription("wait for response")
149-
let request = MockAPI.GetRoot()
149+
let request = MockSession.GetRoot()
150150

151-
MockAPI.sendRequest(request) { response in
151+
MockSession.sendRequest(request) { response in
152152
switch response {
153153
case .Success:
154154
XCTFail()
@@ -182,9 +182,9 @@ class APITests: XCTestCase {
182182
})
183183

184184
let expectation = expectationWithDescription("wait for response")
185-
let request = MockAPI.GetRoot()
185+
let request = MockSession.GetRoot()
186186

187-
MockAPI.sendRequest(request) { response in
187+
MockSession.sendRequest(request) { response in
188188
switch response {
189189
case .Success:
190190
XCTFail()
@@ -203,7 +203,7 @@ class APITests: XCTestCase {
203203
expectation.fulfill()
204204
}
205205

206-
MockAPI.cancelRequest(MockAPI.GetRoot.self)
206+
MockSession.cancelRequest(MockSession.GetRoot.self)
207207

208208
waitForExpectationsWithTimeout(1.0, handler: nil)
209209
}
@@ -221,9 +221,9 @@ class APITests: XCTestCase {
221221
})
222222

223223
let expectation = expectationWithDescription("wait for response")
224-
let request = MockAPI.GetRoot()
224+
let request = MockSession.GetRoot()
225225

226-
MockAPI.sendRequest(request) { response in
226+
MockSession.sendRequest(request) { response in
227227
switch response {
228228
case .Success:
229229
break
@@ -235,7 +235,7 @@ class APITests: XCTestCase {
235235
expectation.fulfill()
236236
}
237237

238-
MockAPI.cancelRequest(MockAPI.GetRoot.self) { request in
238+
MockSession.cancelRequest(MockSession.GetRoot.self) { request in
239239
return false
240240
}
241241

APIKitTests/RequestTypeTests.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import OHHTTPStubs
33
import APIKit
44

55
class RequestTypeTests: XCTestCase {
6-
struct SearchRequest: MockAPIRequestType {
6+
struct SearchRequest: MockSessionRequestType {
77
let query: String
88

99
// MARK: RequestType
@@ -70,7 +70,7 @@ class RequestTypeTests: XCTestCase {
7070
let request = SearchRequest(query: "こんにちは")
7171
let expectation = expectationWithDescription("waiting for the response.")
7272

73-
API.sendRequest(request) { result in
73+
Session.sendRequest(request) { result in
7474
expectation.fulfill()
7575
}
7676

@@ -88,7 +88,7 @@ class RequestTypeTests: XCTestCase {
8888
let request = SearchRequest(query: "!\"#$%&'()0=~|`{}*+<>?_")
8989
let expectation = expectationWithDescription("waiting for the response.")
9090

91-
API.sendRequest(request) { result in
91+
Session.sendRequest(request) { result in
9292
expectation.fulfill()
9393
}
9494

Demo.playground/Contents.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ struct GetRateLimitRequest: GitHubRequestType {
6363
//: Step 4: Send request
6464
let request = GetRateLimitRequest()
6565

66-
API.sendRequest(request) { result in
66+
Session.sendRequest(request) { result in
6767
switch result {
6868
case .Success(let rateLimit):
6969
debugPrint("count: \(rateLimit.count)")

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ APIKit is a library for building type-safe web API client in Swift.
1515
```swift
1616
let request = GetSearchRepositoriesRequest(query: "APIKit", sort: .Stars)
1717

18-
API.sendRequest(request) { result in
18+
Session.sendRequest(request) { result in
1919
switch result {
2020
case .Success(let response):
2121
self.repositories = response // inferred as [Repository]
@@ -117,7 +117,7 @@ struct RateLimit {
117117
```swift
118118
let request = GetRateLimitRequest()
119119

120-
API.sendRequest(request) { result in
120+
Session.sendRequest(request) { result in
121121
switch result {
122122
case .Success(let rateLimit):
123123
print("count: \(rateLimit.count)")
@@ -276,7 +276,7 @@ extension GitHubRequest {
276276
```swift
277277
let request = GetSomePaginatedRequest(page: 1)
278278

279-
API.sendRequest(request) { result in
279+
Session.sendRequest(request) { result in
280280
switch result {
281281
case .Success(let response):
282282
print("results: \(response.results)")

0 commit comments

Comments
 (0)