Skip to content

Commit 0a07bc0

Browse files
committed
Merge pull request #15 from hyperoslo/develop
Merge develop into master
2 parents f5adf54 + d615232 commit 0a07bc0

2 files changed

Lines changed: 51 additions & 8 deletions

File tree

Pod/Tests/TestCompass.swift

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class TestCompass: XCTestCase {
55

66
override func setUp() {
77
Compass.scheme = "compassTests"
8-
Compass.routes = ["profile:{user}", "login"]
8+
Compass.routes = ["profile:{user}", "login", "callback"]
99
}
1010

1111
func testScheme() {
@@ -14,7 +14,7 @@ class TestCompass: XCTestCase {
1414

1515
func testRoutes() {
1616
XCTAssert(!Compass.routes.isEmpty)
17-
XCTAssert(Compass.routes.count == 2)
17+
XCTAssert(Compass.routes.count == 3)
1818
XCTAssertEqual(Compass.routes[0], "profile:{user}")
1919
XCTAssertEqual(Compass.routes[1], "login")
2020
}
@@ -36,10 +36,32 @@ class TestCompass: XCTestCase {
3636
}
3737

3838
func testParseWithoutArguments() {
39-
let url = NSURL(string: "compassTest://login")!
39+
let url = NSURL(string: "compassTests://login")!
4040
Compass.parse(url) { route, arguments in
4141
XCTAssertEqual("login", route)
4242
XCTAssert(arguments.isEmpty)
4343
}
4444
}
45+
46+
func testParseRegularURLWithFragments() {
47+
let url = NSURL(string: "compassTests://callback/#access_token=IjvcgrkQk1p7TyJxKa26rzM1wBMFZW6XoHK4t5Gkt1xQLTN8l7ppR0H3EZXpoP0uLAN49oCDqTHsvnEV&token_type=Bearer&expires_in=3600")!
48+
Compass.parse(url) { route, arguments in
49+
XCTAssertEqual(route, "callback")
50+
XCTAssertEqual(arguments.count, 3)
51+
XCTAssertEqual(arguments["access_token"], "IjvcgrkQk1p7TyJxKa26rzM1wBMFZW6XoHK4t5Gkt1xQLTN8l7ppR0H3EZXpoP0uLAN49oCDqTHsvnEV")
52+
XCTAssertEqual(arguments["expires_in"], "3600")
53+
XCTAssertEqual(arguments["token_type"], "Bearer")
54+
}
55+
}
56+
57+
func testParseRegularURLWithQuery() {
58+
let url = NSURL(string: "compassTests://callback/?access_token=Yo0OMrVZbRWNmgA6BT99hyuTUTNRGvqEEAQyeN1eslclzhFD0M8AidB4Z7Vs2NU8WoSNW0vYb961O38l&token_type=Bearer&expires_in=3600")!
59+
Compass.parse(url) { route, arguments in
60+
XCTAssertEqual(route, "callback")
61+
XCTAssertEqual(arguments.count, 3)
62+
XCTAssertEqual(arguments["access_token"], "Yo0OMrVZbRWNmgA6BT99hyuTUTNRGvqEEAQyeN1eslclzhFD0M8AidB4Z7Vs2NU8WoSNW0vYb961O38l")
63+
XCTAssertEqual(arguments["expires_in"], "3600")
64+
XCTAssertEqual(arguments["token_type"], "Bearer")
65+
}
66+
}
4567
}

Source/Compass.swift

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public struct Compass {
1717
var result = false
1818
let query = url.absoluteString.substringFromIndex(scheme.endIndex)
1919

20+
guard !query.containsString("/") else { return parseAsURL(url, completion: completion) }
21+
2022
for route in routes.sort({ $0 < $1 }) {
2123
guard let prefix = (route.characters
2224
.split { $0 == "{" }
@@ -25,8 +27,8 @@ public struct Compass {
2527

2628
if query.hasPrefix(prefix) || prefix.hasPrefix(query) {
2729
let queryString = query.stringByReplacingOccurrencesOfString(prefix, withString: "")
28-
let queryArguments = paths(queryString)
29-
let routeArguments = paths(route).filter { $0.containsString("{") }
30+
let queryArguments = splitString(queryString, delimiter: ":")
31+
let routeArguments = splitString(route, delimiter: ":").filter { $0.containsString("{") }
3032

3133
var arguments = [String : String]()
3234

@@ -46,6 +48,23 @@ public struct Compass {
4648
return result
4749
}
4850

51+
static func parseAsURL(url: NSURL, completion: ParseCompletion) -> Bool {
52+
guard let route = url.host else { return false }
53+
54+
var arguments = [String : String]()
55+
56+
[url.fragment, url.query].forEach {
57+
splitString($0, delimiter: "&").forEach {
58+
let pair = splitString($0, delimiter: "=")
59+
arguments[pair[0]] = pair[1]
60+
}
61+
}
62+
63+
completion(route: route, arguments: arguments)
64+
65+
return true
66+
}
67+
4968
public static func navigate(urn: String, scheme: String = Compass.scheme) {
5069
let stringURL = "\(scheme)\(urn)"
5170
guard let url = NSURL(string: stringURL) else { return }
@@ -55,9 +74,11 @@ public struct Compass {
5574

5675
// MARK: - Private Helpers
5776

58-
private static func paths(urn: String) -> [String] {
59-
return urn.characters
60-
.split { $0 == ":" }
77+
private static func splitString(string: String?, delimiter: Character) -> [String] {
78+
guard let string = string else { return [] }
79+
80+
return string.characters
81+
.split { $0 == delimiter }
6182
.map(String.init)
6283
}
6384
}

0 commit comments

Comments
 (0)