├── CMDQueryStringSerialization.podspec ├── CMDQueryStringSerialization.xcodeproj ├── project.pbxproj └── xcshareddata │ └── xcschemes │ ├── OS X.xcscheme │ └── iOS.xcscheme ├── CMDQueryStringSerialization ├── CMDQueryStringReader.h ├── CMDQueryStringReader.m ├── CMDQueryStringSerialization.h ├── CMDQueryStringSerialization.m ├── CMDQueryStringValueTransformer.h ├── CMDQueryStringValueTransformer.m ├── CMDQueryStringWritingOptions.h ├── Info.plist ├── NSString+CMDQueryStringSerialization.h ├── NSString+CMDQueryStringSerialization.m ├── NSURL+CMDQueryStringSerialization.h └── NSURL+CMDQueryStringSerialization.m ├── CMDQueryStringSerializationTests ├── CategoryTests.m ├── Info.plist └── SerializationTests.m ├── Cartfile ├── Cartfile.resolved ├── LICENSE └── Readme.markdown /CMDQueryStringSerialization.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'CMDQueryStringSerialization' 3 | s.version = '0.4.1' 4 | s.summary = 'Easy conversion between dictionaries and query strings in Objective-C.' 5 | s.homepage = 'https://github.com/calebd/CMDQueryStringSerialization' 6 | s.license = { :type => 'MIT', :file => 'LICENSE' } 7 | s.author = { 'Caleb Davenport' => 'calebmdavenport@gmail.com' } 8 | s.source = { :git => 'https://github.com/calebd/CMDQueryStringSerialization.git', :tag => "v#{s.version}" } 9 | s.requires_arc = true 10 | s.ios.deployment_target = '7.0' 11 | s.osx.deployment_target = '10.9' 12 | s.source_files = 'CMDQueryStringSerialization/*.{h,m}' 13 | s.dependency 'ISO8601' 14 | end 15 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 3634A0951B1CC25500B1C866 /* CategoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3634A0941B1CC25500B1C866 /* CategoryTests.m */; }; 11 | 3B03D1A31B279FAA00EF57EC /* SerializationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA1CEB1AFB40E50006A6E8 /* SerializationTests.m */; }; 12 | 3B03D1A41B279FAA00EF57EC /* CategoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3634A0941B1CC25500B1C866 /* CategoryTests.m */; }; 13 | 3B43A8731B27B5FF00566A7E /* ISO8601.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B43A8721B27B5FA00566A7E /* ISO8601.framework */; }; 14 | 3B43A8741B27B61A00566A7E /* ISO8601.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B43A8721B27B5FA00566A7E /* ISO8601.framework */; }; 15 | 3B43A8751B27B61C00566A7E /* ISO8601.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 3B43A8721B27B5FA00566A7E /* ISO8601.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 16 | 3B43A8771B27B64500566A7E /* ISO8601.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B43A8761B27B63500566A7E /* ISO8601.framework */; }; 17 | 3B43A8781B27B64E00566A7E /* ISO8601.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 3B43A8761B27B63500566A7E /* ISO8601.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 18 | 3B43A8791B27B65100566A7E /* ISO8601.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B43A8761B27B63500566A7E /* ISO8601.framework */; }; 19 | 3B65D3D61B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B65D3D41B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 20 | 3B65D3D71B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B65D3D51B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m */; }; 21 | 3BEA1CE51AFB40E50006A6E8 /* CMDQueryStringSerialization.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BEA1CD91AFB40E40006A6E8 /* CMDQueryStringSerialization.framework */; }; 22 | 3BEA1CEC1AFB40E50006A6E8 /* SerializationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA1CEB1AFB40E50006A6E8 /* SerializationTests.m */; }; 23 | 3BEA1CFF1AFB41370006A6E8 /* CMDQueryStringReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEA1CF51AFB41370006A6E8 /* CMDQueryStringReader.h */; }; 24 | 3BEA1D001AFB41370006A6E8 /* CMDQueryStringReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA1CF61AFB41370006A6E8 /* CMDQueryStringReader.m */; }; 25 | 3BEA1D011AFB41370006A6E8 /* CMDQueryStringSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEA1CF71AFB41370006A6E8 /* CMDQueryStringSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 26 | 3BEA1D021AFB41370006A6E8 /* CMDQueryStringSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA1CF81AFB41370006A6E8 /* CMDQueryStringSerialization.m */; }; 27 | 3BEA1D031AFB41370006A6E8 /* CMDQueryStringValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEA1CF91AFB41370006A6E8 /* CMDQueryStringValueTransformer.h */; }; 28 | 3BEA1D041AFB41370006A6E8 /* CMDQueryStringValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA1CFA1AFB41370006A6E8 /* CMDQueryStringValueTransformer.m */; }; 29 | 3BEA1D051AFB41370006A6E8 /* CMDQueryStringWritingOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEA1CFB1AFB41370006A6E8 /* CMDQueryStringWritingOptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30 | 3BEA1D071AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEA1CFD1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.h */; }; 31 | 3BEA1D081AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA1CFE1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.m */; }; 32 | 3BFF27EF1B1EDBE1001E0555 /* CMDQueryStringSerialization.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BFF27E41B1EDBE0001E0555 /* CMDQueryStringSerialization.framework */; }; 33 | 3BFF28011B1EDCC5001E0555 /* CMDQueryStringSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEA1CF71AFB41370006A6E8 /* CMDQueryStringSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 34 | 3BFF28021B1EDCC5001E0555 /* CMDQueryStringSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA1CF81AFB41370006A6E8 /* CMDQueryStringSerialization.m */; }; 35 | 3BFF28031B1EDCC5001E0555 /* CMDQueryStringWritingOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEA1CFB1AFB41370006A6E8 /* CMDQueryStringWritingOptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 36 | 3BFF28041B1EDCC5001E0555 /* CMDQueryStringReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEA1CF51AFB41370006A6E8 /* CMDQueryStringReader.h */; }; 37 | 3BFF28051B1EDCC5001E0555 /* CMDQueryStringReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA1CF61AFB41370006A6E8 /* CMDQueryStringReader.m */; }; 38 | 3BFF28061B1EDCC5001E0555 /* CMDQueryStringValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEA1CF91AFB41370006A6E8 /* CMDQueryStringValueTransformer.h */; }; 39 | 3BFF28071B1EDCC5001E0555 /* CMDQueryStringValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA1CFA1AFB41370006A6E8 /* CMDQueryStringValueTransformer.m */; }; 40 | 3BFF28081B1EDCC5001E0555 /* NSString+CMDQueryStringSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BEA1CFD1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.h */; }; 41 | 3BFF28091B1EDCC5001E0555 /* NSString+CMDQueryStringSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA1CFE1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.m */; }; 42 | 3BFF280A1B1EDCC5001E0555 /* NSURL+CMDQueryStringSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B65D3D41B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43 | 3BFF280B1B1EDCC5001E0555 /* NSURL+CMDQueryStringSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B65D3D51B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m */; }; 44 | /* End PBXBuildFile section */ 45 | 46 | /* Begin PBXContainerItemProxy section */ 47 | 3BEA1CE61AFB40E50006A6E8 /* PBXContainerItemProxy */ = { 48 | isa = PBXContainerItemProxy; 49 | containerPortal = 3BEA1CD01AFB40E40006A6E8 /* Project object */; 50 | proxyType = 1; 51 | remoteGlobalIDString = 3BEA1CD81AFB40E40006A6E8; 52 | remoteInfo = CMDQueryStringSerialization; 53 | }; 54 | 3BFF27F01B1EDBE1001E0555 /* PBXContainerItemProxy */ = { 55 | isa = PBXContainerItemProxy; 56 | containerPortal = 3BEA1CD01AFB40E40006A6E8 /* Project object */; 57 | proxyType = 1; 58 | remoteGlobalIDString = 3BFF27E31B1EDBE0001E0555; 59 | remoteInfo = "CMDQueryStringSerialization-OSX"; 60 | }; 61 | /* End PBXContainerItemProxy section */ 62 | 63 | /* Begin PBXCopyFilesBuildPhase section */ 64 | 3B03D19F1B279F5A00EF57EC /* Copy Frameworks */ = { 65 | isa = PBXCopyFilesBuildPhase; 66 | buildActionMask = 2147483647; 67 | dstPath = ""; 68 | dstSubfolderSpec = 10; 69 | files = ( 70 | 3B43A8781B27B64E00566A7E /* ISO8601.framework in Copy Frameworks */, 71 | ); 72 | name = "Copy Frameworks"; 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | 3B03D1A11B279F7F00EF57EC /* Copy Frameworks */ = { 76 | isa = PBXCopyFilesBuildPhase; 77 | buildActionMask = 2147483647; 78 | dstPath = ""; 79 | dstSubfolderSpec = 10; 80 | files = ( 81 | 3B43A8751B27B61C00566A7E /* ISO8601.framework in Copy Frameworks */, 82 | ); 83 | name = "Copy Frameworks"; 84 | runOnlyForDeploymentPostprocessing = 0; 85 | }; 86 | /* End PBXCopyFilesBuildPhase section */ 87 | 88 | /* Begin PBXFileReference section */ 89 | 3634A0941B1CC25500B1C866 /* CategoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CategoryTests.m; sourceTree = ""; }; 90 | 3B43A8721B27B5FA00566A7E /* ISO8601.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ISO8601.framework; path = Carthage/Build/iOS/ISO8601.framework; sourceTree = ""; }; 91 | 3B43A8761B27B63500566A7E /* ISO8601.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ISO8601.framework; path = Carthage/Build/Mac/ISO8601.framework; sourceTree = ""; }; 92 | 3B65D3D41B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSURL+CMDQueryStringSerialization.h"; sourceTree = ""; }; 93 | 3B65D3D51B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURL+CMDQueryStringSerialization.m"; sourceTree = ""; }; 94 | 3BEA1CD91AFB40E40006A6E8 /* CMDQueryStringSerialization.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CMDQueryStringSerialization.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 95 | 3BEA1CDD1AFB40E40006A6E8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 96 | 3BEA1CE41AFB40E50006A6E8 /* iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 97 | 3BEA1CEA1AFB40E50006A6E8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 98 | 3BEA1CEB1AFB40E50006A6E8 /* SerializationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SerializationTests.m; sourceTree = ""; }; 99 | 3BEA1CF51AFB41370006A6E8 /* CMDQueryStringReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMDQueryStringReader.h; sourceTree = ""; }; 100 | 3BEA1CF61AFB41370006A6E8 /* CMDQueryStringReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMDQueryStringReader.m; sourceTree = ""; }; 101 | 3BEA1CF71AFB41370006A6E8 /* CMDQueryStringSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMDQueryStringSerialization.h; sourceTree = ""; }; 102 | 3BEA1CF81AFB41370006A6E8 /* CMDQueryStringSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMDQueryStringSerialization.m; sourceTree = ""; }; 103 | 3BEA1CF91AFB41370006A6E8 /* CMDQueryStringValueTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMDQueryStringValueTransformer.h; sourceTree = ""; }; 104 | 3BEA1CFA1AFB41370006A6E8 /* CMDQueryStringValueTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMDQueryStringValueTransformer.m; sourceTree = ""; }; 105 | 3BEA1CFB1AFB41370006A6E8 /* CMDQueryStringWritingOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMDQueryStringWritingOptions.h; sourceTree = ""; }; 106 | 3BEA1CFD1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+CMDQueryStringSerialization.h"; sourceTree = ""; }; 107 | 3BEA1CFE1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+CMDQueryStringSerialization.m"; sourceTree = ""; }; 108 | 3BFF27E41B1EDBE0001E0555 /* CMDQueryStringSerialization.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CMDQueryStringSerialization.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 109 | 3BFF27EE1B1EDBE0001E0555 /* OS X Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OS X Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 110 | /* End PBXFileReference section */ 111 | 112 | /* Begin PBXFrameworksBuildPhase section */ 113 | 3BEA1CD51AFB40E40006A6E8 /* Frameworks */ = { 114 | isa = PBXFrameworksBuildPhase; 115 | buildActionMask = 2147483647; 116 | files = ( 117 | 3B43A8731B27B5FF00566A7E /* ISO8601.framework in Frameworks */, 118 | ); 119 | runOnlyForDeploymentPostprocessing = 0; 120 | }; 121 | 3BEA1CE11AFB40E50006A6E8 /* Frameworks */ = { 122 | isa = PBXFrameworksBuildPhase; 123 | buildActionMask = 2147483647; 124 | files = ( 125 | 3BEA1CE51AFB40E50006A6E8 /* CMDQueryStringSerialization.framework in Frameworks */, 126 | 3B43A8741B27B61A00566A7E /* ISO8601.framework in Frameworks */, 127 | ); 128 | runOnlyForDeploymentPostprocessing = 0; 129 | }; 130 | 3BFF27E01B1EDBE0001E0555 /* Frameworks */ = { 131 | isa = PBXFrameworksBuildPhase; 132 | buildActionMask = 2147483647; 133 | files = ( 134 | 3B43A8771B27B64500566A7E /* ISO8601.framework in Frameworks */, 135 | ); 136 | runOnlyForDeploymentPostprocessing = 0; 137 | }; 138 | 3BFF27EB1B1EDBE0001E0555 /* Frameworks */ = { 139 | isa = PBXFrameworksBuildPhase; 140 | buildActionMask = 2147483647; 141 | files = ( 142 | 3BFF27EF1B1EDBE1001E0555 /* CMDQueryStringSerialization.framework in Frameworks */, 143 | 3B43A8791B27B65100566A7E /* ISO8601.framework in Frameworks */, 144 | ); 145 | runOnlyForDeploymentPostprocessing = 0; 146 | }; 147 | /* End PBXFrameworksBuildPhase section */ 148 | 149 | /* Begin PBXGroup section */ 150 | 3BEA1CCF1AFB40E40006A6E8 = { 151 | isa = PBXGroup; 152 | children = ( 153 | 3BEA1CDB1AFB40E40006A6E8 /* CMDQueryStringSerialization */, 154 | 3BEA1CE81AFB40E50006A6E8 /* CMDQueryStringSerializationTests */, 155 | 3BEA1D0B1AFB43B40006A6E8 /* Frameworks */, 156 | 3BEA1CDA1AFB40E40006A6E8 /* Products */, 157 | ); 158 | sourceTree = ""; 159 | }; 160 | 3BEA1CDA1AFB40E40006A6E8 /* Products */ = { 161 | isa = PBXGroup; 162 | children = ( 163 | 3BEA1CD91AFB40E40006A6E8 /* CMDQueryStringSerialization.framework */, 164 | 3BEA1CE41AFB40E50006A6E8 /* iOS Tests.xctest */, 165 | 3BFF27E41B1EDBE0001E0555 /* CMDQueryStringSerialization.framework */, 166 | 3BFF27EE1B1EDBE0001E0555 /* OS X Tests.xctest */, 167 | ); 168 | name = Products; 169 | sourceTree = ""; 170 | }; 171 | 3BEA1CDB1AFB40E40006A6E8 /* CMDQueryStringSerialization */ = { 172 | isa = PBXGroup; 173 | children = ( 174 | 3BEA1CF71AFB41370006A6E8 /* CMDQueryStringSerialization.h */, 175 | 3BEA1CF81AFB41370006A6E8 /* CMDQueryStringSerialization.m */, 176 | 3BEA1CFB1AFB41370006A6E8 /* CMDQueryStringWritingOptions.h */, 177 | 3BEA1CF51AFB41370006A6E8 /* CMDQueryStringReader.h */, 178 | 3BEA1CF61AFB41370006A6E8 /* CMDQueryStringReader.m */, 179 | 3BEA1CF91AFB41370006A6E8 /* CMDQueryStringValueTransformer.h */, 180 | 3BEA1CFA1AFB41370006A6E8 /* CMDQueryStringValueTransformer.m */, 181 | 3BEA1CFD1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.h */, 182 | 3BEA1CFE1AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.m */, 183 | 3B65D3D41B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h */, 184 | 3B65D3D51B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m */, 185 | 3BEA1CDD1AFB40E40006A6E8 /* Info.plist */, 186 | ); 187 | path = CMDQueryStringSerialization; 188 | sourceTree = ""; 189 | }; 190 | 3BEA1CE81AFB40E50006A6E8 /* CMDQueryStringSerializationTests */ = { 191 | isa = PBXGroup; 192 | children = ( 193 | 3BEA1CEB1AFB40E50006A6E8 /* SerializationTests.m */, 194 | 3634A0941B1CC25500B1C866 /* CategoryTests.m */, 195 | 3BEA1CEA1AFB40E50006A6E8 /* Info.plist */, 196 | ); 197 | path = CMDQueryStringSerializationTests; 198 | sourceTree = ""; 199 | }; 200 | 3BEA1D0B1AFB43B40006A6E8 /* Frameworks */ = { 201 | isa = PBXGroup; 202 | children = ( 203 | 3B43A8721B27B5FA00566A7E /* ISO8601.framework */, 204 | 3B43A8761B27B63500566A7E /* ISO8601.framework */, 205 | ); 206 | name = Frameworks; 207 | sourceTree = ""; 208 | }; 209 | /* End PBXGroup section */ 210 | 211 | /* Begin PBXHeadersBuildPhase section */ 212 | 3BEA1CD61AFB40E40006A6E8 /* Headers */ = { 213 | isa = PBXHeadersBuildPhase; 214 | buildActionMask = 2147483647; 215 | files = ( 216 | 3BEA1D071AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.h in Headers */, 217 | 3B65D3D61B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.h in Headers */, 218 | 3BEA1CFF1AFB41370006A6E8 /* CMDQueryStringReader.h in Headers */, 219 | 3BEA1D031AFB41370006A6E8 /* CMDQueryStringValueTransformer.h in Headers */, 220 | 3BEA1D011AFB41370006A6E8 /* CMDQueryStringSerialization.h in Headers */, 221 | 3BEA1D051AFB41370006A6E8 /* CMDQueryStringWritingOptions.h in Headers */, 222 | ); 223 | runOnlyForDeploymentPostprocessing = 0; 224 | }; 225 | 3BFF27E11B1EDBE0001E0555 /* Headers */ = { 226 | isa = PBXHeadersBuildPhase; 227 | buildActionMask = 2147483647; 228 | files = ( 229 | 3BFF28011B1EDCC5001E0555 /* CMDQueryStringSerialization.h in Headers */, 230 | 3BFF280A1B1EDCC5001E0555 /* NSURL+CMDQueryStringSerialization.h in Headers */, 231 | 3BFF28041B1EDCC5001E0555 /* CMDQueryStringReader.h in Headers */, 232 | 3BFF28081B1EDCC5001E0555 /* NSString+CMDQueryStringSerialization.h in Headers */, 233 | 3BFF28061B1EDCC5001E0555 /* CMDQueryStringValueTransformer.h in Headers */, 234 | 3BFF28031B1EDCC5001E0555 /* CMDQueryStringWritingOptions.h in Headers */, 235 | ); 236 | runOnlyForDeploymentPostprocessing = 0; 237 | }; 238 | /* End PBXHeadersBuildPhase section */ 239 | 240 | /* Begin PBXNativeTarget section */ 241 | 3BEA1CD81AFB40E40006A6E8 /* iOS */ = { 242 | isa = PBXNativeTarget; 243 | buildConfigurationList = 3BEA1CEF1AFB40E50006A6E8 /* Build configuration list for PBXNativeTarget "iOS" */; 244 | buildPhases = ( 245 | 3BEA1CD41AFB40E40006A6E8 /* Sources */, 246 | 3BEA1CD51AFB40E40006A6E8 /* Frameworks */, 247 | 3BEA1CD61AFB40E40006A6E8 /* Headers */, 248 | 3BEA1CD71AFB40E40006A6E8 /* Resources */, 249 | ); 250 | buildRules = ( 251 | ); 252 | dependencies = ( 253 | ); 254 | name = iOS; 255 | productName = CMDQueryStringSerialization; 256 | productReference = 3BEA1CD91AFB40E40006A6E8 /* CMDQueryStringSerialization.framework */; 257 | productType = "com.apple.product-type.framework"; 258 | }; 259 | 3BEA1CE31AFB40E50006A6E8 /* iOS Tests */ = { 260 | isa = PBXNativeTarget; 261 | buildConfigurationList = 3BEA1CF21AFB40E50006A6E8 /* Build configuration list for PBXNativeTarget "iOS Tests" */; 262 | buildPhases = ( 263 | 3BEA1CE01AFB40E50006A6E8 /* Sources */, 264 | 3BEA1CE11AFB40E50006A6E8 /* Frameworks */, 265 | 3BEA1CE21AFB40E50006A6E8 /* Resources */, 266 | 3B03D1A11B279F7F00EF57EC /* Copy Frameworks */, 267 | ); 268 | buildRules = ( 269 | ); 270 | dependencies = ( 271 | 3BEA1CE71AFB40E50006A6E8 /* PBXTargetDependency */, 272 | ); 273 | name = "iOS Tests"; 274 | productName = CMDQueryStringSerializationTests; 275 | productReference = 3BEA1CE41AFB40E50006A6E8 /* iOS Tests.xctest */; 276 | productType = "com.apple.product-type.bundle.unit-test"; 277 | }; 278 | 3BFF27E31B1EDBE0001E0555 /* OS X */ = { 279 | isa = PBXNativeTarget; 280 | buildConfigurationList = 3BFF27F71B1EDBE1001E0555 /* Build configuration list for PBXNativeTarget "OS X" */; 281 | buildPhases = ( 282 | 3BFF27DF1B1EDBE0001E0555 /* Sources */, 283 | 3BFF27E01B1EDBE0001E0555 /* Frameworks */, 284 | 3BFF27E11B1EDBE0001E0555 /* Headers */, 285 | 3BFF27E21B1EDBE0001E0555 /* Resources */, 286 | ); 287 | buildRules = ( 288 | ); 289 | dependencies = ( 290 | ); 291 | name = "OS X"; 292 | productName = "CMDQueryStringSerialization-OSX"; 293 | productReference = 3BFF27E41B1EDBE0001E0555 /* CMDQueryStringSerialization.framework */; 294 | productType = "com.apple.product-type.framework"; 295 | }; 296 | 3BFF27ED1B1EDBE0001E0555 /* OS X Tests */ = { 297 | isa = PBXNativeTarget; 298 | buildConfigurationList = 3BFF27FA1B1EDBE1001E0555 /* Build configuration list for PBXNativeTarget "OS X Tests" */; 299 | buildPhases = ( 300 | 3BFF27EA1B1EDBE0001E0555 /* Sources */, 301 | 3BFF27EB1B1EDBE0001E0555 /* Frameworks */, 302 | 3BFF27EC1B1EDBE0001E0555 /* Resources */, 303 | 3B03D19F1B279F5A00EF57EC /* Copy Frameworks */, 304 | ); 305 | buildRules = ( 306 | ); 307 | dependencies = ( 308 | 3BFF27F11B1EDBE1001E0555 /* PBXTargetDependency */, 309 | ); 310 | name = "OS X Tests"; 311 | productName = "CMDQueryStringSerialization-OSXTests"; 312 | productReference = 3BFF27EE1B1EDBE0001E0555 /* OS X Tests.xctest */; 313 | productType = "com.apple.product-type.bundle.unit-test"; 314 | }; 315 | /* End PBXNativeTarget section */ 316 | 317 | /* Begin PBXProject section */ 318 | 3BEA1CD01AFB40E40006A6E8 /* Project object */ = { 319 | isa = PBXProject; 320 | attributes = { 321 | LastUpgradeCheck = 0630; 322 | ORGANIZATIONNAME = "Caleb Davenport"; 323 | TargetAttributes = { 324 | 3BEA1CD81AFB40E40006A6E8 = { 325 | CreatedOnToolsVersion = 6.3.1; 326 | }; 327 | 3BEA1CE31AFB40E50006A6E8 = { 328 | CreatedOnToolsVersion = 6.3.1; 329 | }; 330 | 3BFF27E31B1EDBE0001E0555 = { 331 | CreatedOnToolsVersion = 6.3.2; 332 | }; 333 | 3BFF27ED1B1EDBE0001E0555 = { 334 | CreatedOnToolsVersion = 6.3.2; 335 | }; 336 | }; 337 | }; 338 | buildConfigurationList = 3BEA1CD31AFB40E40006A6E8 /* Build configuration list for PBXProject "CMDQueryStringSerialization" */; 339 | compatibilityVersion = "Xcode 3.2"; 340 | developmentRegion = English; 341 | hasScannedForEncodings = 0; 342 | knownRegions = ( 343 | en, 344 | ); 345 | mainGroup = 3BEA1CCF1AFB40E40006A6E8; 346 | productRefGroup = 3BEA1CDA1AFB40E40006A6E8 /* Products */; 347 | projectDirPath = ""; 348 | projectRoot = ""; 349 | targets = ( 350 | 3BEA1CD81AFB40E40006A6E8 /* iOS */, 351 | 3BEA1CE31AFB40E50006A6E8 /* iOS Tests */, 352 | 3BFF27E31B1EDBE0001E0555 /* OS X */, 353 | 3BFF27ED1B1EDBE0001E0555 /* OS X Tests */, 354 | ); 355 | }; 356 | /* End PBXProject section */ 357 | 358 | /* Begin PBXResourcesBuildPhase section */ 359 | 3BEA1CD71AFB40E40006A6E8 /* Resources */ = { 360 | isa = PBXResourcesBuildPhase; 361 | buildActionMask = 2147483647; 362 | files = ( 363 | ); 364 | runOnlyForDeploymentPostprocessing = 0; 365 | }; 366 | 3BEA1CE21AFB40E50006A6E8 /* Resources */ = { 367 | isa = PBXResourcesBuildPhase; 368 | buildActionMask = 2147483647; 369 | files = ( 370 | ); 371 | runOnlyForDeploymentPostprocessing = 0; 372 | }; 373 | 3BFF27E21B1EDBE0001E0555 /* Resources */ = { 374 | isa = PBXResourcesBuildPhase; 375 | buildActionMask = 2147483647; 376 | files = ( 377 | ); 378 | runOnlyForDeploymentPostprocessing = 0; 379 | }; 380 | 3BFF27EC1B1EDBE0001E0555 /* Resources */ = { 381 | isa = PBXResourcesBuildPhase; 382 | buildActionMask = 2147483647; 383 | files = ( 384 | ); 385 | runOnlyForDeploymentPostprocessing = 0; 386 | }; 387 | /* End PBXResourcesBuildPhase section */ 388 | 389 | /* Begin PBXSourcesBuildPhase section */ 390 | 3BEA1CD41AFB40E40006A6E8 /* Sources */ = { 391 | isa = PBXSourcesBuildPhase; 392 | buildActionMask = 2147483647; 393 | files = ( 394 | 3B65D3D71B17DC3D006293B6 /* NSURL+CMDQueryStringSerialization.m in Sources */, 395 | 3BEA1D001AFB41370006A6E8 /* CMDQueryStringReader.m in Sources */, 396 | 3BEA1D041AFB41370006A6E8 /* CMDQueryStringValueTransformer.m in Sources */, 397 | 3BEA1D021AFB41370006A6E8 /* CMDQueryStringSerialization.m in Sources */, 398 | 3BEA1D081AFB41370006A6E8 /* NSString+CMDQueryStringSerialization.m in Sources */, 399 | ); 400 | runOnlyForDeploymentPostprocessing = 0; 401 | }; 402 | 3BEA1CE01AFB40E50006A6E8 /* Sources */ = { 403 | isa = PBXSourcesBuildPhase; 404 | buildActionMask = 2147483647; 405 | files = ( 406 | 3BEA1CEC1AFB40E50006A6E8 /* SerializationTests.m in Sources */, 407 | 3634A0951B1CC25500B1C866 /* CategoryTests.m in Sources */, 408 | ); 409 | runOnlyForDeploymentPostprocessing = 0; 410 | }; 411 | 3BFF27DF1B1EDBE0001E0555 /* Sources */ = { 412 | isa = PBXSourcesBuildPhase; 413 | buildActionMask = 2147483647; 414 | files = ( 415 | 3BFF280B1B1EDCC5001E0555 /* NSURL+CMDQueryStringSerialization.m in Sources */, 416 | 3BFF28021B1EDCC5001E0555 /* CMDQueryStringSerialization.m in Sources */, 417 | 3BFF28071B1EDCC5001E0555 /* CMDQueryStringValueTransformer.m in Sources */, 418 | 3BFF28051B1EDCC5001E0555 /* CMDQueryStringReader.m in Sources */, 419 | 3BFF28091B1EDCC5001E0555 /* NSString+CMDQueryStringSerialization.m in Sources */, 420 | ); 421 | runOnlyForDeploymentPostprocessing = 0; 422 | }; 423 | 3BFF27EA1B1EDBE0001E0555 /* Sources */ = { 424 | isa = PBXSourcesBuildPhase; 425 | buildActionMask = 2147483647; 426 | files = ( 427 | 3B03D1A31B279FAA00EF57EC /* SerializationTests.m in Sources */, 428 | 3B03D1A41B279FAA00EF57EC /* CategoryTests.m in Sources */, 429 | ); 430 | runOnlyForDeploymentPostprocessing = 0; 431 | }; 432 | /* End PBXSourcesBuildPhase section */ 433 | 434 | /* Begin PBXTargetDependency section */ 435 | 3BEA1CE71AFB40E50006A6E8 /* PBXTargetDependency */ = { 436 | isa = PBXTargetDependency; 437 | target = 3BEA1CD81AFB40E40006A6E8 /* iOS */; 438 | targetProxy = 3BEA1CE61AFB40E50006A6E8 /* PBXContainerItemProxy */; 439 | }; 440 | 3BFF27F11B1EDBE1001E0555 /* PBXTargetDependency */ = { 441 | isa = PBXTargetDependency; 442 | target = 3BFF27E31B1EDBE0001E0555 /* OS X */; 443 | targetProxy = 3BFF27F01B1EDBE1001E0555 /* PBXContainerItemProxy */; 444 | }; 445 | /* End PBXTargetDependency section */ 446 | 447 | /* Begin XCBuildConfiguration section */ 448 | 3BEA1CED1AFB40E50006A6E8 /* Debug */ = { 449 | isa = XCBuildConfiguration; 450 | buildSettings = { 451 | ALWAYS_SEARCH_USER_PATHS = NO; 452 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 453 | CLANG_CXX_LIBRARY = "libc++"; 454 | CLANG_ENABLE_MODULES = YES; 455 | CLANG_ENABLE_OBJC_ARC = YES; 456 | CLANG_WARN_BOOL_CONVERSION = YES; 457 | CLANG_WARN_CONSTANT_CONVERSION = YES; 458 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 459 | CLANG_WARN_EMPTY_BODY = YES; 460 | CLANG_WARN_ENUM_CONVERSION = YES; 461 | CLANG_WARN_INT_CONVERSION = YES; 462 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 463 | CLANG_WARN_UNREACHABLE_CODE = YES; 464 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 465 | COPY_PHASE_STRIP = NO; 466 | CURRENT_PROJECT_VERSION = 0.4.3; 467 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 468 | ENABLE_STRICT_OBJC_MSGSEND = YES; 469 | GCC_C_LANGUAGE_STANDARD = gnu99; 470 | GCC_DYNAMIC_NO_PIC = NO; 471 | GCC_NO_COMMON_BLOCKS = YES; 472 | GCC_OPTIMIZATION_LEVEL = 0; 473 | GCC_PREPROCESSOR_DEFINITIONS = ( 474 | "DEBUG=1", 475 | "$(inherited)", 476 | ); 477 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 478 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 479 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 480 | GCC_WARN_UNDECLARED_SELECTOR = YES; 481 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 482 | GCC_WARN_UNUSED_FUNCTION = YES; 483 | GCC_WARN_UNUSED_VARIABLE = YES; 484 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 485 | ONLY_ACTIVE_ARCH = YES; 486 | SDKROOT = iphoneos; 487 | TARGETED_DEVICE_FAMILY = "1,2"; 488 | VERSIONING_SYSTEM = "apple-generic"; 489 | VERSION_INFO_PREFIX = ""; 490 | }; 491 | name = Debug; 492 | }; 493 | 3BEA1CEE1AFB40E50006A6E8 /* Release */ = { 494 | isa = XCBuildConfiguration; 495 | buildSettings = { 496 | ALWAYS_SEARCH_USER_PATHS = NO; 497 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 498 | CLANG_CXX_LIBRARY = "libc++"; 499 | CLANG_ENABLE_MODULES = YES; 500 | CLANG_ENABLE_OBJC_ARC = YES; 501 | CLANG_WARN_BOOL_CONVERSION = YES; 502 | CLANG_WARN_CONSTANT_CONVERSION = YES; 503 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 504 | CLANG_WARN_EMPTY_BODY = YES; 505 | CLANG_WARN_ENUM_CONVERSION = YES; 506 | CLANG_WARN_INT_CONVERSION = YES; 507 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 508 | CLANG_WARN_UNREACHABLE_CODE = YES; 509 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 510 | COPY_PHASE_STRIP = NO; 511 | CURRENT_PROJECT_VERSION = 0.4.3; 512 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 513 | ENABLE_NS_ASSERTIONS = NO; 514 | ENABLE_STRICT_OBJC_MSGSEND = YES; 515 | GCC_C_LANGUAGE_STANDARD = gnu99; 516 | GCC_NO_COMMON_BLOCKS = YES; 517 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 518 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 519 | GCC_WARN_UNDECLARED_SELECTOR = YES; 520 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 521 | GCC_WARN_UNUSED_FUNCTION = YES; 522 | GCC_WARN_UNUSED_VARIABLE = YES; 523 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 524 | SDKROOT = iphoneos; 525 | TARGETED_DEVICE_FAMILY = "1,2"; 526 | VALIDATE_PRODUCT = YES; 527 | VERSIONING_SYSTEM = "apple-generic"; 528 | VERSION_INFO_PREFIX = ""; 529 | }; 530 | name = Release; 531 | }; 532 | 3BEA1CF01AFB40E50006A6E8 /* Debug */ = { 533 | isa = XCBuildConfiguration; 534 | buildSettings = { 535 | CODE_SIGN_IDENTITY = "iPhone Developer"; 536 | DEFINES_MODULE = YES; 537 | DYLIB_COMPATIBILITY_VERSION = 1; 538 | DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; 539 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 540 | FRAMEWORK_SEARCH_PATHS = ( 541 | "$(inherited)", 542 | "$(PROJECT_DIR)/Carthage/Build/iOS", 543 | ); 544 | INFOPLIST_FILE = CMDQueryStringSerialization/Info.plist; 545 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 546 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 547 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 548 | PRODUCT_NAME = CMDQueryStringSerialization; 549 | SKIP_INSTALL = YES; 550 | }; 551 | name = Debug; 552 | }; 553 | 3BEA1CF11AFB40E50006A6E8 /* Release */ = { 554 | isa = XCBuildConfiguration; 555 | buildSettings = { 556 | CODE_SIGN_IDENTITY = "iPhone Developer"; 557 | DEFINES_MODULE = YES; 558 | DYLIB_COMPATIBILITY_VERSION = 1; 559 | DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; 560 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 561 | FRAMEWORK_SEARCH_PATHS = ( 562 | "$(inherited)", 563 | "$(PROJECT_DIR)/Carthage/Build/iOS", 564 | ); 565 | INFOPLIST_FILE = CMDQueryStringSerialization/Info.plist; 566 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 567 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 568 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 569 | PRODUCT_NAME = CMDQueryStringSerialization; 570 | SKIP_INSTALL = YES; 571 | }; 572 | name = Release; 573 | }; 574 | 3BEA1CF31AFB40E50006A6E8 /* Debug */ = { 575 | isa = XCBuildConfiguration; 576 | buildSettings = { 577 | CODE_SIGN_IDENTITY = "iPhone Developer"; 578 | FRAMEWORK_SEARCH_PATHS = ( 579 | "$(SDKROOT)/Developer/Library/Frameworks", 580 | "$(inherited)", 581 | "$(PROJECT_DIR)/Carthage/Build/iOS", 582 | ); 583 | GCC_PREPROCESSOR_DEFINITIONS = ( 584 | "DEBUG=1", 585 | "$(inherited)", 586 | ); 587 | INFOPLIST_FILE = CMDQueryStringSerializationTests/Info.plist; 588 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 589 | PRODUCT_NAME = "$(TARGET_NAME)"; 590 | }; 591 | name = Debug; 592 | }; 593 | 3BEA1CF41AFB40E50006A6E8 /* Release */ = { 594 | isa = XCBuildConfiguration; 595 | buildSettings = { 596 | CODE_SIGN_IDENTITY = "iPhone Developer"; 597 | FRAMEWORK_SEARCH_PATHS = ( 598 | "$(SDKROOT)/Developer/Library/Frameworks", 599 | "$(inherited)", 600 | "$(PROJECT_DIR)/Carthage/Build/iOS", 601 | ); 602 | INFOPLIST_FILE = CMDQueryStringSerializationTests/Info.plist; 603 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 604 | PRODUCT_NAME = "$(TARGET_NAME)"; 605 | }; 606 | name = Release; 607 | }; 608 | 3BFF27F81B1EDBE1001E0555 /* Debug */ = { 609 | isa = XCBuildConfiguration; 610 | buildSettings = { 611 | COMBINE_HIDPI_IMAGES = YES; 612 | DEBUG_INFORMATION_FORMAT = dwarf; 613 | DEFINES_MODULE = YES; 614 | DYLIB_COMPATIBILITY_VERSION = 1; 615 | DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; 616 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 617 | FRAMEWORK_SEARCH_PATHS = ( 618 | "$(inherited)", 619 | "$(PROJECT_DIR)/Carthage/Build/Mac", 620 | ); 621 | GCC_PREPROCESSOR_DEFINITIONS = ( 622 | "DEBUG=1", 623 | "$(inherited)", 624 | ); 625 | INFOPLIST_FILE = CMDQueryStringSerialization/Info.plist; 626 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 627 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 628 | MACOSX_DEPLOYMENT_TARGET = 10.9; 629 | PRODUCT_NAME = CMDQueryStringSerialization; 630 | SDKROOT = macosx; 631 | SKIP_INSTALL = YES; 632 | }; 633 | name = Debug; 634 | }; 635 | 3BFF27F91B1EDBE1001E0555 /* Release */ = { 636 | isa = XCBuildConfiguration; 637 | buildSettings = { 638 | COMBINE_HIDPI_IMAGES = YES; 639 | DEFINES_MODULE = YES; 640 | DYLIB_COMPATIBILITY_VERSION = 1; 641 | DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; 642 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 643 | FRAMEWORK_SEARCH_PATHS = ( 644 | "$(inherited)", 645 | "$(PROJECT_DIR)/Carthage/Build/Mac", 646 | ); 647 | INFOPLIST_FILE = CMDQueryStringSerialization/Info.plist; 648 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 649 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 650 | MACOSX_DEPLOYMENT_TARGET = 10.9; 651 | PRODUCT_NAME = CMDQueryStringSerialization; 652 | SDKROOT = macosx; 653 | SKIP_INSTALL = YES; 654 | }; 655 | name = Release; 656 | }; 657 | 3BFF27FB1B1EDBE1001E0555 /* Debug */ = { 658 | isa = XCBuildConfiguration; 659 | buildSettings = { 660 | COMBINE_HIDPI_IMAGES = YES; 661 | DEBUG_INFORMATION_FORMAT = dwarf; 662 | FRAMEWORK_SEARCH_PATHS = ( 663 | "$(DEVELOPER_FRAMEWORKS_DIR)", 664 | "$(inherited)", 665 | "$(PROJECT_DIR)/Carthage/Build/Mac", 666 | ); 667 | GCC_PREPROCESSOR_DEFINITIONS = ( 668 | "DEBUG=1", 669 | "$(inherited)", 670 | ); 671 | INFOPLIST_FILE = CMDQueryStringSerializationTests/Info.plist; 672 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 673 | MACOSX_DEPLOYMENT_TARGET = 10.10; 674 | PRODUCT_NAME = "$(TARGET_NAME)"; 675 | SDKROOT = macosx; 676 | }; 677 | name = Debug; 678 | }; 679 | 3BFF27FC1B1EDBE1001E0555 /* Release */ = { 680 | isa = XCBuildConfiguration; 681 | buildSettings = { 682 | COMBINE_HIDPI_IMAGES = YES; 683 | FRAMEWORK_SEARCH_PATHS = ( 684 | "$(DEVELOPER_FRAMEWORKS_DIR)", 685 | "$(inherited)", 686 | "$(PROJECT_DIR)/Carthage/Build/Mac", 687 | ); 688 | INFOPLIST_FILE = CMDQueryStringSerializationTests/Info.plist; 689 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 690 | MACOSX_DEPLOYMENT_TARGET = 10.10; 691 | PRODUCT_NAME = "$(TARGET_NAME)"; 692 | SDKROOT = macosx; 693 | }; 694 | name = Release; 695 | }; 696 | /* End XCBuildConfiguration section */ 697 | 698 | /* Begin XCConfigurationList section */ 699 | 3BEA1CD31AFB40E40006A6E8 /* Build configuration list for PBXProject "CMDQueryStringSerialization" */ = { 700 | isa = XCConfigurationList; 701 | buildConfigurations = ( 702 | 3BEA1CED1AFB40E50006A6E8 /* Debug */, 703 | 3BEA1CEE1AFB40E50006A6E8 /* Release */, 704 | ); 705 | defaultConfigurationIsVisible = 0; 706 | defaultConfigurationName = Release; 707 | }; 708 | 3BEA1CEF1AFB40E50006A6E8 /* Build configuration list for PBXNativeTarget "iOS" */ = { 709 | isa = XCConfigurationList; 710 | buildConfigurations = ( 711 | 3BEA1CF01AFB40E50006A6E8 /* Debug */, 712 | 3BEA1CF11AFB40E50006A6E8 /* Release */, 713 | ); 714 | defaultConfigurationIsVisible = 0; 715 | defaultConfigurationName = Release; 716 | }; 717 | 3BEA1CF21AFB40E50006A6E8 /* Build configuration list for PBXNativeTarget "iOS Tests" */ = { 718 | isa = XCConfigurationList; 719 | buildConfigurations = ( 720 | 3BEA1CF31AFB40E50006A6E8 /* Debug */, 721 | 3BEA1CF41AFB40E50006A6E8 /* Release */, 722 | ); 723 | defaultConfigurationIsVisible = 0; 724 | defaultConfigurationName = Release; 725 | }; 726 | 3BFF27F71B1EDBE1001E0555 /* Build configuration list for PBXNativeTarget "OS X" */ = { 727 | isa = XCConfigurationList; 728 | buildConfigurations = ( 729 | 3BFF27F81B1EDBE1001E0555 /* Debug */, 730 | 3BFF27F91B1EDBE1001E0555 /* Release */, 731 | ); 732 | defaultConfigurationIsVisible = 0; 733 | defaultConfigurationName = Release; 734 | }; 735 | 3BFF27FA1B1EDBE1001E0555 /* Build configuration list for PBXNativeTarget "OS X Tests" */ = { 736 | isa = XCConfigurationList; 737 | buildConfigurations = ( 738 | 3BFF27FB1B1EDBE1001E0555 /* Debug */, 739 | 3BFF27FC1B1EDBE1001E0555 /* Release */, 740 | ); 741 | defaultConfigurationIsVisible = 0; 742 | defaultConfigurationName = Release; 743 | }; 744 | /* End XCConfigurationList section */ 745 | }; 746 | rootObject = 3BEA1CD01AFB40E40006A6E8 /* Project object */; 747 | } 748 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization.xcodeproj/xcshareddata/xcschemes/OS X.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization.xcodeproj/xcshareddata/xcschemes/iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/CMDQueryStringReader.h: -------------------------------------------------------------------------------- 1 | // 2 | // CMDQueryStringReader.h 3 | // CMDQueryStringSerialization 4 | // 5 | // Created by Caleb Davenport on 2/18/14. 6 | // Copyright (c) 2014 Caleb Davenport. All rights reserved. 7 | // 8 | 9 | #if defined(__has_feature) && __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | 15 | @interface CMDQueryStringReader : NSObject 16 | 17 | - (instancetype)initWithString:(NSString *)string; 18 | 19 | - (NSDictionary *)dictionaryValue; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/CMDQueryStringReader.m: -------------------------------------------------------------------------------- 1 | // 2 | // CMDQueryStringReader.m 3 | // CMDQueryStringSerialization 4 | // 5 | // Created by Caleb Davenport on 2/18/14. 6 | // Copyright (c) 2014 Caleb Davenport. All rights reserved. 7 | // 8 | 9 | #import "CMDQueryStringReader.h" 10 | #import "NSString+CMDQueryStringSerialization.h" 11 | 12 | @implementation CMDQueryStringReader { 13 | NSDictionary *_dictionary; 14 | } 15 | 16 | #pragma mark - Public 17 | 18 | - (instancetype)initWithString:(NSString *)string { 19 | if ((self = [super init])) { 20 | _dictionary = [[self class] dictionaryOfKeyValuePairsInString:string]; 21 | } 22 | return self; 23 | } 24 | 25 | 26 | - (NSDictionary *)dictionaryValue { 27 | return [_dictionary copy]; 28 | } 29 | 30 | 31 | #pragma mark - Private 32 | 33 | + (NSDictionary *)dictionaryOfKeyValuePairsInString:(NSString *)string { 34 | if (!string) { 35 | return nil; 36 | } 37 | 38 | NSMutableDictionary *dictionary = [NSMutableDictionary new]; 39 | [self enumerateKeyValuePairsInString:string block:^(NSString *key, NSString *value) { 40 | [self appendValue:value forKey:key toDictionary:dictionary]; 41 | }]; 42 | return [dictionary copy]; 43 | } 44 | 45 | 46 | + (void)enumerateKeyValuePairsInString:(NSString *)string block:(void (^) (NSString *key, NSString *value))block { 47 | if ([string length] == 0) { 48 | return; 49 | } 50 | NSArray *pairs = [string componentsSeparatedByString:@"&"]; 51 | for (NSString *pair in pairs) { 52 | NSRange range = [pair rangeOfString:@"="]; 53 | NSString *key = nil; 54 | NSString *value = nil; 55 | 56 | if (range.location == NSNotFound) { 57 | key = pair; 58 | value = @""; 59 | } 60 | else { 61 | key = [pair substringToIndex:range.location]; 62 | value = [pair substringFromIndex:(range.location + range.length)]; 63 | } 64 | 65 | key = [key CMDQueryStringSerialization_stringByRemovingEscapes]; 66 | key = [key stringByReplacingOccurrencesOfString:@"[]" withString:@""]; 67 | key = key ?: @""; 68 | 69 | NSArray *values = [value componentsSeparatedByString:@","]; 70 | for (__strong NSString *value in values) { 71 | value = [value CMDQueryStringSerialization_stringByRemovingEscapes]; 72 | value = value ?: @""; 73 | 74 | block(key, value); 75 | } 76 | } 77 | } 78 | 79 | 80 | + (void)appendValue:(NSString *)value forKey:(NSString *)key toDictionary:(NSMutableDictionary *)dictionary { 81 | id existingObject = dictionary[key]; 82 | if (existingObject) { 83 | if ([existingObject isKindOfClass:[NSArray class]]) { 84 | dictionary[key] = [existingObject arrayByAddingObject:value]; 85 | } 86 | else { 87 | dictionary[key] = @[ existingObject, value ]; 88 | } 89 | } 90 | else { 91 | dictionary[key] = value; 92 | } 93 | } 94 | 95 | @end 96 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/CMDQueryStringSerialization.h: -------------------------------------------------------------------------------- 1 | // 2 | // CMDQueryStringSerialization.h 3 | // CMDQueryStringSerialization 4 | // 5 | // Created by Caleb Davenport on 1/21/14. 6 | // Copyright (c) 2014 Caleb Davenport. All rights reserved. 7 | // 8 | 9 | #if defined(__has_feature) && __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | #import 15 | #import 16 | 17 | //! Project version number for Everest. 18 | FOUNDATION_EXPORT double CMDQueryStringSerializationVersionNumber; 19 | 20 | //! Project version string for GradientView. 21 | FOUNDATION_EXPORT const unsigned char CMDQueryStringSerializationVersionString[]; 22 | 23 | /** 24 | Easily convert between query strings and dictionaries. 25 | */ 26 | @interface CMDQueryStringSerialization : NSObject 27 | 28 | /** 29 | Read a query string into a dictionary. 30 | 31 | @param string Query string to be deserialized. 32 | @param options Serialization options. 33 | 34 | @return A dictionary. 35 | */ 36 | + (NSDictionary *)dictionaryWithQueryString:(NSString *)string; 37 | 38 | /** 39 | Serialize a dictionary into a query string. This is equivalent to calling 40 | `queryStringWithDictionary:options:` with 41 | `CMDQueryStringWritingOptionArrayRepeatKeys` 42 | and `CMDQueryStringWritingOptionDateAsUnixTimestamp`. 43 | 44 | @param dictionary Dictionary to be serialized. 45 | 46 | @return A query string. 47 | */ 48 | + (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary; 49 | 50 | /** 51 | Serialize a dictionary into a query string. 52 | 53 | @param dictionary Dictionary to be serialized. 54 | @param options Serialization options. 55 | 56 | @return A query string. 57 | 58 | @see queryStringWithDictionary: 59 | */ 60 | + (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary options:(CMDQueryStringWritingOptions)options; 61 | 62 | @end 63 | 64 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/CMDQueryStringSerialization.m: -------------------------------------------------------------------------------- 1 | // 2 | // CMDQueryStringSerialization.m 3 | // CMDQueryStringSerialization 4 | // 5 | // Created by Caleb Davenport on 1/21/14. 6 | // Copyright (c) 2014 Caleb Davenport. All rights reserved. 7 | // 8 | 9 | #import "CMDQueryStringSerialization.h" 10 | #import "CMDQueryStringReader.h" 11 | #import "CMDQueryStringValueTransformer.h" 12 | 13 | @implementation CMDQueryStringSerialization 14 | 15 | + (NSDictionary *)dictionaryWithQueryString:(NSString *)string { 16 | CMDQueryStringReader *reader = [[CMDQueryStringReader alloc] initWithString:string]; 17 | return [reader dictionaryValue]; 18 | } 19 | 20 | 21 | + (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary { 22 | CMDQueryStringWritingOptions options = ( 23 | CMDQueryStringWritingOptionArrayRepeatKeysWithBrackets | 24 | CMDQueryStringWritingOptionDateAsUnixTimestamp | 25 | CMDQueryStringWritingOptionAddPercentEscapes 26 | ); 27 | return [self queryStringWithDictionary:dictionary options:options]; 28 | } 29 | 30 | 31 | + (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary options:(CMDQueryStringWritingOptions)options { 32 | return [dictionary CMDQueryStringValueTransformer_queryStringWithKey:nil options:options]; 33 | } 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/CMDQueryStringValueTransformer.h: -------------------------------------------------------------------------------- 1 | // 2 | // CMDQueryStringValueTransformer.h 3 | // CMDQueryStringSerialization 4 | // 5 | // Created by Caleb Davenport on 7/11/14. 6 | // Copyright (c) 2014 Caleb Davenport. All rights reserved. 7 | // 8 | 9 | #if defined(__has_feature) && __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | #import "CMDQueryStringWritingOptions.h" 15 | 16 | @interface NSObject (CMDQueryStringValueTransformer) 17 | 18 | - (NSString *)CMDQueryStringValueTransformer_queryStringWithKey:(NSString *)key options:(CMDQueryStringWritingOptions)options; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/CMDQueryStringValueTransformer.m: -------------------------------------------------------------------------------- 1 | // 2 | // CMDQueryStringValueTransformer.m 3 | // CMDQueryStringSerialization 4 | // 5 | // Created by Caleb Davenport on 7/11/14. 6 | // Copyright (c) 2014 Caleb Davenport. All rights reserved. 7 | // 8 | 9 | #import "CMDQueryStringValueTransformer.h" 10 | #import "NSString+CMDQueryStringSerialization.h" 11 | 12 | #import 13 | 14 | @implementation NSObject (CMDQueryStringValueTransformer) 15 | 16 | - (NSString *)CMDQueryStringValueTransformer_queryStringWithKey:(NSString *)key options:(CMDQueryStringWritingOptions)options { 17 | NSString *escapedKey = nil; 18 | NSString *escapedValue = nil; 19 | 20 | if ((options & CMDQueryStringWritingOptionAddPercentEscapes) == CMDQueryStringWritingOptionAddPercentEscapes) { 21 | escapedKey = [key CMDQueryStringSerialization_stringByAddingEscapes]; 22 | escapedValue = [self.description CMDQueryStringSerialization_stringByAddingEscapes]; 23 | } 24 | else { 25 | escapedKey = key; 26 | escapedValue = self.description; 27 | } 28 | 29 | return [NSString stringWithFormat:@"%@=%@", escapedKey, escapedValue]; 30 | } 31 | 32 | @end 33 | 34 | @implementation NSArray (CMDQueryStringValueTransformer) 35 | 36 | - (NSString *)CMDQueryStringValueTransformer_queryStringWithKey:(NSString *)key options:(CMDQueryStringWritingOptions)options { 37 | NSString *escapedKey = nil; 38 | NSArray *escapedValues = nil; 39 | 40 | if ((options & CMDQueryStringWritingOptionAddPercentEscapes) == CMDQueryStringWritingOptionAddPercentEscapes) { 41 | escapedKey = [key CMDQueryStringSerialization_stringByAddingEscapes]; 42 | escapedValues = [self valueForKey:@"CMDQueryStringSerialization_stringByAddingEscapes"]; 43 | } 44 | else { 45 | escapedKey = key; 46 | escapedValues = self; 47 | } 48 | 49 | if ((options & CMDQueryStringWritingOptionArrayCommaSeparatedValues) == CMDQueryStringWritingOptionArrayCommaSeparatedValues) { 50 | return [NSString stringWithFormat:@"%@=%@", escapedKey, [escapedValues componentsJoinedByString:@","]]; 51 | } 52 | else if ((options & CMDQueryStringWritingOptionArrayRepeatKeysWithBrackets) == CMDQueryStringWritingOptionArrayRepeatKeysWithBrackets) { 53 | NSMutableArray *pairs = [[NSMutableArray alloc] init]; 54 | [escapedValues enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop) { 55 | NSString *pair = [NSString stringWithFormat:@"%@[]=%@", escapedKey, object]; 56 | [pairs addObject:pair]; 57 | }]; 58 | return [pairs componentsJoinedByString:@"&"]; 59 | } 60 | else { 61 | NSMutableArray *pairs = [[NSMutableArray alloc] init]; 62 | [escapedValues enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop) { 63 | NSString *pair = [NSString stringWithFormat:@"%@=%@", escapedKey, object]; 64 | [pairs addObject:pair]; 65 | }]; 66 | return [pairs componentsJoinedByString:@"&"]; 67 | } 68 | } 69 | 70 | @end 71 | 72 | @implementation NSDictionary (CMDQueryStringValueTransformer) 73 | 74 | - (NSString *)CMDQueryStringValueTransformer_queryStringWithKey:(NSString *)namespace options:(CMDQueryStringWritingOptions)options { 75 | NSMutableArray *pairs = [[NSMutableArray alloc] init]; 76 | [self enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) { 77 | 78 | // Ensure that key is a string 79 | if (![key isKindOfClass:[NSString class]]) { 80 | [NSException raise:NSInvalidArgumentException format:@"%@ is not a valid query string key.", key]; 81 | } 82 | 83 | // Convert values 84 | NSString *pair = [object CMDQueryStringValueTransformer_queryStringWithKey:key options:options]; 85 | [pairs addObject:pair]; 86 | }]; 87 | [pairs sortUsingSelector:@selector(compare:)]; 88 | return [pairs componentsJoinedByString:@"&"]; 89 | } 90 | 91 | @end 92 | 93 | @implementation NSDate (CMDQueryStringValueTransformer) 94 | 95 | - (NSString *)CMDQueryStringValueTransformer_queryStringWithKey:(NSString *)key options:(CMDQueryStringWritingOptions)options { 96 | if ((options & CMDQueryStringWritingOptionDateAsISO8601String) == CMDQueryStringWritingOptionDateAsISO8601String) { 97 | return [[self ISO8601String] CMDQueryStringValueTransformer_queryStringWithKey:key options:options]; 98 | } 99 | else { 100 | NSNumber *number = @((NSInteger)[self timeIntervalSince1970]); 101 | return [number CMDQueryStringValueTransformer_queryStringWithKey:key options:options]; 102 | } 103 | } 104 | 105 | @end 106 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/CMDQueryStringWritingOptions.h: -------------------------------------------------------------------------------- 1 | // 2 | // CMDQueryStringWritingOptions.h 3 | // CMDQueryStringSerialization 4 | // 5 | // Created by Caleb Davenport on 7/11/14. 6 | // Copyright (c) 2014 Caleb Davenport. All rights reserved. 7 | // 8 | 9 | typedef NS_OPTIONS(NSUInteger, CMDQueryStringWritingOptions) { 10 | 11 | // Default: Arrays encoded with format: `key=value1&key=value2` 12 | CMDQueryStringWritingOptionArrayRepeatKeys = 1 << 0, 13 | 14 | // Arrays encoded with format: `key[]=value1&key[]=value2` 15 | CMDQueryStringWritingOptionArrayRepeatKeysWithBrackets = 1 << 1, 16 | 17 | // Arrays encoded with format: `key=value1,value2` 18 | CMDQueryStringWritingOptionArrayCommaSeparatedValues = 1 << 2, 19 | 20 | // Defualt: Dates encoded as Unix time stamps 21 | CMDQueryStringWritingOptionDateAsUnixTimestamp = 1 << 3, 22 | 23 | // Dates encoded as ISO8601 strings 24 | CMDQueryStringWritingOptionDateAsISO8601String = 1 << 4, 25 | 26 | // Control whether keys and values are percent encoded 27 | CMDQueryStringWritingOptionAddPercentEscapes = 1 << 5, 28 | }; 29 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.calebd.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.4.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/NSString+CMDQueryStringSerialization.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+CMDQueryStringSerialization.h 3 | // CMDQueryStringSerialization 4 | // 5 | // Created by Bryan Irace on 1/26/14. 6 | // Copyright (c) 2014 Caleb Davenport. All rights reserved. 7 | // 8 | 9 | #if defined(__has_feature) && __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | 15 | @interface NSString (CMDQueryStringSerialization) 16 | 17 | - (NSString *)CMDQueryStringSerialization_stringByAddingEscapes; 18 | 19 | - (NSString *)CMDQueryStringSerialization_stringByRemovingEscapes; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/NSString+CMDQueryStringSerialization.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+CMDQueryStringSerialization.m 3 | // CMDQueryStringSerialization 4 | // 5 | // Created by Bryan Irace on 1/26/14. 6 | // Copyright (c) 2014 Caleb Davenport. All rights reserved. 7 | // 8 | 9 | #import "NSString+CMDQueryStringSerialization.h" 10 | 11 | @implementation NSString (CMDQueryStringSerialization) 12 | 13 | - (NSString *)CMDQueryStringSerialization_stringByAddingEscapes { 14 | CFStringRef string = CFURLCreateStringByAddingPercentEscapes( 15 | NULL, 16 | (CFStringRef)self, 17 | NULL, 18 | CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8 19 | ); 20 | return (NSString *)CFBridgingRelease(string); 21 | } 22 | 23 | 24 | - (NSString *)CMDQueryStringSerialization_stringByRemovingEscapes { 25 | return [self stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/NSURL+CMDQueryStringSerialization.h: -------------------------------------------------------------------------------- 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 | #if defined(__has_feature) && __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | 15 | @interface NSURL (CMDQueryStringSerialization) 16 | 17 | @property (nonatomic, readonly) NSDictionary *cmd_queryDictionary; 18 | 19 | - (NSURL *)cmd_URLWithQueryDictionary:(NSDictionary *)dictionary; 20 | 21 | - (NSURL *)cmd_URLByAddingQueryDictionary:(NSDictionary *)dictionary; 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /CMDQueryStringSerialization/NSURL+CMDQueryStringSerialization.m: -------------------------------------------------------------------------------- 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 | if ([dictionary count] == 0) { 16 | return self; 17 | } 18 | 19 | NSURLComponents *components = [NSURLComponents componentsWithURL:self resolvingAgainstBaseURL:YES]; 20 | components.query = [CMDQueryStringSerialization queryStringWithDictionary:dictionary]; 21 | return components.URL; 22 | } 23 | 24 | - (NSURL *)cmd_URLByAddingQueryDictionary:(NSDictionary *)dictionary { 25 | if ([dictionary count] == 0) { 26 | return self; 27 | } 28 | 29 | CMDQueryStringWritingOptions options = ( 30 | CMDQueryStringWritingOptionArrayRepeatKeysWithBrackets | 31 | CMDQueryStringWritingOptionDateAsUnixTimestamp 32 | ); 33 | 34 | NSURLComponents *components = [NSURLComponents componentsWithURL:self resolvingAgainstBaseURL:YES]; 35 | NSMutableDictionary *mutableParameters = [[NSMutableDictionary alloc] init]; 36 | [mutableParameters addEntriesFromDictionary:[CMDQueryStringSerialization dictionaryWithQueryString:components.query]]; 37 | [mutableParameters addEntriesFromDictionary:dictionary]; 38 | components.query = [CMDQueryStringSerialization queryStringWithDictionary:mutableParameters options:options]; 39 | return components.URL; 40 | } 41 | 42 | - (NSDictionary *)cmd_queryDictionary { 43 | return [CMDQueryStringSerialization dictionaryWithQueryString:self.query]; 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /CMDQueryStringSerializationTests/CategoryTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // CategoryTests.m 3 | // CMDQueryStringSerialization 4 | // 5 | // Created by Sam Soffes on 6/1/15. 6 | // Copyright (c) 2015 Caleb Davenport. All rights reserved. 7 | // 8 | 9 | @import XCTest; 10 | @import CMDQueryStringSerialization; 11 | 12 | @interface CategoryTests : XCTestCase 13 | @end 14 | 15 | @implementation CategoryTests 16 | 17 | - (void)testQueryDictionary { 18 | NSDictionary *desiredDictionary = @{ 19 | @"key_one" : @"value_one", 20 | @"key_two" : @"value_two" 21 | }; 22 | 23 | NSURL *URL = [NSURL URLWithString:@"http://apple.com"]; 24 | URL = [URL cmd_URLWithQueryDictionary:desiredDictionary]; 25 | 26 | NSDictionary *actualDictionary = URL.cmd_queryDictionary; 27 | XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect."); 28 | } 29 | 30 | - (void)testReplaceQueryDictionary { 31 | NSURL *URL = [NSURL URLWithString:@"http://apple.com"]; 32 | 33 | NSDictionary *firstDictionary = @{ 34 | @"key_one" : @"value_one", 35 | @"key_two" : @"value_two" 36 | }; 37 | NSDictionary *secondDictionary = @{ 38 | @"key_three" : @"value_one", 39 | @"key_four" : @"value_two" 40 | }; 41 | 42 | URL = [URL cmd_URLWithQueryDictionary:firstDictionary]; 43 | XCTAssertEqualObjects(URL.cmd_queryDictionary, firstDictionary, @"Query parameters are incorrect."); 44 | 45 | URL = [URL cmd_URLWithQueryDictionary:secondDictionary]; 46 | XCTAssertEqualObjects(URL.cmd_queryDictionary, secondDictionary, @"Query parameters are incorrect."); 47 | } 48 | 49 | - (void)testAddQueryDictionary { 50 | NSURL *URL = [NSURL URLWithString:@"http://apple.com"]; 51 | 52 | NSDictionary *firstDictionary = @{ 53 | @"key_one" : @"value_one", 54 | @"key_two" : @"value_two" 55 | }; 56 | NSDictionary *secondDictionary = @{ 57 | @"key_three" : @"value_one", 58 | @"key_four" : @"value_two" 59 | }; 60 | 61 | NSMutableDictionary *mergedDictionary = [[NSMutableDictionary alloc] init]; 62 | [mergedDictionary addEntriesFromDictionary:firstDictionary]; 63 | [mergedDictionary addEntriesFromDictionary:secondDictionary]; 64 | 65 | URL = [URL cmd_URLByAddingQueryDictionary:firstDictionary]; 66 | XCTAssertEqualObjects(URL.cmd_queryDictionary, firstDictionary, @"Query parameters are incorrect."); 67 | 68 | URL = [URL cmd_URLByAddingQueryDictionary:secondDictionary]; 69 | XCTAssertEqualObjects(URL.cmd_queryDictionary, mergedDictionary, @"Query parameters are incorrect."); 70 | } 71 | 72 | - (void)testEmptyQueryDictionary { 73 | NSURL *URL = [NSURL URLWithString:@"http://apple.com"]; 74 | 75 | XCTAssertEqualObjects(URL.absoluteString, [URL cmd_URLWithQueryDictionary:nil].absoluteString); 76 | XCTAssertEqualObjects(URL.absoluteString, [URL cmd_URLWithQueryDictionary:@{}].absoluteString); 77 | 78 | XCTAssertEqualObjects(URL.absoluteString, [URL cmd_URLByAddingQueryDictionary:nil].absoluteString); 79 | XCTAssertEqualObjects(URL.absoluteString, [URL cmd_URLByAddingQueryDictionary:@{}].absoluteString); 80 | } 81 | 82 | - (void)testEncodeAndDecode { 83 | NSDictionary *parameters = @{ 84 | @"message": @"Hello World", 85 | @"number": @"42", 86 | @"favorite_things": @[ @"cats", @"flower bed spreads" ], 87 | }; 88 | 89 | NSURL *URL = [NSURL URLWithString:@"http://apple.com"]; 90 | URL = [URL cmd_URLByAddingQueryDictionary:parameters]; 91 | XCTAssertEqualObjects(URL.cmd_queryDictionary, parameters); 92 | } 93 | 94 | @end 95 | -------------------------------------------------------------------------------- /CMDQueryStringSerializationTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.calebd.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /CMDQueryStringSerializationTests/SerializationTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // SerializationTests.m 3 | // CMDQueryStringSerializationTests 4 | // 5 | // Created by Caleb Davenport on 1/21/14. 6 | // Copyright (c) 2014 Caleb Davenport. All rights reserved. 7 | // 8 | 9 | @import XCTest; 10 | @import CMDQueryStringSerialization; 11 | 12 | @interface CMDQueryStringSerializationTests : XCTestCase 13 | @end 14 | 15 | @implementation CMDQueryStringSerializationTests 16 | 17 | - (void)testOneKeyValuePair { 18 | NSString *desiredString = @"key=value"; 19 | NSDictionary *desiredDictionary = @{ @"key" : @"value" }; 20 | 21 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary]; 22 | XCTAssertEqualObjects(actualString, desiredString, @"Query string is incorrect."); 23 | 24 | NSDictionary *actualDictionary = [CMDQueryStringSerialization dictionaryWithQueryString:desiredString]; 25 | XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect."); 26 | } 27 | 28 | 29 | - (void)testTwoKeyValuePairs { 30 | NSString *desiredString = @"key_one=value_one&key_two=value_two"; 31 | NSDictionary *desiredDictionary = @{ 32 | @"key_one" : @"value_one", 33 | @"key_two" : @"value_two" 34 | }; 35 | 36 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary]; 37 | XCTAssertEqualObjects(actualString, desiredString, @"Query string is incorrect."); 38 | 39 | NSDictionary *actualDictionary = [CMDQueryStringSerialization dictionaryWithQueryString:desiredString]; 40 | XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect."); 41 | } 42 | 43 | 44 | - (void)testQueryStringWithRepeatingParameterNoBrackets { 45 | NSString *desiredString = @"key=one&key=two"; 46 | NSDictionary *desiredDictionary = @{ 47 | @"key" : @[ @"one", @"two" ] 48 | }; 49 | 50 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary options:CMDQueryStringWritingOptionArrayRepeatKeys]; 51 | XCTAssertEqualObjects(actualString, desiredString, @"Query string is incorrect."); 52 | 53 | NSDictionary *actualDictionary = [CMDQueryStringSerialization dictionaryWithQueryString:desiredString]; 54 | XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect."); 55 | } 56 | 57 | 58 | - (void)testQueryStringWithRepeatingParameterWithBrackets { 59 | NSString *desiredString = @"key[]=one&key[]=two"; 60 | NSDictionary *desiredDictionary = @{ 61 | @"key" : @[ @"one", @"two" ] 62 | }; 63 | 64 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary options:CMDQueryStringWritingOptionArrayRepeatKeysWithBrackets]; 65 | XCTAssertEqualObjects(actualString, desiredString, @"Query string is incorrect."); 66 | 67 | NSDictionary *actualDictionary = [CMDQueryStringSerialization dictionaryWithQueryString:desiredString]; 68 | XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect."); 69 | } 70 | 71 | 72 | - (void)testQueryStringWithCommaDelimitedValue { 73 | NSString *desiredString = @"key=one,two"; 74 | NSDictionary *desiredDictionary = @{ 75 | @"key" : @[ @"one", @"two" ] 76 | }; 77 | 78 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary options:CMDQueryStringWritingOptionArrayCommaSeparatedValues]; 79 | XCTAssertEqualObjects(actualString, desiredString, @"Query string is incorrect."); 80 | 81 | NSDictionary *actualDictionary = [CMDQueryStringSerialization dictionaryWithQueryString:desiredString]; 82 | XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect."); 83 | } 84 | 85 | 86 | - (void)testQueryStringWithEmoji { 87 | NSString *desiredString = @"grinning=%F0%9F%98%81&winking=%F0%9F%98%89"; 88 | NSDictionary *desiredDictionary = @{ 89 | @"grinning" : @"😁", 90 | @"winking" : @"\U0001F609" 91 | }; 92 | 93 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary]; 94 | XCTAssertEqualObjects(actualString, desiredString, @"Query string is incorrect."); 95 | 96 | NSDictionary *actualDictionary = [CMDQueryStringSerialization dictionaryWithQueryString:desiredString]; 97 | XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect."); 98 | } 99 | 100 | 101 | - (void)testNilQueryString { 102 | NSDictionary *nilDictionary = [CMDQueryStringSerialization dictionaryWithQueryString:nil]; 103 | XCTAssertNil(nilDictionary); 104 | } 105 | 106 | 107 | - (void)testNilDictionary { 108 | NSString *nilString = [CMDQueryStringSerialization queryStringWithDictionary:nil]; 109 | XCTAssertNil(nilString); 110 | } 111 | 112 | 113 | - (void)testEmptyQueryString { 114 | NSString *desiredString = @""; 115 | NSDictionary *desiredDictionary = @{ }; 116 | 117 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary]; 118 | XCTAssertEqualObjects(actualString, desiredString, @"Query string is incorrect."); 119 | 120 | NSDictionary *actualDictionary = [CMDQueryStringSerialization dictionaryWithQueryString:desiredString]; 121 | XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect."); 122 | } 123 | 124 | 125 | - (void)testEmptyQueryStringKey { 126 | NSString *desiredString = @"=value"; 127 | NSDictionary *desiredDictionary = @{ @"" : @"value" }; 128 | 129 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary]; 130 | XCTAssertEqualObjects(actualString, desiredString, @"Query string is incorrect."); 131 | 132 | NSDictionary *actualDictionary = [CMDQueryStringSerialization dictionaryWithQueryString:desiredString]; 133 | XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect."); 134 | } 135 | 136 | 137 | - (void)testEmptyQueryStringValue { 138 | NSString *desiredString = @"key="; 139 | NSDictionary *desiredDictionary = @{ @"key" : @"" }; 140 | 141 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary]; 142 | XCTAssertEqualObjects(actualString, desiredString, @"Query string is incorrect."); 143 | 144 | NSDictionary *actualDictionary = [CMDQueryStringSerialization dictionaryWithQueryString:desiredString]; 145 | XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect."); 146 | } 147 | 148 | 149 | - (void)testQueryStringWithoutEqualCharacter { 150 | NSDictionary *desiredDictionary = @{ @"key" : @"" }; 151 | 152 | NSDictionary *actualDictionary = [CMDQueryStringSerialization dictionaryWithQueryString:@"key"]; 153 | XCTAssertEqualObjects(actualDictionary, desiredDictionary, @"Query parameters are incorrect."); 154 | } 155 | 156 | 157 | - (void)testDictionaryWithUnserializableKey { 158 | NSDictionary *desiredDictionary = @{ [NSDate date] : @"value" }; 159 | 160 | XCTAssertThrowsSpecificNamed([CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary], NSException, NSInvalidArgumentException); 161 | } 162 | 163 | 164 | - (void)testDictionaryWithDateAsUnixTimestamp { 165 | NSDate *inputDate = [NSDate date]; 166 | NSDictionary *inputDictionary = @{ @"date" : inputDate }; 167 | NSString *desiredString = [NSString stringWithFormat:@"date=%@", @((NSInteger)[inputDate timeIntervalSince1970])]; 168 | 169 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:inputDictionary]; 170 | XCTAssertEqualObjects(actualString, desiredString, @"Query string is incorrect."); 171 | } 172 | 173 | 174 | - (void)testDictionaryWithNumber { 175 | NSDictionary *desiredDictionary = @{ @"key": @13 }; 176 | NSString *desiredString = @"key=13"; 177 | 178 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary]; 179 | XCTAssertEqualObjects(actualString, desiredString, @"Query parameters are incorrect."); 180 | } 181 | 182 | 183 | - (void)testDictionaryWithFloatingPointNumber { 184 | NSDictionary *desiredDictionary = @{ @"key": @13.12 }; 185 | NSString *desiredString = @"key=13.12"; 186 | 187 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary]; 188 | XCTAssertEqualObjects(actualString, desiredString, @"Query parameters are incorrect."); 189 | } 190 | 191 | 192 | - (void)testDictionaryWithBooleanYES { 193 | NSDictionary *desiredDictionary = @{ @"key": @YES }; 194 | NSString *desiredString = @"key=1"; 195 | 196 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary]; 197 | XCTAssertEqualObjects(actualString, desiredString, @"Query parameters are incorrect."); 198 | } 199 | 200 | 201 | - (void)testDictionaryWithBooleanNO { 202 | NSDictionary *desiredDictionary = @{ @"key": @NO }; 203 | NSString *desiredString = @"key=0"; 204 | 205 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:desiredDictionary]; 206 | XCTAssertEqualObjects(actualString, desiredString, @"Query parameters are incorrect."); 207 | } 208 | 209 | - (void)testDateAsISO8601String { 210 | NSDate *date = [NSDate dateWithTimeIntervalSince1970:1406759723]; 211 | NSString *desiredString = @"date=2014-07-30T15%3A35%3A23-07%3A00"; 212 | 213 | NSDictionary *dictionary = @{ @"date": date }; 214 | CMDQueryStringWritingOptions options = (CMDQueryStringWritingOptionDateAsISO8601String | CMDQueryStringWritingOptionAddPercentEscapes); 215 | 216 | NSString *actualString = [CMDQueryStringSerialization queryStringWithDictionary:dictionary options:options]; 217 | XCTAssertEqualObjects(actualString, desiredString, @"Query parameters are incorrect."); 218 | } 219 | 220 | @end 221 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "soffes/ISO8601" 2 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "soffes/ISO8601" "v0.3.0" 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Caleb Davenport. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /Readme.markdown: -------------------------------------------------------------------------------- 1 | # CMDQueryStringSerialization 2 | 3 | ![Pod Version](https://cocoapod-badges.herokuapp.com/v/CMDQueryStringSerialization/badge.png) 4 | ![Pod Platform](https://cocoapod-badges.herokuapp.com/p/CMDQueryStringSerialization/badge.png) 5 | ![Pod License](https://cocoapod-badges.herokuapp.com/l/CMDQueryStringSerialization/badge.png) 6 | 7 | Easily convert between dictionaries and query strings in iOS and OS X. The API is similar to `NSJSONSerialization`. 8 | 9 | ## Usage 10 | 11 | ```objc 12 | NSString *queryString = [CMDQueryStringSerialization queryStringWithDictionary:dictionary]; 13 | ``` 14 | 15 | `CMDQueryStringSerialization` supports arrays encoded in one of the following three formats: 16 | 17 | * `key=value1&key=value2` 18 | * `key[]=value1&key[]=value2` 19 | * `key=value1,value2` 20 | 21 | `CMDQueryStringWritingOptions` contains options that map to each of these formats, with `CMDQueryStringWritingOptionArrayRepeatKeysWithBrackets` being the default if no option is passed. 22 | 23 | ## License 24 | 25 | `CMDQueryStringSerialization` is released under the MIT License. 26 | --------------------------------------------------------------------------------