├── .gitignore ├── .mention-bot ├── .swiftlint.yml ├── .travis.yml ├── AftermathCompass.podspec ├── AftermathCompass.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcshareddata │ └── xcschemes │ ├── AftermathCompass-Mac.xcscheme │ └── AftermathCompass-iOS.xcscheme ├── CONTRIBUTING.md ├── Cartfile ├── Cartfile.resolved ├── Example └── AftermathCompassDemo │ ├── AftermathCompassDemo.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── AftermathCompassDemo.xcscheme │ ├── AftermathCompassDemo.xcworkspace │ └── contents.xcworkspacedata │ ├── AftermathCompassDemo │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ ├── Info.plist │ ├── Resources │ │ └── Assets.xcassets │ │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ └── Sources │ │ ├── AppDelegate.swift │ │ └── ViewController.swift │ ├── Podfile │ └── Podfile.lock ├── LICENSE.md ├── Playground-Mac.playground ├── Contents.swift ├── contents.xcplayground └── timeline.xctimeline ├── Playground-iOS.playground ├── Contents.swift ├── contents.xcplayground └── timeline.xctimeline ├── Project ├── Info-Mac.plist ├── Info-Tests-Mac.plist ├── Info-Tests-iOS.plist └── Info-iOS.plist ├── README.md ├── Sources ├── CommandRouter.swift ├── CompassCommand.swift ├── CompassCommandHandler.swift ├── CompassError.swift └── CompassManager.swift ├── Tests └── AftermathCompass │ ├── CommandRouterTests.swift │ ├── CompassCommandHandlerTests.swift │ ├── CompassCommandTests.swift │ ├── CompassManagerTests.swift │ └── Helpers.swift └── swiftlint.sh /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | .AppleDouble 4 | .LSOverride 5 | Icon 6 | ._* 7 | .Spotlight-V100 8 | .Trashes 9 | 10 | # Xcode 11 | # 12 | build/ 13 | *.pbxuser 14 | !default.pbxuser 15 | *.mode1v3 16 | !default.mode1v3 17 | *.mode2v3 18 | !default.mode2v3 19 | *.perspectivev3 20 | !default.perspectivev3 21 | xcuserdata 22 | *.xccheckout 23 | *.moved-aside 24 | DerivedData 25 | *.hmap 26 | *.ipa 27 | *.xcuserstate 28 | 29 | # CocoaPods 30 | Pods 31 | 32 | # Carthage 33 | Carthage 34 | 35 | # SPM 36 | .build/ 37 | -------------------------------------------------------------------------------- /.mention-bot: -------------------------------------------------------------------------------- 1 | { 2 | "maxReviewers": 2, 3 | "requiredOrgs": ["hyperoslo"] 4 | } 5 | -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | included: 2 | - Sources 3 | - Tests 4 | excluded: 5 | - Carthage 6 | - Pods 7 | - Packages 8 | opt_in_rules: 9 | - empty_count 10 | disabled_rules: 11 | - valid_docs 12 | force_cast: warning 13 | force_try: 14 | severity: warning 15 | line_length: 120 16 | function_body_length: 17 | - 150 18 | type_body_length: 19 | warning: 300 20 | error: 400 21 | file_length: 22 | warning: 500 23 | error: 1200 24 | type_name: 25 | min_length: 3 26 | max_length: 27 | warning: 40 28 | error: 50 29 | variable_name: 30 | min_length: 2 31 | reporter: "xcode" 32 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | os: 2 | - osx 3 | osx_image: xcode7.3 4 | language: objective-c 5 | install: 6 | - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./swiftlint.sh; fi 7 | script: 8 | - xcodebuild clean build -project AftermathCompass.xcodeproj -scheme AftermathCompass-iOS -sdk iphonesimulator 9 | - xcodebuild test -project AftermathCompass.xcodeproj -scheme AftermathCompass-iOS -sdk iphonesimulator 10 | - xcodebuild clean build -project AftermathCompass.xcodeproj -scheme AftermathCompass-Mac -sdk macosx 11 | - xcodebuild test -project AftermathCompass.xcodeproj -scheme AftermathCompass-Mac -sdk macosx 12 | notifications: 13 | email: false 14 | -------------------------------------------------------------------------------- /AftermathCompass.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "AftermathCompass" 3 | s.summary = "Message-driven navigation system built on top of Aftermath and Compass." 4 | s.version = "0.1.0" 5 | s.homepage = "https://github.com/hyperoslo/AftermathCompass" 6 | s.license = 'MIT' 7 | s.author = { 8 | "Hyper Interaktiv AS" => "ios@hyper.no" 9 | } 10 | s.source = { 11 | :git => "https://github.com/hyperoslo/AftermathCompass.git", 12 | :tag => s.version.to_s 13 | } 14 | s.social_media_url = 'https://twitter.com/hyperoslo' 15 | 16 | s.ios.deployment_target = '8.0' 17 | s.osx.deployment_target = '10.9' 18 | s.tvos.deployment_target = '9.2' 19 | 20 | s.requires_arc = true 21 | s.source_files = 'Sources/**/*' 22 | 23 | s.frameworks = 'Foundation' 24 | s.dependency 'Aftermath' 25 | s.dependency 'Compass' 26 | end 27 | -------------------------------------------------------------------------------- /AftermathCompass.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D5157DE71D821843005620BF /* CompassManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA241D6DAB11000D5F3A /* CompassManager.swift */; }; 11 | D5361FCE1D6C4F8E003C3EE8 /* Compass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5361FCC1D6C4F8E003C3EE8 /* Compass.framework */; }; 12 | D5361FD61D6C5067003C3EE8 /* Compass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5361FD41D6C5067003C3EE8 /* Compass.framework */; }; 13 | D5361FD81D6C5080003C3EE8 /* Compass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5361FCC1D6C4F8E003C3EE8 /* Compass.framework */; }; 14 | D5361FDA1D6C50A4003C3EE8 /* Compass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5361FD41D6C5067003C3EE8 /* Compass.framework */; }; 15 | D5361FDE1D6C59D8003C3EE8 /* Aftermath.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5361FDD1D6C59D8003C3EE8 /* Aftermath.framework */; }; 16 | D5361FDF1D6C59FD003C3EE8 /* Aftermath.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5361FDD1D6C59D8003C3EE8 /* Aftermath.framework */; }; 17 | D582BA221D6D00A5000D5F3A /* Aftermath.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D582BA211D6D00A5000D5F3A /* Aftermath.framework */; }; 18 | D582BA231D6D00DD000D5F3A /* Aftermath.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5361FDD1D6C59D8003C3EE8 /* Aftermath.framework */; }; 19 | D582BA251D6DAB11000D5F3A /* CompassManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA241D6DAB11000D5F3A /* CompassManager.swift */; }; 20 | D582BA2A1D6DAB63000D5F3A /* CompassCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA291D6DAB63000D5F3A /* CompassCommand.swift */; }; 21 | D582BA2B1D6DAB63000D5F3A /* CompassCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA291D6DAB63000D5F3A /* CompassCommand.swift */; }; 22 | D582BA2C1D6DAB84000D5F3A /* CompassCommandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA271D6DAB18000D5F3A /* CompassCommandTests.swift */; }; 23 | D582BA2D1D6DAB84000D5F3A /* CompassCommandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA271D6DAB18000D5F3A /* CompassCommandTests.swift */; }; 24 | D582BA2F1D6DABAF000D5F3A /* CompassCommandHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA2E1D6DABAF000D5F3A /* CompassCommandHandler.swift */; }; 25 | D582BA301D6DABAF000D5F3A /* CompassCommandHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA2E1D6DABAF000D5F3A /* CompassCommandHandler.swift */; }; 26 | D582BA321D6DAE93000D5F3A /* CompassError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA311D6DAE93000D5F3A /* CompassError.swift */; }; 27 | D582BA331D6DAE93000D5F3A /* CompassError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA311D6DAE93000D5F3A /* CompassError.swift */; }; 28 | D582BA351D6DB7BB000D5F3A /* CompassCommandHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA341D6DB7BB000D5F3A /* CompassCommandHandlerTests.swift */; }; 29 | D582BA361D6DB7BB000D5F3A /* CompassCommandHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA341D6DB7BB000D5F3A /* CompassCommandHandlerTests.swift */; }; 30 | D582BA381D6DB7C2000D5F3A /* CompassManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA371D6DB7C2000D5F3A /* CompassManagerTests.swift */; }; 31 | D582BA391D6DB7C2000D5F3A /* CompassManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA371D6DB7C2000D5F3A /* CompassManagerTests.swift */; }; 32 | D582BA3B1D6DBE9D000D5F3A /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA3A1D6DBE9D000D5F3A /* Helpers.swift */; }; 33 | D582BA3C1D6DBE9D000D5F3A /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D582BA3A1D6DBE9D000D5F3A /* Helpers.swift */; }; 34 | D5982E841D7CD352004C4AAF /* CommandRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5982E831D7CD352004C4AAF /* CommandRouter.swift */; }; 35 | D5982E851D7CD352004C4AAF /* CommandRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5982E831D7CD352004C4AAF /* CommandRouter.swift */; }; 36 | D5982E871D7CD95B004C4AAF /* CommandRouterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5982E861D7CD95B004C4AAF /* CommandRouterTests.swift */; }; 37 | D5982E881D7CD95B004C4AAF /* CommandRouterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5982E861D7CD95B004C4AAF /* CommandRouterTests.swift */; }; 38 | D5B2E8AA1C3A780C00C0327D /* AftermathCompass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5B2E89F1C3A780C00C0327D /* AftermathCompass.framework */; }; 39 | D5C6294A1C3A7FAA007F7B7C /* AftermathCompass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5C629401C3A7FAA007F7B7C /* AftermathCompass.framework */; }; 40 | /* End PBXBuildFile section */ 41 | 42 | /* Begin PBXContainerItemProxy section */ 43 | D5B2E8AB1C3A780C00C0327D /* PBXContainerItemProxy */ = { 44 | isa = PBXContainerItemProxy; 45 | containerPortal = D5B2E8961C3A780C00C0327D /* Project object */; 46 | proxyType = 1; 47 | remoteGlobalIDString = D5B2E89E1C3A780C00C0327D; 48 | remoteInfo = AftermathCompass; 49 | }; 50 | D5C6294B1C3A7FAA007F7B7C /* PBXContainerItemProxy */ = { 51 | isa = PBXContainerItemProxy; 52 | containerPortal = D5B2E8961C3A780C00C0327D /* Project object */; 53 | proxyType = 1; 54 | remoteGlobalIDString = D5C6293F1C3A7FAA007F7B7C; 55 | remoteInfo = "AftermathCompass-Mac"; 56 | }; 57 | /* End PBXContainerItemProxy section */ 58 | 59 | /* Begin PBXFileReference section */ 60 | D500FD111C3AABED00782D78 /* Playground-iOS.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = "Playground-iOS.playground"; sourceTree = ""; }; 61 | D500FD121C3AAC8E00782D78 /* Playground-Mac.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = "Playground-Mac.playground"; sourceTree = ""; }; 62 | D5361FBF1D6C4D76003C3EE8 /* Info-iOS.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; 63 | D5361FC01D6C4D76003C3EE8 /* Info-Mac.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Mac.plist"; sourceTree = ""; }; 64 | D5361FC11D6C4D76003C3EE8 /* Info-Tests-iOS.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Tests-iOS.plist"; sourceTree = ""; }; 65 | D5361FC21D6C4D76003C3EE8 /* Info-Tests-Mac.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Tests-Mac.plist"; sourceTree = ""; }; 66 | D5361FCC1D6C4F8E003C3EE8 /* Compass.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Compass.framework; path = Carthage/Build/iOS/Compass.framework; sourceTree = ""; }; 67 | D5361FCD1D6C4F8E003C3EE8 /* Sugar.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sugar.framework; path = Carthage/Build/iOS/Sugar.framework; sourceTree = ""; }; 68 | D5361FD41D6C5067003C3EE8 /* Compass.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Compass.framework; path = Carthage/Build/Mac/Compass.framework; sourceTree = ""; }; 69 | D5361FD51D6C5067003C3EE8 /* Sugar.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sugar.framework; path = Carthage/Build/Mac/Sugar.framework; sourceTree = ""; }; 70 | D5361FDD1D6C59D8003C3EE8 /* Aftermath.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Aftermath.framework; path = Carthage/Build/iOS/Aftermath.framework; sourceTree = ""; }; 71 | D582BA211D6D00A5000D5F3A /* Aftermath.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Aftermath.framework; path = Carthage/Build/Mac/Aftermath.framework; sourceTree = ""; }; 72 | D582BA241D6DAB11000D5F3A /* CompassManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompassManager.swift; sourceTree = ""; }; 73 | D582BA271D6DAB18000D5F3A /* CompassCommandTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompassCommandTests.swift; sourceTree = ""; }; 74 | D582BA291D6DAB63000D5F3A /* CompassCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompassCommand.swift; sourceTree = ""; }; 75 | D582BA2E1D6DABAF000D5F3A /* CompassCommandHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompassCommandHandler.swift; sourceTree = ""; }; 76 | D582BA311D6DAE93000D5F3A /* CompassError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompassError.swift; sourceTree = ""; }; 77 | D582BA341D6DB7BB000D5F3A /* CompassCommandHandlerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompassCommandHandlerTests.swift; sourceTree = ""; }; 78 | D582BA371D6DB7C2000D5F3A /* CompassManagerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompassManagerTests.swift; sourceTree = ""; }; 79 | D582BA3A1D6DBE9D000D5F3A /* Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; }; 80 | D5982E831D7CD352004C4AAF /* CommandRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandRouter.swift; sourceTree = ""; }; 81 | D5982E861D7CD95B004C4AAF /* CommandRouterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandRouterTests.swift; sourceTree = ""; }; 82 | D5B2E89F1C3A780C00C0327D /* AftermathCompass.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AftermathCompass.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 83 | D5B2E8A91C3A780C00C0327D /* AftermathCompass-iOS-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AftermathCompass-iOS-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 84 | D5C629401C3A7FAA007F7B7C /* AftermathCompass.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AftermathCompass.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 85 | D5C629491C3A7FAA007F7B7C /* AftermathCompass-Mac-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AftermathCompass-Mac-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 86 | /* End PBXFileReference section */ 87 | 88 | /* Begin PBXFrameworksBuildPhase section */ 89 | D5B2E89B1C3A780C00C0327D /* Frameworks */ = { 90 | isa = PBXFrameworksBuildPhase; 91 | buildActionMask = 2147483647; 92 | files = ( 93 | D5361FDE1D6C59D8003C3EE8 /* Aftermath.framework in Frameworks */, 94 | D5361FCE1D6C4F8E003C3EE8 /* Compass.framework in Frameworks */, 95 | ); 96 | runOnlyForDeploymentPostprocessing = 0; 97 | }; 98 | D5B2E8A61C3A780C00C0327D /* Frameworks */ = { 99 | isa = PBXFrameworksBuildPhase; 100 | buildActionMask = 2147483647; 101 | files = ( 102 | D5361FDF1D6C59FD003C3EE8 /* Aftermath.framework in Frameworks */, 103 | D5361FD81D6C5080003C3EE8 /* Compass.framework in Frameworks */, 104 | D5B2E8AA1C3A780C00C0327D /* AftermathCompass.framework in Frameworks */, 105 | ); 106 | runOnlyForDeploymentPostprocessing = 0; 107 | }; 108 | D5C6293C1C3A7FAA007F7B7C /* Frameworks */ = { 109 | isa = PBXFrameworksBuildPhase; 110 | buildActionMask = 2147483647; 111 | files = ( 112 | D582BA231D6D00DD000D5F3A /* Aftermath.framework in Frameworks */, 113 | D5361FD61D6C5067003C3EE8 /* Compass.framework in Frameworks */, 114 | ); 115 | runOnlyForDeploymentPostprocessing = 0; 116 | }; 117 | D5C629461C3A7FAA007F7B7C /* Frameworks */ = { 118 | isa = PBXFrameworksBuildPhase; 119 | buildActionMask = 2147483647; 120 | files = ( 121 | D582BA221D6D00A5000D5F3A /* Aftermath.framework in Frameworks */, 122 | D5361FDA1D6C50A4003C3EE8 /* Compass.framework in Frameworks */, 123 | D5C6294A1C3A7FAA007F7B7C /* AftermathCompass.framework in Frameworks */, 124 | ); 125 | runOnlyForDeploymentPostprocessing = 0; 126 | }; 127 | /* End PBXFrameworksBuildPhase section */ 128 | 129 | /* Begin PBXGroup section */ 130 | D5361FB81D6C4D76003C3EE8 /* Tests */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | D582BA261D6DAB18000D5F3A /* AftermathCompass */, 134 | ); 135 | path = Tests; 136 | sourceTree = ""; 137 | }; 138 | D5361FBB1D6C4D76003C3EE8 /* Sources */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | D582BA291D6DAB63000D5F3A /* CompassCommand.swift */, 142 | D582BA2E1D6DABAF000D5F3A /* CompassCommandHandler.swift */, 143 | D582BA241D6DAB11000D5F3A /* CompassManager.swift */, 144 | D582BA311D6DAE93000D5F3A /* CompassError.swift */, 145 | D5982E831D7CD352004C4AAF /* CommandRouter.swift */, 146 | ); 147 | path = Sources; 148 | sourceTree = ""; 149 | }; 150 | D5361FBE1D6C4D76003C3EE8 /* Project */ = { 151 | isa = PBXGroup; 152 | children = ( 153 | D5361FBF1D6C4D76003C3EE8 /* Info-iOS.plist */, 154 | D5361FC01D6C4D76003C3EE8 /* Info-Mac.plist */, 155 | D5361FC11D6C4D76003C3EE8 /* Info-Tests-iOS.plist */, 156 | D5361FC21D6C4D76003C3EE8 /* Info-Tests-Mac.plist */, 157 | ); 158 | path = Project; 159 | sourceTree = ""; 160 | }; 161 | D5361FDC1D6C50BA003C3EE8 /* Frameworks */ = { 162 | isa = PBXGroup; 163 | children = ( 164 | D582BA211D6D00A5000D5F3A /* Aftermath.framework */, 165 | D5361FDD1D6C59D8003C3EE8 /* Aftermath.framework */, 166 | D5361FD41D6C5067003C3EE8 /* Compass.framework */, 167 | D5361FD51D6C5067003C3EE8 /* Sugar.framework */, 168 | D5361FCC1D6C4F8E003C3EE8 /* Compass.framework */, 169 | D5361FCD1D6C4F8E003C3EE8 /* Sugar.framework */, 170 | ); 171 | name = Frameworks; 172 | sourceTree = ""; 173 | }; 174 | D582BA261D6DAB18000D5F3A /* AftermathCompass */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | D582BA271D6DAB18000D5F3A /* CompassCommandTests.swift */, 178 | D582BA341D6DB7BB000D5F3A /* CompassCommandHandlerTests.swift */, 179 | D582BA371D6DB7C2000D5F3A /* CompassManagerTests.swift */, 180 | D5982E861D7CD95B004C4AAF /* CommandRouterTests.swift */, 181 | D582BA3A1D6DBE9D000D5F3A /* Helpers.swift */, 182 | ); 183 | path = AftermathCompass; 184 | sourceTree = ""; 185 | }; 186 | D5B2E8951C3A780C00C0327D = { 187 | isa = PBXGroup; 188 | children = ( 189 | D500FD111C3AABED00782D78 /* Playground-iOS.playground */, 190 | D500FD121C3AAC8E00782D78 /* Playground-Mac.playground */, 191 | D5361FBE1D6C4D76003C3EE8 /* Project */, 192 | D5361FBB1D6C4D76003C3EE8 /* Sources */, 193 | D5361FB81D6C4D76003C3EE8 /* Tests */, 194 | D5361FDC1D6C50BA003C3EE8 /* Frameworks */, 195 | D5B2E8A01C3A780C00C0327D /* Products */, 196 | ); 197 | sourceTree = ""; 198 | }; 199 | D5B2E8A01C3A780C00C0327D /* Products */ = { 200 | isa = PBXGroup; 201 | children = ( 202 | D5B2E89F1C3A780C00C0327D /* AftermathCompass.framework */, 203 | D5B2E8A91C3A780C00C0327D /* AftermathCompass-iOS-Tests.xctest */, 204 | D5C629401C3A7FAA007F7B7C /* AftermathCompass.framework */, 205 | D5C629491C3A7FAA007F7B7C /* AftermathCompass-Mac-Tests.xctest */, 206 | ); 207 | name = Products; 208 | sourceTree = ""; 209 | }; 210 | /* End PBXGroup section */ 211 | 212 | /* Begin PBXHeadersBuildPhase section */ 213 | D5B2E89C1C3A780C00C0327D /* Headers */ = { 214 | isa = PBXHeadersBuildPhase; 215 | buildActionMask = 2147483647; 216 | files = ( 217 | ); 218 | runOnlyForDeploymentPostprocessing = 0; 219 | }; 220 | D5C6293D1C3A7FAA007F7B7C /* Headers */ = { 221 | isa = PBXHeadersBuildPhase; 222 | buildActionMask = 2147483647; 223 | files = ( 224 | ); 225 | runOnlyForDeploymentPostprocessing = 0; 226 | }; 227 | /* End PBXHeadersBuildPhase section */ 228 | 229 | /* Begin PBXNativeTarget section */ 230 | D5B2E89E1C3A780C00C0327D /* AftermathCompass-iOS */ = { 231 | isa = PBXNativeTarget; 232 | buildConfigurationList = D5B2E8B31C3A780C00C0327D /* Build configuration list for PBXNativeTarget "AftermathCompass-iOS" */; 233 | buildPhases = ( 234 | D5B2E89A1C3A780C00C0327D /* Sources */, 235 | D5B2E89B1C3A780C00C0327D /* Frameworks */, 236 | D5B2E89C1C3A780C00C0327D /* Headers */, 237 | D5B2E89D1C3A780C00C0327D /* Resources */, 238 | D5361FD01D6C4FC2003C3EE8 /* Copy frameworks with Carthage */, 239 | ); 240 | buildRules = ( 241 | ); 242 | dependencies = ( 243 | ); 244 | name = "AftermathCompass-iOS"; 245 | productName = AftermathCompass; 246 | productReference = D5B2E89F1C3A780C00C0327D /* AftermathCompass.framework */; 247 | productType = "com.apple.product-type.framework"; 248 | }; 249 | D5B2E8A81C3A780C00C0327D /* AftermathCompass-iOS-Tests */ = { 250 | isa = PBXNativeTarget; 251 | buildConfigurationList = D5B2E8B61C3A780C00C0327D /* Build configuration list for PBXNativeTarget "AftermathCompass-iOS-Tests" */; 252 | buildPhases = ( 253 | D5B2E8A51C3A780C00C0327D /* Sources */, 254 | D5B2E8A61C3A780C00C0327D /* Frameworks */, 255 | D5B2E8A71C3A780C00C0327D /* Resources */, 256 | D5361FD21D6C5015003C3EE8 /* Copy frameworks with Carthage */, 257 | ); 258 | buildRules = ( 259 | ); 260 | dependencies = ( 261 | D5B2E8AC1C3A780C00C0327D /* PBXTargetDependency */, 262 | ); 263 | name = "AftermathCompass-iOS-Tests"; 264 | productName = AftermathCompassTests; 265 | productReference = D5B2E8A91C3A780C00C0327D /* AftermathCompass-iOS-Tests.xctest */; 266 | productType = "com.apple.product-type.bundle.unit-test"; 267 | }; 268 | D5C6293F1C3A7FAA007F7B7C /* AftermathCompass-Mac */ = { 269 | isa = PBXNativeTarget; 270 | buildConfigurationList = D5C629511C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "AftermathCompass-Mac" */; 271 | buildPhases = ( 272 | D5C6293B1C3A7FAA007F7B7C /* Sources */, 273 | D5C6293C1C3A7FAA007F7B7C /* Frameworks */, 274 | D5C6293D1C3A7FAA007F7B7C /* Headers */, 275 | D5C6293E1C3A7FAA007F7B7C /* Resources */, 276 | D5361FD11D6C5010003C3EE8 /* Copy frameworks with Carthage */, 277 | ); 278 | buildRules = ( 279 | ); 280 | dependencies = ( 281 | ); 282 | name = "AftermathCompass-Mac"; 283 | productName = "AftermathCompass-Mac"; 284 | productReference = D5C629401C3A7FAA007F7B7C /* AftermathCompass.framework */; 285 | productType = "com.apple.product-type.framework"; 286 | }; 287 | D5C629481C3A7FAA007F7B7C /* AftermathCompass-Mac-Tests */ = { 288 | isa = PBXNativeTarget; 289 | buildConfigurationList = D5C629541C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "AftermathCompass-Mac-Tests" */; 290 | buildPhases = ( 291 | D5C629451C3A7FAA007F7B7C /* Sources */, 292 | D5C629461C3A7FAA007F7B7C /* Frameworks */, 293 | D5C629471C3A7FAA007F7B7C /* Resources */, 294 | D5361FD31D6C501B003C3EE8 /* Copy frameworks with Carthage */, 295 | ); 296 | buildRules = ( 297 | ); 298 | dependencies = ( 299 | D5C6294C1C3A7FAA007F7B7C /* PBXTargetDependency */, 300 | ); 301 | name = "AftermathCompass-Mac-Tests"; 302 | productName = "AftermathCompass-MacTests"; 303 | productReference = D5C629491C3A7FAA007F7B7C /* AftermathCompass-Mac-Tests.xctest */; 304 | productType = "com.apple.product-type.bundle.unit-test"; 305 | }; 306 | /* End PBXNativeTarget section */ 307 | 308 | /* Begin PBXProject section */ 309 | D5B2E8961C3A780C00C0327D /* Project object */ = { 310 | isa = PBXProject; 311 | attributes = { 312 | LastSwiftUpdateCheck = 0730; 313 | LastUpgradeCheck = 0800; 314 | ORGANIZATIONNAME = "Hyper Interaktiv AS"; 315 | TargetAttributes = { 316 | D5B2E89E1C3A780C00C0327D = { 317 | CreatedOnToolsVersion = 7.2; 318 | LastSwiftMigration = 0800; 319 | }; 320 | D5B2E8A81C3A780C00C0327D = { 321 | CreatedOnToolsVersion = 7.2; 322 | LastSwiftMigration = 0800; 323 | }; 324 | D5C6293F1C3A7FAA007F7B7C = { 325 | CreatedOnToolsVersion = 7.2; 326 | }; 327 | D5C629481C3A7FAA007F7B7C = { 328 | CreatedOnToolsVersion = 7.2; 329 | }; 330 | }; 331 | }; 332 | buildConfigurationList = D5B2E8991C3A780C00C0327D /* Build configuration list for PBXProject "AftermathCompass" */; 333 | compatibilityVersion = "Xcode 3.2"; 334 | developmentRegion = English; 335 | hasScannedForEncodings = 0; 336 | knownRegions = ( 337 | en, 338 | ); 339 | mainGroup = D5B2E8951C3A780C00C0327D; 340 | productRefGroup = D5B2E8A01C3A780C00C0327D /* Products */; 341 | projectDirPath = ""; 342 | projectRoot = ""; 343 | targets = ( 344 | D5B2E89E1C3A780C00C0327D /* AftermathCompass-iOS */, 345 | D5C6293F1C3A7FAA007F7B7C /* AftermathCompass-Mac */, 346 | D5B2E8A81C3A780C00C0327D /* AftermathCompass-iOS-Tests */, 347 | D5C629481C3A7FAA007F7B7C /* AftermathCompass-Mac-Tests */, 348 | ); 349 | }; 350 | /* End PBXProject section */ 351 | 352 | /* Begin PBXResourcesBuildPhase section */ 353 | D5B2E89D1C3A780C00C0327D /* Resources */ = { 354 | isa = PBXResourcesBuildPhase; 355 | buildActionMask = 2147483647; 356 | files = ( 357 | ); 358 | runOnlyForDeploymentPostprocessing = 0; 359 | }; 360 | D5B2E8A71C3A780C00C0327D /* Resources */ = { 361 | isa = PBXResourcesBuildPhase; 362 | buildActionMask = 2147483647; 363 | files = ( 364 | ); 365 | runOnlyForDeploymentPostprocessing = 0; 366 | }; 367 | D5C6293E1C3A7FAA007F7B7C /* Resources */ = { 368 | isa = PBXResourcesBuildPhase; 369 | buildActionMask = 2147483647; 370 | files = ( 371 | ); 372 | runOnlyForDeploymentPostprocessing = 0; 373 | }; 374 | D5C629471C3A7FAA007F7B7C /* Resources */ = { 375 | isa = PBXResourcesBuildPhase; 376 | buildActionMask = 2147483647; 377 | files = ( 378 | ); 379 | runOnlyForDeploymentPostprocessing = 0; 380 | }; 381 | /* End PBXResourcesBuildPhase section */ 382 | 383 | /* Begin PBXShellScriptBuildPhase section */ 384 | D5361FD01D6C4FC2003C3EE8 /* Copy frameworks with Carthage */ = { 385 | isa = PBXShellScriptBuildPhase; 386 | buildActionMask = 2147483647; 387 | files = ( 388 | ); 389 | inputPaths = ( 390 | "$(SRCROOT)/Carthage/Build/iOS/Compass.framework", 391 | "$(SRCROOT)/Carthage/Build/iOS/Aftermath.framework", 392 | ); 393 | name = "Copy frameworks with Carthage"; 394 | outputPaths = ( 395 | ); 396 | runOnlyForDeploymentPostprocessing = 0; 397 | shellPath = /bin/sh; 398 | shellScript = "/usr/local/bin/carthage copy-frameworks"; 399 | }; 400 | D5361FD11D6C5010003C3EE8 /* Copy frameworks with Carthage */ = { 401 | isa = PBXShellScriptBuildPhase; 402 | buildActionMask = 2147483647; 403 | files = ( 404 | ); 405 | inputPaths = ( 406 | "$(SRCROOT)/Carthage/Build/Mac/Aftermath.framework", 407 | "$(SRCROOT)/Carthage/Build/Mac/Compass.framework", 408 | ); 409 | name = "Copy frameworks with Carthage"; 410 | outputPaths = ( 411 | ); 412 | runOnlyForDeploymentPostprocessing = 0; 413 | shellPath = /bin/sh; 414 | shellScript = "/usr/local/bin/carthage copy-frameworks"; 415 | }; 416 | D5361FD21D6C5015003C3EE8 /* Copy frameworks with Carthage */ = { 417 | isa = PBXShellScriptBuildPhase; 418 | buildActionMask = 2147483647; 419 | files = ( 420 | ); 421 | inputPaths = ( 422 | "$(SRCROOT)/Carthage/Build/iOS/Compass.framework", 423 | "$(SRCROOT)/Carthage/Build/iOS/Aftermath.framework", 424 | ); 425 | name = "Copy frameworks with Carthage"; 426 | outputPaths = ( 427 | ); 428 | runOnlyForDeploymentPostprocessing = 0; 429 | shellPath = /bin/sh; 430 | shellScript = "/usr/local/bin/carthage copy-frameworks"; 431 | }; 432 | D5361FD31D6C501B003C3EE8 /* Copy frameworks with Carthage */ = { 433 | isa = PBXShellScriptBuildPhase; 434 | buildActionMask = 2147483647; 435 | files = ( 436 | ); 437 | inputPaths = ( 438 | "$(SRCROOT)/Carthage/Build/Mac/Aftermath.framework", 439 | "$(SRCROOT)/Carthage/Build/Mac/Compass.framework", 440 | ); 441 | name = "Copy frameworks with Carthage"; 442 | outputPaths = ( 443 | ); 444 | runOnlyForDeploymentPostprocessing = 0; 445 | shellPath = /bin/sh; 446 | shellScript = "/usr/local/bin/carthage copy-frameworks"; 447 | }; 448 | /* End PBXShellScriptBuildPhase section */ 449 | 450 | /* Begin PBXSourcesBuildPhase section */ 451 | D5B2E89A1C3A780C00C0327D /* Sources */ = { 452 | isa = PBXSourcesBuildPhase; 453 | buildActionMask = 2147483647; 454 | files = ( 455 | D582BA321D6DAE93000D5F3A /* CompassError.swift in Sources */, 456 | D582BA2F1D6DABAF000D5F3A /* CompassCommandHandler.swift in Sources */, 457 | D582BA251D6DAB11000D5F3A /* CompassManager.swift in Sources */, 458 | D5982E841D7CD352004C4AAF /* CommandRouter.swift in Sources */, 459 | D582BA2A1D6DAB63000D5F3A /* CompassCommand.swift in Sources */, 460 | ); 461 | runOnlyForDeploymentPostprocessing = 0; 462 | }; 463 | D5B2E8A51C3A780C00C0327D /* Sources */ = { 464 | isa = PBXSourcesBuildPhase; 465 | buildActionMask = 2147483647; 466 | files = ( 467 | D5982E871D7CD95B004C4AAF /* CommandRouterTests.swift in Sources */, 468 | D582BA351D6DB7BB000D5F3A /* CompassCommandHandlerTests.swift in Sources */, 469 | D582BA2C1D6DAB84000D5F3A /* CompassCommandTests.swift in Sources */, 470 | D582BA381D6DB7C2000D5F3A /* CompassManagerTests.swift in Sources */, 471 | D582BA3B1D6DBE9D000D5F3A /* Helpers.swift in Sources */, 472 | ); 473 | runOnlyForDeploymentPostprocessing = 0; 474 | }; 475 | D5C6293B1C3A7FAA007F7B7C /* Sources */ = { 476 | isa = PBXSourcesBuildPhase; 477 | buildActionMask = 2147483647; 478 | files = ( 479 | D582BA301D6DABAF000D5F3A /* CompassCommandHandler.swift in Sources */, 480 | D582BA331D6DAE93000D5F3A /* CompassError.swift in Sources */, 481 | D5157DE71D821843005620BF /* CompassManager.swift in Sources */, 482 | D5982E851D7CD352004C4AAF /* CommandRouter.swift in Sources */, 483 | D582BA2B1D6DAB63000D5F3A /* CompassCommand.swift in Sources */, 484 | ); 485 | runOnlyForDeploymentPostprocessing = 0; 486 | }; 487 | D5C629451C3A7FAA007F7B7C /* Sources */ = { 488 | isa = PBXSourcesBuildPhase; 489 | buildActionMask = 2147483647; 490 | files = ( 491 | D5982E881D7CD95B004C4AAF /* CommandRouterTests.swift in Sources */, 492 | D582BA361D6DB7BB000D5F3A /* CompassCommandHandlerTests.swift in Sources */, 493 | D582BA2D1D6DAB84000D5F3A /* CompassCommandTests.swift in Sources */, 494 | D582BA391D6DB7C2000D5F3A /* CompassManagerTests.swift in Sources */, 495 | D582BA3C1D6DBE9D000D5F3A /* Helpers.swift in Sources */, 496 | ); 497 | runOnlyForDeploymentPostprocessing = 0; 498 | }; 499 | /* End PBXSourcesBuildPhase section */ 500 | 501 | /* Begin PBXTargetDependency section */ 502 | D5B2E8AC1C3A780C00C0327D /* PBXTargetDependency */ = { 503 | isa = PBXTargetDependency; 504 | target = D5B2E89E1C3A780C00C0327D /* AftermathCompass-iOS */; 505 | targetProxy = D5B2E8AB1C3A780C00C0327D /* PBXContainerItemProxy */; 506 | }; 507 | D5C6294C1C3A7FAA007F7B7C /* PBXTargetDependency */ = { 508 | isa = PBXTargetDependency; 509 | target = D5C6293F1C3A7FAA007F7B7C /* AftermathCompass-Mac */; 510 | targetProxy = D5C6294B1C3A7FAA007F7B7C /* PBXContainerItemProxy */; 511 | }; 512 | /* End PBXTargetDependency section */ 513 | 514 | /* Begin XCBuildConfiguration section */ 515 | D5B2E8B11C3A780C00C0327D /* Debug */ = { 516 | isa = XCBuildConfiguration; 517 | buildSettings = { 518 | ALWAYS_SEARCH_USER_PATHS = NO; 519 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 520 | CLANG_CXX_LIBRARY = "libc++"; 521 | CLANG_ENABLE_MODULES = YES; 522 | CLANG_ENABLE_OBJC_ARC = YES; 523 | CLANG_WARN_BOOL_CONVERSION = YES; 524 | CLANG_WARN_CONSTANT_CONVERSION = YES; 525 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 526 | CLANG_WARN_EMPTY_BODY = YES; 527 | CLANG_WARN_ENUM_CONVERSION = YES; 528 | CLANG_WARN_INFINITE_RECURSION = YES; 529 | CLANG_WARN_INT_CONVERSION = YES; 530 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 531 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 532 | CLANG_WARN_UNREACHABLE_CODE = YES; 533 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 534 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 535 | COPY_PHASE_STRIP = NO; 536 | CURRENT_PROJECT_VERSION = 1; 537 | DEBUG_INFORMATION_FORMAT = dwarf; 538 | ENABLE_STRICT_OBJC_MSGSEND = YES; 539 | ENABLE_TESTABILITY = YES; 540 | GCC_C_LANGUAGE_STANDARD = gnu99; 541 | GCC_DYNAMIC_NO_PIC = NO; 542 | GCC_NO_COMMON_BLOCKS = YES; 543 | GCC_OPTIMIZATION_LEVEL = 0; 544 | GCC_PREPROCESSOR_DEFINITIONS = ( 545 | "DEBUG=1", 546 | "$(inherited)", 547 | ); 548 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 549 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 550 | GCC_WARN_UNDECLARED_SELECTOR = YES; 551 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 552 | GCC_WARN_UNUSED_FUNCTION = YES; 553 | GCC_WARN_UNUSED_VARIABLE = YES; 554 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 555 | MTL_ENABLE_DEBUG_INFO = YES; 556 | ONLY_ACTIVE_ARCH = YES; 557 | SDKROOT = iphoneos; 558 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 559 | SWIFT_VERSION = 3.0; 560 | TARGETED_DEVICE_FAMILY = "1,2"; 561 | VERSIONING_SYSTEM = "apple-generic"; 562 | VERSION_INFO_PREFIX = ""; 563 | }; 564 | name = Debug; 565 | }; 566 | D5B2E8B21C3A780C00C0327D /* Release */ = { 567 | isa = XCBuildConfiguration; 568 | buildSettings = { 569 | ALWAYS_SEARCH_USER_PATHS = NO; 570 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 571 | CLANG_CXX_LIBRARY = "libc++"; 572 | CLANG_ENABLE_MODULES = YES; 573 | CLANG_ENABLE_OBJC_ARC = YES; 574 | CLANG_WARN_BOOL_CONVERSION = YES; 575 | CLANG_WARN_CONSTANT_CONVERSION = YES; 576 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 577 | CLANG_WARN_EMPTY_BODY = YES; 578 | CLANG_WARN_ENUM_CONVERSION = YES; 579 | CLANG_WARN_INFINITE_RECURSION = YES; 580 | CLANG_WARN_INT_CONVERSION = YES; 581 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 582 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 583 | CLANG_WARN_UNREACHABLE_CODE = YES; 584 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 585 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 586 | COPY_PHASE_STRIP = NO; 587 | CURRENT_PROJECT_VERSION = 1; 588 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 589 | ENABLE_NS_ASSERTIONS = NO; 590 | ENABLE_STRICT_OBJC_MSGSEND = YES; 591 | GCC_C_LANGUAGE_STANDARD = gnu99; 592 | GCC_NO_COMMON_BLOCKS = YES; 593 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 594 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 595 | GCC_WARN_UNDECLARED_SELECTOR = YES; 596 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 597 | GCC_WARN_UNUSED_FUNCTION = YES; 598 | GCC_WARN_UNUSED_VARIABLE = YES; 599 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 600 | MTL_ENABLE_DEBUG_INFO = NO; 601 | SDKROOT = iphoneos; 602 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 603 | SWIFT_VERSION = 3.0; 604 | TARGETED_DEVICE_FAMILY = "1,2"; 605 | VALIDATE_PRODUCT = YES; 606 | VERSIONING_SYSTEM = "apple-generic"; 607 | VERSION_INFO_PREFIX = ""; 608 | }; 609 | name = Release; 610 | }; 611 | D5B2E8B41C3A780C00C0327D /* Debug */ = { 612 | isa = XCBuildConfiguration; 613 | buildSettings = { 614 | CLANG_ENABLE_MODULES = YES; 615 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 616 | DEFINES_MODULE = YES; 617 | DYLIB_COMPATIBILITY_VERSION = 1; 618 | DYLIB_CURRENT_VERSION = 1; 619 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 620 | FRAMEWORK_SEARCH_PATHS = ( 621 | "$(inherited)", 622 | "$(PROJECT_DIR)/Carthage/Build/iOS", 623 | ); 624 | INFOPLIST_FILE = "$(SRCROOT)/Project/Info-iOS.plist"; 625 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 626 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 627 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 628 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.AftermathCompass-iOS"; 629 | PRODUCT_NAME = AftermathCompass; 630 | SKIP_INSTALL = YES; 631 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 632 | SWIFT_VERSION = 3.0; 633 | }; 634 | name = Debug; 635 | }; 636 | D5B2E8B51C3A780C00C0327D /* Release */ = { 637 | isa = XCBuildConfiguration; 638 | buildSettings = { 639 | CLANG_ENABLE_MODULES = YES; 640 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 641 | DEFINES_MODULE = YES; 642 | DYLIB_COMPATIBILITY_VERSION = 1; 643 | DYLIB_CURRENT_VERSION = 1; 644 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 645 | FRAMEWORK_SEARCH_PATHS = ( 646 | "$(inherited)", 647 | "$(PROJECT_DIR)/Carthage/Build/iOS", 648 | ); 649 | INFOPLIST_FILE = "$(SRCROOT)/Project/Info-iOS.plist"; 650 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 651 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 652 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 653 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.AftermathCompass-iOS"; 654 | PRODUCT_NAME = AftermathCompass; 655 | SKIP_INSTALL = YES; 656 | SWIFT_VERSION = 3.0; 657 | }; 658 | name = Release; 659 | }; 660 | D5B2E8B71C3A780C00C0327D /* Debug */ = { 661 | isa = XCBuildConfiguration; 662 | buildSettings = { 663 | CLANG_ENABLE_MODULES = YES; 664 | FRAMEWORK_SEARCH_PATHS = ( 665 | "$(inherited)", 666 | "$(PROJECT_DIR)/Carthage/Build/iOS", 667 | ); 668 | INFOPLIST_FILE = "$(SRCROOT)/Project/Info-Tests-iOS.plist"; 669 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 670 | PRODUCT_BUNDLE_IDENTIFIER = no.hyper.AftermathCompassTests; 671 | PRODUCT_NAME = "$(TARGET_NAME)"; 672 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 673 | SWIFT_VERSION = 3.0; 674 | }; 675 | name = Debug; 676 | }; 677 | D5B2E8B81C3A780C00C0327D /* Release */ = { 678 | isa = XCBuildConfiguration; 679 | buildSettings = { 680 | CLANG_ENABLE_MODULES = YES; 681 | FRAMEWORK_SEARCH_PATHS = ( 682 | "$(inherited)", 683 | "$(PROJECT_DIR)/Carthage/Build/iOS", 684 | ); 685 | INFOPLIST_FILE = "$(SRCROOT)/Project/Info-Tests-iOS.plist"; 686 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 687 | PRODUCT_BUNDLE_IDENTIFIER = no.hyper.AftermathCompassTests; 688 | PRODUCT_NAME = "$(TARGET_NAME)"; 689 | SWIFT_VERSION = 3.0; 690 | }; 691 | name = Release; 692 | }; 693 | D5C629521C3A7FAA007F7B7C /* Debug */ = { 694 | isa = XCBuildConfiguration; 695 | buildSettings = { 696 | CLANG_ENABLE_MODULES = YES; 697 | CODE_SIGN_IDENTITY = ""; 698 | COMBINE_HIDPI_IMAGES = YES; 699 | DEFINES_MODULE = YES; 700 | DYLIB_COMPATIBILITY_VERSION = 1; 701 | DYLIB_CURRENT_VERSION = 1; 702 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 703 | FRAMEWORK_SEARCH_PATHS = ( 704 | "$(inherited)", 705 | "$(PROJECT_DIR)/Carthage/Build/Mac", 706 | "$(PROJECT_DIR)/Carthage/Build/iOS", 707 | ); 708 | FRAMEWORK_VERSION = A; 709 | INFOPLIST_FILE = "$(SRCROOT)/Project/Info-Mac.plist"; 710 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 711 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 712 | MACOSX_DEPLOYMENT_TARGET = 10.10; 713 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.AftermathCompass-Mac"; 714 | PRODUCT_NAME = AftermathCompass; 715 | SDKROOT = macosx; 716 | SKIP_INSTALL = YES; 717 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 718 | SWIFT_VERSION = 3.0; 719 | }; 720 | name = Debug; 721 | }; 722 | D5C629531C3A7FAA007F7B7C /* Release */ = { 723 | isa = XCBuildConfiguration; 724 | buildSettings = { 725 | CLANG_ENABLE_MODULES = YES; 726 | CODE_SIGN_IDENTITY = ""; 727 | COMBINE_HIDPI_IMAGES = YES; 728 | DEFINES_MODULE = YES; 729 | DYLIB_COMPATIBILITY_VERSION = 1; 730 | DYLIB_CURRENT_VERSION = 1; 731 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 732 | FRAMEWORK_SEARCH_PATHS = ( 733 | "$(inherited)", 734 | "$(PROJECT_DIR)/Carthage/Build/Mac", 735 | "$(PROJECT_DIR)/Carthage/Build/iOS", 736 | ); 737 | FRAMEWORK_VERSION = A; 738 | INFOPLIST_FILE = "$(SRCROOT)/Project/Info-Mac.plist"; 739 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 740 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 741 | MACOSX_DEPLOYMENT_TARGET = 10.10; 742 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.AftermathCompass-Mac"; 743 | PRODUCT_NAME = AftermathCompass; 744 | SDKROOT = macosx; 745 | SKIP_INSTALL = YES; 746 | SWIFT_VERSION = 3.0; 747 | }; 748 | name = Release; 749 | }; 750 | D5C629551C3A7FAA007F7B7C /* Debug */ = { 751 | isa = XCBuildConfiguration; 752 | buildSettings = { 753 | CODE_SIGN_IDENTITY = "-"; 754 | COMBINE_HIDPI_IMAGES = YES; 755 | FRAMEWORK_SEARCH_PATHS = ( 756 | "$(inherited)", 757 | "$(PROJECT_DIR)/Carthage/Build/Mac", 758 | ); 759 | INFOPLIST_FILE = "$(SRCROOT)/Project/Info-Tests-Mac.plist"; 760 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 761 | MACOSX_DEPLOYMENT_TARGET = 10.11; 762 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.AftermathCompass-MacTests"; 763 | PRODUCT_NAME = "$(TARGET_NAME)"; 764 | SDKROOT = macosx; 765 | SWIFT_VERSION = 3.0; 766 | }; 767 | name = Debug; 768 | }; 769 | D5C629561C3A7FAA007F7B7C /* Release */ = { 770 | isa = XCBuildConfiguration; 771 | buildSettings = { 772 | CODE_SIGN_IDENTITY = "-"; 773 | COMBINE_HIDPI_IMAGES = YES; 774 | FRAMEWORK_SEARCH_PATHS = ( 775 | "$(inherited)", 776 | "$(PROJECT_DIR)/Carthage/Build/Mac", 777 | ); 778 | INFOPLIST_FILE = "$(SRCROOT)/Project/Info-Tests-Mac.plist"; 779 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 780 | MACOSX_DEPLOYMENT_TARGET = 10.11; 781 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.AftermathCompass-MacTests"; 782 | PRODUCT_NAME = "$(TARGET_NAME)"; 783 | SDKROOT = macosx; 784 | SWIFT_VERSION = 3.0; 785 | }; 786 | name = Release; 787 | }; 788 | /* End XCBuildConfiguration section */ 789 | 790 | /* Begin XCConfigurationList section */ 791 | D5B2E8991C3A780C00C0327D /* Build configuration list for PBXProject "AftermathCompass" */ = { 792 | isa = XCConfigurationList; 793 | buildConfigurations = ( 794 | D5B2E8B11C3A780C00C0327D /* Debug */, 795 | D5B2E8B21C3A780C00C0327D /* Release */, 796 | ); 797 | defaultConfigurationIsVisible = 0; 798 | defaultConfigurationName = Release; 799 | }; 800 | D5B2E8B31C3A780C00C0327D /* Build configuration list for PBXNativeTarget "AftermathCompass-iOS" */ = { 801 | isa = XCConfigurationList; 802 | buildConfigurations = ( 803 | D5B2E8B41C3A780C00C0327D /* Debug */, 804 | D5B2E8B51C3A780C00C0327D /* Release */, 805 | ); 806 | defaultConfigurationIsVisible = 0; 807 | defaultConfigurationName = Release; 808 | }; 809 | D5B2E8B61C3A780C00C0327D /* Build configuration list for PBXNativeTarget "AftermathCompass-iOS-Tests" */ = { 810 | isa = XCConfigurationList; 811 | buildConfigurations = ( 812 | D5B2E8B71C3A780C00C0327D /* Debug */, 813 | D5B2E8B81C3A780C00C0327D /* Release */, 814 | ); 815 | defaultConfigurationIsVisible = 0; 816 | defaultConfigurationName = Release; 817 | }; 818 | D5C629511C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "AftermathCompass-Mac" */ = { 819 | isa = XCConfigurationList; 820 | buildConfigurations = ( 821 | D5C629521C3A7FAA007F7B7C /* Debug */, 822 | D5C629531C3A7FAA007F7B7C /* Release */, 823 | ); 824 | defaultConfigurationIsVisible = 0; 825 | defaultConfigurationName = Release; 826 | }; 827 | D5C629541C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "AftermathCompass-Mac-Tests" */ = { 828 | isa = XCConfigurationList; 829 | buildConfigurations = ( 830 | D5C629551C3A7FAA007F7B7C /* Debug */, 831 | D5C629561C3A7FAA007F7B7C /* Release */, 832 | ); 833 | defaultConfigurationIsVisible = 0; 834 | defaultConfigurationName = Release; 835 | }; 836 | /* End XCConfigurationList section */ 837 | }; 838 | rootObject = D5B2E8961C3A780C00C0327D /* Project object */; 839 | } 840 | -------------------------------------------------------------------------------- /AftermathCompass.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /AftermathCompass.xcodeproj/xcshareddata/xcschemes/AftermathCompass-Mac.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /AftermathCompass.xcodeproj/xcshareddata/xcschemes/AftermathCompass-iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | GitHub Issues is for reporting bugs, discussing features and general feedback in **AftermathCompass**. Be sure to check our [documentation](http://cocoadocs.org/docsets/AftermathCompass), [FAQ](https://github.com/hyperoslo/AftermathCompass/wiki/FAQ) and [past issues](https://github.com/hyperoslo/AftermathCompass/issues?state=closed) before opening any new issues. 2 | 3 | If you are posting about a crash in your application, a stack trace is helpful, but additional context, in the form of code and explanation, is necessary to be of any use. 4 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "hyperoslo/Compass" "5.0.0" 2 | github "hyperoslo/Aftermath" 3 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "hyperoslo/Aftermath" "1.1.0" 2 | github "hyperoslo/Compass" "5.0.0" 3 | -------------------------------------------------------------------------------- /Example/AftermathCompassDemo/AftermathCompassDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4AC95D31F318C6EA8099E5A9 /* Pods_AftermathCompassDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93DDB9625F97A4FFACE7F18C /* Pods_AftermathCompassDemo.framework */; }; 11 | D5C7F74E1C3BC9CE008CDDBA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D5C7F74C1C3BC9CE008CDDBA /* LaunchScreen.storyboard */; }; 12 | D5C7F75B1C3BCA1E008CDDBA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D5C7F7571C3BCA1E008CDDBA /* Assets.xcassets */; }; 13 | D5C7F75C1C3BCA1E008CDDBA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C7F7591C3BCA1E008CDDBA /* AppDelegate.swift */; }; 14 | D5C7F75D1C3BCA1E008CDDBA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C7F75A1C3BCA1E008CDDBA /* ViewController.swift */; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXFileReference section */ 18 | 2272F1ADC1E806C07CBDC10C /* Pods-AftermathCompassDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AftermathCompassDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-AftermathCompassDemo/Pods-AftermathCompassDemo.release.xcconfig"; sourceTree = ""; }; 19 | 93DDB9625F97A4FFACE7F18C /* Pods_AftermathCompassDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AftermathCompassDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 20 | CE6E18CB6DFC812082FF1D02 /* Pods-AftermathCompassDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AftermathCompassDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AftermathCompassDemo/Pods-AftermathCompassDemo.debug.xcconfig"; sourceTree = ""; }; 21 | D5C7F7401C3BC9CE008CDDBA /* AftermathCompassDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AftermathCompassDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 22 | D5C7F74D1C3BC9CE008CDDBA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 23 | D5C7F74F1C3BC9CE008CDDBA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 24 | D5C7F7571C3BCA1E008CDDBA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 25 | D5C7F7591C3BCA1E008CDDBA /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 26 | D5C7F75A1C3BCA1E008CDDBA /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 27 | /* End PBXFileReference section */ 28 | 29 | /* Begin PBXFrameworksBuildPhase section */ 30 | D5C7F73D1C3BC9CE008CDDBA /* Frameworks */ = { 31 | isa = PBXFrameworksBuildPhase; 32 | buildActionMask = 2147483647; 33 | files = ( 34 | 4AC95D31F318C6EA8099E5A9 /* Pods_AftermathCompassDemo.framework in Frameworks */, 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXFrameworksBuildPhase section */ 39 | 40 | /* Begin PBXGroup section */ 41 | 73BA8393121D63CC3F747E8D /* Pods */ = { 42 | isa = PBXGroup; 43 | children = ( 44 | CE6E18CB6DFC812082FF1D02 /* Pods-AftermathCompassDemo.debug.xcconfig */, 45 | 2272F1ADC1E806C07CBDC10C /* Pods-AftermathCompassDemo.release.xcconfig */, 46 | ); 47 | name = Pods; 48 | sourceTree = ""; 49 | }; 50 | B1D0811940D3207EAFA7617C /* Frameworks */ = { 51 | isa = PBXGroup; 52 | children = ( 53 | 93DDB9625F97A4FFACE7F18C /* Pods_AftermathCompassDemo.framework */, 54 | ); 55 | name = Frameworks; 56 | sourceTree = ""; 57 | }; 58 | D5C7F7371C3BC9CE008CDDBA = { 59 | isa = PBXGroup; 60 | children = ( 61 | D5C7F7421C3BC9CE008CDDBA /* AftermathCompassDemo */, 62 | D5C7F7411C3BC9CE008CDDBA /* Products */, 63 | 73BA8393121D63CC3F747E8D /* Pods */, 64 | B1D0811940D3207EAFA7617C /* Frameworks */, 65 | ); 66 | sourceTree = ""; 67 | }; 68 | D5C7F7411C3BC9CE008CDDBA /* Products */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | D5C7F7401C3BC9CE008CDDBA /* AftermathCompassDemo.app */, 72 | ); 73 | name = Products; 74 | sourceTree = ""; 75 | }; 76 | D5C7F7421C3BC9CE008CDDBA /* AftermathCompassDemo */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | D5C7F7561C3BCA1E008CDDBA /* Resources */, 80 | D5C7F7581C3BCA1E008CDDBA /* Sources */, 81 | D5C7F7551C3BC9EA008CDDBA /* Supporting Files */, 82 | ); 83 | path = AftermathCompassDemo; 84 | sourceTree = ""; 85 | }; 86 | D5C7F7551C3BC9EA008CDDBA /* Supporting Files */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | D5C7F74C1C3BC9CE008CDDBA /* LaunchScreen.storyboard */, 90 | D5C7F74F1C3BC9CE008CDDBA /* Info.plist */, 91 | ); 92 | name = "Supporting Files"; 93 | sourceTree = ""; 94 | }; 95 | D5C7F7561C3BCA1E008CDDBA /* Resources */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | D5C7F7571C3BCA1E008CDDBA /* Assets.xcassets */, 99 | ); 100 | path = Resources; 101 | sourceTree = ""; 102 | }; 103 | D5C7F7581C3BCA1E008CDDBA /* Sources */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | D5C7F7591C3BCA1E008CDDBA /* AppDelegate.swift */, 107 | D5C7F75A1C3BCA1E008CDDBA /* ViewController.swift */, 108 | ); 109 | path = Sources; 110 | sourceTree = ""; 111 | }; 112 | /* End PBXGroup section */ 113 | 114 | /* Begin PBXNativeTarget section */ 115 | D5C7F73F1C3BC9CE008CDDBA /* AftermathCompassDemo */ = { 116 | isa = PBXNativeTarget; 117 | buildConfigurationList = D5C7F7521C3BC9CE008CDDBA /* Build configuration list for PBXNativeTarget "AftermathCompassDemo" */; 118 | buildPhases = ( 119 | EF232AB2293116B02D93E2E6 /* [CP] Check Pods Manifest.lock */, 120 | D5C7F73C1C3BC9CE008CDDBA /* Sources */, 121 | D5C7F73D1C3BC9CE008CDDBA /* Frameworks */, 122 | D5C7F73E1C3BC9CE008CDDBA /* Resources */, 123 | 6BBAEADCCEBCA5C854ADD694 /* [CP] Embed Pods Frameworks */, 124 | 3366794F50AEBBFE4796EE9C /* [CP] Copy Pods Resources */, 125 | ); 126 | buildRules = ( 127 | ); 128 | dependencies = ( 129 | ); 130 | name = AftermathCompassDemo; 131 | productName = AftermathCompassDemo; 132 | productReference = D5C7F7401C3BC9CE008CDDBA /* AftermathCompassDemo.app */; 133 | productType = "com.apple.product-type.application"; 134 | }; 135 | /* End PBXNativeTarget section */ 136 | 137 | /* Begin PBXProject section */ 138 | D5C7F7381C3BC9CE008CDDBA /* Project object */ = { 139 | isa = PBXProject; 140 | attributes = { 141 | LastSwiftUpdateCheck = 0720; 142 | LastUpgradeCheck = 0720; 143 | ORGANIZATIONNAME = "Hyper Interaktiv AS"; 144 | TargetAttributes = { 145 | D5C7F73F1C3BC9CE008CDDBA = { 146 | CreatedOnToolsVersion = 7.2; 147 | }; 148 | }; 149 | }; 150 | buildConfigurationList = D5C7F73B1C3BC9CE008CDDBA /* Build configuration list for PBXProject "AftermathCompassDemo" */; 151 | compatibilityVersion = "Xcode 3.2"; 152 | developmentRegion = English; 153 | hasScannedForEncodings = 0; 154 | knownRegions = ( 155 | en, 156 | Base, 157 | ); 158 | mainGroup = D5C7F7371C3BC9CE008CDDBA; 159 | productRefGroup = D5C7F7411C3BC9CE008CDDBA /* Products */; 160 | projectDirPath = ""; 161 | projectRoot = ""; 162 | targets = ( 163 | D5C7F73F1C3BC9CE008CDDBA /* AftermathCompassDemo */, 164 | ); 165 | }; 166 | /* End PBXProject section */ 167 | 168 | /* Begin PBXResourcesBuildPhase section */ 169 | D5C7F73E1C3BC9CE008CDDBA /* Resources */ = { 170 | isa = PBXResourcesBuildPhase; 171 | buildActionMask = 2147483647; 172 | files = ( 173 | D5C7F75B1C3BCA1E008CDDBA /* Assets.xcassets in Resources */, 174 | D5C7F74E1C3BC9CE008CDDBA /* LaunchScreen.storyboard in Resources */, 175 | ); 176 | runOnlyForDeploymentPostprocessing = 0; 177 | }; 178 | /* End PBXResourcesBuildPhase section */ 179 | 180 | /* Begin PBXShellScriptBuildPhase section */ 181 | 3366794F50AEBBFE4796EE9C /* [CP] Copy Pods Resources */ = { 182 | isa = PBXShellScriptBuildPhase; 183 | buildActionMask = 2147483647; 184 | files = ( 185 | ); 186 | inputPaths = ( 187 | ); 188 | name = "[CP] Copy Pods Resources"; 189 | outputPaths = ( 190 | ); 191 | runOnlyForDeploymentPostprocessing = 0; 192 | shellPath = /bin/sh; 193 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AftermathCompassDemo/Pods-AftermathCompassDemo-resources.sh\"\n"; 194 | showEnvVarsInLog = 0; 195 | }; 196 | 6BBAEADCCEBCA5C854ADD694 /* [CP] Embed Pods Frameworks */ = { 197 | isa = PBXShellScriptBuildPhase; 198 | buildActionMask = 2147483647; 199 | files = ( 200 | ); 201 | inputPaths = ( 202 | ); 203 | name = "[CP] Embed Pods Frameworks"; 204 | outputPaths = ( 205 | ); 206 | runOnlyForDeploymentPostprocessing = 0; 207 | shellPath = /bin/sh; 208 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AftermathCompassDemo/Pods-AftermathCompassDemo-frameworks.sh\"\n"; 209 | showEnvVarsInLog = 0; 210 | }; 211 | EF232AB2293116B02D93E2E6 /* [CP] Check Pods Manifest.lock */ = { 212 | isa = PBXShellScriptBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | ); 216 | inputPaths = ( 217 | ); 218 | name = "[CP] Check Pods Manifest.lock"; 219 | outputPaths = ( 220 | ); 221 | runOnlyForDeploymentPostprocessing = 0; 222 | shellPath = /bin/sh; 223 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 224 | showEnvVarsInLog = 0; 225 | }; 226 | /* End PBXShellScriptBuildPhase section */ 227 | 228 | /* Begin PBXSourcesBuildPhase section */ 229 | D5C7F73C1C3BC9CE008CDDBA /* Sources */ = { 230 | isa = PBXSourcesBuildPhase; 231 | buildActionMask = 2147483647; 232 | files = ( 233 | D5C7F75D1C3BCA1E008CDDBA /* ViewController.swift in Sources */, 234 | D5C7F75C1C3BCA1E008CDDBA /* AppDelegate.swift in Sources */, 235 | ); 236 | runOnlyForDeploymentPostprocessing = 0; 237 | }; 238 | /* End PBXSourcesBuildPhase section */ 239 | 240 | /* Begin PBXVariantGroup section */ 241 | D5C7F74C1C3BC9CE008CDDBA /* LaunchScreen.storyboard */ = { 242 | isa = PBXVariantGroup; 243 | children = ( 244 | D5C7F74D1C3BC9CE008CDDBA /* Base */, 245 | ); 246 | name = LaunchScreen.storyboard; 247 | sourceTree = ""; 248 | }; 249 | /* End PBXVariantGroup section */ 250 | 251 | /* Begin XCBuildConfiguration section */ 252 | D5C7F7501C3BC9CE008CDDBA /* Debug */ = { 253 | isa = XCBuildConfiguration; 254 | buildSettings = { 255 | ALWAYS_SEARCH_USER_PATHS = NO; 256 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 257 | CLANG_CXX_LIBRARY = "libc++"; 258 | CLANG_ENABLE_MODULES = YES; 259 | CLANG_ENABLE_OBJC_ARC = YES; 260 | CLANG_WARN_BOOL_CONVERSION = YES; 261 | CLANG_WARN_CONSTANT_CONVERSION = YES; 262 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 263 | CLANG_WARN_EMPTY_BODY = YES; 264 | CLANG_WARN_ENUM_CONVERSION = YES; 265 | CLANG_WARN_INT_CONVERSION = YES; 266 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 267 | CLANG_WARN_UNREACHABLE_CODE = YES; 268 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 269 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 270 | COPY_PHASE_STRIP = NO; 271 | DEBUG_INFORMATION_FORMAT = dwarf; 272 | ENABLE_STRICT_OBJC_MSGSEND = YES; 273 | ENABLE_TESTABILITY = YES; 274 | GCC_C_LANGUAGE_STANDARD = gnu99; 275 | GCC_DYNAMIC_NO_PIC = NO; 276 | GCC_NO_COMMON_BLOCKS = YES; 277 | GCC_OPTIMIZATION_LEVEL = 0; 278 | GCC_PREPROCESSOR_DEFINITIONS = ( 279 | "DEBUG=1", 280 | "$(inherited)", 281 | ); 282 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 283 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 284 | GCC_WARN_UNDECLARED_SELECTOR = YES; 285 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 286 | GCC_WARN_UNUSED_FUNCTION = YES; 287 | GCC_WARN_UNUSED_VARIABLE = YES; 288 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 289 | MTL_ENABLE_DEBUG_INFO = YES; 290 | ONLY_ACTIVE_ARCH = YES; 291 | SDKROOT = iphoneos; 292 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 293 | }; 294 | name = Debug; 295 | }; 296 | D5C7F7511C3BC9CE008CDDBA /* Release */ = { 297 | isa = XCBuildConfiguration; 298 | buildSettings = { 299 | ALWAYS_SEARCH_USER_PATHS = NO; 300 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 301 | CLANG_CXX_LIBRARY = "libc++"; 302 | CLANG_ENABLE_MODULES = YES; 303 | CLANG_ENABLE_OBJC_ARC = YES; 304 | CLANG_WARN_BOOL_CONVERSION = YES; 305 | CLANG_WARN_CONSTANT_CONVERSION = YES; 306 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 307 | CLANG_WARN_EMPTY_BODY = YES; 308 | CLANG_WARN_ENUM_CONVERSION = YES; 309 | CLANG_WARN_INT_CONVERSION = YES; 310 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 311 | CLANG_WARN_UNREACHABLE_CODE = YES; 312 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 313 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 314 | COPY_PHASE_STRIP = NO; 315 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 316 | ENABLE_NS_ASSERTIONS = NO; 317 | ENABLE_STRICT_OBJC_MSGSEND = YES; 318 | GCC_C_LANGUAGE_STANDARD = gnu99; 319 | GCC_NO_COMMON_BLOCKS = YES; 320 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 321 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 322 | GCC_WARN_UNDECLARED_SELECTOR = YES; 323 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 324 | GCC_WARN_UNUSED_FUNCTION = YES; 325 | GCC_WARN_UNUSED_VARIABLE = YES; 326 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 327 | MTL_ENABLE_DEBUG_INFO = NO; 328 | SDKROOT = iphoneos; 329 | VALIDATE_PRODUCT = YES; 330 | }; 331 | name = Release; 332 | }; 333 | D5C7F7531C3BC9CE008CDDBA /* Debug */ = { 334 | isa = XCBuildConfiguration; 335 | baseConfigurationReference = CE6E18CB6DFC812082FF1D02 /* Pods-AftermathCompassDemo.debug.xcconfig */; 336 | buildSettings = { 337 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 338 | INFOPLIST_FILE = AftermathCompassDemo/Info.plist; 339 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 340 | PRODUCT_BUNDLE_IDENTIFIER = no.hyper.AftermathCompassDemo; 341 | PRODUCT_NAME = "$(TARGET_NAME)"; 342 | }; 343 | name = Debug; 344 | }; 345 | D5C7F7541C3BC9CE008CDDBA /* Release */ = { 346 | isa = XCBuildConfiguration; 347 | baseConfigurationReference = 2272F1ADC1E806C07CBDC10C /* Pods-AftermathCompassDemo.release.xcconfig */; 348 | buildSettings = { 349 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 350 | INFOPLIST_FILE = AftermathCompassDemo/Info.plist; 351 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 352 | PRODUCT_BUNDLE_IDENTIFIER = no.hyper.AftermathCompassDemo; 353 | PRODUCT_NAME = "$(TARGET_NAME)"; 354 | }; 355 | name = Release; 356 | }; 357 | /* End XCBuildConfiguration section */ 358 | 359 | /* Begin XCConfigurationList section */ 360 | D5C7F73B1C3BC9CE008CDDBA /* Build configuration list for PBXProject "AftermathCompassDemo" */ = { 361 | isa = XCConfigurationList; 362 | buildConfigurations = ( 363 | D5C7F7501C3BC9CE008CDDBA /* Debug */, 364 | D5C7F7511C3BC9CE008CDDBA /* Release */, 365 | ); 366 | defaultConfigurationIsVisible = 0; 367 | defaultConfigurationName = Release; 368 | }; 369 | D5C7F7521C3BC9CE008CDDBA /* Build configuration list for PBXNativeTarget "AftermathCompassDemo" */ = { 370 | isa = XCConfigurationList; 371 | buildConfigurations = ( 372 | D5C7F7531C3BC9CE008CDDBA /* Debug */, 373 | D5C7F7541C3BC9CE008CDDBA /* Release */, 374 | ); 375 | defaultConfigurationIsVisible = 0; 376 | defaultConfigurationName = Release; 377 | }; 378 | /* End XCConfigurationList section */ 379 | }; 380 | rootObject = D5C7F7381C3BC9CE008CDDBA /* Project object */; 381 | } 382 | -------------------------------------------------------------------------------- /Example/AftermathCompassDemo/AftermathCompassDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/AftermathCompassDemo/AftermathCompassDemo.xcodeproj/xcshareddata/xcschemes/AftermathCompassDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Example/AftermathCompassDemo/AftermathCompassDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/AftermathCompassDemo/AftermathCompassDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Example/AftermathCompassDemo/AftermathCompassDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Example/AftermathCompassDemo/AftermathCompassDemo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/AftermathCompassDemo/AftermathCompassDemo/Sources/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import AftermathCompass 3 | 4 | @UIApplicationMain 5 | class AppDelegate: UIResponder, UIApplicationDelegate { 6 | 7 | var window: UIWindow? 8 | 9 | lazy var navigationController: UINavigationController = { [unowned self] in 10 | let controller = UINavigationController(rootViewController: self.viewController) 11 | return controller 12 | }() 13 | 14 | lazy var viewController: ViewController = { 15 | let controller = ViewController() 16 | return controller 17 | }() 18 | 19 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 20 | window = UIWindow(frame: UIScreen.mainScreen().bounds) 21 | window?.rootViewController = navigationController 22 | window?.makeKeyAndVisible() 23 | 24 | return true 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Example/AftermathCompassDemo/AftermathCompassDemo/Sources/ViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import AftermathCompass 3 | 4 | class ViewController: UIViewController { 5 | 6 | override func viewDidLoad() { 7 | super.viewDidLoad() 8 | view.backgroundColor = UIColor.whiteColor() 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /Example/AftermathCompassDemo/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | platform :ios, '8.0' 4 | 5 | target 'AftermathCompassDemo' do 6 | pod 'AftermathCompass', path: '../../' 7 | end 8 | 9 | -------------------------------------------------------------------------------- /Example/AftermathCompassDemo/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AftermathCompass (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - AftermathCompass (from `../../`) 6 | 7 | EXTERNAL SOURCES: 8 | AftermathCompass: 9 | :path: "../../" 10 | 11 | SPEC CHECKSUMS: 12 | AftermathCompass: 9a70068b86d228933e90fe7ffbebf149425151d6 13 | 14 | PODFILE CHECKSUM: 9b78385965abfed2f4462749f3b8c26c90be488c 15 | 16 | COCOAPODS: 1.0.1 17 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Licensed under the **MIT** license 2 | 3 | > Copyright (c) 2015 Hyper Interaktiv AS 4 | > 5 | > Permission is hereby granted, free of charge, to any person obtaining 6 | > a copy of this software and associated documentation files (the 7 | > "Software"), to deal in the Software without restriction, including 8 | > without limitation the rights to use, copy, modify, merge, publish, 9 | > distribute, sublicense, and/or sell copies of the Software, and to 10 | > permit persons to whom the Software is furnished to do so, subject to 11 | > the following conditions: 12 | > 13 | > The above copyright notice and this permission notice shall be 14 | > included in all copies or substantial portions of the Software. 15 | > 16 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | > EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | > MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | > IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | > CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 | > TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 | > SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /Playground-Mac.playground/Contents.swift: -------------------------------------------------------------------------------- 1 | // AftermathCompass Mac Playground 2 | 3 | import Cocoa 4 | import AftermathCompass 5 | 6 | var str = "Hello, playground" 7 | -------------------------------------------------------------------------------- /Playground-Mac.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Playground-Mac.playground/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Playground-iOS.playground/Contents.swift: -------------------------------------------------------------------------------- 1 | // AftermathCompass iOS Playground 2 | 3 | import UIKit 4 | import AftermathCompass 5 | 6 | var str = "Hello, playground" 7 | -------------------------------------------------------------------------------- /Playground-iOS.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Playground-iOS.playground/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Project/Info-Mac.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSHumanReadableCopyright 24 | Copyright © 2016 Hyper Interaktiv AS. All rights reserved. 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Project/Info-Tests-Mac.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Project/Info-Tests-iOS.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Project/Info-iOS.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AftermathCompass 2 | 3 | [![CI Status](http://img.shields.io/travis/hyperoslo/AftermathCompass.svg?style=flat)](https://travis-ci.org/hyperoslo/AftermathCompass) 4 | [![Version](https://img.shields.io/cocoapods/v/AftermathCompass.svg?style=flat)](http://cocoadocs.org/docsets/AftermathCompass) 5 | [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 6 | [![License](https://img.shields.io/cocoapods/l/AftermathCompass.svg?style=flat)](http://cocoadocs.org/docsets/AftermathCompass) 7 | [![Platform](https://img.shields.io/cocoapods/p/AftermathCompass.svg?style=flat)](http://cocoadocs.org/docsets/AftermathCompass) 8 | 9 | ## Description 10 | 11 | **AftermathCompass** is a message-driven routing system built on top of 12 | [Aftermath](https://github.com/hyperoslo/Aftermath) and 13 | [Compass](https://github.com/hyperoslo/Compass). 14 | 15 | ## Usage 16 | 17 | Create your first route and error handler. 18 | 19 | ```swift 20 | import Compass 21 | 22 | struct UserRoute: Routable { 23 | 24 | func navigate(to location: Location, from currentController: Controller) throws { 25 | guard let id = location.arguments["id"] else { 26 | throw RouteError.InvalidArguments(location) 27 | } 28 | 29 | let controller = UserController(id: id) 30 | currentController.navigationController?.pushViewController(controller, animated: true) 31 | } 32 | } 33 | 34 | struct ErrorRoute: ErrorRoutable { 35 | 36 | func handle(routeError: ErrorType, from currentController: Controller) { 37 | let controller = ErrorController(error: routeError) 38 | currentController.navigationController?.pushViewController(controller, animated: true) 39 | } 40 | } 41 | ``` 42 | 43 | Optionally, you can create a command route to build new commands based on 44 | `Location`: 45 | 46 | ```swift 47 | class UpdateUserRoute: CommandRoute { 48 | 49 | func buildCommand(from location: Location) throws -> AnyCommand { 50 | guard let params = location.payload as? User { 51 | throw UserError 52 | } 53 | 54 | return UpdateUserCommand(parameters: params) 55 | } 56 | } 57 | ``` 58 | 59 | Configure `Compass` scheme, router and `Aftermath` in your `AppDelegate`: 60 | 61 | ```swift 62 | @UIApplicationMain 63 | class AppDelegate: UIResponder, UIApplicationDelegate { 64 | 65 | let router = Router() 66 | let commandRouter = CommandRouter() 67 | var compassManager: CompassManager! 68 | lazy var navigationController = UINavigationController(rootViewController: ViewController()) 69 | 70 | lazy var window: UIWindow? = { 71 | let window = UIWindow(frame: UIScreen.mainScreen().bounds) 72 | return window 73 | }() 74 | 75 | func currentController() -> UIViewController { 76 | return navigationController.topViewController! 77 | } 78 | 79 | // ... 80 | 81 | func application(application: UIApplication, 82 | didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 83 | window?.rootViewController = navigationController 84 | window?.makeKeyAndVisible() 85 | 86 | // ... 87 | configureCompass() 88 | return true 89 | } 90 | 91 | func configureCompass() { 92 | router.errorRoute = ErrorRoute() 93 | router.routes = ["users:{id}": UserRoute()] 94 | commandRouter.routes = ["users:update:{id}": UpdateUserRoute()] 95 | 96 | Compass.scheme = "aftermath" 97 | Compass.routes = Array(router.routes.keys) + Array(commandRouter.routes.keys) 98 | 99 | compassManager = CompassManager( 100 | router: { self.router }, 101 | commandRouter: { self.commandRouter }, 102 | currentController: currentController 103 | ) 104 | } 105 | 106 | // ... 107 | } 108 | ``` 109 | 110 | Start your journey: 111 | 112 | ```swift 113 | import Aftermath 114 | import AftermathCompass 115 | 116 | class ViewController: UIViewController, CommandProducer { 117 | 118 | // ... 119 | 120 | // Navigate to URN 121 | func openUser(id: Int) { 122 | execute(CompassCommand(URN: "users:\(id)")) 123 | } 124 | 125 | // Execute command from URN 126 | func updateUser(user: User) { 127 | execute(CompassCommand(URN: "users:\(user.id)", payload: user)) 128 | } 129 | 130 | // ... 131 | } 132 | ``` 133 | 134 | ## Installation 135 | 136 | **AftermathCompass** is available through [CocoaPods](http://cocoapods.org). To install 137 | it, simply add the following line to your Podfile: 138 | 139 | ```ruby 140 | pod 'AftermathCompass' 141 | ``` 142 | 143 | **AftermathCompass** is also available through [Carthage](https://github.com/Carthage/Carthage). 144 | To install just write into your Cartfile: 145 | 146 | ```ruby 147 | github "hyperoslo/AftermathCompass" 148 | ``` 149 | 150 | **AftermathCompass** can also be installed manually. Just download and drop `Sources` folders in your project. 151 | 152 | ## Author 153 | 154 | Hyper Interaktiv AS, ios@hyper.no 155 | 156 | ## Contributing 157 | 158 | We would love you to contribute to **AftermathCompass**, check the [CONTRIBUTING](https://github.com/hyperoslo/AftermathCompass/blob/master/CONTRIBUTING.md) file for more info. 159 | 160 | ## License 161 | 162 | **AftermathCompass** is available under the MIT license. See the [LICENSE](https://github.com/hyperoslo/AftermathCompass/blob/master/LICENSE.md) file for more info. 163 | -------------------------------------------------------------------------------- /Sources/CommandRouter.swift: -------------------------------------------------------------------------------- 1 | import Aftermath 2 | import Compass 3 | 4 | // MARK: - Command route 5 | 6 | public protocol CommandRoute { 7 | func buildCommand(from location: Location) throws -> AnyCommand 8 | } 9 | 10 | // MARK: - Command router 11 | 12 | public struct CommandRouter: CommandProducer { 13 | public var routes = [String : CommandRoute]() 14 | public init() {} 15 | 16 | public func execute(_ location: Location) -> Bool { 17 | guard let route = routes[location.path] else { 18 | return false 19 | } 20 | 21 | execute(builder: RouteCommandBuilder(route: route, location: location)) 22 | return true 23 | } 24 | } 25 | 26 | // MARK: - Route command builder 27 | 28 | struct RouteCommandBuilder: CommandBuilder { 29 | let route: CommandRoute 30 | let location: Location 31 | 32 | func buildCommand() throws -> AnyCommand { 33 | return try route.buildCommand(from: location) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Sources/CompassCommand.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import Compass 3 | import Aftermath 4 | 5 | public struct CompassCommand: Command { 6 | public typealias Output = Location 7 | 8 | public let URLString: String 9 | public let payload: Any? 10 | 11 | // MARK: - Initialization 12 | 13 | public init(URN: String, payload: Any? = nil) { 14 | self.URLString = "\(Navigator.scheme)\(URN)" 15 | self.payload = payload 16 | } 17 | 18 | public init(URL: Foundation.URL, payload: Any? = nil) { 19 | self.URLString = URL.absoluteString 20 | self.payload = payload 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Sources/CompassCommandHandler.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import Compass 3 | import Aftermath 4 | 5 | struct CompassCommandHandler: CommandHandler { 6 | 7 | // MARK: - Command handling 8 | 9 | func handle(command: CompassCommand) throws -> Event { 10 | guard let URL = URL(string: command.URLString) else { 11 | throw CompassError.invalidURLString(command.URLString) 12 | } 13 | 14 | guard let location = Navigator.parse(url: URL, payload: command.payload) else { 15 | throw CompassError.invalidRoute(URL) 16 | } 17 | 18 | return Event.data(location) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/CompassError.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public enum CompassError: Error { 4 | case invalidURLString(String) 5 | case invalidRoute(URL) 6 | } 7 | -------------------------------------------------------------------------------- /Sources/CompassManager.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import Compass 3 | import Aftermath 4 | 5 | public final class CompassManager: ReactionProducer { 6 | public let router: () -> Router 7 | public var commandRouter: (() -> CommandRouter)? 8 | public let currentController: () -> CurrentController 9 | 10 | // MARK: - Initialization 11 | 12 | public init(router: @escaping () -> Router, commandRouter: (() -> CommandRouter)? = nil, currentController: @escaping () -> CurrentController) { 13 | self.router = router 14 | self.commandRouter = commandRouter 15 | self.currentController = currentController 16 | configure() 17 | } 18 | 19 | // MARK: - Navigation 20 | 21 | func configure() { 22 | Engine.shared.use(handler: CompassCommandHandler()) 23 | 24 | react(to: CompassCommand.self, with: Reaction( 25 | consume: { [weak self] (location: Location) in 26 | guard let weakSelf = self else { 27 | return 28 | } 29 | 30 | if weakSelf.commandRouter?().execute(location) == true { 31 | return 32 | } 33 | 34 | weakSelf.router().navigate(to: location, from: weakSelf.currentController()) 35 | }, 36 | rescue: { [weak self] error in 37 | guard let weakSelf = self else { 38 | return 39 | } 40 | 41 | weakSelf.router().errorRoute?.handle(routeError: error, from: weakSelf.currentController()) 42 | }) 43 | ) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Tests/AftermathCompass/CommandRouterTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import Compass 3 | import Aftermath 4 | @testable import AftermathCompass 5 | 6 | class CommandRouterTests: XCTestCase { 7 | 8 | var commandRouter: CommandRouter! 9 | var commandRoute: TestCommandRoute! 10 | 11 | override func setUp() { 12 | super.setUp() 13 | 14 | commandRouter = CommandRouter() 15 | commandRoute = TestCommandRoute() 16 | commandRouter.routes["command"] = commandRoute 17 | 18 | Navigator.scheme = "tests" 19 | Navigator.routes = [ 20 | "command" 21 | ] 22 | } 23 | 24 | override func tearDown() { 25 | super.tearDown() 26 | Navigator.routes.removeAll() 27 | } 28 | 29 | // MARK: - Tests 30 | 31 | func testExecuteData() { 32 | let URN = "command" 33 | let location = Location(path: URN) 34 | let result = commandRouter.execute(location) 35 | 36 | XCTAssertTrue(result) 37 | XCTAssertEqual(commandRoute.location?.path, URN) 38 | XCTAssertTrue(commandRoute.location?.arguments.isEmpty == true) 39 | } 40 | 41 | func testExecuteError() { 42 | let URN = "error" 43 | let location = Location(path: URN) 44 | let result = commandRouter.execute(location) 45 | 46 | XCTAssertFalse(result) 47 | XCTAssertNil(commandRoute.location) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Tests/AftermathCompass/CompassCommandHandlerTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import Compass 3 | @testable import AftermathCompass 4 | 5 | class CompassCommandHandlerTests: XCTestCase { 6 | 7 | var command: CompassCommand! 8 | var commandHandler: CompassCommandHandler! 9 | 10 | override func setUp() { 11 | super.setUp() 12 | 13 | Navigator.scheme = "tests" 14 | Navigator.routes = [ 15 | "profile:{user}", 16 | ] 17 | 18 | commandHandler = CompassCommandHandler() 19 | } 20 | 21 | override func tearDown() { 22 | super.tearDown() 23 | Navigator.routes.removeAll() 24 | } 25 | 26 | // MARK: - Tests 27 | 28 | func testHandleWithValidURL() { 29 | let url = URL(string: "tests://profile:1")! 30 | let payload = "Test" 31 | 32 | command = CompassCommand(URL: url, payload: payload) 33 | 34 | do { 35 | let event = try commandHandler.handle(command: command) 36 | 37 | switch event { 38 | case .data(let location): 39 | XCTAssertEqual(location.path, "profile:{user}") 40 | XCTAssertEqual(location.arguments["user"], "1") 41 | XCTAssertEqual(location.payload as? String, payload) 42 | default: 43 | XCTFail("Command handler returned invalid event: \(event)") 44 | break 45 | } 46 | } catch { 47 | XCTFail("Command handler failed with error: \(error)") 48 | } 49 | } 50 | 51 | func testHandleWithInvalidURL() { 52 | let URN = "|" 53 | command = CompassCommand(URN: URN) 54 | 55 | do { 56 | let event = try commandHandler.handle(command: command) 57 | XCTFail("Command handler returned invalid event: \(event)") 58 | } catch { 59 | guard let navigationError = error as? CompassError else { 60 | XCTFail("Command handler returned invalid error: \(error)") 61 | return 62 | } 63 | 64 | switch navigationError { 65 | case .invalidURLString(let URLString): 66 | XCTAssertEqual(URLString, command.URLString) 67 | default: 68 | XCTFail("Command handler returned invalid error: \(error)") 69 | break 70 | } 71 | } 72 | } 73 | 74 | func testHandleWithInvalidRoute() { 75 | let URN = "login" 76 | command = CompassCommand(URN: URN) 77 | 78 | do { 79 | let event = try commandHandler.handle(command: command) 80 | XCTFail("Command handler returned invalid event: \(event)") 81 | } catch { 82 | guard let navigationError = error as? CompassError else { 83 | XCTFail("Command handler returned invalid error: \(error)") 84 | return 85 | } 86 | 87 | switch navigationError { 88 | case .invalidRoute(let URL): 89 | XCTAssertEqual(URL.absoluteString, command.URLString) 90 | default: 91 | XCTFail("Command handler returned invalid error: \(error)") 92 | break 93 | } 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Tests/AftermathCompass/CompassCommandTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import Compass 3 | @testable import AftermathCompass 4 | 5 | class CompassCommandTests: XCTestCase { 6 | 7 | var command: CompassCommand! 8 | 9 | override func setUp() { 10 | super.setUp() 11 | Navigator.scheme = "tests" 12 | } 13 | 14 | override func tearDown() { 15 | super.tearDown() 16 | Navigator.routes.removeAll() 17 | } 18 | 19 | // MARK: - Tests 20 | 21 | func testInitWithURN() { 22 | let URN = "login" 23 | let payload = "Test" 24 | 25 | command = CompassCommand(URN: URN, payload: payload) 26 | 27 | XCTAssertEqual(command.URLString, "\(Navigator.scheme)\(URN)") 28 | XCTAssertEqual(command.payload as? String, payload) 29 | } 30 | 31 | func testInitWithURL() { 32 | let url = URL(string: "tests://callback?access_token=ya29")! 33 | let payload = "Test" 34 | 35 | command = CompassCommand(URL: url, payload: payload) 36 | 37 | XCTAssertEqual(command.URLString, url.absoluteString) 38 | XCTAssertEqual(command.payload as? String, payload) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Tests/AftermathCompass/CompassManagerTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import Compass 3 | import Aftermath 4 | @testable import AftermathCompass 5 | 6 | class CompassProducerTests: XCTestCase, CommandProducer { 7 | 8 | var manager: CompassManager! 9 | var commandHandler: CompassCommandHandler! 10 | var router: Router! 11 | var route: TestRoute! 12 | var errorRoute: ErrorRoute! 13 | var commandRouter: CommandRouter! 14 | var commandRoute: TestCommandRoute! 15 | var controller: CurrentController! 16 | 17 | override func setUp() { 18 | super.setUp() 19 | 20 | // Navigation router 21 | router = Router() 22 | route = TestRoute() 23 | errorRoute = ErrorRoute() 24 | router.routes["login"] = route 25 | router.errorRoute = errorRoute 26 | 27 | // Command router 28 | commandRouter = CommandRouter() 29 | commandRoute = TestCommandRoute() 30 | commandRouter.routes["command"] = commandRoute 31 | 32 | Navigator.scheme = "tests" 33 | Navigator.routes = [ 34 | "login", 35 | "profile", 36 | "command" 37 | ] 38 | 39 | manager = CompassManager( 40 | router: { self.router }, 41 | commandRouter: { self.commandRouter }, 42 | currentController: { self.controller } 43 | ) 44 | 45 | controller = CurrentController() 46 | commandHandler = CompassCommandHandler() 47 | 48 | Engine.shared.use(handler: commandHandler) 49 | } 50 | 51 | override func tearDown() { 52 | super.tearDown() 53 | Navigator.routes.removeAll() 54 | Engine.shared.invalidate() 55 | } 56 | 57 | // MARK: - Tests 58 | 59 | func testNavigationDataReaction() { 60 | let URN = "login" 61 | let payload = "Test" 62 | let command = CompassCommand(URN: URN, payload: payload) 63 | 64 | execute(command: command) 65 | 66 | XCTAssertNil(errorRoute.error) 67 | XCTAssertNil(commandRoute.location) 68 | XCTAssertEqual(route.location?.path, URN) 69 | XCTAssertTrue(route.location?.arguments.isEmpty == true) 70 | XCTAssertEqual(route.location?.payload as? String, payload) 71 | } 72 | 73 | func testNavigationErrorReaction() { 74 | let URN = "error" 75 | let command = CompassCommand(URN: URN) 76 | 77 | execute(command: command) 78 | 79 | XCTAssertNil(route.location) 80 | XCTAssertNil(commandRoute.location) 81 | XCTAssertTrue(errorRoute.error is CompassError) 82 | } 83 | 84 | func testCommandDataReaction() { 85 | let URN = "command" 86 | let command = CompassCommand(URN: URN) 87 | 88 | execute(command: command) 89 | 90 | XCTAssertNil(route.location) 91 | XCTAssertNil(errorRoute.error) 92 | XCTAssertEqual(commandRoute.location?.path, URN) 93 | XCTAssertTrue(commandRoute.location?.arguments.isEmpty == true) 94 | } 95 | 96 | func testRouteErrorReaction() { 97 | let URN = "profile" 98 | let command = CompassCommand(URN: URN) 99 | 100 | execute(command: command) 101 | 102 | XCTAssertNil(route.location) 103 | XCTAssertNil(commandRoute.location) 104 | XCTAssertTrue(errorRoute.error is RouteError) 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /Tests/AftermathCompass/Helpers.swift: -------------------------------------------------------------------------------- 1 | import Aftermath 2 | import Compass 3 | @testable import AftermathCompass 4 | 5 | class TestRoute: Routable { 6 | 7 | var location: Location? 8 | 9 | func navigate(to location: Location, from currentController: CurrentController) throws { 10 | self.location = location 11 | } 12 | } 13 | 14 | class ErrorRoute: ErrorRoutable { 15 | 16 | var error: Error? 17 | 18 | func handle(routeError: Error, from currentController: CurrentController) { 19 | error = routeError 20 | } 21 | } 22 | 23 | struct TestCommand: Command { 24 | typealias Output = String 25 | } 26 | 27 | class TestCommandRoute: CommandRoute { 28 | 29 | var location: Location? 30 | 31 | func buildCommand(from location: Location) throws -> AnyCommand { 32 | self.location = location 33 | return TestCommand() 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /swiftlint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Installs the SwiftLint package. 4 | 5 | set -e 6 | 7 | SWIFTLINT_SOURCE_URL="https://github.com/realm/SwiftLint.git" 8 | SWIFTLINT_SOURCE_PATH="/tmp/SwiftLint" 9 | SWIFTLINT_PKG_PATH="/tmp/SwiftLint.pkg" 10 | SWIFTLINT_PKG_URL="https://github.com/realm/SwiftLint/releases/download/0.11.1/SwiftLint.pkg" 11 | 12 | wget --output-document=$SWIFTLINT_PKG_PATH $SWIFTLINT_PKG_URL 13 | 14 | if [ -f $SWIFTLINT_PKG_PATH ]; then 15 | echo "Installing SwiftLint..." 16 | sudo installer -pkg $SWIFTLINT_PKG_PATH -target / 17 | else 18 | echo "Failed to install SwiftLint. Compiling from source..." && 19 | git clone $SWIFTLINT_SOURCE_URL $SWIFTLINT_SOURCE_PATH && 20 | cd $SWIFTLINT_SOURCE_PATH && 21 | git submodule update --init --recursive && 22 | sudo make install 23 | fi 24 | --------------------------------------------------------------------------------