Skip to content
This repository was archived by the owner on Aug 16, 2023. It is now read-only.

Commit 391ab87

Browse files
committed
Add NSURL helper category.
1 parent 36239c0 commit 391ab87

File tree

5 files changed

+117
-3
lines changed

5 files changed

+117
-3
lines changed

CMDQueryStringSerialization.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
3B65D3D61B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B65D3D41B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; };
11+
3B65D3D71B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B65D3D51B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m */; };
1012
3BEA1CE51AFB40E50006A6E8 /* CMDQueryStringSerialization.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BEA1CD91AFB40E40006A6E8 /* CMDQueryStringSerialization.framework */; };
1113
3BEA1CEC1AFB40E50006A6E8 /* CMDQueryStringSerializationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA1CEB1AFB40E50006A6E8 /* CMDQueryStringSerializationTests.m */; };
1214
3BEA1CFF1AFB41370006A6E8 /* CMDQueryStringReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEA1CF51AFB41370006A6E8 /* CMDQueryStringReader.h */; };
@@ -47,6 +49,8 @@
4749
/* End PBXCopyFilesBuildPhase section */
4850

4951
/* Begin PBXFileReference section */
52+
3B65D3D41B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSURL+CMDQueryStringSerialization.h"; sourceTree = "<group>"; };
53+
3B65D3D51B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURL+CMDQueryStringSerialization.m"; sourceTree = "<group>"; };
5054
3BEA1CD91AFB40E40006A6E8 /* CMDQueryStringSerialization.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CMDQueryStringSerialization.framework; sourceTree = BUILT_PRODUCTS_DIR; };
5155
3BEA1CDD1AFB40E40006A6E8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
5256
3BEA1CE41AFB40E50006A6E8 /* CMDQueryStringSerializationTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CMDQueryStringSerializationTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -115,6 +119,8 @@
115119
3BEA1CFA1AFB41370006A6E8 /* CMDQueryStringValueTransformer.m */,
116120
3BEA1CFD1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.h */,
117121
3BEA1CFE1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.m */,
122+
3B65D3D41B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h */,
123+
3B65D3D51B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m */,
118124
3BEA1CDD1AFB40E40006A6E8 /* Info.plist */,
119125
);
120126
path = CMDQueryStringSerialization;
@@ -145,6 +151,7 @@
145151
buildActionMask = 2147483647;
146152
files = (
147153
3BEA1D071AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.h in Headers */,
154+
3B65D3D61B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h in Headers */,
148155
3BEA1CFF1AFB41370006A6E8 /* CMDQueryStringReader.h in Headers */,
149156
3BEA1D031AFB41370006A6E8 /* CMDQueryStringValueTransformer.h in Headers */,
150157
3BEA1D011AFB41370006A6E8 /* CMDQueryStringSerialization.h in Headers */,
@@ -249,6 +256,7 @@
249256
isa = PBXSourcesBuildPhase;
250257
buildActionMask = 2147483647;
251258
files = (
259+
3B65D3D71B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m in Sources */,
252260
3BEA1D001AFB41370006A6E8 /* CMDQueryStringReader.m in Sources */,
253261
3BEA1D041AFB41370006A6E8 /* CMDQueryStringValueTransformer.m in Sources */,
254262
3BEA1D021AFB41370006A6E8 /* CMDQueryStringSerialization.m in Sources */,

CMDQueryStringSerialization/CMDQueryStringSerialization.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
@import Foundation;
1010
#import <CMDQueryStringSerialization/CMDQueryStringWritingOptions.h>
11+
#import <CMDQueryStringSerialization/NSURL+CMDQueryStringSerialization.h>
1112

1213
/**
1314
Easily convert between query strings and dictionaries.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// NSURL+CMDQueryStringSerialization.h
3+
// CMDQueryStringSerialization
4+
//
5+
// Created by Caleb Davenport on 5/28/15.
6+
// Copyright (c) 2015 Caleb Davenport. All rights reserved.
7+
//
8+
9+
@import Foundation;
10+
11+
@interface NSURL (CMDQueryStringSerialization)
12+
13+
@property (nonatomic, readonly) NSDictionary *cmd_queryDictionary;
14+
15+
- (NSURL *)cmd_URLWithQueryDictionary:(NSDictionary *)dictionary;
16+
17+
- (NSURL *)cmd_URLByAddingQueryDictionary:(NSDictionary *)dictionary;
18+
19+
@end
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//
2+
// NSURL+CMDQueryStringSerialization.m
3+
// CMDQueryStringSerialization
4+
//
5+
// Created by Caleb Davenport on 5/28/15.
6+
// Copyright (c) 2015 Caleb Davenport. All rights reserved.
7+
//
8+
9+
#import "NSURL+CMDQueryStringSerialization.h"
10+
#import "CMDQueryStringSerialization.h"
11+
12+
@implementation NSURL (CMDQueryStringSerialization)
13+
14+
- (NSURL *)cmd_URLWithQueryDictionary:(NSDictionary *)dictionary {
15+
NSURLComponents *components = [NSURLComponents componentsWithURL:self resolvingAgainstBaseURL:YES];
16+
components.query = [CMDQueryStringSerialization queryStringWithDictionary:dictionary];
17+
return components.URL;
18+
}
19+
20+
- (NSURL *)cmd_URLByAddingQueryDictionary:(NSDictionary *)dictionary {
21+
NSURLComponents *components = [NSURLComponents componentsWithURL:self resolvingAgainstBaseURL:YES];
22+
NSMutableDictionary *mutableParameters = [[NSMutableDictionary alloc] init];
23+
[mutableParameters addEntriesFromDictionary:[CMDQueryStringSerialization dictionaryWithQueryString:components.query]];
24+
[mutableParameters addEntriesFromDictionary:dictionary];
25+
components.query = [CMDQueryStringSerialization queryStringWithDictionary:mutableParameters];
26+
return components.URL;
27+
}
28+
29+
- (NSDictionary *)cmd_queryDictionary {
30+
return [CMDQueryStringSerialization dictionaryWithQueryString:self.query];
31+
}
32+
33+
@end

CMDQueryStringSerializationTests/CMDQueryStringSerializationTests.m

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,7 @@ - (void)testDictionaryWithUnserializableKey {
164164

165165
- (void)testDictionaryWithDateAsUnixTimestamp {
166166
NSDate *inputDate = [NSDate date];
167-
NSDictionary *inputDictionary = @{
168-
@"date" : inputDate
169-
};
167+
NSDictionary *inputDictionary = @{ @"date" : inputDate };
170168
NSString *desiredString = [NSString stringWithFormat:@"date=%@", @((NSInteger)[inputDate timeIntervalSince1970])];
171169

172170
NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:inputDictionary];
@@ -219,4 +217,59 @@ - (void)testDateAsISO8601String {
219217
XCTAssertEqualObjects(actualString, desiredString, @"Query parameters are incorrect.");
220218
}
221219

220+
- (void)testNSURLQueryDictionary {
221+
NSDictionary *desiredDictionary = @{
222+
@"key_one" : @"value_one",
223+
@"key_two" : @"value_two"
224+
};
225+
226+
NSURL *URL = [NSURL URLWithString:@"http://apple.com"];
227+
URL = [URL cmd_URLWithQueryDictionary:desiredDictionary];
228+
229+
NSDictionary *actualDictionary = URL.cmd_queryDictionary;
230+
XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect.");
231+
}
232+
233+
- (void)testNSURLReplaceQueryDictionary {
234+
NSURL *URL = [NSURL URLWithString:@"http://apple.com"];
235+
236+
NSDictionary *firstDictionary = @{
237+
@"key_one" : @"value_one",
238+
@"key_two" : @"value_two"
239+
};
240+
NSDictionary *secondDictionary = @{
241+
@"key_three" : @"value_one",
242+
@"key_four" : @"value_two"
243+
};
244+
245+
URL = [URL cmd_URLWithQueryDictionary:firstDictionary];
246+
XCTAssertEqualObjects(URL.cmd_queryDictionary, firstDictionary, @"Query parameters are incorrect.");
247+
248+
URL = [URL cmd_URLWithQueryDictionary:secondDictionary];
249+
XCTAssertEqualObjects(URL.cmd_queryDictionary, secondDictionary, @"Query parameters are incorrect.");
250+
}
251+
252+
- (void)testNSURLAddQueryDictionary {
253+
NSURL *URL = [NSURL URLWithString:@"http://apple.com"];
254+
255+
NSDictionary *firstDictionary = @{
256+
@"key_one" : @"value_one",
257+
@"key_two" : @"value_two"
258+
};
259+
NSDictionary *secondDictionary = @{
260+
@"key_three" : @"value_one",
261+
@"key_four" : @"value_two"
262+
};
263+
264+
NSMutableDictionary *mergedDictionary = [[NSMutableDictionary alloc] init];
265+
[mergedDictionary addEntriesFromDictionary:firstDictionary];
266+
[mergedDictionary addEntriesFromDictionary:secondDictionary];
267+
268+
URL = [URL cmd_URLByAddingQueryDictionary:firstDictionary];
269+
XCTAssertEqualObjects(URL.cmd_queryDictionary, firstDictionary, @"Query parameters are incorrect.");
270+
271+
URL = [URL cmd_URLByAddingQueryDictionary:secondDictionary];
272+
XCTAssertEqualObjects(URL.cmd_queryDictionary, mergedDictionary, @"Query parameters are incorrect.");
273+
}
274+
222275
@end

0 commit comments

Comments
 (0)