From ceba7a4314949770cf2575fcb48975a3266cc5bc Mon Sep 17 00:00:00 2001 From: Stephen Celis Date: Mon, 17 Dec 2018 10:27:12 -0500 Subject: [PATCH] 40 --- .../project.pbxproj | 544 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../EpisodesViewController.swift | 200 +++++++ .../PointFreeFramework/Info.plist | 22 + .../PointFreeFramework/Model.swift | 70 +++ .../PointFreeFramework/PointFreeFramework.h | 3 + .../PointFreeFramework/StyleGuide.swift | 82 +++ .../PointFreeFramework/Utils.swift | 75 +++ .../PointFreeFrameworkTests/Helpers.swift | 221 +++++++ .../PointFreeFrameworkTests/Info.plist | 22 + .../PointFreeFrameworkTests.swift | 65 +++ .../SnapshotTestCase.swift | 168 ++++++ .../testEpisodesView.png | Bin 0 -> 130193 bytes .../testEpisodesView.txt | 42 ++ .../PointFreeFrameworkTests/testGreeting.png | 4 + .../PointFreeFrameworkTests/testGreeting.txt | 4 + .../PointFreeFrameworkTests/testWebView.png | Bin 0 -> 37903 bytes 0040-async-functional-refactoring/README.md | 5 + README.md | 1 + 20 files changed, 1543 insertions(+) create mode 100644 0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.pbxproj create mode 100644 0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 0040-async-functional-refactoring/PointFreeFramework/EpisodesViewController.swift create mode 100644 0040-async-functional-refactoring/PointFreeFramework/Info.plist create mode 100644 0040-async-functional-refactoring/PointFreeFramework/Model.swift create mode 100644 0040-async-functional-refactoring/PointFreeFramework/PointFreeFramework.h create mode 100644 0040-async-functional-refactoring/PointFreeFramework/StyleGuide.swift create mode 100644 0040-async-functional-refactoring/PointFreeFramework/Utils.swift create mode 100644 0040-async-functional-refactoring/PointFreeFrameworkTests/Helpers.swift create mode 100644 0040-async-functional-refactoring/PointFreeFrameworkTests/Info.plist create mode 100644 0040-async-functional-refactoring/PointFreeFrameworkTests/PointFreeFrameworkTests.swift create mode 100644 0040-async-functional-refactoring/PointFreeFrameworkTests/SnapshotTestCase.swift create mode 100644 0040-async-functional-refactoring/PointFreeFrameworkTests/__Snapshots__/PointFreeFrameworkTests/testEpisodesView.png create mode 100644 0040-async-functional-refactoring/PointFreeFrameworkTests/__Snapshots__/PointFreeFrameworkTests/testEpisodesView.txt create mode 100644 0040-async-functional-refactoring/PointFreeFrameworkTests/__Snapshots__/PointFreeFrameworkTests/testGreeting.png create mode 100644 0040-async-functional-refactoring/PointFreeFrameworkTests/__Snapshots__/PointFreeFrameworkTests/testGreeting.txt create mode 100644 0040-async-functional-refactoring/PointFreeFrameworkTests/__Snapshots__/PointFreeFrameworkTests/testWebView.png create mode 100644 0040-async-functional-refactoring/README.md diff --git a/0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.pbxproj b/0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.pbxproj new file mode 100644 index 00000000..bd813671 --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.pbxproj @@ -0,0 +1,544 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 800BF4D321C4114C009790D3 /* SnapshotTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 800BF4CE21C4114C009790D3 /* SnapshotTestCase.swift */; }; + 80B19C0A218AA36400910016 /* PointFreeFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80B19C00218AA36400910016 /* PointFreeFramework.framework */; }; + 80B19C0F218AA36400910016 /* PointFreeFrameworkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80B19C0E218AA36400910016 /* PointFreeFrameworkTests.swift */; }; + 80B19C11218AA36400910016 /* PointFreeFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 80B19C03218AA36400910016 /* PointFreeFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 80B19C1B218AA40200910016 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80B19C1A218AA40200910016 /* Helpers.swift */; }; + 80B19C35218AA47400910016 /* Overture.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80B19C2C218AA45800910016 /* Overture.framework */; }; + 80B19C41218B3B6900910016 /* EpisodesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80B19C3C218B3B6900910016 /* EpisodesViewController.swift */; }; + 80B19C45218B3B7800910016 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80B19C42218B3B7800910016 /* Utils.swift */; }; + 80B19C46218B3B7800910016 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80B19C43218B3B7800910016 /* Model.swift */; }; + 80B19C47218B3B7800910016 /* StyleGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80B19C44218B3B7800910016 /* StyleGuide.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 80B19C0B218AA36400910016 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 80B19BF7218AA36400910016 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 80B19BFF218AA36400910016; + remoteInfo = PointFreeFramework; + }; + 80B19C2B218AA45800910016 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 80B19C24218AA45800910016 /* Overture.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = "Overture::Overture::Product"; + remoteInfo = Overture; + }; + 80B19C2D218AA45800910016 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 80B19C24218AA45800910016 /* Overture.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = "Overture::OvertureTests::Product"; + remoteInfo = OvertureTests; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 800BF4CE21C4114C009790D3 /* SnapshotTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapshotTestCase.swift; sourceTree = ""; }; + 80B19C00218AA36400910016 /* PointFreeFramework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PointFreeFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 80B19C03218AA36400910016 /* PointFreeFramework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PointFreeFramework.h; sourceTree = ""; }; + 80B19C04218AA36400910016 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 80B19C09218AA36400910016 /* PointFreeFrameworkTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PointFreeFrameworkTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 80B19C0E218AA36400910016 /* PointFreeFrameworkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PointFreeFrameworkTests.swift; sourceTree = ""; }; + 80B19C10218AA36400910016 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 80B19C1A218AA40200910016 /* Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; }; + 80B19C24218AA45800910016 /* Overture.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Overture.xcodeproj; path = "../0017-styling-pt2/Vendor/swift-overture/Overture.xcodeproj"; sourceTree = ""; }; + 80B19C3C218B3B6900910016 /* EpisodesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EpisodesViewController.swift; sourceTree = ""; }; + 80B19C42218B3B7800910016 /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; + 80B19C43218B3B7800910016 /* Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; + 80B19C44218B3B7800910016 /* StyleGuide.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyleGuide.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 80B19BFD218AA36400910016 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 80B19C35218AA47400910016 /* Overture.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 80B19C06218AA36400910016 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 80B19C0A218AA36400910016 /* PointFreeFramework.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 80B19BF6218AA36400910016 = { + isa = PBXGroup; + children = ( + 80B19C02218AA36400910016 /* PointFreeFramework */, + 80B19C0D218AA36400910016 /* PointFreeFrameworkTests */, + 80B19C01218AA36400910016 /* Products */, + 80B19C30218AA47400910016 /* Frameworks */, + 80B19C24218AA45800910016 /* Overture.xcodeproj */, + ); + sourceTree = ""; + }; + 80B19C01218AA36400910016 /* Products */ = { + isa = PBXGroup; + children = ( + 80B19C00218AA36400910016 /* PointFreeFramework.framework */, + 80B19C09218AA36400910016 /* PointFreeFrameworkTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 80B19C02218AA36400910016 /* PointFreeFramework */ = { + isa = PBXGroup; + children = ( + 80B19C03218AA36400910016 /* PointFreeFramework.h */, + 80B19C04218AA36400910016 /* Info.plist */, + 80B19C3C218B3B6900910016 /* EpisodesViewController.swift */, + 80B19C43218B3B7800910016 /* Model.swift */, + 80B19C44218B3B7800910016 /* StyleGuide.swift */, + 80B19C42218B3B7800910016 /* Utils.swift */, + ); + path = PointFreeFramework; + sourceTree = ""; + }; + 80B19C0D218AA36400910016 /* PointFreeFrameworkTests */ = { + isa = PBXGroup; + children = ( + 80B19C1A218AA40200910016 /* Helpers.swift */, + 80B19C0E218AA36400910016 /* PointFreeFrameworkTests.swift */, + 800BF4CE21C4114C009790D3 /* SnapshotTestCase.swift */, + 80B19C10218AA36400910016 /* Info.plist */, + ); + path = PointFreeFrameworkTests; + sourceTree = ""; + }; + 80B19C25218AA45800910016 /* Products */ = { + isa = PBXGroup; + children = ( + 80B19C2C218AA45800910016 /* Overture.framework */, + 80B19C2E218AA45800910016 /* OvertureTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 80B19C30218AA47400910016 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 80B19BFB218AA36400910016 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 80B19C11218AA36400910016 /* PointFreeFramework.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 80B19BFF218AA36400910016 /* PointFreeFramework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 80B19C14218AA36400910016 /* Build configuration list for PBXNativeTarget "PointFreeFramework" */; + buildPhases = ( + 80B19BFB218AA36400910016 /* Headers */, + 80B19BFC218AA36400910016 /* Sources */, + 80B19BFD218AA36400910016 /* Frameworks */, + 80B19BFE218AA36400910016 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PointFreeFramework; + productName = PointFreeFramework; + productReference = 80B19C00218AA36400910016 /* PointFreeFramework.framework */; + productType = "com.apple.product-type.framework"; + }; + 80B19C08218AA36400910016 /* PointFreeFrameworkTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 80B19C17218AA36400910016 /* Build configuration list for PBXNativeTarget "PointFreeFrameworkTests" */; + buildPhases = ( + 80B19C05218AA36400910016 /* Sources */, + 80B19C06218AA36400910016 /* Frameworks */, + 80B19C07218AA36400910016 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 80B19C0C218AA36400910016 /* PBXTargetDependency */, + ); + name = PointFreeFrameworkTests; + productName = PointFreeFrameworkTests; + productReference = 80B19C09218AA36400910016 /* PointFreeFrameworkTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 80B19BF7218AA36400910016 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1010; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Point-Free Inc."; + TargetAttributes = { + 80B19BFF218AA36400910016 = { + CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1010; + }; + 80B19C08218AA36400910016 = { + CreatedOnToolsVersion = 10.1; + }; + }; + }; + buildConfigurationList = 80B19BFA218AA36400910016 /* Build configuration list for PBXProject "PointFreeFramework" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 80B19BF6218AA36400910016; + productRefGroup = 80B19C01218AA36400910016 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 80B19C25218AA45800910016 /* Products */; + ProjectRef = 80B19C24218AA45800910016 /* Overture.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 80B19BFF218AA36400910016 /* PointFreeFramework */, + 80B19C08218AA36400910016 /* PointFreeFrameworkTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 80B19C2C218AA45800910016 /* Overture.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Overture.framework; + remoteRef = 80B19C2B218AA45800910016 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 80B19C2E218AA45800910016 /* OvertureTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = file; + path = OvertureTests.xctest; + remoteRef = 80B19C2D218AA45800910016 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 80B19BFE218AA36400910016 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 80B19C07218AA36400910016 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 80B19BFC218AA36400910016 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 80B19C47218B3B7800910016 /* StyleGuide.swift in Sources */, + 80B19C45218B3B7800910016 /* Utils.swift in Sources */, + 80B19C41218B3B6900910016 /* EpisodesViewController.swift in Sources */, + 80B19C46218B3B7800910016 /* Model.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 80B19C05218AA36400910016 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 80B19C0F218AA36400910016 /* PointFreeFrameworkTests.swift in Sources */, + 800BF4D321C4114C009790D3 /* SnapshotTestCase.swift in Sources */, + 80B19C1B218AA40200910016 /* Helpers.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 80B19C0C218AA36400910016 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 80B19BFF218AA36400910016 /* PointFreeFramework */; + targetProxy = 80B19C0B218AA36400910016 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 80B19C12218AA36400910016 /* 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++14"; + CLANG_CXX_LIBRARY = "libc++"; + 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_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_IDENTITY = "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 = 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; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 80B19C13218AA36400910016 /* 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++14"; + CLANG_CXX_LIBRARY = "libc++"; + 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_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_IDENTITY = "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 = 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; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 80B19C15218AA36400910016 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = PointFreeFramework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.PointFreeFramework; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 80B19C16218AA36400910016 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = PointFreeFramework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.PointFreeFramework; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 80B19C18218AA36400910016 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = PointFreeFrameworkTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.PointFreeFrameworkTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 80B19C19218AA36400910016 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = PointFreeFrameworkTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = co.pointfree.PointFreeFrameworkTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 80B19BFA218AA36400910016 /* Build configuration list for PBXProject "PointFreeFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 80B19C12218AA36400910016 /* Debug */, + 80B19C13218AA36400910016 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 80B19C14218AA36400910016 /* Build configuration list for PBXNativeTarget "PointFreeFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 80B19C15218AA36400910016 /* Debug */, + 80B19C16218AA36400910016 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 80B19C17218AA36400910016 /* Build configuration list for PBXNativeTarget "PointFreeFrameworkTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 80B19C18218AA36400910016 /* Debug */, + 80B19C19218AA36400910016 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 80B19BF7218AA36400910016 /* Project object */; +} diff --git a/0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..47823c02 --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFramework.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/0040-async-functional-refactoring/PointFreeFramework/EpisodesViewController.swift b/0040-async-functional-refactoring/PointFreeFramework/EpisodesViewController.swift new file mode 100644 index 00000000..8c0ddb3c --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFramework/EpisodesViewController.swift @@ -0,0 +1,200 @@ +import Foundation +import UIKit +import Overture + +final class SubscribeCalloutCell: UITableViewCell { + private let bodyLabel = UILabel() + private let buttonsStackView = UIStackView() + private let cardView = UIView() + private let loginButton = UIButton() + private let orLabel = UILabel() + private let rootStackView = UIStackView() + private let subscribeButton = UIButton() + private let titleLabel = UILabel() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + self.selectionStyle = .none + self.contentView.layoutMargins = .init(top: .pf_grid(6), left: .pf_grid(6), bottom: .pf_grid(6), right: .pf_grid(6)) + + self.titleLabel.text = "Subscribe to Point-Free" + self.titleLabel.font = UIFont.preferredFont(forTextStyle: .title3) + + self.bodyLabel.text = "👋 Hey there! See anything you like? You may be interested in subscribing so that you get access to these episodes and all future ones." + self.bodyLabel.numberOfLines = 0 + self.bodyLabel.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.subheadline) + + self.cardView.backgroundColor = UIColor(white: 0.96, alpha: 1.0) + with(self.cardView, generousMargins) + self.cardView.translatesAutoresizingMaskIntoConstraints = false + self.contentView.addSubview(self.cardView) + + self.rootStackView.alignment = .leading + with(self.rootStackView, baseStackViewStyle) + self.rootStackView.addArrangedSubview(self.titleLabel) + self.rootStackView.addArrangedSubview(self.bodyLabel) + self.rootStackView.addArrangedSubview(self.buttonsStackView) + self.contentView.addSubview(self.rootStackView) + + self.orLabel.text = "or" + self.orLabel.font = UIFont.preferredFont(forTextStyle: .subheadline) + + self.subscribeButton.setTitle("See subscription options", for: .normal) + with(self.subscribeButton, primaryButtonStyle) + + self.loginButton.setTitle("Login", for: .normal) + with(self.loginButton, secondaryTextButtonStyle) + + self.buttonsStackView.spacing = .pf_grid(2) + self.buttonsStackView.alignment = .firstBaseline + self.buttonsStackView.addArrangedSubview(self.subscribeButton) + self.buttonsStackView.addArrangedSubview(self.orLabel) + self.buttonsStackView.addArrangedSubview(self.loginButton) + + NSLayoutConstraint.activate([ + self.rootStackView.leadingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.leadingAnchor), + self.rootStackView.topAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.topAnchor), + self.rootStackView.trailingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.trailingAnchor), + self.rootStackView.bottomAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.bottomAnchor), + + self.cardView.leadingAnchor.constraint(equalTo: self.rootStackView.leadingAnchor), + self.cardView.topAnchor.constraint(equalTo: self.rootStackView.topAnchor), + self.cardView.trailingAnchor.constraint(equalTo: self.rootStackView.trailingAnchor), + self.cardView.bottomAnchor.constraint(equalTo: self.rootStackView.bottomAnchor), + ]) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +final class EpisodeCell: UITableViewCell { + private let blurbLabel = UILabel() + private let contentStackView = UIStackView() + private let posterImageView = UIImageView() + private let rootStackView = UIStackView() + private let sequenceAndDateLabel = UILabel() + private let subscriberOnlyLabel = UILabel() + private lazy var subscriberOnlyLabelWrapper = with( + wrapView( + padding: UIEdgeInsets( + top: .pf_grid(1), + left: .pf_grid(2), + bottom: .pf_grid(1), + right: .pf_grid(2) + ) + )(self.subscriberOnlyLabel), + concat( + autoLayoutStyle, + baseRoundedStyle, + mut(\UIView.backgroundColor, UIColor(white: 0, alpha: 0.3)) + ) + ) + + private let titleLabel = UILabel() + private let watchNowButton = UIButton() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + self.blurbLabel.numberOfLines = 0 + self.blurbLabel.font = UIFont.preferredFont(forTextStyle: .subheadline) + + with(self.contentStackView, concat( + baseStackViewStyle, + mut(\.layoutMargins.bottom, .pf_grid(8)) + )) + self.contentStackView.alignment = .leading + self.contentStackView.addArrangedSubview(self.sequenceAndDateLabel) + self.contentStackView.addArrangedSubview(self.titleLabel) + self.contentStackView.addArrangedSubview(self.blurbLabel) + self.contentStackView.addArrangedSubview(self.watchNowButton) + + with(self.rootStackView, concat( + autoLayoutStyle, + verticalStackView + )) + self.rootStackView.addArrangedSubview(self.posterImageView) + self.rootStackView.addArrangedSubview(self.contentStackView) + + with(self.sequenceAndDateLabel, smallCapsLabelStyle) + + self.titleLabel.font = UIFont.preferredFont(forTextStyle: .title2) + + self.watchNowButton.setTitle("Watch episode →", for: .normal) + with(self.watchNowButton, primaryTextButtonStyle) + + self.subscriberOnlyLabel.text = "Subscriber Only" + with(self.subscriberOnlyLabel, concat( + smallCapsLabelStyle, + mut(\.textColor, .white) + )) + + self.contentView.addSubview(self.rootStackView) +// self.contentView.addSubview(self.subscriberOnlyLabelWrapper) + + NSLayoutConstraint.activate([ + self.rootStackView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor), + self.rootStackView.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor), + self.rootStackView.topAnchor.constraint(equalTo: self.contentView.topAnchor), + self.rootStackView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor), + + self.posterImageView.widthAnchor.constraint(equalTo: self.posterImageView.heightAnchor, multiplier: 16/9), + +// self.subscriberOnlyLabelWrapper.topAnchor.constraint(equalTo: self.posterImageView.topAnchor, constant: .pf_grid(3)), +// self.subscriberOnlyLabelWrapper.trailingAnchor.constraint(equalTo: self.posterImageView.trailingAnchor, constant: -.pf_grid(6)), + ]) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func configure(with episode: Episode) { + self.posterImageView.backgroundColor = episode.color + self.titleLabel.text = episode.title + self.blurbLabel.text = episode.blurb + let formattedDate = episodeDateFormatter.string(from: episode.publishedAt) + self.sequenceAndDateLabel.text = "#\(episode.sequence) • \(formattedDate)" + self.subscriberOnlyLabelWrapper.isHidden = !episode.subscriberOnly + + URLSession.shared.dataTask(with: URL(string: episode.posterImageUrl)!) { data, _, _ in + DispatchQueue.main.async { self.posterImageView.image = data.flatMap(UIImage.init(data:)) } + }.resume() + } +} + +public final class EpisodeListViewController: UITableViewController { + let episodes: [Episode] + + init(episodes: Episodes) where Episodes.Element == Episode { + self.episodes = Array(episodes) + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override public func viewDidLoad() { + super.viewDidLoad() + self.tableView.estimatedRowHeight = 400 + self.tableView.rowHeight = UITableView.automaticDimension + } + + override public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + if indexPath.row == 0 { + return SubscribeCalloutCell(style: .default, reuseIdentifier: nil) + } + + let cell = EpisodeCell(style: .default, reuseIdentifier: nil) + cell.configure(with: self.episodes[indexPath.row - 1]) + return cell + } + + override public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.episodes.count + 1 + } +} diff --git a/0040-async-functional-refactoring/PointFreeFramework/Info.plist b/0040-async-functional-refactoring/PointFreeFramework/Info.plist new file mode 100644 index 00000000..e1fe4cfb --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFramework/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/0040-async-functional-refactoring/PointFreeFramework/Model.swift b/0040-async-functional-refactoring/PointFreeFramework/Model.swift new file mode 100644 index 00000000..2b3e7d8f --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFramework/Model.swift @@ -0,0 +1,70 @@ +import Foundation +import UIKit + +public struct Episode { + public let blurb: String + public let color: UIColor + public let posterImageUrl: String + public let publishedAt: Date + public let sequence: Int + public let subscriberOnly: Bool + public let title: String +} + +public let episodes: [Episode] = [ +// .init( +// blurb: """ +//What does the Swift type system have to do with algebra? A lot! We’ll begin to explore this correspondence and see how it can help us create type-safe data structures that can catch runtime errors at compile time. +//""", +// color: .pf_yellow, +// posterImageUrl: "https://d1hf1soyumxcgv.cloudfront.net/0004-adt/0004-poster.jpg", +// publishedAt: Date(timeIntervalSince1970: 1_519_045_951), +// sequence: 4, +// subscriberOnly: true, +// title: "Algebraic Data Types" +// ), + .init( + blurb: """ +We bring tools from previous episodes down to earth and apply them to an everyday task: UIKit styling. Plain functions unlock worlds of composability and reusability in styling of UI components. Have we finally solved the styling problem? +""", + color: .pf_purple, + posterImageUrl: "https://d1hf1soyumxcgv.cloudfront.net/0003-styling-with-functions/0003-poster.jpg", + publishedAt: Date(timeIntervalSince1970: 1_519_045_951), + sequence: 3, + subscriberOnly: false, + title: "UIKit Styling with Functions" + ), + .init( + blurb: """ +Side effects: can’t live with ’em; can’t write a program without ’em. Let’s explore a few kinds of side effects we encounter every day, why they make code difficult to reason about and test, and how we can control them without losing composition. +""", + color: .pf_blue, + posterImageUrl: "https://d1hf1soyumxcgv.cloudfront.net/0002-side-effects/0002-poster.jpg", + publishedAt: Date(timeIntervalSince1970: 1_517_811_069), + sequence: 2, + subscriberOnly: false, + title: "Side Effects" + ), + .init( + blurb: """ +Our first episode is all about functions! We talk a bit about what makes functions special, contrasting them with the way we usually write code, and have some exploratory discussions about operators and composition. +""", + color: .pf_green, + posterImageUrl: "https://d1hf1soyumxcgv.cloudfront.net/0001-functions/0001-poster.jpg", + publishedAt: Date(timeIntervalSince1970: 1_517_206_269), + sequence: 1, + subscriberOnly: false, + title: "Functions" + ), + .init( + blurb: """ +Point-Free is here, bringing you videos covering functional programming concepts using the Swift language. Take a moment to hear from the hosts about what to expect from this new series. +""", + color: .pf_yellow, + posterImageUrl: "https://d1hf1soyumxcgv.cloudfront.net/0000-introduction/0000-poster.jpg", + publishedAt: Date(timeIntervalSince1970: 1_517_206_269), + sequence: 0, + subscriberOnly: false, + title: "We launched!" + ), +] diff --git a/0040-async-functional-refactoring/PointFreeFramework/PointFreeFramework.h b/0040-async-functional-refactoring/PointFreeFramework/PointFreeFramework.h new file mode 100644 index 00000000..23ee84a8 --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFramework/PointFreeFramework.h @@ -0,0 +1,3 @@ +#import +FOUNDATION_EXPORT double PointFreeFrameworkVersionNumber; +FOUNDATION_EXPORT const unsigned char PointFreeFrameworkVersionString[]; diff --git a/0040-async-functional-refactoring/PointFreeFramework/StyleGuide.swift b/0040-async-functional-refactoring/PointFreeFramework/StyleGuide.swift new file mode 100644 index 00000000..40cbb065 --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFramework/StyleGuide.swift @@ -0,0 +1,82 @@ +import Foundation +import UIKit +import Overture + +extension CGFloat { + static func pf_grid(_ n: Int) -> CGFloat { + return CGFloat(n) * 4 + } +} + +let generousMargins = + mut(\UIView.layoutMargins, .init(top: .pf_grid(6), left: .pf_grid(6), bottom: .pf_grid(6), right: .pf_grid(6))) + +let autoLayoutStyle = mut(\UIView.translatesAutoresizingMaskIntoConstraints, false) + +let verticalStackView = mut(\UIStackView.axis, .vertical) + +let baseStackViewStyle = concat( + generousMargins, + mut(\UIStackView.spacing, .pf_grid(3)), + verticalStackView, + mut(\.isLayoutMarginsRelativeArrangement, true), + autoLayoutStyle +) + +let bolded: (inout UIFont) -> Void = { $0 = $0.bolded } + +let baseTextButtonStyle = concat( + mut(\UIButton.titleLabel!.font, UIFont.preferredFont(forTextStyle: .subheadline)), + mver(\UIButton.titleLabel!.font!, bolded) +) + +extension UIButton { + var normalTitleColor: UIColor? { + get { return self.titleColor(for: .normal) } + set { self.setTitleColor(newValue, for: .normal) } + } +} + +let secondaryTextButtonStyle = concat( + baseTextButtonStyle, + mut(\.normalTitleColor, .black) +) + +let primaryTextButtonStyle = concat( + baseTextButtonStyle, + mut(\.normalTitleColor, .pf_purple) +) + +let baseButtonStyle = concat( + baseTextButtonStyle, + mut(\.contentEdgeInsets, .init(top: .pf_grid(2), left: .pf_grid(4), bottom: .pf_grid(2), right: .pf_grid(4))) +) + +func roundedStyle(cornerRadius: CGFloat) -> (UIView) -> Void { + return concat( + mut(\.layer.cornerRadius, cornerRadius), + mut(\.layer.masksToBounds, true) + ) +} + +let baseRoundedStyle = roundedStyle(cornerRadius: 6) + +let baseFilledButtonStyle = concat( + baseButtonStyle, + baseRoundedStyle +) + +extension UIButton { + var normalBackgroundImage: UIImage? { + get { return self.backgroundImage(for: .normal) } + set { self.setBackgroundImage(newValue, for: .normal) } + } +} + +let primaryButtonStyle = concat( + baseFilledButtonStyle, + mut(\.normalBackgroundImage, .from(color: .pf_purple)), + mut(\.normalTitleColor, .white) +) + +let smallCapsLabelStyle = mut(\UILabel.font, UIFont.preferredFont(forTextStyle: .caption1).smallCaps) diff --git a/0040-async-functional-refactoring/PointFreeFramework/Utils.swift b/0040-async-functional-refactoring/PointFreeFramework/Utils.swift new file mode 100644 index 00000000..5e102ee3 --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFramework/Utils.swift @@ -0,0 +1,75 @@ +import Foundation +import UIKit + +public var episodeDateFormatter: DateFormatter { + let formatter = DateFormatter() + formatter.dateFormat = "EEEE MMM d, yyyy" + formatter.timeZone = TimeZone(secondsFromGMT: 0) + return formatter +} + +extension UIColor { + public static let pf_black = UIColor(white: 0.07, alpha: 1) + public static let pf_blue = UIColor(red: 76/255, green: 204/255, blue: 255/255, alpha: 1) + public static let pf_gray950 = UIColor(white: 0.95, alpha: 1.0) + public static let pf_green = UIColor(red: 121/255, green: 242/255, blue: 176/255, alpha: 1) + public static let pf_purple = UIColor(red: 151/255, green: 77/255, blue: 255/255, alpha: 1) + public static let pf_red = UIColor(red: 235/255, green: 28/255, blue: 38/255, alpha: 1) + public static let pf_yellow = UIColor(red: 255/255, green: 240/255, blue: 128/255, alpha: 1) +} + +extension UIImage { + public static func from(color: UIColor) -> UIImage { + let rect = CGRect(x: 0, y: 0, width: 1, height: 1) + UIGraphicsBeginImageContext(rect.size) + defer { UIGraphicsEndImageContext() } + guard let context = UIGraphicsGetCurrentContext() else { return UIImage() } + context.setFillColor(color.cgColor) + context.fill(rect) + return UIGraphicsGetImageFromCurrentImageContext() ?? UIImage() + } +} + +extension UIFont { + public var smallCaps: UIFont { + let upperCaseFeature = [ + UIFontDescriptor.FeatureKey.featureIdentifier : kUpperCaseType, + UIFontDescriptor.FeatureKey.typeIdentifier : kUpperCaseSmallCapsSelector + ] + let lowerCaseFeature = [ + UIFontDescriptor.FeatureKey.featureIdentifier : kLowerCaseType, + UIFontDescriptor.FeatureKey.typeIdentifier : kLowerCaseSmallCapsSelector + ] + let features = [upperCaseFeature, lowerCaseFeature] + let smallCapsDescriptor = self.fontDescriptor.addingAttributes([UIFontDescriptor.AttributeName.featureSettings : features]) + return UIFont(descriptor: smallCapsDescriptor, size: 0) + } + + public var bolded: UIFont { + guard let descriptor = self.fontDescriptor.withSymbolicTraits(.traitBold) else { return self } + return UIFont(descriptor: descriptor, size: 0) + } +} + +func wrapView(padding: UIEdgeInsets) -> (UIView) -> UIView { + return { subview in + let wrapper = UIView() + subview.translatesAutoresizingMaskIntoConstraints = false + wrapper.addSubview(subview) + NSLayoutConstraint.activate([ + subview.leadingAnchor.constraint( + equalTo: wrapper.leadingAnchor, constant: padding.left + ), + subview.rightAnchor.constraint( + equalTo: wrapper.rightAnchor, constant: -padding.right + ), + subview.topAnchor.constraint( + equalTo: wrapper.topAnchor, constant: padding.top + ), + subview.bottomAnchor.constraint( + equalTo: wrapper.bottomAnchor, constant: -padding.bottom + ), + ]) + return wrapper + } +} diff --git a/0040-async-functional-refactoring/PointFreeFrameworkTests/Helpers.swift b/0040-async-functional-refactoring/PointFreeFrameworkTests/Helpers.swift new file mode 100644 index 00000000..857bfe89 --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFrameworkTests/Helpers.swift @@ -0,0 +1,221 @@ +import UIKit + +func snapshotUrl(file: StaticString, function: String) -> URL { + return snapshotDirectoryUrl(file: file) + .appendingPathComponent(String(function.dropLast(2))) +} + +func snapshotDirectoryUrl(file: StaticString) -> URL { + let fileUrl = URL(fileURLWithPath: "\(file)") + let directoryUrl = fileUrl + .deletingLastPathComponent() + .appendingPathComponent("__Snapshots__") + .appendingPathComponent(fileUrl.deletingPathExtension().lastPathComponent) + try! FileManager.default.createDirectory(at: directoryUrl, withIntermediateDirectories: true) + return directoryUrl +} + +enum Diff { + static func lines(_ old: String, _ new: String) -> String? { + if old == new { return nil } + let hunks = chunk(diff: diff( + old.split(separator: "\n", omittingEmptySubsequences: false).map(String.init), + new.split(separator: "\n", omittingEmptySubsequences: false).map(String.init) + )) + return hunks.flatMap { [$0.patchMark] + $0.lines }.joined(separator: "\n") + } + + static func images(_ old: UIImage, _ new: UIImage, precision: Float = 1) -> UIImage? { + if compare(old, new, precision: precision) { return nil } + return diff(old, new) + } +} + +// MARK: - Private + +private struct Difference { + enum Which { + case first + case second + case both + } + + let elements: [A] + let which: Which +} + +private func diff(_ fst: [A], _ snd: [A]) -> [Difference] { + var idxsOf = [A: [Int]]() + fst.enumerated().forEach { idxsOf[$1, default: []].append($0) } + + let sub = snd.enumerated().reduce((overlap: [Int: Int](), fst: 0, snd: 0, len: 0)) { sub, sndPair in + (idxsOf[sndPair.element] ?? []) + .reduce((overlap: [Int: Int](), fst: sub.fst, snd: sub.snd, len: sub.len)) { innerSub, fstIdx in + + var newOverlap = innerSub.overlap + newOverlap[fstIdx] = (sub.overlap[fstIdx - 1] ?? 0) + 1 + + if let newLen = newOverlap[fstIdx], newLen > sub.len { + return (newOverlap, fstIdx - newLen + 1, sndPair.offset - newLen + 1, newLen) + } + return (newOverlap, innerSub.fst, innerSub.snd, innerSub.len) + } + } + let (_, fstIdx, sndIdx, len) = sub + + if len == 0 { + let fstDiff = fst.isEmpty ? [] : [Difference(elements: fst, which: .first)] + let sndDiff = snd.isEmpty ? [] : [Difference(elements: snd, which: .second)] + return fstDiff + sndDiff + } else { + let fstDiff = diff(Array(fst.prefix(upTo: fstIdx)), Array(snd.prefix(upTo: sndIdx))) + let midDiff = [Difference(elements: Array(fst.suffix(from: fstIdx).prefix(len)), which: .both)] + let lstDiff = diff(Array(fst.suffix(from: fstIdx + len)), Array(snd.suffix(from: sndIdx + len))) + return fstDiff + midDiff + lstDiff + } +} + +private let minus = "−" +private let plus = "+" +private let figureSpace = "\u{2007}" + +private struct Hunk { + let fstIdx: Int + let fstLen: Int + let sndIdx: Int + let sndLen: Int + let lines: [String] + + var patchMark: String { + let fstMark = "\(minus)\(fstIdx + 1),\(fstLen)" + let sndMark = "\(plus)\(sndIdx + 1),\(sndLen)" + return "@@ \(fstMark) \(sndMark) @@" + } + + static func +(lhs: Hunk, rhs: Hunk) -> Hunk { + return Hunk( + fstIdx: lhs.fstIdx + rhs.fstIdx, + fstLen: lhs.fstLen + rhs.fstLen, + sndIdx: lhs.sndIdx + rhs.sndIdx, + sndLen: lhs.sndLen + rhs.sndLen, + lines: lhs.lines + rhs.lines + ) + } + + init(fstIdx: Int = 0, fstLen: Int = 0, sndIdx: Int = 0, sndLen: Int = 0, lines: [String] = []) { + self.fstIdx = fstIdx + self.fstLen = fstLen + self.sndIdx = sndIdx + self.sndLen = sndLen + self.lines = lines + } + + public init(idx: Int = 0, len: Int = 0, lines: [String] = []) { + self.init(fstIdx: idx, fstLen: len, sndIdx: idx, sndLen: len, lines: lines) + } +} + +private func chunk(diff diffs: [Difference], context ctx: Int = 4) -> [Hunk] { + func prepending(_ prefix: String) -> (String) -> String { + return { prefix + $0 + ($0.hasSuffix(" ") ? "¬" : "") } + } + let changed: (Hunk) -> Bool = { $0.lines.contains(where: { $0.hasPrefix(minus) || $0.hasPrefix(plus) }) } + + let (hunk, hunks) = diffs + .reduce((current: Hunk(), hunks: [Hunk]())) { cursor, diff in + let (current, hunks) = cursor + let len = diff.elements.count + + switch diff.which { + case .both where len > ctx * 2: + let hunk = current + Hunk(len: ctx, lines: diff.elements.prefix(ctx).map(prepending(figureSpace))) + let next = Hunk( + fstIdx: current.fstIdx + current.fstLen + len - ctx, + fstLen: ctx, + sndIdx: current.sndIdx + current.sndLen + len - ctx, + sndLen: ctx, + lines: (diff.elements.suffix(ctx) as ArraySlice).map(prepending(figureSpace)) + ) + return (next, changed(hunk) ? hunks + [hunk] : hunks) + case .both where current.lines.isEmpty: + let lines = (diff.elements.suffix(ctx) as ArraySlice).map(prepending(figureSpace)) + let count = lines.count + return (current + Hunk(idx: len - count, len: count, lines: lines), hunks) + case .both: + return (current + Hunk(len: len, lines: diff.elements.map(prepending(figureSpace))), hunks) + case .first: + return (current + Hunk(fstLen: len, lines: diff.elements.map(prepending(minus))), hunks) + case .second: + return (current + Hunk(sndLen: len, lines: diff.elements.map(prepending(plus))), hunks) + } + } + + return changed(hunk) ? hunks + [hunk] : hunks +} + +private func compare(_ old: UIImage, _ new: UIImage, precision: Float) -> Bool { + guard let oldCgImage = old.cgImage else { return false } + guard let newCgImage = new.cgImage else { return false } + guard oldCgImage.width != 0 else { return false } + guard newCgImage.width != 0 else { return false } + guard oldCgImage.width == newCgImage.width else { return false } + guard oldCgImage.height != 0 else { return false } + guard newCgImage.height != 0 else { return false } + guard oldCgImage.height == newCgImage.height else { return false } + let byteCount = oldCgImage.width * oldCgImage.height * 4 + var oldBytes = [UInt8](repeating: 0, count: byteCount) + guard let oldContext = context(for: oldCgImage, data: &oldBytes) else { return false } + guard let newContext = context(for: newCgImage) else { return false } + guard let oldData = oldContext.data else { return false } + guard let newData = newContext.data else { return false } + if memcmp(oldData, newData, byteCount) == 0 { return true } + let newer = UIImage(data: new.pngData()!)! + guard let newerCgImage = newer.cgImage else { return false } + var newerBytes = [UInt8](repeating: 0, count: byteCount) + guard let newerContext = context(for: newerCgImage, data: &newerBytes) else { return false } + guard let newerData = newerContext.data else { return false } + if memcmp(oldData, newerData, byteCount) == 0 { return true } + if precision >= 1 { return false } + var differentPixelCount = 0 + let threshold = 1 - precision + for x in 0.. threshold { return false} + } + } + return true +} + +private func context(for cgImage: CGImage, data: UnsafeMutableRawPointer? = nil) -> CGContext? { + guard + let space = cgImage.colorSpace, + let context = CGContext( + data: data, + width: cgImage.width, + height: cgImage.height, + bitsPerComponent: cgImage.bitsPerComponent, + bytesPerRow: cgImage.bytesPerRow, + space: space, + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) + else { return nil } + + context.draw(cgImage, in: CGRect(x: 0, y: 0, width: cgImage.width, height: cgImage.height)) + return context +} + +private func diff(_ old: UIImage, _ new: UIImage) -> UIImage { + let oldCiImage = CIImage(cgImage: old.cgImage!) + let newCiImage = CIImage(cgImage: new.cgImage!) + let differenceFilter = CIFilter(name: "CIDifferenceBlendMode")! + differenceFilter.setValue(oldCiImage, forKey: kCIInputImageKey) + differenceFilter.setValue(newCiImage, forKey: kCIInputBackgroundImageKey) + let differenceCiImage = differenceFilter.outputImage! + let invertFilter = CIFilter(name: "CIColorInvert")! + invertFilter.setValue(differenceCiImage, forKey: kCIInputImageKey) + let invertCiImage = invertFilter.outputImage! + let context = CIContext() + let invertCgImage = context.createCGImage(invertCiImage, from: invertCiImage.extent)! + return UIImage(cgImage: invertCgImage) +} diff --git a/0040-async-functional-refactoring/PointFreeFrameworkTests/Info.plist b/0040-async-functional-refactoring/PointFreeFrameworkTests/Info.plist new file mode 100644 index 00000000..6c40a6cd --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFrameworkTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/0040-async-functional-refactoring/PointFreeFrameworkTests/PointFreeFrameworkTests.swift b/0040-async-functional-refactoring/PointFreeFrameworkTests/PointFreeFrameworkTests.swift new file mode 100644 index 00000000..6fb412e7 --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFrameworkTests/PointFreeFrameworkTests.swift @@ -0,0 +1,65 @@ +import XCTest +import WebKit +@testable import PointFreeFramework + +class PointFreeFrameworkTests: SnapshotTestCase { + func testWebView() { + let html = """ +

Welcome to Point-Free!

+

A Swift video series exploring functional programming and more.

+""" + + let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 640, height: 480)) + webView.loadHTMLString(html, baseURL: nil) + assertSnapshot(matching: webView, as: .image) + +// record = true +// let loaded = expectation(description: "loaded") +// let delegate = NavigationDelegate.init(callback: { +// webView.takeSnapshot(with: nil) { (image, error) in +// loaded.fulfill() +// self.assertSnapshot(matching: image!, as: .image) +// } +// }) +// webView.navigationDelegate = delegate +// wait(for: [loaded], timeout: 5) + } +} + +class NavigationDelegate: NSObject, WKNavigationDelegate { + var callback: (() -> Void)? + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + self.callback!() + } +} + +extension Snapshotting where A == WKWebView, Snapshot == UIImage { +// static let image: Snapshotting = Snapshotting.image.pullback { webView in + static let image: Snapshotting = Snapshotting.image.asyncPullback { webView in + return Parallel { callback in + let delegate = NavigationDelegate() + delegate.callback = { + webView.takeSnapshot(with: nil) { (image, error) in + callback(image!) + _ = delegate + } + } + webView.navigationDelegate = delegate + } + } +// static let image = Snapshotting.init( +// diffing: .image, +// pathExtension: "png") { webView -> Parallel in +// return Parallel { callback in +// let delegate = NavigationDelegate() +// delegate.callback = { +// webView.takeSnapshot(with: nil) { (image, error) in +// callback(image!) +// _ = delegate +// } +// } +// webView.navigationDelegate = delegate +// } +// } +} diff --git a/0040-async-functional-refactoring/PointFreeFrameworkTests/SnapshotTestCase.swift b/0040-async-functional-refactoring/PointFreeFrameworkTests/SnapshotTestCase.swift new file mode 100644 index 00000000..f9735e02 --- /dev/null +++ b/0040-async-functional-refactoring/PointFreeFrameworkTests/SnapshotTestCase.swift @@ -0,0 +1,168 @@ +import Overture +import XCTest + +struct Diffing
{ + let diff: (A, A) -> (String, [XCTAttachment])? + let from: (Data) -> A + let data: (A) -> Data +} + +struct Parallel { + let run: (@escaping (A) -> Void) -> Void +} + +struct Snapshotting { + let diffing: Diffing + let pathExtension: String + let snapshot: (A) -> Parallel + + func pullback(_ f: @escaping (A0) -> A) -> Snapshotting { + return Snapshotting.init( + diffing: self.diffing, + pathExtension: self.pathExtension, + snapshot: { a0 in self.snapshot(f(a0)) } + ) + } + + func asyncPullback(_ f: @escaping (A0) -> Parallel) -> Snapshotting { + return Snapshotting( + diffing: self.diffing, + pathExtension: self.pathExtension, + snapshot: { (a0) -> Parallel in + return Parallel { callback in +// callback // (Snapshot) -> Void +// a0 // A0 +// f // (A0) -> Parallel +// self.snapshot // (A) -> Parallel + let parallelA = f(a0) + parallelA.run { a in + let parallelSnapshot = self.snapshot(a) + parallelSnapshot.run { snapshot in + callback(snapshot) + } + } + } + } + ) + } +} + +extension Snapshotting { + init(diffing: Diffing, pathExtension: String, snapshot: @escaping (A) -> Snapshot) { + self.diffing = diffing + self.pathExtension = pathExtension + self.snapshot = { a in Parallel { callback in callback(snapshot(a)) } } + } +} + +extension Diffing where A == String { + static let lines = Diffing( + diff: { old, new in + guard let string = Diff.lines(old, new) else { return nil } + return ("Difference:\n\n\(string)", [XCTAttachment(string: string)]) + }, + from: { data in + return String(decoding: data, as: UTF8.self) + }, + data: { string in + return Data(string.utf8) + } + ) +} + +extension Diffing where A == UIImage { + static let image = Diffing( + diff: { old, new in + guard let difference = Diff.images(old, new) else { return nil } + return ( + "Expected old@\(old.size) to match new@\(new.size)", + [old, new, difference].map(XCTAttachment.init) + ) + }, + from: { data in UIImage(data: data, scale: UIScreen.main.scale)! }, + data: { image in image.pngData()! } + ) +} + +extension Snapshotting where A == UIImage, Snapshot == UIImage { + static let image = Snapshotting( + diffing: .image, + pathExtension: "png", + snapshot: { $0 } + ) +} + +extension Snapshotting where A == CALayer, Snapshot == UIImage { + static let image: Snapshotting = Snapshotting.image.pullback { layer in + UIGraphicsImageRenderer(size: layer.bounds.size) + .image { ctx in layer.render(in: ctx.cgContext) } + } +} + +extension Snapshotting where A == UIView, Snapshot == UIImage { + static let image: Snapshotting = Snapshotting.image.pullback(get(\.layer)) +} + +extension Snapshotting where A == UIViewController, Snapshot == UIImage { + static let image: Snapshotting = Snapshotting.image.pullback(get(\.view)) +} + +extension Snapshotting where A == String, Snapshot == String { + static let lines = Snapshotting( + diffing: .lines, + pathExtension: "txt", + snapshot: { $0 } + ) +} + +extension Snapshotting where A == UIView, Snapshot == String { + static let recursiveDescription: Snapshotting = Snapshotting.lines.pullback { view in + view.setNeedsLayout() + view.layoutIfNeeded() + + return (view.perform(Selector(("recursiveDescription")))? + .takeUnretainedValue() as! String) + .replacingOccurrences(of: ":?\\s*0x[\\da-f]+(\\s*)", with: "$1", options: .regularExpression) + } +} + +extension Snapshotting where A == UIViewController, Snapshot == String { + static let recursiveDescription: Snapshotting = Snapshotting.recursiveDescription.pullback(get(\.view)) +} + +class SnapshotTestCase: XCTestCase { + var record = false + + func assertSnapshot( + matching value: A, + as witness: Snapshotting, + file: StaticString = #file, + function: String = #function, + line: UInt = #line) { + + let parallel = witness.snapshot(value) + var snapshot: Snapshot! + let loaded = expectation(description: "Loaded") + parallel.run { + snapshot = $0 + loaded.fulfill() + } + wait(for: [loaded], timeout: 5) + + let referenceUrl = snapshotUrl(file: file, function: function) + .appendingPathExtension(witness.pathExtension) + + if !self.record, let referenceData = try? Data(contentsOf: referenceUrl) { + let reference = witness.diffing.from(referenceData) + guard let (failure, attachments) = witness.diffing.diff(reference, snapshot) else { return } + XCTFail(failure, file: file, line: line) + XCTContext.runActivity(named: "Attached failure diff") { activity in + attachments + .forEach { image in activity.add(image) } + } + } else { + try! witness.diffing.data(snapshot).write(to: referenceUrl) + XCTFail("Recorded: …\n\"\(referenceUrl.path)\"", file: file, line: line) + } + } +} diff --git a/0040-async-functional-refactoring/PointFreeFrameworkTests/__Snapshots__/PointFreeFrameworkTests/testEpisodesView.png b/0040-async-functional-refactoring/PointFreeFrameworkTests/__Snapshots__/PointFreeFrameworkTests/testEpisodesView.png new file mode 100644 index 0000000000000000000000000000000000000000..68bddca7d1b8531718b3991f0f38abd672ea5132 GIT binary patch literal 130193 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�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

j3>IVI>`G5gh-{n3Ea4JKNd# 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 layer = ; contentOffset: {0, 0}; contentSize: {414, 2025.5}; adjustedContentInset: {0, 0, 0, 0}> + | > + | | ; layer = > + | | | > + | | | | > + | | | | > + | | | | | > + | | | | | > + | | | | | > + | | | | | > + | | | | | | > + | | |