diff --git a/LeadKitAdditions/.swiftlint.yml b/LeadKitAdditions/.swiftlint.yml new file mode 100644 index 0000000..307a6ea --- /dev/null +++ b/LeadKitAdditions/.swiftlint.yml @@ -0,0 +1,21 @@ +disabled_rules: + - variable_name +excluded: + - Carthage + - Pods +line_length: 128 +type_body_length: + - 500 # warning + - 700 # error +file_length: + warning: 500 + error: 1200 +warning_threshold: 1 + +custom_rules: + uiwebview_disabled: + included: ".*.swift" + name: "UIWebView Usage Disabled" + regex: "(UIWebView)" + message: "Do not use UIWebView. Use WKWebView Instead. https://developer.apple.com/reference/uikit/uiwebview" + severity: error \ No newline at end of file diff --git a/LeadKitAdditions/.tailor.yml b/LeadKitAdditions/.tailor.yml new file mode 100644 index 0000000..1bee518 --- /dev/null +++ b/LeadKitAdditions/.tailor.yml @@ -0,0 +1,4 @@ +exclude: + - 'Pods' + - 'Carthage' + - 'RxAlamofire' diff --git a/LeadKitAdditions/LeadKitAdditions.xcodeproj/project.pbxproj b/LeadKitAdditions/LeadKitAdditions.xcodeproj/project.pbxproj new file mode 100644 index 0000000..4af5fc4 --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions.xcodeproj/project.pbxproj @@ -0,0 +1,460 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 7A94B4A5956B82BE1CEBA873 /* Pods_LeadKitAdditions.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B7F57C5E5275C4D8DC71992 /* Pods_LeadKitAdditions.framework */; }; + CAE698E81E968820000394B0 /* LeadKitAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = CAE698E61E968820000394B0 /* LeadKitAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CAE698F11E968BA6000394B0 /* BaseDateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE698EF1E968BA6000394B0 /* BaseDateFormatter.swift */; }; + CAE698F61E968E3D000394B0 /* BaseUserService.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE698F41E968E3D000394B0 /* BaseUserService.swift */; }; + CAE698FB1E968F78000394B0 /* UserDefaults+UserService.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE698F91E968F78000394B0 /* UserDefaults+UserService.swift */; }; + CAE698FF1E969352000394B0 /* ApiResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE698FD1E969352000394B0 /* ApiResponse.swift */; }; + CAE699041E9693F4000394B0 /* ConnectionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE699021E9693F4000394B0 /* ConnectionError.swift */; }; + CAE699081E96956D000394B0 /* ApiError.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE699061E96956D000394B0 /* ApiError.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 53E343F9E8F0A27C6114C160 /* Pods-LeadKitAdditions.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LeadKitAdditions.debug.xcconfig"; path = "Pods/Target Support Files/Pods-LeadKitAdditions/Pods-LeadKitAdditions.debug.xcconfig"; sourceTree = ""; }; + 7B7F57C5E5275C4D8DC71992 /* Pods_LeadKitAdditions.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_LeadKitAdditions.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8A48492D1BE72C6D161A6E8E /* Pods-LeadKitAdditions.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LeadKitAdditions.release.xcconfig"; path = "Pods/Target Support Files/Pods-LeadKitAdditions/Pods-LeadKitAdditions.release.xcconfig"; sourceTree = ""; }; + CAE698E31E968820000394B0 /* LeadKitAdditions.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LeadKitAdditions.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CAE698E61E968820000394B0 /* LeadKitAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LeadKitAdditions.h; sourceTree = ""; }; + CAE698E71E968820000394B0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CAE698EF1E968BA6000394B0 /* BaseDateFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BaseDateFormatter.swift; path = Classes/BaseDateFormatter.swift; sourceTree = ""; }; + CAE698F41E968E3D000394B0 /* BaseUserService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BaseUserService.swift; path = Services/BaseUserService.swift; sourceTree = ""; }; + CAE698F91E968F78000394B0 /* UserDefaults+UserService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UserDefaults+UserService.swift"; path = "Extensions/UserDefaults+UserService.swift"; sourceTree = ""; }; + CAE698FD1E969352000394B0 /* ApiResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ApiResponse.swift; path = Classes/ApiResponse.swift; sourceTree = ""; }; + CAE699021E9693F4000394B0 /* ConnectionError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConnectionError.swift; path = Enums/ConnectionError.swift; sourceTree = ""; }; + CAE699061E96956D000394B0 /* ApiError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ApiError.swift; path = Enums/ApiError.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + CAE698DF1E968820000394B0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7A94B4A5956B82BE1CEBA873 /* Pods_LeadKitAdditions.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + A3117951840B8B7D2E7A8A80 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 7B7F57C5E5275C4D8DC71992 /* Pods_LeadKitAdditions.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + CAE698D91E968820000394B0 = { + isa = PBXGroup; + children = ( + CAE698E51E968820000394B0 /* LeadKitAdditions */, + CAE698E41E968820000394B0 /* Products */, + F8A65FEC7C0EB4B93746E50F /* Pods */, + A3117951840B8B7D2E7A8A80 /* Frameworks */, + ); + sourceTree = ""; + }; + CAE698E41E968820000394B0 /* Products */ = { + isa = PBXGroup; + children = ( + CAE698E31E968820000394B0 /* LeadKitAdditions.framework */, + ); + name = Products; + sourceTree = ""; + }; + CAE698E51E968820000394B0 /* LeadKitAdditions */ = { + isa = PBXGroup; + children = ( + CAE699011E9693DE000394B0 /* Enums */, + CAE698F81E968F56000394B0 /* Extensions */, + CAE698F31E968E28000394B0 /* Services */, + CAE698EE1E968B72000394B0 /* Classes */, + CAE698E61E968820000394B0 /* LeadKitAdditions.h */, + CAE698E71E968820000394B0 /* Info.plist */, + ); + path = LeadKitAdditions; + sourceTree = ""; + }; + CAE698EE1E968B72000394B0 /* Classes */ = { + isa = PBXGroup; + children = ( + CAE698EF1E968BA6000394B0 /* BaseDateFormatter.swift */, + CAE698FD1E969352000394B0 /* ApiResponse.swift */, + ); + name = Classes; + sourceTree = ""; + }; + CAE698F31E968E28000394B0 /* Services */ = { + isa = PBXGroup; + children = ( + CAE698F41E968E3D000394B0 /* BaseUserService.swift */, + ); + name = Services; + sourceTree = ""; + }; + CAE698F81E968F56000394B0 /* Extensions */ = { + isa = PBXGroup; + children = ( + CAE698F91E968F78000394B0 /* UserDefaults+UserService.swift */, + ); + name = Extensions; + sourceTree = ""; + }; + CAE699011E9693DE000394B0 /* Enums */ = { + isa = PBXGroup; + children = ( + CAE699021E9693F4000394B0 /* ConnectionError.swift */, + CAE699061E96956D000394B0 /* ApiError.swift */, + ); + name = Enums; + sourceTree = ""; + }; + F8A65FEC7C0EB4B93746E50F /* Pods */ = { + isa = PBXGroup; + children = ( + 53E343F9E8F0A27C6114C160 /* Pods-LeadKitAdditions.debug.xcconfig */, + 8A48492D1BE72C6D161A6E8E /* Pods-LeadKitAdditions.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + CAE698E01E968820000394B0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + CAE698E81E968820000394B0 /* LeadKitAdditions.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + CAE698E21E968820000394B0 /* LeadKitAdditions */ = { + isa = PBXNativeTarget; + buildConfigurationList = CAE698EB1E968820000394B0 /* Build configuration list for PBXNativeTarget "LeadKitAdditions" */; + buildPhases = ( + E8E82E34792B38EF225575D7 /* [CP] Check Pods Manifest.lock */, + CAE698DE1E968820000394B0 /* Sources */, + CAE698DF1E968820000394B0 /* Frameworks */, + CAE698E01E968820000394B0 /* Headers */, + CAE698E11E968820000394B0 /* Resources */, + 94F6E1BA5AD68C6E2F10062B /* [CP] Copy Pods Resources */, + CAE6990A1E969A7A000394B0 /* Swiftlint */, + CAE6990B1E969A8D000394B0 /* Tailor */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = LeadKitAdditions; + productName = LeadKitAdditions; + productReference = CAE698E31E968820000394B0 /* LeadKitAdditions.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CAE698DA1E968820000394B0 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = TouchInstinct; + TargetAttributes = { + CAE698E21E968820000394B0 = { + CreatedOnToolsVersion = 8.3; + LastSwiftMigration = 0830; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = CAE698DD1E968820000394B0 /* Build configuration list for PBXProject "LeadKitAdditions" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = CAE698D91E968820000394B0; + productRefGroup = CAE698E41E968820000394B0 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CAE698E21E968820000394B0 /* LeadKitAdditions */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + CAE698E11E968820000394B0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 94F6E1BA5AD68C6E2F10062B /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-LeadKitAdditions/Pods-LeadKitAdditions-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + CAE6990A1E969A7A000394B0 /* Swiftlint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = Swiftlint; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; + }; + CAE6990B1E969A8D000394B0 /* Tailor */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = Tailor; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if hash tailor 2>/dev/null; then\n tailor\nelse\n echo \"warning: Please install Tailor from https://tailor.sh\"\nfi"; + }; + E8E82E34792B38EF225575D7 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + CAE698DE1E968820000394B0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CAE698FB1E968F78000394B0 /* UserDefaults+UserService.swift in Sources */, + CAE698FF1E969352000394B0 /* ApiResponse.swift in Sources */, + CAE698F11E968BA6000394B0 /* BaseDateFormatter.swift in Sources */, + CAE699041E9693F4000394B0 /* ConnectionError.swift in Sources */, + CAE698F61E968E3D000394B0 /* BaseUserService.swift in Sources */, + CAE699081E96956D000394B0 /* ApiError.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + CAE698E91E968820000394B0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_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_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + CAE698EA1E968820000394B0 /* 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++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_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_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + CAE698EC1E968820000394B0 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 53E343F9E8F0A27C6114C160 /* Pods-LeadKitAdditions.debug.xcconfig */; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = LeadKitAdditions/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = touchinstinct.LeadKitAdditions; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + CAE698ED1E968820000394B0 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8A48492D1BE72C6D161A6E8E /* Pods-LeadKitAdditions.release.xcconfig */; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = LeadKitAdditions/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = touchinstinct.LeadKitAdditions; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CAE698DD1E968820000394B0 /* Build configuration list for PBXProject "LeadKitAdditions" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CAE698E91E968820000394B0 /* Debug */, + CAE698EA1E968820000394B0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CAE698EB1E968820000394B0 /* Build configuration list for PBXNativeTarget "LeadKitAdditions" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CAE698EC1E968820000394B0 /* Debug */, + CAE698ED1E968820000394B0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = CAE698DA1E968820000394B0 /* Project object */; +} diff --git a/LeadKitAdditions/LeadKitAdditions.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/LeadKitAdditions/LeadKitAdditions.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d5882ff --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/LeadKitAdditions/LeadKitAdditions.xcworkspace/contents.xcworkspacedata b/LeadKitAdditions/LeadKitAdditions.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1cbee7f --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/LeadKitAdditions/LeadKitAdditions/Classes/ApiResponse.swift b/LeadKitAdditions/LeadKitAdditions/Classes/ApiResponse.swift new file mode 100644 index 0000000..0ae972d --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions/Classes/ApiResponse.swift @@ -0,0 +1,44 @@ +// +// Copyright (c) 2017 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import ObjectMapper + +public class ApiResponse: ApiResponseProtocol, ImmutableMappable { + + public let result: Any? + public let errorCode: Int + public let errorMessage: String? + + public required init(map: Map) throws { + result = try? map.value("result") + errorCode = try map.value("error_code") + errorMessage = try? map.value("error_message") + } + +} + +public protocol ApiResponseProtocol: ImmutableMappable { + + var errorCode: Int { get } + var errorMessage: String? { get } + +} diff --git a/LeadKitAdditions/LeadKitAdditions/Classes/BaseDateFormatter.swift b/LeadKitAdditions/LeadKitAdditions/Classes/BaseDateFormatter.swift new file mode 100644 index 0000000..0704e8d --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions/Classes/BaseDateFormatter.swift @@ -0,0 +1,109 @@ +// +// Copyright (c) 2017 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation +import ObjectMapper + +open class BaseDateFormatter { + + private static let apiDateTimeFormat = "yyyy-MM-dd'T'HH:mm:ssZ" + private static let apiDateWithoutTimeFormat = "yyyy-MM-dd'T'Z" + private static let hourAndMinuteDateTimeFormat = "HH:mm" + private static let dayAndMonthDateTimeFormat = "dd MMM" + private static let dayMonthYearDateTimeFormat = "dd.MM.yyyy" + + private static let apiFormatter: DateFormatter = { + let dateFormatter = DateFormatter() + dateFormatter.locale = Locale.current + dateFormatter.dateFormat = BaseDateFormatter.apiDateTimeFormat + return dateFormatter + }() + + private static let apiDateWithoutTimeFormatter: DateFormatter = { + let dateFormatter = DateFormatter() + dateFormatter.locale = Locale.current + dateFormatter.dateFormat = BaseDateFormatter.apiDateWithoutTimeFormat + return dateFormatter + }() + + private static let hourAndMinuteFormatter: DateFormatter = { + let dateFormater = DateFormatter() + dateFormater.locale = Locale.current + dateFormater.dateFormat = BaseDateFormatter.hourAndMinuteDateTimeFormat + return dateFormater + }() + + private static let dayAndMonthFormatter: DateFormatter = { + let dateFormater = DateFormatter() + dateFormater.locale = Locale.current + dateFormater.dateFormat = BaseDateFormatter.dayAndMonthDateTimeFormat + return dateFormater + }() + + private static let dayMonthYearFormatter: DateFormatter = { + let dateFormater = DateFormatter() + dateFormater.locale = Locale.current + dateFormater.dateFormat = BaseDateFormatter.dayMonthYearDateTimeFormat + return dateFormater + }() + + // MARK: Internal functions + + public static func backendDate(fromStrDate strDate: String) -> Date? { + return BaseDateFormatter.apiFormatter.date(from: strDate) + } + + public static func backendStrDate(withDate date: Date) -> String { + return BaseDateFormatter.apiFormatter.string(from: date) + } + + public static func backendDateWithoutTime(withDate date: Date) -> String { + return BaseDateFormatter.apiDateWithoutTimeFormatter.string(from: date) + } + + public static func hourAndMinuteStrDate(withDate date: Date) -> String { + return BaseDateFormatter.hourAndMinuteFormatter.string(from: date) + } + + public static func dayMonthYearStrDate(withDate date: Date) -> String { + return BaseDateFormatter.dayMonthYearFormatter.string(from: date) + } + + // MARK: - Transformers + + public static var transformFromStringToDate: TransformOf { + return TransformOf(fromJSON: { (stringValue) -> Date? in + if let stringValue = stringValue { + return BaseDateFormatter.backendDate(fromStrDate: stringValue) + } else { + return nil + } + }, toJSON: { (dateValue) -> String? in + if let dateValue = dateValue { + return BaseDateFormatter.backendStrDate(withDate: dateValue) + } else { + return nil + } + }) + } + +} diff --git a/LeadKitAdditions/LeadKitAdditions/Enums/ApiError.swift b/LeadKitAdditions/LeadKitAdditions/Enums/ApiError.swift new file mode 100644 index 0000000..27e7559 --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions/Enums/ApiError.swift @@ -0,0 +1,51 @@ +// +// Copyright (c) 2017 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +public enum ApiError: Error { + + case error(code: Int, message: String) + case none + +} + +extension ApiError: LocalizedError { + + public init(apiResponse: ApiResponseProtocol) { + if apiResponse.errorCode != 0, let message = apiResponse.errorMessage { + self = ApiError.error(code: apiResponse.errorCode, message: message) + } else { + self = ApiError.none + } + } + + public var errorDescription: String? { + switch self { + case .error(_, let message): + return message + case .none: + return nil + } + } + +} diff --git a/LeadKitAdditions/LeadKitAdditions/Enums/ConnectionError.swift b/LeadKitAdditions/LeadKitAdditions/Enums/ConnectionError.swift new file mode 100644 index 0000000..3f7de53 --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions/Enums/ConnectionError.swift @@ -0,0 +1,29 @@ +// +// Copyright (c) 2017 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +enum ConnectionError: LocalizedError { + + case noConnection + +} diff --git a/LeadKitAdditions/LeadKitAdditions/Extensions/UserDefaults+UserService.swift b/LeadKitAdditions/LeadKitAdditions/Extensions/UserDefaults+UserService.swift new file mode 100644 index 0000000..15ac6c2 --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions/Extensions/UserDefaults+UserService.swift @@ -0,0 +1,50 @@ +// +// Copyright (c) 2017 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +fileprivate enum Keys { + static let sessionId = "sessionId" + static let userLogin = "userLogin" +} + +public extension UserDefaults { + + public var sessionId: String? { + get { + return string(forKey: Keys.sessionId) + } + set { + set(newValue, forKey: Keys.sessionId) + } + } + + public var userLogin: String? { + get { + return string(forKey: Keys.userLogin) + } + set { + set(newValue, forKey: Keys.userLogin) + } + } + +} diff --git a/LeadKitAdditions/LeadKitAdditions/Info.plist b/LeadKitAdditions/LeadKitAdditions/Info.plist new file mode 100644 index 0000000..259d58e --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.0.1 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/LeadKitAdditions/LeadKitAdditions/LeadKitAdditions.h b/LeadKitAdditions/LeadKitAdditions/LeadKitAdditions.h new file mode 100644 index 0000000..2f95fe8 --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions/LeadKitAdditions.h @@ -0,0 +1,19 @@ +// +// LeadKitAdditions.h +// LeadKitAdditions +// +// Created by Nikolai Ashanin on 06.04.17. +// Copyright © 2017 TouchInstinct. All rights reserved. +// + +#import + +//! Project version number for LeadKitAdditions. +FOUNDATION_EXPORT double LeadKitAdditionsVersionNumber; + +//! Project version string for LeadKitAdditions. +FOUNDATION_EXPORT const unsigned char LeadKitAdditionsVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/LeadKitAdditions/LeadKitAdditions/Services/BaseUserService.swift b/LeadKitAdditions/LeadKitAdditions/Services/BaseUserService.swift new file mode 100644 index 0000000..e857cb5 --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions/Services/BaseUserService.swift @@ -0,0 +1,54 @@ +// +// Copyright (c) 2017 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import RxSwift +import LeadKit + +open class BaseUserService { + + open var userLogin: String { + guard let defaultsLogin = UserDefaults.standard.userLogin else { + assertionFailure("userLogin is nil. Use isLoggedIn before read userLogin") + return "" + } + + return defaultsLogin + } + + open var sessionId: String { + guard let defaultsSessionId = UserDefaults.standard.sessionId else { + assertionFailure("sessionId is nil. Use isLoggedIn before read sessionId") + return "" + } + return defaultsSessionId + } + + open var isLoggedIn: Bool { + return UserDefaults.standard.sessionId != nil + } + + open class func clearData() { + UserDefaults.standard.sessionId = nil + UserDefaults.standard.userLogin = nil + } + +} diff --git a/LeadKitAdditions/Podfile b/LeadKitAdditions/Podfile new file mode 100644 index 0000000..eac08a6 --- /dev/null +++ b/LeadKitAdditions/Podfile @@ -0,0 +1,21 @@ +source "https://github.com/CocoaPods/Specs.git" +source "https://github.com/TouchInstinct/Podspecs.git" + +platform :ios, '9.0' + +target 'LeadKitAdditions' do + use_frameworks! + + pod "CocoaLumberjack/Swift", '~> 3.1.0' + pod "RxSwift", '3.2.0' + pod "RxCocoa", '3.2.0' + pod "RxAlamofire", '3.0.0' + pod "ObjectMapper", '~> 2.1' + pod "Toast-Swift", '~> 2.0.0' + pod "LeadKit" + pod "TableKit" + +end + +# If you have slow HDD +ENV['COCOAPODS_DISABLE_STATS'] = "true" diff --git a/LeadKitAdditions/Podfile.lock b/LeadKitAdditions/Podfile.lock new file mode 100644 index 0000000..5861e9e --- /dev/null +++ b/LeadKitAdditions/Podfile.lock @@ -0,0 +1,48 @@ +PODS: + - Alamofire (4.4.0) + - CocoaLumberjack/Default (3.1.0) + - CocoaLumberjack/Swift (3.1.0): + - CocoaLumberjack/Default + - LeadKit (0.4.6): + - CocoaLumberjack/Swift (~> 3.1.0) + - ObjectMapper (~> 2.1) + - RxAlamofire (= 3.0.0) + - RxCocoa (= 3.2.0) + - RxSwift (= 3.2.0) + - Toast-Swift (~> 2.0.0) + - ObjectMapper (2.2.5) + - RxAlamofire (3.0.0): + - RxAlamofire/Core (= 3.0.0) + - RxAlamofire/Core (3.0.0): + - Alamofire (~> 4.0) + - RxSwift (~> 3.0) + - RxCocoa (3.2.0): + - RxSwift (~> 3.1) + - RxSwift (3.2.0) + - TableKit (2.3.1) + - Toast-Swift (2.0.0) + +DEPENDENCIES: + - CocoaLumberjack/Swift (~> 3.1.0) + - LeadKit + - ObjectMapper (~> 2.1) + - RxAlamofire (= 3.0.0) + - RxCocoa (= 3.2.0) + - RxSwift (= 3.2.0) + - TableKit + - Toast-Swift (~> 2.0.0) + +SPEC CHECKSUMS: + Alamofire: dc44b1600b800eb63da6a19039a0083d62a6a62d + CocoaLumberjack: 8311463ddf9ee86a06ef92a071dd656c89244500 + LeadKit: 00f7b16febbed12d29b05c14bd8b5ba4fb9c01ac + ObjectMapper: fb30f71e08470d1e5a20b199fafe1246281db898 + RxAlamofire: 0b1fa48f545fffe7f7a28af2086bcaa3b5946cc9 + RxCocoa: ccdf43101a70407097a29082f648ba1676075b30 + RxSwift: 46574f70d416b7923c237195939cc488a7fbf3a0 + TableKit: 02e041b443f75fa3e9f1ee6024d4b256305bd904 + Toast-Swift: 5b2f8f720f7e78e48511f693df1f9c9a6e38a25a + +PODFILE CHECKSUM: 29a03af2241e08742796fb1812bb8d084f03bafe + +COCOAPODS: 1.2.0