From 642a5918bda2a0fb0a41bc7e2ba97dd02b21b406 Mon Sep 17 00:00:00 2001 From: Mobile Date: Sat, 19 Sep 2020 16:04:07 +0100 Subject: [PATCH 1/7] Creating empty project --- .../project.pbxproj | 323 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/xcschememanagement.plist | 14 + mobile-coding-challenge/AppDelegate.swift | 23 ++ .../AppIcon.appiconset/Contents.json | 98 ++++++ .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 ++ mobile-coding-challenge/Info.plist | 43 +++ 9 files changed, 547 insertions(+) create mode 100644 mobile-coding-challenge.xcodeproj/project.pbxproj create mode 100644 mobile-coding-challenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mobile-coding-challenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 mobile-coding-challenge/AppDelegate.swift create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mobile-coding-challenge/Assets.xcassets/Contents.json create mode 100644 mobile-coding-challenge/Base.lproj/LaunchScreen.storyboard create mode 100644 mobile-coding-challenge/Info.plist diff --git a/mobile-coding-challenge.xcodeproj/project.pbxproj b/mobile-coding-challenge.xcodeproj/project.pbxproj new file mode 100644 index 0000000..deb4a25 --- /dev/null +++ b/mobile-coding-challenge.xcodeproj/project.pbxproj @@ -0,0 +1,323 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 75620E3B2516548300F87394 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E3A2516548300F87394 /* AppDelegate.swift */; }; + 75620E442516548700F87394 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75620E432516548700F87394 /* Assets.xcassets */; }; + 75620E472516548700F87394 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75620E452516548700F87394 /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 75620E372516548300F87394 /* mobile-coding-challenge.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "mobile-coding-challenge.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 75620E3A2516548300F87394 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 75620E432516548700F87394 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 75620E462516548700F87394 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 75620E482516548700F87394 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 75620E342516548300F87394 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 75620E2E2516548300F87394 = { + isa = PBXGroup; + children = ( + 75620E392516548300F87394 /* mobile-coding-challenge */, + 75620E382516548300F87394 /* Products */, + ); + sourceTree = ""; + }; + 75620E382516548300F87394 /* Products */ = { + isa = PBXGroup; + children = ( + 75620E372516548300F87394 /* mobile-coding-challenge.app */, + ); + name = Products; + sourceTree = ""; + }; + 75620E392516548300F87394 /* mobile-coding-challenge */ = { + isa = PBXGroup; + children = ( + 75620E3A2516548300F87394 /* AppDelegate.swift */, + 75620E432516548700F87394 /* Assets.xcassets */, + 75620E452516548700F87394 /* LaunchScreen.storyboard */, + 75620E482516548700F87394 /* Info.plist */, + ); + path = "mobile-coding-challenge"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 75620E362516548300F87394 /* mobile-coding-challenge */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75620E4B2516548700F87394 /* Build configuration list for PBXNativeTarget "mobile-coding-challenge" */; + buildPhases = ( + 75620E332516548300F87394 /* Sources */, + 75620E342516548300F87394 /* Frameworks */, + 75620E352516548300F87394 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "mobile-coding-challenge"; + productName = "mobile-coding-challenge"; + productReference = 75620E372516548300F87394 /* mobile-coding-challenge.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 75620E2F2516548300F87394 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1170; + LastUpgradeCheck = 1170; + ORGANIZATIONNAME = Zakariae; + TargetAttributes = { + 75620E362516548300F87394 = { + CreatedOnToolsVersion = 11.7; + }; + }; + }; + buildConfigurationList = 75620E322516548300F87394 /* Build configuration list for PBXProject "mobile-coding-challenge" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 75620E2E2516548300F87394; + productRefGroup = 75620E382516548300F87394 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 75620E362516548300F87394 /* mobile-coding-challenge */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 75620E352516548300F87394 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 75620E472516548700F87394 /* LaunchScreen.storyboard in Resources */, + 75620E442516548700F87394 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 75620E332516548300F87394 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 75620E3B2516548300F87394 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 75620E452516548700F87394 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 75620E462516548700F87394 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 75620E492516548700F87394 /* 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; + COPY_PHASE_STRIP = NO; + 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.0; + 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"; + }; + name = Debug; + }; + 75620E4A2516548700F87394 /* 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; + COPY_PHASE_STRIP = NO; + 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.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 75620E4C2516548700F87394 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "mobile-coding-challenge/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.zakariae.mobile-coding-challenge"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 75620E4D2516548700F87394 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "mobile-coding-challenge/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.zakariae.mobile-coding-challenge"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 75620E322516548300F87394 /* Build configuration list for PBXProject "mobile-coding-challenge" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75620E492516548700F87394 /* Debug */, + 75620E4A2516548700F87394 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 75620E4B2516548700F87394 /* Build configuration list for PBXNativeTarget "mobile-coding-challenge" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75620E4C2516548700F87394 /* Debug */, + 75620E4D2516548700F87394 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 75620E2F2516548300F87394 /* Project object */; +} diff --git a/mobile-coding-challenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mobile-coding-challenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..dcb467b --- /dev/null +++ b/mobile-coding-challenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mobile-coding-challenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mobile-coding-challenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/mobile-coding-challenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist b/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..1c42fb6 --- /dev/null +++ b/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + mobile-coding-challenge.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/mobile-coding-challenge/AppDelegate.swift b/mobile-coding-challenge/AppDelegate.swift new file mode 100644 index 0000000..1c5a92d --- /dev/null +++ b/mobile-coding-challenge/AppDelegate.swift @@ -0,0 +1,23 @@ +// +// AppDelegate.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + +} + diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/Contents.json b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/mobile-coding-challenge/Assets.xcassets/Contents.json b/mobile-coding-challenge/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/mobile-coding-challenge/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/mobile-coding-challenge/Base.lproj/LaunchScreen.storyboard b/mobile-coding-challenge/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/mobile-coding-challenge/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile-coding-challenge/Info.plist b/mobile-coding-challenge/Info.plist new file mode 100644 index 0000000..5a63475 --- /dev/null +++ b/mobile-coding-challenge/Info.plist @@ -0,0 +1,43 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + From 643ba518cc967ce27dc4b9d23372c6c5a8278b2f Mon Sep 17 00:00:00 2001 From: Mobile Date: Sat, 19 Sep 2020 16:26:25 +0100 Subject: [PATCH 2/7] Creating Most Github Repos Viper Architecture Pattern, as well as Base Navigation Controller --- .../project.pbxproj | 48 +++++++++++++++++++ mobile-coding-challenge/AppDelegate.swift | 9 +++- .../BaseUINavigationController.swift | 21 ++++++++ mobile-coding-challenge/Info.plist | 2 + .../MostStarredGithubReposEntity.swift | 9 ++++ .../MostStarredGithubReposInteractor.swift | 9 ++++ .../MostStarredGithubReposPresenter.swift | 9 ++++ .../MostStarredGithubReposProtocol.swift | 21 ++++++++ .../MostStarredGithubReposRouter.swift | 21 ++++++++ .../MostStarredGithubReposUI.swift | 36 ++++++++++++++ .../MostStarredGithubReposView.swift | 20 ++++++++ 11 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 mobile-coding-challenge/Base Controllers/BaseUINavigationController.swift create mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposEntity.swift create mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposInteractor.swift create mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposPresenter.swift create mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposProtocol.swift create mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposRouter.swift create mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposUI.swift create mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposView.swift diff --git a/mobile-coding-challenge.xcodeproj/project.pbxproj b/mobile-coding-challenge.xcodeproj/project.pbxproj index deb4a25..85231f3 100644 --- a/mobile-coding-challenge.xcodeproj/project.pbxproj +++ b/mobile-coding-challenge.xcodeproj/project.pbxproj @@ -10,6 +10,14 @@ 75620E3B2516548300F87394 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E3A2516548300F87394 /* AppDelegate.swift */; }; 75620E442516548700F87394 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75620E432516548700F87394 /* Assets.xcassets */; }; 75620E472516548700F87394 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75620E452516548700F87394 /* LaunchScreen.storyboard */; }; + 75620E50251655BC00F87394 /* MostStarredGithubReposUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E4F251655BC00F87394 /* MostStarredGithubReposUI.swift */; }; + 75620E52251655D000F87394 /* MostStarredGithubReposView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E51251655D000F87394 /* MostStarredGithubReposView.swift */; }; + 75620E54251655E400F87394 /* MostStarredGithubReposProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E53251655E400F87394 /* MostStarredGithubReposProtocol.swift */; }; + 75620E56251655FF00F87394 /* MostStarredGithubReposInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E55251655FF00F87394 /* MostStarredGithubReposInteractor.swift */; }; + 75620E582516561800F87394 /* MostStarredGithubReposPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E572516561800F87394 /* MostStarredGithubReposPresenter.swift */; }; + 75620E5A2516562600F87394 /* MostStarredGithubReposEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E592516562600F87394 /* MostStarredGithubReposEntity.swift */; }; + 75620E5C2516563100F87394 /* MostStarredGithubReposRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E5B2516563100F87394 /* MostStarredGithubReposRouter.swift */; }; + 75620E5F251659B700F87394 /* BaseUINavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E5E251659B700F87394 /* BaseUINavigationController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -18,6 +26,14 @@ 75620E432516548700F87394 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 75620E462516548700F87394 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 75620E482516548700F87394 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 75620E4F251655BC00F87394 /* MostStarredGithubReposUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MostStarredGithubReposUI.swift; sourceTree = ""; }; + 75620E51251655D000F87394 /* MostStarredGithubReposView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MostStarredGithubReposView.swift; sourceTree = ""; }; + 75620E53251655E400F87394 /* MostStarredGithubReposProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MostStarredGithubReposProtocol.swift; sourceTree = ""; }; + 75620E55251655FF00F87394 /* MostStarredGithubReposInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MostStarredGithubReposInteractor.swift; sourceTree = ""; }; + 75620E572516561800F87394 /* MostStarredGithubReposPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MostStarredGithubReposPresenter.swift; sourceTree = ""; }; + 75620E592516562600F87394 /* MostStarredGithubReposEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MostStarredGithubReposEntity.swift; sourceTree = ""; }; + 75620E5B2516563100F87394 /* MostStarredGithubReposRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MostStarredGithubReposRouter.swift; sourceTree = ""; }; + 75620E5E251659B700F87394 /* BaseUINavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseUINavigationController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -50,6 +66,8 @@ 75620E392516548300F87394 /* mobile-coding-challenge */ = { isa = PBXGroup; children = ( + 75620E5D2516597800F87394 /* Base Controllers */, + 75620E4E2516557900F87394 /* Most Starred Github Repos */, 75620E3A2516548300F87394 /* AppDelegate.swift */, 75620E432516548700F87394 /* Assets.xcassets */, 75620E452516548700F87394 /* LaunchScreen.storyboard */, @@ -58,6 +76,28 @@ path = "mobile-coding-challenge"; sourceTree = ""; }; + 75620E4E2516557900F87394 /* Most Starred Github Repos */ = { + isa = PBXGroup; + children = ( + 75620E4F251655BC00F87394 /* MostStarredGithubReposUI.swift */, + 75620E51251655D000F87394 /* MostStarredGithubReposView.swift */, + 75620E53251655E400F87394 /* MostStarredGithubReposProtocol.swift */, + 75620E55251655FF00F87394 /* MostStarredGithubReposInteractor.swift */, + 75620E572516561800F87394 /* MostStarredGithubReposPresenter.swift */, + 75620E592516562600F87394 /* MostStarredGithubReposEntity.swift */, + 75620E5B2516563100F87394 /* MostStarredGithubReposRouter.swift */, + ); + path = "Most Starred Github Repos"; + sourceTree = ""; + }; + 75620E5D2516597800F87394 /* Base Controllers */ = { + isa = PBXGroup; + children = ( + 75620E5E251659B700F87394 /* BaseUINavigationController.swift */, + ); + path = "Base Controllers"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -128,7 +168,15 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75620E52251655D000F87394 /* MostStarredGithubReposView.swift in Sources */, + 75620E54251655E400F87394 /* MostStarredGithubReposProtocol.swift in Sources */, + 75620E5C2516563100F87394 /* MostStarredGithubReposRouter.swift in Sources */, + 75620E5F251659B700F87394 /* BaseUINavigationController.swift in Sources */, + 75620E5A2516562600F87394 /* MostStarredGithubReposEntity.swift in Sources */, + 75620E582516561800F87394 /* MostStarredGithubReposPresenter.swift in Sources */, + 75620E56251655FF00F87394 /* MostStarredGithubReposInteractor.swift in Sources */, 75620E3B2516548300F87394 /* AppDelegate.swift in Sources */, + 75620E50251655BC00F87394 /* MostStarredGithubReposUI.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/mobile-coding-challenge/AppDelegate.swift b/mobile-coding-challenge/AppDelegate.swift index 1c5a92d..bfcd964 100644 --- a/mobile-coding-challenge/AppDelegate.swift +++ b/mobile-coding-challenge/AppDelegate.swift @@ -11,11 +11,16 @@ import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { - + var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. + + self.window = UIWindow(frame: UIScreen.main.bounds) + self.window?.rootViewController = BaseUINavigationController(rootViewController: MostStarredGithubReposRouter.createModule()) + self.window?.makeKeyAndVisible() + return true + } diff --git a/mobile-coding-challenge/Base Controllers/BaseUINavigationController.swift b/mobile-coding-challenge/Base Controllers/BaseUINavigationController.swift new file mode 100644 index 0000000..f2508c7 --- /dev/null +++ b/mobile-coding-challenge/Base Controllers/BaseUINavigationController.swift @@ -0,0 +1,21 @@ +// +// BaseUINavigationController.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +class BaseUINavigationController: UINavigationController { + + override func viewDidLoad() { + super.viewDidLoad() + + self.view.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) + self.setNavigationBarHidden(true, animated: false) + + } + +} diff --git a/mobile-coding-challenge/Info.plist b/mobile-coding-challenge/Info.plist index 5a63475..fac5cdf 100644 --- a/mobile-coding-challenge/Info.plist +++ b/mobile-coding-challenge/Info.plist @@ -26,6 +26,8 @@ armv7 + UIStatusBarStyle + UIStatusBarStyleDarkContent UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposEntity.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposEntity.swift new file mode 100644 index 0000000..e58bead --- /dev/null +++ b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposEntity.swift @@ -0,0 +1,9 @@ +// +// MostStarredGithubReposEntity.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import Foundation diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposInteractor.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposInteractor.swift new file mode 100644 index 0000000..0a95692 --- /dev/null +++ b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposInteractor.swift @@ -0,0 +1,9 @@ +// +// MostStarredGithubReposInteractor.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import Foundation diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposPresenter.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposPresenter.swift new file mode 100644 index 0000000..47b7d30 --- /dev/null +++ b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposPresenter.swift @@ -0,0 +1,9 @@ +// +// MostStarredGithubReposPresenter.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import Foundation diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposProtocol.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposProtocol.swift new file mode 100644 index 0000000..93f5e2d --- /dev/null +++ b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposProtocol.swift @@ -0,0 +1,21 @@ +// +// MostStarredGithubReposProtocol.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +protocol PresenterToMostStarredGithubReposViewProtocol{} + +protocol ViewToMostStarredGithubReposPresenterProtocol{} + +protocol PresenterToMostStarredGithubReposInteractorProtocol{} + +protocol InteractorToMostStarredGithubReposPresenterProtocol{} + +protocol PresenterToMostStarredGithubReposRouterProtocol{ + static func createModule() -> UIViewController +} diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposRouter.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposRouter.swift new file mode 100644 index 0000000..3d4a137 --- /dev/null +++ b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposRouter.swift @@ -0,0 +1,21 @@ +// +// MostStarredGithubReposRouter.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +class MostStarredGithubReposRouter: PresenterToMostStarredGithubReposRouterProtocol{ + + static func createModule() -> UIViewController { + + let mostStarredGithubReposView = MostStarredGithubReposView() + + return mostStarredGithubReposView + + } + +} diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposUI.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposUI.swift new file mode 100644 index 0000000..442e742 --- /dev/null +++ b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposUI.swift @@ -0,0 +1,36 @@ +// +// MostStarredGithubReposUI.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +class MostStarredGithubReposUI: UIViewController{ + + let mostStarredReposTableView: UITableView = { + let tableView = UITableView() + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.backgroundColor = .white + return tableView + }() + + override func viewDidLoad() { + super.viewDidLoad() + + self.view.addSubview(self.mostStarredReposTableView) + + NSLayoutConstraint.activate([ + + self.mostStarredReposTableView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), + self.mostStarredReposTableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor), + self.mostStarredReposTableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), + self.mostStarredReposTableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor) + + ]) + + } + +} diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposView.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposView.swift new file mode 100644 index 0000000..dfd1464 --- /dev/null +++ b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposView.swift @@ -0,0 +1,20 @@ +// +// MostStarredGithubReposView.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import Foundation + +class MostStarredGithubReposView: MostStarredGithubReposUI { + + override func viewDidLoad() { + super.viewDidLoad() + + + + } + +} From 6448204b62b88ed03b10d5cf2b7c019ca1df19da Mon Sep 17 00:00:00 2001 From: Mobile Date: Sat, 19 Sep 2020 21:55:34 +0100 Subject: [PATCH 3/7] Installing some pods and creating offline/fake data for MostStarredGithubReposView --- .gitignore | 1 + Podfile | 13 ++ Podfile.lock | 20 +++ .../project.pbxproj | 144 ++++++++++++++++-- .../xcschemes/xcschememanagement.plist | 2 +- .../contents.xcworkspacedata | 10 ++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 + .../Assets.xcassets/Icons/Contents.json | 6 + .../empty-avatar-icon.imageset/Contents.json | 23 +++ .../empty-avatar-icon.png | Bin 0 -> 11546 bytes .../empty-avatar-icon@2x.png | Bin 0 -> 28501 bytes .../empty-avatar-icon@3x.png | Bin 0 -> 59387 bytes .../Icons/star_icon.imageset/Contents.json | 23 +++ .../Icons/star_icon.imageset/star_icon.png | Bin 0 -> 2772 bytes .../Icons/star_icon.imageset/star_icon@2x.png | Bin 0 -> 6071 bytes .../Icons/star_icon.imageset/star_icon@3x.png | Bin 0 -> 10151 bytes .../BaseUINavigationController.swift | 1 - .../MostStarredGithubReposEntity.swift | 85 +++++++++++ .../MostStarredGithubReposInteractor.swift | 26 ++++ .../MostStarredGithubReposPresenter.swift | 53 +++++++ .../MostStarredGithubReposProtocol.swift | 40 +++++ .../MostStarredGithubReposRouter.swift | 32 ++++ .../MostStarredGithubReposTableViewCell.swift | 127 +++++++++++++++ .../MostStarredGithubReposUI.swift | 60 ++++++++ .../MostStarredGithubReposView.swift | 76 +++++++++ .../Extensions/Int + Extension.swift | 34 +++++ .../Extensions/String + Extension.swift | 17 +++ .../UIViewController + Extension.swift | 25 +++ .../Localizable Files/Localizable.strings | 21 +++ .../MostStarredGithubReposEntity.swift | 9 -- .../MostStarredGithubReposInteractor.swift | 9 -- .../MostStarredGithubReposPresenter.swift | 9 -- .../MostStarredGithubReposProtocol.swift | 21 --- .../MostStarredGithubReposRouter.swift | 21 --- .../MostStarredGithubReposUI.swift | 36 ----- .../MostStarredGithubReposView.swift | 20 --- 37 files changed, 836 insertions(+), 142 deletions(-) create mode 100644 .gitignore create mode 100644 Podfile create mode 100644 Podfile.lock create mode 100644 mobile-coding-challenge.xcworkspace/contents.xcworkspacedata create mode 100644 mobile-coding-challenge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mobile-coding-challenge.xcworkspace/xcuserdata/mobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 mobile-coding-challenge/Assets.xcassets/Icons/Contents.json create mode 100644 mobile-coding-challenge/Assets.xcassets/Icons/empty-avatar-icon.imageset/Contents.json create mode 100644 mobile-coding-challenge/Assets.xcassets/Icons/empty-avatar-icon.imageset/empty-avatar-icon.png create mode 100644 mobile-coding-challenge/Assets.xcassets/Icons/empty-avatar-icon.imageset/empty-avatar-icon@2x.png create mode 100644 mobile-coding-challenge/Assets.xcassets/Icons/empty-avatar-icon.imageset/empty-avatar-icon@3x.png create mode 100644 mobile-coding-challenge/Assets.xcassets/Icons/star_icon.imageset/Contents.json create mode 100644 mobile-coding-challenge/Assets.xcassets/Icons/star_icon.imageset/star_icon.png create mode 100644 mobile-coding-challenge/Assets.xcassets/Icons/star_icon.imageset/star_icon@2x.png create mode 100644 mobile-coding-challenge/Assets.xcassets/Icons/star_icon.imageset/star_icon@3x.png rename mobile-coding-challenge/{ => Controllers}/Base Controllers/BaseUINavigationController.swift (87%) create mode 100644 mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift create mode 100644 mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift create mode 100644 mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift create mode 100644 mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift create mode 100644 mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposRouter.swift create mode 100644 mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposTableViewCell.swift create mode 100644 mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposUI.swift create mode 100644 mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift create mode 100644 mobile-coding-challenge/Extensions/Int + Extension.swift create mode 100644 mobile-coding-challenge/Extensions/String + Extension.swift create mode 100644 mobile-coding-challenge/Extensions/UIViewController + Extension.swift create mode 100644 mobile-coding-challenge/Localizable Files/Localizable.strings delete mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposEntity.swift delete mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposInteractor.swift delete mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposPresenter.swift delete mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposProtocol.swift delete mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposRouter.swift delete mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposUI.swift delete mode 100644 mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposView.swift diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb97e94 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +Pods/ \ No newline at end of file diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..019970c --- /dev/null +++ b/Podfile @@ -0,0 +1,13 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'mobile-coding-challenge' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + # Pods for mobile-coding-challenge + pod 'Alamofire' + pod 'SwiftyJSON' + + +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..aab9a1d --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,20 @@ +PODS: + - Alamofire (5.2.2) + - SwiftyJSON (5.0.0) + +DEPENDENCIES: + - Alamofire + - SwiftyJSON + +SPEC REPOS: + trunk: + - Alamofire + - SwiftyJSON + +SPEC CHECKSUMS: + Alamofire: 814429acc853c6c54ff123fc3d2ef66803823ce0 + SwiftyJSON: 36413e04c44ee145039d332b4f4e2d3e8d6c4db7 + +PODFILE CHECKSUM: 7635cdc4ea1d0491fc79e6bf44dd3372ea3c970e + +COCOAPODS: 1.9.3 diff --git a/mobile-coding-challenge.xcodeproj/project.pbxproj b/mobile-coding-challenge.xcodeproj/project.pbxproj index 85231f3..66bcdee 100644 --- a/mobile-coding-challenge.xcodeproj/project.pbxproj +++ b/mobile-coding-challenge.xcodeproj/project.pbxproj @@ -3,24 +3,32 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ 75620E3B2516548300F87394 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E3A2516548300F87394 /* AppDelegate.swift */; }; 75620E442516548700F87394 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75620E432516548700F87394 /* Assets.xcassets */; }; 75620E472516548700F87394 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75620E452516548700F87394 /* LaunchScreen.storyboard */; }; - 75620E50251655BC00F87394 /* MostStarredGithubReposUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E4F251655BC00F87394 /* MostStarredGithubReposUI.swift */; }; - 75620E52251655D000F87394 /* MostStarredGithubReposView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E51251655D000F87394 /* MostStarredGithubReposView.swift */; }; 75620E54251655E400F87394 /* MostStarredGithubReposProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E53251655E400F87394 /* MostStarredGithubReposProtocol.swift */; }; - 75620E56251655FF00F87394 /* MostStarredGithubReposInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E55251655FF00F87394 /* MostStarredGithubReposInteractor.swift */; }; - 75620E582516561800F87394 /* MostStarredGithubReposPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E572516561800F87394 /* MostStarredGithubReposPresenter.swift */; }; - 75620E5A2516562600F87394 /* MostStarredGithubReposEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E592516562600F87394 /* MostStarredGithubReposEntity.swift */; }; - 75620E5C2516563100F87394 /* MostStarredGithubReposRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E5B2516563100F87394 /* MostStarredGithubReposRouter.swift */; }; 75620E5F251659B700F87394 /* BaseUINavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E5E251659B700F87394 /* BaseUINavigationController.swift */; }; + 75620E63251660A000F87394 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 75620E62251660A000F87394 /* Localizable.strings */; }; + 75620E6825166EB800F87394 /* UIViewController + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E6725166EB800F87394 /* UIViewController + Extension.swift */; }; + 75620E6925166F1300F87394 /* MostStarredGithubReposPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E572516561800F87394 /* MostStarredGithubReposPresenter.swift */; }; + 75620E6A25166F8B00F87394 /* MostStarredGithubReposView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E51251655D000F87394 /* MostStarredGithubReposView.swift */; }; + 75620E6B25166FE300F87394 /* MostStarredGithubReposUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E4F251655BC00F87394 /* MostStarredGithubReposUI.swift */; }; + 75620E6C251670E400F87394 /* MostStarredGithubReposRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E5B2516563100F87394 /* MostStarredGithubReposRouter.swift */; }; + 75620E6D2516719900F87394 /* MostStarredGithubReposTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E602516602900F87394 /* MostStarredGithubReposTableViewCell.swift */; }; + 75620E6E251671BF00F87394 /* MostStarredGithubReposInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E55251655FF00F87394 /* MostStarredGithubReposInteractor.swift */; }; + 75620E70251677C200F87394 /* MostStarredGithubReposEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E592516562600F87394 /* MostStarredGithubReposEntity.swift */; }; + 75620E722516895A00F87394 /* Int + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E712516895A00F87394 /* Int + Extension.swift */; }; + 75620E742516987F00F87394 /* String + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E732516987F00F87394 /* String + Extension.swift */; }; + 7F2954C3013C6DFD1EB57D67 /* Pods_mobile_coding_challenge.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F57D743DE22E5A3A3F84BF3F /* Pods_mobile_coding_challenge.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 0F01CB3D02F0E5BDDFE0704F /* Pods-mobile-coding-challenge.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mobile-coding-challenge.debug.xcconfig"; path = "Target Support Files/Pods-mobile-coding-challenge/Pods-mobile-coding-challenge.debug.xcconfig"; sourceTree = ""; }; + 4D18A88125FC096583B5DE6D /* Pods-mobile-coding-challenge.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mobile-coding-challenge.release.xcconfig"; path = "Target Support Files/Pods-mobile-coding-challenge/Pods-mobile-coding-challenge.release.xcconfig"; sourceTree = ""; }; 75620E372516548300F87394 /* mobile-coding-challenge.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "mobile-coding-challenge.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 75620E3A2516548300F87394 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 75620E432516548700F87394 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -34,6 +42,12 @@ 75620E592516562600F87394 /* MostStarredGithubReposEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MostStarredGithubReposEntity.swift; sourceTree = ""; }; 75620E5B2516563100F87394 /* MostStarredGithubReposRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MostStarredGithubReposRouter.swift; sourceTree = ""; }; 75620E5E251659B700F87394 /* BaseUINavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseUINavigationController.swift; sourceTree = ""; }; + 75620E602516602900F87394 /* MostStarredGithubReposTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MostStarredGithubReposTableViewCell.swift; sourceTree = ""; }; + 75620E62251660A000F87394 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; + 75620E6725166EB800F87394 /* UIViewController + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController + Extension.swift"; sourceTree = ""; }; + 75620E712516895A00F87394 /* Int + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Int + Extension.swift"; sourceTree = ""; }; + 75620E732516987F00F87394 /* String + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String + Extension.swift"; sourceTree = ""; }; + F57D743DE22E5A3A3F84BF3F /* Pods_mobile_coding_challenge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_mobile_coding_challenge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -41,6 +55,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 7F2954C3013C6DFD1EB57D67 /* Pods_mobile_coding_challenge.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -52,6 +67,8 @@ children = ( 75620E392516548300F87394 /* mobile-coding-challenge */, 75620E382516548300F87394 /* Products */, + 958ADBB33EB7D44312ABB616 /* Pods */, + AC28514262F839DE19CD30B2 /* Frameworks */, ); sourceTree = ""; }; @@ -66,8 +83,9 @@ 75620E392516548300F87394 /* mobile-coding-challenge */ = { isa = PBXGroup; children = ( - 75620E5D2516597800F87394 /* Base Controllers */, - 75620E4E2516557900F87394 /* Most Starred Github Repos */, + 75620E64251660A800F87394 /* Localizable Files */, + 75620E6625166E8D00F87394 /* Controllers */, + 75620E6525166E7A00F87394 /* Extensions */, 75620E3A2516548300F87394 /* AppDelegate.swift */, 75620E432516548700F87394 /* Assets.xcassets */, 75620E452516548700F87394 /* LaunchScreen.storyboard */, @@ -80,6 +98,7 @@ isa = PBXGroup; children = ( 75620E4F251655BC00F87394 /* MostStarredGithubReposUI.swift */, + 75620E602516602900F87394 /* MostStarredGithubReposTableViewCell.swift */, 75620E51251655D000F87394 /* MostStarredGithubReposView.swift */, 75620E53251655E400F87394 /* MostStarredGithubReposProtocol.swift */, 75620E55251655FF00F87394 /* MostStarredGithubReposInteractor.swift */, @@ -98,6 +117,50 @@ path = "Base Controllers"; sourceTree = ""; }; + 75620E64251660A800F87394 /* Localizable Files */ = { + isa = PBXGroup; + children = ( + 75620E62251660A000F87394 /* Localizable.strings */, + ); + path = "Localizable Files"; + sourceTree = ""; + }; + 75620E6525166E7A00F87394 /* Extensions */ = { + isa = PBXGroup; + children = ( + 75620E6725166EB800F87394 /* UIViewController + Extension.swift */, + 75620E712516895A00F87394 /* Int + Extension.swift */, + 75620E732516987F00F87394 /* String + Extension.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 75620E6625166E8D00F87394 /* Controllers */ = { + isa = PBXGroup; + children = ( + 75620E5D2516597800F87394 /* Base Controllers */, + 75620E4E2516557900F87394 /* Most Starred Github Repos */, + ); + path = Controllers; + sourceTree = ""; + }; + 958ADBB33EB7D44312ABB616 /* Pods */ = { + isa = PBXGroup; + children = ( + 0F01CB3D02F0E5BDDFE0704F /* Pods-mobile-coding-challenge.debug.xcconfig */, + 4D18A88125FC096583B5DE6D /* Pods-mobile-coding-challenge.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + AC28514262F839DE19CD30B2 /* Frameworks */ = { + isa = PBXGroup; + children = ( + F57D743DE22E5A3A3F84BF3F /* Pods_mobile_coding_challenge.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -105,9 +168,11 @@ isa = PBXNativeTarget; buildConfigurationList = 75620E4B2516548700F87394 /* Build configuration list for PBXNativeTarget "mobile-coding-challenge" */; buildPhases = ( + B02EBC2749D9FC5BBDB2C878 /* [CP] Check Pods Manifest.lock */, 75620E332516548300F87394 /* Sources */, 75620E342516548300F87394 /* Frameworks */, 75620E352516548300F87394 /* Resources */, + 47EB194D8AC28AD0E4900581 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -157,26 +222,73 @@ buildActionMask = 2147483647; files = ( 75620E472516548700F87394 /* LaunchScreen.storyboard in Resources */, + 75620E63251660A000F87394 /* Localizable.strings in Resources */, 75620E442516548700F87394 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 47EB194D8AC28AD0E4900581 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-mobile-coding-challenge/Pods-mobile-coding-challenge-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-mobile-coding-challenge/Pods-mobile-coding-challenge-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-mobile-coding-challenge/Pods-mobile-coding-challenge-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + B02EBC2749D9FC5BBDB2C878 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-mobile-coding-challenge-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/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# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 75620E332516548300F87394 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 75620E52251655D000F87394 /* MostStarredGithubReposView.swift in Sources */, + 75620E6C251670E400F87394 /* MostStarredGithubReposRouter.swift in Sources */, + 75620E70251677C200F87394 /* MostStarredGithubReposEntity.swift in Sources */, + 75620E6825166EB800F87394 /* UIViewController + Extension.swift in Sources */, 75620E54251655E400F87394 /* MostStarredGithubReposProtocol.swift in Sources */, - 75620E5C2516563100F87394 /* MostStarredGithubReposRouter.swift in Sources */, 75620E5F251659B700F87394 /* BaseUINavigationController.swift in Sources */, - 75620E5A2516562600F87394 /* MostStarredGithubReposEntity.swift in Sources */, - 75620E582516561800F87394 /* MostStarredGithubReposPresenter.swift in Sources */, - 75620E56251655FF00F87394 /* MostStarredGithubReposInteractor.swift in Sources */, + 75620E6B25166FE300F87394 /* MostStarredGithubReposUI.swift in Sources */, + 75620E6E251671BF00F87394 /* MostStarredGithubReposInteractor.swift in Sources */, + 75620E722516895A00F87394 /* Int + Extension.swift in Sources */, + 75620E6925166F1300F87394 /* MostStarredGithubReposPresenter.swift in Sources */, 75620E3B2516548300F87394 /* AppDelegate.swift in Sources */, - 75620E50251655BC00F87394 /* MostStarredGithubReposUI.swift in Sources */, + 75620E742516987F00F87394 /* String + Extension.swift in Sources */, + 75620E6D2516719900F87394 /* MostStarredGithubReposTableViewCell.swift in Sources */, + 75620E6A25166F8B00F87394 /* MostStarredGithubReposView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -310,6 +422,7 @@ }; 75620E4C2516548700F87394 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 0F01CB3D02F0E5BDDFE0704F /* Pods-mobile-coding-challenge.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; @@ -328,6 +441,7 @@ }; 75620E4D2516548700F87394 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 4D18A88125FC096583B5DE6D /* Pods-mobile-coding-challenge.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; diff --git a/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist b/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist index 1c42fb6..0cd2cb2 100644 --- a/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ mobile-coding-challenge.xcscheme_^#shared#^_ orderHint - 0 + 3 diff --git a/mobile-coding-challenge.xcworkspace/contents.xcworkspacedata b/mobile-coding-challenge.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..e521183 --- /dev/null +++ b/mobile-coding-challenge.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/mobile-coding-challenge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mobile-coding-challenge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/mobile-coding-challenge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mobile-coding-challenge.xcworkspace/xcuserdata/mobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/mobile-coding-challenge.xcworkspace/xcuserdata/mobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..c7cb89f --- /dev/null +++ b/mobile-coding-challenge.xcworkspace/xcuserdata/mobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/mobile-coding-challenge/Assets.xcassets/Icons/Contents.json b/mobile-coding-challenge/Assets.xcassets/Icons/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/mobile-coding-challenge/Assets.xcassets/Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/mobile-coding-challenge/Assets.xcassets/Icons/empty-avatar-icon.imageset/Contents.json b/mobile-coding-challenge/Assets.xcassets/Icons/empty-avatar-icon.imageset/Contents.json new file mode 100644 index 0000000..3e723af --- /dev/null +++ b/mobile-coding-challenge/Assets.xcassets/Icons/empty-avatar-icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "empty-avatar-icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "empty-avatar-icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "empty-avatar-icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/mobile-coding-challenge/Assets.xcassets/Icons/empty-avatar-icon.imageset/empty-avatar-icon.png b/mobile-coding-challenge/Assets.xcassets/Icons/empty-avatar-icon.imageset/empty-avatar-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..72edda81b711280aed78697b43b9ae6ffbbe9765 GIT binary patch literal 11546 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 literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/Icons/empty-avatar-icon.imageset/empty-avatar-icon@2x.png b/mobile-coding-challenge/Assets.xcassets/Icons/empty-avatar-icon.imageset/empty-avatar-icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6627c25ce3303c7150a344266d15365c154bfdd1 GIT binary patch literal 28501 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 literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/Icons/star_icon.imageset/Contents.json b/mobile-coding-challenge/Assets.xcassets/Icons/star_icon.imageset/Contents.json new file mode 100644 index 0000000..1c9348d --- /dev/null +++ b/mobile-coding-challenge/Assets.xcassets/Icons/star_icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "star_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "star_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "star_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/mobile-coding-challenge/Assets.xcassets/Icons/star_icon.imageset/star_icon.png b/mobile-coding-challenge/Assets.xcassets/Icons/star_icon.imageset/star_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..89e8daf448de2bfae76c4b17426e9fb3c0ba72ed GIT binary patch literal 2772 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 ax#52*kb1dNYO4+a0000dm2%(Ay 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 C`?xy* literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/Icons/star_icon.imageset/star_icon@3x.png b/mobile-coding-challenge/Assets.xcassets/Icons/star_icon.imageset/star_icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f76a329d4d0d7793bda9c42238666b954fce23e1 GIT binary patch literal 10151 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 DRoc$P literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Base Controllers/BaseUINavigationController.swift b/mobile-coding-challenge/Controllers/Base Controllers/BaseUINavigationController.swift similarity index 87% rename from mobile-coding-challenge/Base Controllers/BaseUINavigationController.swift rename to mobile-coding-challenge/Controllers/Base Controllers/BaseUINavigationController.swift index f2508c7..1dfb9e1 100644 --- a/mobile-coding-challenge/Base Controllers/BaseUINavigationController.swift +++ b/mobile-coding-challenge/Controllers/Base Controllers/BaseUINavigationController.swift @@ -14,7 +14,6 @@ class BaseUINavigationController: UINavigationController { super.viewDidLoad() self.view.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) - self.setNavigationBarHidden(true, animated: false) } diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift new file mode 100644 index 0000000..2be6680 --- /dev/null +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift @@ -0,0 +1,85 @@ +// +// MostStarredGithubReposEntity.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import Foundation +import SwiftyJSON + +class GithubRepositoryEntity{ + + private var id : Int! + private var name : String! + private var description : String? + private var ownerImageLink : String? + private var ownerName : String! + private var numberOfStars : Int? + private var shortNumberOfStars: String? + + func getId() -> Int{ return self.id } + + func getName()->String{ return self.name } + + func getDescription()->String{ return self.description ?? "" } + + func getOwnerImageURL()->URL?{ + if let imageURL = URL(string: self.ownerImageLink ?? ""){ + return imageURL + } + return nil + } + + func getOwnerName()->String{ return self.ownerName } + + func getNumberOfStars()->Int{ return self.numberOfStars ?? 0 } + + func getShortNumberOfStars()->String{ return self.shortNumberOfStars ?? "" } + + private func setNumberOfStars(numberOfStars: Int){ + + self.numberOfStars = numberOfStars + self.shortNumberOfStars = numberOfStars.shortValue + + } + +} + +extension GithubRepositoryEntity{ + + convenience init(id: Int, name: String, description: String, ownerName: String, numberOfStars: Int) { + self.init() + + self.id = id + self.name = name + self.description = description + self.ownerName = ownerName + self.setNumberOfStars(numberOfStars: numberOfStars) + + } + + static func getFakeData() -> [GithubRepositoryEntity]{ + + var githubRepos: [GithubRepositoryEntity] = [] + + for i in 0..<100 { + + githubRepos.append( + .init( + id: i, + name: "Repository number \(i)", + description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.", + ownerName: "Owner number \(i)", + numberOfStars: i * 100000 + ) + ) + + } + + return githubRepos + + } + +} diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift new file mode 100644 index 0000000..18bf108 --- /dev/null +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift @@ -0,0 +1,26 @@ +// +// MostStarredGithubReposInteractor.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import Foundation + +class MostStarredGithubReposInteractor: PresenterToMostStarredGithubReposInteractorProtocol{ + + var presenter: InteractorToMostStarredGithubReposPresenterProtocol! + + func getMostStarredGithubRepos() { + + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + + self.presenter.mostStarredGithubReposSuccessFetch(repos: GithubRepositoryEntity.getFakeData()) + + } + + } + + +} diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift new file mode 100644 index 0000000..d6dda93 --- /dev/null +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift @@ -0,0 +1,53 @@ +// +// MostStarredGithubReposPresenter.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import Foundation +class MostStarredGithubReposPresenter: ViewToMostStarredGithubReposPresenterProtocol, InteractorToMostStarredGithubReposPresenterProtocol{ + + weak var view: PresenterToMostStarredGithubReposViewProtocol! + var interactor: PresenterToMostStarredGithubReposInteractorProtocol! + var router: PresenterToMostStarredGithubReposRouterProtocol! + var mostStarredGithubRepos: [GithubRepositoryEntity]! = [] + + var numberOfRows: Int!{ + return self.mostStarredGithubRepos.count + } + + convenience init(view: PresenterToMostStarredGithubReposViewProtocol, interactor: PresenterToMostStarredGithubReposInteractorProtocol, router: PresenterToMostStarredGithubReposRouterProtocol) { + self.init() + + self.view = view + self.interactor = interactor + self.router = router + + } + + func viewDidLoad() { + + self.mostStarredGithubRepos = [] + self.view.showLoader() + self.interactor.getMostStarredGithubRepos() + + } + + func mostStarredGithubReposSuccessFetch(repos: [GithubRepositoryEntity]) { + + self.view.hideLoader() + self.mostStarredGithubRepos = repos + self.view.reloadData() + + } + + func mostStarredGithubReposSuccessFailure() { + + self.view.hideLoader() + self.view.showResponseError() + + } + +} diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift new file mode 100644 index 0000000..d353bec --- /dev/null +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift @@ -0,0 +1,40 @@ +// +// MostStarredGithubReposProtocol.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +protocol PresenterToMostStarredGithubReposViewProtocol: class{ + var presenter: ViewToMostStarredGithubReposPresenterProtocol! { get set } + func showLoader() + func hideLoader() + func showResponseError() + func reloadData() +} + +protocol ViewToMostStarredGithubReposPresenterProtocol{ + var view: PresenterToMostStarredGithubReposViewProtocol! { get set } + var interactor: PresenterToMostStarredGithubReposInteractorProtocol! { get set } + var router: PresenterToMostStarredGithubReposRouterProtocol! { get set } + var mostStarredGithubRepos: [GithubRepositoryEntity]! { get set } + var numberOfRows: Int! { get } + func viewDidLoad() +} + +protocol PresenterToMostStarredGithubReposInteractorProtocol{ + var presenter: InteractorToMostStarredGithubReposPresenterProtocol! { get set } + func getMostStarredGithubRepos() +} + +protocol InteractorToMostStarredGithubReposPresenterProtocol{ + func mostStarredGithubReposSuccessFetch(repos: [GithubRepositoryEntity]) + func mostStarredGithubReposSuccessFailure() +} + +protocol PresenterToMostStarredGithubReposRouterProtocol{ + static func createModule()->UIViewController +} diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposRouter.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposRouter.swift new file mode 100644 index 0000000..ceff9ec --- /dev/null +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposRouter.swift @@ -0,0 +1,32 @@ +// +// MostStarredGithubReposRouter.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +class MostStarredGithubReposRouter: PresenterToMostStarredGithubReposRouterProtocol{ + + static func createModule() -> UIViewController { + + let mostStarredGithubReposView = MostStarredGithubReposView() + let mostStarredGithubReposInteractor = MostStarredGithubReposInteractor() + let mostStarredGithubReposRouter = MostStarredGithubReposRouter() + + let mostStarredGithubReposPresenter = MostStarredGithubReposPresenter( + view: mostStarredGithubReposView, + interactor: mostStarredGithubReposInteractor, + router: mostStarredGithubReposRouter + ) + + mostStarredGithubReposView.presenter = mostStarredGithubReposPresenter + mostStarredGithubReposInteractor.presenter = mostStarredGithubReposPresenter + + return mostStarredGithubReposView + + } + +} diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposTableViewCell.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposTableViewCell.swift new file mode 100644 index 0000000..a563eea --- /dev/null +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposTableViewCell.swift @@ -0,0 +1,127 @@ +// +// MostStarredGithubReposTableViewCell.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +class MostStarredGithubReposTableViewCell: UITableViewCell { + + private let repositoryNameLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = .boldSystemFont(ofSize: 17) + label.numberOfLines = 2 + return label + }() + + private let repositoryDescriptionLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = .systemFont(ofSize: 13) + label.numberOfLines = 3 + return label + }() + + private let repositoryOwnerImageView: UIImageView = { + let imageView = UIImageView() + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.image = #imageLiteral(resourceName: "empty-avatar-icon") + return imageView + }() + + private let repositoryOwnerNameLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = .systemFont(ofSize: 13) + return label + }() + + private let repositoryStarImageView: UIImageView = { + let imageView = UIImageView() + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.image = #imageLiteral(resourceName: "star_icon") + return imageView + }() + + private let repositoryNumberOfStarsLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = .systemFont(ofSize: 13) + return label + }() + + private let topBottomSpacing : CGFloat = 20 + private let leadingTrailingSpacing: CGFloat = 30 + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + self.createCellViewAutoLayout() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + self.createCellViewAutoLayout() + } + + func fillView(repositoryName: String, repositoryDescription: String, repositoryOwnerImageLink: URL?, repositoryOwnerName: String, repositoryNumberOfStars: String) { + + self.repositoryNameLabel.text = repositoryName + self.repositoryDescriptionLabel.text = repositoryDescription + self.repositoryOwnerNameLabel.text = repositoryOwnerName + self.repositoryNumberOfStarsLabel.text = repositoryNumberOfStars + + } + +} + +extension MostStarredGithubReposTableViewCell{ + + private func createCellViewAutoLayout(){ + + self.contentView.addSubview(self.repositoryNameLabel) + self.contentView.addSubview(self.repositoryDescriptionLabel) + self.contentView.addSubview(self.repositoryOwnerImageView) + self.contentView.addSubview(self.repositoryOwnerNameLabel) + self.contentView.addSubview(self.repositoryStarImageView) + self.contentView.addSubview(self.repositoryNumberOfStarsLabel) + + NSLayoutConstraint.activate([ + + self.repositoryNameLabel.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: self.topBottomSpacing), + self.repositoryNameLabel.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: self.leadingTrailingSpacing), + self.repositoryNameLabel.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -self.leadingTrailingSpacing), + + self.repositoryDescriptionLabel.topAnchor.constraint(equalTo: self.repositoryNameLabel.bottomAnchor, constant: 10), + self.repositoryDescriptionLabel.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: self.leadingTrailingSpacing), + self.repositoryDescriptionLabel.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -self.leadingTrailingSpacing), + + self.repositoryOwnerImageView.topAnchor.constraint(equalTo: self.repositoryDescriptionLabel.bottomAnchor, constant: 10), + self.repositoryOwnerImageView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -self.topBottomSpacing), + self.repositoryOwnerImageView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: self.leadingTrailingSpacing), + self.repositoryOwnerImageView.widthAnchor.constraint(equalToConstant: 20.0), + self.repositoryOwnerImageView.heightAnchor.constraint(equalTo: self.repositoryOwnerImageView.widthAnchor), + + self.repositoryOwnerNameLabel.leadingAnchor.constraint(equalTo: self.repositoryOwnerImageView.trailingAnchor, constant: 6), + self.repositoryOwnerNameLabel.centerYAnchor.constraint(equalTo: self.repositoryOwnerImageView.centerYAnchor), + + self.repositoryStarImageView.leadingAnchor.constraint(equalTo: self.repositoryOwnerNameLabel.trailingAnchor, constant: 15), + self.repositoryStarImageView.centerYAnchor.constraint(equalTo: self.repositoryOwnerImageView.centerYAnchor), + self.repositoryStarImageView.widthAnchor.constraint(equalToConstant: 15.0), + self.repositoryStarImageView.heightAnchor.constraint(equalTo: self.repositoryStarImageView.widthAnchor), + + self.repositoryNumberOfStarsLabel.leadingAnchor.constraint(equalTo: self.repositoryStarImageView.trailingAnchor, constant: 6), + self.repositoryNumberOfStarsLabel.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -self.leadingTrailingSpacing), + self.repositoryNumberOfStarsLabel.centerYAnchor.constraint(equalTo: self.repositoryOwnerImageView.centerYAnchor), + + ]) + + self.repositoryNameLabel.setContentHuggingPriority(.fittingSizeLevel, for: .vertical) + self.repositoryOwnerNameLabel.setContentHuggingPriority(.fittingSizeLevel, for: .horizontal) + + } + +} diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposUI.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposUI.swift new file mode 100644 index 0000000..8c78af0 --- /dev/null +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposUI.swift @@ -0,0 +1,60 @@ +// +// MostStarredGithubReposUI.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +class MostStarredGithubReposUI: UIViewController{ + + let mostStarredReposTableView: UITableView = { + let tableView = UITableView() + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.backgroundColor = .white + tableView.separatorInset = .zero + tableView.tableFooterView = UIView() + return tableView + }() + + let loadingIndicatorView: UIActivityIndicatorView = { + let indicator = UIActivityIndicatorView() + indicator.translatesAutoresizingMaskIntoConstraints = false + indicator.color = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) + indicator.hidesWhenStopped = true + return indicator + }() + + let refreshControl: UIRefreshControl = { + let refreshControl = UIRefreshControl() + refreshControl.tintColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) + refreshControl.attributedTitle = NSAttributedString(string: "pull_to_refresh".localized) + return refreshControl + }() + + override func viewDidLoad() { + super.viewDidLoad() + + self.view.addSubview(self.mostStarredReposTableView) + self.view.addSubview(self.loadingIndicatorView) + self.mostStarredReposTableView.refreshControl = self.refreshControl + + NSLayoutConstraint.activate([ + + self.mostStarredReposTableView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), + self.mostStarredReposTableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor), + self.mostStarredReposTableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), + self.mostStarredReposTableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), + + self.loadingIndicatorView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor), + self.loadingIndicatorView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor), + + ]) + + self.navigationController?.navigationBar.topItem?.title = "mostStarredGithubRepos.trending_repos".localized + + } + +} diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift new file mode 100644 index 0000000..d426a9d --- /dev/null +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift @@ -0,0 +1,76 @@ +// +// MostStarredGithubReposView.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +class MostStarredGithubReposView: MostStarredGithubReposUI, PresenterToMostStarredGithubReposViewProtocol{ + + var presenter: ViewToMostStarredGithubReposPresenterProtocol! + + override func viewDidLoad() { + super.viewDidLoad() + + self.mostStarredReposTableView.dataSource = self + self.mostStarredReposTableView.delegate = self + self.mostStarredReposTableView.register(MostStarredGithubReposTableViewCell.self, forCellReuseIdentifier: "\(MostStarredGithubReposTableViewCell.self)") + + self.presenter.viewDidLoad() + + } + + func reloadData() { + self.mostStarredReposTableView.reloadData() + } + + func showLoader() { + self.mostStarredReposTableView.isUserInteractionEnabled = false + self.mostStarredReposTableView.separatorStyle = .none + self.loadingIndicatorView.startAnimating() + } + + func hideLoader() { + self.mostStarredReposTableView.isUserInteractionEnabled = true + self.mostStarredReposTableView.separatorStyle = .singleLine + self.loadingIndicatorView.stopAnimating() + } + + func showResponseError(){ + self.showAlert(title: "errors.something_went_wrong".localized, message: "mostStarredGithubRepos.errors.while_fetching_for_repos_description".localized) + } + +} + +extension MostStarredGithubReposView: UITableViewDataSource, UITableViewDelegate{ + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.presenter.mostStarredGithubRepos.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + + let mostStarredGithubReposCell = tableView.dequeueReusableCell(withIdentifier: "\(MostStarredGithubReposTableViewCell.self)", for: indexPath) as! MostStarredGithubReposTableViewCell + + let mostStarredGithubRepo = self.presenter.mostStarredGithubRepos[indexPath.row] + + mostStarredGithubReposCell.fillView( + repositoryName: mostStarredGithubRepo.getName(), + repositoryDescription: mostStarredGithubRepo.getDescription(), + repositoryOwnerImageLink: mostStarredGithubRepo.getOwnerImageURL(), + repositoryOwnerName: mostStarredGithubRepo.getOwnerName(), + repositoryNumberOfStars: mostStarredGithubRepo.getShortNumberOfStars() + ) + + return mostStarredGithubReposCell + + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + } + +} diff --git a/mobile-coding-challenge/Extensions/Int + Extension.swift b/mobile-coding-challenge/Extensions/Int + Extension.swift new file mode 100644 index 0000000..8237c51 --- /dev/null +++ b/mobile-coding-challenge/Extensions/Int + Extension.swift @@ -0,0 +1,34 @@ +// +// Int + Extension.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import Foundation + +extension Int{ + + var shortValue: String{ + + let num : Double = Double(abs(self)) + + if (num < 1000.0){ + return "\(self)" + } + + let sign : String = (self < 0) ? "-" : "" + let exp : Int = Int(log10(num) / 3.0 ) + let units : [String] = ["K","M"] + let roundedNum: Double = round(10 * num / pow(1000.0, Double(exp))) / 10 + + if exp <= units.count{ + return "\(sign)\(roundedNum)\(units[exp-1])" + } + + return "0" + + } + +} diff --git a/mobile-coding-challenge/Extensions/String + Extension.swift b/mobile-coding-challenge/Extensions/String + Extension.swift new file mode 100644 index 0000000..046b4f6 --- /dev/null +++ b/mobile-coding-challenge/Extensions/String + Extension.swift @@ -0,0 +1,17 @@ +// +// String + Extension.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import Foundation + +extension String{ + + var localized: String{ + return NSLocalizedString(self, comment: "") + } + +} diff --git a/mobile-coding-challenge/Extensions/UIViewController + Extension.swift b/mobile-coding-challenge/Extensions/UIViewController + Extension.swift new file mode 100644 index 0000000..05903d1 --- /dev/null +++ b/mobile-coding-challenge/Extensions/UIViewController + Extension.swift @@ -0,0 +1,25 @@ +// +// UIViewController + Extension.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +extension UIViewController{ + + func showAlert(title: String, message: String){ + + let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) + + let okAlertAction = UIAlertAction(title: "ok".localized, style: .default) + + alert.addAction(okAlertAction) + + self.present(alert, animated: true) + + } + +} diff --git a/mobile-coding-challenge/Localizable Files/Localizable.strings b/mobile-coding-challenge/Localizable Files/Localizable.strings new file mode 100644 index 0000000..ac56c93 --- /dev/null +++ b/mobile-coding-challenge/Localizable Files/Localizable.strings @@ -0,0 +1,21 @@ +/* + Localizable.strings + mobile-coding-challenge + + Created by Mobile on 9/19/20. + Copyright © 2020 Zakariae. All rights reserved. +*/ + +//MARK: GENERAL + +"pull_to_refresh" = "Pull to refresh"; + +"errors.something_went_wrong" = "Something went wrong"; + +"ok" = "OK"; + +//MARK: MOST STARRED GITHUB REPOS VIEW + +"mostStarredGithubRepos.trending_repos" = "Trending Repos"; + +"mostStarredGithubRepos.errors.while_fetching_for_repos_description" = "Error while searching for the most starred github repos.\nPull to refresh or try again later"; diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposEntity.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposEntity.swift deleted file mode 100644 index e58bead..0000000 --- a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposEntity.swift +++ /dev/null @@ -1,9 +0,0 @@ -// -// MostStarredGithubReposEntity.swift -// mobile-coding-challenge -// -// Created by Mobile on 9/19/20. -// Copyright © 2020 Zakariae. All rights reserved. -// - -import Foundation diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposInteractor.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposInteractor.swift deleted file mode 100644 index 0a95692..0000000 --- a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposInteractor.swift +++ /dev/null @@ -1,9 +0,0 @@ -// -// MostStarredGithubReposInteractor.swift -// mobile-coding-challenge -// -// Created by Mobile on 9/19/20. -// Copyright © 2020 Zakariae. All rights reserved. -// - -import Foundation diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposPresenter.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposPresenter.swift deleted file mode 100644 index 47b7d30..0000000 --- a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposPresenter.swift +++ /dev/null @@ -1,9 +0,0 @@ -// -// MostStarredGithubReposPresenter.swift -// mobile-coding-challenge -// -// Created by Mobile on 9/19/20. -// Copyright © 2020 Zakariae. All rights reserved. -// - -import Foundation diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposProtocol.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposProtocol.swift deleted file mode 100644 index 93f5e2d..0000000 --- a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposProtocol.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// MostStarredGithubReposProtocol.swift -// mobile-coding-challenge -// -// Created by Mobile on 9/19/20. -// Copyright © 2020 Zakariae. All rights reserved. -// - -import UIKit - -protocol PresenterToMostStarredGithubReposViewProtocol{} - -protocol ViewToMostStarredGithubReposPresenterProtocol{} - -protocol PresenterToMostStarredGithubReposInteractorProtocol{} - -protocol InteractorToMostStarredGithubReposPresenterProtocol{} - -protocol PresenterToMostStarredGithubReposRouterProtocol{ - static func createModule() -> UIViewController -} diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposRouter.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposRouter.swift deleted file mode 100644 index 3d4a137..0000000 --- a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposRouter.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// MostStarredGithubReposRouter.swift -// mobile-coding-challenge -// -// Created by Mobile on 9/19/20. -// Copyright © 2020 Zakariae. All rights reserved. -// - -import UIKit - -class MostStarredGithubReposRouter: PresenterToMostStarredGithubReposRouterProtocol{ - - static func createModule() -> UIViewController { - - let mostStarredGithubReposView = MostStarredGithubReposView() - - return mostStarredGithubReposView - - } - -} diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposUI.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposUI.swift deleted file mode 100644 index 442e742..0000000 --- a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposUI.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// MostStarredGithubReposUI.swift -// mobile-coding-challenge -// -// Created by Mobile on 9/19/20. -// Copyright © 2020 Zakariae. All rights reserved. -// - -import UIKit - -class MostStarredGithubReposUI: UIViewController{ - - let mostStarredReposTableView: UITableView = { - let tableView = UITableView() - tableView.translatesAutoresizingMaskIntoConstraints = false - tableView.backgroundColor = .white - return tableView - }() - - override func viewDidLoad() { - super.viewDidLoad() - - self.view.addSubview(self.mostStarredReposTableView) - - NSLayoutConstraint.activate([ - - self.mostStarredReposTableView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), - self.mostStarredReposTableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor), - self.mostStarredReposTableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), - self.mostStarredReposTableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor) - - ]) - - } - -} diff --git a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposView.swift b/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposView.swift deleted file mode 100644 index dfd1464..0000000 --- a/mobile-coding-challenge/Most Starred Github Repos/MostStarredGithubReposView.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// MostStarredGithubReposView.swift -// mobile-coding-challenge -// -// Created by Mobile on 9/19/20. -// Copyright © 2020 Zakariae. All rights reserved. -// - -import Foundation - -class MostStarredGithubReposView: MostStarredGithubReposUI { - - override func viewDidLoad() { - super.viewDidLoad() - - - - } - -} From 52e9f9ddf648e95ae2440147c97d1d11aadca50f Mon Sep 17 00:00:00 2001 From: Mobile Date: Sat, 19 Sep 2020 23:20:46 +0100 Subject: [PATCH 4/7] Adding Moya, Implementing Request Handler and Consuming The Most Github Repos APIs without paging --- Podfile | 2 +- Podfile.lock | 10 +++- .../project.pbxproj | 16 +++++ .../xcschemes/xcschememanagement.plist | 2 +- mobile-coding-challenge/AppDelegate.swift | 2 + .../MostStarredGithubReposEntity.swift | 44 ++++++-------- .../MostStarredGithubReposInteractor.swift | 44 ++++++++++++-- .../MostStarredGithubReposPresenter.swift | 11 +++- .../MostStarredGithubReposProtocol.swift | 5 +- .../MostStarredGithubReposView.swift | 8 +++ .../Extensions/Date + Extension.swift | 23 +++++++ .../Helpers/RequestHandler.swift | 60 +++++++++++++++++++ 12 files changed, 189 insertions(+), 38 deletions(-) create mode 100644 mobile-coding-challenge/Extensions/Date + Extension.swift create mode 100644 mobile-coding-challenge/Helpers/RequestHandler.swift diff --git a/Podfile b/Podfile index 019970c..ac6bbb1 100644 --- a/Podfile +++ b/Podfile @@ -6,7 +6,7 @@ target 'mobile-coding-challenge' do use_frameworks! # Pods for mobile-coding-challenge - pod 'Alamofire' + pod 'Moya' pod 'SwiftyJSON' diff --git a/Podfile.lock b/Podfile.lock index aab9a1d..9f239b0 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,20 +1,26 @@ PODS: - Alamofire (5.2.2) + - Moya (14.0.0): + - Moya/Core (= 14.0.0) + - Moya/Core (14.0.0): + - Alamofire (~> 5.0) - SwiftyJSON (5.0.0) DEPENDENCIES: - - Alamofire + - Moya - SwiftyJSON SPEC REPOS: trunk: - Alamofire + - Moya - SwiftyJSON SPEC CHECKSUMS: Alamofire: 814429acc853c6c54ff123fc3d2ef66803823ce0 + Moya: 5b45dacb75adb009f97fde91c204c1e565d31916 SwiftyJSON: 36413e04c44ee145039d332b4f4e2d3e8d6c4db7 -PODFILE CHECKSUM: 7635cdc4ea1d0491fc79e6bf44dd3372ea3c970e +PODFILE CHECKSUM: f9a6ec4307bd82c5114539efefea51d8515b0ef9 COCOAPODS: 1.9.3 diff --git a/mobile-coding-challenge.xcodeproj/project.pbxproj b/mobile-coding-challenge.xcodeproj/project.pbxproj index 66bcdee..1790ca5 100644 --- a/mobile-coding-challenge.xcodeproj/project.pbxproj +++ b/mobile-coding-challenge.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ 75620E70251677C200F87394 /* MostStarredGithubReposEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E592516562600F87394 /* MostStarredGithubReposEntity.swift */; }; 75620E722516895A00F87394 /* Int + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E712516895A00F87394 /* Int + Extension.swift */; }; 75620E742516987F00F87394 /* String + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E732516987F00F87394 /* String + Extension.swift */; }; + 75620E772516A8B800F87394 /* RequestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E762516A8B800F87394 /* RequestHandler.swift */; }; + 75620E7A2516B5DF00F87394 /* Date + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E782516B58B00F87394 /* Date + Extension.swift */; }; 7F2954C3013C6DFD1EB57D67 /* Pods_mobile_coding_challenge.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F57D743DE22E5A3A3F84BF3F /* Pods_mobile_coding_challenge.framework */; }; /* End PBXBuildFile section */ @@ -47,6 +49,8 @@ 75620E6725166EB800F87394 /* UIViewController + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController + Extension.swift"; sourceTree = ""; }; 75620E712516895A00F87394 /* Int + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Int + Extension.swift"; sourceTree = ""; }; 75620E732516987F00F87394 /* String + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String + Extension.swift"; sourceTree = ""; }; + 75620E762516A8B800F87394 /* RequestHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestHandler.swift; sourceTree = ""; }; + 75620E782516B58B00F87394 /* Date + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date + Extension.swift"; sourceTree = ""; }; F57D743DE22E5A3A3F84BF3F /* Pods_mobile_coding_challenge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_mobile_coding_challenge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -86,6 +90,7 @@ 75620E64251660A800F87394 /* Localizable Files */, 75620E6625166E8D00F87394 /* Controllers */, 75620E6525166E7A00F87394 /* Extensions */, + 75620E752516A8A500F87394 /* Helpers */, 75620E3A2516548300F87394 /* AppDelegate.swift */, 75620E432516548700F87394 /* Assets.xcassets */, 75620E452516548700F87394 /* LaunchScreen.storyboard */, @@ -131,6 +136,7 @@ 75620E6725166EB800F87394 /* UIViewController + Extension.swift */, 75620E712516895A00F87394 /* Int + Extension.swift */, 75620E732516987F00F87394 /* String + Extension.swift */, + 75620E782516B58B00F87394 /* Date + Extension.swift */, ); path = Extensions; sourceTree = ""; @@ -144,6 +150,14 @@ path = Controllers; sourceTree = ""; }; + 75620E752516A8A500F87394 /* Helpers */ = { + isa = PBXGroup; + children = ( + 75620E762516A8B800F87394 /* RequestHandler.swift */, + ); + path = Helpers; + sourceTree = ""; + }; 958ADBB33EB7D44312ABB616 /* Pods */ = { isa = PBXGroup; children = ( @@ -276,6 +290,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75620E772516A8B800F87394 /* RequestHandler.swift in Sources */, 75620E6C251670E400F87394 /* MostStarredGithubReposRouter.swift in Sources */, 75620E70251677C200F87394 /* MostStarredGithubReposEntity.swift in Sources */, 75620E6825166EB800F87394 /* UIViewController + Extension.swift in Sources */, @@ -283,6 +298,7 @@ 75620E5F251659B700F87394 /* BaseUINavigationController.swift in Sources */, 75620E6B25166FE300F87394 /* MostStarredGithubReposUI.swift in Sources */, 75620E6E251671BF00F87394 /* MostStarredGithubReposInteractor.swift in Sources */, + 75620E7A2516B5DF00F87394 /* Date + Extension.swift in Sources */, 75620E722516895A00F87394 /* Int + Extension.swift in Sources */, 75620E6925166F1300F87394 /* MostStarredGithubReposPresenter.swift in Sources */, 75620E3B2516548300F87394 /* AppDelegate.swift in Sources */, diff --git a/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist b/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist index 0cd2cb2..b6feba5 100644 --- a/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ mobile-coding-challenge.xcscheme_^#shared#^_ orderHint - 3 + 4 diff --git a/mobile-coding-challenge/AppDelegate.swift b/mobile-coding-challenge/AppDelegate.swift index bfcd964..767412b 100644 --- a/mobile-coding-challenge/AppDelegate.swift +++ b/mobile-coding-challenge/AppDelegate.swift @@ -7,6 +7,8 @@ // import UIKit +import Moya +import SwiftyJSON @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift index 2be6680..dbf2ae9 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift @@ -16,7 +16,7 @@ class GithubRepositoryEntity{ private var description : String? private var ownerImageLink : String? private var ownerName : String! - private var numberOfStars : Int? + private var numberOfStars : Int! private var shortNumberOfStars: String? func getId() -> Int{ return self.id } @@ -34,7 +34,7 @@ class GithubRepositoryEntity{ func getOwnerName()->String{ return self.ownerName } - func getNumberOfStars()->Int{ return self.numberOfStars ?? 0 } + func getNumberOfStars()->Int{ return self.numberOfStars } func getShortNumberOfStars()->String{ return self.shortNumberOfStars ?? "" } @@ -49,36 +49,30 @@ class GithubRepositoryEntity{ extension GithubRepositoryEntity{ - convenience init(id: Int, name: String, description: String, ownerName: String, numberOfStars: Int) { + convenience init?(from repoJSON: JSON){ self.init() - self.id = id - self.name = name - self.description = description - self.ownerName = ownerName - self.setNumberOfStars(numberOfStars: numberOfStars) + let ownerObject = repoJSON["owner"].dictionaryObject - } - - static func getFakeData() -> [GithubRepositoryEntity]{ - - var githubRepos: [GithubRepositoryEntity] = [] - - for i in 0..<100 { + if let repoId = repoJSON["id"].int, + let repoName = repoJSON["name"].string, + let ownerName = ownerObject?["login"] as? String, + let numberOfStars = repoJSON["stargazers_count"].int{ - githubRepos.append( - .init( - id: i, - name: "Repository number \(i)", - description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.", - ownerName: "Owner number \(i)", - numberOfStars: i * 100000 - ) - ) + self.id = repoId + self.name = repoName + self.ownerName = ownerName + self.setNumberOfStars(numberOfStars: numberOfStars) + + if let description = repoJSON["description"].string{ + self.description = description + } + + return } - return githubRepos + return nil } diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift index 18bf108..feb7063 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift @@ -6,20 +6,56 @@ // Copyright © 2020 Zakariae. All rights reserved. // -import Foundation +import Moya +import SwiftyJSON class MostStarredGithubReposInteractor: PresenterToMostStarredGithubReposInteractorProtocol{ var presenter: InteractorToMostStarredGithubReposPresenterProtocol! - func getMostStarredGithubRepos() { + func getMostStarredGithubRepos(from page: Int, isToUsePullRefresh: Bool) { - DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + let requestHandler = MoyaProvider() + + if let previousMonthDate = Calendar.current.date(byAdding: .month, value: -1, to: Date()){ + + requestHandler.request(.getMostGithubRepos(created_at: previousMonthDate.formattedDate(using: "YYYY-MM-dd"), page: page)){ result in - self.presenter.mostStarredGithubReposSuccessFetch(repos: GithubRepositoryEntity.getFakeData()) + switch result { + case let .success(moyaResponse): + + var mostStarredGithubRepos: [GithubRepositoryEntity] = [] + + if let _mostStarredGithubRepos = JSON(moyaResponse.data)["items"].array{ + + for _mostStarredGithubRepo in _mostStarredGithubRepos{ + + if let mostStarredGithubRepo = GithubRepositoryEntity(from: _mostStarredGithubRepo){ + + mostStarredGithubRepos.append(mostStarredGithubRepo) + + } + + } + + } + + self.presenter.mostStarredGithubReposSuccessFetch(repos: mostStarredGithubRepos, isToUsePullRefresh: isToUsePullRefresh) + + + default: + + self.presenter.mostStarredGithubReposSuccessFailure() + + } + } + + return } + self.presenter.mostStarredGithubReposSuccessFailure() + } diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift index d6dda93..d009ee1 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift @@ -31,14 +31,19 @@ class MostStarredGithubReposPresenter: ViewToMostStarredGithubReposPresenterProt self.mostStarredGithubRepos = [] self.view.showLoader() - self.interactor.getMostStarredGithubRepos() + self.interactor.getMostStarredGithubRepos(from: 1, isToUsePullRefresh: false) } - func mostStarredGithubReposSuccessFetch(repos: [GithubRepositoryEntity]) { + func mostStarredGithubReposSuccessFetch(repos: [GithubRepositoryEntity], isToUsePullRefresh: Bool) { + + if isToUsePullRefresh{ + self.mostStarredGithubRepos = repos + }else{ + self.mostStarredGithubRepos.append(contentsOf: repos) + } self.view.hideLoader() - self.mostStarredGithubRepos = repos self.view.reloadData() } diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift index d353bec..04d929d 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift @@ -14,6 +14,7 @@ protocol PresenterToMostStarredGithubReposViewProtocol: class{ func hideLoader() func showResponseError() func reloadData() + func refreshMostStarredGithubReposData() } protocol ViewToMostStarredGithubReposPresenterProtocol{ @@ -27,11 +28,11 @@ protocol ViewToMostStarredGithubReposPresenterProtocol{ protocol PresenterToMostStarredGithubReposInteractorProtocol{ var presenter: InteractorToMostStarredGithubReposPresenterProtocol! { get set } - func getMostStarredGithubRepos() + func getMostStarredGithubRepos(from page: Int, isToUsePullRefresh: Bool) } protocol InteractorToMostStarredGithubReposPresenterProtocol{ - func mostStarredGithubReposSuccessFetch(repos: [GithubRepositoryEntity]) + func mostStarredGithubReposSuccessFetch(repos: [GithubRepositoryEntity], isToUsePullRefresh: Bool) func mostStarredGithubReposSuccessFailure() } diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift index d426a9d..3a75b0f 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift @@ -19,6 +19,8 @@ class MostStarredGithubReposView: MostStarredGithubReposUI, PresenterToMostStarr self.mostStarredReposTableView.delegate = self self.mostStarredReposTableView.register(MostStarredGithubReposTableViewCell.self, forCellReuseIdentifier: "\(MostStarredGithubReposTableViewCell.self)") + self.refreshControl.addTarget(self, action: #selector(self.refreshMostStarredGithubReposData), for: .valueChanged) + self.presenter.viewDidLoad() } @@ -37,12 +39,18 @@ class MostStarredGithubReposView: MostStarredGithubReposUI, PresenterToMostStarr self.mostStarredReposTableView.isUserInteractionEnabled = true self.mostStarredReposTableView.separatorStyle = .singleLine self.loadingIndicatorView.stopAnimating() + self.refreshControl.endRefreshing() } func showResponseError(){ self.showAlert(title: "errors.something_went_wrong".localized, message: "mostStarredGithubRepos.errors.while_fetching_for_repos_description".localized) } + @objc + func refreshMostStarredGithubReposData(){ + self.presenter.interactor.getMostStarredGithubRepos(from: 1, isToUsePullRefresh: true) + } + } extension MostStarredGithubReposView: UITableViewDataSource, UITableViewDelegate{ diff --git a/mobile-coding-challenge/Extensions/Date + Extension.swift b/mobile-coding-challenge/Extensions/Date + Extension.swift new file mode 100644 index 0000000..4cbd4af --- /dev/null +++ b/mobile-coding-challenge/Extensions/Date + Extension.swift @@ -0,0 +1,23 @@ +// +// File.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import UIKit + +extension Date{ + + func formattedDate(using dateFormat: String)->String{ + + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = dateFormat + let formattedStringDate = dateFormatter.string(from: self) + + return formattedStringDate + + } + +} diff --git a/mobile-coding-challenge/Helpers/RequestHandler.swift b/mobile-coding-challenge/Helpers/RequestHandler.swift new file mode 100644 index 0000000..8dc2a70 --- /dev/null +++ b/mobile-coding-challenge/Helpers/RequestHandler.swift @@ -0,0 +1,60 @@ +// +// RequestHandler.swift +// mobile-coding-challenge +// +// Created by Mobile on 9/19/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import Foundation +import Moya + +enum RequestHandler{ + case getMostGithubRepos(created_at: String, page: Int) +} + +extension RequestHandler: TargetType{ + + var baseURL: URL { + return URL(string: "https://api.github.com/search/repositories")! + } + + var path: String { + switch self{ + case .getMostGithubRepos(_, _): + return "" + } + } + + var method: Moya.Method { + switch self{ + case .getMostGithubRepos: + return .get + } + } + + var sampleData: Data { return .init() } + + var task: Task { + switch self{ + case .getMostGithubRepos(let created_at, let page): + return .requestParameters( + parameters: [ + "q" : "created:>\(created_at)", + "page" : page, + "sort" : "stars", + "order": "desc" + ], + encoding: URLEncoding.queryString + ) + } + } + + var headers: [String : String]? { + switch self{ + case .getMostGithubRepos(_, _): + return ["Content-type": "application/json"] + } + } + +} From 04bd2178fa7acdbf6d641e4addfa7bae159c1904 Mon Sep 17 00:00:00 2001 From: Mobile Date: Sat, 19 Sep 2020 23:50:54 +0100 Subject: [PATCH 5/7] Implementing Most Starred Github Repos View Infinite Paging without indicator --- .../MostStarredGithubReposInteractor.swift | 10 ++++++++-- .../MostStarredGithubReposPresenter.swift | 9 +++++++-- .../MostStarredGithubReposProtocol.swift | 4 +++- .../MostStarredGithubReposView.swift | 12 ++++++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift index feb7063..fe662d7 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift @@ -24,9 +24,15 @@ class MostStarredGithubReposInteractor: PresenterToMostStarredGithubReposInterac switch result { case let .success(moyaResponse): + let responseJSON = JSON(moyaResponse.data) + var mostStarredGithubRepos: [GithubRepositoryEntity] = [] + var totalCount: Int = 0 - if let _mostStarredGithubRepos = JSON(moyaResponse.data)["items"].array{ + if let _mostStarredGithubRepos = responseJSON["items"].array, + let _totalCount = responseJSON["total_count"].int{ + + totalCount = _totalCount for _mostStarredGithubRepo in _mostStarredGithubRepos{ @@ -40,7 +46,7 @@ class MostStarredGithubReposInteractor: PresenterToMostStarredGithubReposInterac } - self.presenter.mostStarredGithubReposSuccessFetch(repos: mostStarredGithubRepos, isToUsePullRefresh: isToUsePullRefresh) + self.presenter.mostStarredGithubReposSuccessFetch(repos: mostStarredGithubRepos, isToUsePullRefresh: isToUsePullRefresh, totalCount: totalCount) default: diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift index d009ee1..896f848 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposPresenter.swift @@ -17,6 +17,8 @@ class MostStarredGithubReposPresenter: ViewToMostStarredGithubReposPresenterProt var numberOfRows: Int!{ return self.mostStarredGithubRepos.count } + var totalNumberOfMostStarredGithubRepos: Int! = -1 + var activePage: Int! = 1 convenience init(view: PresenterToMostStarredGithubReposViewProtocol, interactor: PresenterToMostStarredGithubReposInteractorProtocol, router: PresenterToMostStarredGithubReposRouterProtocol) { self.init() @@ -31,16 +33,19 @@ class MostStarredGithubReposPresenter: ViewToMostStarredGithubReposPresenterProt self.mostStarredGithubRepos = [] self.view.showLoader() - self.interactor.getMostStarredGithubRepos(from: 1, isToUsePullRefresh: false) + self.interactor.getMostStarredGithubRepos(from: self.activePage, isToUsePullRefresh: false) } - func mostStarredGithubReposSuccessFetch(repos: [GithubRepositoryEntity], isToUsePullRefresh: Bool) { + func mostStarredGithubReposSuccessFetch(repos: [GithubRepositoryEntity], isToUsePullRefresh: Bool, totalCount: Int) { + + self.totalNumberOfMostStarredGithubRepos = totalCount if isToUsePullRefresh{ self.mostStarredGithubRepos = repos }else{ self.mostStarredGithubRepos.append(contentsOf: repos) + self.activePage += 1 } self.view.hideLoader() diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift index 04d929d..1e3386d 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposProtocol.swift @@ -23,6 +23,8 @@ protocol ViewToMostStarredGithubReposPresenterProtocol{ var router: PresenterToMostStarredGithubReposRouterProtocol! { get set } var mostStarredGithubRepos: [GithubRepositoryEntity]! { get set } var numberOfRows: Int! { get } + var totalNumberOfMostStarredGithubRepos: Int! { get set } + var activePage: Int! { get set } func viewDidLoad() } @@ -32,7 +34,7 @@ protocol PresenterToMostStarredGithubReposInteractorProtocol{ } protocol InteractorToMostStarredGithubReposPresenterProtocol{ - func mostStarredGithubReposSuccessFetch(repos: [GithubRepositoryEntity], isToUsePullRefresh: Bool) + func mostStarredGithubReposSuccessFetch(repos: [GithubRepositoryEntity], isToUsePullRefresh: Bool, totalCount: Int) func mostStarredGithubReposSuccessFailure() } diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift index 3a75b0f..8b2e8ac 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift @@ -73,6 +73,18 @@ extension MostStarredGithubReposView: UITableViewDataSource, UITableViewDelegate repositoryNumberOfStars: mostStarredGithubRepo.getShortNumberOfStars() ) + if indexPath.row == self.presenter.mostStarredGithubRepos.count - 1 { + + let totalNumberOfMostStarredGithubRepos = self.presenter.totalNumberOfMostStarredGithubRepos + + if totalNumberOfMostStarredGithubRepos != -1 && totalNumberOfMostStarredGithubRepos ?? -1 > self.presenter.mostStarredGithubRepos.count{ + + self.presenter.interactor.getMostStarredGithubRepos(from: self.presenter.activePage, isToUsePullRefresh: false) + + } + + } + return mostStarredGithubReposCell } From 75921e4a2dacf038b12a37d747aae326b49b0e10 Mon Sep 17 00:00:00 2001 From: Mobile Date: Sun, 20 Sep 2020 00:56:52 +0100 Subject: [PATCH 6/7] Adding Kingfisher, getting user avatar and implementing Infinite Scroll Loading Indicator --- .gitignore | 3 + Podfile | 1 + Podfile.lock | 8 ++- .../xcschemes/xcschememanagement.plist | 2 +- .../MostStarredGithubReposEntity.swift | 4 ++ .../MostStarredGithubReposTableViewCell.swift | 12 ++++ .../MostStarredGithubReposView.swift | 56 ++++++++++++++----- .../UIViewController + Extension.swift | 2 +- 8 files changed, 72 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index bb97e94..8af3431 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ +# Xcode +xcuserdata/ +project.xcworkspace/ Pods/ \ No newline at end of file diff --git a/Podfile b/Podfile index ac6bbb1..6c92502 100644 --- a/Podfile +++ b/Podfile @@ -8,6 +8,7 @@ target 'mobile-coding-challenge' do # Pods for mobile-coding-challenge pod 'Moya' pod 'SwiftyJSON' + pod 'Kingfisher' end diff --git a/Podfile.lock b/Podfile.lock index 9f239b0..4a5365f 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,5 +1,8 @@ PODS: - Alamofire (5.2.2) + - Kingfisher (5.15.0): + - Kingfisher/Core (= 5.15.0) + - Kingfisher/Core (5.15.0) - Moya (14.0.0): - Moya/Core (= 14.0.0) - Moya/Core (14.0.0): @@ -7,20 +10,23 @@ PODS: - SwiftyJSON (5.0.0) DEPENDENCIES: + - Kingfisher - Moya - SwiftyJSON SPEC REPOS: trunk: - Alamofire + - Kingfisher - Moya - SwiftyJSON SPEC CHECKSUMS: Alamofire: 814429acc853c6c54ff123fc3d2ef66803823ce0 + Kingfisher: 1acb67597a520c2d0310677e66d6e0af455ef757 Moya: 5b45dacb75adb009f97fde91c204c1e565d31916 SwiftyJSON: 36413e04c44ee145039d332b4f4e2d3e8d6c4db7 -PODFILE CHECKSUM: f9a6ec4307bd82c5114539efefea51d8515b0ef9 +PODFILE CHECKSUM: d23fdf201dec1cc3a8c431afc68a2a4d81355adb COCOAPODS: 1.9.3 diff --git a/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist b/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist index b6feba5..5128861 100644 --- a/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ mobile-coding-challenge.xcscheme_^#shared#^_ orderHint - 4 + 5 diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift index dbf2ae9..71ec1aa 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposEntity.swift @@ -68,6 +68,10 @@ extension GithubRepositoryEntity{ self.description = description } + if let avatarStringURL = ownerObject?["avatar_url"] as? String{ + self.ownerImageLink = avatarStringURL + } + return } diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposTableViewCell.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposTableViewCell.swift index a563eea..9a52969 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposTableViewCell.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposTableViewCell.swift @@ -7,6 +7,7 @@ // import UIKit +import Kingfisher class MostStarredGithubReposTableViewCell: UITableViewCell { @@ -74,6 +75,17 @@ class MostStarredGithubReposTableViewCell: UITableViewCell { self.repositoryOwnerNameLabel.text = repositoryOwnerName self.repositoryNumberOfStarsLabel.text = repositoryNumberOfStars + if let _ = repositoryOwnerImageLink{ + self.repositoryOwnerImageView.kf.setImage(with: repositoryOwnerImageLink!) + } + + } + + override func prepareForReuse() { + super.prepareForReuse() + + self.repositoryOwnerImageView.image = #imageLiteral(resourceName: "empty-avatar-icon") + } } diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift index 8b2e8ac..278c181 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposView.swift @@ -40,10 +40,14 @@ class MostStarredGithubReposView: MostStarredGithubReposUI, PresenterToMostStarr self.mostStarredReposTableView.separatorStyle = .singleLine self.loadingIndicatorView.stopAnimating() self.refreshControl.endRefreshing() + self.mostStarredReposTableView.tableFooterView = nil } func showResponseError(){ - self.showAlert(title: "errors.something_went_wrong".localized, message: "mostStarredGithubRepos.errors.while_fetching_for_repos_description".localized) + self.loadingIndicatorView.stopAnimating() + self.refreshControl.endRefreshing() + self.mostStarredReposTableView.tableFooterView = nil + self.showSimpleAlert(title: "errors.something_went_wrong".localized, message: "mostStarredGithubRepos.errors.while_fetching_for_repos_description".localized) } @objc @@ -59,6 +63,44 @@ extension MostStarredGithubReposView: UITableViewDataSource, UITableViewDelegate return self.presenter.mostStarredGithubRepos.count } + func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { + + if indexPath.row == self.presenter.mostStarredGithubRepos.count - 1 { + + let totalNumberOfMostStarredGithubRepos = self.presenter.totalNumberOfMostStarredGithubRepos + + if totalNumberOfMostStarredGithubRepos != -1 && totalNumberOfMostStarredGithubRepos ?? -1 > self.presenter.mostStarredGithubRepos.count{ + + let _view = UIView( + frame: .init( + x: 0, + y: 0, + width: tableView.contentSize.width, + height: 40 + ) + ) + + let indicatorView = UIActivityIndicatorView(frame: .init( + x: _view.frame.width / 2, + y: _view.frame.height / 2, + width: 20, + height: 20 + ) + ) + + indicatorView.startAnimating() + _view.addSubview(indicatorView) + + self.mostStarredReposTableView.tableFooterView = _view + + self.presenter.interactor.getMostStarredGithubRepos(from: self.presenter.activePage, isToUsePullRefresh: false) + + } + + } + + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let mostStarredGithubReposCell = tableView.dequeueReusableCell(withIdentifier: "\(MostStarredGithubReposTableViewCell.self)", for: indexPath) as! MostStarredGithubReposTableViewCell @@ -73,18 +115,6 @@ extension MostStarredGithubReposView: UITableViewDataSource, UITableViewDelegate repositoryNumberOfStars: mostStarredGithubRepo.getShortNumberOfStars() ) - if indexPath.row == self.presenter.mostStarredGithubRepos.count - 1 { - - let totalNumberOfMostStarredGithubRepos = self.presenter.totalNumberOfMostStarredGithubRepos - - if totalNumberOfMostStarredGithubRepos != -1 && totalNumberOfMostStarredGithubRepos ?? -1 > self.presenter.mostStarredGithubRepos.count{ - - self.presenter.interactor.getMostStarredGithubRepos(from: self.presenter.activePage, isToUsePullRefresh: false) - - } - - } - return mostStarredGithubReposCell } diff --git a/mobile-coding-challenge/Extensions/UIViewController + Extension.swift b/mobile-coding-challenge/Extensions/UIViewController + Extension.swift index 05903d1..c9c089c 100644 --- a/mobile-coding-challenge/Extensions/UIViewController + Extension.swift +++ b/mobile-coding-challenge/Extensions/UIViewController + Extension.swift @@ -10,7 +10,7 @@ import UIKit extension UIViewController{ - func showAlert(title: String, message: String){ + func showSimpleAlert(title: String, message: String){ let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) From 29a99fb5da5b6e2a27b9bf59f48689c10e4518a6 Mon Sep 17 00:00:00 2001 From: Mobile Date: Sun, 20 Sep 2020 12:56:30 +0100 Subject: [PATCH 7/7] Fixing Short Value of Integer, clearing KingFisher Cache whenever the app starts, adding app icon and implementing UNIT TESTS --- Podfile | 7 + Podfile.lock | 2 +- README.md | 18 ++ mobile-coding-challenge-unit-tests/Info.plist | 22 +++ .../MostStarredGithubReposJSONTests.swift | 106 +++++++++++ .../ShortValueOfIntTests.swift | 23 +++ .../project.pbxproj | 172 ++++++++++++++++++ .../xcschemes/xcschememanagement.plist | 2 +- mobile-coding-challenge/AppDelegate.swift | 11 +- .../AppIcon.appiconset/100.png | Bin 0 -> 3071 bytes .../AppIcon.appiconset/1024.png | Bin 0 -> 104405 bytes .../AppIcon.appiconset/114.png | Bin 0 -> 3439 bytes .../AppIcon.appiconset/120.png | Bin 0 -> 3594 bytes .../AppIcon.appiconset/144.png | Bin 0 -> 4401 bytes .../AppIcon.appiconset/152.png | Bin 0 -> 4656 bytes .../AppIcon.appiconset/167.png | Bin 0 -> 5116 bytes .../AppIcon.appiconset/180.png | Bin 0 -> 5523 bytes .../Assets.xcassets/AppIcon.appiconset/20.png | Bin 0 -> 722 bytes .../Assets.xcassets/AppIcon.appiconset/29.png | Bin 0 -> 1075 bytes .../Assets.xcassets/AppIcon.appiconset/40.png | Bin 0 -> 1391 bytes .../Assets.xcassets/AppIcon.appiconset/50.png | Bin 0 -> 1694 bytes .../Assets.xcassets/AppIcon.appiconset/57.png | Bin 0 -> 1822 bytes .../Assets.xcassets/AppIcon.appiconset/58.png | Bin 0 -> 1897 bytes .../Assets.xcassets/AppIcon.appiconset/60.png | Bin 0 -> 1912 bytes .../Assets.xcassets/AppIcon.appiconset/72.png | Bin 0 -> 2253 bytes .../Assets.xcassets/AppIcon.appiconset/76.png | Bin 0 -> 2353 bytes .../Assets.xcassets/AppIcon.appiconset/80.png | Bin 0 -> 2484 bytes .../Assets.xcassets/AppIcon.appiconset/87.png | Bin 0 -> 2690 bytes .../AppIcon.appiconset/Contents.json | 99 +--------- .../MostStarredGithubReposInteractor.swift | 45 ++--- .../Extensions/Date + Extension.swift | 2 +- .../Extensions/Int + Extension.swift | 4 +- 32 files changed, 386 insertions(+), 127 deletions(-) create mode 100644 README.md create mode 100644 mobile-coding-challenge-unit-tests/Info.plist create mode 100644 mobile-coding-challenge-unit-tests/MostStarredGithubReposJSONTests.swift create mode 100644 mobile-coding-challenge-unit-tests/ShortValueOfIntTests.swift create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/100.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/1024.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/114.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/120.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/144.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/152.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/167.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/180.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/20.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/29.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/40.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/50.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/57.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/58.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/60.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/72.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/76.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/80.png create mode 100644 mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/87.png diff --git a/Podfile b/Podfile index 6c92502..a00d849 100644 --- a/Podfile +++ b/Podfile @@ -10,5 +10,12 @@ target 'mobile-coding-challenge' do pod 'SwiftyJSON' pod 'Kingfisher' +end + +target 'mobile-coding-challenge-unit-tests' do + inherit! :search_paths + + pod 'Moya' + pod 'SwiftyJSON' end diff --git a/Podfile.lock b/Podfile.lock index 4a5365f..6ed70c8 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -27,6 +27,6 @@ SPEC CHECKSUMS: Moya: 5b45dacb75adb009f97fde91c204c1e565d31916 SwiftyJSON: 36413e04c44ee145039d332b4f4e2d3e8d6c4db7 -PODFILE CHECKSUM: d23fdf201dec1cc3a8c431afc68a2a4d81355adb +PODFILE CHECKSUM: 9a7dc13e8ed477ab04dc26d1d80a1fa72dece796 COCOAPODS: 1.9.3 diff --git a/README.md b/README.md new file mode 100644 index 0000000..b0d2b72 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# Mobile Coding Challenge by [Gemography](https://github.com/gemography) + +## Idea of the App + +The task is just to implement a small app that will list the most starred Github repos that were created in the last 30 days. + +## How to run the challenge project? + +1. Clone this repo. +2. Open shell window and navigate to project folder. +3. Run +```bash +pod install +``` +4. Open mobile-coding-challenge.xcworkspace and run the project on selected device or simulator. + + +Good luck! diff --git a/mobile-coding-challenge-unit-tests/Info.plist b/mobile-coding-challenge-unit-tests/Info.plist new file mode 100644 index 0000000..64d65ca --- /dev/null +++ b/mobile-coding-challenge-unit-tests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/mobile-coding-challenge-unit-tests/MostStarredGithubReposJSONTests.swift b/mobile-coding-challenge-unit-tests/MostStarredGithubReposJSONTests.swift new file mode 100644 index 0000000..c6eef12 --- /dev/null +++ b/mobile-coding-challenge-unit-tests/MostStarredGithubReposJSONTests.swift @@ -0,0 +1,106 @@ +// +// MostStarredGithubReposJSONTests.swift +// mobile-coding-challenge-unit-tests +// +// Created by Mobile on 9/20/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import XCTest +import Moya +import SwiftyJSON + +class MostStarredGithubReposJSONTests: XCTestCase { + + override func setUp() { + super.setUp() + + self.continueAfterFailure = false + + } + + func testForIsTheMostStarredGithubReposJSONCorrect(){ + + let expectation = self.expectation(description: "theMostStarredGithubReposJSONExpectation") + + var previousMonthDate: Date? + + if let _previousMonthDate = Calendar.current.date(byAdding: .month, value: -1, to: Date()){ + + previousMonthDate = _previousMonthDate + + let requestProvider = MoyaProvider() + + requestProvider.request(.getMostGithubRepos(created_at: previousMonthDate!.formattedDate(using: "YYYY-MM-dd"), page: 1)) { result in + + switch result { + case let .success(moyaResponse): + + let responseJSON = JSON(moyaResponse.data) + + var mostStarredGithubRepos: [JSON]? + var totalCount : Int? + + if moyaResponse.statusCode == 200{ + + if let _mostStarredGithubRepos = responseJSON["items"].array{ + + if let _totalCount = responseJSON["total_count"].int{ + + mostStarredGithubRepos = _mostStarredGithubRepos + + totalCount = _totalCount + + var totalChecks: Int = 0 + + for _mostStarredGithubRepo in mostStarredGithubRepos!{ + + let mostStarredGithubRepo = GithubRepositoryEntity(from: _mostStarredGithubRepo) + + XCTAssertNotNil(mostStarredGithubRepo, "TEST: IS THE MOST STARRED GITHUB REPOS JSON CORRECT => Response JSON is not fit : Something missed from GithubRepositoryEntity") + + totalChecks += 1 + + } + + XCTAssertEqual(totalChecks, mostStarredGithubRepos!.count) + expectation.fulfill() + + return + + } + + XCTAssertNotNil(totalCount, "TEST: IS THE MOST STARRED GITHUB REPOS JSON CORRECT => Response JSON is not fit : (total_count => Int) is not exists or is not an integer.") + + return + + } + + XCTAssertNotNil(mostStarredGithubRepos, "TEST: IS THE MOST STARRED GITHUB REPOS JSON CORRECT => Response JSON is not fit : [items] is not exists or is not an array.") + + return + + } + + XCTAssertEqual(moyaResponse.statusCode, 200, "TEST: IS THE MOST STARRED GITHUB REPOS JSON CORRECT => Created_at is not fit") + expectation.fulfill() + + + default: + expectation.fulfill() + + } + + } + + self.wait(for: [expectation], timeout: 10.0) + + return + + } + + XCTAssertNotNil(previousMonthDate, "TEST: IS THE MOST STARRED GITHUB REPOS JSON CORRECT => Previous month date is incorrect") + + } + +} diff --git a/mobile-coding-challenge-unit-tests/ShortValueOfIntTests.swift b/mobile-coding-challenge-unit-tests/ShortValueOfIntTests.swift new file mode 100644 index 0000000..238cef3 --- /dev/null +++ b/mobile-coding-challenge-unit-tests/ShortValueOfIntTests.swift @@ -0,0 +1,23 @@ +// +// ShortValueOfIntTests.swift +// mobile-coding-challenge-unit-tests +// +// Created by Mobile on 9/20/20. +// Copyright © 2020 Zakariae. All rights reserved. +// + +import XCTest + +class ShortValueOfIntTests: XCTestCase { + + func testForIsShortValueOfIntCorrect(){ + + XCTAssertEqual(100.shortValue, "100") + XCTAssertEqual((-800).shortValue, "-800") + XCTAssertEqual(8000.shortValue, "8.0K") + XCTAssertEqual(2000000.shortValue, "2.0M") + XCTAssertEqual(100000000000.shortValue, "+100...") + + } + +} diff --git a/mobile-coding-challenge.xcodeproj/project.pbxproj b/mobile-coding-challenge.xcodeproj/project.pbxproj index 1790ca5..2c58ea2 100644 --- a/mobile-coding-challenge.xcodeproj/project.pbxproj +++ b/mobile-coding-challenge.xcodeproj/project.pbxproj @@ -25,12 +25,30 @@ 75620E742516987F00F87394 /* String + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E732516987F00F87394 /* String + Extension.swift */; }; 75620E772516A8B800F87394 /* RequestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E762516A8B800F87394 /* RequestHandler.swift */; }; 75620E7A2516B5DF00F87394 /* Date + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E782516B58B00F87394 /* Date + Extension.swift */; }; + 7572ADA625175C2500C8679A /* ShortValueOfIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7572ADA525175C2500C8679A /* ShortValueOfIntTests.swift */; }; + 7572ADA725175CBD00C8679A /* Int + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E712516895A00F87394 /* Int + Extension.swift */; }; + 7572ADA925175DA000C8679A /* MostStarredGithubReposJSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7572ADA825175DA000C8679A /* MostStarredGithubReposJSONTests.swift */; }; + 7572ADAA25175F2800C8679A /* MostStarredGithubReposEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E592516562600F87394 /* MostStarredGithubReposEntity.swift */; }; + 7572ADAB25175F3400C8679A /* RequestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E762516A8B800F87394 /* RequestHandler.swift */; }; + 7572ADAC251760B700C8679A /* Date + Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75620E782516B58B00F87394 /* Date + Extension.swift */; }; 7F2954C3013C6DFD1EB57D67 /* Pods_mobile_coding_challenge.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F57D743DE22E5A3A3F84BF3F /* Pods_mobile_coding_challenge.framework */; }; + A01CAA4FF1F4C7C6B5E2D638 /* libPods-mobile-coding-challenge-unit-tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 51F66A9D032FA7F46C709E77 /* libPods-mobile-coding-challenge-unit-tests.a */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 7572ADA025175BAF00C8679A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75620E2F2516548300F87394 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 75620E362516548300F87394; + remoteInfo = "mobile-coding-challenge"; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ 0F01CB3D02F0E5BDDFE0704F /* Pods-mobile-coding-challenge.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mobile-coding-challenge.debug.xcconfig"; path = "Target Support Files/Pods-mobile-coding-challenge/Pods-mobile-coding-challenge.debug.xcconfig"; sourceTree = ""; }; 4D18A88125FC096583B5DE6D /* Pods-mobile-coding-challenge.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mobile-coding-challenge.release.xcconfig"; path = "Target Support Files/Pods-mobile-coding-challenge/Pods-mobile-coding-challenge.release.xcconfig"; sourceTree = ""; }; + 51F66A9D032FA7F46C709E77 /* libPods-mobile-coding-challenge-unit-tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-mobile-coding-challenge-unit-tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 75620E372516548300F87394 /* mobile-coding-challenge.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "mobile-coding-challenge.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 75620E3A2516548300F87394 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 75620E432516548700F87394 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -51,6 +69,12 @@ 75620E732516987F00F87394 /* String + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String + Extension.swift"; sourceTree = ""; }; 75620E762516A8B800F87394 /* RequestHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestHandler.swift; sourceTree = ""; }; 75620E782516B58B00F87394 /* Date + Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date + Extension.swift"; sourceTree = ""; }; + 7572AD9B25175BAF00C8679A /* mobile-coding-challenge-unit-tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "mobile-coding-challenge-unit-tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7572AD9F25175BAF00C8679A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7572ADA525175C2500C8679A /* ShortValueOfIntTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortValueOfIntTests.swift; sourceTree = ""; }; + 7572ADA825175DA000C8679A /* MostStarredGithubReposJSONTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MostStarredGithubReposJSONTests.swift; sourceTree = ""; }; + A1A46AEB5C91E0ACBF4B1D5F /* Pods-mobile-coding-challenge-unit-tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mobile-coding-challenge-unit-tests.debug.xcconfig"; path = "Target Support Files/Pods-mobile-coding-challenge-unit-tests/Pods-mobile-coding-challenge-unit-tests.debug.xcconfig"; sourceTree = ""; }; + C1CF037D9590E1CA8CBFC052 /* Pods-mobile-coding-challenge-unit-tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mobile-coding-challenge-unit-tests.release.xcconfig"; path = "Target Support Files/Pods-mobile-coding-challenge-unit-tests/Pods-mobile-coding-challenge-unit-tests.release.xcconfig"; sourceTree = ""; }; F57D743DE22E5A3A3F84BF3F /* Pods_mobile_coding_challenge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_mobile_coding_challenge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -63,6 +87,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 7572AD9825175BAF00C8679A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A01CAA4FF1F4C7C6B5E2D638 /* libPods-mobile-coding-challenge-unit-tests.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -70,6 +102,7 @@ isa = PBXGroup; children = ( 75620E392516548300F87394 /* mobile-coding-challenge */, + 7572AD9C25175BAF00C8679A /* mobile-coding-challenge-unit-tests */, 75620E382516548300F87394 /* Products */, 958ADBB33EB7D44312ABB616 /* Pods */, AC28514262F839DE19CD30B2 /* Frameworks */, @@ -80,6 +113,7 @@ isa = PBXGroup; children = ( 75620E372516548300F87394 /* mobile-coding-challenge.app */, + 7572AD9B25175BAF00C8679A /* mobile-coding-challenge-unit-tests.xctest */, ); name = Products; sourceTree = ""; @@ -158,11 +192,23 @@ path = Helpers; sourceTree = ""; }; + 7572AD9C25175BAF00C8679A /* mobile-coding-challenge-unit-tests */ = { + isa = PBXGroup; + children = ( + 7572ADA825175DA000C8679A /* MostStarredGithubReposJSONTests.swift */, + 7572ADA525175C2500C8679A /* ShortValueOfIntTests.swift */, + 7572AD9F25175BAF00C8679A /* Info.plist */, + ); + path = "mobile-coding-challenge-unit-tests"; + sourceTree = ""; + }; 958ADBB33EB7D44312ABB616 /* Pods */ = { isa = PBXGroup; children = ( 0F01CB3D02F0E5BDDFE0704F /* Pods-mobile-coding-challenge.debug.xcconfig */, 4D18A88125FC096583B5DE6D /* Pods-mobile-coding-challenge.release.xcconfig */, + A1A46AEB5C91E0ACBF4B1D5F /* Pods-mobile-coding-challenge-unit-tests.debug.xcconfig */, + C1CF037D9590E1CA8CBFC052 /* Pods-mobile-coding-challenge-unit-tests.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -171,6 +217,7 @@ isa = PBXGroup; children = ( F57D743DE22E5A3A3F84BF3F /* Pods_mobile_coding_challenge.framework */, + 51F66A9D032FA7F46C709E77 /* libPods-mobile-coding-challenge-unit-tests.a */, ); name = Frameworks; sourceTree = ""; @@ -197,6 +244,25 @@ productReference = 75620E372516548300F87394 /* mobile-coding-challenge.app */; productType = "com.apple.product-type.application"; }; + 7572AD9A25175BAF00C8679A /* mobile-coding-challenge-unit-tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7572ADA425175BAF00C8679A /* Build configuration list for PBXNativeTarget "mobile-coding-challenge-unit-tests" */; + buildPhases = ( + DAD24B4F7197FA6D4240AF37 /* [CP] Check Pods Manifest.lock */, + 7572AD9725175BAF00C8679A /* Sources */, + 7572AD9825175BAF00C8679A /* Frameworks */, + 7572AD9925175BAF00C8679A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7572ADA125175BAF00C8679A /* PBXTargetDependency */, + ); + name = "mobile-coding-challenge-unit-tests"; + productName = "mobile-coding-challenge-unit-tests"; + productReference = 7572AD9B25175BAF00C8679A /* mobile-coding-challenge-unit-tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -210,6 +276,10 @@ 75620E362516548300F87394 = { CreatedOnToolsVersion = 11.7; }; + 7572AD9A25175BAF00C8679A = { + CreatedOnToolsVersion = 11.7; + TestTargetID = 75620E362516548300F87394; + }; }; }; buildConfigurationList = 75620E322516548300F87394 /* Build configuration list for PBXProject "mobile-coding-challenge" */; @@ -226,6 +296,7 @@ projectRoot = ""; targets = ( 75620E362516548300F87394 /* mobile-coding-challenge */, + 7572AD9A25175BAF00C8679A /* mobile-coding-challenge-unit-tests */, ); }; /* End PBXProject section */ @@ -241,6 +312,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 7572AD9925175BAF00C8679A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -283,6 +361,28 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/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# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + DAD24B4F7197FA6D4240AF37 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-mobile-coding-challenge-unit-tests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/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# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -308,8 +408,29 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 7572AD9725175BAF00C8679A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7572ADA625175C2500C8679A /* ShortValueOfIntTests.swift in Sources */, + 7572ADAB25175F3400C8679A /* RequestHandler.swift in Sources */, + 7572ADA725175CBD00C8679A /* Int + Extension.swift in Sources */, + 7572ADAA25175F2800C8679A /* MostStarredGithubReposEntity.swift in Sources */, + 7572ADA925175DA000C8679A /* MostStarredGithubReposJSONTests.swift in Sources */, + 7572ADAC251760B700C8679A /* Date + Extension.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 7572ADA125175BAF00C8679A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 75620E362516548300F87394 /* mobile-coding-challenge */; + targetProxy = 7572ADA025175BAF00C8679A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 75620E452516548700F87394 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; @@ -474,6 +595,48 @@ }; name = Release; }; + 7572ADA225175BAF00C8679A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A1A46AEB5C91E0ACBF4B1D5F /* Pods-mobile-coding-challenge-unit-tests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "mobile-coding-challenge-unit-tests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.7; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.zakariae.mobile-coding-challenge-unit-tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/mobile-coding-challenge.app/mobile-coding-challenge"; + }; + name = Debug; + }; + 7572ADA325175BAF00C8679A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C1CF037D9590E1CA8CBFC052 /* Pods-mobile-coding-challenge-unit-tests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "mobile-coding-challenge-unit-tests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.7; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.zakariae.mobile-coding-challenge-unit-tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/mobile-coding-challenge.app/mobile-coding-challenge"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -495,6 +658,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 7572ADA425175BAF00C8679A /* Build configuration list for PBXNativeTarget "mobile-coding-challenge-unit-tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7572ADA225175BAF00C8679A /* Debug */, + 7572ADA325175BAF00C8679A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 75620E2F2516548300F87394 /* Project object */; diff --git a/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist b/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist index 5128861..4ce5fd5 100644 --- a/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/mobile-coding-challenge.xcodeproj/xcuserdata/mobile.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ mobile-coding-challenge.xcscheme_^#shared#^_ orderHint - 5 + 9 diff --git a/mobile-coding-challenge/AppDelegate.swift b/mobile-coding-challenge/AppDelegate.swift index 767412b..58ce5e3 100644 --- a/mobile-coding-challenge/AppDelegate.swift +++ b/mobile-coding-challenge/AppDelegate.swift @@ -7,8 +7,7 @@ // import UIKit -import Moya -import SwiftyJSON +import Kingfisher @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { @@ -21,9 +20,17 @@ class AppDelegate: UIResponder, UIApplicationDelegate { self.window?.rootViewController = BaseUINavigationController(rootViewController: MostStarredGithubReposRouter.createModule()) self.window?.makeKeyAndVisible() + self.clearKFCache() + return true } + + private func clearKFCache(){ + KingfisherManager.shared.cache.clearMemoryCache() + KingfisherManager.shared.cache.clearDiskCache() + KingfisherManager.shared.cache.cleanExpiredDiskCache() + } } diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/100.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/100.png new file mode 100644 index 0000000000000000000000000000000000000000..b75a015936610e92958647442958296e9d50dcc1 GIT binary patch literal 3071 zcmb7G`#%%@|DD@5bDL}CI+Jp(TsFDJa#THVk|Os@xu(f%M3iAu zLhsyi$tBm6OA+PvS^vTJ`*=KGuk+h^zRu%3UytWWv9dJhgGfLC007?wjLB6Ndi^_K zAnOjE%drIjczQ0F7~6&y{Fw4}wB42gZD?xp&HzuPB<0e5aMxd4%E&7PLdxbK^6VUZ z`EZlcloUy(MgYfgG=%8v+v2r7X}`L%VozI$RFTWRoC_0wgst$}S!uZw-M-VUL+7n{ zTA;Zkwbiz3*p~QfcE_zhR)^rI&yC&{#;>{=5dod6V7Pu7ptJG+2Jhh;R}UIjSDA*BW%BMx$mNiPjeI;Y^Kh^d7$1k3Co;T!$oK9c-(A$r${8UM z#O1eVnue|zpht(DOf#0r!1?O?WSZ>hI9{nvX++kgAX9zyR`4DqT`{7XC;zK+q#$~9 z8?-EIP=>w$t+oZg;7Ly-o~Wjo8P~I&UjNb4!!)ZAI)oSlu!b?S%+16LkN#ZVzo@cObbjo8E6}xQtsvv1MVrUcWHFi@KFinnA0hXYL#0O_cdCQy)X~ zcbqvBwXlOTV*nFi7BOHT`gMP483iQAMtws*j;N3^SCI(*O<@BG*m{os&JZLo0%W3( z13VhaMM?7OSaFd0fac+$kFupyYhVKITL!mdDLv~as%s;IQWm8dxvee;7w)JCA@{Msd@T)8%hJawQ)J*g$* z@ytw&bJ!dWq{Kv(HqY3@AI*C=8I=ciezuu90}Ddvf42>4+IY(C$w`o!6N08CyB`?} zd)V^TVJG>BTs_3j0{6%ZA4Yw>HrlhTzqB_-@^ous z5+@eZP(&ErRhR#1_j4iyNlrBeRlp|*-?fAm+*brd-dSPJy5xHU2;cN@k4rH0n6N=E z_41+BAjHM69zW_iMPskm{xh&@BqrUTO_J{N%$Ox{uqq$x*OF3gV}E42Ry2^V*2dJYejf%rGineAeOt>2gsRe{%Hpc8rF% z9h#@B?Nrg$K39N+R}jKSC39a@-m-YPOD_m{)ozZHsy)po-sK{Fb>*zj%O`@;BX2Go zy**BZExcQh%-tIFu&g1Vn9J5z%IgTNhY7x!1zWg+qrbp1+e$^~oh1b=BPM_J_`_pl zhuiCM^WLzK#il?hgDuS_w}9_6?0MRiQZ0GX1!2p536zpKBT2(Q%M!yG7^lM5pMXwU zM|@Q~!2-ATXs_=UKj^gI->a3;KZ6q+4zPH3XZFZ$SpeXZP8FNXDdayn-M+Xg zE0j$J=7s^9{hRf*$yE7;j*_~H99)d?pZCw3T@KvN>h&Im`tI5brnoe-%js<={`$gb zY%tr6yxw(j+D~-{r~O{c4ZqWQiOBcDyfX>dRmDpYmJEEe<|S;eW&nD@2tVxf_le z{HSNy^K^Bj2f9N9e)dHgbh5ANz-$#ob-$1QRY9OTDvV_2>jff$3m_NrpM|6{yD(YiXdGA;i8Ee$AVOQp7Mn~*V^gQG0_ZLTs%J^d}m4{`M< zV6l;^9io`RH$g)+x+=KDu{3)LB%sjrMdjfC#ZGc;a}msI)8B4R^I#MVB~2 z^3ZG!U0NKqC1^$~(P-W)lnS{IYZCEQ`uhV&3Rj=F~chiv7~1+zI8bjVu%l+!?PQvG?7Sz}5IEv;kDcNb=@A8$;pf zm&d7VtdrG=PZREj=Hd-nS7$rQB&acrZZQlIotDjb;W<8}hI&ipCL&YcbNFW!er7*c zoQ5*Ra+p*P&gGmR-J~!s_$9Zgd>#0JgO4a?PYPu|juuskIz1i`U>VqaH(QHCmIP2PN_^Qhh%k^e%Fz694<(I~pFZl&0# zg}t0W;PlCA`=jh?@E^&%@`Uw=A#q|ib^0xHoC`Oi-5U`Zb)PbIg0t>#N|qlM!qOsl z)hYSExj--PA@^M}qfR&Y4oQI=*$6uu+DGvUOt;MfqzB-T~ z*@t31w?@TLp*6$2QJIA$Wo~L7P);@w2)5X7n0C`SbnL-c`u3p%>yvQH4)EO7vTe74 zF6c%FA^(lMr5Whm4owdIN1>-x^@ok9i}d})-(Ot61>XIYka_X?CQ}57GO@)n(kxi* ziSDLqkM>+B>@|c82T?myuQvTY$pz+7)X$FT{f*wK#F`S_<6YuedE=y)4^GWj^KEQL z%38|fuHAfiM|%Gl=!}ipTC_V;GEvN9aVx=5c0-LCI3n+BBP{eaA1Y{{ToQL}_r*S} z_OSy!s8?Y(@*u8iP`9f}La^M=B#I)KKX-YoW!quCTF?6GSmNUyS9;NPq$73L^YSg5 z-xCdn@!5+hGk8o#&5^UQg=remZtkUU!$XLWhre~M zf2ZpQJFiM@#7!E%o?D&S*x%FSnO^yDN12RS`m-H9-I>9?j5piUADp3=REw+0?QE^F z#~*woKei;4(?xhC|B5G_eaFgm2idD6>DhMdOS838ag7gv)0Yy3@ozPo=AXREWlq$VR zkU{ueZK2d|gj)RZK zVW%j-5BN3qKp5->?AepY8XhTYKP`QJy899#tnPSBCGMlS?o`=)1FkB&9M@l^cp=@q z>Vttyz!#=3T(p!y6@4G+PYIg@o%_;x^IeFYXYa#+J|YpVKZeoXC-&WJR6mXl5{HJGO{hOonSE#%RI>z$HtM{ki1bVgw}e=ul?mHbyIcq*qzabpiEM zoX#=r0>_Va#X*~sip~#{7GCjnEnCG5j&bCbKU1>onqT6wEPq~NQS+SBxkhinxvG7^ zPSGz-_5Je_0rMI?Mb6Hot+`hnsJiF&9T?281@XXsQ68oaOa}cQlSvrV~%Q-UHQc{wb!(y#{|IjRSgZ}pO@&CO(dI@4|iA~`N<K zQeKgP>GxUZCm_=*lBb51eNkiG)q+ZAU^W93(6SV~&>bOauPDZCe@)!A*|6YjmYP78 z47F@>S=k~Rw|g|@R=kzW3VcABF)M*+bxhEyGNq-umQjT{>fw@d8Z#G`>j9< z283nirXl&mT$;i}$7OD1;Z5#ZnY_j(#(nkbh4`*g%}xtsd`o|k-6+Sx5|@_hj14%j zw&pj(VJ**Lm5XxJ`&5B8_EUL#RTD$~#7C}f^|~&?m`u-9$KlsK)z&j9?l%3C?zWpp zxB|R1+<#pCZs-@t7$GBcjmr7a)$dG#AceF(+UAy(Te7oQHaa`gvk6wqdwTw4Yd6Zx z{G!RmIhEhJ^|KIpy0FGif;ZVHCt_sOMhSnF4>gCXOy9QGsG0F~90VcY@^9lo9(cKMCeu zDN4`lX|%7zv(xd+K_Zd&R=gE9rrpwKjMWYJOhSlQhW{G zf8X@x5+$-5p|@5`Twg#6y~{b6T*S(bKn^7&UmUL8HaDpsWcQ zNES7Q!_?ZZv4($BW?zIqoe(5S$k&QxF19|Vqvzl!_dn)Bp2@)pvtj{Oo4!kGcOKE% zUPtPqxYW_L-_?p@pW=x{Y29g*Fg0N3D-CKc4;6QJ)qBSm5-Gc}1u;LTvNq4YMUcq52O zMR_!&^3`S=$g6d|sqNFC7G!_K`RD=LX#v|Q*><}U6m5x$$)mnf`lE393Bjp?)MR)* zc%>WYZ>V8=5Z2f|@A)ZTgoyWsHl_!^Ft&a5V2`LooWgWr@aeA!k@x0370zRsr3rJP zCnIcc_{d2`motQ>464i@WjFs8q6+S{e&}U*tN%SigyDeBQCaJ(vbE7Huo#q2AXi>( znuf1_jE1tbsi4R`8e%o|S%PkLm`E{!Jf5FHIHwek8?V}|(<}Rh9iDs`RYfKNY}nKt z2Ht<)^lT*azjEwhZV;?$=iCj~aU(P8gP_Hzr1-rw-;A?aI>D-(dF6^iV=kHrXpKA4 zwi>!s>ilsI!=n_#8VD8r!TfQ3hryJ+QQOB$`osK?sNVSQ`C`MpNImolwY@H6G~T%E zJzh7*wTmSdfb&Otd`I-RP0Yf_PPcwYS{+H2t6T2*A8m5OKw@&qqz8qoXju7AV~|8I{o;Ejt>vq z&(TDaFVHV3m4m0rtB6@Cla6|RKpN_V`$)&?O*GVLVou6S;9 zyDC+ik`>2Gy{t`M2Kn3Jt-V%!etIp@7eT)DsobuK5kL3nrJ^e4NsPN>wB@Tch6piB z6Rc{Gs4U%HSQkb(?d(MnZ9kL*CJsTf$MnGxhpn{Tj;wH4h_7(km>5>Mr1h9MTOkay za5@Q2DaZ<%xCBMFc1`UdVroHoZy!<9f+!g{s$tm1+s>D=z&rMommOe;ezi&UR&K8lNTP?ZMVT63o$w=*wzJV7t1l@GZq(4D$_m-ClTa_u5o zTb|xmr>jo9Bu-uoS=oio-(|=4eXN8s)~_~Z{nX!xvBddO?ulnV`TaKdCJX<^hbTf| zylYoGlWW)S!CLeE-dg*e-dfjrYfx1xK(wpkPo@nu26TA4}++a=LS>{Wcv1qiVYgNJc4(%Tbh+YBLgBrs-JK z8h3(>u%NHes+OPbnZ_wT_vE_+ z%I>XSK)#<>^oJEl;fPef$(!(Rp64%yIg8S4%RQuLajnGa-BeBC; zjT~M(murcnFe^M0#y)>V`$uvi>^3}d{t!~#Mr=nNBhUcT8-Ut}9Ax{WT~4l%un_m@ zF4J(e`)ECE_jQOODH z@W4i-^=>G9Ah;4LDZYwEHVA{%z&22N`k|iudP&t5VSU?8@>ah(Lqyt$%6vA3WE=mv zBo&c|8Bd%f-%Y>#Mt(8$WLmE=K`xeYC)T9tiC((X!ctaa3&^efsdaZ-5M!*}gjL8azDWFB@Z+cdFBx z&_9&JCXUuo%@efK4_H;jI9aMnRRB5)%L%SYm;)_N!{6?D{oAa?1_$Q$&+$y-jRzs) zb=yl@dqe;tT0&36_!4}{FYOf0IW9>71XO08rEN8w~ermPjvT6sWUbP&p#p#rxGmn7nsn_YLEyQ%!ipw zBAuHK<`V}F2YXLCqWn{)9sQD(y*%-*C8vsZ6UUF;X|>-`)< zZ7SBK&C!yt`4K5~0>Dttsr1gR)WYJu{0uGtO_(eBv4cfb+DMm?tNf^K#|q;fVbJ{= zR&;kvII+YxTHJ(`k>aB=f#QSOD*OGaJ-a%6?`q5~>=cHr4|;pEQ7ZHx(i$}Smi}#! zjM<=TKSMDP%SoLZ)UuJr0C5{WVm3ufJRf6Sc0k_=sy72#I20wB+NIyuQt6Ln8H^jqp;E1U@@kc@m z;>acbQt{Ep#GGOnsgD{P03F2NGHzvS!k&N8{AJwY3HY}MVa{XgRGmE=8mcpF!y0=9 z#ny;LKy=<;sy6~9ufUZZUD&FZDQg}6>F4d02NfE^3nvgOyLm(H_gBmX z1u01FI(0aDZF`AJt6StXLfe%+vVFuFd-I4H7?ggx`gbCI(^bjx`v4ZGdLgB64HXNI80IsxwKzoSy z_|pd%&_&U|a^~5f@;5Mb@58|mXlc9~(bx%ZIO$2M=f4MT0IO+V?Uyy(a;l2!z%No6fLs+w26JjR+8iyri-D(&tIlCtpiuy2&G#{pb#Xt z*8c(xV47|wv6i4%rtF4a9Z=dsD)K)F(;KtfEt^OJbu}TGthlo$Eo*IUjFbRMJw6Ky zuE7@ zSpYl&5UCyXcPHJf&G#hiyCQ5&o!K@RtWl1J54(6P~!u@-AJXcuCaHk$dqjxj=1V6-ViR;~goiFw0`=bT2FsNC(xg+pa;;<Zp&wgy5u*&^{i2UG1y;(|3KRL0GLcO*6TIx(*%vs*Yyr0jmZ4KVR-n>&;Vbi?m9fMn092>*42CSJ5!&ttC|r~eFK`$PmUtd;H!2e^6#AKV zEnyI`fs|XtjdpEVeH`q+o0p}lWQly=mY z9IC=<$~%^Y$ljQ*xZ0R8WgxEJPKXM=*#>GCkTxz=z^7wm<}UGF7E5-!2*v5|tJ@wC zr{>2S(YUAsp2{zf9n0aUw{hbbsh0bHCq;K{f?pZJ=L`4ns{6yFxU(=d|d1sZCFM?2#4FVpR;a}7+kTbNt!e~%P;5cZ(v`8wNoqm0n9)Iub6e$GpcatmV6Vy`EXp8LpOixYp+UWdSM zKjD<;=GY+LAneD6D>3S&s#X_#uVF`vaE_MgMsUi436~OO_Vc#MzqXyqY?t&xhl#SMo*V zmlMKQ^nR0Z8f{q@>$`?j+3iOF&FTqY$@doFPk12aJFn+L@ojW80FR1gMhTCtM;=Bf z?j4xsA|DaN4vz%6NZB5B1>E`hr2;>A;931t&rXC|{Mz0`^8Bl+j)j${ey;>N7VI=W zA~kD-$~9H`ipvHRfz)QLHDP4cJn3$2J-QAmGylkx;n}@{-ccva_vRfE zKoOL?B9l0_$<6P$$sOOVh2qc-0m^S-zEhl>yg*^$i@cRWQJccZ!eUPiP;T;pB9mqQ z6VW$L*Zl3f-@m&6MgzH(P=V;g#z$`)3aEEQ`OsUS)bTUa1zV0PPb48NVBH*DkrHb1H|{Z_}9UQk)r)ffs%uyKeCx1^whf=(%AS( zQZ>kcl*qbrRa?XZ6c%2F(C2-|zg`0Yg8y7?dVsNBHO5^{6}wr%yfyCY=dg+H{}Zr( z^6CzcFS)S|8sp#?^RqvD{tkR$u}?EfgisyVF=M6WXBY|U3o^%AVcP-<|M-dkA1^&z z9j{pq+1hB3eT+lVZHi{+V^yVnBiRAl321Dib7oTe!RtWndr|ulff%c;u!%l}@%mDnh;`p*y-l5>> zzd>1VJi4-o)J*LLm3FT8x7jKZ9{->0li5b~+uTqRY@`|721s1t#w7 za?39f$gWx>Pny`Y;7o(WfB;DHcG(|qJ03RfIY0$K&eBfD(g5`i2z5%Pn=E_`-fE`r z^7sIi4$OEjcf2=|tcewn=K(Ez9_}#GDG{ScDoHRil5oJ?KIDfUe3i3=;izj+4K9AL zZUJ5C@I#mDde*$xG^~>94sS^s+|<@9``w~fy@eca-1G)oy*d!+i=&nvgY&bkz@Il0 zNe)*1>ivCf8=)rR^r!=_#{;o`yUPv({a?J6F!Gpm$A3cI%%%-qNFl`7;ooF|itjdL zsmn41US3%IuC3b7rm3}4NQ$eadZ{jNF_PfVj4MH~E_#DHoCW+jVs%s`lWECME0oGO zFH*qF?diqzt4=EqF>zS@o^+Ex$LhW38VhN3paeThhZEU}bk^6P`6U7GhO+17ajBx( zK;2JLt<@2<Chmm=?NFI?4)Ev`)FIf()*bh(wfj zZzhdx_ZG?u%xZ?Kx7)UGKT%Ojq*(;pnrMD0zVznQ>2E%Hv^e13C}+J-9r}bknpbUK z3&jT@v;@iU512tAvmDBwckwGIfd>Npsl&L*!j_NRpK{EO&iN6;hd6%q69@7dhE)dL zyHX&g={eVHf#`o!2il4Tb1%8vaT?ou&XO%aRXCNSg^!ie`{B*8o=dznITX1RK)S~t z=f)a9L)LKTzE5Ke-_zjXW4ovrlOZqzi*K2_8Pf2K%QD&71t{+SfX6bQc!t%i6)Q*{ z4Brfkb+&Zv_3%_cQVY5{B?}~rKC7dYy*pe$gStZ{%ayQ7=s0&{?TR4&=%iwS1GHm_ zFTs_*yGla_Zr%=LYyWQs%ZI|(?42K3f>iA;o49IrxpHyZ$c`u#jLx~e)&FdQ9 z;R^4jpMCRTp#w?#eeHlnTs%>rNKt{>b_c(C^tUuOO=X*5(ALfb&*roHwY?Ad*QHH2lURh*5P9x|@bQWgxLnTKo(w=kon89bSAy6zRcjS@ z`I)S!>kG}iK!j&qNmlv6 zTau11eN70Vb!L+DZjJO4Csva*F$oJ`P>$)9rK6ZYMWkmkJW%L&eAoR>v&+(dQnV6q zaxm3a(~R@AabVQ2#IFK@g`ih6&pTeaVpL(eO+%{vK_WElv%)|q{v4cT$qyh`|BpL> z6tbTev88}@Q29sU-%4(@P%1C)mv2NuoPXQSnFI#d!_;EuM-vLgAbz?Bp$jhi%G46N zC2n+d#ai}?Du7B4&jw*fSImw2MyT8i;iJkVw`DfU(w$+{`i@{|yi2P^Qex_5E0Gewy`Bx=4LyutIq6HfbwM-KUQrAdE9*7>JM7I4Sktmq zENKk_*|N4Ts3^8%d0BJux44u*mI9Y-?3PQNhH9-rad?*A{iSPqH9Jg|o<9YL>*gE| z4mY&>2UC7$F`gZfNs2y9F~Ak%t5U z{f2{2GQq`i)ZWEqDfVpNSGB;ruu>o*-*(Eo(qZ8mX;u#M3h>yX=5|m)B9*U}M6k}L z-Z#Kz&^!fI_#b@Xal&?FD8tNaR6Iv3Sd~2_OLt87T4%RGdgg0$Htw;aLmLDbplOcQ zD>qJS-^^#mEg-~BUi)! zP2Fj_T-^xP-owgvYrl$#7I4qr8#> zY=7q+#7HYYl-rmpuKr{DEkz5^s)SLWzTOGH!)43&v3{O=ML6TFpywd`9_R5>FFTkV zPW?3!3KnjS$fJQk0_iQh%H}$<6(IMQb9wuWnpZ%-(%E?tSz#8-usXMruIg*Q;&%)%)e{{|}@v#b81^||TEO`0UMHrHi_ZBNrTqVj+HQ?^edOs!4 zcu6I#WOd(1FEC?p(Vo~wyBU!zHOSMCYYUJ3Yc`7b`aW#u@BW9L1qc<jSP^1^8$C zp=IjB(Jw2lk4S@>8iOPr)6_zC{Lpy4@|nd(dG?P!TFGF}3&6dKh=6&Ce!x9Jd_#NAVN6lPd_YInq5y zd~ii3Zf%dkyk=Z8YP7g4hO-bAUf8fZ48l28uXcY9KtA^I+8N;$j4$d-nz$9vdraTG zC&|VnfgG@iC({*~ji-YqWxD>9o2GEd!6McUssYPWre-EVp+Rzg zwLjS#URG{VP-Wvam zn+(Y_w!s`#{icV^O9%{4FIu3*U28C(g*14M=442K_7BK(BA4I8r}pS}kbUjvs1vOr zI+hD2C?9Edn4q+)kW$h?>>39B$cU=ZLd*V;O3!t8NBPoH=>Bz$o3C`pGqS*7Akf$O zvK-a3w(ee*?*Z=`#SP#6R~2q_TPNMEBZ53Vn>E6?k2L2kG;^lE%7r+>+1G?_!X3AS&`vhPh*-b+ zn}0djBPXD6!AaVZiI%KU&npmXQ(F^VEV zy3VH~UWwS>%Up^~rurA0HMzdZ!8%rxc32YD2v=oN$MC4ApN6;M%XMpNwn=kh8>9%> z)Y5#vga!jbAKiutc#+PuYIv)XEhORm6aLUk70?zi(%-^e=R@oWi>!YDKABYb>-&;G z3zr2n3Du9`9G|Y@%p=zb-s;6>{p+JUE z5`|!SW&E2p{7%{s=srODqx5d2d&Ts@5j#g&OOqqIE(>Jh{|?i|A#^0nSnOP5!PYel z_=2LFe&86cSFny41SCkXeD|bs*swe4z~;}Gt8#67{PQBF!gP>kxO(ooryFF*1AV4w zvE*Z{$?x9>$b=g-3}CtJn^UHXeeiv`Uc?}L^26Vw8M;LbQTUfjaV^;irIwqO^LLT} z(TQ9+5;1c%M_BZF1%Bi{2&*cBK8kqzl|fzwp;NT|E|#3T}k;a3DRK0VkE-;XW##KmsPh&W)0fTd3nlu2+JU zx6}3$JEDMJW(D+_06+q0k4)gqpmiYejb|2Qa^OvqoJTxMD82AEnBt#q-wv6htZV34 z!;dBi9%&~wKsG|DoSnV;*#onRU?0i4XRZ1V5C%(V3#)|6*??ONiYdd50rCJdK0xfs zrya`Hw}BF-+U`r5D92tRzTBc&y+Nucq|)heny<^jF}h{y!5Gf{x$BHkoRAeQ33OMF zvIAui_`$V;kmFS=R=5j*=}#c|l7Q(U4cmDUu%o0K{uPK+ZmRF5b-xh`V8&n8_DMH- zLj}`0_t!e|w?$!AJi?%@J=8a^7EH<`g2B{HFs$wD&`s|Q6?5(Jiq+!Azjm`bjDDSl zVWoeV|KxZ6Y{0vYjJsnv<WnQ8t)$~5&UcI zOOIW~pFwfV%|N07({ns=xFZ9TAJ;OK&jFSQ7u*V7wE{5qCPt8e^O2hnAWEFaN-?}k z9UwN#gKnkU(tn18E!VDSxBIrg(qUG%8HU~-RDfdC^p8~fhvQA3u;RM|Ptn6FyB+DX zC?DAGX~0zM#WuCM>Wa05bg!|o>6DDypdaZOAvaDi_0?(`4X1%q{D9IaBxU(Qh3Max z1`7u^pkwer&!p?y?s^lKufm@1on-uD91j72Cy1krdj(_?&MHvtJO|nbegDITVRI8HZ1u8 zFvKS<=7v&g<(JvT>s<{2v*3wJ8?b;0ssQb#NOu1Z)@zq*v&p5DZTQ?kb}&V|_s&u7 zG2K26OS|~jqf0j$wlOzDvJ{mplT#uD#@4$Rli=Y(``V-kzf9-+FqyPZ1W+8vBrsa1 z0*j94?R8v3ys9CcX5vYH+B86->t#&i`53^!cv^_GsIhrn(Qs#}(Rmf<&QYiT#-q!9 zz+WFt%)jbUI0IYhj)mCc2|yeHF`i!*Qw*+eYq+EjP9Scx1T6E5SbQO%g&`tk$Z5Wa zgw_v~72Tj%Uuc=Ud-r;Y|J7@MFT6d(5z=Dj_#gxtpYKGgasqnFrH$NjuG7#eQ&ij~ zPZ~WCDAqd^S|4+Zzu71Y;ARea;3a-~G~jO_-sdQHu0?|>!u$UIV zvTcOOy5k2D+b-^5JVKgZrYpO`4|?Q>WL|CQAf$%DSl&o3LGK~X5j^@5$@p~6;@Q#r zV3VM>h&)i)n!`_bbNUJh!}*^sDrr9>*?!$U4l}&`_b%20qXhL9c(Ty(iiAtVoI@f& z&j2IEfpH4mJTAZf6_R1~;!4Wy-Cd5uwNu?Feel19L1$_R@JYMa z!713>=&GtE{%S?` z>MasL0NUOXrT6t=pvVB44}c-BHZd}p96G=K8oerdn@o`X-zyqhcgvL!SfG|E3tOS;v)HadxQbKj}wD>F^?)(>cKxntun+s@XEKcO%ByLQ0ldTh2?! zY>x&8n-;M9fT}3M$Bvh6Bs*gpwa;U-w1c50-8;wffO_yi8ET6)fa90}3mMQNo(9vD zOaIn|(hob0@a=i{q;P6EK(x(_$G%$_+ehi*PS}Gr*!o)ga z389D7HurrbTfiPHB|?1??p20m;t7ca9<_Xa{t?t9|K_hhb+$Ut0zk>W3Q=V_bOyn} zBBrwoeSW509Z+=n(c9O+hC%sw)r|1gE)i%oCV+L?+;&rX*K`HQ0U(DGT8OG#`{agN z|FYYr2T6I>YBslkZu-F_TMLpmFW2l?wo`N1I7ZqVwjE3WOL_5HoP>I?+LKoA4F}9M zib9HopH@s5uw~~3=xxmgTqlDyp7?2lroQ6e%xqFD=2_pi*mi@=FyaT5URMCGkOP6j z2L5Oy4pFT`w;((;@Q{?DS(WUK+1HZ&Zeyk}_f~|nGum0HWP8AJi{arVkfTF_Ja=HH zE`rFr^>3Uwsmo)Js@s>Xc!i;kI0#f1O>1yih9YjRf##at^Iw0^!9`yg_FajTZx2#Gs&9qd?y z0Vy$-9RlhNK%L5Bn{8B3)9&BLb5Ns}?E;G&9X_+Dp0%UVga*hN?BI5G5aHl2ggve; z)DYJbb)^leil&g9xG8U}=73(Ie9S_y6whV5`vMLt4Z0uCP{f>zIf_k9OI=%wO8r9p z<_)dnu~yA*G3GTdZkV%Rv4s2O*>_A%oinYOWa^Qsn!j!2Y}M`3?Q7I~&Zi;o9DR(! zi!WMt!%8eR!cgVT9m*X~y#gmIc<0S4qGJoOc+0%BTU}EM7M<1&Yglr!CS9{7qqq8s z$6(BF&Pn?4orb;nEWaEACxnW}(uWtyq_Z)%_P|SD?nizZG(Ap!*n8(DUpRAM6_1G> z=eDI^Z1w^qFVl%=R}_~wl)378WvN3+G^AxJGmKB7f;<5gU`y!Jeb6CO1UvC+M?`{|md?x>n*tL(*u2;xi zS9Io0(up5aQnINdj$lUKY)2vbSEu`NAxz90t`}gZz=O|bJ%io&YS3vG`cjw7Y2%1S zLiMP>!l`Jac?T;PoB!4>m};tH{$)5v0^wSWcB3S?=!gYhxj~A| zww4PBv(7hC94XtrG4W{0kLwR@dG&OX`%9RJ;a|`k6S@y#lo{|umau5}QnTb9A?TO) z|MT$7tvNf&G%zpT#224*W;eGkclZ;_-ZNxKOoHS$CQ{sOcpT1P>>^t1BHGMC`6;1e;U^FL ztZW`m8P1)eQnL7w&XVwec<%ku5e&bAnJz`#;4ar>!YkXduvCU~=<_DB<~>vP(x-vN zD8-Cv9=g+y9bB4q+p#A1SEz4j%_zvY7s?$vfY~Q7|MBU|>S%BhVYRcO@1ZbQQ;h!@ zV@RRQWk+Z?#PhunHQKNI+1mz0#~gK;*;M3H+thrO}}RFZ$sO^w$Y61HT=5^;LVssACS2ttBKDl49K@Repg+@ zVq1bBr^-pMj>3rgLUk%6BOu<85+d5`B&_G0@wvO|jD-y5_04CRvZbdNgg%x|)5=i& z>^(}v+!S4|w)^g2?lN^pVBz^q7GPWN*e{vj>lwOmoHZb6pCJ=I^$kOYfD}EJ~u6r|2z|l^$i6J?>(Z) z-G~CynKf)w+Rn)l;hvX98|DH_2B!9hCm8qW2V#|@%4QV@Mi>R%h^ZkIW4KGRJ-<7S z`6sG3HnnGXzda@2(&GC8+%_oF!>0%)fe>*{lz8y%g#d2IS9BSDVH?#k9{?g3EKrc# zt>V6nxv>Lk#19-!TJ?x0`Ni+eG|4Acccm^O%(nJPSxaumZgfX@_qJ!EeUbaCnB)?p zgLre>ySEN#m%*{qcB(#YV@3F$f@`GC#45pj3fN)4cNp!D!=_pp{HMr_Kiz&&N&V%; zv-=KLUW!h)nSA;R{+WKdZCrWRxRQF!;#t!c*(Q@&grFbd=iBQXJJgi7PyMNf*GM&& z-1k206mL=;KC2+Zqc-y9?T7C&-U%m&EemOJ_(ku`V`5|7LML|?OUlGU8cu{Xj6J-a za#xBHdhe1M$7n--V`7t#JzeF)VSgCXLD!=~~56=jmV=zZk zswO7s(^5u)17~2G{Np*MUs*3`hCfk#F8vA`+dn{$;L*6iT0h+G0oIgM!+Y+4C#r4$ zb+*LzNNX@tW#|;`9Y*Q?E=WO-Z^J=qb2m}uX;kC3xQX30P`FqMo}ta{TXhA@5TxX! z_GV9H^_oH0FT4c7vtvWNM0zGen6c5W_eXAzXrV#$caWs-Lfe~0y+!V-=bwjpq~8;h zK|Foal_B>1*VWVOl-G9Q7mbfokgL$5ORR4bddb5O2UnpU&GhCmqYE!ixt_N;C98UK zr?lx5S*@dZ&1O=QEbdhMaS&&3y<rN+3FR-DmAgOnRY;a71=b^O3YozkL773Du)8}WeQFacv@Qwy zft$xKGKtPm%%>MK$_c`R6RnYKcex(L`;!g6bbl{3cocpb<~Vl_E0S=shH*UgB#|hC zeS0Z%HX>6;m6kX3#e)P@TERKX>#gWrz8#kX%*){8J&>Q}jp-wd8wJ_<*4q+cpZv~Y z%H5lCET@CnPn5}#5||X`>)g58uyghzXIE+39R76DkRQLo!>;M}q%0emc9$Vy(vBVp zS?9GY+28CMv9sc#K4IDZRLuN2jwJ-nyg?0?oy&KqVFR&KtyNpNqUT4v^gYB!>MTR| zIW`|>-qM~CH@-PF_3m?xw6Q=?x^+fEcYi`RPeQk9g5voE#pr|zCk_6gheh}+gU7DR zz>FnT`R0({_R~VTnlXds-A!%NDfCXMw4XO8;EIEoqg67An_8>qK+At5FX_J2L{)d< zpVmdHL{&S@C)Eii{Nq2WsU%e;OB3ccH`5e6tRCG8-Z0(RL7C|9J`l2Q)5Sh)8xIpG zv+Fj?O?k<>zv`>=YgOv~x!J}2hh$Bs*N}#m-DO5)J~Oxk!R;%#3P0NNXRcnMMLc;m zzUlU{qg|9Afn|D5lu|h|<8vL=SDSaOb`ec>)Xip;U$ReR z+7PYuZY0rfk=<3lcUS%LT}2uOKF+g>XWS1MB66kEt)s1MzMk}B@=NJ~X}YXaMG^l% zv_aB&1ZV-UYRj#PGY8DM^{K#%)B^;uF-l>9fw=h;#1m;n!ehw-LAPyAh=*A{8sUU*}2= z=Ec|-Q;rn<&b2GT2?CyHF19)tul*8{q3SgsdQ18-h>mDC9eV2;#@P6AM#|;#gL{Er z0}9T{J!KYid{k^J?ft=FLmz&hsEj`^MfJ@4e0ELBZV2dx|tlK6 zFW)}_hdTBT6w~2op8dnHFKynprwm(u?=b}DEu9k)4W6Fip+#ykVMm8f#h3WQ;-|>O z8Q2%S*VfUwB(HV^985{n!Im5V*4&H%LX~O2ZJ_^>UsKRG~?0eleODg`_b4 z^mT4kG_mxY@VnEI4@?xUow0yl0)QeWe(Y;&${D-wHQ#HCl(KeuYqsH80G+&accOxc ztu5sN6swfGPQ|!4+OFjNE+q`QDY%_HZ{~MJ_Rz)bM`TQr&)X0D;kQwbo@}uZY&%zE z)U*U+>Ij@M+(qBUZwz5TrHl}8U_12&(1{Z@2C!0Uu+wEQWWR9UOv9Fngs z&KoN*dU#TQvkB*=#u37Xk6jGSyli_?D?aWu8PkPRZ~9$QZ&V?bn`Q@?`x+!~*pdSj zx4{Jv=gVZC#M%4F7w;!u=&P`r%W#z#?J3F)npx)$E{&q4V6ihF`0TaVeME2jvEfPX zdhdL$V07%bjN#&mGWCh@0de0GH$<0*WErX7oO6#2yXpt=QR7*id6i0;@edLDkY$y< zXQ07^k!5cL=9Bx9?b_I;ts8cqzwSCb?ph=vl%=|%Gj_u7ThBVG%mt5J^H`&Ev-1vW zt0u;*>qGJ2zrRPc8CopOp-N3BxIKMVxjpQ<-iwqj8jOo4uQwbY*?0)O`?^U|v4{4wo!Cx2Nw%I&uvQb=9z5Q$aR^P4TQ6!-H z^_l{}sSdm)7h#3;=JhpOJjeX~bc)GArnfbH#wR|^4ffr>QQ3YhR7~c8xK=R>IVtC1h1tNMrPw z)b5ED_PT5N1N<6B>5YYfhn>_b$VU%#2A`S!yhF|O`FqBpJY!LVguyqVPD-UR$I(?_ zKy5qt{GIC)TfEnQZi(CZ{+7Pp2+2;OH}OTi1eynH2p02QW-U&n`BF@BD>+n9@R^5&vSZ*P_0)HwWMO=$)_!5X~ zX!l)h?5$04j7dJwEE`B;Y1!l0%f59RWn(;CX7iEbp2bwrPX)x*Wm8#uv!^fEKJmz( zrb(8v`px$`kW}%bVbHtdXA|0C=+l5}GB{$-ld^Kq<^G04V5#05PjV)YHP1acGi{U{ zZa26Gc`DGLmV9Rl_AN(H0&8<{Lzf1Cz?XF-lq$C1V-?2VD3f6wouHtaP+>*F=x179 zM6?e2-fx_W1#IYr)$E)?vd4$G_izQ7&ei$sR1npxc^Pa6&o+F{)wg%k-^Bu5_dMtaS>S&sgHVT>_sZr29P!<%RRvgp|!+UZwk1 zOuH^B|BQGgbT2L23VRxulLaae?0~N*?qLrvdZ+oMf_O~>Mb&h44lUqy%FqITOWbl* zihHYX$*&2-Z@?{rr`iZ#nX~o(N7Pq`Rn=`@A3{P>L|Q^p0Vyd-Ns$&Qk#1=bkv=q% z5=tp8AR=7?(jiERk|H2TDAJwho7?-l-+dnC@bgM9QH# z-ZuV)o>t^Wdf?_&1tlIfelxlzX-n724q9U@6Q#f`TE%i27IdX@maV63+%(GJik^d< zzKiTSxvcZQkd#1(f%J$FN^68*K1PQ>k|LsqGOFR2|KzBjWo6qxFi>%}ak(l#%kPxJ{HQEduO@Eugj`QXt!dqB68(R#~6AY0# z2lbENAJBzkwC)L?g#EzcSXIi!JQ}Bln|J)5n@5LIpm#~bj>aDXREBF}VhNYce51ul zjm`&sSlQJ7=M7(c%_5+HuVR1u#s0pxD#-Xsk8!ePhX?hwLX}-#AlnpP8~^Y= zHRuO#(qiph?QeIi-MAMN;d~vkT{UZmPpBgIYP9O~G4~Tn1Dee|g+hJmFa34Sv2!6( z^f9{1EvD>cPQMVkdXKVtUujTD5}Eq!(9$E7TH5@I$UxOrca;ox&LJ0Dk{rK<^a z1;1(jVz(MKL8&4$W8b0ZWOY(_hpO+0v1X(+!8#y)s>Kk2(o3| zi^oFedZLEF1GiMjGa8Jp2%@^P=gHmQEO5Hie|=|Nf(%oFkGYeq5>!O7^bvJ|`wFfg=}Pg0`D) zVTzhy`0nvKYryMG)=G5{1p%l&b;8KgzWj6eeC!mxOpI!a`J!Wbuail1g**uRr2x;S zijDf|`90mzGLh{Y>5nAFXP4O|s(*;>>|fuLSj|}{yCN51v_4;qa`Y=pHU4gNb?U1U z#Evfe>b>L|NYEOJ+Vs}ve(Z=Iit6b-g@P%0ux~~T@qQuWy0$>;ur2D)80#wzi{@;g0b12Av$56s_N z-_-O|`(_oX_%%m+jweLfVOT?IGwQd>bIm7Q-{w+Z?Do&E8RF&TrmnTMFOtv7 z#QUEr&94g6XvPH^ymvErUk<91-TmSV%VD%~Bm>RixrG-*{}RDtvq-BVG(=UL2s3AV zA0r<_@s__2h^u7x1)8$xgXLoy;bJsxVy5N92~%SH7AJ^<m%RY7=5th`oo9eErv*${;apWt9i38yV$9nzPOf0d|Jhm zJ470l0b}%%A6CZzR~I<;9+OVc@|kH$w-qf2^O$J06azPw++^vBzCSqBYTu#6$HHZY zcX|}l`qi>b`wyL!+BvZT9N!pWEL(dsnn=25`HH)Lh?Yk#Fmq$WMmS$Vq`y$L`^9eh zk8?m@Bt}6m#7Ed#8bVwaOtxSCy2v-AttYuiG4&$KcaPVz2OuTjal~>~d`sAau z=wBC=R+|5w5V1V2RYna75ihUi7T`!<<8j5qkvhineo6F)MOMGntW!6ad-f)N(PMmv z>5+zWMJ122{s>ktyuL?OtF1Sruz8jUX^^8K^8iPJ(dUH|S#w7&*(sUP8iplZ)Hi*K zM~c#*zA)ssPK}_&QxWa>s7)q*Lb82@d%_*dkAJ%);T>ghoj$-uyCyfG$Jd%r?&}#S zcs5XiCE=_$Q~!KipYcPqV0tX{8NXdMalUEuM2C`-*;L`3#la)eJ>ljnpU2nxwnlLu8VMU#LN^D3^C_{(OZ+@9X>JIA<09P=YQoDd z%odX{t12-;kDL5jZ3YQ1T@x6Iw9b#?voxw_MT$B0N1qC$&zORWLd-?F=U2s3pU+Z; zv9DPze&dU8oMV6VRkMtx;Pq}SX@!nakD7Rl)5!NckC@}n*`@?;mis2C4L1(FXpf*E zy~w@ly#xP!wp$GXDnly9otNmKh69>z-yQQ>+&GqWKah&OT(4ni4DiqvQmdz=>kOGn zrA&K5D7#wf4ncdkSj00E4Z9776MQuwSCl3u@@}3?5e-I?&U&X#&G|}MMcPU<4AW5# z%4lsG?#@7ntuyt18~;pT?{q%e4|DsTa32j3iSXoEds)iGjm@;%&oOuKx}-mK2zcnZkV)-RUvfP3)rnM{-G4wLWM@{HHwkPlE*1;sCh8QydIl4Xa@Jsu}A2w2pSArw+P5$Ms3E_5>EY)=orHj}j}kLx-8K4N zj=**{nlKjalP(D__ShXAV#|D0&biyHS(isoE=l@3<8EgrI^(T(U*+6j=gIWmS!uw6tU=^bfk z9Q28mdPEA9gq#exa4$?^0mcG$ry4f6Lo9pc^oqR!=ct{nMY!*;qTe6d%u~! zG%Je5wEnZMfvn?UOs8Y)t*=)a^sruiME&r?@>Z7BPtAftwJCr^n)=A8h?4GZbGll& z9S4wX<|4X?35I6{$G7Ez^aQPDEfGG>?v9~9?j3U-k4tnCWt>gaq_qyPU3NZ^QHMsm zV8Zbk8X%va3JPgqO^0I`PqCCtWmWu%*pGqKxa8ZpsOqD%0F~8my<;fyNw$m$_?apn zu<$#0-L3BI8p+6OKy_un3BBgN=+_0z2b7DfIE;@nnE!4Qv{Cm7BD7q$Js`&?+;kuy zOV^Zbq4f3Zo?R3fGB~#(%JB*N!RRMB?IeO5yhSTiSe4>>`8Y_gpA9KKDr)zuK3A)2 z8~68f@Y41FIuX5K!0QGboUUe!+?>UlRi32DkAmNyuXCQNkCVEMz}gRbK<7RICEA~vRG#*60|o}5m~d|bsO zMMF82z5vfeGB(#jzl$sOf;yuhr!FQkhw55n8ds0Ztuq~$GKb@Ljy?yrQ_a79#D<$Y zdf({wWqe2!$Q7ZuT>Z+w$+A2pS33!->wIddzyMd7`n5mtoTo>XvcYaVCxU}`A*R{x<;g-p*C{P#`cs>`+@u?c&Bue1O}m#wTn;oDe)E-idr7(5NOv9x zq|+v(+)~?lBo|~mKNcVf-2+#5`iP=1`iodt*G+@9llbom_gde~@)Sj@;e(p{@iwC7 zQrM!*M96Y%QM2JWVLyKgM7E%JbB1H zv8PwzsQ%a!1$iOlz={o3cS-v1C|abKsKE#O6*u+(Dl7ZwGU;ezd+Q&E8}|t9rMv&@ z1u)HS+M=jlxO|UNRHtrV41ku@cP6h?-hGVdiaQ1eA>=&oZ3g;YM>92~wg%rNBuNb} zUAOC7w9CENa#7JuS-UZYnVC{Os>?#9JQ% z70R{g1!0FHV?^oT;~XGJ-cK*M+nnI5e8wcJeK&$QVi*1RW+kn;IH|Jh=gh=WK=05# z{&|*;*Yeot?~387nk}JZJGl42N(*Wg7oTH6&N9P7XnzvbtLz&X++$Bn{Oj+gKjZQJ zJL+GRmOb>65-N~s-7ud3k*N*9iH%N*+lJ>$+@lY;sNnMZ7h@i^thF~oH6w6yK_n&3 z_ns*7&>qSk9z9M6nI+d=1~U1tLV-Wa{a+yTZ5qs(d{lY$q=< zkMnh&?N^L_-XYXA6%~}L#9`U@a|5)d-`{fm$;!FScj@sSF2MRlGj+}pYu+R(2HT|? z({itN&)bGyKTSsjhev1b z_aH#tBle%nw8{-WI`t@puUGg}uLz_@zr$2<6~Dxl{LwwTUK=r9xEoEY-8Mx#!|c^r z`bkBi(_2|$rQ#-ZL)lpmZy=t5mpe6XtC7U!V z8VChhNwdWxL;8TRoAhJ%&!cw?g=<-j8Cx9V{?s;pxX|k5bstDN$9&G;!s3pInQZyQ;*%=!o8~ih({1l9rXCdsi;ua%jeSHw zHduugh<~eaMi0xthmm6#AtO>V`5vz~^0tT*YH8;+A9}75+7*8s$gcMUxus;9TFX6k za*OoN-s?qRjoqW+{#{EV{+WNHsc)P7_!RWv7$Hkxq#B%TPdPFepA|+ne<7QFKtjOp zoc|0|T(D(Co1k%d7N6#R(t|r1QkVWOwr3l+G-nE;Z|SyckC5NsrBNs9wutTi?9OoO zOf@3r{vbR;%FUkyM79Cp;6J+Z`N^wSRW=BQ)o|jJsD9CxRCzr#pkkXZ;C+|ylmvQ;)v5$_nbs@ZMRS}|d?zFf0Y2RWX z1Vop{n@qQJiJV{{iQ8A0%NZ5$zb6iEF6!^Srt#K3MB%5zN9Hq!TK+G=#y0O$(6F=n z^A>@dEmWQXx7-Z$aFE{l{VJ`B=Fs62z25Vag}}CBK1a5EC0Tbb-jpI8GtJH~esS`{ zW#bc$3`_f&7gc}1?MaF{aio#_(`Ct%Q;xY62|T{RY=ifkg?Ca^`Oua0%*47e9afR8 zjZ0T0s{eQ^xM_QAoi}Ps>0oC?!*Nlb31rjcT6#lD_GjX~Tf4)uOSrP?zuEuv zmfkfzBn@AgUb1UH1|Sw*AE|LI(r6s>Efczsdb*+3^TB5pwm3+;|=MjlDw zOv&q&!!>QtSB`s*$GYSBkG}L>CqW&PrKYLvsphq7^p$*xuP2q1Dk^u@^BOn7&GMK6 zHPtie6M{Xk?&*P>WRjQvSFqYzzYxSvkKgR`wo7lJ8&fq)dDw9FDYo0cM}Gg5Gq!5U zu&FNSZ6cHP_;a2%xy9L4aY|hxe(45ZZ(J1BXXdG?FpKItP|nCb>5+^v?rjohB}hBQ zY5#@mPRQm4C5Zl^ar;&|tdCOp^TVu(FzK(VE>0!;#2=3t+gc7>Vnq#=o~}5bt{>wB zL;IZttK~-@0YUvuoXO~{tYC;&fPD(`Bj+A|PQTh85Oq23EP=!UdZm|k`_h_%&E*9N ziBf~(23^%Smd<}i&G)u|>tm9uJ|?~$IQf({qLNxZ6DUze)IY5e*BiW)x+IFaZBW$v z7HOt_gh9o>9{-b6iS)*}1yTpxAkGm$W(4cPa&G(q;tXbp-najHGlShXF zA1l8Zg^5XUxxuSjH9`ag!Xddu+QuJIk95$m$O&YTrjY`SPj@5|cDsI&-y4}3KW0Mb zE6yzlhds|4Ve63U7>~E^%Q(X3PCki_PLhdFAMHCTCMs5MmerW_0z;J_HuE7aZ4bhE zoTUj-Ya&cM=O61LO%WB&>V;(c;tvDyNBh9DjblX~%*$GHvL6;q>>jvGY<*yYo*KIz z?|X~Ioo-rT$>hRMiU+$)!4rQciG~IVaOJ*Kaq+x-T0DviKd<6bf)g+WHsnMVcrXQj z`aDRgx#AN5G32$6EUP)lY06S=ZITICx3N(5A7a($mL}LsXlSIZcm&k*7$u&eGkk}| zPE_&H;EG8=%{q^47qx8VWL(A?dGq>Pk}>dRK~UuF3+wO5k6e1#D**t4BVa%M@6_2f zGN&^vLwi%Ro}eonF#+hhl!cvb+L-)MIxKYD1?-R<`!5E?UkB3Hio zaW0CvrEY65C}*d=-I6UHTFdmhU2|R-#h0rdqY`No&;2s0X`P_MP8WmW{OvWKJQ@I5 z4&aQB?tT$k`jRVDT2hIZL83F!Soqt*d0E~#>-3T~QPz7Lq$?p6{9{?qXD&uA~!dnhXAEEfND83`xR5BbikgoBsntHvpwApEN9W-mrn=)!7rG+zkhe$z%SxFhiiIPn$&rEt0sA1a$I}9o|l+s@k`k zU9mitKVPlK$Db%84nNq~H6x#xsVY)H-~a}ho%%QFi?N`Z^>bpid@O9>8uAi0vv$MR zWe2Wo^7jv3VQHhB)1hLnT3PCF&{xX!fOIL%v)FFNGeWNkQ}dp-yIs)_G__jpS+ciK zD{cxlg=N`mr|`NN@Zbof&jSn*>r)~a8q1tVbXvszA!W+hjQpn=^Y0MhO!Hf6K zgFl1Ol7OZxWI5tN7}<0uSo;iXHoEgl&R9SEMhwtwq8}4qeFH<8I@qg{xG}&`Ar0kt zie&|?LjSWpg=$DXXmX3_#;8e7_9AxmCEJPG6=9K*V=~03VP`>yg~MSkpiHBK^5%nd zVkzhup!dYjzxOZ8c1<5%g<^!eFj_?oahmeSH_&t?n#%b_Ufg}VtVID zp&D-VW$$~fEt`rxS-$*``~K5E&-CGSWr1Fm85Rf6dE|m^e$ESHd)6BC<%7P6ts5nX zy~RK80HRQ6(M=i6UHhAa=b-fMAzY(eqJBO1>^)y%`mU}X&s&ShJY^NNvI}&Q7nw@4yY9>K zN6xvZom*Z&r_ovazU-pOEO5K7;C`HckXHa|9+Ja^|)WKJEpw+{}~ zuG|z%E@!=iaKpS}-_+*G7>tSRfu zSw(qYxdF#B5JOQ9m-Pwf)WvkriG;R=CiPgCYW#XMX71SOC>CLNWoTIU(TN z;uCLO;*%$OC!?Q0RT0$Dpl8LDxEyP;BA~JsM8&!J-&qyo6GX1lDd+22K#yT40>e!| zG@3OkeY)Q{emV`{G1Tf<{`ny!ydP)+uAcjiG%yxJdX6uAnCGTwc2A#RsFD+GQ3|FA zpEG&I8ubH9maAwk7#!e5r)Bpq5}bd~8^I!xDlxy3$9ekF!;ly3b)V|{G#K{u5G#4c zjtJ0-p5>c6s(?J|JRp#n)H88iOYkYz?6aXQe(Wi%t^G|yeZo4H@oBPcT;t%EV0~yw z*^KS!_w=8fk6OCK|6~VmE=QkS%!~pEKjO4Wy`ue1%knaF)jLUjGQ3wVrwuL>zgGr* z{!5YZ#ayr=x*a3GM#X-URm*1vgzVeceUUb!r%v0NC*xS2VNY}->3i#9qeJmvz1ou^ zA(WVN)!9Eie+77mvKJm&X`_bIkz8}e(H72nAam;Rj@CKoPJmc6>QX#~WE|J}=zq`%)19Unh1+n#iQ)V)lBYUG7Wl`{wh zQu+zG*#pAmMq0=y!G98>zP&WguQ|EqaYcx`k>Ng3ht3TfckDH1Rvk(!oQ4ny?_Y2Ll=9@3ewDKGEf(Zo<(N%14Ceij3 z#I!d*IOYslriV0>eu)(6yypL<2>&zv^HZRwU2%hgy5YqJ&yz59uNkw>x$}tfcQF3q z;8?S*U5ZhiNH_>xwnmR#wQO<`1%ocIs(m_00#ceXC*9_Po!R&(*jMIAijbl(OF_l? z-vY5{EZ~KcpFU+Dr;2RSz~~4%&$=`|<8hFq5BCTAr5+WhZgUqAY;+=mw~ins&wU-{ z#2(PDD@Z*l7`O}nDM}#vrr*^56(7^PlzB$4DQZ$sbHV_;T-YnNwA@04J(0uF+{~Av z_14$TJ;vA(x~Tk6+IOfxt~+4J4ej~mJMS_@lcmCmBQ+xl+r$5wPv+SgiXHpF6}|-8K|;Lm`SACtu-yM>PEbBz5`iuC>PHuB zXjK`>W1}|LaZzv1EpbiEsI{(foZqj}GMu^vSteHG zOBWxp$gqYlQC$8&1D@Nb-o&jIv9h|@(e`Nm8@vqaQ7yaqD8Fm}RHcJri1;-(ffP0G z`Q`}*7hDt;S0q`ag`##NXgUNtrX5)!$|>M5j#@e;_+B*jsp4|CxhP|i&Om~-Lz}q+ zkZ`?#0}W|Ko8Gt5GPvM9g??0oW@!UM8DNTvAdzcPd|EnBpc(4`gcfjx4?{@!8IjV%d^Z`3l%LR*7}2}pt0j=A>b6Ih;S#?>Xc^|fuNimNZ*fQRZ- z$Y2y33QZ*^7P_w6&j2+WmSdnrX*%^Iocw}~?M?*tV*e4$slO3Qa`zd3i+}wjurx?VMd5_BT@#%-6Usr%!fwZxQsGkl}lm?{wt?HX<)BOCXn}r6 zUDw zD-28HuRKH5Kj{15qF^fNUm0DmiH zl8HSY4G6!aS_G1}yMprd{N{BK_3SJun6qHRbV-zTS%+?XxCSs4aVbRjsHu$=X6JWi z6~z|<9o}Q1OT0=NWlg@e#tP38Je0+T*Xd+FSBJxsu`fS7+Nj~|%?(C{@@cncQ!tRPxb70c)w7c8s~soG*`zL|sX z*a50=+j#uSv)BhgrkKq-!+FGmdr7wWvaD`9m<0MbY*E13B}F09ekelx#yu05-s*;A z_>=3-?J=4h&{aon(lD*thu}>h!(HX9y(z-G=U(!iT>Y&Qz`^-G^;OlAN5i1Wdk?Uq z#1M=&SA(2z@rz3}v<_JPU|M@q^a~rhpu6b8tVV-;^(21C~d*CO!bRHx1`5eZ%s+ z$g3A?6UdVlWLxe@O5vG{DAFaOTDgobdVP_)gQYGtx{tIr?jt9D#}oA&?uJ97$8uaw z-O78+L-LFa%Vz|i%{qoY_PyG|=B7Hug~5SDYoGMKUtf`XYYpjcG^BmhO41-xaQf_D zH2zyF{SPekwhijz#aV_+ic4?d3PatiUeFga@QVri!~IR~u~u3@PL{fN0H?-Gex zW<^XO;Z@vo8l9irxu{f$i>Ma2ye`M|P+Ffz;koMzWQBl`zPS#RbV|pW0RdX$}! z`Juyuo^+e#>8X-U@zzBC|M3QAg3$kh$Eb3X`90H4<=uh$6Jwaviueu!*qom06KpXb ztZPw7BUl4?(+E4YxPg0&yvMq0*`lEE!qRy2iU(ukIzHQbN3+Q!CpM08$iRVdgSU(I zPAd&{bBC&K-{5UKs01y6z^xKaX6>pdDXK9B)k0J$9)`k%601)QfF#pZ^XJl*;9$k{ z7Z`VfF)d`y32w!gcblfbsybF7cE3>XJVR3<5~B9g3`CUq*8*L4|J5S#P4|`MdSbIJ z*gea=y)Nr;I$3K4y#}ZHQ!kQstH>MPUUI|(7P1I^{U@ zK^a}pP0%KHmqsWD9qQhs38Ne$i?2Xs<1YSOuK-OQz$dq1ew6PtQN9@_YhVbiPWWcD z32Nz%EI0dcIvDHJdYZtG%I8+NW(-n2HT;zhe^{zzJlR&VT3UW}{d=*ANq3b>9K=^h z<_yT!cFE2evXqLZL_?)`Nyq@fnK49GLz)TmH)DppqJd2Db?Vr*yioIMg`dBrUt#%g zM{iNn;?~|x&bd0^@ zC%3o}jFLU+DgMCoH2}T0JkAziO*@zhTd(joBuVU&lC?U(Zj{8!zIGbpp8+L`hC_!K zRKNL$E#n!P+qJEgVSrCm0EK!ACtl5uf>}*SbTCu&=fse~d6WhEz^yYb((yl2y$@%; z@jb6PVXx59EEi}GQhLb4&{O$C~$Vd*Ap~V)?Jokg?d@p@}kW76+y)@O1VGN9=psvtpO{ ziY?s=$AV9v?QH$@I05XrjT=RyWY1&`GLc%TB|EM2!E-f&Ppr;W=KH6@wUmP~zQl~jk&Zq@NX7r> zH6O)6|4IaS2MZ%``wl;MNNhRLmDETTquR=Rm;>b>$sN4SZP}A63{G{>Lnn>gJ4xlu zJa+l35}qoK0Fi==6p|PD2F*dTXrScpO(BTr&gP&3eJXDz8ydX^WPj#-?JG7x6kzq`_RDJlO7lPwpP# zH2tRwtT5w7f{M0iIk5q;=q=YxO~j;ptpw5sn3S*IH6HG5GA`W)#h;`7jF@O?6>ykG z2;N{3ZppC` zA}!rv6%Q3okSFiGczjpi4YWYLJ6mzv9l3nv();gt()3%(S`815)jJ%|i;`l%*mQ;J zvzc1H*uR`|5y`Zj($`QM(8bwsWl}MSh|zA}6Y%T`c-}Z?U2!)SdfIB>TY)CiGXCk; zuFOF?veAL{-BWqkrl|->wR>MQytIAd)_*GoBF>b8`kgBz!pV?q10&~j{`#I+SA1>m zfFV1T2xIwxnJ+N<*mYzAy~#J!D7tgaH*Hz6LVzo7YX93EDHMMy43*&1V#zW`&cV!e zu6_2wQ_U+Jg2|Z7j}647D>pCJHvcBz{eC6t4XdD#kdUf!UrnD|N~=J`;041)F_lCO z+u`3;ubmF`H;5Xs^D8<>f=#{y(KZlu-v_uq1Cu37KK4}EZH3{_C@{e z+h}p>EIZB1B{@n(uam{@y2ntHna*#V>Ah0q^s-tayR9MCRcs$8aAP#EdHtTGWLS=U z>!@23y*t)DVPf^DKm6OuR}lL23>Wn!JVhV-$4M)blM`8VIR`;_7MK6>eRAiTr`W#9 z{5)&sHkufQXYXdrT((c+rL&L@VTu)fwGQh18A zAvsTtPP9hIR}5NQiCG8g4-1?wlTYA`asrWezYS?G;^XOkX7wmJ-S=dtq%&Wu2yO@y zd)A8iHWpAYsup0^{nrbS&^La;$3Sf9a~{V@LQJZM<9F9oUUB_T>JA*-hp&)LEM
%*b+;te}I|a~`$E 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 XCx5LGqvK3@kY;+t(x~jR+tdF6x09(W literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/114.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/114.png new file mode 100644 index 0000000000000000000000000000000000000000..23f3a46d890c9e15de9afa13548c1d1928917429 GIT binary patch literal 3439 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 DD?ZOq literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/144.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/144.png new file mode 100644 index 0000000000000000000000000000000000000000..b211ff8e31792682118c3366598061b2e9cc97d4 GIT binary patch literal 4401 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 NMtWx0Djj$H{{XOhA}jy^ literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/152.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/152.png new file mode 100644 index 0000000000000000000000000000000000000000..a60a3c112f72d3fe5cdaa1d17f4645545aecb932 GIT binary patch literal 4656 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 literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/167.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/167.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec7c22cd713c350a7147dbcdbb9c1c77f1254d5 GIT binary patch literal 5116 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 ZQ3|bj_QjH0f>6~X(pEQ6t5&gz{2zTG*!2Ja literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/180.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/180.png new file mode 100644 index 0000000000000000000000000000000000000000..d63898c6d9e5287ad87b9440c4f5cc39f8bdde40 GIT binary patch literal 5523 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 literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/20.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/20.png new file mode 100644 index 0000000000000000000000000000000000000000..667c064ee980591686a82cddb56c15410480c4b4 GIT binary patch literal 722 zcmV;@0xkWCP)QI!`hzMzWp7HqMPb!X%QdTld<*|NG#UkR)KgU6Sjsu&?K~9E)hPqL%)PJS!+z4H-rqG5P5m5*V z+=8O4S{xV`^OQoXi-a9r7~<{hinEg#+f7_dH|8`4nW+P0rVe1qbW(Nv6K$=N)K+)9 zJ=HC2d4s-&%JR=7C3KQv?D5DD-$P-p)8p%mw|(4foFp#hmK&(|p0dvEMG$9dTx6ua zC&k$90UCGqP-Jm=0UeYU4AOGv2mbycbEfXKHZxUf!-~0F|Bdv$y(AmnkZiPLh__Ri zJL6||dLJeEE;`z$iHxs#VBQa?_@PaH1^w_B!%VjPF@G?W z7}T0Zj{b4;zy5KWwpJ}W5)BOQjypmG6t#47(|q>F9eC&W!oyjstv_D>-R`mX_x<^N z-fz+AX7f)+{zn5vRrRQ9v^Pxz4=j%DumtOi0MsdaOZJH42eXM1-wd&T(-6@0c<>F&phz zvYc45>}-1bGRt3WBs}aXpB{$>{i!vmqRc=D=!lzBw zDX?}^V0HT?-{Ph)*G;y;N!7a-Y58o3`q}{+>j$aZ(?|QcJ6KJJ?t4UZ8d!rq5wVo& z&3&XMwvo2-JjpAxiH|)?w&52_ih3x_b5WG%qA;(UcS`#xS=UB<>=BZde@WT;@0j+q zLDOdq8ur*+D$ATC#MxN(N-OcPHcghibcR*Se#V^XBqPO6Mv9%xR0kO;cHS`cux-mV zwr;w@>65pKd}bJp4s?*B5Q#uUD0%ZN#`Ja)<6B9L|4EajOKhx8?x4`>#+vQ)izUl} z+1N$CrJLO!x)BLMWW3+w5%9{qu<$SyCA}oX{WvO`Z+2-8nkCDL+1SO7?bpaiI}z{- z-G}NC(V?nS*jDW#J*h2VwWFgBUN<@U;`84K3!C#`)VJDaXB4q_*JV~MZzUnl78GhW zIxuB+a_s0W7A@GO>19w4evE!Idv_0#lW~EBxHDe7mAF_BT3~T`duS(TbtlC|y&OAw zi^VTCc;>AVIkwR@JV&QKnL=e*8=K$jBhT!>kbIsMaW)J|?X1mnvG%ndHdYMMc<=^w z`+CvO%Jq4b0#BX?4Dov-PCx4{k`uqBqO^nZVh1(v_w(^bSJ|_pm&(%bSvbGSXQP<) zm*4}@dp({s@`s8NPI%ZnCQo{q$0sgArwjLaeZ~ju;h53kJM7t$W+LK?2qNQ9lt?cY t+#r956*S7b6%J?Y%h|tw@BL4se*%Ks6AZ%+iK_qr002ovPDHLkV1g@p6vqGn literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/40.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000000000000000000000000000000000000..8f055af0add7b253fd00fab0243096bb96c2997d GIT binary patch literal 1391 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 literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/57.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/57.png new file mode 100644 index 0000000000000000000000000000000000000000..02ef1abbdbfcdef7195ccb4f7628655d9a9a48b7 GIT binary patch literal 1822 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 literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/60.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/60.png new file mode 100644 index 0000000000000000000000000000000000000000..4f14b8f52937758a82aa416562dc257a6519273a GIT binary patch literal 1912 zcmV-;2Z#8HP)1Nc9M{MQ%Y1$)6>uovtFd%<4tSVaVy7K5gv*oYtygo6mCPcEG z5Iph03{>m{3k-M=bECH)UUCvL=@;1kq7Db@uE57(`o5s_GnOtC|L(FlzjO?ZenF z0&gF+vRDI0?CmHO9XQ$4jd$NML0f$e=_?v>Z^U9JI8BdD9}B2m~|;As(C4qk?H#1VRL$s36qW_F;YIRbE&wU>o}Lv%lli2|c@z zO$9~q-?KS@nYlYJx)2Tfhj_Qk6h5+uyp;2*d;2D&1Vi^W;icT{tV?itp6%l ztL{P5(Hl7XNgun21@Ufq6tD<{gn|%)vh8iyoY!-Q`{S_#*HraFQ`wF7E4MI9oa~X7 zM+7tTmxfRn22GU(O2t(u(mexyZFe8r;>fAm)s64Y--2{`BM2ez@tNmvg5nU4&5r^W zvk&p}(Rjd$^=mt^PR=Ap=3cVbbV9bmghL0em&c`g#20Xl=0>O7b#tF>{Jms!=*ivA^<4ao*Cuu?KV)wHwrUfyNevg$Y zdaOt`;F+ZMVUzY0lhnj^tdn=4Ry%+??Ev<@%4Gj*1E|&9M62#k%!%5>02gM-TskxzSrWx62vKgh5LdeTvN+&AeLX3zka_C@Jd4PE{-W z=orSSU6;VN`)Wc2*tuPgjOA@^H_Z=hgi_IgQ%wU144CIqyDm0-d&Lf!8js!T9;76- zy0tI!0n4TBc<m_8lY5k;PgAcLbB*EJ8$pdJa2h}9ntrMCZoL6guLfE zkr3C6gt*b$<_eal8?owHJ$4rLFA{bGW;4omSfI@6 zKuXdD7H|6jbV!WXAx_eQtkni&W*FJIX|O;2^%iW~ z+7EU44IHc+ME%}=Y|1~6IZ*`;@0!9qg7p~Kv2B51nnNQY2%n+A!iSC^A^sec*)7P@~%72*Grr{okjv?5gaTd=sAITp127nMB_Q&u8A;ESald*j<{x5%tC$fj8 yMeOGe6X27Fi5xF@vd0Ua?D2vpd%WPup1%R)aF82lQa=R%0000s literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/72.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/72.png new file mode 100644 index 0000000000000000000000000000000000000000..86ef20b92ff5ad9d2a8ea991e1734d723d3e477e GIT binary patch literal 2253 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 X`iG565v!5T00000NkvXXu0mjfA~{)a literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/80.png b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/80.png new file mode 100644 index 0000000000000000000000000000000000000000..dc72c4588fd3602efcf9d0899d554f4841d199e7 GIT binary patch literal 2484 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 literal 0 HcmV?d00001 diff --git a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/Contents.json b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/Contents.json index 9221b9b..65b74d7 100644 --- a/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/mobile-coding-challenge/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,98 +1 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} +{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]} \ No newline at end of file diff --git a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift index fe662d7..14ac46b 100644 --- a/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift +++ b/mobile-coding-challenge/Controllers/Most Starred Github Repos/MostStarredGithubReposInteractor.swift @@ -21,40 +21,41 @@ class MostStarredGithubReposInteractor: PresenterToMostStarredGithubReposInterac requestHandler.request(.getMostGithubRepos(created_at: previousMonthDate.formattedDate(using: "YYYY-MM-dd"), page: page)){ result in - switch result { - case let .success(moyaResponse): - - let responseJSON = JSON(moyaResponse.data) - - var mostStarredGithubRepos: [GithubRepositoryEntity] = [] - var totalCount: Int = 0 - - if let _mostStarredGithubRepos = responseJSON["items"].array, - let _totalCount = responseJSON["total_count"].int{ + switch result { + case let .success(moyaResponse): - totalCount = _totalCount + let responseJSON = JSON(moyaResponse.data) - for _mostStarredGithubRepo in _mostStarredGithubRepos{ + var mostStarredGithubRepos: [GithubRepositoryEntity] = [] + var totalCount: Int = 0 + + if let _mostStarredGithubRepos = responseJSON["items"].array, + let _totalCount = responseJSON["total_count"].int{ + + totalCount = _totalCount - if let mostStarredGithubRepo = GithubRepositoryEntity(from: _mostStarredGithubRepo){ + for _mostStarredGithubRepo in _mostStarredGithubRepos{ - mostStarredGithubRepos.append(mostStarredGithubRepo) + if let mostStarredGithubRepo = GithubRepositoryEntity(from: _mostStarredGithubRepo){ + + mostStarredGithubRepos.append(mostStarredGithubRepo) + + } } } - - } - self.presenter.mostStarredGithubReposSuccessFetch(repos: mostStarredGithubRepos, isToUsePullRefresh: isToUsePullRefresh, totalCount: totalCount) - - - default: + self.presenter.mostStarredGithubReposSuccessFetch(repos: mostStarredGithubRepos, isToUsePullRefresh: isToUsePullRefresh, totalCount: totalCount) + - self.presenter.mostStarredGithubReposSuccessFailure() + default: + + self.presenter.mostStarredGithubReposSuccessFailure() + + } } - } return diff --git a/mobile-coding-challenge/Extensions/Date + Extension.swift b/mobile-coding-challenge/Extensions/Date + Extension.swift index 4cbd4af..38cfae1 100644 --- a/mobile-coding-challenge/Extensions/Date + Extension.swift +++ b/mobile-coding-challenge/Extensions/Date + Extension.swift @@ -6,7 +6,7 @@ // Copyright © 2020 Zakariae. All rights reserved. // -import UIKit +import Foundation extension Date{ diff --git a/mobile-coding-challenge/Extensions/Int + Extension.swift b/mobile-coding-challenge/Extensions/Int + Extension.swift index 8237c51..7073ccd 100644 --- a/mobile-coding-challenge/Extensions/Int + Extension.swift +++ b/mobile-coding-challenge/Extensions/Int + Extension.swift @@ -12,7 +12,7 @@ extension Int{ var shortValue: String{ - let num : Double = Double(abs(self)) + let num: Double = Double(abs(self)) if (num < 1000.0){ return "\(self)" @@ -27,7 +27,7 @@ extension Int{ return "\(sign)\(roundedNum)\(units[exp-1])" } - return "0" + return "+\(Int(roundedNum))..." }