├── .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 |
--------------------------------------------------------------------------------
/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
--------------------------------------------------------------------------------