diff --git a/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}} Unit Tests/QS{{cookiecutter.short_name}}_Unit_Tests.swift b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}} Unit Tests/QS{{cookiecutter.short_name}}_Unit_Tests.swift new file mode 100644 index 0000000..ece60db --- /dev/null +++ b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}} Unit Tests/QS{{cookiecutter.short_name}}_Unit_Tests.swift @@ -0,0 +1,41 @@ +// +// QS{{cookiecutter.short_name}}_Unit_Tests.swift +// QS{{cookiecutter.short_name}} Unit Tests +// +// Created by Nathan Henrie on 2022-09-11. +// Copyright © 2022 Quicksilver. All rights reserved. +// + +import XCTest + +import QS{{cookiecutter.short_name}} + +class QS{{cookiecutter.short_name}}_Unit_Tests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + let action = QS{{cookiecutter.short_name}}SwiftAction() + let result = action.performSwiftActionOnObject(QSObject(string:"example input")!) + XCTAssertEqual(result, QSObject(string:"here it comes!")!) + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.xcodeproj/project.pbxproj b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.xcodeproj/project.pbxproj index 518bdfc..feeb8d1 100644 --- a/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.xcodeproj/project.pbxproj +++ b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.xcodeproj/project.pbxproj @@ -7,18 +7,45 @@ objects = { /* Begin PBXBuildFile section */ + 603AE8F228CE5ED700C67DD0 /* QS{{cookiecutter.short_name}}_Unit_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 603AE8F128CE5ED700C67DD0 /* QS{{cookiecutter.short_name}}_Unit_Tests.swift */; }; + 603AE8FD28CE604C00C67DD0 /* QSInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 603AE8F928CE604C00C67DD0 /* QSInterface.framework */; }; + 603AE8FE28CE604C00C67DD0 /* QSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 603AE8FA28CE604C00C67DD0 /* QSCore.framework */; }; + 603AE8FF28CE604D00C67DD0 /* QSEffects.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 603AE8FB28CE604C00C67DD0 /* QSEffects.framework */; }; + 603AE90028CE604D00C67DD0 /* QSFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 603AE8FC28CE604C00C67DD0 /* QSFoundation.framework */; }; + 608539A227D15DA2004EE149 /* QS{{cookiecutter.short_name}}.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608539A127D15DA2004EE149 /* QS{{cookiecutter.short_name}}.swift */; }; + 609B1FC727F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Source.m in Sources */ = {isa = PBXBuildFile; fileRef = 609B1FC327F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Source.m */; }; + 609B1FC827F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Action.m in Sources */ = {isa = PBXBuildFile; fileRef = 609B1FC427F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Action.m */; }; + 60E5BA1E28CE80950006B489 /* QS{{cookiecutter.short_name}}.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608539A127D15DA2004EE149 /* QS{{cookiecutter.short_name}}.swift */; }; D434B7751FC8FFC7007AF9C3 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D434B7741FC8FFC7007AF9C3 /* Cocoa.framework */; }; - D434B77E1FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Action.m in Sources */ = {isa = PBXBuildFile; fileRef = D434B77D1FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Action.m */; }; - D434B7811FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Source.m in Sources */ = {isa = PBXBuildFile; fileRef = D434B7801FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Source.m */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 603AE8F728CE601500C67DD0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D434B7681FC8FFC7007AF9C3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D434B7701FC8FFC7007AF9C3; + remoteInfo = QS{{cookiecutter.short_name}}; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ + 603AE8EF28CE5ED700C67DD0 /* QS{{cookiecutter.short_name}} Unit Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "QS{{cookiecutter.short_name}} Unit Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 603AE8F128CE5ED700C67DD0 /* QS{{cookiecutter.short_name}}_Unit_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QS{{cookiecutter.short_name}}_Unit_Tests.swift; sourceTree = ""; }; + 603AE8F628CE5F0800C67DD0 /* QS{{cookiecutter.short_name}}.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = QS{{cookiecutter.short_name}}.xctestplan; sourceTree = SOURCE_ROOT; }; + 603AE8F928CE604C00C67DD0 /* QSInterface.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QSInterface.framework; path = ../../../../../private/tmp/QS/build/Debug/QSInterface.framework; sourceTree = ""; }; + 603AE8FA28CE604C00C67DD0 /* QSCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QSCore.framework; path = ../../../../../private/tmp/QS/build/Debug/QSCore.framework; sourceTree = ""; }; + 603AE8FB28CE604C00C67DD0 /* QSEffects.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QSEffects.framework; path = ../../../../../private/tmp/QS/build/Debug/QSEffects.framework; sourceTree = ""; }; + 603AE8FC28CE604C00C67DD0 /* QSFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QSFoundation.framework; path = ../../../../../private/tmp/QS/build/Debug/QSFoundation.framework; sourceTree = ""; }; + 606D3146289F600F00A76A21 /* QS{{cookiecutter.short_name}}.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QS{{cookiecutter.short_name}}.h; sourceTree = ""; }; + 608539A027D15DA2004EE149 /* QS{{cookiecutter.short_name}}-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "QS{{cookiecutter.short_name}}-Bridging-Header.h"; sourceTree = ""; }; + 608539A127D15DA2004EE149 /* QS{{cookiecutter.short_name}}.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QS{{cookiecutter.short_name}}.swift; sourceTree = ""; }; + 609B1FC327F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Source.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QS{{cookiecutter.short_name}}Source.m; sourceTree = ""; }; + 609B1FC427F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Action.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QS{{cookiecutter.short_name}}Action.m; sourceTree = ""; }; + 609B1FC527F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Action.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QS{{cookiecutter.short_name}}Action.h; sourceTree = ""; }; + 609B1FC627F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QS{{cookiecutter.short_name}}Source.h; sourceTree = ""; }; D434B7711FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}.qsplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QS{{cookiecutter.short_name}}.qsplugin; sourceTree = BUILT_PRODUCTS_DIR; }; D434B7741FC8FFC7007AF9C3 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; - D434B77C1FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Action.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QS{{cookiecutter.short_name}}Action.h; sourceTree = ""; }; - D434B77D1FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Action.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QS{{cookiecutter.short_name}}Action.m; sourceTree = ""; }; - D434B77F1FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QS{{cookiecutter.short_name}}Source.h; sourceTree = ""; }; - D434B7801FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Source.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QS{{cookiecutter.short_name}}Source.m; sourceTree = ""; }; D46888911FC903AC00797047 /* Developer.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Developer.xcconfig; sourceTree = ""; }; D46888921FC903AC00797047 /* Common.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; D46888931FC903AC00797047 /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; @@ -29,6 +56,17 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 603AE8EC28CE5ED700C67DD0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 603AE8FD28CE604C00C67DD0 /* QSInterface.framework in Frameworks */, + 603AE8FE28CE604C00C67DD0 /* QSCore.framework in Frameworks */, + 603AE8FF28CE604D00C67DD0 /* QSEffects.framework in Frameworks */, + 603AE90028CE604D00C67DD0 /* QSFoundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D434B76E1FC8FFC7007AF9C3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -40,11 +78,21 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 603AE8F028CE5ED700C67DD0 /* QS{{cookiecutter.short_name}} Unit Tests */ = { + isa = PBXGroup; + children = ( + 603AE8F128CE5ED700C67DD0 /* QS{{cookiecutter.short_name}}_Unit_Tests.swift */, + ); + path = "QS{{cookiecutter.short_name}} Unit Tests"; + sourceTree = ""; + }; D434B7671FC8FFC7007AF9C3 = { isa = PBXGroup; children = ( + 603AE8F628CE5F0800C67DD0 /* QS{{cookiecutter.short_name}}.xctestplan */, D46888901FC903AC00797047 /* Configuration */, D434B7761FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}} */, + 603AE8F028CE5ED700C67DD0 /* QS{{cookiecutter.short_name}} Unit Tests */, D434B7731FC8FFC7007AF9C3 /* Frameworks */, D434B7721FC8FFC7007AF9C3 /* Products */, ); @@ -54,6 +102,7 @@ isa = PBXGroup; children = ( D434B7711FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}.qsplugin */, + 603AE8EF28CE5ED700C67DD0 /* QS{{cookiecutter.short_name}} Unit Tests.xctest */, ); name = Products; sourceTree = ""; @@ -61,6 +110,10 @@ D434B7731FC8FFC7007AF9C3 /* Frameworks */ = { isa = PBXGroup; children = ( + 603AE8FA28CE604C00C67DD0 /* QSCore.framework */, + 603AE8FB28CE604C00C67DD0 /* QSEffects.framework */, + 603AE8FC28CE604C00C67DD0 /* QSFoundation.framework */, + 603AE8F928CE604C00C67DD0 /* QSInterface.framework */, D434B7741FC8FFC7007AF9C3 /* Cocoa.framework */, ); name = Frameworks; @@ -69,11 +122,14 @@ D434B7761FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}} */ = { isa = PBXGroup; children = ( + 606D3146289F600F00A76A21 /* QS{{cookiecutter.short_name}}.h */, + 609B1FC527F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Action.h */, + 609B1FC427F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Action.m */, + 609B1FC627F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Source.h */, + 609B1FC327F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Source.m */, D4EF80261FC9004F0025F5EA /* Info.plist */, - D434B77C1FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Action.h */, - D434B77D1FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Action.m */, - D434B77F1FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Source.h */, - D434B7801FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Source.m */, + 608539A127D15DA2004EE149 /* QS{{cookiecutter.short_name}}.swift */, + 608539A027D15DA2004EE149 /* QS{{cookiecutter.short_name}}-Bridging-Header.h */, ); path = QS{{cookiecutter.short_name}}; sourceTree = ""; @@ -95,6 +151,24 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 603AE8EE28CE5ED700C67DD0 /* QS{{cookiecutter.short_name}} Unit Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 603AE8F528CE5ED700C67DD0 /* Build configuration list for PBXNativeTarget "QS{{cookiecutter.short_name}} Unit Tests" */; + buildPhases = ( + 603AE8EB28CE5ED700C67DD0 /* Sources */, + 603AE8EC28CE5ED700C67DD0 /* Frameworks */, + 603AE8ED28CE5ED700C67DD0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 603AE8F828CE601500C67DD0 /* PBXTargetDependency */, + ); + name = "QS{{cookiecutter.short_name}} Unit Tests"; + productName = "QS{{cookiecutter.short_name}} Unit Tests"; + productReference = 603AE8EF28CE5ED700C67DD0 /* QS{{cookiecutter.short_name}} Unit Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; D434B7701FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}} */ = { isa = PBXNativeTarget; buildConfigurationList = D434B7851FC8FFC7007AF9C3 /* Build configuration list for PBXNativeTarget "QS{{cookiecutter.short_name}}" */; @@ -119,11 +193,17 @@ D434B7681FC8FFC7007AF9C3 /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 1340; LastUpgradeCheck = 0910; ORGANIZATIONNAME = Quicksilver; TargetAttributes = { + 603AE8EE28CE5ED700C67DD0 = { + CreatedOnToolsVersion = 13.4.1; + ProvisioningStyle = Automatic; + }; D434B7701FC8FFC7007AF9C3 = { CreatedOnToolsVersion = 9.1; + LastSwiftMigration = 1320; ProvisioningStyle = Manual; }; }; @@ -141,11 +221,19 @@ projectRoot = ""; targets = ( D434B7701FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}} */, + 603AE8EE28CE5ED700C67DD0 /* QS{{cookiecutter.short_name}} Unit Tests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 603AE8ED28CE5ED700C67DD0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; D434B76F1FC8FFC7007AF9C3 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -167,27 +255,177 @@ ); runOnlyForDeploymentPostprocessing = 1; shellPath = /bin/sh; - shellScript = "\"$QS_BUILD_ROOT/Tools/bltrversion\""; + shellScript = "\"$QS_BUILD_ROOT/Tools/bltrversion\"\n"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 603AE8EB28CE5ED700C67DD0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 603AE8F228CE5ED700C67DD0 /* QS{{cookiecutter.short_name}}_Unit_Tests.swift in Sources */, + 60E5BA1E28CE80950006B489 /* QS{{cookiecutter.short_name}}.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D434B76D1FC8FFC7007AF9C3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D434B77E1FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Action.m in Sources */, - D434B7811FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}}Source.m in Sources */, + 609B1FC827F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Action.m in Sources */, + 609B1FC727F3C4E00048FFEB /* QS{{cookiecutter.short_name}}Source.m in Sources */, + 608539A227D15DA2004EE149 /* QS{{cookiecutter.short_name}}.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 603AE8F828CE601500C67DD0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = D434B7701FC8FFC7007AF9C3 /* QS{{cookiecutter.short_name}} */; + targetProxy = 603AE8F728CE601500C67DD0 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ + 603AE8F328CE5ED700C67DD0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/QS{{cookiecutter.short_name}}.qsplugin/Contents/MacOS/QS{{cookiecutter.short_name}}"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = 12.3; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.blacktree.QS{{cookiecutter.short_name}}.QS{{cookiecutter.short_name}}-Unit-Tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OBJC_BRIDGING_HEADER = "QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 603AE8F428CE5ED700C67DD0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = 12.3; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.blacktree.QS{{cookiecutter.short_name}}.QS{{cookiecutter.short_name}}-Unit-Tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OBJC_BRIDGING_HEADER = "QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; D434B7831FC8FFC7007AF9C3 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = D46888931FC903AC00797047 /* Debug.xcconfig */; buildSettings = { + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -195,6 +433,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = D46888941FC903AC00797047 /* Release.xcconfig */; buildSettings = { + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -202,11 +441,16 @@ isa = XCBuildConfiguration; baseConfigurationReference = D46888961FC903AC00797047 /* QSPlugIn.xcconfig */; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = ""; + ENABLE_TESTABILITY = YES; INFOPLIST_FILE = "$(SRCROOT)/QS{{cookiecutter.short_name}}/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}-Bridging-Header.h"; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -214,17 +458,30 @@ isa = XCBuildConfiguration; baseConfigurationReference = D46888961FC903AC00797047 /* QSPlugIn.xcconfig */; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "$(SRCROOT)/QS{{cookiecutter.short_name}}/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}-Bridging-Header.h"; + SWIFT_VERSION = 5.0; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 603AE8F528CE5ED700C67DD0 /* Build configuration list for PBXNativeTarget "QS{{cookiecutter.short_name}} Unit Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 603AE8F328CE5ED700C67DD0 /* Debug */, + 603AE8F428CE5ED700C67DD0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; D434B76B1FC8FFC7007AF9C3 /* Build configuration list for PBXProject "QS{{cookiecutter.short_name}}" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.xcodeproj/xcshareddata/xcschemes/QS{{cookiecutter.short_name}}.xcscheme b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.xcodeproj/xcshareddata/xcschemes/QS{{cookiecutter.short_name}}.xcscheme new file mode 100644 index 0000000..3925e64 --- /dev/null +++ b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.xcodeproj/xcshareddata/xcschemes/QS{{cookiecutter.short_name}}.xcscheme @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.xctestplan b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.xctestplan new file mode 100644 index 0000000..73e6a71 --- /dev/null +++ b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.xctestplan @@ -0,0 +1,24 @@ +{ + "configurations" : [ + { + "id" : "148D89A1-CBE9-41C5-A235-FB45F17A478D", + "name" : "Configuration 1", + "options" : { + + } + } + ], + "defaultOptions" : { + + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:QS{{cookiecutter.short_name}}.xcodeproj", + "identifier" : "603AE8EE28CE5ED700C67DD0", + "name" : "QS{{cookiecutter.short_name}} Unit Tests" + } + } + ], + "version" : 1 +} diff --git a/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/Info.plist b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/Info.plist index bc52998..a46ffd5 100644 --- a/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/Info.plist +++ b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/Info.plist @@ -31,6 +31,7 @@ directTypes QS{{cookiecutter.short_name}}Type + NSStringPboardType displaysResult @@ -52,6 +53,7 @@ directTypes QS{{cookiecutter.short_name}}Type + NSStringPboardType displaysResult @@ -61,6 +63,7 @@ indirectTypes + QS{{cookiecutter.short_name}}Type NSStringPboardType name @@ -68,6 +71,108 @@ validatesObjects + DoSomethingInSwiftAction + + actionClass + QS{{cookiecutter.short_name}}.QS{{cookiecutter.short_name}}SwiftAction + actionSelector + performSwiftActionOnObject: + commandFormat + Do Something in Swift to %@ + directTypes + + QS{{cookiecutter.short_name}}Type + NSStringPboardType + + displaysResult + + icon + Actions + name + Do Something in Swift + validatesObjects + + + DoSomethingInSwiftUsingAction + + actionClass + QS{{cookiecutter.short_name}}.QS{{cookiecutter.short_name}}SwiftAction + actionSelector + performSwiftActionOnObject:using: + commandFormat + Do something in Swift to %@ using %@ + directTypes + + QS{{cookiecutter.short_name}}Type + NSStringPboardType + + displaysResult + + icon + Actions + indirectOptional + + indirectTypes + + QS{{cookiecutter.short_name}}Type + NSStringPboardType + + name + Do Something in Swift Using… + validatesObjects + + + DoSomethingInSwiftFromObjCAction + + actionClass + QS{{cookiecutter.short_name}}.QS{{cookiecutter.short_name}}SwiftAction + actionSelector + performSwiftActionFromObjC: + commandFormat + Do Something in Swift from ObjC to %@ + directTypes + + QS{{cookiecutter.short_name}}Type + NSStringPboardType + + displaysResult + + icon + Actions + name + Do Something in Swift from ObjC + validatesObjects + + + DoSomethingInSwiftFromObjCUsingAction + + actionClass + QS{{cookiecutter.short_name}}.QS{{cookiecutter.short_name}}SwiftAction + actionSelector + performSwiftActionFromObjC:using: + commandFormat + Do something in Swift from ObjC to %@ using %@ + directTypes + + QS{{cookiecutter.short_name}}Type + NSStringPboardType + + displaysResult + + icon + Actions + indirectOptional + + indirectTypes + + QS{{cookiecutter.short_name}}Type + NSStringPboardType + + name + Do Something in Swift from ObjC Using… + validatesObjects + + QSDefaultsTemplate @@ -87,11 +192,11 @@ extendedDescription <h1>{{cookiecutter.short_name}}</h1> <h2>{{cookiecutter.description}}</h2> -<p>Documentatoin for {{cookiecutter.short_name}}</p> +<p>Documentation for {{cookiecutter.short_name}}</p> icon QSPlugIn - QSPresetAdditionsTemplate + QSPresetAdditions ID @@ -110,6 +215,23 @@ source QS{{cookiecutter.short_name}}Source + + ID + QSPresetSwiftExample + enabled + + icon + QSPlugIn + name + Example Swift Preset + settings + + path + /path/to/data + + source + QS{{cookiecutter.short_name}}.QS{{cookiecutter.short_name}}SwiftSource + QSRegistration diff --git a/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}-Bridging-Header.h b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}-Bridging-Header.h new file mode 100644 index 0000000..ecb3947 --- /dev/null +++ b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}-Bridging-Header.h @@ -0,0 +1,6 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import "QS{{cookiecutter.short_name}}.h" +#import "Quicksilver.pch" diff --git a/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.swift b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.swift new file mode 100644 index 0000000..c0c44f1 --- /dev/null +++ b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}.swift @@ -0,0 +1,96 @@ +// QS{{cookiecutter.short_name}}.swift +// QS{{cookiecutter.short_name}} +// +// Created by {{cookiecutter.author}} + +// +// QS{{cookiecutter.short_name}}.swift +// QS{{cookiecutter.short_name}} +// +// Created by Nathan Henrie on 2022-03-03. +// Copyright © 2022 Quicksilver. All rights reserved. +// + +//import Foundation +//import Cocoa + +class QS{{cookiecutter.short_name}}SwiftAction : QSActionProvider { + @objc func performSwiftActionOnObject(_ dObject: QSObject) -> QSObject { + print("Performing a Swift action with direct obj only") + return QSObject(string: "here it comes!") + } + + @objc func performSwiftActionOnObject(_ dObject: QSObject, using iObject: QSObject) -> QSObject { + print("Performing a Swift action with direct and indirect objects") + return QSObject(string: "there it went!") + } + + // Please see the below method in QS{{cookiecutter.short_name}}Action.m + // - (QSObject *)performActionInSwiftFromObjC:(QSObject *)dObject + @objc func performSwiftActionFromObjC(_ dObject: QSObject) -> QSObject { + print("Performing a Swift action from ObjC with direct obj only") + return QSObject(string: "here it comes!") + } + + // Please see the below method in QS{{cookiecutter.short_name}}Action.m + // - (QSObject *)performActionInSwiftFromObjC:(QSObject *)dObject using:(QSObject *)iObject + @objc func performSwiftActionFromObjC(_ dObject: QSObject, using iObject: QSObject) -> QSObject { + print("Performing a Swift action from ObjC with direct and indirect objects") + return QSObject(string: "there it went!") + } + + @objc func validActionsForDirectObject(_ dObject: QSObject, indirectObject iObject: QSObject) -> [String] { + print("Just validating some actions") + var newActions = [String]() + newActions.append("DoSomethingInSwiftAction") + return newActions + } + + @objc func validIndirectObjectsForAction(_ action: String, directObject dObject: QSObject) -> [QSObject] { + print("Just validating some indirecet objects here") + if action == "DoSomethingInSwiftUsingAction" { + print("Yup, that's the name!") + + var opts = [QSObject]() + opts.append(QSObject(string: "First option!")) + opts.append(QSObject(string: "Second option!")) + return opts + } + return [QSObject(string: "You're outta options!")] + } +} + + // Please see the below method in QS{{cookiecutter.short_name}}Action.m +class QS{{cookiecutter.short_name}}SwiftSource : QSObjectSource { +// - (BOOL)indexIsValidFromDate:(NSDate *)indexDate forEntry:(NSDictionary *)theEntry + @objc func indexIsValidFromDate(_ indexDate: NSDate, forEntry theEntry: NSDictionary) -> Bool { + print("checking that index"); + return false; + } + + // create and return an array of QSObjects to add to the catalog + // Run `Force Catalog Rescan` and afterwards `Example Swift Preset` should + // appear in Catalog -> Plugins, with 1 entry + @objc func objectsForEntry(_ theEntry: NSDictionary) -> [QSObject] { + print("here sourcing stuff"); + + let newObject = QSObject(type: "QS{{cookiecutter.short_name}}Type", value: "this is my value!", name: "Test {{cookiecutter.short_name}} Swifty Object")! + return [newObject] + } + + /* + // an icon that is either already in memory or easy to load + - (void)setQuickIconForObject:(QSObject *)object + { + [object setIcon:nil]; + } + + // a nicer or more "correct" icon that takes a while to create or obtain + - (BOOL)loadIconForObject:(QSObject *)object + { + id data=[object objectForType:QS{{cookiecutter.short_name}}Type]; + [object setIcon:nil]; + return YES; + } + */ +} diff --git a/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}Action.m b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}Action.m index 629f6ce..c217d74 100644 --- a/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}Action.m +++ b/{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}/QS{{cookiecutter.short_name}}Action.m @@ -7,6 +7,7 @@ #import "QS{{cookiecutter.short_name}}.h" #import "QS{{cookiecutter.short_name}}Action.h" +#import @implementation QS{{cookiecutter.short_name}}Action @@ -24,6 +25,22 @@ - (QSObject *)performActionOnObject:(QSObject *)dObject using:(QSObject *)iObjec return nil; } +// Call a method defined in QS{{cookiecutter.short_name}}.swift +// Please remove this method if not using Swift! +- (QSObject *)performActionInSwiftFromObjC:(QSObject *)dObject +{ + QS{{cookiecutter.short_name}}SwiftAction* plugin = [[QS{{cookiecutter.short_name}}SwiftAction alloc]init]; + return [plugin performSwiftActionFromObjC:dObject]; +} + +// Call a method defined in QS{{cookiecutter.short_name}}.swift also using the third pane +// Please remove this method if not using Swift! +- (QSObject *)performActionInSwiftFromObjC:(QSObject *)dObject using:(QSObject *)iObject +{ + QS{{cookiecutter.short_name}}SwiftAction* plugin = [[QS{{cookiecutter.short_name}}SwiftAction alloc]init]; + return [plugin performSwiftActionFromObjC:dObject using:iObject]; +} + #pragma mark Quicksilver Validation // return an array of objects that are allowed in the third pane