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

Commit

Permalink
Add NSURL helper category.
Browse files Browse the repository at this point in the history
  • Loading branch information
calebd committed May 28, 2015
1 parent 36239c0 commit 391ab87
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 3 deletions.
8 changes: 8 additions & 0 deletions CMDQueryStringSerialization.xcodeproj/project.pbxproj
Expand Up @@ -7,6 +7,8 @@
objects = {

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

/* Begin PBXFileReference section */
3B65D3D41B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSURL+CMDQueryStringSerialization.h"; sourceTree = "<group>"; };
3B65D3D51B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURL+CMDQueryStringSerialization.m"; sourceTree = "<group>"; };
3BEA1CD91AFB40E40006A6E8 /* CMDQueryStringSerialization.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CMDQueryStringSerialization.framework; sourceTree = BUILT_PRODUCTS_DIR; };
3BEA1CDD1AFB40E40006A6E8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3BEA1CE41AFB40E50006A6E8 /* CMDQueryStringSerializationTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CMDQueryStringSerializationTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -115,6 +119,8 @@
3BEA1CFA1AFB41370006A6E8 /* CMDQueryStringValueTransformer.m */,
3BEA1CFD1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.h */,
3BEA1CFE1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.m */,
3B65D3D41B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h */,
3B65D3D51B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m */,
3BEA1CDD1AFB40E40006A6E8 /* Info.plist */,
);
path = CMDQueryStringSerialization;
Expand Down Expand Up @@ -145,6 +151,7 @@
buildActionMask = 2147483647;
files = (
3BEA1D071AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.h in Headers */,
3B65D3D61B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h in Headers */,
3BEA1CFF1AFB41370006A6E8 /* CMDQueryStringReader.h in Headers */,
3BEA1D031AFB41370006A6E8 /* CMDQueryStringValueTransformer.h in Headers */,
3BEA1D011AFB41370006A6E8 /* CMDQueryStringSerialization.h in Headers */,
Expand Down Expand Up @@ -249,6 +256,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
3B65D3D71B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m in Sources */,
3BEA1D001AFB41370006A6E8 /* CMDQueryStringReader.m in Sources */,
3BEA1D041AFB41370006A6E8 /* CMDQueryStringValueTransformer.m in Sources */,
3BEA1D021AFB41370006A6E8 /* CMDQueryStringSerialization.m in Sources */,
Expand Down
1 change: 1 addition & 0 deletions CMDQueryStringSerialization/CMDQueryStringSerialization.h
Expand Up @@ -8,6 +8,7 @@

@import Foundation;
#import <CMDQueryStringSerialization/CMDQueryStringWritingOptions.h>
#import <CMDQueryStringSerialization/NSURL+CMDQueryStringSerialization.h>

/**
Easily convert between query strings and dictionaries.
Expand Down
19 changes: 19 additions & 0 deletions CMDQueryStringSerialization/NSURL+CMDQueryStringSerialization.h
@@ -0,0 +1,19 @@
//
// NSURL+CMDQueryStringSerialization.h
// CMDQueryStringSerialization
//
// Created by Caleb Davenport on 5/28/15.
// Copyright (c) 2015 Caleb Davenport. All rights reserved.
//

@import Foundation;

@interface NSURL (CMDQueryStringSerialization)

@property (nonatomic, readonly) NSDictionary *cmd_queryDictionary;

- (NSURL *)cmd_URLWithQueryDictionary:(NSDictionary *)dictionary;

- (NSURL *)cmd_URLByAddingQueryDictionary:(NSDictionary *)dictionary;

@end
33 changes: 33 additions & 0 deletions CMDQueryStringSerialization/NSURL+CMDQueryStringSerialization.m
@@ -0,0 +1,33 @@
//
// NSURL+CMDQueryStringSerialization.m
// CMDQueryStringSerialization
//
// Created by Caleb Davenport on 5/28/15.
// Copyright (c) 2015 Caleb Davenport. All rights reserved.
//

#import "NSURL+CMDQueryStringSerialization.h"
#import "CMDQueryStringSerialization.h"

@implementation NSURL (CMDQueryStringSerialization)

- (NSURL *)cmd_URLWithQueryDictionary:(NSDictionary *)dictionary {
NSURLComponents *components = [NSURLComponents componentsWithURL:self resolvingAgainstBaseURL:YES];
components.query = [CMDQueryStringSerialization queryStringWithDictionary:dictionary];
return components.URL;
}

- (NSURL *)cmd_URLByAddingQueryDictionary:(NSDictionary *)dictionary {
NSURLComponents *components = [NSURLComponents componentsWithURL:self resolvingAgainstBaseURL:YES];
NSMutableDictionary *mutableParameters = [[NSMutableDictionary alloc] init];
[mutableParameters addEntriesFromDictionary:[CMDQueryStringSerialization dictionaryWithQueryString:components.query]];
[mutableParameters addEntriesFromDictionary:dictionary];
components.query = [CMDQueryStringSerialization queryStringWithDictionary:mutableParameters];
return components.URL;
}

- (NSDictionary *)cmd_queryDictionary {
return [CMDQueryStringSerialization dictionaryWithQueryString:self.query];
}

@end
Expand Up @@ -164,9 +164,7 @@ - (void)testDictionaryWithUnserializableKey {

- (void)testDictionaryWithDateAsUnixTimestamp {
NSDate *inputDate = [NSDate date];
NSDictionary *inputDictionary = @{
@"date" : inputDate
};
NSDictionary *inputDictionary = @{ @"date" : inputDate };
NSString *desiredString = [NSString stringWithFormat:@"date=%@", @((NSInteger)[inputDate timeIntervalSince1970])];

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

- (void)testNSURLQueryDictionary {
NSDictionary *desiredDictionary = @{
@"key_one" : @"value_one",
@"key_two" : @"value_two"
};

NSURL *URL = [NSURL URLWithString:@"http://apple.com"];
URL = [URL cmd_URLWithQueryDictionary:desiredDictionary];

NSDictionary *actualDictionary = URL.cmd_queryDictionary;
XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect.");
}

- (void)testNSURLReplaceQueryDictionary {
NSURL *URL = [NSURL URLWithString:@"http://apple.com"];

NSDictionary *firstDictionary = @{
@"key_one" : @"value_one",
@"key_two" : @"value_two"
};
NSDictionary *secondDictionary = @{
@"key_three" : @"value_one",
@"key_four" : @"value_two"
};

URL = [URL cmd_URLWithQueryDictionary:firstDictionary];
XCTAssertEqualObjects(URL.cmd_queryDictionary, firstDictionary, @"Query parameters are incorrect.");

URL = [URL cmd_URLWithQueryDictionary:secondDictionary];
XCTAssertEqualObjects(URL.cmd_queryDictionary, secondDictionary, @"Query parameters are incorrect.");
}

- (void)testNSURLAddQueryDictionary {
NSURL *URL = [NSURL URLWithString:@"http://apple.com"];

NSDictionary *firstDictionary = @{
@"key_one" : @"value_one",
@"key_two" : @"value_two"
};
NSDictionary *secondDictionary = @{
@"key_three" : @"value_one",
@"key_four" : @"value_two"
};

NSMutableDictionary *mergedDictionary = [[NSMutableDictionary alloc] init];
[mergedDictionary addEntriesFromDictionary:firstDictionary];
[mergedDictionary addEntriesFromDictionary:secondDictionary];

URL = [URL cmd_URLByAddingQueryDictionary:firstDictionary];
XCTAssertEqualObjects(URL.cmd_queryDictionary, firstDictionary, @"Query parameters are incorrect.");

URL = [URL cmd_URLByAddingQueryDictionary:secondDictionary];
XCTAssertEqualObjects(URL.cmd_queryDictionary, mergedDictionary, @"Query parameters are incorrect.");
}

@end

0 comments on commit 391ab87

Please sign in to comment.