mvcgen 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }