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

Commit fdcb648

Browse files
authored
Merge pull request #56 from nodes-ios/develop
Develop
2 parents 9ed62b2 + f437671 commit fdcb648

File tree

4 files changed

+207
-2
lines changed

4 files changed

+207
-2
lines changed

Codemine.xcodeproj/project.pbxproj

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@
6363
293490EE1C6CAFD500E8305E /* Application.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293490ED1C6CAFD500E8305E /* Application.swift */; };
6464
293490F01C6CAFF200E8305E /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293490EF1C6CAFF200E8305E /* Then.swift */; };
6565
296831491DD5EC670002FE5A /* DispatchTime+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */; };
66+
42DDB213206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
67+
42DDB214206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
68+
42DDB215206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
69+
42DDB216206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */; };
70+
42DDB218206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
71+
42DDB219206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
72+
42DDB21A206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
73+
42DDB21B206A66A100A58997 /* Extention+HexInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */; };
74+
42FB12132063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
75+
42FB12142063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
76+
42FB12152063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
77+
42FB12162063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
6678
838A0F971F03F57E00469143 /* String+HTML.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838A0F961F03F57E00469143 /* String+HTML.swift */; };
6779
83A5BEBC1D981F3500C74312 /* UIImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEBB1D981F3500C74312 /* UIImageTests.swift */; };
6880
83A5BEBD1D98215F00C74312 /* UIImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEBB1D981F3500C74312 /* UIImageTests.swift */; };
@@ -76,8 +88,8 @@
7688
83A5BEC91D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; };
7789
83A5BECA1D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; };
7890
83A5BECB1D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; };
79-
9F4A1BBE1F97AF0F00154997 /* XCTestCase+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */; };
8091
8C9AAA2F1F4ED1F000F9E7C9 /* URLParameterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C9AAA2E1F4ED1F000F9E7C9 /* URLParameterTests.swift */; };
92+
9F4A1BBE1F97AF0F00154997 /* XCTestCase+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */; };
8193
/* End PBXBuildFile section */
8294

8395
/* Begin PBXContainerItemProxy section */
@@ -131,13 +143,16 @@
131143
293490ED1C6CAFD500E8305E /* Application.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Application.swift; sourceTree = "<group>"; };
132144
293490EF1C6CAFF200E8305E /* Then.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Then.swift; sourceTree = "<group>"; };
133145
296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DispatchTime+Utilities.swift"; sourceTree = "<group>"; };
146+
42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extensions+StringInitializable.swift"; sourceTree = "<group>"; };
147+
42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extention+HexInitializable.swift"; sourceTree = "<group>"; };
148+
42FB12122063D04900F850D1 /* URLSession+Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URLSession+Codable.swift"; sourceTree = "<group>"; };
134149
838A0F961F03F57E00469143 /* String+HTML.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+HTML.swift"; sourceTree = "<group>"; };
135150
83A5BEBB1D981F3500C74312 /* UIImageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageTests.swift; sourceTree = "<group>"; };
136151
83A5BEBF1D98226800C74312 /* add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add.png; sourceTree = "<group>"; };
137152
83A5BEC31D98228300C74312 /* alert.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = alert.png; sourceTree = "<group>"; };
138153
83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLImageAssetSizeTests.swift; sourceTree = "<group>"; };
139-
9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Utilities.swift"; sourceTree = "<group>"; };
140154
8C9AAA2E1F4ED1F000F9E7C9 /* URLParameterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLParameterTests.swift; sourceTree = "<group>"; };
155+
9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Utilities.swift"; sourceTree = "<group>"; };
141156
/* End PBXFileReference section */
142157

143158
/* Begin PBXFrameworksBuildPhase section */
@@ -261,6 +276,9 @@
261276
291272CC1C75EECB00FB1BBD /* UIView+Utilities.swift */,
262277
296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */,
263278
838A0F961F03F57E00469143 /* String+HTML.swift */,
279+
42FB12122063D04900F850D1 /* URLSession+Codable.swift */,
280+
42DDB212206A61A700A58997 /* Extensions+StringInitializable.swift */,
281+
42DDB217206A66A100A58997 /* Extention+HexInitializable.swift */,
264282
);
265283
path = Extensions;
266284
sourceTree = "<group>";
@@ -577,10 +595,13 @@
577595
buildActionMask = 2147483647;
578596
files = (
579597
01CD40881D071BDC0044887E /* CGRect+Utilities.swift in Sources */,
598+
42DDB214206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
580599
01CD40891D071BDC0044887E /* CGPoint+Utilities.swift in Sources */,
581600
01CD40631D071BCB0044887E /* Then.swift in Sources */,
601+
42DDB219206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
582602
01CD40851D071BDC0044887E /* String+CaseConverter.swift in Sources */,
583603
01CD408A1D071BDC0044887E /* NSError+Utilities.swift in Sources */,
604+
42FB12142063D04900F850D1 /* URLSession+Codable.swift in Sources */,
584605
01CD40651D071BCB0044887E /* Operators.swift in Sources */,
585606
01CD40871D071BDC0044887E /* String+EmailValidation.swift in Sources */,
586607
01CD40621D071BCB0044887E /* Application.swift in Sources */,
@@ -605,6 +626,7 @@
605626
01CD407F1D071BDC0044887E /* CGPoint+Utilities.swift in Sources */,
606627
01CD40831D071BDC0044887E /* UIImage+Utilities.swift in Sources */,
607628
01CD40821D071BDC0044887E /* NSURL+Utilities.swift in Sources */,
629+
42DDB21A206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
608630
01CD40671D071BCC0044887E /* Then.swift in Sources */,
609631
01CD407B1D071BDC0044887E /* String+CaseConverter.swift in Sources */,
610632
01CD40801D071BDC0044887E /* NSError+Utilities.swift in Sources */,
@@ -614,6 +636,8 @@
614636
01CD407D1D071BDC0044887E /* String+EmailValidation.swift in Sources */,
615637
01CD40661D071BCC0044887E /* Application.swift in Sources */,
616638
01CD407C1D071BDC0044887E /* String+Range.swift in Sources */,
639+
42DDB215206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
640+
42FB12152063D04900F850D1 /* URLSession+Codable.swift in Sources */,
617641
);
618642
runOnlyForDeploymentPostprocessing = 0;
619643
};
@@ -633,7 +657,10 @@
633657
01CD40741D071BDB0044887E /* CGRect+Utilities.swift in Sources */,
634658
01CD40751D071BDB0044887E /* CGPoint+Utilities.swift in Sources */,
635659
01CD40791D071BDB0044887E /* UIImage+Utilities.swift in Sources */,
660+
42FB12162063D04900F850D1 /* URLSession+Codable.swift in Sources */,
661+
42DDB216206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
636662
01CD406B1D071BCC0044887E /* Then.swift in Sources */,
663+
42DDB21B206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
637664
01CD40711D071BDB0044887E /* String+CaseConverter.swift in Sources */,
638665
01CD40761D071BDB0044887E /* NSError+Utilities.swift in Sources */,
639666
01CD40771D071BDB0044887E /* UIColor+Hex.swift in Sources */,
@@ -654,6 +681,7 @@
654681
291272BB1C75EC2C00FB1BBD /* String+Range.swift in Sources */,
655682
291272C91C75EE9A00FB1BBD /* NSURL+Utilities.swift in Sources */,
656683
296831491DD5EC670002FE5A /* DispatchTime+Utilities.swift in Sources */,
684+
42DDB213206A61A700A58997 /* Extensions+StringInitializable.swift in Sources */,
657685
838A0F971F03F57E00469143 /* String+HTML.swift in Sources */,
658686
291272C31C75EDE300FB1BBD /* CGRect+Utilities.swift in Sources */,
659687
291272CB1C75EEB500FB1BBD /* UIImage+Utilities.swift in Sources */,
@@ -663,6 +691,8 @@
663691
293490F01C6CAFF200E8305E /* Then.swift in Sources */,
664692
0132B4CF1C70E616007BC588 /* NSError+Utilities.swift in Sources */,
665693
291272C11C75ED3900FB1BBD /* UIColor+Hex.swift in Sources */,
694+
42DDB218206A66A100A58997 /* Extention+HexInitializable.swift in Sources */,
695+
42FB12132063D04900F850D1 /* URLSession+Codable.swift in Sources */,
666696
);
667697
runOnlyForDeploymentPostprocessing = 0;
668698
};
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//
2+
// Extensions.swift
3+
// Serializable
4+
//
5+
// Created by Chris Combs on 16/02/16.
6+
// Copyright © 2016 Nodes. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
// MARK: - Protocols -
12+
// MARK: String Initializable
13+
14+
public protocol StringInitializable {
15+
static func fromString<T>(_ string: String) -> T?
16+
func stringRepresentation() -> String
17+
}
18+
19+
extension URL: StringInitializable {
20+
public static func fromString<T>(_ string: String) -> T? {
21+
return self.init(string: string) as? T
22+
}
23+
24+
public func stringRepresentation() -> String {
25+
return self.absoluteString
26+
}
27+
}
28+
29+
extension Date: StringInitializable {
30+
static fileprivate let internalDateFormatter = DateFormatter()
31+
static fileprivate let allowedDateFormats = ["yyyy-MM-dd'T'HH:mm:ssZZZZZ", "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd"]
32+
static public var customDateFormats: [String] = []
33+
34+
public static func fromString<T>(_ string: String) -> T? {
35+
for format in allowedDateFormats + customDateFormats {
36+
internalDateFormatter.dateFormat = format
37+
if let date = internalDateFormatter.date(from: string) as? T {
38+
return date
39+
}
40+
}
41+
42+
return nil
43+
}
44+
45+
public func stringRepresentation() -> String {
46+
Date.internalDateFormatter.dateFormat = Date.allowedDateFormats.first
47+
return Date.internalDateFormatter.string(from: self)
48+
}
49+
}
50+
51+
52+
53+
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//
2+
// Extention+HexInitializable.swift
3+
// Codemine
4+
//
5+
// Created by Andrei Hogea on 27/03/2018.
6+
// Copyright © 2018 Nodes. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
// MARK: Hex Initializable
12+
#if os(OSX)
13+
import Cocoa
14+
typealias Color = NSColor
15+
#else
16+
import UIKit
17+
typealias Color = UIColor
18+
#endif
19+
20+
public protocol HexInitializable {
21+
static func fromHexString<T>(_ hexString: String) -> T?
22+
}
23+
24+
extension Color: HexInitializable {
25+
26+
public static func fromHexString<T>(_ hexString: String) -> T? {
27+
let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
28+
var int = UInt32()
29+
let a, r, g, b: UInt32
30+
31+
guard Scanner(string: hex).scanHexInt32(&int) else {
32+
return nil
33+
}
34+
35+
switch hex.count {
36+
// RGB (12-bit)
37+
case 3:
38+
(a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
39+
// RRGGBB (24-bit)
40+
case 6:
41+
(a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
42+
// ARGB (32-bit)
43+
case 8:
44+
(a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
45+
default:
46+
return nil
47+
}
48+
49+
return self.init(red: CGFloat(r) / 255,
50+
green: CGFloat(g) / 255,
51+
blue: CGFloat(b) / 255,
52+
alpha: CGFloat(a) / 255) as? T
53+
}
54+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
//
2+
// URLSession+Codable.swift
3+
// Codemine
4+
//
5+
// Created by Andrei Hogea on 22/03/2018.
6+
// Copyright © 2018 Nodes. All rights reserved.
7+
//
8+
9+
10+
import Foundation
11+
12+
// Decoded Result
13+
public enum DResult<Value> {
14+
case success(Value)
15+
case successWithError(Value, Error)
16+
case failure(Error)
17+
}
18+
19+
public extension URLSession {
20+
21+
/**
22+
Adds a handler that attempts to parse the result of the request into a **Decodable**
23+
24+
- parameter requestCompletion: The URLSession.dataTask completion
25+
26+
- returns: The Decoded Result (DResult)
27+
*/
28+
public func decode<Value: Swift.Decodable>(requestCompletion: (Data?, Error?)) -> DResult<Value> {
29+
switch requestCompletion {
30+
case (.some(let data), .some(let error)):
31+
do {
32+
let decodedData = try JSONDecoder().decode(Value.self, from: data)
33+
return .successWithError(decodedData, error)
34+
} catch let decodeError {
35+
return .failure(decodeError)
36+
}
37+
case (.some(let data), .none):
38+
do {
39+
let decodedData = try JSONDecoder().decode(Value.self, from: data)
40+
return .success(decodedData)
41+
} catch let decodeError {
42+
return .failure(decodeError)
43+
}
44+
case (.none, .some(let error)):
45+
return .failure(error)
46+
47+
case (.none, .none):
48+
let fallBackError = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: "Data was not retrieved from request"]) as Error
49+
return .failure(fallBackError)
50+
}
51+
}
52+
53+
/**
54+
Adds a handler that attempts to parse the result of the request into a **Decodable**
55+
56+
- parameter completion: A closure that is invoked when the request is finished, containting the desired DataModel to be returned
57+
58+
- returns: The URLSession.dataTask completion
59+
*/
60+
public func decode<Value: Swift.Decodable>(_ completion: @escaping ((DResult<Value>) -> Void)) -> ((Data?, URLResponse?, Error?) -> Void) {
61+
return { (data, _, error) in
62+
DispatchQueue.main.async {
63+
completion(self.decode(requestCompletion: (data, error)))
64+
}
65+
}
66+
}
67+
}
68+

0 commit comments

Comments
 (0)