From dc51e8eb6e3da1cec92d1e0bcbb4fc4059dfb778 Mon Sep 17 00:00:00 2001 From: Jeremy Fox Date: Thu, 23 Mar 2017 09:35:18 -0400 Subject: [PATCH] Removing Atlas submodule in favor of Carthage --- .gitmodules | 3 - Cartfile | 1 + Cartfile.resolved | 1 + Carthage/Checkouts/Atlas/.gitignore | 63 ++ Carthage/Checkouts/Atlas/.swiftlint.yml | 30 + .../Atlas/Atlas.xcodeproj/project.pbxproj | 848 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + ...1D856556-F625-4315-B381-804C17A6133F.plist | 22 + ...2AA91549-0535-4630-9386-28F6B97C8704.plist | 22 + ...3CCA6D92-2226-4048-81D3-37B46FCB1BCD.plist | 22 + ...577F96B0-9E42-4977-BDA3-23D2147C7091.plist | 48 + ...713B3095-6BB9-4F1B-853B-D2747FA69910.plist | 35 + ...E421B99F-9FEA-4A63-B29F-70828124DDF5.plist | 22 + .../Info.plist | 195 ++++ ...60297978-60BC-49CD-8F63-5C4963B1D08E.plist | 22 + ...A476BB86-BD4D-4823-A2CD-6A6E8C235B38.plist | 22 + .../Info.plist | 71 ++ .../xcshareddata/xcschemes/Atlas.xcscheme | 99 ++ .../xcshareddata/xcschemes/AtlasTV.xcscheme | 99 ++ Carthage/Checkouts/Atlas/Atlas/Atlas.h | 33 + Carthage/Checkouts/Atlas/Atlas/Atlas.swift | 136 +++ .../Atlas/Atlas/AtlasMappingExecutor.swift | 124 +++ ...tlasMappingExecutor+AtlasDateMapping.swift | 58 ++ .../Atlas/Extensions/Bool+AtlasMap.swift | 22 + .../Extensions/Dictionary+NullCleaning.swift | 48 + .../Atlas/Extensions/Double+AtlasMap.swift | 33 + .../Atlas/Extensions/Float+AtlasMap.swift | 33 + .../Atlas/Atlas/Extensions/Int+AtlasMap.swift | 96 ++ .../Atlas/Extensions/NSDate+Extensions.swift | 103 +++ .../Atlas/Extensions/String+AtlasMap.swift | 33 + .../Atlas/Extensions/UInt+AtlasMap.swift | 96 ++ Carthage/Checkouts/Atlas/Atlas/Info.plist | 26 + .../Checkouts/Atlas/Atlas/MappingError.swift | 69 ++ .../Protocols/AtlasDateMappingExecutor.swift | 54 ++ .../Atlas/Atlas/Protocols/AtlasMap.swift | 47 + .../Atlas/Protocols/AtlasMapExecutor.swift | 57 ++ Carthage/Checkouts/Atlas/AtlasTV/AtlasTV.h | 19 + Carthage/Checkouts/Atlas/AtlasTV/Info.plist | 26 + .../Atlas/AtlasTVTests/AtlasTVTests.swift | 36 + .../Checkouts/Atlas/AtlasTVTests/Info.plist | 24 + .../AtlasTests/AtlasJSONArrayTests.swift | 130 +++ .../AtlasTests/AtlasJSONDictionaryTests.swift | 101 +++ .../Checkouts/Atlas/AtlasTests/Info.plist | 24 + .../Atlas/AtlasTests/Int+AtlasMapTests.swift | 77 ++ .../Checkouts/Atlas/AtlasTests/TestJSON.swift | 109 +++ .../Atlas/AtlasTests/TestModels/Address.swift | 41 + .../AtlasTests/TestModels/FloorPlan.swift | 41 + .../Atlas/AtlasTests/TestModels/Photo.swift | 34 + .../Atlas/AtlasTests/TestModels/User.swift | 89 ++ .../Atlas/AtlasTests/UInt+AtlasMapTests.swift | 75 ++ Carthage/Checkouts/Atlas/Cartfile | 0 Carthage/Checkouts/Atlas/Cartfile.resolved | 0 Carthage/Checkouts/Atlas/LICENSE | 22 + Carthage/Checkouts/Atlas/README.md | 191 ++++ Carthage/Checkouts/Atlas/fastlane/.env.build | 8 + Carthage/Checkouts/Atlas/fastlane/Appfile | 7 + Carthage/Checkouts/Atlas/fastlane/README.md | 57 ++ Carthage/Checkouts/Atlas/fastlane/deploy.sh | 14 + Carthage/Checkouts/Atlas/fastlane/fastfile | 100 +++ Carthage/Checkouts/Atlas/fastlane/release.sh | 64 ++ .../Checkouts/Atlas/fastlane/release_notes.sh | 102 +++ Carthage/Checkouts/Atlas/rentpath_atlas.jpg | Bin 0 -> 22427 bytes Vendor/Atlas | 1 - 63 files changed, 4088 insertions(+), 4 deletions(-) create mode 100644 Cartfile create mode 100644 Cartfile.resolved create mode 100644 Carthage/Checkouts/Atlas/.gitignore create mode 100644 Carthage/Checkouts/Atlas/.swiftlint.yml create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/1D856556-F625-4315-B381-804C17A6133F.plist create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/2AA91549-0535-4630-9386-28F6B97C8704.plist create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/3CCA6D92-2226-4048-81D3-37B46FCB1BCD.plist create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/577F96B0-9E42-4977-BDA3-23D2147C7091.plist create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/713B3095-6BB9-4F1B-853B-D2747FA69910.plist create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/E421B99F-9FEA-4A63-B29F-70828124DDF5.plist create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/Info.plist create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/60297978-60BC-49CD-8F63-5C4963B1D08E.plist create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/A476BB86-BD4D-4823-A2CD-6A6E8C235B38.plist create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/Info.plist create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcschemes/Atlas.xcscheme create mode 100644 Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcschemes/AtlasTV.xcscheme create mode 100644 Carthage/Checkouts/Atlas/Atlas/Atlas.h create mode 100644 Carthage/Checkouts/Atlas/Atlas/Atlas.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/AtlasMappingExecutor.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Extensions/AtlasMappingExecutor+AtlasDateMapping.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Extensions/Bool+AtlasMap.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Extensions/Dictionary+NullCleaning.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Extensions/Double+AtlasMap.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Extensions/Float+AtlasMap.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Extensions/Int+AtlasMap.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Extensions/NSDate+Extensions.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Extensions/String+AtlasMap.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Extensions/UInt+AtlasMap.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Info.plist create mode 100644 Carthage/Checkouts/Atlas/Atlas/MappingError.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasDateMappingExecutor.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasMap.swift create mode 100644 Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasMapExecutor.swift create mode 100644 Carthage/Checkouts/Atlas/AtlasTV/AtlasTV.h create mode 100644 Carthage/Checkouts/Atlas/AtlasTV/Info.plist create mode 100644 Carthage/Checkouts/Atlas/AtlasTVTests/AtlasTVTests.swift create mode 100644 Carthage/Checkouts/Atlas/AtlasTVTests/Info.plist create mode 100644 Carthage/Checkouts/Atlas/AtlasTests/AtlasJSONArrayTests.swift create mode 100644 Carthage/Checkouts/Atlas/AtlasTests/AtlasJSONDictionaryTests.swift create mode 100644 Carthage/Checkouts/Atlas/AtlasTests/Info.plist create mode 100644 Carthage/Checkouts/Atlas/AtlasTests/Int+AtlasMapTests.swift create mode 100644 Carthage/Checkouts/Atlas/AtlasTests/TestJSON.swift create mode 100644 Carthage/Checkouts/Atlas/AtlasTests/TestModels/Address.swift create mode 100644 Carthage/Checkouts/Atlas/AtlasTests/TestModels/FloorPlan.swift create mode 100644 Carthage/Checkouts/Atlas/AtlasTests/TestModels/Photo.swift create mode 100644 Carthage/Checkouts/Atlas/AtlasTests/TestModels/User.swift create mode 100644 Carthage/Checkouts/Atlas/AtlasTests/UInt+AtlasMapTests.swift create mode 100644 Carthage/Checkouts/Atlas/Cartfile create mode 100644 Carthage/Checkouts/Atlas/Cartfile.resolved create mode 100644 Carthage/Checkouts/Atlas/LICENSE create mode 100644 Carthage/Checkouts/Atlas/README.md create mode 100644 Carthage/Checkouts/Atlas/fastlane/.env.build create mode 100644 Carthage/Checkouts/Atlas/fastlane/Appfile create mode 100644 Carthage/Checkouts/Atlas/fastlane/README.md create mode 100755 Carthage/Checkouts/Atlas/fastlane/deploy.sh create mode 100644 Carthage/Checkouts/Atlas/fastlane/fastfile create mode 100755 Carthage/Checkouts/Atlas/fastlane/release.sh create mode 100755 Carthage/Checkouts/Atlas/fastlane/release_notes.sh create mode 100644 Carthage/Checkouts/Atlas/rentpath_atlas.jpg delete mode 160000 Vendor/Atlas diff --git a/.gitmodules b/.gitmodules index 1586aef..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "Vendor/Atlas"] - path = Vendor/Atlas - url = git@github.com:rentpath/Atlas diff --git a/Cartfile b/Cartfile new file mode 100644 index 0000000..53fb374 --- /dev/null +++ b/Cartfile @@ -0,0 +1 @@ +github "rentpath/Atlas" diff --git a/Cartfile.resolved b/Cartfile.resolved new file mode 100644 index 0000000..ecb76ab --- /dev/null +++ b/Cartfile.resolved @@ -0,0 +1 @@ +github "rentpath/Atlas" "2.0.12" diff --git a/Carthage/Checkouts/Atlas/.gitignore b/Carthage/Checkouts/Atlas/.gitignore new file mode 100644 index 0000000..5e5d5ce --- /dev/null +++ b/Carthage/Checkouts/Atlas/.gitignore @@ -0,0 +1,63 @@ +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata + +## Other +*.xccheckout +*.moved-aside +*.xcuserstate +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md + +fastlane/report.xml +fastlane/screenshots diff --git a/Carthage/Checkouts/Atlas/.swiftlint.yml b/Carthage/Checkouts/Atlas/.swiftlint.yml new file mode 100644 index 0000000..640c01f --- /dev/null +++ b/Carthage/Checkouts/Atlas/.swiftlint.yml @@ -0,0 +1,30 @@ +#included: # paths to include during linting. `--path` is ignored if present. +# - Source +excluded: # paths to ignore during linting. Takes precedence over `included`. + - Carthage + - AtlasTests + - AtlasTVTests +variable_name: + excluded: # excluded via string array + - id + - URL + - url + - os +line_length: 155 +disabled_rules: + - nesting +opt_in_rules: + - conditional_returns_on_newline + - redundant_nil_coalesing + - switch_case_on_newline +custom_rules: + no_new_lines_in_function_definition: # rule identifier + name: "No New Lines In Function Definition" + regex: "\(\w+\:\s?[^\n\r\,]+\,\n" + message: "Keep function definitions on one line to allow the IDE to wrap as necessary." + severity: warning + # new_line_after_closure: # rule identifier + # name: "New Line After Closure" + # regex: "\}\n{1}.+?[\w\@]+?" + # message: "There should be a single empty line after each closure definition." + # severity: warning diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/project.pbxproj b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d3421d7 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/project.pbxproj @@ -0,0 +1,848 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1917F2B61D54E43900B2DBB6 /* UInt+AtlasMapTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1917F2B51D54E43900B2DBB6 /* UInt+AtlasMapTests.swift */; }; + 1917F2BD1D54FD5700B2DBB6 /* AtlasMappingExecutor+AtlasDateMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF687BC1D47B34D0012B361 /* AtlasMappingExecutor+AtlasDateMapping.swift */; }; + 19249C391DFB743B00168993 /* Int+AtlasMapTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A25978A1D525F9200276A7E /* Int+AtlasMapTests.swift */; }; + 196D23311D46AF7D007F8683 /* Address.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A3B16891D2EAFA000EEEA1A /* Address.swift */; }; + 196D23321D46AF80007F8683 /* Photo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A3B168B1D2EB05100EEEA1A /* Photo.swift */; }; + 196D23331D46AF82007F8683 /* FloorPlan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A3B168D1D2EB0B800EEEA1A /* FloorPlan.swift */; }; + 196D234C1D46B3C2007F8683 /* Bool+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23441D46B3C2007F8683 /* Bool+AtlasMap.swift */; }; + 196D234D1D46B3C2007F8683 /* Bool+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23441D46B3C2007F8683 /* Bool+AtlasMap.swift */; }; + 196D234E1D46B3C2007F8683 /* Dictionary+NullCleaning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23451D46B3C2007F8683 /* Dictionary+NullCleaning.swift */; }; + 196D234F1D46B3C2007F8683 /* Dictionary+NullCleaning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23451D46B3C2007F8683 /* Dictionary+NullCleaning.swift */; }; + 196D23501D46B3C2007F8683 /* Double+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23461D46B3C2007F8683 /* Double+AtlasMap.swift */; }; + 196D23511D46B3C2007F8683 /* Double+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23461D46B3C2007F8683 /* Double+AtlasMap.swift */; }; + 196D23521D46B3C2007F8683 /* Float+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23471D46B3C2007F8683 /* Float+AtlasMap.swift */; }; + 196D23531D46B3C2007F8683 /* Float+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23471D46B3C2007F8683 /* Float+AtlasMap.swift */; }; + 196D23541D46B3C2007F8683 /* Int+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23481D46B3C2007F8683 /* Int+AtlasMap.swift */; }; + 196D23551D46B3C2007F8683 /* Int+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23481D46B3C2007F8683 /* Int+AtlasMap.swift */; }; + 196D23561D46B3C2007F8683 /* NSDate+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23491D46B3C2007F8683 /* NSDate+Extensions.swift */; }; + 196D23571D46B3C2007F8683 /* NSDate+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23491D46B3C2007F8683 /* NSDate+Extensions.swift */; }; + 196D23581D46B3C2007F8683 /* String+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D234A1D46B3C2007F8683 /* String+AtlasMap.swift */; }; + 196D23591D46B3C2007F8683 /* String+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D234A1D46B3C2007F8683 /* String+AtlasMap.swift */; }; + 196D235B1D46B3D7007F8683 /* AtlasMapExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D235A1D46B3D7007F8683 /* AtlasMapExecutor.swift */; }; + 196D235C1D46B3D7007F8683 /* AtlasMapExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D235A1D46B3D7007F8683 /* AtlasMapExecutor.swift */; }; + 196D23611D46B53B007F8683 /* AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23601D46B53B007F8683 /* AtlasMap.swift */; }; + 196D23621D46B53B007F8683 /* AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23601D46B53B007F8683 /* AtlasMap.swift */; }; + 196D23641D46B897007F8683 /* AtlasMappingExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23631D46B897007F8683 /* AtlasMappingExecutor.swift */; }; + 196D23651D46B897007F8683 /* AtlasMappingExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23631D46B897007F8683 /* AtlasMappingExecutor.swift */; }; + 196D23671D46BB48007F8683 /* AtlasDateMappingExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23661D46BB48007F8683 /* AtlasDateMappingExecutor.swift */; }; + 196D23681D46BB48007F8683 /* AtlasDateMappingExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196D23661D46BB48007F8683 /* AtlasDateMappingExecutor.swift */; }; + 1A2597881D524F5900276A7E /* UInt+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A2597871D524F5900276A7E /* UInt+AtlasMap.swift */; }; + 1A2597891D524F5900276A7E /* UInt+AtlasMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A2597871D524F5900276A7E /* UInt+AtlasMap.swift */; }; + 1A25978B1D525F9200276A7E /* Int+AtlasMapTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A25978A1D525F9200276A7E /* Int+AtlasMapTests.swift */; }; + 1A3B168A1D2EAFA000EEEA1A /* Address.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A3B16891D2EAFA000EEEA1A /* Address.swift */; }; + 1A3B168C1D2EB05100EEEA1A /* Photo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A3B168B1D2EB05100EEEA1A /* Photo.swift */; }; + 1A3B168E1D2EB0B800EEEA1A /* FloorPlan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A3B168D1D2EB0B800EEEA1A /* FloorPlan.swift */; }; + 1AF687BD1D47B34D0012B361 /* AtlasMappingExecutor+AtlasDateMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF687BC1D47B34D0012B361 /* AtlasMappingExecutor+AtlasDateMapping.swift */; }; + 1AF952661CABF52A00D44B05 /* Atlas.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AF952651CABF52A00D44B05 /* Atlas.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1AF9526D1CABF52A00D44B05 /* Atlas.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AF952621CABF52A00D44B05 /* Atlas.framework */; }; + 1AF952721CABF52A00D44B05 /* AtlasJSONDictionaryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF952711CABF52A00D44B05 /* AtlasJSONDictionaryTests.swift */; }; + 1AF952831CABF81900D44B05 /* Atlas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF9527F1CABF81900D44B05 /* Atlas.swift */; }; + 1AF952861CAC08D900D44B05 /* MappingError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF952851CAC08D900D44B05 /* MappingError.swift */; }; + 1AF9528A1CAC103800D44B05 /* TestJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF952891CAC103800D44B05 /* TestJSON.swift */; }; + 1AF9528E1CAC152B00D44B05 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF9528D1CAC152B00D44B05 /* User.swift */; }; + 1AF952901CAC1D6400D44B05 /* AtlasJSONArrayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF9528F1CAC1D6400D44B05 /* AtlasJSONArrayTests.swift */; }; + 1AF952991CAC446B00D44B05 /* AtlasTV.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AF952981CAC446B00D44B05 /* AtlasTV.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1AF952A01CAC446B00D44B05 /* Atlas.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AF952961CAC446B00D44B05 /* Atlas.framework */; }; + 1AF952A51CAC446B00D44B05 /* AtlasTVTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF952A41CAC446B00D44B05 /* AtlasTVTests.swift */; }; + 1AF952B01CAC448000D44B05 /* Atlas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF9527F1CABF81900D44B05 /* Atlas.swift */; }; + 1AF952B11CAC448000D44B05 /* MappingError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF952851CAC08D900D44B05 /* MappingError.swift */; }; + 1AF952B21CAC451B00D44B05 /* AtlasJSONDictionaryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF952711CABF52A00D44B05 /* AtlasJSONDictionaryTests.swift */; }; + 1AF952B31CAC451D00D44B05 /* AtlasJSONArrayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF9528F1CAC1D6400D44B05 /* AtlasJSONArrayTests.swift */; }; + 1AF952B41CAC452000D44B05 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF9528D1CAC152B00D44B05 /* User.swift */; }; + 1AF952B51CAC452200D44B05 /* TestJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF952891CAC103800D44B05 /* TestJSON.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1AF9526E1CABF52A00D44B05 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1AF952591CABF52A00D44B05 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1AF952611CABF52A00D44B05; + remoteInfo = Atlas; + }; + 1AF952A11CAC446B00D44B05 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1AF952591CABF52A00D44B05 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1AF952951CAC446B00D44B05; + remoteInfo = AtlasTV; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 1917F2B51D54E43900B2DBB6 /* UInt+AtlasMapTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UInt+AtlasMapTests.swift"; sourceTree = ""; }; + 196D23441D46B3C2007F8683 /* Bool+AtlasMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bool+AtlasMap.swift"; sourceTree = ""; }; + 196D23451D46B3C2007F8683 /* Dictionary+NullCleaning.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+NullCleaning.swift"; sourceTree = ""; }; + 196D23461D46B3C2007F8683 /* Double+AtlasMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Double+AtlasMap.swift"; sourceTree = ""; }; + 196D23471D46B3C2007F8683 /* Float+AtlasMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Float+AtlasMap.swift"; sourceTree = ""; }; + 196D23481D46B3C2007F8683 /* Int+AtlasMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Int+AtlasMap.swift"; sourceTree = ""; }; + 196D23491D46B3C2007F8683 /* NSDate+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSDate+Extensions.swift"; sourceTree = ""; }; + 196D234A1D46B3C2007F8683 /* String+AtlasMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+AtlasMap.swift"; sourceTree = ""; }; + 196D235A1D46B3D7007F8683 /* AtlasMapExecutor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AtlasMapExecutor.swift; sourceTree = ""; }; + 196D23601D46B53B007F8683 /* AtlasMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = AtlasMap.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 196D23631D46B897007F8683 /* AtlasMappingExecutor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AtlasMappingExecutor.swift; sourceTree = ""; }; + 196D23661D46BB48007F8683 /* AtlasDateMappingExecutor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AtlasDateMappingExecutor.swift; sourceTree = ""; }; + 1A2597871D524F5900276A7E /* UInt+AtlasMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UInt+AtlasMap.swift"; sourceTree = ""; }; + 1A25978A1D525F9200276A7E /* Int+AtlasMapTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "Int+AtlasMapTests.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 1A3B16891D2EAFA000EEEA1A /* Address.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Address.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 1A3B168B1D2EB05100EEEA1A /* Photo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Photo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 1A3B168D1D2EB0B800EEEA1A /* FloorPlan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = FloorPlan.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 1AF687BC1D47B34D0012B361 /* AtlasMappingExecutor+AtlasDateMapping.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AtlasMappingExecutor+AtlasDateMapping.swift"; sourceTree = ""; }; + 1AF952621CABF52A00D44B05 /* Atlas.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Atlas.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1AF952651CABF52A00D44B05 /* Atlas.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Atlas.h; sourceTree = ""; }; + 1AF952671CABF52A00D44B05 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1AF9526C1CABF52A00D44B05 /* AtlasTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AtlasTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1AF952711CABF52A00D44B05 /* AtlasJSONDictionaryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AtlasJSONDictionaryTests.swift; sourceTree = ""; }; + 1AF952731CABF52A00D44B05 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1AF9527F1CABF81900D44B05 /* Atlas.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Atlas.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 1AF952851CAC08D900D44B05 /* MappingError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = MappingError.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 1AF952891CAC103800D44B05 /* TestJSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = TestJSON.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 1AF9528D1CAC152B00D44B05 /* User.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = User.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 1AF9528F1CAC1D6400D44B05 /* AtlasJSONArrayTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AtlasJSONArrayTests.swift; sourceTree = ""; }; + 1AF952961CAC446B00D44B05 /* Atlas.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Atlas.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1AF952981CAC446B00D44B05 /* AtlasTV.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AtlasTV.h; sourceTree = ""; }; + 1AF9529A1CAC446B00D44B05 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1AF9529F1CAC446B00D44B05 /* AtlasTVTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AtlasTVTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1AF952A41CAC446B00D44B05 /* AtlasTVTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AtlasTVTests.swift; sourceTree = ""; }; + 1AF952A61CAC446B00D44B05 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1AF9525E1CABF52A00D44B05 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1AF952691CABF52A00D44B05 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1AF9526D1CABF52A00D44B05 /* Atlas.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1AF952921CAC446B00D44B05 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1AF9529C1CAC446B00D44B05 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1AF952A01CAC446B00D44B05 /* Atlas.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 196D23431D46B3C2007F8683 /* Extensions */ = { + isa = PBXGroup; + children = ( + 1AF687BC1D47B34D0012B361 /* AtlasMappingExecutor+AtlasDateMapping.swift */, + 196D23441D46B3C2007F8683 /* Bool+AtlasMap.swift */, + 196D23451D46B3C2007F8683 /* Dictionary+NullCleaning.swift */, + 196D23461D46B3C2007F8683 /* Double+AtlasMap.swift */, + 196D23471D46B3C2007F8683 /* Float+AtlasMap.swift */, + 196D23481D46B3C2007F8683 /* Int+AtlasMap.swift */, + 1A2597871D524F5900276A7E /* UInt+AtlasMap.swift */, + 196D23491D46B3C2007F8683 /* NSDate+Extensions.swift */, + 196D234A1D46B3C2007F8683 /* String+AtlasMap.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 196D234B1D46B3C2007F8683 /* Protocols */ = { + isa = PBXGroup; + children = ( + 196D23601D46B53B007F8683 /* AtlasMap.swift */, + 196D235A1D46B3D7007F8683 /* AtlasMapExecutor.swift */, + 196D23661D46BB48007F8683 /* AtlasDateMappingExecutor.swift */, + ); + path = Protocols; + sourceTree = ""; + }; + 1AF952581CABF52A00D44B05 = { + isa = PBXGroup; + children = ( + 1AF952641CABF52A00D44B05 /* Atlas */, + 1AF952701CABF52A00D44B05 /* AtlasTests */, + 1AF952971CAC446B00D44B05 /* AtlasTV */, + 1AF952A31CAC446B00D44B05 /* AtlasTVTests */, + 1AF952631CABF52A00D44B05 /* Products */, + ); + sourceTree = ""; + }; + 1AF952631CABF52A00D44B05 /* Products */ = { + isa = PBXGroup; + children = ( + 1AF952621CABF52A00D44B05 /* Atlas.framework */, + 1AF9526C1CABF52A00D44B05 /* AtlasTests.xctest */, + 1AF952961CAC446B00D44B05 /* Atlas.framework */, + 1AF9529F1CAC446B00D44B05 /* AtlasTVTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 1AF952641CABF52A00D44B05 /* Atlas */ = { + isa = PBXGroup; + children = ( + 196D23431D46B3C2007F8683 /* Extensions */, + 196D234B1D46B3C2007F8683 /* Protocols */, + 196D23631D46B897007F8683 /* AtlasMappingExecutor.swift */, + 1AF9527F1CABF81900D44B05 /* Atlas.swift */, + 1AF952851CAC08D900D44B05 /* MappingError.swift */, + 1AF952841CABF81E00D44B05 /* Supporting Files */, + ); + path = Atlas; + sourceTree = ""; + }; + 1AF952701CABF52A00D44B05 /* AtlasTests */ = { + isa = PBXGroup; + children = ( + 1A25978A1D525F9200276A7E /* Int+AtlasMapTests.swift */, + 1AF952711CABF52A00D44B05 /* AtlasJSONDictionaryTests.swift */, + 1AF9528F1CAC1D6400D44B05 /* AtlasJSONArrayTests.swift */, + 1AF9528C1CAC151E00D44B05 /* TestModels */, + 1AF952881CAC101600D44B05 /* Supporting Files */, + 1917F2B51D54E43900B2DBB6 /* UInt+AtlasMapTests.swift */, + ); + path = AtlasTests; + sourceTree = ""; + }; + 1AF952841CABF81E00D44B05 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 1AF952651CABF52A00D44B05 /* Atlas.h */, + 1AF952671CABF52A00D44B05 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 1AF952881CAC101600D44B05 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 1AF952891CAC103800D44B05 /* TestJSON.swift */, + 1AF952731CABF52A00D44B05 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 1AF9528C1CAC151E00D44B05 /* TestModels */ = { + isa = PBXGroup; + children = ( + 1AF9528D1CAC152B00D44B05 /* User.swift */, + 1A3B16891D2EAFA000EEEA1A /* Address.swift */, + 1A3B168B1D2EB05100EEEA1A /* Photo.swift */, + 1A3B168D1D2EB0B800EEEA1A /* FloorPlan.swift */, + ); + path = TestModels; + sourceTree = ""; + }; + 1AF952971CAC446B00D44B05 /* AtlasTV */ = { + isa = PBXGroup; + children = ( + 1AF952981CAC446B00D44B05 /* AtlasTV.h */, + 1AF9529A1CAC446B00D44B05 /* Info.plist */, + ); + path = AtlasTV; + sourceTree = ""; + }; + 1AF952A31CAC446B00D44B05 /* AtlasTVTests */ = { + isa = PBXGroup; + children = ( + 1AF952A41CAC446B00D44B05 /* AtlasTVTests.swift */, + 1AF952A61CAC446B00D44B05 /* Info.plist */, + ); + path = AtlasTVTests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 1AF9525F1CABF52A00D44B05 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1AF952661CABF52A00D44B05 /* Atlas.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1AF952931CAC446B00D44B05 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1AF952991CAC446B00D44B05 /* AtlasTV.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 1AF952611CABF52A00D44B05 /* Atlas */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1AF952761CABF52A00D44B05 /* Build configuration list for PBXNativeTarget "Atlas" */; + buildPhases = ( + 1AF9525D1CABF52A00D44B05 /* Sources */, + 1AF9525E1CABF52A00D44B05 /* Frameworks */, + 1AF9525F1CABF52A00D44B05 /* Headers */, + 1AF952601CABF52A00D44B05 /* Resources */, + 19249C371DFB630700168993 /* Swiftlint */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Atlas; + productName = Atlas; + productReference = 1AF952621CABF52A00D44B05 /* Atlas.framework */; + productType = "com.apple.product-type.framework"; + }; + 1AF9526B1CABF52A00D44B05 /* AtlasTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1AF952791CABF52A00D44B05 /* Build configuration list for PBXNativeTarget "AtlasTests" */; + buildPhases = ( + 1AF952681CABF52A00D44B05 /* Sources */, + 1AF952691CABF52A00D44B05 /* Frameworks */, + 1AF9526A1CABF52A00D44B05 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1AF9526F1CABF52A00D44B05 /* PBXTargetDependency */, + ); + name = AtlasTests; + productName = AtlasTests; + productReference = 1AF9526C1CABF52A00D44B05 /* AtlasTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 1AF952951CAC446B00D44B05 /* AtlasTV */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1AF952A71CAC446B00D44B05 /* Build configuration list for PBXNativeTarget "AtlasTV" */; + buildPhases = ( + 1AF952911CAC446B00D44B05 /* Sources */, + 1AF952921CAC446B00D44B05 /* Frameworks */, + 1AF952931CAC446B00D44B05 /* Headers */, + 1AF952941CAC446B00D44B05 /* Resources */, + 19249C381DFB631900168993 /* Swiftlint */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AtlasTV; + productName = AtlasTV; + productReference = 1AF952961CAC446B00D44B05 /* Atlas.framework */; + productType = "com.apple.product-type.framework"; + }; + 1AF9529E1CAC446B00D44B05 /* AtlasTVTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1AF952AA1CAC446B00D44B05 /* Build configuration list for PBXNativeTarget "AtlasTVTests" */; + buildPhases = ( + 1AF9529B1CAC446B00D44B05 /* Sources */, + 1AF9529C1CAC446B00D44B05 /* Frameworks */, + 1AF9529D1CAC446B00D44B05 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1AF952A21CAC446B00D44B05 /* PBXTargetDependency */, + ); + name = AtlasTVTests; + productName = AtlasTVTests; + productReference = 1AF9529F1CAC446B00D44B05 /* AtlasTVTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1AF952591CABF52A00D44B05 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0800; + ORGANIZATIONNAME = RentPath; + TargetAttributes = { + 1AF952611CABF52A00D44B05 = { + CreatedOnToolsVersion = 7.2.1; + LastSwiftMigration = 0800; + }; + 1AF9526B1CABF52A00D44B05 = { + CreatedOnToolsVersion = 7.2.1; + LastSwiftMigration = 0800; + }; + 1AF952951CAC446B00D44B05 = { + CreatedOnToolsVersion = 7.2.1; + }; + 1AF9529E1CAC446B00D44B05 = { + CreatedOnToolsVersion = 7.2.1; + }; + }; + }; + buildConfigurationList = 1AF9525C1CABF52A00D44B05 /* Build configuration list for PBXProject "Atlas" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 1AF952581CABF52A00D44B05; + productRefGroup = 1AF952631CABF52A00D44B05 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1AF952611CABF52A00D44B05 /* Atlas */, + 1AF9526B1CABF52A00D44B05 /* AtlasTests */, + 1AF952951CAC446B00D44B05 /* AtlasTV */, + 1AF9529E1CAC446B00D44B05 /* AtlasTVTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1AF952601CABF52A00D44B05 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1AF9526A1CABF52A00D44B05 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1AF952941CAC446B00D44B05 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1AF9529D1CAC446B00D44B05 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 19249C371DFB630700168993 /* Swiftlint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = Swiftlint; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; + }; + 19249C381DFB631900168993 /* Swiftlint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = Swiftlint; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1AF9525D1CABF52A00D44B05 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1A2597881D524F5900276A7E /* UInt+AtlasMap.swift in Sources */, + 196D234E1D46B3C2007F8683 /* Dictionary+NullCleaning.swift in Sources */, + 196D23641D46B897007F8683 /* AtlasMappingExecutor.swift in Sources */, + 196D235B1D46B3D7007F8683 /* AtlasMapExecutor.swift in Sources */, + 196D23501D46B3C2007F8683 /* Double+AtlasMap.swift in Sources */, + 196D234C1D46B3C2007F8683 /* Bool+AtlasMap.swift in Sources */, + 196D23671D46BB48007F8683 /* AtlasDateMappingExecutor.swift in Sources */, + 196D23581D46B3C2007F8683 /* String+AtlasMap.swift in Sources */, + 196D23561D46B3C2007F8683 /* NSDate+Extensions.swift in Sources */, + 1AF687BD1D47B34D0012B361 /* AtlasMappingExecutor+AtlasDateMapping.swift in Sources */, + 196D23521D46B3C2007F8683 /* Float+AtlasMap.swift in Sources */, + 196D23611D46B53B007F8683 /* AtlasMap.swift in Sources */, + 1AF952831CABF81900D44B05 /* Atlas.swift in Sources */, + 196D23541D46B3C2007F8683 /* Int+AtlasMap.swift in Sources */, + 1AF952861CAC08D900D44B05 /* MappingError.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1AF952681CABF52A00D44B05 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1A3B168C1D2EB05100EEEA1A /* Photo.swift in Sources */, + 1AF952721CABF52A00D44B05 /* AtlasJSONDictionaryTests.swift in Sources */, + 1AF952901CAC1D6400D44B05 /* AtlasJSONArrayTests.swift in Sources */, + 1AF9528A1CAC103800D44B05 /* TestJSON.swift in Sources */, + 1AF9528E1CAC152B00D44B05 /* User.swift in Sources */, + 1A3B168E1D2EB0B800EEEA1A /* FloorPlan.swift in Sources */, + 1A25978B1D525F9200276A7E /* Int+AtlasMapTests.swift in Sources */, + 1A3B168A1D2EAFA000EEEA1A /* Address.swift in Sources */, + 1917F2B61D54E43900B2DBB6 /* UInt+AtlasMapTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1AF952911CAC446B00D44B05 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 196D234F1D46B3C2007F8683 /* Dictionary+NullCleaning.swift in Sources */, + 196D23651D46B897007F8683 /* AtlasMappingExecutor.swift in Sources */, + 196D235C1D46B3D7007F8683 /* AtlasMapExecutor.swift in Sources */, + 196D23511D46B3C2007F8683 /* Double+AtlasMap.swift in Sources */, + 196D234D1D46B3C2007F8683 /* Bool+AtlasMap.swift in Sources */, + 196D23681D46BB48007F8683 /* AtlasDateMappingExecutor.swift in Sources */, + 196D23591D46B3C2007F8683 /* String+AtlasMap.swift in Sources */, + 196D23571D46B3C2007F8683 /* NSDate+Extensions.swift in Sources */, + 196D23531D46B3C2007F8683 /* Float+AtlasMap.swift in Sources */, + 1917F2BD1D54FD5700B2DBB6 /* AtlasMappingExecutor+AtlasDateMapping.swift in Sources */, + 196D23621D46B53B007F8683 /* AtlasMap.swift in Sources */, + 1A2597891D524F5900276A7E /* UInt+AtlasMap.swift in Sources */, + 1AF952B01CAC448000D44B05 /* Atlas.swift in Sources */, + 196D23551D46B3C2007F8683 /* Int+AtlasMap.swift in Sources */, + 1AF952B11CAC448000D44B05 /* MappingError.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1AF9529B1CAC446B00D44B05 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 196D23321D46AF80007F8683 /* Photo.swift in Sources */, + 196D23311D46AF7D007F8683 /* Address.swift in Sources */, + 1AF952B41CAC452000D44B05 /* User.swift in Sources */, + 1AF952B51CAC452200D44B05 /* TestJSON.swift in Sources */, + 1AF952B31CAC451D00D44B05 /* AtlasJSONArrayTests.swift in Sources */, + 1AF952A51CAC446B00D44B05 /* AtlasTVTests.swift in Sources */, + 19249C391DFB743B00168993 /* Int+AtlasMapTests.swift in Sources */, + 1AF952B21CAC451B00D44B05 /* AtlasJSONDictionaryTests.swift in Sources */, + 196D23331D46AF82007F8683 /* FloorPlan.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 1AF9526F1CABF52A00D44B05 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1AF952611CABF52A00D44B05 /* Atlas */; + targetProxy = 1AF9526E1CABF52A00D44B05 /* PBXContainerItemProxy */; + }; + 1AF952A21CAC446B00D44B05 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1AF952951CAC446B00D44B05 /* AtlasTV */; + targetProxy = 1AF952A11CAC446B00D44B05 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 1AF952741CABF52A00D44B05 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1AF952751CABF52A00D44B05 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 1AF952771CABF52A00D44B05 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Atlas/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.rentpath.Atlas; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 1AF952781CABF52A00D44B05 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Atlas/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.rentpath.Atlas; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + 1AF9527A1CABF52A00D44B05 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = AtlasTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.rentpath.AtlasTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 1AF9527B1CABF52A00D44B05 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = AtlasTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.rentpath.AtlasTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + 1AF952A81CAC446B00D44B05 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = AtlasTV/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.rentpath.AtlasTV; + PRODUCT_NAME = Atlas; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0.1; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.1; + }; + name = Debug; + }; + 1AF952A91CAC446B00D44B05 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = AtlasTV/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.rentpath.AtlasTV; + PRODUCT_NAME = Atlas; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0.1; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.1; + }; + name = Release; + }; + 1AF952AB1CAC446B00D44B05 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = AtlasTVTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.rentpath.AtlasTVTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SWIFT_VERSION = 3.0.1; + TVOS_DEPLOYMENT_TARGET = 9.1; + }; + name = Debug; + }; + 1AF952AC1CAC446B00D44B05 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = AtlasTVTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.rentpath.AtlasTVTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SWIFT_VERSION = 3.0.1; + TVOS_DEPLOYMENT_TARGET = 9.1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1AF9525C1CABF52A00D44B05 /* Build configuration list for PBXProject "Atlas" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1AF952741CABF52A00D44B05 /* Debug */, + 1AF952751CABF52A00D44B05 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1AF952761CABF52A00D44B05 /* Build configuration list for PBXNativeTarget "Atlas" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1AF952771CABF52A00D44B05 /* Debug */, + 1AF952781CABF52A00D44B05 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1AF952791CABF52A00D44B05 /* Build configuration list for PBXNativeTarget "AtlasTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1AF9527A1CABF52A00D44B05 /* Debug */, + 1AF9527B1CABF52A00D44B05 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1AF952A71CAC446B00D44B05 /* Build configuration list for PBXNativeTarget "AtlasTV" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1AF952A81CAC446B00D44B05 /* Debug */, + 1AF952A91CAC446B00D44B05 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1AF952AA1CAC446B00D44B05 /* Build configuration list for PBXNativeTarget "AtlasTVTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1AF952AB1CAC446B00D44B05 /* Debug */, + 1AF952AC1CAC446B00D44B05 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 1AF952591CABF52A00D44B05 /* Project object */; +} diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..7d1f91e --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/1D856556-F625-4315-B381-804C17A6133F.plist b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/1D856556-F625-4315-B381-804C17A6133F.plist new file mode 100644 index 0000000..6a571e7 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/1D856556-F625-4315-B381-804C17A6133F.plist @@ -0,0 +1,22 @@ + + + + + classNames + + AtlasJSONDictionaryTests + + testPerformanceExample() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 17.5 + baselineIntegrationDisplayName + Sep 8, 2016, 11:46:27 AM + + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/2AA91549-0535-4630-9386-28F6B97C8704.plist b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/2AA91549-0535-4630-9386-28F6B97C8704.plist new file mode 100644 index 0000000..1188319 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/2AA91549-0535-4630-9386-28F6B97C8704.plist @@ -0,0 +1,22 @@ + + + + + classNames + + AtlasJSONDictionaryTests + + testPerformanceExample() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 15.709 + baselineIntegrationDisplayName + Local Baseline + + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/3CCA6D92-2226-4048-81D3-37B46FCB1BCD.plist b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/3CCA6D92-2226-4048-81D3-37B46FCB1BCD.plist new file mode 100644 index 0000000..f4dd36b --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/3CCA6D92-2226-4048-81D3-37B46FCB1BCD.plist @@ -0,0 +1,22 @@ + + + + + classNames + + AtlasTests + + testPerformanceExample() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.0015619 + baselineIntegrationDisplayName + Local Baseline + + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/577F96B0-9E42-4977-BDA3-23D2147C7091.plist b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/577F96B0-9E42-4977-BDA3-23D2147C7091.plist new file mode 100644 index 0000000..911ced5 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/577F96B0-9E42-4977-BDA3-23D2147C7091.plist @@ -0,0 +1,48 @@ + + + + + classNames + + AtlasJSONArrayTests + + testPerformanceExample() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.18233 + baselineIntegrationDisplayName + Local Baseline + + + + AtlasJSONDictionaryTests + + testPerformanceExample() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 13.251 + baselineIntegrationDisplayName + Local Baseline + + + + Int_AtlasMapTests + + testPerformanceExample() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.3706 + baselineIntegrationDisplayName + Local Baseline + + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/713B3095-6BB9-4F1B-853B-D2747FA69910.plist b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/713B3095-6BB9-4F1B-853B-D2747FA69910.plist new file mode 100644 index 0000000..fc48916 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/713B3095-6BB9-4F1B-853B-D2747FA69910.plist @@ -0,0 +1,35 @@ + + + + + classNames + + Int_AtlasMapTests + + testIntMappingPerformance() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.40218 + baselineIntegrationDisplayName + Local Baseline + + + + UInt_AtlasMapTests + + testIntMappingPerformance() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.40905 + baselineIntegrationDisplayName + Local Baseline + + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/E421B99F-9FEA-4A63-B29F-70828124DDF5.plist b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/E421B99F-9FEA-4A63-B29F-70828124DDF5.plist new file mode 100644 index 0000000..ab28f7d --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/E421B99F-9FEA-4A63-B29F-70828124DDF5.plist @@ -0,0 +1,22 @@ + + + + + classNames + + AtlasJSONDictionaryTests + + testPerformanceExample() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 16.342 + baselineIntegrationDisplayName + Local Baseline + + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/Info.plist b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/Info.plist new file mode 100644 index 0000000..ecf7e34 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9526B1CABF52A00D44B05.xcbaseline/Info.plist @@ -0,0 +1,195 @@ + + + + + runDestinationsByUUID + + 1D856556-F625-4315-B381-804C17A6133F + + localComputer + + busSpeedInMHz + 100 + cpuCount + 1 + cpuKind + Intel Core i7 + cpuSpeedInMHz + 2400 + logicalCPUCoresPerPackage + 8 + modelCode + MacBookPro10,1 + physicalCPUCoresPerPackage + 4 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + targetDevice + + modelCode + iPhone9,2 + platformIdentifier + com.apple.platform.iphonesimulator + + + 2AA91549-0535-4630-9386-28F6B97C8704 + + localComputer + + busSpeedInMHz + 100 + cpuCount + 1 + cpuKind + 6-Core Intel Xeon E5 + cpuSpeedInMHz + 3500 + logicalCPUCoresPerPackage + 12 + modelCode + MacPro6,1 + physicalCPUCoresPerPackage + 6 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + targetDevice + + modelCode + iPhone8,2 + platformIdentifier + com.apple.platform.iphonesimulator + + + 3CCA6D92-2226-4048-81D3-37B46FCB1BCD + + localComputer + + busSpeedInMHz + 100 + cpuCount + 1 + cpuKind + Intel Core i7 + cpuSpeedInMHz + 2500 + logicalCPUCoresPerPackage + 8 + modelCode + MacBookPro11,3 + physicalCPUCoresPerPackage + 4 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + targetDevice + + modelCode + iPhone8,2 + platformIdentifier + com.apple.platform.iphonesimulator + + + 577F96B0-9E42-4977-BDA3-23D2147C7091 + + localComputer + + busSpeedInMHz + 100 + cpuCount + 1 + cpuKind + Intel Core i7 + cpuSpeedInMHz + 2500 + logicalCPUCoresPerPackage + 8 + modelCode + MacBookPro11,3 + physicalCPUCoresPerPackage + 4 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + targetDevice + + modelCode + iPhone8,1 + platformIdentifier + com.apple.platform.iphonesimulator + + + 713B3095-6BB9-4F1B-853B-D2747FA69910 + + localComputer + + busSpeedInMHz + 100 + cpuCount + 1 + cpuKind + 6-Core Intel Xeon E5 + cpuSpeedInMHz + 3500 + logicalCPUCoresPerPackage + 12 + modelCode + MacPro6,1 + physicalCPUCoresPerPackage + 6 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + targetDevice + + modelCode + iPhone8,1 + platformIdentifier + com.apple.platform.iphonesimulator + + + E421B99F-9FEA-4A63-B29F-70828124DDF5 + + localComputer + + busSpeedInMHz + 100 + cpuCount + 1 + cpuKind + 6-Core Intel Xeon E5 + cpuSpeedInMHz + 3500 + logicalCPUCoresPerPackage + 12 + modelCode + MacPro6,1 + physicalCPUCoresPerPackage + 6 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + targetDevice + + modelCode + iPhone7,2 + platformIdentifier + com.apple.platform.iphonesimulator + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/60297978-60BC-49CD-8F63-5C4963B1D08E.plist b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/60297978-60BC-49CD-8F63-5C4963B1D08E.plist new file mode 100644 index 0000000..c7436d5 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/60297978-60BC-49CD-8F63-5C4963B1D08E.plist @@ -0,0 +1,22 @@ + + + + + classNames + + AtlasJSONDictionaryTests + + testPerformanceExample() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 15.872 + baselineIntegrationDisplayName + Local Baseline + + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/A476BB86-BD4D-4823-A2CD-6A6E8C235B38.plist b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/A476BB86-BD4D-4823-A2CD-6A6E8C235B38.plist new file mode 100644 index 0000000..170d8e6 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/A476BB86-BD4D-4823-A2CD-6A6E8C235B38.plist @@ -0,0 +1,22 @@ + + + + + classNames + + AtlasJSONDictionaryTests + + testPerformanceExample() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.0011732 + baselineIntegrationDisplayName + Local Baseline + + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/Info.plist b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/Info.plist new file mode 100644 index 0000000..54f8ebe --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcbaselines/1AF9529E1CAC446B00D44B05.xcbaseline/Info.plist @@ -0,0 +1,71 @@ + + + + + runDestinationsByUUID + + 60297978-60BC-49CD-8F63-5C4963B1D08E + + localComputer + + busSpeedInMHz + 100 + cpuCount + 1 + cpuKind + 6-Core Intel Xeon E5 + cpuSpeedInMHz + 3500 + logicalCPUCoresPerPackage + 12 + modelCode + MacPro6,1 + physicalCPUCoresPerPackage + 6 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + targetDevice + + modelCode + AppleTV5,3 + platformIdentifier + com.apple.platform.appletvsimulator + + + A476BB86-BD4D-4823-A2CD-6A6E8C235B38 + + localComputer + + busSpeedInMHz + 100 + cpuCount + 1 + cpuKind + Intel Core i7 + cpuSpeedInMHz + 2500 + logicalCPUCoresPerPackage + 8 + modelCode + MacBookPro11,3 + physicalCPUCoresPerPackage + 4 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + targetDevice + + modelCode + AppleTV5,3 + platformIdentifier + com.apple.platform.appletvsimulator + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcschemes/Atlas.xcscheme b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcschemes/Atlas.xcscheme new file mode 100644 index 0000000..96a5a0e --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcschemes/Atlas.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcschemes/AtlasTV.xcscheme b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcschemes/AtlasTV.xcscheme new file mode 100644 index 0000000..da5fd5d --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas.xcodeproj/xcshareddata/xcschemes/AtlasTV.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Atlas/Atlas/Atlas.h b/Carthage/Checkouts/Atlas/Atlas/Atlas.h new file mode 100644 index 0000000..a79d150 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Atlas.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016 RentPath + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#import + +//! Project version number for Atlas. +FOUNDATION_EXPORT double AtlasVersionNumber; + +//! Project version string for Atlas. +FOUNDATION_EXPORT const unsigned char AtlasVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Carthage/Checkouts/Atlas/Atlas/Atlas.swift b/Carthage/Checkouts/Atlas/Atlas/Atlas.swift new file mode 100644 index 0000000..e8d0681 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Atlas.swift @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import Foundation + +open class Atlas { + + static fileprivate let internalExecutor: AtlasMappingExecutor = { + let executor = AtlasMappingExecutor() + return executor + }() + var executor: AtlasMapExecutor! + var jsonArray: [JSON]! + var jsonObject: [String: JSON]! + + /** + Designated initializer that accepts JSON + + - Parameter json: A JSON object/array. Use NSJSONSerialization to get the JSON object/array from NSData and then pass the value into Atlas. + */ + required public init(_ json: JSON, executor: AtlasMapExecutor? = nil) throws { + self.executor = executor ?? Atlas.internalExecutor + switch json { + case let o as [String: JSON]: // swiftlint:disable:this switch_case_on_newline + jsonObject = o.cleaned() + case let a as [Any]: + jsonArray = a + default: + throw MappingError.notAJSONObjectError + } + } + + ///////////////////////////////////////////////////// + // MARK: - Top level object mapping - key not required + ///////////////////////////////////////////////////// + + open func object() throws -> T? { + do { + return try executor.object(jsonObject) + } catch { + throw error + } + } + + open func array() throws -> [T]? { + do { + return try executor.array(jsonArray) + } catch { + throw error + } + } + + ///////////////////////////////////////////////////// + // MARK: - Required Sub-object mapping - key required + ///////////////////////////////////////////////////// + + open func object(for key: String) throws -> T { + do { + return try executor.object(for: key, from: jsonObject) + } catch { + throw error + } + } + + open func array(for key: String) throws -> [T] { + do { + return try executor.array(for: key, from: jsonObject) + } catch { + throw error + } + } + + ///////////////////////////////////////////////////// + // MARK: - Optional Sub-object mapping - key required + ///////////////////////////////////////////////////// + + open func object(forOptional key: String) throws -> T? { + do { + return try executor.object(forOptional: key, from: jsonObject) + } catch { + throw error + } + } + + open func array(forOptional key: String) throws -> [T]? { + do { + return try executor.array(forOptional: key, from: jsonObject) + } catch { + throw error + } + } + + ///////////////////////////////////////////////////// + // MARK: - Date mapping - key required + ///////////////////////////////////////////////////// + + open func date(for key: String, to format: Date.DateFormat) throws -> Date? { + do { + return try executor.dateMappingExecutor?.date(for: key, to: format, from: jsonObject) + } catch { + throw error + } + } + + ///////////////////////////////////////////////////// + // MARK: - Date mapping - key not required + ///////////////////////////////////////////////////// + + open func date(forOptional key: String, to format: Date.DateFormat) throws -> Date? { + do { + return try executor.dateMappingExecutor?.date(forOptional: key, to: format, from: jsonObject) + } catch { + throw error + } + } + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/AtlasMappingExecutor.swift b/Carthage/Checkouts/Atlas/Atlas/AtlasMappingExecutor.swift new file mode 100644 index 0000000..9eb23f9 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/AtlasMappingExecutor.swift @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +open class AtlasMappingExecutor: AtlasMapExecutor { + + public init() { + + } + + open func object(_ object: [String: JSON]?) throws -> T? { + guard let unwrappedVal = object else { + throw MappingError.genericMappingError + } + + guard let mappedObject = try T.init(json: unwrappedVal as JSON) else { + throw MappingError.notMappable("Unable to map \(object) to type \(T.self)") + } + + return mappedObject + } + + open func array(_ array: [JSON]?) throws -> [T]? { + guard let unwrappedArray = array else { + throw MappingError.notAnArray + } + + var array = [T]() + for obj in unwrappedArray { + guard let mappedObj = try T.init(json: obj) else { + throw MappingError.notMappable("Unable to map \(array) to type \(T.self)") + } + + array.append(mappedObj) + } + + return array + } + + open func object(for key: String, from json: [String: JSON]?) throws -> T { + guard let unwrappedVal = json?[key] else { + throw MappingError.keyNotInJSONError("Mapping to \(T.self) failed. \(key) is not in the JSON object provided.") + } + + guard let mappedObject = try T.init(json: unwrappedVal) else { + throw MappingError.notMappable(".\(key) - Unable to map \(json) to type \(T.self)") + } + + return mappedObject + } + + open func array(for key: String, from json: [String: JSON]?) throws -> [T] { + guard let _array = json?[key] else { + throw MappingError.keyNotInJSONError("Mapping to \(T.self) failed. \(key) is not in the JSON object provided.") + } + + guard let __array = _array as? [JSON] else { + throw MappingError.notAnArray + } + + var array = [T]() + for obj in __array { + guard let mappedObj = try T.init(json: obj) else { + throw MappingError.notMappable(".\(key) - Unable to map \(_array) to type \(T.self)") + } + + array.append(mappedObj) + } + + return array + } + + open func object(forOptional key: String, from json: [String: JSON]?) throws -> T? { + guard let unwrappedVal = json?[key] else { + return nil + } + + guard let mappedObject = try T.init(json: unwrappedVal) else { + throw MappingError.notMappable(".\(key) - Unable to map \(json) to type \(T.self)") + } + + return mappedObject + } + + open func array(forOptional key: String, from json: [String: JSON]?) throws -> [T]? { + guard let _array = json?[key] else { + return nil + } + + guard let __array = _array as? [JSON] else { + throw MappingError.notAnArray + } + + var array = [T]() + for obj in __array { + guard let mappedObj = try T.init(json: obj) else { + throw MappingError.notMappable(".\(key) - Unable to map \(_array) to type \(T.self)") + } + + array.append(mappedObj) + } + + return array + } + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Extensions/AtlasMappingExecutor+AtlasDateMapping.swift b/Carthage/Checkouts/Atlas/Atlas/Extensions/AtlasMappingExecutor+AtlasDateMapping.swift new file mode 100644 index 0000000..a4f1f84 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Extensions/AtlasMappingExecutor+AtlasDateMapping.swift @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import Foundation + +extension AtlasMappingExecutor: AtlasDateMappingExecutor { + + public var dateMappingExecutor: AtlasDateMappingExecutor? { + return self + } + + public func date(for key: String, to format: Date.DateFormat, from json: [String: JSON]?) throws -> Date? { + guard let _val = json?[key] as? String, !_val.isEmpty else { + let message = "The value of key \(key) in the provided JSON object isn't a String and therefore cannot be mapped to an NSDate." + throw MappingError.notMappable(message) + } + + guard let date = Date.dateFromString(_val, withFormat: format) else { + let message = "The date string \(_val) of key \(key) in the provided JSON object does not match the RFC3339 format." + throw MappingError.notMappable(message) + } + + return date + } + + public func date(forOptional key: String, to format: Date.DateFormat, from json: [String: JSON]?) throws -> Date? { + guard let _val = json?[key] as? String, !_val.isEmpty else { + return nil + } + + guard let date = Date.dateFromString(_val, withFormat: format) else { + let message = "The date string \(_val) of key \(key) in the provided JSON object does not match the RFC3339 format." + throw MappingError.notMappable(message) + } + + return date + } + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Extensions/Bool+AtlasMap.swift b/Carthage/Checkouts/Atlas/Atlas/Extensions/Bool+AtlasMap.swift new file mode 100644 index 0000000..833e975 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Extensions/Bool+AtlasMap.swift @@ -0,0 +1,22 @@ +// +// Bool+AtlasMap.swift +// Atlas +// +// Created by Jeremy Fox on 7/25/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +extension Bool: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) throws { + guard let _bool = json as? Bool else { + return nil + } + self = _bool + } + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Extensions/Dictionary+NullCleaning.swift b/Carthage/Checkouts/Atlas/Atlas/Extensions/Dictionary+NullCleaning.swift new file mode 100644 index 0000000..a3cacf4 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Extensions/Dictionary+NullCleaning.swift @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import Foundation + +public extension Dictionary { + + /** + + Dictionary extention method to remove null values + + - Returns: Dictionary with null values removed + + */ + public func cleaned() -> Dictionary { + var cleanedDict = [Key: Value]() + for val in self { + switch val.1 { + case is NSNull: + continue + default: + cleanedDict[val.0] = val.1 + } + } + + return cleanedDict + } + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Extensions/Double+AtlasMap.swift b/Carthage/Checkouts/Atlas/Atlas/Extensions/Double+AtlasMap.swift new file mode 100644 index 0000000..137d357 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Extensions/Double+AtlasMap.swift @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +extension Double: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) { + self = Double("\(json)")! + } + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Extensions/Float+AtlasMap.swift b/Carthage/Checkouts/Atlas/Atlas/Extensions/Float+AtlasMap.swift new file mode 100644 index 0000000..ff75e3a --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Extensions/Float+AtlasMap.swift @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +extension Float: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) { + self = Float("\(json)")! + } + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Extensions/Int+AtlasMap.swift b/Carthage/Checkouts/Atlas/Atlas/Extensions/Int+AtlasMap.swift new file mode 100644 index 0000000..6b89013 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Extensions/Int+AtlasMap.swift @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +extension Int: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) throws { + guard let _int = Int("\(json)") else { + throw MappingError.notMappable("Unable to map \(json) to type Int") + } + self = _int + } + +} + +extension Int8: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) throws { + guard let _int = Int8("\(json)") else { + throw MappingError.notMappable("Unable to map \(json) to type Int8") + } + self = _int + } + +} + +extension Int16: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) throws { + guard let _int = Int16("\(json)") else { + throw MappingError.notMappable("Unable to map \(json) to type Int16") + } + self = _int + } + +} + +extension Int32: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) throws { + guard let _int = Int32("\(json)") else { + throw MappingError.notMappable("Unable to map \(json) to type Int32") + } + self = _int + } + +} + +extension Int64: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) throws { + guard let _int = Int64("\(json)") else { + throw MappingError.notMappable("Unable to map \(json) to type Int64") + } + self = _int + } + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Extensions/NSDate+Extensions.swift b/Carthage/Checkouts/Atlas/Atlas/Extensions/NSDate+Extensions.swift new file mode 100644 index 0000000..8b682d0 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Extensions/NSDate+Extensions.swift @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import Foundation + +public extension Date { + + public enum DateFormat { + case rfc3339, iso8601, custom(String) + } + + fileprivate struct Static { + static var formatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.S'Z'" + return formatter + }() + } + + /** + + NSDate extention to convert NSDate to RFC3339 standard (eg: "2016-02-05T12:30:05.123Z"). + + - returns String date with RFC3339 format + + */ + public func toRFC3339String() -> String { + let formatter = Static.formatter + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.S'Z'" + return formatter.string(from: self) + } + + /** + + NSDate extention to convert NSDate to RFC3339 standard (eg: "2016-02-05T12:30:05.123Z"). + + - returns String date with RFC3339 format + + */ + public func toISO8601String() -> String { + let formatter = Static.formatter + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.S'Z'" + return formatter.string(from: self) + } + + /** + + Convert RFC3339 date string to NSDate + + - Parameter string: RFC3339 date string + + - Returns: An Optional NSDate + + */ + public static func dateFromRFC3339String(_ string: String) -> Date? { + return dateFromString(string, withFormat: .rfc3339) + } + + /** + + Convert date string to date for a given format + + - Parameters: + - dateString: string date + - withFormat: format of the string date + + - Returns: NSDate after converting dateString + + */ + public static func dateFromString(_ dateString: String, withFormat format: DateFormat) -> Date? { + let formatter = Static.formatter + switch format { + case .rfc3339: + fallthrough + case .iso8601: + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.S'Z'" + case let .custom(_format): + formatter.dateFormat = _format + } + + return formatter.date(from: dateString) + } + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Extensions/String+AtlasMap.swift b/Carthage/Checkouts/Atlas/Atlas/Extensions/String+AtlasMap.swift new file mode 100644 index 0000000..da9bb03 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Extensions/String+AtlasMap.swift @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +extension String: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) { + self = String(describing:json) + } + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Extensions/UInt+AtlasMap.swift b/Carthage/Checkouts/Atlas/Atlas/Extensions/UInt+AtlasMap.swift new file mode 100644 index 0000000..84cc6a2 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Extensions/UInt+AtlasMap.swift @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +extension UInt: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) throws { + guard let _int = UInt("\(json)") else { + throw MappingError.notMappable("Unable to map \(json) to type Int32") + } + self = _int + } + +} + +extension UInt8: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) throws { + guard let _int = UInt8("\(json)") else { + throw MappingError.notMappable("Unable to map \(json) to type Int32") + } + self = _int + } + +} + +extension UInt16: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) throws { + guard let _int = UInt16("\(json)") else { + throw MappingError.notMappable("Unable to map \(json) to type Int32") + } + self = _int + } + +} + +extension UInt32: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) throws { + guard let _int = UInt32("\(json)") else { + throw MappingError.notMappable("Unable to map \(json) to type Int32") + } + self = _int + } + +} + +extension UInt64: AtlasMap { + + public func toJSON() -> JSON? { + return nil + } + + public init?(json: JSON) throws { + guard let _int = UInt64("\(json)") else { + throw MappingError.notMappable("Unable to map \(json) to type Int32") + } + self = _int + } + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Info.plist b/Carthage/Checkouts/Atlas/Atlas/Info.plist new file mode 100644 index 0000000..d3de8ee --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/Atlas/Atlas/MappingError.swift b/Carthage/Checkouts/Atlas/Atlas/MappingError.swift new file mode 100644 index 0000000..2df4ce6 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/MappingError.swift @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +public enum MappingError: Error { + + /** + + There is no key available. Please make sure you first call `-key:` and pass the key that corresponds to the value in JSON you want to map. + + */ + case noKeyError + + /** + + 'key' does not exist in `_json`. + + - Parameters String: name of key + + */ + case keyNotInJSONError(String) + + /** + + There was an error during the mapping process + + */ + case genericMappingError + + /** + + Thrown when `json` is not of type [String: Any] or [Any], which are the only two types a true JSON object could be + + */ + case notAJSONObjectError + + /** + + Thrown when not able to map a JSON value to specified type + + */ + case notMappable(String) + + /** + + Asked to map a JSON object to an array using `-toArrayOf:` but the JSON object trying to be mapped is not a valid JSON Array. + + */ + case notAnArray + +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasDateMappingExecutor.swift b/Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasDateMappingExecutor.swift new file mode 100644 index 0000000..2f3cda4 --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasDateMappingExecutor.swift @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import Foundation + +public protocol AtlasDateMappingExecutor { + + /** + Map a date string to an instance of NSDate + + - Parameters: + - key: The String to use to pull the value from `json` + - format: String repesenting the date format to use when parsing the date string + - object: The Dictonary used with `key` to pull the value from + + - Throws: A `MappingError` if the `key` doesn't exist within `json` or the value of `key` in `json` is not a String type + + - Returns: An Optional NSDate + */ + func date(for key: String, to format: Date.DateFormat, from json: [String: JSON]?) throws -> Date? + + /** + Optionally map a date string to an instance of NSDate + + - Parameters: + - key: The String to use to pull the value from `json` + - format: String repesenting the date format to use when parsing the date string + - object: The Dictonary used with `key` to pull the value from + + - Throws: A `MappingError` will be thrown if the value of `key` in `json` is not a string type + + - Returns: An Optional NSDate + */ + func date(forOptional key: String, to format: Date.DateFormat, from json: [String: JSON]?) throws -> Date? +} diff --git a/Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasMap.swift b/Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasMap.swift new file mode 100644 index 0000000..3cde40e --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasMap.swift @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +// swiftlint:disable line_length + +/// A simple typealias used to make the initializer of RPJSONMappable more descriptive as to the type of object passed in. That is, it is a JSON response which can be either a Dictionary or Array. +public typealias JSON = Any + +public protocol AtlasMap { + /** + Converts model to JSON + + - Returns: JSON (AKA Any) since valid JSON can be either an `Array` or `Dictionary` + + */ + func toJSON() -> JSON? + + /** + Convert JSON to Model + + - Parameter json: JSON string which can be either a Dictionary or Array. + + - Throws: MappingError: This is an enumertaion that confroms to ErrorType and defines multiple types of mapping errors - some which include a custom message string. + + */ + init?(json: JSON) throws +} +// swiftlint:enable line_length diff --git a/Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasMapExecutor.swift b/Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasMapExecutor.swift new file mode 100644 index 0000000..a1b033f --- /dev/null +++ b/Carthage/Checkouts/Atlas/Atlas/Protocols/AtlasMapExecutor.swift @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016 RentPath, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +public protocol AtlasMapExecutor { + + var dateMappingExecutor: AtlasDateMappingExecutor? { get } + + /** + Used to map a top-level JSON object to an instance of `T` + */ + func object(_ object: [String: JSON]?) throws -> T? + + /** + Used to map a top-level JSON array to an instance of `[T]` + */ + func array(_ array: [JSON]?) throws -> [T]? + + /** + Used to map the value of `key` within `json` to an instance of `T` + */ + func object(for key: String, from json: [String: JSON]?) throws -> T + + /** + Used to map the value of `key` within `json` to an instance of `[T]` + */ + func array(for key: String, from json: [String: JSON]?) throws -> [T] + + /** + Used to map the value of `key` within `json` to an instance of `T` + */ + func object(forOptional key: String, from json: [String: JSON]?) throws -> T? + + /** + Used to map the value of `key` within `json` to an instance of `[T]` + */ + func array(forOptional key: String, from json: [String: JSON]?) throws -> [T]? + +} diff --git a/Carthage/Checkouts/Atlas/AtlasTV/AtlasTV.h b/Carthage/Checkouts/Atlas/AtlasTV/AtlasTV.h new file mode 100644 index 0000000..0863d31 --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTV/AtlasTV.h @@ -0,0 +1,19 @@ +// +// AtlasTV.h +// AtlasTV +// +// Created by Jeremy Fox on 3/30/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +#import + +//! Project version number for AtlasTV. +FOUNDATION_EXPORT double AtlasTVVersionNumber; + +//! Project version string for AtlasTV. +FOUNDATION_EXPORT const unsigned char AtlasTVVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Carthage/Checkouts/Atlas/AtlasTV/Info.plist b/Carthage/Checkouts/Atlas/AtlasTV/Info.plist new file mode 100644 index 0000000..d3de8ee --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTV/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/Atlas/AtlasTVTests/AtlasTVTests.swift b/Carthage/Checkouts/Atlas/AtlasTVTests/AtlasTVTests.swift new file mode 100644 index 0000000..ec1cac4 --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTVTests/AtlasTVTests.swift @@ -0,0 +1,36 @@ +// +// AtlasTVTests.swift +// AtlasTVTests +// +// Created by Jeremy Fox on 3/30/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +import XCTest +@testable import Atlas + +class AtlasTVTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Carthage/Checkouts/Atlas/AtlasTVTests/Info.plist b/Carthage/Checkouts/Atlas/AtlasTVTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTVTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Carthage/Checkouts/Atlas/AtlasTests/AtlasJSONArrayTests.swift b/Carthage/Checkouts/Atlas/AtlasTests/AtlasJSONArrayTests.swift new file mode 100644 index 0000000..8913b69 --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTests/AtlasJSONArrayTests.swift @@ -0,0 +1,130 @@ +// +// AtlasJSONArrayTests.swift +// Atlas +// +// Created by Jeremy Fox on 3/30/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +import XCTest +@testable import Atlas + +class AtlasJSONArrayTests: XCTestCase { + + func testJSONDictionaryParsing() { + let users: [User] + do { + users = try Atlas(TestJSON.jsonArray as JSON).array()! + } catch let e { + XCTFail("Mapping error occurred: \(e)") + return + } + + XCTAssertTrue(users.first!.firstName == TestJSON.user["first_name"] as? String) + XCTAssertTrue(users.first!.lastName == TestJSON.user["last_name"] as? String) + XCTAssertTrue(users.first!.email == TestJSON.user["email"] as? String) + XCTAssertTrue(users.first!.phone == TestJSON.user["phone"] as? Int) + XCTAssertTrue(users.first!.avatarURL == TestJSON.user["avatar"] as? String) + XCTAssertTrue(users.first!.isActive == TestJSON.user["is_active"] as? Bool) +// let date = NSDate.dateFromRFC3339String(TestJSON.user["member_since"] as! String) +// XCTAssertTrue(users.first!.memberSince == date) + } + + func testKeyNotInJSONErrorHandling() { + var message: String? + var user: [User]? + do { + user = try Atlas(TestJSON.jsonArrayMissingKey as JSON).array() + } catch let e as MappingError { + switch e { + case let .keyNotInJSONError(_message): + message = _message + default: + XCTFail("Unexpected Mapping error occurred: \(e)") + return + } + } catch let e as NSError { + XCTFail("Unexpected error occurred: \(e)") + return + } + + XCTAssert(user == nil, "Received a valid User instance even though the expectation was that JSON parsing would fail") + XCTAssert(message == "Mapping to String failed. email is not in the JSON object provided.") + } + + func DISABLED_testNotMappableErrorHandling() { + var message: String? + var users: [User]? + do { + users = try Atlas(TestJSON.jsonArrayDifferentType as JSON).array() + } catch let e as MappingError { + switch e { + case let .notMappable(_message): + message = "User\(_message)" + default: + XCTFail("Unexpected Mapping error occurred: \(e)") + return + } + } catch let e as NSError { + XCTFail("Unexpected error occurred: \(e)") + return + } + + XCTAssert(users == nil, "Received a valid User instance even though the expectation was that JSON parsing would fail") + XCTAssert(message == "User.phone - Unable to map Optional(2223334444) to type Int", "Error handling didn't return the proper error message. Received: \(message)") + } + + func testNoMappingKeyProvidedInModelErrorHandling() { + var message: String? + var user: [UserNoKey]? + do { + user = try Atlas(TestJSON.jsonArray as JSON).array() + } catch let e as MappingError { + switch e { + case let .keyNotInJSONError(error): + message = "User.\(error)" + default: + XCTFail("Unexpected Mapping error occurred: \(e)") + return + } + } catch let e as NSError { + XCTFail("Unexpected error occurred: \(e)") + return + } + XCTAssert(user == nil, "Received a valid User instance even though the expectation was that JSON parsing would fail") + XCTAssert(message == "User.Mapping to String failed. foo is not in the JSON object provided.", "Error handling didn't return the proper error message") + } + + func testNotAnArrayErrorHandling() { + var message: String? + var user: [User]? + do { + user = try Atlas(TestJSON.user as JSON).array() + } catch let e as MappingError { + switch e { + case .notAnArray: + message = "NotAnArray" + default: + XCTFail("Unexpected Mapping error occurred: \(e)") + return + } + } catch let e as NSError { + XCTFail("Unexpected error occurred: \(e)") + return + } + + XCTAssert(user == nil, "Received a valid User instance even though the expectation was that JSON parsing would fail") + XCTAssert(message == "NotAnArray", "Error handling didn't return the proper error message") + } + + func testPerformanceExample() { + self.measure { + do { + let _: [User]? = try Atlas(TestJSON.jsonArray as JSON).array() + } catch let e { + XCTFail("Mapping error occurred: \(e)") + } + } + } + +} diff --git a/Carthage/Checkouts/Atlas/AtlasTests/AtlasJSONDictionaryTests.swift b/Carthage/Checkouts/Atlas/AtlasTests/AtlasJSONDictionaryTests.swift new file mode 100644 index 0000000..cccb016 --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTests/AtlasJSONDictionaryTests.swift @@ -0,0 +1,101 @@ +// +// AtlasTests.swift +// AtlasTests +// +// Created by Jeremy Fox on 3/30/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +import XCTest +@testable import Atlas + +class AtlasJSONDictionaryTests: XCTestCase { + + func testJSONDictionaryParsing() { + let user: User + do { + user = try Atlas(TestJSON.user as JSON).object()! + } catch let e { + XCTFail("Unexpected Mapping error occurred: \(e)") + return + } + + XCTAssertTrue(user.firstName == TestJSON.user["first_name"] as? String) + XCTAssertTrue(user.lastName == TestJSON.user["last_name"] as? String) + XCTAssertTrue(user.email == TestJSON.user["email"] as? String) + XCTAssertTrue(user.phone == TestJSON.user["phone"] as? Int) + XCTAssertTrue(user.avatarURL == TestJSON.user["avatar"] as? String) + XCTAssertTrue(user.isActive == TestJSON.user["is_active"] as? Bool) + let date = Date.dateFromRFC3339String(TestJSON.user["member_since"] as! String) + XCTAssertTrue(user.memberSince == date) + } + + func testInvalidValueErrorHandling() { + var user: User? + XCTAssertThrowsError(user = try Atlas(TestJSON.userInvalidValueKey as JSON).object()) + XCTAssertNil(user) + } + + func testKeyNotInJSONErrorHandling() { + var user: User? + XCTAssertThrowsError(user = try Atlas(TestJSON.userMissingKey as JSON).object()) + XCTAssertNil(user) + } + + // Disabled due to massive changes within Atlas that make it no longer able to return an error if the type doesn't match. Instead, an error will only be thrown if a mapping fails, not if a type in the JSON doesn't match the type being mapped to. + func DISABLED_testNotMappableErrorHandling() { + var message: String? + var user: User? + do { + user = try Atlas(TestJSON.jsonDictionaryDifferentType as JSON).object() + } catch let e as MappingError { + switch e { + case let .notMappable(_message): + message = "User\(_message)" + default: + XCTFail("Unexpected Mapping error occurred: \(e)") + return + } + } catch let e as NSError { + XCTFail("Unexpected error occurred: \(e)") + return + } + + XCTAssert(user == nil, "Received a valid User instance even though the expectation was that JSON parsing would fail") + XCTAssert(message == "User.phone - Unable to map 2223334444 to type Int", "Error handling didn't return the proper error message. Received: \(message)") + } + + func testNoMappingKeyProvidedInModelErrorHandling() { + var message: String? + var user: UserNoKey? + do { + user = try Atlas(TestJSON.user as JSON).object() + } catch let e as MappingError { + switch e { + case let .keyNotInJSONError(_message): + message = "User\(_message)" + default: + XCTFail("Unexpected Mapping error occurred: \(e)") + return + } + } catch let e as NSError { + XCTFail("Unexpected error occurred: \(e)") + return + } + + XCTAssert(user == nil, "Received a valid User instance even though the expectation was that JSON parsing would fail") + XCTAssert(message != "Mapping to String failed. foo is not in the JSON object provided.", "Error handling didn't return the proper error message") + } + + func testPerformanceExample() { + let before = Date() + self.measure { + do { + let _: [User] = try Atlas(TestJSON.users as JSON).array()! + } catch let e { + XCTFail("Unexpected Mapping error occurred: \(e)") + } + } + print("Time: \(Date().timeIntervalSince(before))") + } +} diff --git a/Carthage/Checkouts/Atlas/AtlasTests/Info.plist b/Carthage/Checkouts/Atlas/AtlasTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Carthage/Checkouts/Atlas/AtlasTests/Int+AtlasMapTests.swift b/Carthage/Checkouts/Atlas/AtlasTests/Int+AtlasMapTests.swift new file mode 100644 index 0000000..7b35d53 --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTests/Int+AtlasMapTests.swift @@ -0,0 +1,77 @@ +// +// Int+AtlasMapTests.swift +// Atlas +// +// Created by Jeremy Fox on 8/3/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +import XCTest +@testable import Atlas + +class Int_AtlasMapTests: XCTestCase { + + var json: JSON! + + override func setUp() { + super.setUp() + let i: Int = 702888806 + let i8: Int8 = 70 + let i16: Int16 = 7028 + let i32: Int32 = 702888806 + let i64: Int64 = 70288880664460 + let dict: [String: Any] = [ + "i": NSNumber(value: i as Int), + "i8": NSNumber(value: i8 as Int8), + "i16": NSNumber(value: i16 as Int16), + "i32": NSNumber(value: i32 as Int32), + "i64": NSNumber(value: i64 as Int64) + ] + let data = try! JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions(rawValue: 0)) + json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions(rawValue: 0)) as JSON! + } + + override func tearDown() { + json = nil + super.tearDown() + } + + func testIntMappingMapsIntegerValuesWithinManAndMaxRange() { + let min = Int.min + let zero = 0 + let max = Int.max + + XCTAssertEqual(Int(min), Int.min) + XCTAssertEqual(Int(zero), 0) + XCTAssertEqual(Int(max), Int.max) + } + + func testIntMappingPerformance() { + self.measure { + for _ in 0..<100_000 { + let _ = Int(702888806) + } + } + } + + func testIntMappingThrowsErrorIfUnableToMap() { + XCTAssertNotNil(try Int(json: (json as AnyObject)["i"])) + } + + func testInt64MappingThrowsErrorIfUnableToMap() { + XCTAssertNotNil(try Int64(json: (json as AnyObject)["i64"])) + } + + func testInt32MappingThrowsErrorIfUnableToMap() { + XCTAssertNotNil(try Int32(json: (json as AnyObject)["i32"])) + } + + func testInt16MappingThrowsErrorIfUnableToMap() { + XCTAssertNotNil(try Int16(json: (json as AnyObject)["i16"])) + } + + func testInt8MappingThrowsErrorIfUnableToMap() { + XCTAssertNotNil(try Int8(json: (json as AnyObject)["i8"])) + } + +} diff --git a/Carthage/Checkouts/Atlas/AtlasTests/TestJSON.swift b/Carthage/Checkouts/Atlas/AtlasTests/TestJSON.swift new file mode 100644 index 0000000..6287524 --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTests/TestJSON.swift @@ -0,0 +1,109 @@ +// +// TestJSON.swift +// Atlas +// +// Created by Jeremy Fox on 3/30/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +struct TestJSON { + + static let address: [String: Any] = [ + "number": 123, + "street": "Main St", + "city": "Atlanta", + "state": "GA", + "zip": "12345" + ] + + static let floorplans: [Any] = [ + fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan, fplan + ] + + static let photos: [Any] = [ + photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo, photo + ] + + static let user: [String: Any] = [ + "first_name": "John", + "last_name": "Appleseed", + "email": "john@test.com", + "phone": 223344, + "avatar": "https://www.somedomain.com/users/images/asdfa43weefew4ee.jpg", + "is_active": true, + "member_since": "2016-01-30T09:19:52.000", + "address": address, + "floorplans": floorplans, + "photos": photos + + ] + + static let users: [[String: Any]] = [ + user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user, user + ] + + static let fplan: [String: Any] = [ + "name": "Foo", + "photos": photos, + "sqft": 2345, + "beds": 2, + "baths": 1 + ] + + static let photo: [String: Any] = [ + "abstract": "Something about this photo...", + "url": "/img/shdhiwieo9weoidifhowedhdw/" + ] + + static let userMissingKey: [String: Any] = [ + "first_name": "John", + "last_name": "Appleseed", +/*>>> "email": "john@test.com", Removed for test */ + "phone": 1114445555, + "avatar": "https://www.somedomain.com/users/images/asdfa43weefew4ee.jpg", + "is_active": true, + "member_since": "2016-01-30T09:19:52.000", + "address": address, + "floorplans": floorplans, + "photos": photos + ] + + static let userInvalidValueKey: [String: Any] = [ + "first_name": "John", + "last_name": "Appleseed", + "email": "john@test.com", + "phone": 1114445555, + "avatar": "https://www.somedomain.com/users/images/asdfa43weefew4ee.jpg", +/*>>>*/ "is_active": "true", // Changed to "true" for a test + "member_since": "2016-01-30T09:19:52.000", + "address": address, + "floorplans": floorplans, + "photos": photos + ] + + static let jsonDictionaryDifferentType: [String: Any] = [ + "first_name": "John", + "last_name": "Appleseed", + "email": "john@test.com", + "phone": "2223334444", // Change value to a String for test + "avatar": "https://www.somedomain.com/users/images/asdfa43weefew4ee.jpg", + "is_active": true, + "member_since": "2016-01-30T09:19:52.000", + "address": address, + "floorplans": floorplans, + "photos": photos + ] + + static let jsonArray: [Any] = [ + user, user, user + ] + + static let jsonArrayMissingKey: [Any] = [ + userMissingKey, user, user + ] + + static let jsonArrayDifferentType: [Any] = [ + jsonDictionaryDifferentType, user, user + ] + +} diff --git a/Carthage/Checkouts/Atlas/AtlasTests/TestModels/Address.swift b/Carthage/Checkouts/Atlas/AtlasTests/TestModels/Address.swift new file mode 100644 index 0000000..8093f1e --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTests/TestModels/Address.swift @@ -0,0 +1,41 @@ +// +// Address.swift +// Atlas +// +// Created by Jeremy Fox on 7/7/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +import Foundation + +import Atlas + +struct Address { + + let number: Int? + let street: String? + let city: String? + let state: String? + let zip: String? + +} + +extension Address: AtlasMap { + + func toJSON() -> JSON? { + return nil + } + + init?(json: JSON) throws { + do { + let map = try Atlas(json) + number = try map.object(forOptional: "number") + street = try map.object(forOptional: "street") + city = try map.object(forOptional: "city") + state = try map.object(forOptional: "state") + zip = try map.object(forOptional: "zip") + } catch let e { + throw e + } + } +} diff --git a/Carthage/Checkouts/Atlas/AtlasTests/TestModels/FloorPlan.swift b/Carthage/Checkouts/Atlas/AtlasTests/TestModels/FloorPlan.swift new file mode 100644 index 0000000..f11ba71 --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTests/TestModels/FloorPlan.swift @@ -0,0 +1,41 @@ +// +// FloorPlan.swift +// Atlas +// +// Created by Jeremy Fox on 7/7/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +import Foundation + +import Atlas + +struct FloorPlan { + + let name: String? + let photos: [Photo]? + let sqft: Int? + let beds: Int? + let baths: Int? + +} + +extension FloorPlan: AtlasMap { + + func toJSON() -> JSON? { + return nil + } + + init?(json: JSON) throws { + do { + let map = try Atlas(json) + name = try map.object(forOptional: "name") + photos = try map.array(forOptional: "photos") + sqft = try map.object(forOptional: "sqft") + beds = try map.object(forOptional: "beds") + baths = try map.object(forOptional: "baths") + } catch let e { + throw e + } + } +} diff --git a/Carthage/Checkouts/Atlas/AtlasTests/TestModels/Photo.swift b/Carthage/Checkouts/Atlas/AtlasTests/TestModels/Photo.swift new file mode 100644 index 0000000..bae616b --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTests/TestModels/Photo.swift @@ -0,0 +1,34 @@ +// +// Photo.swift +// Atlas +// +// Created by Jeremy Fox on 7/7/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +import Foundation +import Atlas + +struct Photo { + + let abstract: String? + let urlString: String? + +} + +extension Photo: AtlasMap { + + func toJSON() -> JSON? { + return nil + } + + init?(json: JSON) throws { + do { + let map = try Atlas(json) + abstract = try map.object(forOptional: "abstract") + urlString = try map.object(forOptional: "url") + } catch let e { + throw e + } + } +} diff --git a/Carthage/Checkouts/Atlas/AtlasTests/TestModels/User.swift b/Carthage/Checkouts/Atlas/AtlasTests/TestModels/User.swift new file mode 100644 index 0000000..460ca82 --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTests/TestModels/User.swift @@ -0,0 +1,89 @@ +// +// User.swift +// Atlas +// +// Created by Jeremy Fox on 3/30/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +import Foundation + +import Atlas + +struct User { + + let firstName: String? + let lastName: String? + let email: String + let phone: Int? + let avatarURL: String? + let isActive: Bool + let memberSince: Date? + let address: Address? + let photos: [Photo]? + let floorPlans: [FloorPlan]? + +} + +extension User: AtlasMap { + + func toJSON() -> JSON? { + return nil + } + + init?(json: JSON) throws { + do { + let map = try Atlas(json) + firstName = try map.object(forOptional: "first_name") + lastName = try map.object(forOptional: "last_name") + email = try map.object(for: "email") + phone = try map.object(forOptional: "phone") + avatarURL = try map.object(forOptional: "avatar") + isActive = try map.object(for: "is_active") + memberSince = try map.date(for: "member_since", to: .rfc3339) + address = try map.object(forOptional: "address") + photos = try map.array(forOptional: "photos") + floorPlans = try map.array(forOptional: "floorplans") + } catch let e { + throw e + } + } + +} + +////////////////////////////////// + +struct UserNoKey { + + let firstName: String? + let lastName: String? + let email: String + let phone: Int? + let avatarURL: String? + let isActive: Bool + let memberSince: Date? + +} + +extension UserNoKey: AtlasMap { + + func toJSON() -> JSON? { + return nil + } + + init?(json: JSON) throws { + do { + let map = try Atlas(json) + firstName = try map.object(forOptional: "first_name") + lastName = try map.object(forOptional: "last_name") + email = try map.object(for: "foo") // foo is not a valid key in user json, this is for a test + phone = try map.object(forOptional: "phone") + avatarURL = try map.object(forOptional: "avatar") + isActive = try map.object(for: "is_active") + memberSince = try map.date(for: "member_since", to: .rfc3339) + } catch let e { + throw e + } + } + +} diff --git a/Carthage/Checkouts/Atlas/AtlasTests/UInt+AtlasMapTests.swift b/Carthage/Checkouts/Atlas/AtlasTests/UInt+AtlasMapTests.swift new file mode 100644 index 0000000..a571c94 --- /dev/null +++ b/Carthage/Checkouts/Atlas/AtlasTests/UInt+AtlasMapTests.swift @@ -0,0 +1,75 @@ +// +// UInt+AtlasMapTests.swift +// Atlas +// +// Created by Jeremy Fox on 8/5/16. +// Copyright © 2016 RentPath. All rights reserved. +// + +import XCTest +@testable import Atlas + +class UInt_AtlasMapTests: XCTestCase { + + var json: JSON! + + override func setUp() { + super.setUp() + let i: UInt = 702888806 + let i8: UInt8 = 70 + let i16: UInt16 = 7028 + let i32: UInt32 = 702888806 + let i64: UInt64 = 70288880664460 + let dict: [String: Any] = [ + "ui": NSNumber(value: i as UInt), + "ui8": NSNumber(value: i8 as UInt8), + "ui16": NSNumber(value: i16 as UInt16), + "ui32": NSNumber(value: i32 as UInt32), + "ui64": NSNumber(value: i64 as UInt64) + ] + let data = try! JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions(rawValue: 0)) + json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions(rawValue: 0)) as JSON! + } + + override func tearDown() { + json = nil + super.tearDown() + } + + func testUIntMappingMapsIntegerValuesWithinManAndMaxRange() { + let min = UInt.min + let max = UInt.max + + XCTAssertEqual(UInt(min), UInt.min) + XCTAssertEqual(UInt(max), UInt.max) + } + + func testIntMappingPerformance() { + self.measure { + for _ in 0..<100_000 { + let _ = UInt(702888806) + } + } + } + + func testUIntMappingThrowsErrorIfUnableToMap() { + XCTAssertNotNil(try UInt(json: (json as AnyObject)["ui"])) + } + + func testUInt64MappingThrowsErrorIfUnableToMap() { + XCTAssertNotNil(try UInt64(json: (json as AnyObject)["ui64"])) + } + + func testUInt32MappingThrowsErrorIfUnableToMap() { + XCTAssertNotNil(try UInt32(json: (json as AnyObject)["ui32"])) + } + + func testUInt16MappingThrowsErrorIfUnableToMap() { + XCTAssertNotNil(try UInt16(json: (json as AnyObject)["ui16"])) + } + + func testUInt8MappingThrowsErrorIfUnableToMap() { + XCTAssertNotNil(try UInt8(json: (json as AnyObject)["ui8"])) + } + +} diff --git a/Carthage/Checkouts/Atlas/Cartfile b/Carthage/Checkouts/Atlas/Cartfile new file mode 100644 index 0000000..e69de29 diff --git a/Carthage/Checkouts/Atlas/Cartfile.resolved b/Carthage/Checkouts/Atlas/Cartfile.resolved new file mode 100644 index 0000000..e69de29 diff --git a/Carthage/Checkouts/Atlas/LICENSE b/Carthage/Checkouts/Atlas/LICENSE new file mode 100644 index 0000000..fdc433a --- /dev/null +++ b/Carthage/Checkouts/Atlas/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2016 RentPath, LLC. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Carthage/Checkouts/Atlas/README.md b/Carthage/Checkouts/Atlas/README.md new file mode 100644 index 0000000..aa0c995 --- /dev/null +++ b/Carthage/Checkouts/Atlas/README.md @@ -0,0 +1,191 @@ +![Atlas](https://raw.githubusercontent.com/rentpath/Atlas/master/rentpath_atlas.jpg?token=AA-NdfXBVDgrelm18bcO75eMF7SqVbeYks5XBpK_wA%3D%3D) + +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) + +# Atlas +An extremely easy-to-use and lightweight JSON mapping library for iOS and tvOS written in Swift + +# Installation + +### Carthage +To install this library via Carthage, just add the following to your `Cartfile`: +```bash +github "rentpath/Atlas" ~> 2.0 +``` + +### Submodule +To install this library via submodule, just do the following: +```bash +git submodule add git@github.com/rentpath/Atlas +``` + +### Directly include source +**Don't!** This is not a good idea since it makes updating dependencies much more difficult and time consuming. Use one of the options above. + +# How It's Used + +Atlas is used to convert JSON <-> Model as long as the model conforms to the `AtlasMap` protocol. + +### Working with a JSON Object + +```swift +// Here we are converting a user JSON object to a User model instance + +// JSON object representing a User +static let userJSON: [String: AnyObject] = [ + "first_name": "John", + "last_name": "Appleseed", + "email": "john@test.com", + "phone": 2223334444, + "avatar": "https://www.somedomain.com/users/images/asdfa43weefew4ee.jpg", + "is_active": true, + "member_since": "2016-01-30T09:19:52.000" +] + +let user: User? +do { + user = try Atlas(userJSON).object() +} catch let error { + // do something with the error +} +``` + +### Working with a JSON Array + +```swift +// Here we are converting an array of user JSON objects to an array of User model instances + +// JSON array representing a collection of users +static let usersJSON: [AnyObject] = [ + [ + "first_name": "John", + "last_name": "Appleseed", + "email": "john@test.com", + "phone": 2223334444, + "avatar": "https://www.somedomain.com/users/images/asdfa43weefew4ee.jpg", + "is_active": true, + "member_since": "2016-01-30T09:19:52.000" + ], + [ + "first_name": "Jane", + "last_name": "Appleseed", + "email": "jane@test.com", + "phone": 3334445555, + "avatar": "https://www.somedomain.com/users/images/asdfa43weefew4ee.jpg", + "is_active": false, + "member_since": "2016-01-30T09:19:52.000" + ] +] + +let users: [User]? +do { + users = try Atlas(usersJSON).array() +} catch let error { + // do something with the error +} +``` + +### Here is what the User model could look like + +```swift +import Foundation +import Atlas + +struct User { + let firstName: String? + let lastName: String? + let email: String + let phone: Int? + let avatarURL: String? + let isActive: Bool + let memberSince: NSDate? +} + +extension User: AtlasMap { + + func toJSON() -> [String : AnyObject]? { + return nil + } + + init?(json: JSON) throws { + do { + let map = try Atlas(json) + firstName = try map.object(forOptional: "first_name") + lastName = try map.object(forOptional: "last_name") + email = try map.object(for: "email") + phone = try map.object(forOptional: "phone") + avatarURL = try map.object(forOptional: "avatar") + isActive = try map.object(for: "is_active") + memberSince = try map.date(forOptional: "member_since", to: .rfc3339) + } catch let e { + throw e + } + } + +} +``` + +# Error handling + +We wanted to make the errors returned by Atalas descriptive and clearly explain why something failed. Here's a simple example of how valuable the errors can be to debugging a JSON mapping issue. + +Say you have a JSON object like this one you are fetching from a remote server: + +```swift +{ + "first_name": "John", + "last_name": "Appleseed", + "email": "john@test.com", + "phone": 2223334444, + "avatar": "https://www.somedomain.com/users/images/asdfa43weefew4ee.jpg", + "is_active": true, + "member_since": "2016-01-30T09:19:52.000" +} +``` + +You've implemented Atlas and all of your JSON mapping is working great. Then one day things stop working and the JSON mapping is failing due to a server side change in the JSON object being sent back. For the sake of this example, here's what you determine the new JSON object looks like after the server side changes: + +```swift +{ + "first_name": "John", + "last_name": "Appleseed", + "email": "john@test.com", + "phone": "2223334444", + "avatar": "https://www.somedomain.com/users/images/asdfa43weefew4ee.jpg", + "is_active": true, + "member_since": "2016-01-30T09:19:52.000" +} +``` + +Notice the `phone` number is now a `String` and no longer an `Int`. In this example, Atlas would be throwing a `MappingError.NotMappable` error with the message ".phone - Unable to map 2223334444 to type Int". + +Let's say the `phone` KVP was removed from the JSON object alltogether, Atlas would throw a `MappingError.KeyNotInJSONError` with the message "Mapping to Int failed. phone is not in the JSON object provided.". + +See [MappingError.swift](https://github.com/rentpath/Atlas/blob/master/Atlas/MappingError.swift) for all of the possible errors that Atlas can throw. + +# Contributing + +### Workflow + +1. Fork this repo +2. Create a new feature branch: `$ git checkout -b my-feature-branch` +3. Build and Test the project to make sure everything is good-to-go +4. Perform your work +5. Add tests and confirm all tests are passing +6. Commit your work: `$ git commit -am 'My awesome work'` +7. Push your work to your feature branch: `$ git push origin my-feature-branch` +8. Create the PR [here](https://github.com/rentpath/Atlas/compare?expand=1) + +### Tests + +This library makes heavy use of testing to ensure stable and maintainable code. Please make sure you run the tests often, especially before committing or creating PR's. To run the tests simply hold in the `command` key and press `u`. + +If there are ever failing tests, first stash all of your local changes and run the tests again. This will verify if you made a changed that caused a test failure. There can be two possible outcomes, which are outlined below: + +1. There are still failing tests after staging all of your local changes. If this happens, please investigate which commit introduced the failing test(s) and report that to the auther of that commit to address the failing test(s). + +2. All tests pass after you stage all your local changes. This means you've introduced code that caused a failing test(s). Please investigate what test(s) are failing and look at what you changed that caused the test failures. If needed, get with the auther of the test and determine if your changes should be kept and the test should be updated. If not, then you'll need to revert your changes so that the test(s) pass and continue your work with a different implementation that doesn't result in test failures. + +# License + +Atlas is released under the MIT License. See the bundled LICENSE file for details. diff --git a/Carthage/Checkouts/Atlas/fastlane/.env.build b/Carthage/Checkouts/Atlas/fastlane/.env.build new file mode 100644 index 0000000..7d4ea7a --- /dev/null +++ b/Carthage/Checkouts/Atlas/fastlane/.env.build @@ -0,0 +1,8 @@ +APPIDENTIFER = "com.rentpath.Atlas" +CarthagePlatform = "all" +iOSSCHEME = "Atlas" +TVSCHEME = "AtlasTV" +PROJECTFILE = "./Atlas.xcodeproj" +CONFIGURATION = "Release" +ORGANIZATION = "rentpath" +REPOSITORY = "Atlas" diff --git a/Carthage/Checkouts/Atlas/fastlane/Appfile b/Carthage/Checkouts/Atlas/fastlane/Appfile new file mode 100644 index 0000000..b29a8e2 --- /dev/null +++ b/Carthage/Checkouts/Atlas/fastlane/Appfile @@ -0,0 +1,7 @@ +app_identifier ENV["APPIDENTIFER"] # The bundle identifier of your app +apple_id "aillyas@rentpath.com" # Your Apple email address + +team_id "WTY8Y9N84K" # Developer Portal Team ID + +# you can even provide different app identifiers, Apple IDs and team names per lane: +# More information: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Appfile.md diff --git a/Carthage/Checkouts/Atlas/fastlane/README.md b/Carthage/Checkouts/Atlas/fastlane/README.md new file mode 100644 index 0000000..962e73c --- /dev/null +++ b/Carthage/Checkouts/Atlas/fastlane/README.md @@ -0,0 +1,57 @@ +fastlane documentation +================ +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +``` +xcode-select --install +``` + +## Choose your installation method: + + + + + + + + + + + + + + +
Homebrew +Installer Script +Rubygems +
macOSmacOSmacOS or Linux with Ruby 2.0.0 or above
brew cask install fastlaneDownload the zip file. Then double click on the install script (or run it in a terminal window).sudo gem install fastlane -NV
+# Available Actions +## iOS +### ios swift_lint +``` +fastlane ios swift_lint +``` +Runs swift lint +### ios test +``` +fastlane ios test +``` +Runs all the tests +### ios build +``` +fastlane ios build +``` +Build project scheme for iOS and tvOS +### ios deploy +``` +fastlane ios deploy +``` +Deploy framework + +---- + +This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. +More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). +The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/Carthage/Checkouts/Atlas/fastlane/deploy.sh b/Carthage/Checkouts/Atlas/fastlane/deploy.sh new file mode 100755 index 0000000..6239449 --- /dev/null +++ b/Carthage/Checkouts/Atlas/fastlane/deploy.sh @@ -0,0 +1,14 @@ +if [ "$BITRISE_GIT_BRANCH" == "master" ]; then + sleep 5 + + git config --global user.email "builduser@cibuild.com" + git config --global user.name "build user" + + export OLD_GIT_TAG=$(git tag --sort version:refname | tail -n1) + export NEW_GIT_TAG=$(echo $OLD_GIT_TAG | (IFS=".$IFS" ; read a b c && echo $a.$b.$((c + 1)))) + + git tag $NEW_GIT_TAG -a -m "Generated tag $NEW_GIT_TAG" + git push --quiet https://$GITHUB_ACCESS_TOKEN@github.com/$ORGANIZATION/$REPOSITORY $NEW_GIT_TAG > /dev/null 2>&1; + + ./release_notes.sh $OLD_GIT_TAG $NEW_GIT_TAG; +fi diff --git a/Carthage/Checkouts/Atlas/fastlane/fastfile b/Carthage/Checkouts/Atlas/fastlane/fastfile new file mode 100644 index 0000000..cb6d034 --- /dev/null +++ b/Carthage/Checkouts/Atlas/fastlane/fastfile @@ -0,0 +1,100 @@ +# Customise this file, documentation can be found here: +# https://github.com/fastlane/fastlane/tree/master/fastlane/docs +# All available actions: https://docs.fastlane.tools/actions +# can also be listed using the `fastlane actions` command + +# Change the syntax highlighting to Ruby +# All lines starting with a # are ignored when running `fastlane` + +# If you want to automatically update fastlane if a new version is available: +#update_fastlane + +# This is the minimum version number required. +# Update this, if you use features of a newer version +fastlane_version "2.14.0" + +default_platform :ios + +platform :ios do + before_all do + + desc "Carthage bootstrap" + carthage( + command: "bootstrap", + use_ssh: true, + platform: ENV["CARTHAGEPLATFORM"], + use_binaries: false + ) + end + + desc "Runs swift lint" + lane :swift_lint do + swiftlint( + config_file: ".swiftlint.yml", + ) + end + + desc "Runs all the tests" + lane :test do + scan( + scheme: ENV["iOSSCHEME"], + clean: false, + skip_slack: true, + skip_build: true + ) + scan( + scheme: ENV["TVSCHEME"], + clean: false, + skip_slack: true, + skip_build: true + ) + end + + desc "Build project scheme for iOS and tvOS" + lane :build do + xcodebuild( + project: ENV["PROJECTFILE"], + scheme: ENV["iOSSCHEME"], + verbose: true, + configuration: ENV["CONFIGURATION"], + clean: true, + build: true, + sdk: "iphonesimulator", + destination: "name=iPhone 7", + build_settings: { + "CODE_SIGNING_REQUIRED" => "NO", + "CODE_SIGN_IDENTITY" => "" + } + ) + + xcodebuild( + project: ENV["PROJECTFILE"], + scheme: ENV["TVSCHEME"], + verbose: true, + configuration: ENV["CONFIGURATION"], + clean: true, + build: true, + sdk: "appletvsimulator", + destination: "name=Apple TV 1080p", + build_settings: { + "CODE_SIGNING_REQUIRED" => "NO", + "CODE_SIGN_IDENTITY" => "" + } + ) + + # Run Tests for all schemes + test + end + + desc "Deploy framework" + lane :deploy do + sh "bash ./deploy.sh" + end +end + + +# More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md +# All available actions: https://docs.fastlane.tools/actions + +# fastlane reports which actions are used +# No personal data is recorded. Learn more at https://github.com/fastlane/enhancer diff --git a/Carthage/Checkouts/Atlas/fastlane/release.sh b/Carthage/Checkouts/Atlas/fastlane/release.sh new file mode 100755 index 0000000..b1c7314 --- /dev/null +++ b/Carthage/Checkouts/Atlas/fastlane/release.sh @@ -0,0 +1,64 @@ +#!/bin/bash +FORCE_TAG=false +VERSION="" +if [[ "$1" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]] ; then + VERSION="$1" +else + echo "Make sure you use release.sh [-f]' where has the following syntax:" + echo "major.minor.patch -> example 1.2.3" + echo "-f is optional and should be used when we want to re-tag an existent tag -> release.sh 1.2.3 -f" + exit $? +fi + +if [[ "$2" == "-f" ]] ; then + FORCE_TAG=true +fi + +if [ "$FORCE_TAG" = true ]; then + echo "For moving tag: enabled" +else + echo "For moving tag: disabled" + PREVIOUS_TAG=$(git tag -l | grep "$1") + if [[ "$PREVIOUS_TAG" == "$1" ]] ; then + echo "$1 already exists, if you want to re-tag this version make sure you use -f" + exit $? + fi +fi + +echo git reset --hard +git reset --hard + +echo git clean -f -d +git clean -f -d + +echo git checkout master +git checkout master + +echo git fetch origin +git fetch origin + +echo git reset --hard origin/master +git reset --hard origin/master + +if [ "$FORCE_TAG" = true ]; then + echo git tag -a $1 -m '$1' -f + git tag -a $1 -m '$1' -f +else + echo git tag -a $1 -m '$1' + git tag -a $1 -m '$1' +fi + +if [ "$FORCE_TAG" = true ]; then + echo git push origin $1 -f + git push origin $1 -f +else + echo git push origin $1 + git push origin $1 +fi + +echo Do not forget to update the release notes by running the following command: +echo ./release_notes.sh "" "$1" +echo "where has the following syntax:" +echo "major.minor.patch -> example: 1.2.3 and should be older than the new tag $1" + +echo Finished releasing $1 diff --git a/Carthage/Checkouts/Atlas/fastlane/release_notes.sh b/Carthage/Checkouts/Atlas/fastlane/release_notes.sh new file mode 100755 index 0000000..3a676ef --- /dev/null +++ b/Carthage/Checkouts/Atlas/fastlane/release_notes.sh @@ -0,0 +1,102 @@ +#!/bin/bash +############################### +# Release Notes # +############################### +if [ -n "$1" ]; then + OLD_GIT_TAG=$1 + if [ -n "$2" ]; then + NEW_GIT_TAG=$2 + else + echo "Make sure you use release_notes.sh ' where <*_tag> has the following syntax:" + echo "<*_tag> -> major.minor.patch -> examples 1.2.3 -> ./release_notes.sh 1.4.4 1.4.5" + echo "<*_tag> -> can also be a SHA -> example 0915fe27c3af54fda7b9d0f79f79a6b4b8a0f7cf -> ./release_notes.sh 0915fe27c3af54fda7b9d0f79f79a6b4b8a0f7cf 1.4.5" + exit $? + fi +else + echo "Make sure you use release_notes.sh ' where <*_tag> has the following syntax:" + echo "<*_tag> -> major.minor.patch -> examples 1.2.3 -> ./release_notes.sh 1.4.4 1.4.5" + echo "<*_tag> -> can also be a SHA -> example 0915fe27c3af54fda7b9d0f79f79a6b4b8a0f7cf -> ./release_notes.sh 0915fe27c3af54fda7b9d0f79f79a6b4b8a0f7cf 1.4.5" + exit $? +fi +ALL_NOTES="## [What's New](https://github.com/$ORGANIZATION/$REPOSITORY/compare/$OLD_GIT_TAG...$NEW_GIT_TAG)\r\n\r\nCommit | Author | Story | Type | Title\r\n------------ | ------------- | ------------- | ------------- | -------------\r\n" +RELEASE_NOTES=$(git log --no-merges --pretty=format:"{\"abbreviated_commit_hash\":\"%h\", \"commit_hash\":\"%H\", \"author_name\":\"%an\", \"subject\":\"%s\"}" $OLD_GIT_TAG...$NEW_GIT_TAG) +echo "$RELEASE_NOTES" | +( + while read line + do + echo "$line" + NOTES_LINE=$(echo "") + ABBREVIATED_COMMIT_HASH=$(echo "$line" | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["abbreviated_commit_hash"]') + COMMIT_HASH=$(echo "$line" | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["commit_hash"]') + AUTHOR_NAME=$(echo "$line" | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["author_name"]') + SUBJECT=$(echo "$line" | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["subject"]') + #Strip Owner Information + SUBJECT=$(echo "$SUBJECT" | sed -E 's/^\[([A-Z]|,|\/|\\|[ ])*\][ ]*//' | sed 's/\[NOSTORY\][ ]*//') + STORIES=$(echo "$SUBJECT" | sed -E 's/.*\[(([0-9]|,|\/|\\|[ ]|#)*)\].*/\1/' | sed 's/#//g' | sed -E 's/(,|[ ]|\\|\/)/;/g' | sed -E 's/([a-zA-Z]|\.)//g') + STORIES=$(echo "${STORIES//\*}") + echo "STORIES=$STORIES" + #Strip Story information + SUBJECT=$(echo "$SUBJECT" | sed -E 's/(.*)\[(([0-9]|,|\/|\\|[ ]|#)*)\][ ]*(.*)/\1\4/') + NOTES_LINE=$(echo "$NOTES_LINE[$ABBREVIATED_COMMIT_HASH](https://github.com/$ORGANIZATION/$REPOSITORY/commit/$COMMIT_HASH)|$AUTHOR_NAME") + + STORY_LINKS="" + STORY_TYPES="" + array=(${STORIES//;/ }) + for i in "${!array[@]}" + do + echo "$i=>${array[i]}" + echo curl -X GET -H "X-TrackerToken: $PIVOTAL_TOKEN" "https://www.pivotaltracker.com/services/v5/stories/${array[i]}" + PIVOTAL_RESPONSE=$(curl -X GET -H "X-TrackerToken: $PIVOTAL_TOKEN" "https://www.pivotaltracker.com/services/v5/stories/${array[i]}") + if [ -n "$PIVOTAL_RESPONSE" ]; then + if [ -z "$STORY_TYPES" ]; then + STORY_TYPES=$(echo "$PIVOTAL_RESPONSE" | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["story_type"]') + STORY_TYPES=$(tr '[:lower:]' '[:upper:]' <<< ${STORY_TYPES:0:1})${STORY_TYPES:1} + else + TMP_STORY_TYPE=$(echo "$PIVOTAL_RESPONSE" | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["story_type"]') + TMP_STORY_TYPE=$(tr '[:lower:]' '[:upper:]' <<< ${TMP_STORY_TYPE:0:1})${TMP_STORY_TYPE:1} + STORY_TYPES=$(echo $STORY_TYPES, $TMP_STORY_TYPE) + fi + if [ -z "$STORY_LINKS" ]; then + STORY_LINKS=$(echo "[${array[i]}](https://www.pivotaltracker.com/story/show/${array[i]})") + else + STORY_LINKS=$(echo "$STORY_LINKS, [${array[i]}](https://www.pivotaltracker.com/story/show/${array[i]})") + fi + fi + done + + if [ -z "$STORY_TYPES" ]; then + STORY_TYPES=$(echo "None") + else + STORY_TYPES=$(echo "$STORY_TYPES") + fi + + if [ -z "$STORY_LINKS" ]; then + STORY_LINKS=$(echo "No Story") + else + STORY_LINKS=$(echo "$STORY_LINKS") + fi + + NOTES_LINE=$(echo "$NOTES_LINE|$STORY_LINKS|$STORY_TYPES|$SUBJECT\r\n") + + #echo "STORIES=$STORIES" + #echo "STORY_TYPES=$STORY_TYPES" + #echo "ABBREVIATED_COMMIT_HASH=$ABBREVIATED_COMMIT_HASH" + #echo "COMMIT_HASH=$COMMIT_HASH" + #echo "AUTHOR_NAME=$AUTHOR_NAME" + #echo NOTES_LINE=$NOTES_LINE + ALL_NOTES=$(echo "$ALL_NOTES$NOTES_LINE") + done + ALL_NOTES=$(echo "$ALL_NOTES" | sed 's/\"/\\\"/') + #echo ALL_NOTES=$ALL_NOTES + echo '{"tag_name":'\"$NEW_GIT_TAG\"',"prerelease":true,"name":'\"$NEW_GIT_TAG\"',"body":'\""$ALL_NOTES"\"'}' >notes.json + cat notes.json + PREVIOUS_RELEASE=$(curl -H "Authorization: token $GITHUB_ACCESS_TOKEN" https://api.github.com/repos/$ORGANIZATION/$REPOSITORY/releases/tags/$NEW_GIT_TAG | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["id"]') + if [ -n "$PREVIOUS_RELEASE" ]; then + if [ "$PREVIOUS_RELEASE" != "None" ]; then + curl -X PATCH -H "Authorization: token $GITHUB_ACCESS_TOKEN" -d @notes.json https://api.github.com/repos/$ORGANIZATION/$REPOSITORY/releases/$PREVIOUS_RELEASE + fi + else + curl -X POST -H "Authorization: token $GITHUB_ACCESS_TOKEN" -H "Content-Type: application/json" -d @notes.json https://api.github.com/repos/$ORGANIZATION/$REPOSITORY/releases + fi + rm notes.json +) diff --git a/Carthage/Checkouts/Atlas/rentpath_atlas.jpg b/Carthage/Checkouts/Atlas/rentpath_atlas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d57c98128943ef722a40bb0af2af8adf6b9c685 GIT binary patch literal 22427 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 U2Z8PY*WX*h{oiXC=T^u60Zx+oxc~qF literal 0 HcmV?d00001 diff --git a/Vendor/Atlas b/Vendor/Atlas deleted file mode 160000 index d88fa6e..0000000 --- a/Vendor/Atlas +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d88fa6e00bcbe21fdaaa0e2e1f69c351bd9f1461