Skip to content
This repository has been archived by the owner on Feb 2, 2022. It is now read-only.

Commit

Permalink
Merge pull request #56 from nodes-ios/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
kjoneandrei committed Jun 13, 2018
2 parents 9ed62b2 + f437671 commit fdcb648
Show file tree
Hide file tree
Showing 4 changed files with 207 additions and 2 deletions.
34 changes: 32 additions & 2 deletions Codemine.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,18 @@
293490EE1C6CAFD500E8305E /* Application.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293490ED1C6CAFD500E8305E /* Application.swift */; };
293490F01C6CAFF200E8305E /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293490EF1C6CAFF200E8305E /* Then.swift */; };
296831491DD5EC670002FE5A /* DispatchTime+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */; };
42DDB213206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
42DDB214206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
42DDB215206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
42DDB216206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
42DDB218206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
42DDB219206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
42DDB21A206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
42DDB21B206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
42FB12132063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
42FB12142063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
42FB12152063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
42FB12162063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
838A0F971F03F57E00469143 /* String+HTML.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838A0F961F03F57E00469143 /* String+HTML.swift */; };
83A5BEBC1D981F3500C74312 /* UIImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEBB1D981F3500C74312 /* UIImageTests.swift */; };
83A5BEBD1D98215F00C74312 /* UIImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEBB1D981F3500C74312 /* UIImageTests.swift */; };
Expand All @@ -76,8 +88,8 @@
83A5BEC91D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; };
83A5BECA1D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; };
83A5BECB1D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; };
9F4A1BBE1F97AF0F00154997 /* XCTestCase+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */; };
8C9AAA2F1F4ED1F000F9E7C9 /* URLParameterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C9AAA2E1F4ED1F000F9E7C9 /* URLParameterTests.swift */; };
9F4A1BBE1F97AF0F00154997 /* XCTestCase+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -131,13 +143,16 @@
293490ED1C6CAFD500E8305E /* Application.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Application.swift; sourceTree = "<group>"; };
293490EF1C6CAFF200E8305E /* Then.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Then.swift; sourceTree = "<group>"; };
296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DispatchTime+Utilities.swift"; sourceTree = "<group>"; };
42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extensions+StringInitializable.swift"; sourceTree = "<group>"; };
42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extention+HexInitializable.swift"; sourceTree = "<group>"; };
42FB12122063D04900F850D1 /* URLSession+Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URLSession+Codable.swift"; sourceTree = "<group>"; };
838A0F961F03F57E00469143 /* String+HTML.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+HTML.swift"; sourceTree = "<group>"; };
83A5BEBB1D981F3500C74312 /* UIImageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageTests.swift; sourceTree = "<group>"; };
83A5BEBF1D98226800C74312 /* add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add.png; sourceTree = "<group>"; };
83A5BEC31D98228300C74312 /* alert.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = alert.png; sourceTree = "<group>"; };
83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLImageAssetSizeTests.swift; sourceTree = "<group>"; };
9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Utilities.swift"; sourceTree = "<group>"; };
8C9AAA2E1F4ED1F000F9E7C9 /* URLParameterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLParameterTests.swift; sourceTree = "<group>"; };
9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Utilities.swift"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -261,6 +276,9 @@
291272CC1C75EECB00FB1BBD /* UIView+Utilities.swift */,
296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */,
838A0F961F03F57E00469143 /* String+HTML.swift */,
42FB12122063D04900F850D1 /* URLSession+Codable.swift */,
42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */,
42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */,
);
path = Extensions;
sourceTree = "<group>";
Expand Down Expand Up @@ -577,10 +595,13 @@
buildActionMask = 2147483647;
files = (
01CD40881D071BDC0044887E /* CGRect+Utilities.swift in Sources */,
42DDB214206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
01CD40891D071BDC0044887E /* CGPoint+Utilities.swift in Sources */,
01CD40631D071BCB0044887E /* Then.swift in Sources */,
42DDB219206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
01CD40851D071BDC0044887E /* String+CaseConverter.swift in Sources */,
01CD408A1D071BDC0044887E /* NSError+Utilities.swift in Sources */,
42FB12142063D04900F850D1 /* URLSession+Codable.swift in Sources */,
01CD40651D071BCB0044887E /* Operators.swift in Sources */,
01CD40871D071BDC0044887E /* String+EmailValidation.swift in Sources */,
01CD40621D071BCB0044887E /* Application.swift in Sources */,
Expand All @@ -605,6 +626,7 @@
01CD407F1D071BDC0044887E /* CGPoint+Utilities.swift in Sources */,
01CD40831D071BDC0044887E /* UIImage+Utilities.swift in Sources */,
01CD40821D071BDC0044887E /* NSURL+Utilities.swift in Sources */,
42DDB21A206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
01CD40671D071BCC0044887E /* Then.swift in Sources */,
01CD407B1D071BDC0044887E /* String+CaseConverter.swift in Sources */,
01CD40801D071BDC0044887E /* NSError+Utilities.swift in Sources */,
Expand All @@ -614,6 +636,8 @@
01CD407D1D071BDC0044887E /* String+EmailValidation.swift in Sources */,
01CD40661D071BCC0044887E /* Application.swift in Sources */,
01CD407C1D071BDC0044887E /* String+Range.swift in Sources */,
42DDB215206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
42FB12152063D04900F850D1 /* URLSession+Codable.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand All @@ -633,7 +657,10 @@
01CD40741D071BDB0044887E /* CGRect+Utilities.swift in Sources */,
01CD40751D071BDB0044887E /* CGPoint+Utilities.swift in Sources */,
01CD40791D071BDB0044887E /* UIImage+Utilities.swift in Sources */,
42FB12162063D04900F850D1 /* URLSession+Codable.swift in Sources */,
42DDB216206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
01CD406B1D071BCC0044887E /* Then.swift in Sources */,
42DDB21B206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
01CD40711D071BDB0044887E /* String+CaseConverter.swift in Sources */,
01CD40761D071BDB0044887E /* NSError+Utilities.swift in Sources */,
01CD40771D071BDB0044887E /* UIColor+Hex.swift in Sources */,
Expand All @@ -654,6 +681,7 @@
291272BB1C75EC2C00FB1BBD /* String+Range.swift in Sources */,
291272C91C75EE9A00FB1BBD /* NSURL+Utilities.swift in Sources */,
296831491DD5EC670002FE5A /* DispatchTime+Utilities.swift in Sources */,
42DDB213206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
838A0F971F03F57E00469143 /* String+HTML.swift in Sources */,
291272C31C75EDE300FB1BBD /* CGRect+Utilities.swift in Sources */,
291272CB1C75EEB500FB1BBD /* UIImage+Utilities.swift in Sources */,
Expand All @@ -663,6 +691,8 @@
293490F01C6CAFF200E8305E /* Then.swift in Sources */,
0132B4CF1C70E616007BC588 /* NSError+Utilities.swift in Sources */,
291272C11C75ED3900FB1BBD /* UIColor+Hex.swift in Sources */,
42DDB218206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
42FB12132063D04900F850D1 /* URLSession+Codable.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
53 changes: 53 additions & 0 deletions Codemine/Extensions/Extensions+StringInitializable.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//
// Extensions.swift
// Serializable
//
// Created by Chris Combs on 16/02/16.
// Copyright © 2016 Nodes. All rights reserved.
//

import Foundation

// MARK: - Protocols -
// MARK: String Initializable

public protocol StringInitializable {
static func fromString<T>(_ string: String) -> T?
func stringRepresentation() -> String
}

extension URL: StringInitializable {
public static func fromString<T>(_ string: String) -> T? {
return self.init(string: string) as? T
}

public func stringRepresentation() -> String {
return self.absoluteString
}
}

extension Date: StringInitializable {
static fileprivate let internalDateFormatter = DateFormatter()
static fileprivate let allowedDateFormats = ["yyyy-MM-dd'T'HH:mm:ssZZZZZ", "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd"]
static public var customDateFormats: [String] = []

public static func fromString<T>(_ string: String) -> T? {
for format in allowedDateFormats + customDateFormats {
internalDateFormatter.dateFormat = format
if let date = internalDateFormatter.date(from: string) as? T {
return date
}
}

return nil
}

public func stringRepresentation() -> String {
Date.internalDateFormatter.dateFormat = Date.allowedDateFormats.first
return Date.internalDateFormatter.string(from: self)
}
}




54 changes: 54 additions & 0 deletions Codemine/Extensions/Extention+HexInitializable.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
//
// Extention+HexInitializable.swift
// Codemine
//
// Created by Andrei Hogea on 27/03/2018.
// Copyright © 2018 Nodes. All rights reserved.
//

import Foundation

// MARK: Hex Initializable
#if os(OSX)
import Cocoa
typealias Color = NSColor
#else
import UIKit
typealias Color = UIColor
#endif

public protocol HexInitializable {
static func fromHexString<T>(_ hexString: String) -> T?
}

extension Color: HexInitializable {

public static func fromHexString<T>(_ hexString: String) -> T? {
let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
var int = UInt32()
let a, r, g, b: UInt32

guard Scanner(string: hex).scanHexInt32(&int) else {
return nil
}

switch hex.count {
// RGB (12-bit)
case 3:
(a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
// RRGGBB (24-bit)
case 6:
(a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
// ARGB (32-bit)
case 8:
(a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
default:
return nil
}

return self.init(red: CGFloat(r) / 255,
green: CGFloat(g) / 255,
blue: CGFloat(b) / 255,
alpha: CGFloat(a) / 255) as? T
}
}
68 changes: 68 additions & 0 deletions Codemine/Extensions/URLSession+Codable.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
//
// URLSession+Codable.swift
// Codemine
//
// Created by Andrei Hogea on 22/03/2018.
// Copyright © 2018 Nodes. All rights reserved.
//


import Foundation

// Decoded Result
public enum DResult<Value> {
case success(Value)
case successWithError(Value, Error)
case failure(Error)
}

public extension URLSession {

/**
Adds a handler that attempts to parse the result of the request into a **Decodable**
- parameter requestCompletion: The URLSession.dataTask completion
- returns: The Decoded Result (DResult)
*/
public func decode<Value: Swift.Decodable>(requestCompletion: (Data?, Error?)) -> DResult<Value> {
switch requestCompletion {
case (.some(let data), .some(let error)):
do {
let decodedData = try JSONDecoder().decode(Value.self, from: data)
return .successWithError(decodedData, error)
} catch let decodeError {
return .failure(decodeError)
}
case (.some(let data), .none):
do {
let decodedData = try JSONDecoder().decode(Value.self, from: data)
return .success(decodedData)
} catch let decodeError {
return .failure(decodeError)
}
case (.none, .some(let error)):
return .failure(error)

case (.none, .none):
let fallBackError = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: "Data was not retrieved from request"]) as Error
return .failure(fallBackError)
}
}

/**
Adds a handler that attempts to parse the result of the request into a **Decodable**
- parameter completion: A closure that is invoked when the request is finished, containting the desired DataModel to be returned
- returns: The URLSession.dataTask completion
*/
public func decode<Value: Swift.Decodable>(_ completion: @escaping ((DResult<Value>) -> Void)) -> ((Data?, URLResponse?, Error?) -> Void) {
return { (data, _, error) in
DispatchQueue.main.async {
completion(self.decode(requestCompletion: (data, error)))
}
}
}
}

0 comments on commit fdcb648

Please sign in to comment.