mvcgen 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +115 -0
  4. data/bin/mvcgen +9 -0
  5. data/lib/mvcgen.rb +6 -0
  6. data/lib/mvcgen/dirutils.rb +17 -0
  7. data/lib/mvcgen/filemanager.rb +51 -0
  8. data/lib/mvcgen/generator.rb +58 -0
  9. data/lib/mvcgen/mvcthor.rb +19 -0
  10. data/lib/mvcgen/templatemanager.rb +53 -0
  11. data/lib/mvcgen/version.rb +4 -0
  12. data/lib/templates/default/mvcspec.yml +4 -0
  13. data/lib/templates/default/objc/DataManager/VIPERDataManager.h +15 -0
  14. data/lib/templates/default/objc/DataManager/VIPERDataManager.m +11 -0
  15. data/lib/templates/default/objc/Interactor/VIPERInteractor.h +16 -0
  16. data/lib/templates/default/objc/Interactor/VIPERInteractor.m +10 -0
  17. data/lib/templates/default/objc/Presenter/VIPERPresenter.h +18 -0
  18. data/lib/templates/default/objc/Presenter/VIPERPresenter.m +11 -0
  19. data/lib/templates/default/objc/Protocols/VIPERProtocols.h +64 -0
  20. data/lib/templates/default/objc/ViewController/VIPERViewController.h +13 -0
  21. data/lib/templates/default/objc/ViewController/VIPERViewController.m +32 -0
  22. data/lib/templates/default/objc/WireFrame/VIPERWireFrame.h +19 -0
  23. data/lib/templates/default/objc/WireFrame/VIPERWireFrame.m +31 -0
  24. data/lib/templates/default/swift/Config/Config.plist +58 -0
  25. data/lib/templates/default/swift/Config/Config.swift +50 -0
  26. data/lib/templates/default/swift/Extensions/Buttons.swift +110 -0
  27. data/lib/templates/default/swift/Extensions/ColorHex.swift +32 -0
  28. data/lib/templates/default/swift/Helper/APIHelper.swift +98 -0
  29. data/lib/templates/default/swift/Helper/APIManager.swift +217 -0
  30. data/lib/templates/default/swift/Helper/APIRequestBody.swift +81 -0
  31. data/lib/templates/default/swift/Helper/AWSManager.swift +29 -0
  32. data/lib/templates/default/swift/Helper/FilesManager.swift +97 -0
  33. data/lib/templates/default/swift/Helper/S3Manager.swift +113 -0
  34. data/lib/templates/default/swift/Helper/Utils.swift +69 -0
  35. data/lib/templates/default/swift/Models/Managers/UserManager.swift +56 -0
  36. data/lib/templates/default/swift/Models/Responses/BaseResponse.swift +75 -0
  37. data/lib/templates/default/swift/Models/Responses/UserResponse.swift +30 -0
  38. data/lib/templates/default/swift/Models/Responses/UserSingupResponse.swift +27 -0
  39. data/lib/templates/default/swift/Models/User.swift +92 -0
  40. data/spec/mvcgen/mvcgen_spec.rb +131 -0
  41. data/spec/spec_helper.rb +4 -0
  42. metadata +159 -0
@@ -0,0 +1,217 @@
1
+ //
2
+ // APIManager.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 DanielMartinez. All rights reserved.
7
+ //
8
+
9
+ import Alamofire
10
+ import AlamofireObjectMapper
11
+ import CryptoSwift
12
+ import OneSignal
13
+
14
+ class APIManager {
15
+
16
+ // MARK: - Singleton
17
+ static let sharedInstance = APIManager()
18
+
19
+ lazy var servicesURL = Config.sharedInstance.servicesURL()
20
+
21
+ let errorMsg = NSLocalizedString("Error connecting to services. Please try again", comment: "")
22
+
23
+ // MARK: - Endpoints
24
+
25
+ func login(withParameters parameters: Parameters, completion: @escaping (_ result: VoidResult) -> Void){
26
+
27
+ Alamofire.request(APIHelper.sharedInstance.servicesURL + Endpoints.login, method: .post, parameters: parameters,
28
+ encoding: JSONEncoding.default,
29
+ headers: nil).responseObject { (response: DataResponse<UserResponse>) in
30
+
31
+ switch response.result {
32
+ case .success(_):
33
+ if let responseValue = response.result.value {
34
+ switch responseValue.result {
35
+ case true:
36
+ if let user = responseValue.user, let token = responseValue.token {
37
+ UserManager.sharedInstance.saveUser(newUser: user, withToken: token)
38
+ completion(.success)
39
+ } else {
40
+ APIHelper.sharedInstance.showErrorMessage(with: responseValue.showMessage, and: "")
41
+ completion(.failure)
42
+ }
43
+ break
44
+ case false:
45
+ let errorCode = responseValue.errorCode
46
+ APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: responseValue.message)
47
+ completion(.failure)
48
+ break
49
+ }
50
+ }
51
+ case .failure(_):
52
+ APIHelper.sharedInstance.showErrorMessage(with: errorMsg, and: "")
53
+ completion(.failure)
54
+ break
55
+ }
56
+ }
57
+ }
58
+
59
+ // If you use Codable instead of mappable:
60
+ // func login(withParameters parameters: Parameters, completion: @escaping (_ result: VoidResult) -> Void){
61
+
62
+ // Alamofire.request(APIHelper.sharedInstance.servicesURL + Endpoints.login, method: .post, parameters: parameters,
63
+ // encoding: JSONEncoding.default,
64
+ // headers: nil).responseJSON { response in
65
+
66
+ // switch response.result {
67
+ // case .success(_):
68
+ // if let responseValue = response.result.value as? [String:Any]{
69
+ // if responseValue["result"] != nil {
70
+ // let jsonData = try? JSONSerialization.data(withJSONObject: responseValue["result"], options: .prettyPrinted)
71
+ // let reqJSONStr = String(data: jsonData, encoding: .utf8)
72
+ // if let jsonData = reqJSONStr.data(using: .utf8)
73
+ // {
74
+ // let baseResponse = try? JSONDecoder().decode(BaseResponse.self, from: jsonData)
75
+ // switch baseResponse.response {
76
+ // case true:
77
+ // let jsonData = try? JSONSerialization.data(withJSONObject: responseValue["data"], options: .prettyPrinted)
78
+ // let reqJSONStr = String(data: jsonData, encoding: .utf8)
79
+ // if let jsonData = reqJSONStr.data(using: .utf8) {
80
+ // let userResponse = try? JSONDecoder().decode(User.self, from: jsonData)
81
+ // UserManager.sharedInstance.saveUser(newUser: userResponse.user, withToken: userResponse.token)
82
+ // completion(.success)
83
+ // }else {
84
+ // APIHelper.sharedInstance.showErrorMessage(with: baseResponse.showMessage, and: "")
85
+ // completion(.failure)
86
+ // }
87
+ // break
88
+ // case false:
89
+ // let errorCode = responseValue.errorCode
90
+ // APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: responseValue.message)
91
+ // completion(.failure)
92
+ // break
93
+ // }
94
+ // }
95
+ // }
96
+
97
+ // }
98
+ // case .failure(_):
99
+ // APIHelper.sharedInstance.showErrorMessage(with: errorMsg, and: "")
100
+ // completion(.failure)
101
+ // break
102
+ // }
103
+ // }
104
+ // }
105
+
106
+ func loginfb(withParameters parameters: Parameters, completion: @escaping (_ result: VoidResult) -> Void){
107
+
108
+ Alamofire.request(APIHelper.sharedInstance.servicesURL + Endpoints.fbLogin, method: .post, parameters: parameters,
109
+ encoding: JSONEncoding.default,
110
+ headers: nil).responseObject { (response: DataResponse<UserResponse>) in
111
+
112
+ switch response.result {
113
+ case .success(_):
114
+ if let responseValue = response.result.value {
115
+ switch responseValue.result {
116
+ case true:
117
+ if let user = responseValue.user, let token = responseValue.token {
118
+ UserManager.sharedInstance.saveUser(newUser: user, withToken: token)
119
+ completion(.success)
120
+ } else {
121
+ APIHelper.sharedInstance.showErrorMessage(with: responseValue.showMessage, and: "")
122
+ completion(.failure)
123
+ }
124
+ break
125
+ case false:
126
+ let errorCode = responseValue.errorCode
127
+ APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: responseValue.message)
128
+ completion(.failure)
129
+ break
130
+ }
131
+ }
132
+ case .failure(_):
133
+ APIHelper.sharedInstance.showErrorMessage(with: errorMsg, and: "")
134
+ completion(.failure)
135
+ break
136
+ }
137
+ }
138
+ }
139
+
140
+ func logout(completion: @escaping (VoidResult) -> Void) {
141
+ Alamofire.request(APIHelper.sharedInstance.servicesURL + Endpoints.logout, method: .post, parameters: nil, encoding: JSONEncoding.default, headers: APIHelper.sharedInstance.getHeaders()).responseObject { (response: DataResponse<BaseResponse>) in
142
+
143
+ switch response.result {
144
+ case .success(_):
145
+
146
+ if let baseResponse = response.result.value {
147
+ switch baseResponse.result {
148
+ case true:
149
+ completion(.success)
150
+ break
151
+ case false:
152
+ let errorCode = baseResponse.errorCode
153
+ APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: baseResponse.message)
154
+ completion(.failure)
155
+ break
156
+ }
157
+ }
158
+ case .failure(_):
159
+ APIHelper.sharedInstance.showErrorMessage(with: errorMsg, and: "")
160
+ completion(.failure)
161
+ break
162
+ }
163
+ }
164
+ }
165
+
166
+ func signup(withParameters parameters: Parameters, completion: @escaping (_ result: VoidResult, _ user: User?) -> Void) {
167
+ Alamofire.request(APIHelper.sharedInstance.servicesURL + Endpoints.signup, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseObject { (response: DataResponse<UserSignupResponse>) in
168
+
169
+ switch response.result {
170
+ case .success(_):
171
+
172
+ if let baseResponse = response.result.value {
173
+ switch baseResponse.result {
174
+ case true:
175
+ completion(.success,nil)
176
+ break
177
+ case false:
178
+ let errorCode = baseResponse.errorCode
179
+ APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: baseResponse.message)
180
+ completion(.failure,nil)
181
+ break
182
+ }
183
+ }
184
+ case .failure(_):
185
+ APIHelper.sharedInstance.showErrorMessage(with: errorMsg, comment: ""), and: "")
186
+ completion(.failure,nil)
187
+ break
188
+ }
189
+ }
190
+ }
191
+
192
+ func forgotPwd(withParameters parameters: Parameters, completion: @escaping (_ result: VoidResult) -> Void) {
193
+ Alamofire.request(APIHelper.sharedInstance.servicesURL + Endpoints.forgotPwd, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseObject { (response: DataResponse<BaseResponse>) in
194
+
195
+ switch response.result {
196
+ case .success(_):
197
+
198
+ if let baseResponse = response.result.value {
199
+ switch baseResponse.result {
200
+ case true:
201
+ completion(.success)
202
+ break
203
+ case false:
204
+ let errorCode = baseResponse.errorCode
205
+ APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: baseResponse.message)
206
+ completion(.failure)
207
+ break
208
+ }
209
+ }
210
+ case .failure(_):
211
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Error connecting to services. Please try again", comment: ""), and: "")
212
+ completion(.failure)
213
+ break
214
+ }
215
+ }
216
+ }
217
+ }
@@ -0,0 +1,81 @@
1
+ //
2
+ // APIRequestBody.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 DanielMartinez. All rights reserved.
7
+ //
8
+
9
+ import Alamofire
10
+ import OneSignal
11
+
12
+ struct APIRequestBody {
13
+
14
+ static func getLoginBody(withEmail email: String, withPassword password: String) -> Parameters{
15
+
16
+ var loginBody: Parameters = Parameters()
17
+
18
+ loginBody.updateValue(email, forKey: "email")
19
+
20
+ if let pwdData = password.data(using: .utf8) {
21
+ let hash = pwdData.sha256()
22
+ loginBody.updateValue(hash.toHexString(), forKey: "password")
23
+ }
24
+
25
+ loginBody.updateValue(UIDevice.current.model + " iOS: " + UIDevice.current.systemVersion, forKey: "device")
26
+ loginBody.updateValue(APIHelper.sharedInstance.getVersionBuild(), forKey: "version")
27
+
28
+ if let playerId = OneSignal.getPermissionSubscriptionState().subscriptionStatus.userId{
29
+ loginBody.updateValue(playerId, forKey: "onesignalPlayerId")
30
+ }
31
+
32
+ return loginBody
33
+ }
34
+
35
+ static func getFbLoginBody(withAccesToken accessToken: String) -> Parameters{
36
+
37
+ var loginBody: Parameters = Parameters()
38
+
39
+ loginBody.updateValue(accessToken, forKey: "accessToken")
40
+
41
+ loginBody.updateValue(UIDevice.current.model + " iOS: " + UIDevice.current.systemVersion, forKey: "device")
42
+ loginBody.updateValue(APIHelper.sharedInstance.getVersionBuild(), forKey: "version")
43
+
44
+ if let playerId = OneSignal.getPermissionSubscriptionState().subscriptionStatus.userId{
45
+ loginBody.updateValue(playerId, forKey: "onesignalPlayerId")
46
+ }
47
+
48
+ return loginBody
49
+ }
50
+
51
+ static func getSignupBody(withEmail email: String, withPassword password: String, withFirstName firstname: String, withLastname lastname: String, withPhone phone: String, withProfilePic profilePic: String, withStudies studies: String, withCertifications certifications: String, withAbout about: String) -> Parameters{
52
+
53
+ var signupBody: Parameters = Parameters()
54
+
55
+ signupBody.updateValue(email, forKey: "email")
56
+
57
+ if let pwdData = password.data(using: .utf8) {
58
+ let hash = pwdData.sha256()
59
+ signupBody.updateValue(hash.toHexString(), forKey: "password")
60
+ }
61
+
62
+ signupBody.updateValue(firstname, forKey: "firstname")
63
+ signupBody.updateValue(lastname, forKey: "lastname")
64
+ signupBody.updateValue(phone, forKey: "phone")
65
+
66
+ return signupBody
67
+ }
68
+
69
+ static func forgotPwd(withEmail email: String) -> Parameters{
70
+
71
+ var forgotPwdBody: Parameters = Parameters()
72
+
73
+ forgotPwdBody.updateValue(email, forKey: "email")
74
+
75
+ return forgotPwdBody
76
+ }
77
+
78
+ }
79
+
80
+
81
+
@@ -0,0 +1,29 @@
1
+ //
2
+ // AWSManager.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 DanielMartinez. All rights reserved.
7
+ //
8
+
9
+ import UIKit
10
+ import AWSCore
11
+ import AWSCognito
12
+
13
+ class AWSManager: NSObject {
14
+
15
+ // MARK: - Singleton
16
+
17
+ static let sharedInstance = AWSManager()
18
+
19
+ private override init() {
20
+
21
+ let credentialProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: Config.sharedInstance.awsIdentityPoolId())
22
+
23
+ let configuration = AWSServiceConfiguration(region:.USEast1, credentialsProvider:credentialProvider)
24
+
25
+ AWSServiceManager.default().defaultServiceConfiguration = configuration
26
+
27
+ }
28
+
29
+ }
@@ -0,0 +1,97 @@
1
+ //
2
+ // FilesManager.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 DanielMartinez. All rights reserved.
7
+ //
8
+
9
+ import UIKit
10
+ import AVKit
11
+ import AVFoundation
12
+
13
+ class FilesManager: NSObject {
14
+
15
+ static let sharedInstance = FilesManager()
16
+
17
+ fileprivate override init() {
18
+ super.init()
19
+ }
20
+
21
+ func getDocumentsURL() -> URL {
22
+
23
+ let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
24
+ return documentsURL
25
+
26
+ }
27
+
28
+ func fileInDocumentsDirectory(_ filename: String) -> String {
29
+
30
+ let fileURL = self.getDocumentsURL().appendingPathComponent(filename)
31
+ return fileURL.path
32
+
33
+ }
34
+
35
+ func fileModificationDate(_ filename: String) -> Date? {
36
+ do {
37
+ let path = self.fileInDocumentsDirectory(filename)
38
+ let attr = try FileManager.default.attributesOfItem(atPath: path)
39
+ return attr[FileAttributeKey.modificationDate] as? Date
40
+ } catch {
41
+ return nil
42
+ }
43
+ }
44
+
45
+ func saveMedia(_ media: Data, filename: String ) -> Bool {
46
+ let path = self.fileInDocumentsDirectory(filename)
47
+ let result = (try? media.write(to: URL(fileURLWithPath: path), options: [.atomic])) != nil
48
+ print("Save media at: \(self.fileInDocumentsDirectory(filename))")
49
+ print("Result: \(result)")
50
+ return result
51
+ }
52
+
53
+ func loadMedia(_ filename: String) -> Data? {
54
+
55
+ let path = self.fileInDocumentsDirectory(filename)
56
+
57
+ let media = try? Data(contentsOf: URL(fileURLWithPath: path))
58
+
59
+ if media == nil {
60
+ print("Missing media at: \(path)")
61
+ }
62
+ print("Loading media from path: \(path)")
63
+
64
+ return media
65
+ }
66
+
67
+ func removeMedia(filename: String) -> Bool {
68
+ let fileURL = fileInDocumentsDirectory(filename)
69
+ do {
70
+ try FileManager.default.removeItem(atPath: fileURL)
71
+ return true
72
+ } catch {
73
+ print("Error removing media \(filename) error: \(error)")
74
+ return false
75
+ }
76
+ }
77
+
78
+ func removeAllAppLocalFiles() {
79
+ do {
80
+ let fileManager = FileManager.default
81
+ let documentsPath = getDocumentsURL().path
82
+ let fileNames = try fileManager.contentsOfDirectory(atPath: "\(documentsPath)")
83
+ print("all files : \(fileNames)")
84
+
85
+ for fileName in fileNames {
86
+ let filePathName = "\(documentsPath)/\(fileName)"
87
+ print(filePathName)
88
+ try fileManager.removeItem(atPath: filePathName)
89
+ }
90
+ print("All app files cleared")
91
+ } catch {
92
+ print("Couldn't clear all files")
93
+ }
94
+
95
+ }
96
+
97
+ }
@@ -0,0 +1,113 @@
1
+ //
2
+ // S3Manager.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 DanielMartinez. All rights reserved.
7
+ //
8
+
9
+ import UIKit
10
+ import AWSS3
11
+
12
+ class S3Manager: NSObject{
13
+
14
+ // MARK: - Singleton
15
+ static let sharedInstance = S3Manager()
16
+
17
+ let transferManager = AWSS3TransferManager.default()
18
+
19
+ private override init() {}
20
+
21
+ func uploadToS3(url uploadingFileURL: URL, name key: String, completeBlock: @escaping (Bool) -> Void) {
22
+
23
+ if let uploadRequest = AWSS3TransferManagerUploadRequest() {
24
+
25
+ uploadRequest.bucket = Config.sharedInstance.s3BucketName()
26
+ uploadRequest.key = key
27
+ uploadRequest.body = uploadingFileURL
28
+ self.transferManager.upload(uploadRequest).continueWith(executor: AWSExecutor.mainThread(), block: { (task:AWSTask<AnyObject>) -> Any? in
29
+
30
+ if let error = task.error as NSError? {
31
+ if error.domain == AWSS3TransferManagerErrorDomain, let code = AWSS3TransferManagerErrorType(rawValue: error.code) {
32
+ switch code {
33
+ case .cancelled, .paused:
34
+ break
35
+ default:
36
+ print("Error uploading: \(uploadRequest.key!) Error: \(error)")
37
+ }
38
+ } else {
39
+ print("Error uploading: \(uploadRequest.key!) Error: \(error)")
40
+ }
41
+ completeBlock(false)
42
+ return nil
43
+ }
44
+
45
+ if let uploadOutput = task.result {
46
+ print("Upload complete for: \(uploadRequest.key!) - Output \(uploadOutput)")
47
+ completeBlock(true)
48
+ }
49
+
50
+ return nil
51
+ })
52
+ }
53
+ }
54
+
55
+ func downloadFromS3(downloadingFilename: String, name key: String, completeBlock: @escaping (String, Bool) -> Void) {
56
+ if let downloadRequest = AWSS3TransferManagerDownloadRequest() {
57
+
58
+ downloadRequest.bucket = Config.sharedInstance.s3BucketName()
59
+ downloadRequest.key = key
60
+ downloadRequest.downloadingFileURL = URL(fileURLWithPath: FilesManager.sharedInstance.fileInDocumentsDirectory(downloadingFilename))
61
+ self.transferManager.download(downloadRequest).continueWith(executor: AWSExecutor.mainThread(), block: { (task: AWSTask<AnyObject>) -> Any? in
62
+ if let error = task.error as NSError? {
63
+ if error.domain == AWSS3TransferManagerErrorDomain, let code = AWSS3TransferManagerErrorType(rawValue: error.code) {
64
+ switch code {
65
+ case .cancelled, .paused:
66
+ break
67
+ default:
68
+ print("Error downloading: \(downloadRequest.key!) Error: \(error)")
69
+ }
70
+ } else {
71
+ print("Error downloading: \(downloadRequest.key!) Error: \(error)")
72
+ }
73
+ completeBlock(downloadingFilename, false)
74
+ return nil
75
+ }
76
+
77
+ if let downloadOutput = task.result {
78
+ print("Download complete for: \(downloadRequest.key!) - Output \(downloadOutput)")
79
+ completeBlock(downloadingFilename, true)
80
+ }
81
+ return nil
82
+ })
83
+ }
84
+ }
85
+
86
+ func downloadFromS3Aux(downloadRequest: AWSS3TransferManagerDownloadRequest,downloadingFilename:String,completeBlock: @escaping (String, Bool) -> Void) {
87
+ self.transferManager.download(downloadRequest).continueWith(executor: AWSExecutor.mainThread(), block: { (task: AWSTask<AnyObject>) -> Any? in
88
+ if let error = task.error as NSError? {
89
+ if error.domain == AWSS3TransferManagerErrorDomain, let code = AWSS3TransferManagerErrorType(rawValue: error.code) {
90
+ switch code {
91
+ case .cancelled, .paused:
92
+ break
93
+ default:
94
+ break
95
+ print("Error downloading: \(downloadRequest.key!) Error: \(error)")
96
+ }
97
+ } else {
98
+ print("Error downloading: \(downloadRequest.key!) Error: \(error)")
99
+ }
100
+ completeBlock(downloadingFilename, false)
101
+ return nil
102
+ }
103
+ print("Download complete for: \(downloadRequest.key!)")
104
+
105
+ if let downloadOutput = task.result {
106
+ print("Download complete for: \(downloadRequest.key!) - Output \(downloadOutput)")
107
+ completeBlock(downloadingFilename, true)
108
+ }
109
+ return nil
110
+ })
111
+ }
112
+
113
+ }