├── .gitignore ├── Apptivator.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ └── Apptivator.xcscheme ├── Apptivator ├── APAppEntry.swift ├── APState.swift ├── AppDelegate.swift ├── Bridging-Header.h ├── Credits.rtfd │ └── TXT.rtf ├── Extensions.swift ├── Info.plist ├── Resources │ ├── APSequenceViewController.xib │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── icon_128x128.png │ │ │ ├── icon_128x128@2x.png │ │ │ ├── icon_16x16.png │ │ │ ├── icon_16x16@2x.png │ │ │ ├── icon_256x256.png │ │ │ ├── icon_256x256@2x.png │ │ │ ├── icon_32x32.png │ │ │ ├── icon_32x32@2x.png │ │ │ ├── icon_512x512.png │ │ │ └── icon_512x512@2x.png │ │ ├── Contents.json │ │ ├── banner.imageset │ │ │ ├── Contents.json │ │ │ ├── banner-1.png │ │ │ ├── banner-2.png │ │ │ └── banner.png │ │ ├── icon-off.iconset │ │ │ ├── icon_128x128.png │ │ │ ├── icon_128x128@2x.png │ │ │ ├── icon_16x16.png │ │ │ ├── icon_16x16@2x.png │ │ │ ├── icon_256x256.png │ │ │ ├── icon_256x256@2x.png │ │ │ ├── icon_32x32.png │ │ │ ├── icon_32x32@2x.png │ │ │ ├── icon_512x512.png │ │ │ └── icon_512x512@2x.png │ │ └── icon-on.iconset │ │ │ ├── icon_128x128.png │ │ │ ├── icon_128x128@2x.png │ │ │ ├── icon_16x16.png │ │ │ ├── icon_16x16@2x.png │ │ │ ├── icon_256x256.png │ │ │ ├── icon_256x256@2x.png │ │ │ ├── icon_32x32.png │ │ │ ├── icon_32x32@2x.png │ │ │ ├── icon_512x512.png │ │ │ └── icon_512x512@2x.png │ └── Base.lproj │ │ └── APPopoverViewController.xib ├── UI │ ├── APPopoverViewController.swift │ ├── APSequenceViewController.swift │ └── UIOverrides.swift └── Util.swift ├── ApptivatorTests ├── APAppEntryTests.swift ├── APStateTests.swift ├── AppDelegateTests.swift ├── Helpers.swift ├── Info.plist └── PopoverViewControllerTests.swift ├── Cartfile ├── Cartfile.resolved ├── Carthage └── Checkouts │ ├── AXSwift │ ├── .gitignore │ ├── .swift-version │ ├── AXSwift.podspec │ ├── AXSwift.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── AXSwift.xcscheme │ ├── AXSwiftExample │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ ├── Info.plist │ │ └── main.swift │ ├── AXSwiftObserverExample │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ ├── Info.plist │ │ └── main.swift │ ├── LICENSE │ ├── README.md │ └── Sources │ │ ├── AXSwift.h │ │ ├── AXSwift.swift │ │ ├── Application.swift │ │ ├── Constants.swift │ │ ├── Error.swift │ │ ├── Info.plist │ │ ├── Observer.swift │ │ ├── SystemWideElement.swift │ │ └── UIElement.swift │ ├── CleanroomLogger │ ├── .gitignore │ ├── .travis.yml │ ├── BuildControl │ │ ├── CleanroomLogger.xml │ │ ├── Info-Target.plist │ │ ├── Info-Tests.plist │ │ ├── bin │ │ │ ├── buildCheck.sh │ │ │ ├── carthageUpdate.sh │ │ │ ├── generateDocumentationForAPI.sh │ │ │ ├── include-common.sh │ │ │ ├── processBoilerplate.sh │ │ │ ├── releaseMe.sh │ │ │ ├── travisBuildHelper.sh │ │ │ └── validatePullRequest.sh │ │ ├── config │ │ │ ├── Debug.xcconfig │ │ │ ├── Project.xcconfig │ │ │ ├── Release.xcconfig │ │ │ ├── Target.xcconfig │ │ │ └── Tests.xcconfig │ │ └── repos.xml │ ├── CleanroomLogger.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── CleanroomLogger.xcscheme │ ├── Documentation │ │ └── API │ │ │ ├── Classes.html │ │ │ ├── Classes │ │ │ ├── BasicLogConfiguration.html │ │ │ ├── BufferedLogEntryMessageRecorder.html │ │ │ ├── BufferedLogEntryRecorder.html │ │ │ ├── BufferedLogRecorder.html │ │ │ ├── BufferedMessageRecorder.html │ │ │ ├── ConcatenatingLogFormatter.html │ │ │ ├── ConsoleLogConfiguration.html │ │ │ ├── ConsoleLogConfiguration │ │ │ │ └── StandardStreamsMode.html │ │ │ ├── FieldBasedLogFormatter.html │ │ │ ├── FieldBasedLogFormatter │ │ │ │ └── Field.html │ │ │ ├── FileLogRecorder.html │ │ │ ├── LogReceptacle.html │ │ │ ├── LogRecorderBase.html │ │ │ ├── OutputStreamLogRecorder.html │ │ │ ├── ParsableLogFormatter.html │ │ │ ├── ReadableLogFormatter.html │ │ │ ├── RotatingLogFileConfiguration.html │ │ │ ├── RotatingLogFileRecorder.html │ │ │ ├── StandardErrorLogRecorder.html │ │ │ ├── StandardLogFormatter.html │ │ │ ├── StandardOutputLogRecorder.html │ │ │ ├── StandardStreamsLogRecorder.html │ │ │ ├── XcodeLogConfiguration.html │ │ │ ├── XcodeLogFormatter.html │ │ │ └── XcodeTraceLogFormatter.html │ │ │ ├── Enums.html │ │ │ ├── Enums │ │ │ ├── CallingThreadStyle.html │ │ │ ├── DelimiterStyle.html │ │ │ ├── LogSeverity.html │ │ │ ├── OSLogTypeTranslator.html │ │ │ ├── SeverityStyle.html │ │ │ ├── SeverityStyle │ │ │ │ └── TextRepresentation.html │ │ │ └── TimestampStyle.html │ │ │ ├── Protocols.html │ │ │ ├── Protocols │ │ │ ├── LogConfiguration.html │ │ │ ├── LogFilter.html │ │ │ ├── LogFormatter.html │ │ │ └── LogRecorder.html │ │ │ ├── Structs.html │ │ │ ├── Structs │ │ │ ├── CallSiteLogFormatter.html │ │ │ ├── CallingThreadLogFormatter.html │ │ │ ├── DelimiterLogFormatter.html │ │ │ ├── LiteralLogFormatter.html │ │ │ ├── Log.html │ │ │ ├── LogChannel.html │ │ │ ├── LogEntry.html │ │ │ ├── LogEntry │ │ │ │ └── Payload.html │ │ │ ├── LogSeverityFilter.html │ │ │ ├── OSLogRecorder.html │ │ │ ├── PayloadLogFormatter.html │ │ │ ├── PayloadMessageLogFormatter.html │ │ │ ├── PayloadTraceLogFormatter.html │ │ │ ├── PayloadValueLogFormatter.html │ │ │ ├── ProcessIDLogFormatter.html │ │ │ ├── ProcessNameLogFormatter.html │ │ │ ├── SeverityLogFormatter.html │ │ │ ├── StackFrameLogFormatter.html │ │ │ └── TimestampLogFormatter.html │ │ │ ├── badge.svg │ │ │ ├── css │ │ │ ├── highlight.css │ │ │ └── jazzy.css │ │ │ ├── docsets │ │ │ ├── CleanroomLogger.docset │ │ │ │ └── Contents │ │ │ │ │ ├── Info.plist │ │ │ │ │ └── Resources │ │ │ │ │ ├── Documents │ │ │ │ │ ├── Classes.html │ │ │ │ │ ├── Classes │ │ │ │ │ │ ├── BasicLogConfiguration.html │ │ │ │ │ │ ├── BufferedLogEntryMessageRecorder.html │ │ │ │ │ │ ├── BufferedLogEntryRecorder.html │ │ │ │ │ │ ├── BufferedLogRecorder.html │ │ │ │ │ │ ├── BufferedMessageRecorder.html │ │ │ │ │ │ ├── ConcatenatingLogFormatter.html │ │ │ │ │ │ ├── ConsoleLogConfiguration.html │ │ │ │ │ │ ├── ConsoleLogConfiguration │ │ │ │ │ │ │ └── StandardStreamsMode.html │ │ │ │ │ │ ├── FieldBasedLogFormatter.html │ │ │ │ │ │ ├── FieldBasedLogFormatter │ │ │ │ │ │ │ └── Field.html │ │ │ │ │ │ ├── FileLogRecorder.html │ │ │ │ │ │ ├── LogReceptacle.html │ │ │ │ │ │ ├── LogRecorderBase.html │ │ │ │ │ │ ├── OutputStreamLogRecorder.html │ │ │ │ │ │ ├── ParsableLogFormatter.html │ │ │ │ │ │ ├── ReadableLogFormatter.html │ │ │ │ │ │ ├── RotatingLogFileConfiguration.html │ │ │ │ │ │ ├── RotatingLogFileRecorder.html │ │ │ │ │ │ ├── StandardErrorLogRecorder.html │ │ │ │ │ │ ├── StandardLogFormatter.html │ │ │ │ │ │ ├── StandardOutputLogRecorder.html │ │ │ │ │ │ ├── StandardStreamsLogRecorder.html │ │ │ │ │ │ ├── XcodeLogConfiguration.html │ │ │ │ │ │ ├── XcodeLogFormatter.html │ │ │ │ │ │ └── XcodeTraceLogFormatter.html │ │ │ │ │ ├── Enums.html │ │ │ │ │ ├── Enums │ │ │ │ │ │ ├── CallingThreadStyle.html │ │ │ │ │ │ ├── DelimiterStyle.html │ │ │ │ │ │ ├── LogSeverity.html │ │ │ │ │ │ ├── OSLogTypeTranslator.html │ │ │ │ │ │ ├── SeverityStyle.html │ │ │ │ │ │ ├── SeverityStyle │ │ │ │ │ │ │ └── TextRepresentation.html │ │ │ │ │ │ └── TimestampStyle.html │ │ │ │ │ ├── Protocols.html │ │ │ │ │ ├── Protocols │ │ │ │ │ │ ├── LogConfiguration.html │ │ │ │ │ │ ├── LogFilter.html │ │ │ │ │ │ ├── LogFormatter.html │ │ │ │ │ │ └── LogRecorder.html │ │ │ │ │ ├── Structs.html │ │ │ │ │ ├── Structs │ │ │ │ │ │ ├── CallSiteLogFormatter.html │ │ │ │ │ │ ├── CallingThreadLogFormatter.html │ │ │ │ │ │ ├── DelimiterLogFormatter.html │ │ │ │ │ │ ├── LiteralLogFormatter.html │ │ │ │ │ │ ├── Log.html │ │ │ │ │ │ ├── LogChannel.html │ │ │ │ │ │ ├── LogEntry.html │ │ │ │ │ │ ├── LogEntry │ │ │ │ │ │ │ └── Payload.html │ │ │ │ │ │ ├── LogSeverityFilter.html │ │ │ │ │ │ ├── OSLogRecorder.html │ │ │ │ │ │ ├── PayloadLogFormatter.html │ │ │ │ │ │ ├── PayloadMessageLogFormatter.html │ │ │ │ │ │ ├── PayloadTraceLogFormatter.html │ │ │ │ │ │ ├── PayloadValueLogFormatter.html │ │ │ │ │ │ ├── ProcessIDLogFormatter.html │ │ │ │ │ │ ├── ProcessNameLogFormatter.html │ │ │ │ │ │ ├── SeverityLogFormatter.html │ │ │ │ │ │ ├── StackFrameLogFormatter.html │ │ │ │ │ │ └── TimestampLogFormatter.html │ │ │ │ │ ├── css │ │ │ │ │ │ ├── highlight.css │ │ │ │ │ │ └── jazzy.css │ │ │ │ │ ├── img │ │ │ │ │ │ ├── carat.png │ │ │ │ │ │ ├── dash.png │ │ │ │ │ │ └── gh.png │ │ │ │ │ ├── index.html │ │ │ │ │ ├── js │ │ │ │ │ │ ├── jazzy.js │ │ │ │ │ │ └── jquery.min.js │ │ │ │ │ └── search.json │ │ │ │ │ └── docSet.dsidx │ │ │ └── CleanroomLogger.tgz │ │ │ ├── img │ │ │ ├── carat.png │ │ │ ├── dash.png │ │ │ └── gh.png │ │ │ ├── index.html │ │ │ ├── js │ │ │ ├── jazzy.js │ │ │ └── jquery.min.js │ │ │ └── search.json │ ├── INTEGRATION.md │ ├── LICENSE │ ├── Package.swift │ ├── README.md │ ├── Sources │ │ ├── BasicLogConfiguration.swift │ │ ├── BufferedLogRecorder.swift │ │ ├── CallSiteLogFormatter.swift │ │ ├── CallingThreadLogFormatter.swift │ │ ├── ConcatenatingLogFormatter.swift │ │ ├── ConsoleLogConfiguration.swift │ │ ├── DelimiterLogFormatter.swift │ │ ├── FieldBasedLogFormatter.swift │ │ ├── FileLogRecorder.swift │ │ ├── LiteralLogFormatter.swift │ │ ├── Log.swift │ │ ├── LogChannel.swift │ │ ├── LogConfiguration.swift │ │ ├── LogEntry.swift │ │ ├── LogFilter.swift │ │ ├── LogFormatter.swift │ │ ├── LogReceptacle.swift │ │ ├── LogRecorder.swift │ │ ├── LogRecorderBase.swift │ │ ├── LogSeverity.swift │ │ ├── OSLogMimicFormatter.swift │ │ ├── OSLogRecorder.swift │ │ ├── OSLogTypeTranslator.swift │ │ ├── OutputStreamLogRecorder.swift │ │ ├── ParsableLogFormatter.swift │ │ ├── PayloadLogFormatter.swift │ │ ├── PayloadMessageLogFormatter.swift │ │ ├── PayloadTraceLogFormatter.swift │ │ ├── PayloadValueLogFormatter.swift │ │ ├── ProcessIDLogFormatter.swift │ │ ├── ProcessNameLogFormatter.swift │ │ ├── README.md │ │ ├── ReadableLogFormatter.swift │ │ ├── RotatingLogFileConfiguration.swift │ │ ├── RotatingLogFileRecorder.swift │ │ ├── SeverityLogFormatter.swift │ │ ├── StackFrameLogFormatter.swift │ │ ├── StandardErrorLogRecorder.swift │ │ ├── StandardLogFormatter.swift │ │ ├── StandardOutputLogRecorder.swift │ │ ├── StandardStreamsLogRecorder.swift │ │ ├── TimestampLogFormatter.swift │ │ ├── XcodeLogConfiguration.swift │ │ ├── XcodeLogFormatter.swift │ │ └── XcodeTraceLogFormatter.swift │ └── Tests │ │ └── CleanroomLoggerTests │ │ ├── KeyedMessageBufferExtension.swift │ │ ├── LogEntryTests.swift │ │ ├── LogSeverityComparisonTests.swift │ │ └── LoggerTestCase.swift │ ├── LaunchAtLogin │ ├── .editorconfig │ ├── .gitattributes │ ├── .gitignore │ ├── Carthage │ │ └── Build │ ├── LaunchAtLogin.podspec │ ├── LaunchAtLogin.xcodeproj │ │ ├── project.pbxproj │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── LaunchAtLogin.xcscheme │ │ │ └── LaunchAtLoginHelper.xcscheme │ ├── LaunchAtLogin │ │ ├── Info.plist │ │ ├── LaunchAtLogin.h │ │ ├── LaunchAtLogin.swift │ │ └── copy-helper.sh │ ├── LaunchAtLoginHelper │ │ ├── Info.plist │ │ ├── LaunchAtLoginHelper.entitlements │ │ └── main.swift │ ├── before-after.md │ ├── license │ └── readme.md │ ├── MASShortcut │ ├── .gitignore │ ├── .travis.yml │ ├── CHANGES │ ├── CONTRIBUTING.md │ ├── Demo │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── Info.plist │ │ ├── Prefix.pch │ │ ├── cs.lproj │ │ │ ├── Localizable.strings │ │ │ └── MainMenu.xib │ │ ├── de.lproj │ │ │ └── Localizable.strings │ │ ├── en.lproj │ │ │ ├── Localizable.strings │ │ │ └── MainMenu.xib │ │ ├── ja.lproj │ │ │ └── Localizable.strings │ │ ├── main.m │ │ ├── pt.lproj │ │ │ └── Localizable.strings │ │ └── screenshot.png │ ├── Framework │ │ ├── Info.plist │ │ ├── MASDictionaryTransformer.h │ │ ├── MASDictionaryTransformer.m │ │ ├── MASDictionaryTransformerTests.m │ │ ├── MASHotKey.h │ │ ├── MASHotKey.m │ │ ├── MASHotKeyTests.m │ │ ├── MASKeyCodes.h │ │ ├── MASKeyMasks.h │ │ ├── MASLocalization.h │ │ ├── MASLocalization.m │ │ ├── MASShortcut.h │ │ ├── MASShortcut.m │ │ ├── MASShortcut.modulemap │ │ ├── MASShortcutBinder.h │ │ ├── MASShortcutBinder.m │ │ ├── MASShortcutBinderTests.m │ │ ├── MASShortcutMonitor.h │ │ ├── MASShortcutMonitor.m │ │ ├── MASShortcutMonitorTests.m │ │ ├── MASShortcutTests.m │ │ ├── MASShortcutValidator.h │ │ ├── MASShortcutValidator.m │ │ ├── MASShortcutView+Bindings.h │ │ ├── MASShortcutView+Bindings.m │ │ ├── MASShortcutView.h │ │ ├── MASShortcutView.m │ │ ├── Prefix.pch │ │ └── Shortcut.h │ ├── LICENSE │ ├── MASShortcut.podspec │ ├── MASShortcut.xcodeproj │ │ ├── project.pbxproj │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── Demo.xcscheme │ │ │ └── MASShortcut.xcscheme │ ├── Makefile │ ├── README.md │ ├── Spec.md │ ├── Tests │ │ ├── Info.plist │ │ └── Prefix.pch │ ├── cs.lproj │ │ └── Localizable.strings │ ├── de.lproj │ │ └── Localizable.strings │ ├── en.lproj │ │ └── Localizable.strings │ ├── es.lproj │ │ └── Localizable.strings │ ├── fr.lproj │ │ └── Localizable.strings │ ├── it.lproj │ │ └── Localizable.strings │ ├── ja.lproj │ │ └── Localizable.strings │ ├── ko.lproj │ │ └── Localizable.strings │ ├── nl.lproj │ │ └── Localizable.strings │ ├── pl.lproj │ │ └── Localizable.strings │ ├── pt.lproj │ │ └── Localizable.strings │ ├── ru.lproj │ │ └── Localizable.strings │ ├── zh-Hans.lproj │ │ └── Localizable.strings │ └── zh-Hant.lproj │ │ └── Localizable.strings │ └── SwiftyJSON │ ├── .github │ ├── ISSUE_TEMPLATE │ └── PULL_REQUEST_TEMPLATE │ ├── .gitignore │ ├── .hound.yml │ ├── .swift-version │ ├── .swiftlint.yml │ ├── .travis.yml │ ├── CHANGELOG.md │ ├── Example │ ├── Example.xcodeproj │ │ ├── project.pbxproj │ │ └── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ ├── Example │ │ ├── AppDelegate.swift │ │ ├── Base.lproj │ │ │ ├── LaunchScreen.xib │ │ │ └── Main.storyboard │ │ ├── Images.xcassets │ │ │ ├── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ │ └── LaunchImage.launchimage │ │ │ │ ├── Contents.json │ │ │ │ └── Default@2x.png │ │ ├── Info.plist │ │ ├── SwiftyJSONTests.json │ │ └── ViewController.swift │ └── Playground.playground │ │ ├── Contents.swift │ │ ├── Resources │ │ └── SwiftyJSONTests.json │ │ └── contents.xcplayground │ ├── LICENSE │ ├── Package.swift │ ├── README.md │ ├── Source │ ├── Info-iOS.plist │ ├── Info-macOS.plist │ ├── Info-tvOS.plist │ ├── Info-watchOS.plist │ ├── SwiftyJSON.h │ └── SwiftyJSON.swift │ ├── SwiftyJSON.podspec │ ├── SwiftyJSON.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ ├── SwiftyJSON iOS.xcscheme │ │ ├── SwiftyJSON macOS.xcscheme │ │ ├── SwiftyJSON tvOS.xcscheme │ │ └── SwiftyJSON watchOS.xcscheme │ ├── SwiftyJSON.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings │ ├── Tests │ └── SwiftyJSONTests │ │ ├── ArrayTests.swift │ │ ├── BaseTests.swift │ │ ├── CodableTests.swift │ │ ├── ComparableTests.swift │ │ ├── DictionaryTests.swift │ │ ├── Info-iOS.plist │ │ ├── Info-macOS.plist │ │ ├── Info-tvOS.plist │ │ ├── LiteralConvertibleTests.swift │ │ ├── MergeTests.swift │ │ ├── MutabilityTests.swift │ │ ├── NestedJSONTests.swift │ │ ├── NumberTests.swift │ │ ├── PerformanceTests.swift │ │ ├── PrintableTests.swift │ │ ├── RawRepresentableTests.swift │ │ ├── RawTests.swift │ │ ├── SequenceTypeTests.swift │ │ ├── StringTests.swift │ │ ├── SubscriptTests.swift │ │ └── Tests.json │ └── scripts │ └── carthage.sh ├── LICENSE ├── README.md └── Resources ├── banner.afdesign ├── banner.png ├── demo.png ├── icon-off.iconset ├── icon_128x128.png ├── icon_128x128@2x.png ├── icon_16x16.png ├── icon_16x16@2x.png ├── icon_256x256.png ├── icon_256x256@2x.png ├── icon_32x32.png ├── icon_32x32@2x.png ├── icon_512x512.png └── icon_512x512@2x.png ├── icon-off.svg ├── icon-off_1024.png ├── icon-on.iconset ├── icon_128x128.png ├── icon_128x128@2x.png ├── icon_16x16.png ├── icon_16x16@2x.png ├── icon_256x256.png ├── icon_256x256@2x.png ├── icon_32x32.png ├── icon_32x32@2x.png ├── icon_512x512.png └── icon_512x512@2x.png ├── icon-on.svg ├── icon-on_1024.png ├── screenshot-dark-sequence.png ├── screenshot-dark.png ├── screenshot-light-sequence.png └── screenshot-light.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | *.xccheckout 14 | *.moved-aside 15 | DerivedData 16 | *.hmap 17 | *.ipa 18 | *.xcuserstate 19 | 20 | # CocoaPods 21 | # 22 | # We recommend against adding the Pods directory to your .gitignore. However 23 | # you should judge for yourself, the pros and cons are mentioned at: 24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 25 | # 26 | # Pods/ 27 | 28 | # Carthage 29 | # 30 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 31 | # Carthage/Checkouts 32 | 33 | Carthage/Build 34 | 35 | .DS_Store -------------------------------------------------------------------------------- /Apptivator.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Apptivator.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Apptivator/Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Bridging-Header.h 3 | // Apptivator 4 | // 5 | 6 | #ifndef Bridging_Header_h 7 | #define Bridging_Header_h 8 | 9 | #import 10 | #import 11 | #import 12 | 13 | #endif /* Bridging_Header_h */ 14 | -------------------------------------------------------------------------------- /Apptivator/Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Extensions.swift 3 | // Apptivator 4 | // 5 | 6 | // http://homecoffeecode.com/nsimage-tinted-as-easily-as-a-uiimage/ 7 | extension NSImage { 8 | func tinted(with tintColor: NSColor) -> NSImage { 9 | guard let cgImage = self.cgImage(forProposedRect: nil, context: nil, hints: nil) else { return self } 10 | 11 | return NSImage(size: size, flipped: false) { bounds in 12 | guard let context = NSGraphicsContext.current?.cgContext else { return false } 13 | tintColor.set() 14 | context.clip(to: bounds, mask: cgImage) 15 | context.fill(bounds) 16 | return true 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Apptivator/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.6.0 21 | CFBundleVersion 22 | 30 23 | LSApplicationCategoryType 24 | public.app-category.utilities 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | LSUIElement 28 | 29 | NSHumanReadableCopyright 30 | Copyright © 2018 acheronfail 31 | NSMainNibFile 32 | APPopoverViewController 33 | NSPrincipalClass 34 | NSApplication 35 | 36 | 37 | -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "icon_16x16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "icon_16x16@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "icon_32x32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "icon_32x32@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "icon_128x128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "icon_128x128@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "icon_256x256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "icon_256x256@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "icon_512x512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "icon_512x512@2x.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/banner.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "banner.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "banner-1.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "banner-2.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/banner.imageset/banner-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/banner.imageset/banner-1.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/banner.imageset/banner-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/banner.imageset/banner-2.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/banner.imageset/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/banner.imageset/banner.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_128x128.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_16x16.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_256x256.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_32x32.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_512x512.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-off.iconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_128x128.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_16x16.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_256x256.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_32x32.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_512x512.png -------------------------------------------------------------------------------- /Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Apptivator/Resources/Assets.xcassets/icon-on.iconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /Apptivator/UI/UIOverrides.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIOverrides.swift 3 | // Apptivator 4 | // 5 | 6 | // If `allowsMixedState` is set, when the user clicks the checkbox it will cycle states between 7 | // on/off/mixed. We want the user to only be able check/uncheck the checkbox, so we have to override 8 | // the getter on NSButtonCell in order for it to act the way we want. 9 | class APMixedButtonCell: NSButtonCell { 10 | override var nextState: Int { 11 | get { 12 | return self.state == .on ? 0 : 1 13 | } 14 | } 15 | } 16 | 17 | // Just add an index property onto the button so we can know which table row it came from. 18 | class APShortcutButton: NSButton { 19 | var index: Int? 20 | } 21 | -------------------------------------------------------------------------------- /ApptivatorTests/AppDelegateTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegateTests.swift 3 | // ApptivatorTests 4 | // 5 | 6 | import XCTest 7 | 8 | @testable import Apptivator 9 | 10 | class AppDelegateTests: XCTestCase {} 11 | -------------------------------------------------------------------------------- /ApptivatorTests/Helpers.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Helpers.swift 3 | // ApptivatorTests 4 | // 5 | 6 | import XCTest 7 | import MASShortcut 8 | @testable import Apptivator 9 | 10 | let KEY_A: UInt = 0 11 | let KEY_B: UInt = 11 12 | let KEY_C: UInt = 8 13 | let KEY_D: UInt = 2 14 | let KEY_E: UInt = 14 15 | let KEY_F: UInt = 3 16 | let KEY_G: UInt = 5 17 | let OPT: UInt = 524288 18 | let CMD: UInt = 1048576 19 | let CMD_SHIFT: UInt = 1179648 20 | 21 | func shortcutView(withKeyCode keyCode: UInt, modifierFlags: UInt) -> MASShortcutView { 22 | let shortcutView = MASShortcutView() 23 | shortcutView.shortcutValue = MASShortcut(keyCode: keyCode, modifierFlags: modifierFlags) 24 | return shortcutView 25 | } 26 | 27 | func entry(atURL url: URL, sequence: [MASShortcutView]) -> APAppEntry { 28 | let entry = APAppEntry(url: url, config: nil)! 29 | entry.sequence = sequence 30 | return entry 31 | } 32 | -------------------------------------------------------------------------------- /ApptivatorTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 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 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /ApptivatorTests/PopoverViewControllerTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PopoverViewControllerTests 3 | // ApptivatorTests 4 | // 5 | 6 | import XCTest 7 | 8 | @testable import Apptivator 9 | 10 | class PopoverViewControllerTests: XCTestCase {} 11 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | # This is a custom fork of MASShortcut which includes its latest commits, 2 | # and a very minor custom addition which allows *any* shortcut to be valid. 3 | github "acheronfail/MASShortcut" "2.3.6-custom" 4 | 5 | # We encode our configuration and settings in JSON. 6 | github "SwiftyJSON/SwiftyJSON" 7 | 8 | # This makes using Apple Accessibility API much easier in Swift. 9 | github "tmandry/AXSwift" ~> 0.2 10 | 11 | # Greatly simplifies the process of implementing this functionality. 12 | github "sindresorhus/LaunchAtLogin" 13 | 14 | # Used for advanced logging features. 15 | github "emaloney/CleanroomLogger" ~> 6.0.0 -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "SwiftyJSON/SwiftyJSON" "4.2.0" 2 | github "acheronfail/MASShortcut" "2.3.6-custom" 3 | github "emaloney/CleanroomLogger" "6.0.2" 4 | github "sindresorhus/LaunchAtLogin" "v2.4.0" 5 | github "tmandry/AXSwift" "0.2.2" 6 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | 3 | ## Build generated 4 | build/ 5 | DerivedData 6 | 7 | ## Various settings 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | 18 | ## Other 19 | *.xccheckout 20 | *.moved-aside 21 | *.xcuserstate 22 | *.xcscmblueprint 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | 28 | # CocoaPods 29 | Pods/ 30 | 31 | # Carthage 32 | # 33 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 34 | # Carthage/Checkouts 35 | 36 | Carthage/Build 37 | 38 | 39 | # OS X 40 | 41 | .DS_Store 42 | .AppleDouble 43 | .LSOverride 44 | 45 | ## Icon must end with two \r 46 | Icon 47 | 48 | 49 | ## Thumbnails 50 | ._* 51 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/.swift-version: -------------------------------------------------------------------------------- 1 | 4 2 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/AXSwift.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'AXSwift' 3 | s.version = '0.2.2' 4 | s.summary = 'Swift wrapper for Mac accessibility APIs' 5 | 6 | s.description = <<-DESC 7 | AXSwift is a Swift wrapper for OS X's C-based accessibility client APIs. Working with these APIs 8 | is error-prone and a huge pain, so AXSwift makes everything easier: 9 | 10 | - Modern API that's 100% Swift 11 | - Explicit error handling 12 | - Complete coverage of the underlying C API 13 | - Better documentation than Apple's, which is pretty poor 14 | 15 | This framework is intended as a basic wrapper and doesn't keep any state or do any "magic". 16 | That's up to you! 17 | DESC 18 | 19 | s.homepage = 'https://github.com/tmandry/AXSwift' 20 | s.license = { :type => 'MIT', :file => 'LICENSE' } 21 | s.author = { 'Tyler Mandry' => 'tmandry@gmail.com' } 22 | s.source = { :git => 'https://github.com/tmandry/AXSwift.git', :tag => s.version.to_s } 23 | s.social_media_url = 'https://twitter.com/tmandry' 24 | 25 | s.osx.deployment_target = '10.10' 26 | 27 | s.source_files = 'Sources/*.{swift,h}' 28 | 29 | s.public_header_files = 'Sources/*.h' 30 | s.frameworks = 'Cocoa' 31 | end 32 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/AXSwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/AXSwiftExample/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/AXSwiftExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2015 Tyler Mandry. All rights reserved. 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/AXSwiftExample/main.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | let applicationDelegate = ApplicationDelegate() 4 | let application = NSApplication.shared 5 | application.setActivationPolicy(NSApplication.ActivationPolicy.accessory) 6 | application.delegate = applicationDelegate 7 | application.run() 8 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/AXSwiftObserverExample/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import AXSwift 3 | 4 | class AppDelegate: NSObject, NSApplicationDelegate { 5 | 6 | var observer: Observer! 7 | 8 | func applicationDidFinishLaunching(_ aNotification: Notification) { 9 | let app = Application.allForBundleID("com.apple.finder").first! 10 | 11 | do { 12 | try startWatcher(app) 13 | } catch let error { 14 | NSLog("Error: Could not watch app [\(app)]: \(error)") 15 | abort() 16 | } 17 | } 18 | 19 | func startWatcher(_ app: Application) throws { 20 | var updated = false 21 | observer = app.createObserver { (observer: Observer, element: UIElement, event: AXNotification, info: [String: AnyObject]?) in 22 | var elementDesc: String! 23 | if let role = try? element.role()!, role == .window { 24 | elementDesc = "\(element) \"\(try! (element.attribute(.title) as String?)!)\"" 25 | } else { 26 | elementDesc = "\(element)" 27 | } 28 | print("\(event) on \(elementDesc); info: \(info ?? [:])") 29 | 30 | // Watch events on new windows 31 | if event == .windowCreated { 32 | do { 33 | try observer.addNotification(.uiElementDestroyed, forElement: element) 34 | try observer.addNotification(.moved, forElement: element) 35 | } catch let error { 36 | NSLog("Error: Could not watch [\(element)]: \(error)") 37 | } 38 | } 39 | 40 | // Group simultaneous events together with --- lines 41 | if !updated { 42 | updated = true 43 | // Set this code to run after the current run loop, which is dispatching all notifications. 44 | DispatchQueue.main.async { 45 | print("---") 46 | updated = false 47 | } 48 | } 49 | } 50 | 51 | try observer.addNotification(.windowCreated, forElement: app) 52 | try observer.addNotification(.mainWindowChanged, forElement: app) 53 | } 54 | 55 | func applicationWillTerminate(_ aNotification: Notification) { 56 | // Insert code here to tear down your application 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/AXSwiftObserverExample/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/AXSwiftObserverExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2015 Tyler Mandry. All rights reserved. 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/AXSwiftObserverExample/main.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | let applicationDelegate = AppDelegate() 4 | let application = NSApplication.shared 5 | application.setActivationPolicy(NSApplication.ActivationPolicy.accessory) 6 | application.delegate = applicationDelegate 7 | application.run() 8 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Tyler Mandry 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/README.md: -------------------------------------------------------------------------------- 1 | # AXSwift 2 | 3 | AXSwift is a Swift wrapper for macOS's C-based accessibility client APIs. Working with these APIs is 4 | error-prone and a huge pain, so AXSwift makes everything easier: 5 | 6 | - Modern API that's 100% Swift 7 | - Explicit error handling 8 | - Complete coverage of the underlying C API 9 | - Better documentation than Apple's, which is pretty poor 10 | 11 | This framework is intended as a basic wrapper, and doesn't keep any state or do any "magic". 12 | That's up to you! 13 | 14 | ## Using AXSwift 15 | 16 | Swift package manager (SPM) is not supported, because it cannot build libraries 17 | and applications that depend on Cocoa. 18 | 19 | ### Carthage 20 | In your Cartfile: 21 | ``` 22 | github "tmandry/AXSwift" ~> 0.2 23 | ``` 24 | 25 | ### CocoaPods 26 | In your Podfile: 27 | ``` 28 | pod 'AXSwift', '~> 0.2' 29 | ``` 30 | 31 | See the source of [AXSwiftExample](https://github.com/tmandry/AXSwift/blob/master/AXSwiftExample/AppDelegate.swift) 32 | and [AXSwiftObserverExample](https://github.com/tmandry/AXSwift/blob/master/AXSwiftObserverExample/AppDelegate.swift) 33 | for an example of the API. 34 | 35 | ## Related Projects 36 | 37 | [Swindler](https://github.com/tmandry/Swindler), a framework for building macOS window managers in Swift, 38 | is built on top of AXSwift. 39 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/Sources/AXSwift.h: -------------------------------------------------------------------------------- 1 | // 2 | // AXSwift.h 3 | // AXSwift 4 | // 5 | // Created by Tyler Mandry on 10/18/15. 6 | // Copyright © 2015 Tyler Mandry. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for AXSwift. 12 | FOUNDATION_EXPORT double AXSwiftVersionNumber; 13 | 14 | //! Project version string for AXSwift. 15 | FOUNDATION_EXPORT const unsigned char AXSwiftVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like 18 | // #import 19 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/Sources/AXSwift.swift: -------------------------------------------------------------------------------- 1 | @discardableResult 2 | public func checkIsProcessTrusted(prompt: Bool = false) -> Bool { 3 | let promptKey = kAXTrustedCheckOptionPrompt.takeUnretainedValue() as String 4 | let opts = [promptKey: prompt] as CFDictionary 5 | return AXIsProcessTrustedWithOptions(opts) 6 | } 7 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/Sources/Error.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension AXError: Swift.Error {} 4 | 5 | // For some reason values don't get described in this enum, so we have to do it manually. 6 | extension AXError: CustomStringConvertible { 7 | fileprivate var valueAsString: String { 8 | switch self { 9 | case .success: 10 | return "Success" 11 | case .failure: 12 | return "Failure" 13 | case .illegalArgument: 14 | return "IllegalArgument" 15 | case .invalidUIElement: 16 | return "InvalidUIElement" 17 | case .invalidUIElementObserver: 18 | return "InvalidUIElementObserver" 19 | case .cannotComplete: 20 | return "CannotComplete" 21 | case .attributeUnsupported: 22 | return "AttributeUnsupported" 23 | case .actionUnsupported: 24 | return "ActionUnsupported" 25 | case .notificationUnsupported: 26 | return "NotificationUnsupported" 27 | case .notImplemented: 28 | return "NotImplemented" 29 | case .notificationAlreadyRegistered: 30 | return "NotificationAlreadyRegistered" 31 | case .notificationNotRegistered: 32 | return "NotificationNotRegistered" 33 | case .apiDisabled: 34 | return "APIDisabled" 35 | case .noValue: 36 | return "NoValue" 37 | case .parameterizedAttributeUnsupported: 38 | return "ParameterizedAttributeUnsupported" 39 | case .notEnoughPrecision: 40 | return "NotEnoughPrecision" 41 | } 42 | } 43 | 44 | public var description: String { 45 | return "AXError.\(valueAsString)" 46 | } 47 | } 48 | 49 | /// All possible errors that could be returned from UIElement or one of its subclasses. 50 | /// 51 | /// These are just the errors that can be returned from the underlying API. 52 | /// 53 | /// - seeAlso: [AXUIElement.h Reference](https://developer.apple.com/library/mac/documentation/ApplicationServices/Reference/AXUIElement_header_reference/) 54 | /// - seeAlso: `UIElement` for a list of errors that you should handle 55 | //public typealias Error = AXError 56 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/Sources/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 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSHumanReadableCopyright 24 | Copyright © 2015 Tyler Mandry. All rights reserved. 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Carthage/Checkouts/AXSwift/Sources/SystemWideElement.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | /// A singleton for the system-wide element. 4 | public var systemWideElement = SystemWideElement() 5 | 6 | /// A `UIElement` for the system-wide accessibility element, which can be used to retrieve global, 7 | /// application-inspecific parameters like the currently focused element. 8 | open class SystemWideElement: UIElement { 9 | fileprivate convenience init() { 10 | self.init(AXUIElementCreateSystemWide()) 11 | } 12 | 13 | /// Returns the element at the specified top-down coordinates, or nil if there is none. 14 | open override func elementAtPosition(_ x: Float, _ y: Float) throws -> UIElement? { 15 | return try super.elementAtPosition(x, y) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/.gitignore: -------------------------------------------------------------------------------- 1 | # Finder/Mac OS X 2 | # 3 | .DS_Store 4 | 5 | # Xcode / Swift 6 | # 7 | .build/ 8 | build/ 9 | *.pbxuser 10 | !default.pbxuser 11 | *.mode1v3 12 | !default.mode1v3 13 | *.mode2v3 14 | !default.mode2v3 15 | *.perspectivev3 16 | !default.perspectivev3 17 | xcuserdata 18 | *.xccheckout 19 | *.moved-aside 20 | DerivedData 21 | *.hmap 22 | *.ipa 23 | *.xcuserstate 24 | *.xcscmblueprint 25 | 26 | # jazzy documentation generator 27 | # 28 | undocumented.json 29 | 30 | # Carthage: we --use-submodules for our non-leaf dependencies 31 | # 32 | Carthage/* 33 | !Carthage/Checkouts/ 34 | **/Carthage/ 35 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/BuildControl/Info-Target.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 | 6.0.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | 24 | 25 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/BuildControl/Info-Tests.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 | 0.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | 24 | 25 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/BuildControl/bin/carthageUpdate.sh: -------------------------------------------------------------------------------- 1 | carthage update $@ --use-submodules --no-build 2 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/BuildControl/bin/generateDocumentationForAPI.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | while [[ $1 ]]; do 4 | case $1 in 5 | --quiet|-q) 6 | QUIET=1 7 | ;; 8 | esac 9 | shift 10 | done 11 | 12 | JAZZY_EXECUTABLE=`which jazzy` 13 | if [[ $? != 0 ]]; then 14 | echo "error: The jazzy documentation generator must be installed. Visit https://github.com/realm/jazzy for installation information." 15 | exit 1 16 | fi 17 | 18 | pushd "`dirname $0`/../.." > /dev/null 19 | 20 | PUBLIC_GITHUB_URL="https://github.com/emaloney/CleanroomLogger" 21 | if [[ -z "$PUBLIC_GITHUB_URL" ]]; then 22 | PUBLIC_GITHUB_URL=$(git remote -v | grep fetch | awk '{ print $2 }' | sed s/.git\$// | sed s/^ssh/https/ | sed s#git@github.com:#https://github.com/# ) 23 | fi 24 | MODULE_NAME=`basename $PUBLIC_GITHUB_URL` 25 | AUTHOR_GITHUB_URL=`dirname $PUBLIC_GITHUB_URL` 26 | CURRENT_YEAR=`date +"%Y"` 27 | COPYRIGHT_YEAR=`git log --pretty=%ad $(git rev-list --max-parents=0 HEAD) | awk '{print $5}'` 28 | if [[ "$COPYRIGHT_YEAR" != "$CURRENT_YEAR" ]]; then 29 | COPYRIGHT_YEAR="${COPYRIGHT_YEAR}-${CURRENT_YEAR}" 30 | fi 31 | 32 | rm -rf Documentation/API # clear out any old docs; they may have remnant files 33 | 34 | if [[ $QUIET ]]; then 35 | "$JAZZY_EXECUTABLE" -o Documentation/API \ 36 | --module "$MODULE_NAME" \ 37 | --readme Sources/README.md \ 38 | --github_url "$PUBLIC_GITHUB_URL" \ 39 | --author "Evan Maloney, Gilt Groupe" \ 40 | --author_url "$AUTHOR_GITHUB_URL" \ 41 | --copyright "© $COPYRIGHT_YEAR [Gilt Groupe](http://tech.gilt.com/)" 2&> /dev/null 42 | else 43 | "$JAZZY_EXECUTABLE" -o Documentation/API \ 44 | --module "$MODULE_NAME" \ 45 | --readme Sources/README.md \ 46 | --github_url "$PUBLIC_GITHUB_URL" \ 47 | --author "Evan Maloney, Gilt Groupe" \ 48 | --author_url "$AUTHOR_GITHUB_URL" \ 49 | --copyright "© $COPYRIGHT_YEAR [Gilt Groupe](http://tech.gilt.com/)" 50 | fi 51 | 52 | JAZZY_EXIT_CODE=$? 53 | if [[ $JAZZY_EXIT_CODE != 0 ]]; then 54 | echo "error: $JAZZY_EXECUTABLE failed with an exit code of $JAZZY_EXIT_CODE; check any output above for additional details." 55 | exit 2 56 | fi 57 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/BuildControl/bin/processBoilerplate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | SCRIPT_NAME=$(basename "$0") 4 | SCRIPT_DIR=$(cd "$PWD" ; cd `dirname "$0"` ; echo "$PWD") 5 | 6 | PLATE_EXECUTABLE=$( which plate ) 7 | if [[ $? != 0 ]]; then 8 | echo "error: Couldn't find 'plate' executable; available at https://github.com/emaloney/Boilerplate" 9 | exit 1 10 | fi 11 | 12 | cd "${SCRIPT_DIR}/../../" 13 | 14 | PROJECT_XML=BuildControl/CleanroomLogger.xml 15 | REPOS_XML=BuildControl/repos.xml 16 | FILE_COUNT=0 17 | 18 | echo "Searching for boilerplate files in $PWD" 19 | 20 | for f in `find . -name "*.boilerplate"` 21 | do 22 | BOILERPLATE_FILE="$f" 23 | OUTPUT_FILE=$( echo $f | sed sq.boilerplate\$qq ) 24 | 25 | ECHO_OUTPUT_FILE=$( basename "$OUTPUT_FILE" ) 26 | echo " $BOILERPLATE_FILE -> $ECHO_OUTPUT_FILE" 27 | "$PLATE_EXECUTABLE" -t "$BOILERPLATE_FILE" -d "$PROJECT_XML" -m "$REPOS_XML" -o "$OUTPUT_FILE" 28 | if [[ $? == 0 ]]; then 29 | FILE_COUNT=$(( $FILE_COUNT + 1 )) 30 | else 31 | exit 2 32 | fi 33 | done 34 | 35 | if [[ $FILE_COUNT == 0 ]]; then 36 | echo "No boilerplate files found." 37 | elif [[ $FILE_COUNT == 1 ]]; then 38 | echo "Successfully processed $FILE_COUNT boilerplate file" 39 | else 40 | echo "Successfully processed $FILE_COUNT boilerplate files" 41 | fi 42 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/BuildControl/bin/travisBuildHelper.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -o pipefail 4 | 5 | if [[ $# != 2 ]]; then 6 | echo "error: Expecting 2 arguments; " 7 | exit 1 8 | fi 9 | 10 | OPERATION="$1" 11 | PLATFORM="$2" 12 | 13 | SCRIPT_NAME=$(basename "$0") 14 | SCRIPT_DIR=$(cd "$PWD" ; cd `dirname "$0"` ; echo "$PWD") 15 | 16 | source "${SCRIPT_DIR}/include-common.sh" 17 | 18 | BUILD_ACTION="clean $(testActionForPlatform $PLATFORM)" 19 | DESTINATION=$(runDestinationForPlatform $PLATFORM) 20 | 21 | ( set -o pipefail && xcodebuild -project CleanroomLogger.xcodeproj -configuration Debug -scheme "CleanroomLogger" -destination "$DESTINATION" -destination-timeout 300 $BUILD_ACTION 2>&1 | tee "CleanroomLogger-$PLATFORM-$OPERATION.log" | xcpretty ) 22 | XCODE_RESULT="${PIPESTATUS[0]}" 23 | if [[ "$XCODE_RESULT" == "0" ]]; then 24 | rm "CleanroomLogger-$PLATFORM-$OPERATION.log" 25 | exit 0 26 | fi 27 | 28 | exit $XCODE_RESULT 29 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/BuildControl/config/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Target.xcconfig" 2 | 3 | ONLY_ACTIVE_ARCH = YES 4 | SWIFT_OPTIMIZATION_LEVEL = -Onone 5 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) DEBUG 6 | ENABLE_BITCODE = NO 7 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/BuildControl/config/Project.xcconfig: -------------------------------------------------------------------------------- 1 | SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx appletvos appletvsimulator watchos watchsimulator 2 | TARGETED_DEVICE_FAMILY = 1,2,3,4 3 | 4 | //////////////////////////////////////////////////////////////////////////////// 5 | // 6 | // iOS-specific settings 7 | // 8 | IPHONEOS_DEPLOYMENT_TARGET = 8.0 9 | 10 | VALID_ARCHS[sdk=iphoneos*] = arm64 armv7 armv7s 11 | VALID_ARCHS[sdk=iphonesimulator*] = i386 x86_64 12 | 13 | LD_RUNPATH_SEARCH_PATHS[sdk=iphoneos*] = @executable_path/Frameworks @loader_path/Frameworks 14 | LD_RUNPATH_SEARCH_PATHS[sdk=iphonesimulator*] = @executable_path/Frameworks @loader_path/Frameworks 15 | 16 | ENABLE_BITCODE[sdk=iphone*] = YES 17 | 18 | //////////////////////////////////////////////////////////////////////////////// 19 | // 20 | // macOS-specific settings 21 | // 22 | MACOSX_DEPLOYMENT_TARGET = 10.9 23 | 24 | VALID_ARCHS[sdk=macosx*] = i386 x86_64 25 | 26 | LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = @executable_path/../Frameworks @loader_path/../Frameworks 27 | 28 | ENABLE_BITCODE[sdk=macosx*] = NO 29 | 30 | //////////////////////////////////////////////////////////////////////////////// 31 | // 32 | // tvOS-specific settings 33 | // 34 | TVOS_DEPLOYMENT_TARGET = 9.0 35 | 36 | VALID_ARCHS[sdk=appletvos*] = arm64 37 | VALID_ARCHS[sdk=appletvsimulator*] = x86_64 38 | 39 | LD_RUNPATH_SEARCH_PATHS[sdk=appletvos*] = @executable_path/Frameworks @loader_path/Frameworks 40 | LD_RUNPATH_SEARCH_PATHS[sdk=appletvsimulator*] = @executable_path/Frameworks @loader_path/Frameworks 41 | 42 | ENABLE_BITCODE[sdk=appletv*] = YES 43 | 44 | //////////////////////////////////////////////////////////////////////////////// 45 | // 46 | // watchOS-specific settings 47 | // 48 | WATCHOS_DEPLOYMENT_TARGET = 2.0 49 | 50 | VALID_ARCHS[sdk=watchos*] = armv7k 51 | VALID_ARCHS[sdk=watchsimulator*] = i386 52 | 53 | LD_RUNPATH_SEARCH_PATHS[sdk=watchos*] = @executable_path/Frameworks @loader_path/Frameworks 54 | LD_RUNPATH_SEARCH_PATHS[sdk=watchsimulator*] = @executable_path/Frameworks @loader_path/Frameworks 55 | 56 | ENABLE_BITCODE[sdk=watch*] = YES 57 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/BuildControl/config/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Target.xcconfig" 2 | 3 | ONLY_ACTIVE_ARCH = NO 4 | SWIFT_OPTIMIZATION_LEVEL = -Owholemodule 5 | BITCODE_GENERATION_MODE = bitcode 6 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/BuildControl/config/Target.xcconfig: -------------------------------------------------------------------------------- 1 | PRODUCT_NAME = CleanroomLogger 2 | PRODUCT_BUNDLE_IDENTIFIER = com.gilt.cleanroom.$(PRODUCT_NAME:rfc1034identifier) 3 | INFOPLIST_FILE = BuildControl/Info-Target.plist 4 | DYLIB_CURRENT_VERSION = $(CURRENT_PROJECT_VERSION) 5 | APPLICATION_EXTENSION_API_ONLY = YES 6 | 7 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/BuildControl/config/Tests.xcconfig: -------------------------------------------------------------------------------- 1 | INFOPLIST_FILE = BuildControl/Info-Tests.plist 2 | PRODUCT_NAME = CleanroomLoggerUnitTests 3 | PRODUCT_BUNDLE_IDENTIFIER = com.gilt.cleanroom.test.$(PRODUCT_NAME:rfc1034identifier) 4 | SWIFT_OPTIMIZATION_LEVEL = -Onone 5 | ONLY_ACTIVE_ARCH = YES 6 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/CleanroomLogger.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/badge.svg: -------------------------------------------------------------------------------- 1 | documentationdocumentation100%100% -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.docset/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleIdentifier 6 | com.jazzy.cleanroomlogger 7 | CFBundleName 8 | CleanroomLogger 9 | DocSetPlatformFamily 10 | cleanroomlogger 11 | isDashDocset 12 | 13 | dashIndexFilePath 14 | index.html 15 | isJavaScriptEnabled 16 | 17 | DashDocSetFamily 18 | dashtoc 19 | 20 | 21 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.docset/Contents/Resources/Documents/img/carat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.docset/Contents/Resources/Documents/img/carat.png -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.docset/Contents/Resources/Documents/img/dash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.docset/Contents/Resources/Documents/img/dash.png -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.docset/Contents/Resources/Documents/img/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.docset/Contents/Resources/Documents/img/gh.png -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.docset/Contents/Resources/Documents/js/jazzy.js: -------------------------------------------------------------------------------- 1 | window.jazzy = {'docset': false} 2 | if (typeof window.dash != 'undefined') { 3 | document.documentElement.className += ' dash' 4 | window.jazzy.docset = true 5 | } 6 | if (navigator.userAgent.match(/xcode/i)) { 7 | document.documentElement.className += ' xcode' 8 | window.jazzy.docset = true 9 | } 10 | 11 | // On doc load, toggle the URL hash discussion if present 12 | $(document).ready(function() { 13 | if (!window.jazzy.docset) { 14 | var linkToHash = $('a[href="' + window.location.hash +'"]'); 15 | linkToHash.trigger("click"); 16 | } 17 | }); 18 | 19 | // On token click, toggle its discussion and animate token.marginLeft 20 | $(".token").click(function(event) { 21 | if (window.jazzy.docset) { 22 | return; 23 | } 24 | var link = $(this); 25 | var animationDuration = 300; 26 | var tokenOffset = "15px"; 27 | var original = link.css('marginLeft') == tokenOffset; 28 | link.animate({'margin-left':original ? "0px" : tokenOffset}, animationDuration); 29 | $content = link.parent().parent().next(); 30 | $content.slideToggle(animationDuration); 31 | 32 | // Keeps the document from jumping to the hash. 33 | var href = $(this).attr('href'); 34 | if (history.pushState) { 35 | history.pushState({}, '', href); 36 | } else { 37 | location.hash = href; 38 | } 39 | event.preventDefault(); 40 | }); 41 | 42 | // Dumb down quotes within code blocks that delimit strings instead of quotations 43 | // https://github.com/realm/jazzy/issues/714 44 | $("code q").replaceWith(function () { 45 | return ["\"", $(this).contents(), "\""]; 46 | }); 47 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.docset/Contents/Resources/docSet.dsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.docset/Contents/Resources/docSet.dsidx -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Carthage/Checkouts/CleanroomLogger/Documentation/API/docsets/CleanroomLogger.tgz -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/img/carat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Carthage/Checkouts/CleanroomLogger/Documentation/API/img/carat.png -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/img/dash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Carthage/Checkouts/CleanroomLogger/Documentation/API/img/dash.png -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/img/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Carthage/Checkouts/CleanroomLogger/Documentation/API/img/gh.png -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Documentation/API/js/jazzy.js: -------------------------------------------------------------------------------- 1 | window.jazzy = {'docset': false} 2 | if (typeof window.dash != 'undefined') { 3 | document.documentElement.className += ' dash' 4 | window.jazzy.docset = true 5 | } 6 | if (navigator.userAgent.match(/xcode/i)) { 7 | document.documentElement.className += ' xcode' 8 | window.jazzy.docset = true 9 | } 10 | 11 | // On doc load, toggle the URL hash discussion if present 12 | $(document).ready(function() { 13 | if (!window.jazzy.docset) { 14 | var linkToHash = $('a[href="' + window.location.hash +'"]'); 15 | linkToHash.trigger("click"); 16 | } 17 | }); 18 | 19 | // On token click, toggle its discussion and animate token.marginLeft 20 | $(".token").click(function(event) { 21 | if (window.jazzy.docset) { 22 | return; 23 | } 24 | var link = $(this); 25 | var animationDuration = 300; 26 | var tokenOffset = "15px"; 27 | var original = link.css('marginLeft') == tokenOffset; 28 | link.animate({'margin-left':original ? "0px" : tokenOffset}, animationDuration); 29 | $content = link.parent().parent().next(); 30 | $content.slideToggle(animationDuration); 31 | 32 | // Keeps the document from jumping to the hash. 33 | var href = $(this).attr('href'); 34 | if (history.pushState) { 35 | history.pushState({}, '', href); 36 | } else { 37 | location.hash = href; 38 | } 39 | event.preventDefault(); 40 | }); 41 | 42 | // Dumb down quotes within code blocks that delimit strings instead of quotations 43 | // https://github.com/realm/jazzy/issues/714 44 | $("code q").replaceWith(function () { 45 | return ["\"", $(this).contents(), "\""]; 46 | }); 47 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2009-2015 Gilt Groupe, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Package.swift: -------------------------------------------------------------------------------- 1 | import PackageDescription 2 | 3 | let package = Package( 4 | name: "CleanroomLogger" 5 | ) 6 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/CallSiteLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CallSiteLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/4/16. 6 | // Copyright © 2016 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /** 12 | A `LogFormatter` that returns a string representation of the `LogEntry`'s 13 | *call site*, consisting of the last path component of the `callingFilePath` 14 | followed by the `callingFileLine` within that file. 15 | 16 | This is typically combined with other `LogFormatter`s within a 17 | `ConcatenatingLogFormatter`. 18 | */ 19 | public struct CallSiteLogFormatter: LogFormatter 20 | { 21 | /** The initializer. */ 22 | public init() {} 23 | 24 | /** 25 | Formats the passed-in `LogEntry` by returning a string representation of 26 | the call site specified by its `callingFilePath` and `callingFileLine` 27 | properties. 28 | 29 | - returns: The formatted result; never `nil`. 30 | */ 31 | public func format(_ entry: LogEntry) 32 | -> String? 33 | { 34 | let file = (entry.callingFilePath as NSString).pathComponents.last ?? "redacted" 35 | return "\(file):\(entry.callingFileLine)" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/CallingThreadLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CallingThreadLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/4/16. 6 | // Copyright © 2016 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | Governs how a `CallingThreadLogFormatter` will represent a `LogEntry`'s 11 | `callingThreadID`. 12 | */ 13 | public enum CallingThreadStyle 14 | { 15 | /** Renders the `callingThreadID` as a hex string. */ 16 | case hex 17 | 18 | /** Renders the `callingThreadID` as an integer string. */ 19 | case integer 20 | } 21 | 22 | extension CallingThreadStyle 23 | { 24 | fileprivate func format(_ callingThreadID: UInt64) 25 | -> String 26 | { 27 | switch self { 28 | case .hex: return String(format: "%08X", callingThreadID) 29 | case .integer: return String(describing: callingThreadID) 30 | } 31 | } 32 | } 33 | 34 | /** 35 | A `LogFormatter` that returns a string representation of a `LogEntry`'s 36 | `callingThreadID`. 37 | 38 | This is typically combined with other `LogFormatter`s within a 39 | `ConcatenatingLogFormatter`. 40 | */ 41 | public struct CallingThreadLogFormatter: LogFormatter 42 | { 43 | /** Governs how the receiver represents `callingThreadID`s. */ 44 | public let style: CallingThreadStyle 45 | 46 | /** 47 | The `CallingThreadLogFormatter` initializer. 48 | 49 | - parameter style: The style to use for representing `callingThreadID`s. 50 | */ 51 | public init(style: CallingThreadStyle = .hex) 52 | { 53 | self.style = style 54 | } 55 | 56 | /** 57 | Formats the passed-in `LogEntry` by returning a string representation of 58 | its `callingThreadID`. The format is governed by the value of the 59 | receiver's `style` property. 60 | 61 | - parameter entry: The `LogEntry` to format. 62 | 63 | - returns: The formatted result; never `nil`. 64 | */ 65 | public func format(_ entry: LogEntry) 66 | -> String? 67 | { 68 | return style.format(entry.callingThreadID) 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/DelimiterLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DelimiterLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/4/16. 6 | // Copyright © 2016 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | Allows the specification of different field delimiters. 11 | */ 12 | public enum DelimiterStyle 13 | { 14 | /** Specifies a pipe character with a space character on each side. */ 15 | case spacedPipe 16 | 17 | /** Specifies a hyphen character with a space character on each side. */ 18 | case spacedHyphen 19 | 20 | /** Specifies the tab character: ASCII `0x09`. */ 21 | case tab 22 | 23 | /** Specifies the space character: ASCII `0x20`. */ 24 | case space 25 | 26 | /** Specifies a custom field delimiters. */ 27 | case custom(String) 28 | } 29 | 30 | public extension DelimiterStyle 31 | { 32 | /** 33 | Returns the field delimiter string indicated by the receiver's value. 34 | */ 35 | public var delimiter: String { 36 | switch self { 37 | case .spacedPipe: return " | " 38 | case .spacedHyphen: return " - " 39 | case .tab: return "\t" 40 | case .space: return " " 41 | case .custom(let sep): return sep 42 | } 43 | } 44 | } 45 | 46 | /** 47 | A `LogFormatter` used to output field separator strings. 48 | 49 | This is typically combined with other `LogFormatter`s within a 50 | `ConcatenatingLogFormatter`. 51 | */ 52 | public struct DelimiterLogFormatter: LogFormatter 53 | { 54 | /** The `DelimiterStyle` that determines the return value of the 55 | receiver's `format(_:)` function. */ 56 | public let style: DelimiterStyle 57 | 58 | /** 59 | Initializes a new `DelimiterLogFormatter` instance using the given 60 | `DelimiterStyle`. 61 | 62 | - parameter style: The field separator style. 63 | */ 64 | public init(style: DelimiterStyle = .spacedPipe) 65 | { 66 | self.style = style 67 | } 68 | 69 | /** 70 | Returns the value of the `separatorString` property from the receiver's 71 | `style` property. 72 | 73 | - parameter entry: Ignored by this implementation. 74 | 75 | - returns: The value of `style.delimiter` property; never `nil`. 76 | */ 77 | public func format(_ entry: LogEntry) 78 | -> String? 79 | { 80 | return style.delimiter 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/LiteralLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LiteralLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/4/16. 6 | // Copyright © 2016 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` that returns always returns a given literal string 11 | regardless of input. 12 | 13 | This is typically combined with other `LogFormatter`s within a 14 | `ConcatenatingLogFormatter`. 15 | */ 16 | public struct LiteralLogFormatter: LogFormatter 17 | { 18 | /** The literal string used as the return value of the receiver's 19 | `format(_:)` function. */ 20 | public let literal: String 21 | 22 | /** 23 | Initializes a new `LiteralLogFormatter` to contain the given string. 24 | 25 | - parameter string: The literal string. 26 | */ 27 | public init(_ string: String) 28 | { 29 | literal = string 30 | } 31 | 32 | /** 33 | Returns the value of the receiver's `literal` property. 34 | 35 | - parameter entry: Ignored by this implementation. 36 | 37 | - returns: The value of the receiver's `literal` property; never `nil`. 38 | */ 39 | public func format(_ entry: LogEntry) 40 | -> String? 41 | { 42 | return literal 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/LogFilter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogFilter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 3/20/15. 6 | // Copyright © 2015 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | Before a `LogEntry` is recorded, any `LogFilter`s specified in the active 11 | `LogConfiguration` are given a chance to prevent the entry from being recorded 12 | by returning `false` from the `shouldRecord(entry:)` function. 13 | */ 14 | public protocol LogFilter 15 | { 16 | /** 17 | Called to determine whether the given `LogEntry` should be recorded. 18 | 19 | - parameter entry: The `LogEntry` to be evaluated by the filter. 20 | 21 | - returns: `true` if `entry` should be recorded, `false` if not. 22 | */ 23 | func shouldRecord(entry: LogEntry) 24 | -> Bool 25 | } 26 | 27 | /** 28 | A `LogFilter` implementation that filters out any `LogEntry` with a 29 | `LogSeverity` less than a specified value. 30 | */ 31 | public struct LogSeverityFilter: LogFilter 32 | { 33 | /** The `LogSeverity` associated with the receiver. */ 34 | public let severity: LogSeverity 35 | 36 | /** 37 | Initializes a new `LogSeverityFilter` instance. 38 | 39 | - parameter severity: Specifies the `LogSeverity` that the filter will 40 | use to determine whether a given `LogEntry` should be recorded. Only those 41 | log entries with a severity equal to or more severe than this value will 42 | pass through the filter. 43 | */ 44 | public init(severity: LogSeverity) 45 | { 46 | self.severity = severity 47 | } 48 | 49 | /** 50 | Called to determine whether the given `LogEntry` should be recorded. 51 | 52 | - parameter entry: The `LogEntry` to be evaluated by the filter. 53 | 54 | - returns: `true` if `entry.severity` is as or more severe than the 55 | receiver's `severity` property; `false` otherwise. 56 | */ 57 | public func shouldRecord(entry: LogEntry) 58 | -> Bool 59 | { 60 | return entry.severity >= severity 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/LogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 3/18/15. 6 | // Copyright © 2015 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | `LogFormatter`s are used to attempt to create string representations of 11 | `LogEntry` instances. 12 | */ 13 | public protocol LogFormatter 14 | { 15 | /** 16 | Called to create a string representation of the passed-in `LogEntry`. 17 | 18 | - parameter entry: The `LogEntry` to attempt to convert into a string. 19 | 20 | - returns: A `String` representation of `entry`, or `nil` if the 21 | receiver could not format the `LogEntry`. 22 | */ 23 | func format(_ entry: LogEntry) -> String? 24 | } 25 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/LogRecorderBase.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogRecorderBase.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 5/12/15. 6 | // Copyright © 2015 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | import Dispatch 10 | 11 | /** 12 | A partial implementation of the `LogRecorder` protocol. 13 | */ 14 | open class LogRecorderBase: LogRecorder 15 | { 16 | /** The `LogFormatter`s that will be used to format messages for the 17 | `LogEntry`s to be logged. */ 18 | open let formatters: [LogFormatter] 19 | 20 | /** The GCD queue that should be used for logging actions related to the 21 | receiver. */ 22 | open let queue: DispatchQueue 23 | 24 | /** 25 | Initialize a new `LogRecorderBase` instance. 26 | 27 | - parameter formatters: An array of `LogFormatter`s to use for formatting 28 | log entries to be recorded by the receiver. Each formatter is consulted in 29 | sequence, and the formatted string returned by the first formatter to 30 | yield a non-`nil` value will be recorded. If every formatter returns `nil`, 31 | the log entry is silently ignored and not recorded. 32 | 33 | - parameter queue: The `DispatchQueue` to use for the recorder. If `nil`, 34 | a new queue will be created. 35 | */ 36 | public init(formatters: [LogFormatter], queue: DispatchQueue? = nil) 37 | { 38 | self.formatters = formatters 39 | self.queue = queue != nil ? queue! : DispatchQueue(label: String(describing: type(of: self)), attributes: []) 40 | } 41 | 42 | /** 43 | This implementation, which does nothing, is present to satisfy the 44 | `LogRecorder` protocol. Subclasses must override this function to provide 45 | actual log recording functionality. 46 | 47 | - note: This function is only called if one of the `formatters` associated 48 | with the receiver returned a non-`nil` string for the given `LogEntry`. 49 | 50 | - parameter message: The message to record. 51 | 52 | - parameter entry: The `LogEntry` for which `message` was created. 53 | 54 | - parameter currentQueue: The GCD queue on which the function is being 55 | executed. 56 | 57 | - parameter synchronousMode: If `true`, the recording is being done in 58 | synchronous mode, and the recorder should act accordingly. 59 | */ 60 | open func record(message: String, for entry: LogEntry, currentQueue: DispatchQueue, synchronousMode: Bool) 61 | { 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/LogSeverity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogSeverity.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 3/18/15. 6 | // Copyright © 2015 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | Used to indicate the *severity*, or importance, of a log message. 11 | 12 | Severity is a continuum, from `.verbose` being least severe to `.error` being 13 | most severe. 14 | 15 | The logging system may be configured so that messages lower than a given 16 | severity are ignored. 17 | */ 18 | public enum LogSeverity: Int 19 | { 20 | /** The lowest severity, used for detailed or frequently occurring 21 | debugging and diagnostic information. Not intended for use in production 22 | code. */ 23 | case verbose = 1 24 | 25 | /** Used for debugging and diagnostic information. Not intended for use 26 | in production code. */ 27 | case debug = 2 28 | 29 | /** Used to indicate something of interest that is not problematic. */ 30 | case info = 3 31 | 32 | /** Used to indicate that something appears amiss and potentially 33 | problematic. The situation bears looking into before a larger problem 34 | arises. */ 35 | case warning = 4 36 | 37 | /** The highest severity, used to indicate that something has gone wrong; 38 | a fatal error may be imminent. */ 39 | case error = 5 40 | } 41 | 42 | extension LogSeverity: CustomStringConvertible 43 | { 44 | /** Returns a human-readable textual representation of the receiver. */ 45 | public var description: String { 46 | switch self { 47 | case .verbose: return "Verbose" 48 | case .debug: return "Debug" 49 | case .info: return "Info" 50 | case .warning: return "Warning" 51 | case .error: return "Error" 52 | } 53 | } 54 | } 55 | 56 | /// :nodoc: 57 | extension LogSeverity: Comparable {} 58 | 59 | /// :nodoc: 60 | public func <(lhs: LogSeverity, rhs: LogSeverity) -> Bool { 61 | return lhs.rawValue < rhs.rawValue 62 | } 63 | 64 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/OSLogMimicFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OSLogMimicFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/3/17. 6 | // Copyright © 2017 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | internal final class OSLogMimicFormatter: FieldBasedLogFormatter 10 | { 11 | public init() 12 | { 13 | super.init(fields: [.timestamp(.custom("yyyy-MM-dd HH:mm:ss.SSSSSS")), 14 | .literal(" "), 15 | .processName, 16 | .literal("["), 17 | .processID, 18 | .literal(":"), 19 | .callingThread(.integer), 20 | .literal("] [CleanroomLogger] ")]) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/ParsableLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ParsableLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/6/16. 6 | // Copyright © 2016 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` configured to be ideal for writing machine-parsable log files. 11 | 12 | By default, this formatter: 13 | 14 | - Uses `.unix` as the `TimestampStyle` 15 | - Uses `.numeric` as the `SeverityStyle` 16 | - Uses `.hex` as the `CallingThreadStyle` 17 | - Uses `.tab` as the `DelimiterStyle` 18 | - Outputs the source code filename and line number of the call site 19 | 20 | Each of these settings can be overridden during instantiation. 21 | */ 22 | open class ParsableLogFormatter: StandardLogFormatter 23 | { 24 | /** 25 | Initializes a new `ParsableLogFormatter` instance. 26 | 27 | - parameter timestampStyle: Governs the formatting of the timestamp in the 28 | log output. Pass `nil` to suppress output of the timestamp. 29 | 30 | - parameter severityStyle: Governs the formatting of the `LogSeverity` in 31 | the log output. Pass `nil` to suppress output of the severity. 32 | 33 | - parameter callingThreadStyle: If provided, specifies a 34 | `CallingThreadStyle` to use for representing the calling thread. If `nil`, 35 | the calling thread is not shown. 36 | 37 | - parameter delimiterStyle: If provided, overrides the default field 38 | separator delimiters. Pass `nil` to use the default delimiters. 39 | 40 | - parameter showCallSite: If `true`, the source file and line indicating 41 | the call site of the log request will be added to formatted log messages. 42 | */ 43 | public override init(timestampStyle: TimestampStyle? = .unix, severityStyle: SeverityStyle? = .numeric, delimiterStyle: DelimiterStyle? = .tab, callingThreadStyle: CallingThreadStyle? = .hex, showCallSite: Bool = true) 44 | { 45 | super.init(timestampStyle: timestampStyle, severityStyle: severityStyle, delimiterStyle: delimiterStyle, callingThreadStyle: callingThreadStyle, showCallSite: showCallSite) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/PayloadLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PayloadLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/4/16. 6 | // Copyright © 2016 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` that returns a string representation of a `LogEntry`'s 11 | `payload` property. 12 | */ 13 | public struct PayloadLogFormatter: LogFormatter 14 | { 15 | /** The `LogFormatter` used by the receiver when encountering a `LogEntry` 16 | whose `payload` property contains a `.trace` value. */ 17 | public let traceFormatter: LogFormatter 18 | 19 | /** The `LogFormatter` used by the receiver when encountering a `LogEntry` 20 | whose `payload` property contains a `.message` value. */ 21 | public let messageFormatter: LogFormatter 22 | 23 | /** The `LogFormatter` used by the receiver when encountering a `LogEntry` 24 | whose `payload` property contains a `.value` value. */ 25 | public let valueFormatter: LogFormatter 26 | 27 | /** 28 | The initializer. 29 | */ 30 | public init(traceFormatter: LogFormatter = PayloadTraceLogFormatter(), 31 | messageFormatter: LogFormatter = PayloadMessageLogFormatter(), 32 | valueFormatter: LogFormatter = PayloadValueLogFormatter()) 33 | { 34 | self.traceFormatter = traceFormatter 35 | self.messageFormatter = messageFormatter 36 | self.valueFormatter = valueFormatter 37 | } 38 | 39 | /** 40 | Formats the passed-in `LogEntry` by returning a string representation of 41 | its `payload` property. 42 | 43 | - parameter entry: The `LogEntry` to be formatted. 44 | 45 | - returns: The formatted result, or `nil` if formatting was not possible 46 | for the given message. 47 | */ 48 | public func format(_ entry: LogEntry) 49 | -> String? 50 | { 51 | switch entry.payload { 52 | case .trace: return traceFormatter.format(entry) 53 | case .message: return messageFormatter.format(entry) 54 | case .value: return valueFormatter.format(entry) 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/PayloadMessageLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PayloadMessageLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/6/17. 6 | // Copyright © 2017 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` that returns the message content of a `LogEntry` whose 11 | `payload` is a `.message` value. 12 | */ 13 | public struct PayloadMessageLogFormatter: LogFormatter 14 | { 15 | /** 16 | The initializer. 17 | */ 18 | public init() {} 19 | 20 | /** 21 | Formats the passed-in `LogEntry` by returning a string representation of 22 | its `payload` property. 23 | 24 | - parameter entry: The `LogEntry` to be formatted. 25 | 26 | - returns: The message content, or `nil` if `entry` doesn't have a 27 | `payload` with a `.message` value. 28 | */ 29 | public func format(_ entry: LogEntry) 30 | -> String? 31 | { 32 | guard case .message(let content) = entry.payload else { return nil } 33 | 34 | return content 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/PayloadTraceLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PayloadTraceLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/6/17. 6 | // Copyright © 2017 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` that returns the `callingStackFrame` of a `LogEntry` whose 11 | `payload` is `.trace`. 12 | */ 13 | public struct PayloadTraceLogFormatter: LogFormatter 14 | { 15 | /** 16 | The initializer. 17 | */ 18 | public init() {} 19 | 20 | /** 21 | Formats the passed-in `LogEntry` by returning a string representation of 22 | its `payload` property. 23 | 24 | - parameter entry: The `LogEntry` to be formatted. 25 | 26 | - returns: `entry.callingStackFrame`, or `nil` if `entry` doesn't have a 27 | `payload` with a `.trace` value. 28 | */ 29 | public func format(_ entry: LogEntry) 30 | -> String? 31 | { 32 | guard case .trace = entry.payload else { return nil } 33 | 34 | return entry.callingStackFrame 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/PayloadValueLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PayloadValueLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/6/17. 6 | // Copyright © 2017 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` that returns the message content of a `LogEntry` whose 11 | `payload` is a `.value` value. 12 | */ 13 | public struct PayloadValueLogFormatter: LogFormatter 14 | { 15 | /** 16 | The initializer. 17 | */ 18 | public init() {} 19 | 20 | /** 21 | Formats the passed-in `LogEntry` by returning a string representation of 22 | its `payload` property. 23 | 24 | - parameter entry: The `LogEntry` to be formatted. 25 | 26 | - returns: The message content, or `nil` if `entry` doesn't have a 27 | `payload` with a `.value` value. 28 | */ 29 | public func format(_ entry: LogEntry) 30 | -> String? 31 | { 32 | guard case .value(let v) = entry.payload else { return nil } 33 | 34 | guard let value = v else { 35 | return "= nil" 36 | } 37 | 38 | var pieces = [String]() 39 | pieces.append("= ") 40 | pieces.append(String(describing: type(of: value))) 41 | pieces.append(": ") 42 | if let custom = value as? CustomDebugStringConvertible { 43 | pieces.append(custom.debugDescription) 44 | } 45 | else if let custom = value as? CustomStringConvertible { 46 | pieces.append(custom.description) 47 | } 48 | else { 49 | pieces.append(String(describing: value)) 50 | } 51 | 52 | return pieces.joined() 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/ProcessIDLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProcessIDLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/3/17. 6 | // Copyright © 2017 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` that returns the string representation of a `LogEntry`'s 11 | `processID` property. 12 | 13 | This is typically combined with other `LogFormatter`s within a 14 | `ConcatenatingLogFormatter`. 15 | */ 16 | public struct ProcessIDLogFormatter: LogFormatter 17 | { 18 | /** The initializer. */ 19 | public init() {} 20 | 21 | /** 22 | Formats the passed-in `LogEntry` by returning a string representation of 23 | its `processID` property. 24 | 25 | - parameter entry: The `LogEntry` to be formatted. 26 | 27 | - returns: The formatted result; never `nil`. 28 | */ 29 | public func format(_ entry: LogEntry) 30 | -> String? 31 | { 32 | return String(describing: entry.processID) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/ProcessNameLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProcessNameLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/3/17. 6 | // Copyright © 2017 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` that returns a `LogEntry`'s `processName` property. 11 | 12 | This is typically combined with other `LogFormatter`s within a 13 | `ConcatenatingLogFormatter`. 14 | */ 15 | public struct ProcessNameLogFormatter: LogFormatter 16 | { 17 | /** The initializer. */ 18 | public init() {} 19 | 20 | /** 21 | Formats the passed-in `LogEntry` by returning its `processName` property. 22 | 23 | - parameter entry: The `LogEntry` to be formatted. 24 | 25 | - returns: The formatted result; never `nil`. 26 | */ 27 | public func format(_ entry: LogEntry) 28 | -> String? 29 | { 30 | return entry.processName 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/ReadableLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ReadableLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/6/16. 6 | // Copyright © 2016 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` configured to be ideal for writing human-readable log files. 11 | 12 | By default, this formatter: 13 | 14 | - Uses `.default` as the `TimestampStyle` 15 | - Uses a custom `SeverityStyle` that pads the capitalized severity name 16 | - Uses `.hex` as the `CallingThreadStyle` 17 | - Uses default field separator delimiters 18 | - Outputs the source code filename and line number of the call site 19 | 20 | Each of these settings can be overridden during instantiation. 21 | */ 22 | open class ReadableLogFormatter: StandardLogFormatter 23 | { 24 | /** 25 | Initializes a new `ReadableLogFormatter` instance. 26 | 27 | - parameter timestampStyle: Governs the formatting of the timestamp in the 28 | log output. Pass `nil` to suppress output of the timestamp. 29 | 30 | - parameter severityStyle: Governs the formatting of the `LogSeverity` in 31 | the log output. Pass `nil` to suppress output of the severity. 32 | 33 | - parameter delimiterStyle: If provided, overrides the default field 34 | separator delimiters. Pass `nil` to use the default delimiters. 35 | 36 | - parameter callingThreadStyle: If provided, specifies a 37 | `CallingThreadStyle` to use for representing the calling thread. If `nil`, 38 | the calling thread is not shown. 39 | 40 | - parameter showCallSite: If `true`, the source file and line indicating 41 | the call site of the log request will be added to formatted log messages. 42 | */ 43 | public override init(timestampStyle: TimestampStyle? = .default, severityStyle: SeverityStyle? = .custom(textRepresentation: .capitalized, truncateAtWidth: 7, padToWidth: 7, rightAlign: false), delimiterStyle: DelimiterStyle? = nil, callingThreadStyle: CallingThreadStyle? = .hex, showCallSite: Bool = true) 44 | { 45 | super.init(timestampStyle: timestampStyle, severityStyle: severityStyle, delimiterStyle: delimiterStyle, callingThreadStyle: callingThreadStyle, showCallSite: showCallSite) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/StackFrameLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StackFrameLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/4/16. 6 | // Copyright © 2016 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` that returns the `callingStackFrame` property of a `LogEntry`. 11 | 12 | This is typically combined with other `LogFormatter`s within a 13 | `ConcatenatingLogFormatter`. 14 | */ 15 | public struct StackFrameLogFormatter: LogFormatter 16 | { 17 | /** The initializer. */ 18 | public init() {} 19 | 20 | /** 21 | Formats the passed-in `LogEntry` by returning the value of its 22 | `callingStackFrame` property. 23 | 24 | - parameter entry: The `LogEntry` to be formatted. 25 | 26 | - returns: The formatted result; never `nil`. 27 | */ 28 | public func format(_ entry: LogEntry) 29 | -> String? 30 | { 31 | return entry.callingStackFrame 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/StandardErrorLogRecorder.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StandardErrorLogRecorder.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/4/17. 6 | // Copyright © 2017 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | import Darwin.C.stdio 10 | import Dispatch 11 | 12 | /** 13 | The `StandardErrorLogRecorder` is an `OutputStreamLogRecorder` that writes 14 | log messages to the standard error stream ("`stderr`") of the running 15 | process. 16 | */ 17 | open class StandardErrorLogRecorder: OutputStreamLogRecorder 18 | { 19 | /** 20 | Initializes a `StandardErrorLogRecorder` instance to use the specified 21 | `LogFormatter`s for formatting log messages. 22 | 23 | - parameter queue: The `DispatchQueue` to use for the recorder. If `nil`, 24 | a new queue will be created. 25 | */ 26 | public init(formatters: [LogFormatter], queue: DispatchQueue? = nil) 27 | { 28 | super.init(stream: stderr, formatters: formatters, queue: queue) 29 | } 30 | } 31 | 32 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/StandardOutputLogRecorder.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StandardOutputLogRecorder.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 12/30/15. 6 | // Copyright © 2015 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | import Darwin.C.stdio 10 | import Dispatch 11 | 12 | /** 13 | The `StandardOutputLogRecorder` is an `OutputStreamLogRecorder` that writes 14 | log messages to the standard output stream ("`stdout`") of the running 15 | process. 16 | */ 17 | open class StandardOutputLogRecorder: OutputStreamLogRecorder 18 | { 19 | /** 20 | Initializes a `StandardOutputLogRecorder` instance to use the specified 21 | `LogFormatter`s for formatting log messages. 22 | 23 | - parameter formatters: An array of `LogFormatter`s to use for formatting 24 | log entries that will be recorded by the receiver. 25 | 26 | - parameter queue: The `DispatchQueue` to use for the recorder. If `nil`, 27 | a new queue will be created. 28 | */ 29 | public init(formatters: [LogFormatter], queue: DispatchQueue? = nil) 30 | { 31 | super.init(stream: stdout, formatters: formatters, queue: queue) 32 | } 33 | } 34 | 35 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/XcodeLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // XcodeLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/4/16. 6 | // Copyright © 2016 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` ideal for use within Xcode. This format is not well-suited 11 | for parsing. 12 | */ 13 | public final class XcodeLogFormatter: LogFormatter 14 | { 15 | private let traceFormatter: XcodeTraceLogFormatter 16 | private let defaultFormatter: FieldBasedLogFormatter 17 | 18 | /** 19 | Initializes a new `XcodeLogFormatter` instance. 20 | 21 | - parameter showCallSite: If `true`, the source file and line indicating 22 | the call site of the log request will be added to formatted log messages. 23 | */ 24 | public init(showCallSite: Bool = true) 25 | { 26 | traceFormatter = XcodeTraceLogFormatter() 27 | 28 | var fields: [FieldBasedLogFormatter.Field] = [] 29 | fields.append(.severity(.xcode)) 30 | fields.append(.delimiter(.space)) 31 | fields.append(.payload) 32 | if showCallSite { 33 | fields.append(.literal(" (")) 34 | fields.append(.callSite) 35 | fields.append(.literal(")")) 36 | } 37 | 38 | defaultFormatter = FieldBasedLogFormatter(fields: fields) 39 | } 40 | 41 | /** 42 | Called to create a string representation of the passed-in `LogEntry`. 43 | 44 | - parameter entry: The `LogEntry` to attempt to convert into a string. 45 | 46 | - returns: A `String` representation of `entry`, or `nil` if the 47 | receiver could not format the `LogEntry`. 48 | */ 49 | open func format(_ entry: LogEntry) -> String? 50 | { 51 | return traceFormatter.format(entry) ?? defaultFormatter.format(entry) 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Sources/XcodeTraceLogFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // XcodeTraceLogFormatter.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 1/3/17. 6 | // Copyright © 2017 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | /** 10 | A `LogFormatter` that outputs Xcode-bound trace information for each 11 | `LogEntry` that has a `Payload` of `.trace`. 12 | */ 13 | public final class XcodeTraceLogFormatter: FieldBasedLogFormatter 14 | { 15 | /** 16 | Initalizes a new `XcodeTraceLogFormatter` instance. 17 | */ 18 | public init() 19 | { 20 | super.init(fields: [.severity(.xcode), 21 | .literal(" —> "), 22 | .callSite, 23 | .delimiter(.spacedHyphen), 24 | .payload]) 25 | } 26 | 27 | /** 28 | Called to create a string representation of the passed-in `LogEntry`. 29 | 30 | - parameter entry: The `LogEntry` to attempt to convert into a string. 31 | 32 | - returns: A `String` representation of `entry`, or `nil` if the 33 | receiver could not format the `LogEntry`. 34 | */ 35 | open override func format(_ entry: LogEntry) 36 | -> String? 37 | { 38 | guard case .trace = entry.payload else { 39 | // we are only to be used for outputting trace information 40 | return nil 41 | } 42 | 43 | return super.format(entry) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Tests/CleanroomLoggerTests/KeyedMessageBufferExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeyedMessageBufferExtension.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 2/17/17. 6 | // Copyright © 2017 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | import CleanroomLogger 10 | 11 | extension BufferedLogEntryMessageRecorder 12 | { 13 | internal func keyedMessageBuffer() 14 | -> [String: LogEntry] 15 | { 16 | var keyedBuffer = [String: LogEntry]() 17 | for (log, _) in buffer { 18 | if case .message(let msg) = log.payload { 19 | keyedBuffer[msg] = log 20 | } 21 | } 22 | return keyedBuffer 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Tests/CleanroomLoggerTests/LogSeverityComparisonTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogSeverityComparisonTests.swift 3 | // Cleanroom Project 4 | // 5 | // Created by Claudio Romandini on 5/19/15. 6 | // Copyright © 2015 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import CleanroomLogger 11 | 12 | class LogSeverityTests: XCTestCase 13 | { 14 | func testLogSeverityEquality() 15 | { 16 | XCTAssertTrue(LogSeverity.debug == LogSeverity.debug, "Debug should be equal to itself.") 17 | XCTAssertTrue(LogSeverity.info != LogSeverity.warning, "Info should be not equal to Warning.") 18 | } 19 | 20 | func testLogSeverityComparableImplementation() 21 | { 22 | XCTAssertTrue(LogSeverity.verbose < LogSeverity.debug, "Verbose should be less than Debug.") 23 | XCTAssertTrue(LogSeverity.info >= LogSeverity.debug, "Info should be greater than or equal to Debug.") 24 | XCTAssertTrue(LogSeverity.warning > LogSeverity.info, "Warning should be greater than Info.") 25 | XCTAssertTrue(LogSeverity.warning <= LogSeverity.error, "Warning should be less than or equal to Error.") 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Carthage/Checkouts/CleanroomLogger/Tests/CleanroomLoggerTests/LoggerTestCase.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoggerTestCase.swift 3 | // CleanroomLogger 4 | // 5 | // Created by Evan Maloney on 2/17/17. 6 | // Copyright © 2017 Gilt Groupe. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import CleanroomLogger 11 | 12 | fileprivate let _xcodeConfig = XcodeLogConfiguration(debugMode: true, verboseDebugMode: true, stdStreamsMode: .useExclusively) 13 | fileprivate let _recorder = BufferedLogEntryMessageRecorder(formatters: _xcodeConfig.recorders.first!.formatters) 14 | fileprivate let _bufferConfig = BasicLogConfiguration(minimumSeverity: .verbose, recorders: [_recorder], synchronousMode: true) 15 | 16 | /** 17 | The `LoggerTestCase` should be used for any test that relies on 18 | CleanroomLogger being enabled and configured properly. 19 | */ 20 | class LoggerTestCase: XCTestCase 21 | { 22 | var recorder: BufferedLogEntryMessageRecorder { 23 | return _recorder 24 | } 25 | 26 | override func setUp() 27 | { 28 | Log.enable(configuration: [_xcodeConfig, _bufferConfig]) 29 | 30 | super.setUp() 31 | } 32 | 33 | override func tearDown() 34 | { 35 | // clear out the buffer before the next test run 36 | recorder.clear() 37 | 38 | super.tearDown() 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = tab 5 | end_of_line = lf 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/.gitignore: -------------------------------------------------------------------------------- 1 | xcuserdata 2 | project.xcworkspace 3 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/Carthage/Build: -------------------------------------------------------------------------------- 1 | ../../../../Carthage/Build -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'LaunchAtLogin' 3 | s.version = '2.4.0' 4 | s.summary = 'Add "Launch at Login" functionality to your sandboxed macOS app in seconds' 5 | s.license = 'MIT' 6 | s.homepage = 'https://github.com/sindresorhus/LaunchAtLogin' 7 | s.social_media_url = 'https://twitter.com/sindresorhus' 8 | s.authors = { 'Sindre Sorhus' => 'sindresorhus@gmail.com' } 9 | s.source = { :git => 'https://github.com/sindresorhus/LaunchAtLogin.git', :tag => "v#{s.version}" } 10 | s.source_files = 'LaunchAtLogin', 'LaunchAtLoginHelper' 11 | s.resource = 'LaunchAtLogin/copy-helper.sh' 12 | s.swift_version = '4.2' 13 | s.platform = :macos, '10.12' 14 | end 15 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleExecutable 6 | $(EXECUTABLE_NAME) 7 | CFBundleIdentifier 8 | $(PRODUCT_BUNDLE_IDENTIFIER) 9 | CFBundleInfoDictionaryVersion 10 | 6.0 11 | CFBundleName 12 | $(PRODUCT_NAME) 13 | CFBundlePackageType 14 | FMWK 15 | CFBundleShortVersionString 16 | 2.4.0 17 | CFBundleVersion 18 | $(CURRENT_PROJECT_VERSION) 19 | NSHumanReadableCopyright 20 | MIT © Sindre Sorhus 21 | 22 | 23 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin/LaunchAtLogin.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | FOUNDATION_EXPORT double LaunchAtLoginVersionNumber; 4 | FOUNDATION_EXPORT const unsigned char LaunchAtLoginVersionString[]; 5 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin/LaunchAtLogin.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import ServiceManagement 3 | 4 | public struct LaunchAtLogin { 5 | private static let id = "\(Bundle.main.bundleIdentifier!)-LaunchAtLoginHelper" 6 | 7 | public static var isEnabled: Bool { 8 | get { 9 | guard let jobs = (SMCopyAllJobDictionaries(kSMDomainUserLaunchd).takeRetainedValue() as? [[String: AnyObject]]) else { 10 | return false 11 | } 12 | let job = jobs.first { $0["Label"] as! String == id } 13 | return job?["OnDemand"] as? Bool ?? false 14 | } 15 | set { 16 | SMLoginItemSetEnabled(id as CFString, newValue) 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/LaunchAtLogin/copy-helper.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | origin_helper_path="$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/LaunchAtLogin.framework/Resources/LaunchAtLoginHelper.app" 4 | helper_dir="$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Library/LoginItems" 5 | helper_path="$helper_dir/LaunchAtLoginHelper.app" 6 | 7 | rm -rf "$helper_path" 8 | mkdir -p "$helper_dir" 9 | cp -rf "$origin_helper_path" "$helper_dir/" 10 | 11 | defaults write "$helper_path/Contents/Info" CFBundleIdentifier -string "$PRODUCT_BUNDLE_IDENTIFIER-LaunchAtLoginHelper" 12 | codesign --force --entitlements="$CODE_SIGN_ENTITLEMENTS" --sign="$EXPANDED_CODE_SIGN_IDENTITY_NAME" "$helper_path" 13 | 14 | if [[ $CONFIGURATION == "Release" ]]; then 15 | rm -rf "$origin_helper_path" 16 | rm "$(dirname "$origin_helper_path")/copy-helper.sh" 17 | fi 18 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/LaunchAtLoginHelper/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleExecutable 6 | $(EXECUTABLE_NAME) 7 | CFBundleIdentifier 8 | $(PRODUCT_BUNDLE_IDENTIFIER) 9 | CFBundleInfoDictionaryVersion 10 | 6.0 11 | CFBundleName 12 | $(PRODUCT_NAME) 13 | CFBundlePackageType 14 | APPL 15 | CFBundleShortVersionString 16 | 1.0.0 17 | CFBundleVersion 18 | 1 19 | LSMinimumSystemVersion 20 | $(MACOSX_DEPLOYMENT_TARGET) 21 | NSHumanReadableCopyright 22 | MIT © Sindre Sorhus 23 | LSBackgroundOnly 24 | 25 | NSPrincipalClass 26 | NSApplication 27 | 28 | 29 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/LaunchAtLoginHelper/LaunchAtLoginHelper.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/LaunchAtLoginHelper/main.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | final class AppDelegate: NSObject, NSApplicationDelegate { 4 | func applicationDidFinishLaunching(_ notification: Notification) { 5 | let bundleId = Bundle.main.bundleIdentifier! 6 | // TODO: Make this more strict by only replacing at the end 7 | let mainBundleId = bundleId.replacingOccurrences(of: "-LaunchAtLoginHelper", with: "") 8 | 9 | // Ensure the app is not already running 10 | guard NSRunningApplication.runningApplications(withBundleIdentifier: mainBundleId).isEmpty else { 11 | NSApp.terminate(nil) 12 | return 13 | } 14 | 15 | let pathComponents = (Bundle.main.bundlePath as NSString).pathComponents 16 | let mainPath = NSString.path(withComponents: Array(pathComponents[0...(pathComponents.count - 5)])) 17 | NSWorkspace.shared.launchApplication(mainPath) 18 | NSApp.terminate(nil) 19 | } 20 | } 21 | 22 | private let app = NSApplication.shared 23 | private let delegate = AppDelegate() 24 | app.delegate = delegate 25 | app.run() 26 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/before-after.md: -------------------------------------------------------------------------------- 1 | # Before and after 2 | 3 | With `LaunchAtLogin`, you only have to do 2 steps instead of 13! 4 | 5 | ```diff 6 | - 1. Create a new target that will be the helper app that launches your app 7 | - 2. Set `LSBackgroundOnly` to true in the `Info.plist` file 8 | - 3. Set `Skip Install` to `YES` in the build settings for the helper app 9 | - 4. Enable sandboxing for the helper app 10 | - 5. Add a new `Copy Files` build phase to the main app 11 | - 6. Select `Wrapper` as destination 12 | - 7. Enter `Contents/Library/LoginItems` as subpath 13 | - 8. Add the helper build product to the build phase 14 | - 9. Copy-paste some boilerplate code into the helper app 15 | - 10. Remember to replace `bundleid.of.main.app` and `MainExectuableName` with your own values 16 | - 11. Copy-paste some code to register the helper app into your main app 17 | - 12. Make sure the main app and helper app use the same code signing certificate 18 | - 13. Manually verify that you did everything correctly 19 | + 1. Install this package 20 | + 2. Add a new "Run Script Phase" 21 | ``` 22 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/license: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Sindre Sorhus (sindresorhus.com) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /Carthage/Checkouts/LaunchAtLogin/readme.md: -------------------------------------------------------------------------------- 1 | # LaunchAtLogin 2 | 3 | > Add "Launch at Login" functionality to your sandboxed macOS app in seconds 4 | 5 | It's usually quite a [convoluted and error-prone process](before-after.md) to add this. **No more!** 6 | 7 | It's App Store compatible and used in my [Lungo](https://blog.sindresorhus.com/lungo-b364a6c2745f) and [Battery Indicator](https://sindresorhus.com/battery-indicator) app. 8 | 9 | You might also find my [`create-dmg`](https://github.com/sindresorhus/create-dmg) project useful. 10 | 11 | 12 | ## Requirements 13 | 14 | - macOS 10.12+ 15 | - Xcode 10+ 16 | - Swift 4.2+ 17 | 18 | 19 | ## Install 20 | 21 | #### Carthage 22 | 23 | ``` 24 | github "sindresorhus/LaunchAtLogin" 25 | ``` 26 | 27 | #### CocoaPods 28 | 29 | ```ruby 30 | pod 'LaunchAtLogin' 31 | ``` 32 | 33 | 34 | 35 | 36 | 37 | 38 | ## Usage 39 | 40 | Add a new ["Run Script Phase"](http://stackoverflow.com/a/39633955/64949) below "Embed Frameworks" in "Build Phases" with the following: 41 | 42 | Carthage: 43 | 44 | ```sh 45 | ./Carthage/Build/Mac/LaunchAtLogin.framework/Resources/copy-helper.sh 46 | ``` 47 | 48 | CocoaPods: 49 | 50 | ```sh 51 | ./Pods/LaunchAtLogin/LaunchAtLogin/copy-helper.sh 52 | ``` 53 | 54 | Use it in your app: 55 | 56 | ```swift 57 | import LaunchAtLogin 58 | 59 | print(LaunchAtLogin.isEnabled) 60 | //=> false 61 | 62 | LaunchAtLogin.isEnabled = true 63 | 64 | print(LaunchAtLogin.isEnabled) 65 | //=> true 66 | ``` 67 | 68 | *Note that the [Mac App Store guidelines](https://developer.apple.com/app-store/review/guidelines/) requires "launch at login" functionality to be enabled in response to a user action. This is usually solved by making it a preference that is disabled by default.* 69 | 70 | 71 | ## How does it work? 72 | 73 | The framework bundles the helper app needed to launch your app and copies it into your app at build time. 74 | 75 | 76 | ## Related 77 | 78 | - [Defaults](https://github.com/sindresorhus/Defaults) - Swifty and modern UserDefaults 79 | - [Preferences](https://github.com/sindresorhus/Preferences) - Add a preferences window to your macOS app in minutes 80 | - [DockProgress](https://github.com/sindresorhus/DockProgress) - Show progress in your app's Dock icon 81 | - [More…](https://github.com/search?q=user%3Asindresorhus+language%3Aswift) 82 | 83 | 84 | ## License 85 | 86 | MIT © [Sindre Sorhus](https://sindresorhus.com) 87 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | build/* 3 | *.pbxuser 4 | !default.pbxuser 5 | *.mode1v3 6 | !default.mode1v3 7 | *.mode2v3 8 | !default.mode2v3 9 | *.perspectivev3 10 | !default.perspectivev3 11 | *.xcworkspace 12 | !default.xcworkspace 13 | xcuserdata 14 | profile 15 | *.moved-aside 16 | # Finder 17 | .DS_Store -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | xcode_project: MASShortcut.xcodeproj 3 | xcode_scheme: MASShortcut 4 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/CHANGES: -------------------------------------------------------------------------------- 1 | 2.3.6 2016/10/30 2 | - Improve compatibility with the 10.12 SDK [thanks to Clemens Schulz] 3 | 4 | 2.3.5 2016/9/7 5 | - Improve Italian localization [zoul] 6 | 7 | 2.3.4 2016/8/12 8 | - Simplified and traditional Chinese localization [MichaelRow] 9 | - Add Korean, Dutch, Polish, Russian & update Spanish localizations [Radek Pietruszewski] 10 | - Improved German localization [Florian Schliep] 11 | – Add a Makefile to improve command-line building [sfsam] 12 | 13 | 2.3.3 2016/1/9 14 | - Improved Japanese localization [oreshinya] 15 | - Improved Frech localization [magiclantern] 16 | - Fixed CocoaPods localization with use_frameworks! [nivanchikov] 17 | 18 | 2.3.2 2015/10/12 19 | - Fixed localization when building through CocoaPods [Allan Beaufour] 20 | 21 | 2.3.1 2015/9/10 22 | - Trying to work around a strange build error in CocoaPods. 23 | 24 | 2.3.0 2015/9/10 25 | - Basic localization support for Czech, German, Spanish, 26 | Italian, French, and Japanese. Native speaking testers welcome! 27 | 28 | 2.2.0 2015/8/18 29 | - Basic accessibility support [starkos] 30 | - Added an option to hide the shortcut delete button [oreshinya] 31 | - Advertised support for Carthage [Tom Brown] 32 | - Bugfix for shortcuts not working after set twice [Roman Sokolov] 33 | - Ignore a solo Tab key when recording shortcuts [Roman Sokolov] 34 | 35 | 2.1.2 2015/1/28 36 | - Better key equivalent handling for non-ASCII layouts. 37 | [Dmitry Obukhov] 38 | 39 | 2.1.1 2015/1/16 40 | - Another headerdoc fix for CocoaDocs, hopefully the last one. 41 | 42 | 2.1.0 2015/1/16 43 | - Added support for older OS X versions down to 10.6 included. 44 | - Headerdoc markup that plays better with CocoaDocs. 45 | 46 | 2.0.1 2015/1/9 47 | - Trivial Podspec fix. 48 | 49 | 2.0.0 2015/1/9 50 | - First version with a changes file :) 51 | - Major, backwards incompatible refactoring to simplify long-term maintenance. 52 | - Added a simple spec describing the recording behaviour. 53 | - Adds compatibility mode with Shortcut Recorder. 54 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Backward Compatibility 2 | 3 | Please note that this framework supports older OS X versions down to 10.6. When changing the code, be careful not to call any API functions not available in 10.6 or call them conditionally, only where supported. 4 | 5 | # Commit Messages 6 | 7 | Please use descriptive commit message. As an example, _Bug fix_ commit message doesn’t say much, while _Fix a memory-management bug in formatting code_ works much better. A [nice detailed article about writing commit messages](http://chris.beams.io/posts/git-commit/) is also available. 8 | 9 | # How to Release a New Version 10 | 11 | First, update the version numbers. (MASShortcut uses [Semantic Versioning](http://semver.org/), so please read the docs if you’re not sure what the deal is.) The version number is stored in `Framework/Info.plist` and `MASShortcut.podspec` (twice in both files). 12 | 13 | Then update the `CHANGES` file. Add information about the new version (see the previous versions for an example) and add the release date. 14 | 15 | Now commit the changes: 16 | 17 | $ git commit -a -m "Version bump to x.y.z." 18 | 19 | And tag the last commit: 20 | 21 | $ git tag -a x.y.z 22 | 23 | Now push both the commits and tags (`--tags`) to GitHub and push the new podspec to CocoaPods: 24 | 25 | $ pod trunk push MASShortcut.podspec 26 | 27 | This will run sanity checks on the podspec and fail if the spec does not validate. 28 | 29 | That’s it. Go have a beer or a cup of tea to celebrate. 30 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Demo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | @interface AppDelegate : NSObject 2 | 3 | @property (nonatomic, assign) IBOutlet NSWindow *window; 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Demo/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 | CFBundleVersion 20 | 1 21 | LSMinimumSystemVersion 22 | ${MACOSX_DEPLOYMENT_TARGET} 23 | NSHumanReadableCopyright 24 | Copyright © 2012–2015 Vadim Shpakovski. All rights reserved. 25 | NSMainNibFile 26 | MainMenu 27 | NSPrincipalClass 28 | NSApplication 29 | 30 | 31 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Demo/Prefix.pch: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Demo/cs.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Feedback that’s displayed when user presses the sample shortcut. */ 2 | "Shortcut pressed!" = "Funguje!"; 3 | 4 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Demo/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Feedback that’s displayed when user presses the sample shortcut. */ 2 | "Shortcut pressed!" = "Kurzbefehl gedrückt!"; 3 | 4 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Demo/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Feedback that’s displayed when user presses the sample shortcut. */ 2 | "Shortcut pressed!" = "Shortcut pressed!"; 3 | 4 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Demo/ja.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Feedback that’s displayed when user presses the sample shortcut. */ 2 | "Shortcut pressed!" = "ショートカットが押されました!"; 3 | 4 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Demo/main.m: -------------------------------------------------------------------------------- 1 | int main(int argc, char *argv[]) 2 | { 3 | return NSApplicationMain(argc, (const char **)argv); 4 | } 5 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Demo/pt.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Feedback that’s displayed when user presses the sample shortcut. */ 2 | "Shortcut pressed!" = "Atalho pressionado!"; 3 | 4 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Demo/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Carthage/Checkouts/MASShortcut/Demo/screenshot.png -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 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 | 2.3.6 19 | CFBundleVersion 20 | 2.3.6 21 | NSHumanReadableCopyright 22 | Copyright © Vadim Shpakovski. All rights reserved. 23 | 24 | 25 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASDictionaryTransformer.h: -------------------------------------------------------------------------------- 1 | extern NSString *const MASDictionaryTransformerName; 2 | 3 | /** 4 | Converts shortcuts for storage in user defaults. 5 | 6 | User defaults can’t stored custom types directly, they have to 7 | be serialized to `NSData` or some other supported type like an 8 | `NSDictionary`. In Cocoa Bindings, the conversion can be done 9 | using value transformers like this one. 10 | 11 | There’s a built-in transformer (`NSKeyedUnarchiveFromDataTransformerName`) 12 | that converts any `NSCoding` types to `NSData`, but with shortcuts 13 | it makes sense to use a dictionary instead – the defaults look better 14 | when inspected with the `defaults` command-line utility and the 15 | format is compatible with an older sortcut library called Shortcut 16 | Recorder. 17 | */ 18 | @interface MASDictionaryTransformer : NSValueTransformer 19 | @end 20 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASDictionaryTransformer.m: -------------------------------------------------------------------------------- 1 | #import "MASDictionaryTransformer.h" 2 | #import "MASShortcut.h" 3 | 4 | NSString *const MASDictionaryTransformerName = @"MASDictionaryTransformer"; 5 | 6 | static NSString *const MASKeyCodeKey = @"keyCode"; 7 | static NSString *const MASModifierFlagsKey = @"modifierFlags"; 8 | 9 | @implementation MASDictionaryTransformer 10 | 11 | + (BOOL) allowsReverseTransformation 12 | { 13 | return YES; 14 | } 15 | 16 | // Storing nil values as an empty dictionary lets us differ between 17 | // “not available, use default value” and “explicitly set to none”. 18 | // See http://stackoverflow.com/questions/5540760 for details. 19 | - (NSDictionary*) reverseTransformedValue: (MASShortcut*) shortcut 20 | { 21 | if (shortcut == nil) { 22 | return [NSDictionary dictionary]; 23 | } else { 24 | return @{ 25 | MASKeyCodeKey: @([shortcut keyCode]), 26 | MASModifierFlagsKey: @([shortcut modifierFlags]) 27 | }; 28 | } 29 | } 30 | 31 | - (MASShortcut*) transformedValue: (NSDictionary*) dictionary 32 | { 33 | // We have to be defensive here as the value may come from user defaults. 34 | if (![dictionary isKindOfClass:[NSDictionary class]]) { 35 | return nil; 36 | } 37 | 38 | id keyCodeBox = [dictionary objectForKey:MASKeyCodeKey]; 39 | id modifierFlagsBox = [dictionary objectForKey:MASModifierFlagsKey]; 40 | 41 | SEL integerValue = @selector(integerValue); 42 | if (![keyCodeBox respondsToSelector:integerValue] || ![modifierFlagsBox respondsToSelector:integerValue]) { 43 | return nil; 44 | } 45 | 46 | return [MASShortcut 47 | shortcutWithKeyCode:[keyCodeBox integerValue] 48 | modifierFlags:[modifierFlagsBox integerValue]]; 49 | } 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASDictionaryTransformerTests.m: -------------------------------------------------------------------------------- 1 | @interface MASDictionaryTransformerTests : XCTestCase 2 | @end 3 | 4 | @implementation MASDictionaryTransformerTests 5 | 6 | - (void) testErrorHandling 7 | { 8 | MASDictionaryTransformer *transformer = [MASDictionaryTransformer new]; 9 | XCTAssertNil([transformer transformedValue:nil], 10 | @"Decoding a shortcut from a nil dictionary returns nil."); 11 | XCTAssertNil([transformer transformedValue:(id)@"foo"], 12 | @"Decoding a shortcut from a invalid-type dictionary returns nil."); 13 | XCTAssertNil([transformer transformedValue:@{}], 14 | @"Decoding a shortcut from an empty dictionary returns nil."); 15 | XCTAssertNil([transformer transformedValue:@{@"keyCode":@"foo"}], 16 | @"Decoding a shortcut from a wrong-typed dictionary returns nil."); 17 | XCTAssertNil([transformer transformedValue:@{@"keyCode":@1}], 18 | @"Decoding a shortcut from an incomplete dictionary returns nil."); 19 | XCTAssertNil([transformer transformedValue:@{@"modifierFlags":@1}], 20 | @"Decoding a shortcut from an incomplete dictionary returns nil."); 21 | } 22 | 23 | - (void) testNilRepresentation 24 | { 25 | MASDictionaryTransformer *transformer = [MASDictionaryTransformer new]; 26 | XCTAssertEqualObjects([transformer reverseTransformedValue:nil], [NSDictionary dictionary], 27 | @"Store nil values as an empty dictionary."); 28 | XCTAssertNil([transformer transformedValue:[NSDictionary dictionary]], 29 | @"Load empty dictionary as nil."); 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASHotKey.h: -------------------------------------------------------------------------------- 1 | #import "MASShortcut.h" 2 | 3 | extern FourCharCode const MASHotKeySignature; 4 | 5 | @interface MASHotKey : NSObject 6 | 7 | @property(readonly) UInt32 carbonID; 8 | @property(copy) dispatch_block_t action; 9 | 10 | + (instancetype) registeredHotKeyWithShortcut: (MASShortcut*) shortcut; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASHotKey.m: -------------------------------------------------------------------------------- 1 | #import "MASHotKey.h" 2 | 3 | FourCharCode const MASHotKeySignature = 'MASS'; 4 | 5 | @interface MASHotKey () 6 | @property(assign) EventHotKeyRef hotKeyRef; 7 | @property(assign) UInt32 carbonID; 8 | @end 9 | 10 | @implementation MASHotKey 11 | 12 | - (instancetype) initWithShortcut: (MASShortcut*) shortcut 13 | { 14 | self = [super init]; 15 | 16 | static UInt32 CarbonHotKeyID = 0; 17 | 18 | _carbonID = ++CarbonHotKeyID; 19 | EventHotKeyID hotKeyID = { .signature = MASHotKeySignature, .id = _carbonID }; 20 | 21 | OSStatus status = RegisterEventHotKey([shortcut carbonKeyCode], [shortcut carbonFlags], 22 | hotKeyID, GetEventDispatcherTarget(), 0, &_hotKeyRef); 23 | 24 | if (status != noErr) { 25 | return nil; 26 | } 27 | 28 | return self; 29 | } 30 | 31 | + (instancetype) registeredHotKeyWithShortcut: (MASShortcut*) shortcut 32 | { 33 | return [[self alloc] initWithShortcut:shortcut]; 34 | } 35 | 36 | - (void) dealloc 37 | { 38 | if (_hotKeyRef) { 39 | UnregisterEventHotKey(_hotKeyRef); 40 | _hotKeyRef = NULL; 41 | } 42 | } 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASHotKeyTests.m: -------------------------------------------------------------------------------- 1 | #import "MASHotKey.h" 2 | 3 | @interface MASHotKeyTests : XCTestCase 4 | @end 5 | 6 | @implementation MASHotKeyTests 7 | 8 | - (void) testBasicFunctionality 9 | { 10 | MASHotKey *hotKey = [MASHotKey registeredHotKeyWithShortcut: 11 | [MASShortcut shortcutWithKeyCode:kVK_ANSI_H modifierFlags:NSCommandKeyMask|NSAlternateKeyMask]]; 12 | XCTAssertNotNil(hotKey, @"Register a simple Cmd-Alt-H hotkey."); 13 | } 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASKeyCodes.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "MASKeyMasks.h" 4 | 5 | // These glyphs are missed in Carbon.h 6 | typedef NS_ENUM(unsigned short, kMASShortcutGlyph) { 7 | kMASShortcutGlyphEject = 0x23CF, 8 | kMASShortcutGlyphClear = 0x2715, 9 | kMASShortcutGlyphDeleteLeft = 0x232B, 10 | kMASShortcutGlyphDeleteRight = 0x2326, 11 | kMASShortcutGlyphLeftArrow = 0x2190, 12 | kMASShortcutGlyphRightArrow = 0x2192, 13 | kMASShortcutGlyphUpArrow = 0x2191, 14 | kMASShortcutGlyphDownArrow = 0x2193, 15 | kMASShortcutGlyphEscape = 0x238B, 16 | kMASShortcutGlyphHelp = 0x003F, 17 | kMASShortcutGlyphPageDown = 0x21DF, 18 | kMASShortcutGlyphPageUp = 0x21DE, 19 | kMASShortcutGlyphTabRight = 0x21E5, 20 | kMASShortcutGlyphReturn = 0x2305, 21 | kMASShortcutGlyphReturnR2L = 0x21A9, 22 | kMASShortcutGlyphPadClear = 0x2327, 23 | kMASShortcutGlyphNorthwestArrow = 0x2196, 24 | kMASShortcutGlyphSoutheastArrow = 0x2198, 25 | }; 26 | 27 | NS_INLINE NSString* NSStringFromMASKeyCode(unsigned short ch) 28 | { 29 | return [NSString stringWithFormat:@"%C", ch]; 30 | } 31 | 32 | NS_INLINE NSUInteger MASPickCocoaModifiers(NSUInteger flags) 33 | { 34 | return (flags & (NSEventModifierFlagControl | NSEventModifierFlagShift | NSEventModifierFlagOption | NSEventModifierFlagCommand)); 35 | } 36 | 37 | NS_INLINE UInt32 MASCarbonModifiersFromCocoaModifiers(NSUInteger cocoaFlags) 38 | { 39 | return 40 | (cocoaFlags & NSEventModifierFlagCommand ? cmdKey : 0) 41 | | (cocoaFlags & NSEventModifierFlagOption ? optionKey : 0) 42 | | (cocoaFlags & NSEventModifierFlagControl ? controlKey : 0) 43 | | (cocoaFlags & NSEventModifierFlagShift ? shiftKey : 0); 44 | } 45 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASKeyMasks.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | // https://github.com/shpakovski/MASShortcut/issues/99 4 | // 5 | // Long story short: NSControlKeyMask and friends were replaced with NSEventModifierFlagControl 6 | // and similar in macOS Sierra. The project builds fine & clean, but including MASShortcut in 7 | // a project with deployment target set to 10.12 results in several deprecation warnings because 8 | // of the control masks. Simply replacing the old symbols with the new ones isn’t an option, 9 | // since it breaks the build on older SDKs – in Travis, for example. 10 | // 11 | // It should be safe to remove this whole thing once the 10.12 SDK is ubiquitous. 12 | 13 | #if __MAC_OS_X_VERSION_MAX_ALLOWED < 101200 14 | #define NSEventModifierFlagCommand NSCommandKeyMask 15 | #define NSEventModifierFlagControl NSControlKeyMask 16 | #define NSEventModifierFlagOption NSAlternateKeyMask 17 | #define NSEventModifierFlagShift NSShiftKeyMask 18 | #endif 19 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASLocalization.h: -------------------------------------------------------------------------------- 1 | /** 2 | Reads a localized string from the framework’s bundle. 3 | 4 | Normally you would use NSLocalizedString to read the localized 5 | strings, but that’s just a shortcut for loading the strings from 6 | the main bundle. And once the framework ends up in an app, the 7 | main bundle will be the app’s bundle and won’t contain our strings. 8 | So we introduced this helper function that makes sure to load the 9 | strings from the framework’s bundle. Please avoid using 10 | NSLocalizedString throughout the framework, it wouldn’t work 11 | properly. 12 | */ 13 | NSString *MASLocalizedString(NSString *key, NSString *comment); -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASLocalization.m: -------------------------------------------------------------------------------- 1 | #import "MASLocalization.h" 2 | #import "MASShortcut.h" 3 | 4 | static NSString *const MASLocalizationTableName = @"Localizable"; 5 | static NSString *const MASPlaceholderLocalizationString = @"XXX"; 6 | 7 | // The CocoaPods trickery here is needed because when the code 8 | // is built as a part of CocoaPods, it won’t make a separate framework 9 | // and the Localized.strings file won’t be bundled correctly. 10 | // See https://github.com/shpakovski/MASShortcut/issues/74 11 | NSString *MASLocalizedString(NSString *key, NSString *comment) { 12 | static NSBundle *localizationBundle = nil; 13 | static dispatch_once_t onceToken; 14 | dispatch_once(&onceToken, ^{ 15 | NSBundle *frameworkBundle = [NSBundle bundleForClass:[MASShortcut class]]; 16 | // first we'll check if resources bundle was copied to MASShortcut framework bundle when !use_frameworks option is active 17 | NSURL *cocoaPodsBundleURL = [frameworkBundle URLForResource:@"MASShortcut" withExtension:@"bundle"]; 18 | if (cocoaPodsBundleURL) { 19 | localizationBundle = [NSBundle bundleWithURL: cocoaPodsBundleURL]; 20 | } else { 21 | // trying to fetch cocoapods bundle from main bundle 22 | cocoaPodsBundleURL = [[NSBundle mainBundle] URLForResource: @"MASShortcut" withExtension:@"bundle"]; 23 | if (cocoaPodsBundleURL) { 24 | localizationBundle = [NSBundle bundleWithURL: cocoaPodsBundleURL]; 25 | } else { 26 | // fallback to framework bundle 27 | localizationBundle = frameworkBundle; 28 | } 29 | } 30 | }); 31 | return [localizationBundle localizedStringForKey:key 32 | value:MASPlaceholderLocalizationString 33 | table:MASLocalizationTableName]; 34 | } 35 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASShortcut.modulemap: -------------------------------------------------------------------------------- 1 | framework module MASShortcut { 2 | umbrella header "Shortcut.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASShortcutMonitor.h: -------------------------------------------------------------------------------- 1 | #import "MASShortcut.h" 2 | 3 | /** 4 | Executes action when a shortcut is pressed. 5 | 6 | There can only be one instance of this class, otherwise things 7 | will probably not work. (There’s a Carbon event handler inside 8 | and there can only be one Carbon event handler of a given type.) 9 | */ 10 | @interface MASShortcutMonitor : NSObject 11 | 12 | - (instancetype) init __unavailable; 13 | + (instancetype) sharedMonitor; 14 | 15 | /** 16 | Register a shortcut along with an action. 17 | 18 | Attempting to insert an already registered shortcut probably won’t work. 19 | It may burn your house or cut your fingers. You have been warned. 20 | */ 21 | - (BOOL) registerShortcut: (MASShortcut*) shortcut withAction: (dispatch_block_t) action; 22 | - (BOOL) isShortcutRegistered: (MASShortcut*) shortcut; 23 | 24 | - (void) unregisterShortcut: (MASShortcut*) shortcut; 25 | - (void) unregisterAllShortcuts; 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASShortcutMonitorTests.m: -------------------------------------------------------------------------------- 1 | #import "MASShortcutMonitor.h" 2 | 3 | @interface MASShortcutMonitorTests : XCTestCase 4 | @end 5 | 6 | @implementation MASShortcutMonitorTests 7 | 8 | - (void) testMonitorCreation 9 | { 10 | XCTAssertNotNil([MASShortcutMonitor sharedMonitor], @"Create a shared shortcut monitor."); 11 | } 12 | 13 | - (void) testShortcutRegistration 14 | { 15 | MASShortcutMonitor *monitor = [MASShortcutMonitor sharedMonitor]; 16 | MASShortcut *shortcut = [MASShortcut shortcutWithKeyCode:kVK_ANSI_H modifierFlags:NSCommandKeyMask|NSAlternateKeyMask]; 17 | XCTAssertTrue([monitor registerShortcut:shortcut withAction:NULL], @"Register a shortcut."); 18 | XCTAssertTrue([monitor isShortcutRegistered:shortcut], @"Remember a previously registered shortcut."); 19 | [monitor unregisterShortcut:shortcut]; 20 | XCTAssertFalse([monitor isShortcutRegistered:shortcut], @"Forget shortcut after unregistering."); 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASShortcutTests.m: -------------------------------------------------------------------------------- 1 | @interface MASShortcutTests : XCTestCase 2 | @end 3 | 4 | @implementation MASShortcutTests 5 | 6 | - (void) testEquality 7 | { 8 | MASShortcut *keyA = [MASShortcut shortcutWithKeyCode:1 modifierFlags:NSControlKeyMask]; 9 | MASShortcut *keyB = [MASShortcut shortcutWithKeyCode:2 modifierFlags:NSControlKeyMask]; 10 | MASShortcut *keyC = [MASShortcut shortcutWithKeyCode:1 modifierFlags:NSAlternateKeyMask]; 11 | MASShortcut *keyD = [MASShortcut shortcutWithKeyCode:1 modifierFlags:NSControlKeyMask]; 12 | XCTAssertTrue([keyA isEqual:keyA], @"Shortcut is equal to itself."); 13 | XCTAssertTrue([keyA isEqual:[keyA copy]], @"Shortcut is equal to its copy."); 14 | XCTAssertFalse([keyA isEqual:keyB], @"Shortcuts not equal when key codes differ."); 15 | XCTAssertFalse([keyA isEqual:keyC], @"Shortcuts not equal when modifier flags differ."); 16 | XCTAssertTrue([keyA isEqual:keyD], @"Shortcuts are equal when key codes and modifiers are."); 17 | XCTAssertFalse([keyA isEqual:@"foo"], @"Shortcut not equal to an object of a different class."); 18 | } 19 | 20 | - (void) testShortcutRecorderCompatibility 21 | { 22 | MASShortcut *key = [MASShortcut shortcutWithKeyCode:87 modifierFlags:1048576]; 23 | XCTAssertEqualObjects([key description], @"⌘5", @"Basic compatibility with the keycode & modifier combination used by Shortcut Recorder."); 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASShortcutValidator.h: -------------------------------------------------------------------------------- 1 | #import "MASShortcut.h" 2 | 3 | /** 4 | This class is used by the recording control to tell which shortcuts are acceptable. 5 | 6 | There are two kinds of shortcuts that are not considered acceptable: shortcuts that 7 | are too simple (like single letter keys) and shortcuts that are already used by the 8 | operating system. 9 | */ 10 | @interface MASShortcutValidator : NSObject 11 | 12 | /** 13 | Set to `YES` if you want to accept Option-something shortcuts. 14 | 15 | `NO` by default, since Option-something shortcuts are often used by system, 16 | for example Option-G will type the © sign. This also applies to Option-Shift 17 | shortcuts – in other words, shortcut recorder will not accept shortcuts like 18 | Option-Shift-K by default. (Again, since Option-Shift-K inserts the Apple 19 | logo sign by default.) 20 | */ 21 | @property(assign) BOOL allowAnyShortcutWithOptionModifier; 22 | 23 | /** 24 | Set to `YES` if you want to accept any shortcut whatsoever. 25 | 26 | `NO` by default, since this will override several shortcuts/keys used by the system. 27 | */ 28 | @property(assign) BOOL allowAnyShortcut; 29 | 30 | + (instancetype) sharedValidator; 31 | 32 | - (BOOL) isShortcutValid: (MASShortcut*) shortcut; 33 | - (BOOL) isShortcut: (MASShortcut*) shortcut alreadyTakenInMenu: (NSMenu*) menu explanation: (NSString**) explanation; 34 | - (BOOL) isShortcutAlreadyTakenBySystem: (MASShortcut*) shortcut explanation: (NSString**) explanation; 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASShortcutView+Bindings.h: -------------------------------------------------------------------------------- 1 | #import "MASShortcutView.h" 2 | 3 | /** 4 | A simplified interface to bind the recorder value to user defaults. 5 | 6 | You can bind the `shortcutValue` to user defaults using the standard 7 | `bind:toObject:withKeyPath:options:` call, but since that’s a lot to type 8 | and read, here’s a simpler option. 9 | 10 | Setting the `associatedUserDefaultsKey` binds the view’s shortcut value 11 | to the given user defaults key. You can supply a value transformer to convert 12 | values between user defaults and `MASShortcut`. If you don’t supply 13 | a transformer, the `NSUnarchiveFromDataTransformerName` will be used 14 | automatically. 15 | 16 | Set `associatedUserDefaultsKey` to `nil` to disconnect the binding. 17 | */ 18 | @interface MASShortcutView (Bindings) 19 | 20 | @property(copy) NSString *associatedUserDefaultsKey; 21 | 22 | - (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformer: (NSValueTransformer*) transformer; 23 | - (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformerName: (NSString*) transformerName; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASShortcutView+Bindings.m: -------------------------------------------------------------------------------- 1 | #import "MASShortcutView+Bindings.h" 2 | 3 | @implementation MASShortcutView (Bindings) 4 | 5 | - (NSString*) associatedUserDefaultsKey 6 | { 7 | NSDictionary* bindingInfo = [self infoForBinding:MASShortcutBinding]; 8 | if (bindingInfo != nil) { 9 | NSString *keyPath = [bindingInfo objectForKey:NSObservedKeyPathKey]; 10 | NSString *key = [keyPath stringByReplacingOccurrencesOfString:@"values." withString:@""]; 11 | return key; 12 | } else { 13 | return nil; 14 | } 15 | } 16 | 17 | - (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformer: (NSValueTransformer*) transformer 18 | { 19 | // Break previous binding if any 20 | NSString *currentKey = [self associatedUserDefaultsKey]; 21 | if (currentKey != nil) { 22 | [self unbind:currentKey]; 23 | } 24 | 25 | // Stop if the new binding is nil 26 | if (newKey == nil) { 27 | return; 28 | } 29 | 30 | NSDictionary *options = transformer ? 31 | @{NSValueTransformerBindingOption:transformer} : 32 | nil; 33 | 34 | [self bind:MASShortcutBinding 35 | toObject:[NSUserDefaultsController sharedUserDefaultsController] 36 | withKeyPath:[@"values." stringByAppendingString:newKey] 37 | options:options]; 38 | } 39 | 40 | - (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformerName: (NSString*) transformerName 41 | { 42 | [self setAssociatedUserDefaultsKey:newKey withTransformer:[NSValueTransformer valueTransformerForName:transformerName]]; 43 | } 44 | 45 | - (void) setAssociatedUserDefaultsKey: (NSString*) newKey 46 | { 47 | [self setAssociatedUserDefaultsKey:newKey withTransformerName:NSKeyedUnarchiveFromDataTransformerName]; 48 | } 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/MASShortcutView.h: -------------------------------------------------------------------------------- 1 | @class MASShortcut, MASShortcutValidator; 2 | 3 | extern NSString *const MASShortcutBinding; 4 | 5 | typedef NS_ENUM(NSInteger, MASShortcutViewStyle) { 6 | MASShortcutViewStyleDefault = 0, // Height = 19 px 7 | MASShortcutViewStyleTexturedRect, // Height = 25 px 8 | MASShortcutViewStyleRounded, // Height = 43 px 9 | MASShortcutViewStyleFlat 10 | }; 11 | 12 | @interface MASShortcutView : NSView 13 | 14 | @property (nonatomic, strong) MASShortcut *shortcutValue; 15 | @property (nonatomic, strong) MASShortcutValidator *shortcutValidator; 16 | @property (nonatomic, getter = isRecording) BOOL recording; 17 | @property (nonatomic, getter = isEnabled) BOOL enabled; 18 | @property (nonatomic, copy) void (^shortcutValueChange)(MASShortcutView *sender); 19 | @property (nonatomic, assign) MASShortcutViewStyle style; 20 | 21 | /// Returns custom class for drawing control. 22 | + (Class)shortcutCellClass; 23 | 24 | - (void)setAcceptsFirstResponder:(BOOL)value; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/Prefix.pch: -------------------------------------------------------------------------------- 1 | #import 2 | #import -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Framework/Shortcut.h: -------------------------------------------------------------------------------- 1 | #import "MASKeyMasks.h" 2 | #import "MASShortcut.h" 3 | #import "MASShortcutValidator.h" 4 | #import "MASShortcutMonitor.h" 5 | #import "MASShortcutBinder.h" 6 | #import "MASDictionaryTransformer.h" 7 | #import "MASShortcutView.h" 8 | #import "MASShortcutView+Bindings.h" 9 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012-2013, Vadim Shpakovski 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 2. Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 14 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 17 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 20 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/MASShortcut.podspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | Pod::Spec.new do |s| 3 | s.name = 'MASShortcut' 4 | s.version = '2.3.6' 5 | s.summary = 'Modern framework for managing global keyboard shortcuts compatible with Mac App Store' 6 | s.homepage = 'https://github.com/shpakovski/MASShortcut' 7 | s.license = 'BSD 2-clause' 8 | s.authors = { 'Vadim Shpakovski' => 'vadim@shpakovski.com', 9 | 'Tomáš Znamenáček' => 'tomas.znamenacek@gmail.com' } 10 | 11 | s.platform = :osx 12 | s.osx.deployment_target = "10.6" 13 | s.source = { :git => 'https://github.com/shpakovski/MASShortcut.git', :tag => '2.3.6' } 14 | s.source_files = 'Framework/*.{h,m}' 15 | s.exclude_files = 'Framework/*Tests.m' 16 | s.osx.frameworks = 'Carbon', 'AppKit' 17 | s.requires_arc = true 18 | s.osx.resource_bundles = { 'MASShortcut' => ['*.lproj'] } 19 | end 20 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: release 2 | 3 | ifndef BUILDDIR 4 | BUILDDIR := $(shell mktemp -d "$(TMPDIR)/MASShortcut.XXXXXX") 5 | endif 6 | 7 | release: 8 | xcodebuild -scheme MASShortcut -configuration Release -derivedDataPath "$(BUILDDIR)" build 9 | open "$(BUILDDIR)/Build/Products/Release" 10 | 11 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Tests/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 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/Tests/Prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #import 4 | #import "Shortcut.h" 5 | #endif 6 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/cs.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "Zrušit"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "Kliknutím nahrajete novou zkratku"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "Smazat zkratku"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "klávesová zkratka"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "OK"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "Nahrát zkratku"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "zkratka smazána"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "zkratka nastavena"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "Mezerník"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "Kombinace %@ se nedá použít"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "Tato zkratka se nedá použít, protože už ji obsadil systém.\nKdybyste na ní trvali, většina systémových zkratek se dá přenastavit v Předvolbách systému."; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "Tato zkratka se nedá použít, protože už je použita pro menu (%@)."; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "Pokud chcete nahrát novou zkratku, stiskněte toto tlačítko a následně vybranou zkratku. Stisknutím Delete vymažete stávající zkratku."; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "Stiskněte zkratku"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "Stiskněte zkratku"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "Vrátit se k původní"; 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "Abbrechen"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "Klicken um neuen Kurzbefehl aufzunehmen"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "Kurzbefehl Löschen"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "Kurzbefehl"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "OK"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "Kurzbefehl aufnehmen"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "Kurzbefehl gelöscht"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "Kurzbefehl gesetzt"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "Leertaste"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "Die Tastenkombination %@ kann nicht genutzt werden"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "Diese Kombination kann nicht genutzt werden, weil sie bereits als systemweiter Kurzbefehl genutzt wird.\nFalls du diese Tastenkombination wirklich benutzen willst, können die meisten Kurzbefehle in den Tastatur Systemeinstellungen geändert werden."; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "Dieser Kurzbefehl kann nicht genutzt werden, weil er bereits vom Menüpunkt „%@“ genutzt wird."; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "Drücke diesen Button, um einen neuen Kurzbefehl aufzunehmen. Tippe dann den neuen Kurzbefehl oder drücke Löschen, um den aktuellen Kurzbefehl zu löschen."; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "Neuen eingeben"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "Kurzbefehl eingeben"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "Alten nutzen"; 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "Cancel"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "Click to record new shortcut"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "Delete shortcut"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "keyboard shortcut"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "OK"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "Record Shortcut"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "Shortcut cleared"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "Shortcut set"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "Space"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "The key combination %@ cannot be used"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences."; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "This shortcut cannot be used because it is already used by the menu item ‘%@’."; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut."; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "Type New Shortcut"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "Type Shortcut"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "Use Old Shortcut"; 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/es.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "Cancelar"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "Haga clic para grabar nuevo atajo"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "Borrar atajo"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "atajo de teklado"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "OK"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "Grabar atajo"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "Atajo borrado"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "Atajo creado"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "Espacio"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "La combinación de claves %@ no se puede utilizada"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "Esta combinación no se puede utilizar debido a que ya es en us como atajo del sistema.\nSi realmente desea utilizar esta combinación de teclas, la mayoría de los atajos se puede cambiar en el panel de Teclado y Ratón de Preferencias del Sistema."; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "Este atajo no se puede utilizar debido a que ya es utilizado por el elemento de menú '%@'."; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "Para grabar un nuevo atajo, haga clic en este botón, a continuar, escriba el nuevo atajo, o pulse borrar para qutar un atajo existente."; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "Escribir atajo"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "Escribir atajo"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "Usa atajo anterior"; -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "Annuler"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "Cliquez pour enregistrer le raccourci"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "Supprimer le raccourci"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "raccourci clavier"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "OK"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "Enregistrer le raccourci"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "Raccourci supprimé"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "Raccourci configuré"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "Espace"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "La combinaison %@ ne peut être utilisée"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "Cette combinaison de touches ne peut être utilisée parce qu’elle est réservée pour un raccourci du système.\nSi vous désirez l’utiliser, la plupart des raccourcis peuvent être modifiés dans l’onglet Clavier, dans Préférences Système."; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "Ce raccourci ne peut être utilisé parce qu’il est déjà utilisé par le point de menu «%@»."; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "Pour enregistrer un nouveau raccourci, cliquez sur ce bouton et tapez le nouveau raccourci, ou bien, tapez sur «Supprimer» pour supprimer le raccourci configuré."; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "Saisir un raccourci"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "Saisir un raccourci"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "Revenir au raccourci précédent"; 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/ja.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "キャンセルする"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "クリックしてショートカットを入力"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "ショートカットを削除"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "キーボードショートカット"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "OK"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "ショートカットを入力"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "ショートカットが削除されました"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "ショートカットが設定されました"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "スペース"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "%@ はショートカットに設定できません"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "このショートカットは、システム全体で使用されているショートカットのため、設定することができません。\nもしこのショートカットを使用したい場合、「システム環境設定」の「キーボード」、「マウス」のパネルから既に設定されているショートカットを変更してください。"; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "このショートカットは、メニュー操作の「%@」で使われているため、設定できません。"; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "このボタンをクリックし、ショートカットを入力すると、新しいショートカットが設定されます。また、削除ボタンをおすと、ショートカットが削除されます。"; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "ショートカットを入力"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "ショートカットを入力"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "古いショートカットを使用"; 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/ko.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "취소"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "클릭해 단축 키를 입력"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "단축키 삭제"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "키보드 단축키"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "좋아"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "단축키 입력"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "단축키 삭제됨"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "단축키 설정됨"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "스페이스 바"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "%@ 단축키로 설정할 수 없습니다"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "이 결합은 시스템 전체에서 사용 때문에 단축키로 설정 할 수 없습니다.\n단축키를 사용하고 싶으면 시스템 환경 설정의 키보드, 마우스 패널에서 이미 설정되어있는 단축키를 변경하십시오."; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "이 단축키는 ‘%@’ 메뉴 아이템에 사용되고 있기 때문에 설정할 수 없습니다."; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "이 버튼을 클릭하고 단축키를 입력하면 새로운 단축키가 설정됩니다. 또한 삭제 버튼을 누르면 단축키가 삭제됩니다."; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "새 단축키 입력"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "단축키 입력"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "오래된 단축키를 사용"; 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/nl.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "Verbreken"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "Druk om een nieuwe sneltoets in te voeren"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "Verwijder sneltoets"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "sneltoets"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "OK"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "Sneltoets opnemen"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "Sneltoets verwijderd"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "Sneltoets zetten"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "Spatie"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "De sneltoetsencombinatie kan niet worden gebruikt"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "Deze combinatie kan niet worden gebruikt want hij wordt al gebruikt door een systeembreed sneltoets.\nAls je deze combinatie echt wilt gebruiken, kun je de meeste sneltoetsen binnen Toetsenbordinstellingen veranderen."; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "Deze sneltoets kan niet worden gebruikt want hij wordt al gebruikt door het menu item ‘%@’."; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "Om nieuwe sneltoets op te nemen, druk op deze knop, en voer een nieuwe sneltoets in, of druk op verwijder om bestaande sneltoets te verwijderen."; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "Voer Nieuwe Sneltoets in"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "Voer Sneltoets in"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "Gebruik Oude Sneltoets"; -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/pl.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "Anuluj"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "Kliknij, by ustawić nowy skrót"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "Usuń skrót"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "skrót klawiszowy"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "OK"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "Utwórz skrót"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "Skrót usunięty"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "Skrót ustawiony"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "Spacja"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "Nie można użyć kombinacji klawiszy %@"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "Nie można użyć tej kombinacji, ponieważ jest już zajęta przez skrót systemowy.\nMożesz to zmienić w panelu Klawiatura w Preferencjach systemowych."; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "Ten skrót nie może być użyty, ponieważ w menu ma już przypisaną funkcję ‘%@’."; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "Aby ustawić nowy skrót, użyj tego przycisku, a następnie wpisz nowy skrót albo naciśnij klawisz delete, by usunąć istniejący skrót"; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "Wpisz nowy skrót"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "Wpisz skrót"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "Użyj starego skrótu"; -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/pt.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "Cancelar"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" ="Clique para gravar o atalho"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "Apagar atalho"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "atalho de teclado"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "OK"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "Gravar Atalho"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "Atalho limpo"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "Atalho definido"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "Espaço"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "A combinação de teclas “%@” não pode ser usada"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "Esta combinação não pode ser usada porque ela já é usada por um atalho global do sistema.\nA maioria dos atalhos pode ser alterada no painel Teclado das Preferências do Sistema, caso realmente deseje usar esta combinação."; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "Este atalho não pode ser usado porque ele já é usado pelo item de menu “%@”."; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "Para gravar um atalho novo, clique neste botão e digite o novo atalho ou pressione apagar para limpar um atalho existente."; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "Digite o atalho"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "Digite o atalho"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "Usar atalho antigo"; 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/ru.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "Отмена"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "Нажмите для записи сочетания клавиш"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "Удалить горячую клавишу"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "сочетание клавиш"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "ОК"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "Ввести сочетание"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "Сочетание клавиш удалено"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "Сочетание клавиш назначено"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "Пробел"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "Нельзя использовать сочетание клавиш %@"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "Нельзя использовать это сочетание клавиш, потому что оно уже используется в системе.\n Если вы хотите использовать это сочетание, измените существующее системное сочетание клавиш через панель Клавиатура в Cистемных настройках."; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "Нельзя использовать это сочетание, потому что оно уже связано с элементом ‘%@’."; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "Чтобы назначить новое сочетание клавиш, нажмите эту кнопку и введите новое сочетание, или нажмите \"Удалить\", чтобы удалить действующее сочетание клавиш."; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "Введите сочетание"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "Введите сочетание"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "Вернуть старое"; -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "取消"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "点击以记录新快捷键"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "删除快捷键"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "键盘快捷键"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "好"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "记录快捷键"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "快捷键已清除"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "快捷键已设置"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "空格键"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "按键组合“%@”无法使用"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "当前按键组合无法使用,因为它已经用作其他系统全局快捷键。\n如果您真的想使用这个按键组合,大部分系统全局快捷键能在“系统偏好设置”里的“键盘”和“鼠标”面板中重设。"; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "当前快捷键无法使用,因为它已用作菜单项“%@”的快捷键。"; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "若要记录新的快捷键,单击此按钮,然后键入新的快捷键,或者按“delete键”删除已经存在的快捷键。"; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "键入新快捷键"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "键入快捷键"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "还原快捷键"; 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/MASShortcut/zh-Hant.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* Cancel action button in recording state */ 2 | "Cancel" = "取消"; 3 | 4 | /* Tooltip for non-empty shortcut button */ 5 | "Click to record new shortcut" = "點選以記錄新快捷鍵"; 6 | 7 | /* Tooltip for hint button near the non-empty shortcut */ 8 | "Delete shortcut" = "刪除快捷鍵"; 9 | 10 | /* VoiceOver title */ 11 | "keyboard shortcut" = "鍵盤快捷鍵"; 12 | 13 | /* Alert button when shortcut is already used */ 14 | "OK" = "好"; 15 | 16 | /* Empty shortcut button in normal state */ 17 | "Record Shortcut" = "記錄快捷鍵"; 18 | 19 | /* VoiceOver: Shortcut cleared */ 20 | "Shortcut cleared" = "快捷鍵已清除"; 21 | 22 | /* VoiceOver: Shortcut set */ 23 | "Shortcut set" = "快捷鍵已設定"; 24 | 25 | /* Shortcut glyph name for SPACE key */ 26 | "Space" = "空格鍵"; 27 | 28 | /* Title for alert when shortcut is already used */ 29 | "The key combination %@ cannot be used" = "按鍵組合“%@”無法使用"; 30 | 31 | /* Message for alert when shortcut is already used by the system */ 32 | "This combination cannot be used because it is already used by a system-wide keyboard shortcut.\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences." = "當前按鍵組合無法使用,因為它已經用作其他系統全局快捷鍵。\n如果您真的想使用這個按鍵組合,大部分系統全局快捷鍵能在“系統偏好設定”裡的“鍵盤”和“滑鼠”面板中重設。"; 33 | 34 | /* Message for alert when shortcut is already used */ 35 | "This shortcut cannot be used because it is already used by the menu item ‘%@’." = "當前快捷鍵無法使用,因為它已用作選單項“%@”的快捷鍵。"; 36 | 37 | /* VoiceOver shortcut help */ 38 | "To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut." = "若要記錄新的快捷鍵,單擊此按鈕,然後鍵入新的快捷鍵,或者按“delete鍵”刪除已經存在的快捷鍵。"; 39 | 40 | /* Non-empty shortcut button in recording state */ 41 | "Type New Shortcut" = "鍵入新快捷鍵"; 42 | 43 | /* Empty shortcut button in recording state */ 44 | "Type Shortcut" = "鍵入快捷鍵"; 45 | 46 | /* Cancel action button for non-empty shortcut in recording state */ 47 | "Use Old Shortcut" = "還原快捷鍵"; 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/.github/ISSUE_TEMPLATE: -------------------------------------------------------------------------------- 1 | ### What did you do? 2 | 3 | Please replace this with what you did. 4 | 5 | ### What did you expect to happen? 6 | 7 | Please replace this with what you expected to happen. 8 | 9 | ### What actually happened instead? 10 | 11 | Please replace this with what happened instead. 12 | 13 | ### Environment 14 | 15 | List the software versions you're using: 16 | 17 | - SwiftyJSON: *?.?.?* 18 | - Xcode Version: *?.? (????)* (Open Xcode; In menubar: Xcode > About Xcode) 19 | - Swift Version: *?.?* (Open Xcode Preferences; Components > Toolchains. If none, use `Xcode Default`.) 20 | 21 | Please also mention which package manager you used and its version. Delete the 22 | other package managers in this list: 23 | 24 | - Cocoapods: *?.?.?* (Use `pod --version` in Terminal) 25 | - Carthage: *?.?* (Use `carthage version` in Terminal) 26 | - Swift Package Manager *?.?.? (swiftpm-???)* (Use `swift build --version` in Terminal) 27 | 28 | ### Project that demonstrates the issue 29 | 30 | Please link to a project we can download that reproduces the issue. Feel free 31 | to delete this section if it's not relevant to the issue (eg - feature request). 32 | 33 | The project should be [short, self-contained, and correct example](http://sscce.org/). -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/.github/PULL_REQUEST_TEMPLATE: -------------------------------------------------------------------------------- 1 | The PR should summarize what was changed and why. Here are some questions to 2 | help you if you're not sure: 3 | 4 | - What behavior was changed? 5 | - What code was refactored / updated to support this change? 6 | - What issues are related to this PR? Or why was this change introduced? 7 | 8 | Checklist - While not every PR needs it, new features should consider this list: 9 | 10 | - [ ] Does this have tests? 11 | - [ ] Does this have documentation? 12 | - [ ] Does this break the public API (Requires major version bump)? 13 | - [ ] Is this a new feature (Requires minor version bump)? -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | */build/* 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | profile 14 | *.moved-aside 15 | DerivedData 16 | .idea/ 17 | *.hmap 18 | *.xccheckout 19 | 20 | #CocoaPods 21 | Pods 22 | 23 | #Carthage 24 | Carthage/Build 25 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/.hound.yml: -------------------------------------------------------------------------------- 1 | swift: 2 | config_file: .swiftlint.yml 3 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/.swift-version: -------------------------------------------------------------------------------- 1 | 3.0 2 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - force_cast 3 | - force_try 4 | - variable_name 5 | - type_name 6 | - file_length 7 | - line_length 8 | - type_body_length 9 | - cyclomatic_complexity 10 | - function_body_length 11 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode10 3 | xcode_sdk: iphonesimulator12.0 4 | script: 5 | - set -o pipefail 6 | - travis_retry xcodebuild -workspace SwiftyJSON.xcworkspace -scheme "SwiftyJSON iOS" -destination "platform=iOS Simulator,name=iPhone 6" build-for-testing test | xcpretty 7 | - travis_retry xcodebuild -workspace SwiftyJSON.xcworkspace -scheme "SwiftyJSON macOS" build-for-testing test | xcpretty 8 | - travis_retry xcodebuild -workspace SwiftyJSON.xcworkspace -scheme "SwiftyJSON tvOS" -destination "platform=tvOS Simulator,name=Apple TV" build-for-testing test | xcpretty 9 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Example/Example/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // AppDelegate.swift 2 | // 3 | // Copyright (c) 2014 - 2016 Pinglin Tang 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | import UIKit 24 | import SwiftyJSON 25 | 26 | @UIApplicationMain 27 | class AppDelegate: UIResponder, UIApplicationDelegate { 28 | 29 | var window: UIWindow? 30 | 31 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 32 | 33 | let navigationController = self.window?.rootViewController as! UINavigationController 34 | let viewController = navigationController.topViewController as! ViewController 35 | 36 | if let file = Bundle.main.path(forResource: "SwiftyJSONTests", ofType: "json") { 37 | do { 38 | let data = try Data(contentsOf: URL(fileURLWithPath: file)) 39 | let json = try JSON(data: data) 40 | viewController.json = json 41 | } catch { 42 | viewController.json = JSON.null 43 | } 44 | } else { 45 | viewController.json = JSON.null 46 | } 47 | 48 | return true 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | } 88 | ], 89 | "info" : { 90 | "version" : 1, 91 | "author" : "xcode" 92 | } 93 | } -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "extent" : "full-screen", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "filename" : "Default@2x.png", 15 | "minimum-system-version" : "7.0", 16 | "orientation" : "portrait", 17 | "scale" : "2x" 18 | }, 19 | { 20 | "orientation" : "portrait", 21 | "idiom" : "ipad", 22 | "extent" : "full-screen", 23 | "minimum-system-version" : "7.0", 24 | "scale" : "1x" 25 | }, 26 | { 27 | "orientation" : "landscape", 28 | "idiom" : "ipad", 29 | "extent" : "full-screen", 30 | "minimum-system-version" : "7.0", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "orientation" : "portrait", 35 | "idiom" : "ipad", 36 | "extent" : "full-screen", 37 | "minimum-system-version" : "7.0", 38 | "scale" : "2x" 39 | }, 40 | { 41 | "orientation" : "landscape", 42 | "idiom" : "ipad", 43 | "extent" : "full-screen", 44 | "minimum-system-version" : "7.0", 45 | "scale" : "2x" 46 | } 47 | ], 48 | "info" : { 49 | "version" : 1, 50 | "author" : "xcode" 51 | } 52 | } -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Example/Example/Images.xcassets/LaunchImage.launchimage/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Carthage/Checkouts/SwiftyJSON/Example/Example/Images.xcassets/LaunchImage.launchimage/Default@2x.png -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Example/Example/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 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Example/Playground.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Ruoyu Fu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Package.swift: -------------------------------------------------------------------------------- 1 | import PackageDescription 2 | 3 | let package = Package( 4 | name: "SwiftyJSON") 5 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Source/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 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Source/Info-macOS.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 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Source/Info-tvOS.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 | UIRequiredDeviceCapabilities 26 | 27 | arm64 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Source/Info-watchOS.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 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Source/SwiftyJSON.h: -------------------------------------------------------------------------------- 1 | // SwiftyJSON.h 2 | // 3 | // Copyright (c) 2014 - 2017 Ruoyu Fu, Pinglin Tang 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | @import Foundation; 24 | 25 | //! Project version number for SwiftyJSON. 26 | FOUNDATION_EXPORT double SwiftyJSONVersionNumber; 27 | 28 | //! Project version string for SwiftyJSON. 29 | FOUNDATION_EXPORT const unsigned char SwiftyJSONVersionString[]; 30 | 31 | 32 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/SwiftyJSON.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "SwiftyJSON" 3 | s.version = "4.2.0" 4 | s.summary = "SwiftyJSON makes it easy to deal with JSON data in Swift" 5 | s.homepage = "https://github.com/SwiftyJSON/SwiftyJSON" 6 | s.license = { :type => "MIT" } 7 | s.authors = { "lingoer" => "lingoerer@gmail.com", "tangplin" => "tangplin@gmail.com" } 8 | 9 | s.requires_arc = true 10 | s.swift_version = "4.2" 11 | s.osx.deployment_target = "10.9" 12 | s.ios.deployment_target = "8.0" 13 | s.watchos.deployment_target = "3.0" 14 | s.tvos.deployment_target = "9.0" 15 | s.source = { :git => "https://github.com/SwiftyJSON/SwiftyJSON.git", :tag => s.version } 16 | s.source_files = "Source/*.swift" 17 | end 18 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/SwiftyJSON.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/SwiftyJSON.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/SwiftyJSON.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/SwiftyJSON.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Tests/SwiftyJSONTests/ArrayTests.swift: -------------------------------------------------------------------------------- 1 | // ArrayTests.swift 2 | // 3 | // Copyright (c) 2014 - 2017 Pinglin Tang 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | import XCTest 24 | import SwiftyJSON 25 | 26 | class ArrayTests: XCTestCase { 27 | 28 | func testSingleDimensionalArraysGetter() { 29 | let array = ["1", "2", "a", "B", "D"] 30 | let json = JSON(array) 31 | XCTAssertEqual((json.array![0] as JSON).string!, "1") 32 | XCTAssertEqual((json.array![1] as JSON).string!, "2") 33 | XCTAssertEqual((json.array![2] as JSON).string!, "a") 34 | XCTAssertEqual((json.array![3] as JSON).string!, "B") 35 | XCTAssertEqual((json.array![4] as JSON).string!, "D") 36 | } 37 | 38 | func testSingleDimensionalArraysSetter() { 39 | let array = ["1", "2", "a", "B", "D"] 40 | var json = JSON(array) 41 | json.arrayObject = ["111", "222"] 42 | XCTAssertEqual((json.array![0] as JSON).string!, "111") 43 | XCTAssertEqual((json.array![1] as JSON).string!, "222") 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Tests/SwiftyJSONTests/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 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Tests/SwiftyJSONTests/Info-macOS.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 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/Tests/SwiftyJSONTests/Info-tvOS.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 | -------------------------------------------------------------------------------- /Carthage/Checkouts/SwiftyJSON/scripts/carthage.sh: -------------------------------------------------------------------------------- 1 | carthage build --no-skip-current 2 | carthage archive SwiftyJSON 3 | -------------------------------------------------------------------------------- /Resources/banner.afdesign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/banner.afdesign -------------------------------------------------------------------------------- /Resources/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/banner.png -------------------------------------------------------------------------------- /Resources/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/demo.png -------------------------------------------------------------------------------- /Resources/icon-off.iconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-off.iconset/icon_128x128.png -------------------------------------------------------------------------------- /Resources/icon-off.iconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-off.iconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /Resources/icon-off.iconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-off.iconset/icon_16x16.png -------------------------------------------------------------------------------- /Resources/icon-off.iconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-off.iconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /Resources/icon-off.iconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-off.iconset/icon_256x256.png -------------------------------------------------------------------------------- /Resources/icon-off.iconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-off.iconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /Resources/icon-off.iconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-off.iconset/icon_32x32.png -------------------------------------------------------------------------------- /Resources/icon-off.iconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-off.iconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /Resources/icon-off.iconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-off.iconset/icon_512x512.png -------------------------------------------------------------------------------- /Resources/icon-off.iconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-off.iconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /Resources/icon-off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/icon-off_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-off_1024.png -------------------------------------------------------------------------------- /Resources/icon-on.iconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-on.iconset/icon_128x128.png -------------------------------------------------------------------------------- /Resources/icon-on.iconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-on.iconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /Resources/icon-on.iconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-on.iconset/icon_16x16.png -------------------------------------------------------------------------------- /Resources/icon-on.iconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-on.iconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /Resources/icon-on.iconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-on.iconset/icon_256x256.png -------------------------------------------------------------------------------- /Resources/icon-on.iconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-on.iconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /Resources/icon-on.iconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-on.iconset/icon_32x32.png -------------------------------------------------------------------------------- /Resources/icon-on.iconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-on.iconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /Resources/icon-on.iconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-on.iconset/icon_512x512.png -------------------------------------------------------------------------------- /Resources/icon-on.iconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-on.iconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /Resources/icon-on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/icon-on_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/icon-on_1024.png -------------------------------------------------------------------------------- /Resources/screenshot-dark-sequence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/screenshot-dark-sequence.png -------------------------------------------------------------------------------- /Resources/screenshot-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/screenshot-dark.png -------------------------------------------------------------------------------- /Resources/screenshot-light-sequence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/screenshot-light-sequence.png -------------------------------------------------------------------------------- /Resources/screenshot-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acheronfail/apptivator/61eb98d3e58e0a6c48fa59501dab8a4fb4d19ff9/Resources/screenshot-light.png --------------------------------------------------------------------------------