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,11 @@
1
+ //
2
+ // Created by Pedro Piñera Buendía on 2014.
3
+ // Copyright (c) 2014 Redbooth. All rights reserved.
4
+ //
5
+
6
+ #import "VIPERPresenter.h"
7
+ #import "VIPERWireframe.h"
8
+
9
+ @implementation VIPERPresenter
10
+
11
+ @end
@@ -0,0 +1,64 @@
1
+ //
2
+ // Created by Pedro Piñera Buendía on 2014.
3
+ // Copyright (c) 2014 Redbooth. All rights reserved.
4
+ //
5
+
6
+ #import <Foundation/Foundation.h>
7
+ #import <UIKit/UIKit.h>
8
+
9
+ @protocol VIPERDataManagerOutputProtocol;
10
+ @protocol VIPERInteractorOutputProtocol;
11
+ @protocol VIPERInteractorInputProtocol;
12
+ @protocol VIPERViewProtocol;
13
+ @protocol VIPERPresenterProtocol;
14
+ @protocol VIPERDataManagerInputProtocol;
15
+ @class VIPERWireFrame;
16
+
17
+ typedef void (^CompletionBlock)(NSError **error);
18
+
19
+ @protocol VIPERViewProtocol
20
+ @required
21
+ @property (nonatomic, strong) id <VIPERPresenterProtocol> presenter;
22
+ /**
23
+ * Add here your methods for communication VIEWCONTROLLER -> PRESENTER
24
+ */
25
+ @end
26
+
27
+ @protocol VIPERPresenterProtocol
28
+ @required
29
+ @property (nonatomic, weak) id <VIPERViewProtocol> view;
30
+ @property (nonatomic, strong) id <VIPERInteractorInputProtocol> interactor;
31
+ @property (nonatomic, strong) VIPERWireFrame *wireFrame;
32
+ /**
33
+ * Add here your methods for communication VIEWCONTROLLER/WIREFRAME -> PRESENTER
34
+ */
35
+ @end
36
+
37
+ @protocol VIPERInteractorOutputProtocol
38
+ /**
39
+ * Add here your methods for communication INTERACTOR -> PRESENTER
40
+ */
41
+ @end
42
+
43
+ @protocol VIPERInteractorInputProtocol
44
+ @required
45
+ @property (nonatomic, weak) id <VIPERInteractorOutputProtocol> presenter;
46
+ /**
47
+ * Add here your methods for communication PRESENTER -> INTERACTOR
48
+ */
49
+ @end
50
+
51
+
52
+ @protocol VIPERDataManagerInputProtocol
53
+ @property (nonatomic, weak) id <VIPERDataManagerOutputProtocol> interactor;
54
+ /**
55
+ * Add here your methods for communication INTERACTOR -> DATAMANAGER
56
+ */
57
+ @end
58
+
59
+ @protocol VIPERDataManagerOutputProtocol
60
+ @property (nonatomic, strong) id <VIPERDataManagerInputProtocol> dataManager;
61
+ /**
62
+ * Add here your methods for communication DATAMANAGER -> INTERACTOR
63
+ */
64
+ @end
@@ -0,0 +1,13 @@
1
+ //
2
+ // Created by Pedro Piñera Buendía on 2014.
3
+ // Copyright (c) 2014 Redbooth. All rights reserved.
4
+ //
5
+
6
+ #import <UIKit/UIKit.h>
7
+ #import "VIPERProtocols.h"
8
+
9
+ @interface VIPERViewController : UIViewController <VIPERViewProtocol>
10
+
11
+ @property (nonatomic, strong) id <VIPERPresenterProtocol> presenter;
12
+
13
+ @end
@@ -0,0 +1,32 @@
1
+ //
2
+ // Created by Pedro Piñera Buendía on 2014.
3
+ // Copyright (c) 2014 Redbooth. All rights reserved.
4
+ //
5
+
6
+ #import "VIPERViewController.h"
7
+
8
+ @implementation VIPERViewController
9
+
10
+ #pragma mark - ViewController Lifecycle
11
+
12
+ - (void)viewDidLoad
13
+ {
14
+ [super viewDidLoad];
15
+ }
16
+
17
+ - (void)viewDidDisappear:(BOOL)animated
18
+ {
19
+ [super viewDidDisappear:animated];
20
+ }
21
+
22
+ - (void)viewWillAppear:(BOOL)animated
23
+ {
24
+ [super viewWillAppear:animated];
25
+ }
26
+
27
+ - (void)viewWillDisappear:(BOOL)animated
28
+ {
29
+ [super viewWillDisappear:animated];
30
+ }
31
+
32
+ @end
@@ -0,0 +1,19 @@
1
+ //
2
+ // Created by Pedro Piñera Buendía on 2014.
3
+ // Copyright (c) 2014 Redbooth. All rights reserved.
4
+ //
5
+
6
+ #import <Foundation/Foundation.h>
7
+ #import "VIPERProtocols.h"
8
+ #import "VIPERViewController.h"
9
+ #import "VIPERDataManager.h"
10
+ #import "VIPERInteractor.h"
11
+ #import "VIPERPresenter.h"
12
+ #import "VIPERWireframe.h"
13
+ #import <UIKit/UIKit.h>
14
+
15
+ @interface VIPERWireFrame : NSObject
16
+
17
+ + (void)presentVIPERModuleFrom:(id)fromView;
18
+
19
+ @end
@@ -0,0 +1,31 @@
1
+ //
2
+ // Created by Pedro Piñera Buendía on 2014.
3
+ // Copyright (c) 2014 Redbooth. All rights reserved.
4
+ //
5
+
6
+ #import "VIPERWireFrame.h"
7
+
8
+ @implementation VIPERWireFrame
9
+
10
+ + (void)presentVIPERModuleFrom:(UIViewController*)fromViewController
11
+ {
12
+ // Generating module components
13
+ UIViewController <VIPERViewProtocol> *viewController = [[VIPERViewController alloc] init];
14
+ id <VIPERPresenterProtocol, VIPERInteractorOutputProtocol> presenter = [VIPERPresenter new];
15
+ id <VIPERInteractorInputProtocol, VIPERDataManagerOutputProtocol> interactor = [VIPERInteractor new];
16
+ id <VIPERDataManagerInputProtocol> dataManager = [VIPERDataManager new];
17
+ VIPERWireFrame *wireFrame = [VIPERWireFrame new];
18
+
19
+ // Connecting
20
+ viewController.presenter = presenter;
21
+ presenter.view = viewController;
22
+ presenter.wireFrame = wireFrame;
23
+ presenter.interactor = interactor;
24
+ interactor.presenter = presenter;
25
+ interactor.dataManager = dataManager;
26
+ dataManager.interactor = interactor;
27
+
28
+ //TOODO - New view controller presentation (present, push, pop, .. )
29
+ }
30
+
31
+ @end
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Development</key>
6
+ <dict>
7
+ <key>AWSIdentityPoolId</key>
8
+ <string></string>
9
+ <key>S3BucketName</key>
10
+ <string></string>
11
+ <key>ServicesURL</key>
12
+ <string></string>
13
+ <key>OneSignalAppId</key>
14
+ <string></string>
15
+ <key>ServicesVersion</key>
16
+ <string></string>
17
+ </dict>
18
+ <key>QA</key>
19
+ <dict>
20
+ <key>AWSIdentityPoolId</key>
21
+ <string></string>
22
+ <key>S3BucketName</key>
23
+ <string></string>
24
+ <key>ServicesURL</key>
25
+ <string></string>
26
+ <key>OneSignalAppId</key>
27
+ <string></string>
28
+ <key>ServicesVersion</key>
29
+ <string></string>
30
+ </dict>
31
+ <key>Staging</key>
32
+ <dict>
33
+ <key>AWSIdentityPoolId</key>
34
+ <string></string>
35
+ <key>S3BucketName</key>
36
+ <string></string>
37
+ <key>ServicesURL</key>
38
+ <string></string>
39
+ <key>OneSignalAppId</key>
40
+ <string></string>
41
+ <key>ServicesVersion</key>
42
+ <string></string>
43
+ </dict>
44
+ <key>Production</key>
45
+ <dict>
46
+ <key>AWSIdentityPoolId</key>
47
+ <string></string>
48
+ <key>S3BucketName</key>
49
+ <string></string>
50
+ <key>ServicesURL</key>
51
+ <string></string>
52
+ <key>OneSignalAppId</key>
53
+ <string></string>
54
+ <key>ServicesVersion</key>
55
+ <string></string>
56
+ </dict>
57
+ </dict>
58
+ </plist>
@@ -0,0 +1,50 @@
1
+ //
2
+ // Config.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 DanielMartinez. All rights reserved.
7
+ //
8
+
9
+
10
+ import UIKit
11
+
12
+ class Config: NSObject {
13
+
14
+ // MARK: - Singleton
15
+
16
+ static let sharedInstance = Config()
17
+
18
+ var config: NSDictionary?
19
+
20
+ private override init() {
21
+
22
+ let currentConfiguration = Bundle.main.object(forInfoDictionaryKey: "Config")!
23
+
24
+ let path = Bundle.main.path(forResource: "Config", ofType: "plist")!
25
+
26
+ self.config = NSDictionary(contentsOfFile: path)?.object(forKey: currentConfiguration) as? NSDictionary
27
+ }
28
+
29
+ func servicesURL() -> String {
30
+ return self.config?.object(forKey: "ServicesURL") as? String ?? ""
31
+ }
32
+
33
+ func servicesVersion() -> String {
34
+ return self.config?.object(forKey: "ServicesVersion") as? String ?? ""
35
+ }
36
+
37
+ func oneSignalAppId() -> String {
38
+ return self.config?.object(forKey: "OneSignalAppId") as? String ?? ""
39
+ }
40
+
41
+ func s3BucketName() -> String {
42
+ return self.config?.object(forKey: "S3BucketName") as? String ?? ""
43
+ }
44
+
45
+ func awsIdentityPoolId() -> String {
46
+ return self.config?.object(forKey: "AWSIdentityPoolId") as? String ?? ""
47
+ }
48
+
49
+ }
50
+
@@ -0,0 +1,110 @@
1
+ //
2
+ // Buttons.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
+
11
+ class LoadingButton: UIButton {
12
+
13
+ var originalButtonText: String?
14
+ var activityIndicator: UIActivityIndicatorView!
15
+ var activityIndicatorColor: UIColor = UIColor.white {
16
+ didSet {
17
+ if self.activityIndicator != nil {
18
+ self.activityIndicator.color = activityIndicatorColor
19
+ }
20
+ }
21
+ }
22
+
23
+ func showLoading() {
24
+ self.isEnabled = false
25
+ originalButtonText = self.titleLabel?.text
26
+ self.setTitle("", for: .normal)
27
+
28
+ if (activityIndicator == nil) {
29
+ activityIndicator = createActivityIndicator()
30
+ }
31
+
32
+ showSpinning()
33
+ }
34
+
35
+ func hideLoading() {
36
+ self.isEnabled = true
37
+ self.setTitle(originalButtonText, for: .normal)
38
+ if let activityIndicator = self.activityIndicator {
39
+ activityIndicator.stopAnimating()
40
+ }
41
+ }
42
+
43
+ private func createActivityIndicator() -> UIActivityIndicatorView {
44
+ let activityIndicator = UIActivityIndicatorView()
45
+ activityIndicator.hidesWhenStopped = true
46
+ activityIndicator.color = activityIndicatorColor
47
+ return activityIndicator
48
+ }
49
+
50
+ private func showSpinning() {
51
+ activityIndicator.translatesAutoresizingMaskIntoConstraints = false
52
+ self.addSubview(activityIndicator)
53
+ centerActivityIndicatorInButton()
54
+ activityIndicator.startAnimating()
55
+ }
56
+
57
+ private func centerActivityIndicatorInButton() {
58
+ let xCenterConstraint = NSLayoutConstraint(item: self, attribute: .centerX, relatedBy: .equal, toItem: activityIndicator, attribute: .centerX, multiplier: 1, constant: 0)
59
+ self.addConstraint(xCenterConstraint)
60
+
61
+ let yCenterConstraint = NSLayoutConstraint(item: self, attribute: .centerY, relatedBy: .equal, toItem: activityIndicator, attribute: .centerY, multiplier: 1, constant: 0)
62
+ self.addConstraint(yCenterConstraint)
63
+ }
64
+
65
+ }
66
+
67
+ @IBDesignable
68
+ class GradientButton: UIButton {
69
+ let gradientLayer = CAGradientLayer()
70
+
71
+ @IBInspectable
72
+ var topGradientColor: UIColor? {
73
+ didSet {
74
+ setGradient(topGradientColor: topGradientColor, bottomGradientColor: bottomGradientColor)
75
+ }
76
+ }
77
+
78
+ @IBInspectable
79
+ var bottomGradientColor: UIColor? {
80
+ didSet {
81
+ setGradient(topGradientColor: topGradientColor, bottomGradientColor: bottomGradientColor)
82
+ }
83
+ }
84
+
85
+ private func setGradient(topGradientColor: UIColor?, bottomGradientColor: UIColor?) {
86
+ if let topGradientColor = topGradientColor, let bottomGradientColor = bottomGradientColor {
87
+ gradientLayer.frame = bounds
88
+ gradientLayer.colors = [topGradientColor.cgColor, bottomGradientColor.cgColor]
89
+ gradientLayer.borderColor = layer.borderColor
90
+ gradientLayer.borderWidth = layer.borderWidth
91
+ gradientLayer.cornerRadius = layer.cornerRadius
92
+ layer.insertSublayer(gradientLayer, at: 0)
93
+ } else {
94
+ gradientLayer.removeFromSuperlayer()
95
+ }
96
+ }
97
+ }
98
+
99
+ extension UIButton {
100
+
101
+ func addShadow(){
102
+ // Shadow and Radius
103
+ self.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.15).cgColor
104
+ self.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
105
+ self.layer.shadowOpacity = 1.0
106
+ self.layer.shadowRadius = 0.0
107
+ self.layer.masksToBounds = false
108
+ }
109
+ }
110
+
@@ -0,0 +1,32 @@
1
+ //
2
+ // ColorHex.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
+
11
+ extension UIColor {
12
+
13
+ convenience init(hex: String) {
14
+ let scanner = Scanner(string: hex)
15
+ scanner.scanLocation = 0
16
+
17
+ var rgbValue: UInt64 = 0
18
+
19
+ scanner.scanHexInt64(&rgbValue)
20
+
21
+ let r = (rgbValue & 0xff0000) >> 16
22
+ let g = (rgbValue & 0xff00) >> 8
23
+ let b = rgbValue & 0xff
24
+
25
+ self.init(
26
+ red: CGFloat(r) / 0xff,
27
+ green: CGFloat(g) / 0xff,
28
+ blue: CGFloat(b) / 0xff, alpha: 1
29
+ )
30
+ }
31
+
32
+ }
@@ -0,0 +1,98 @@
1
+ //
2
+ // Config.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 SwiftyJSON
11
+ import NotificationBannerSwift
12
+
13
+ class APIHelper {
14
+
15
+ static let sharedInstance = APIHelper()
16
+
17
+ lazy var servicesURL = Config.sharedInstance.servicesURL()
18
+
19
+ lazy var servicesVersion = Config.sharedInstance.servicesVersion()
20
+
21
+ lazy var successBanner = NotificationBanner(title: "", subtitle: "", style: .success)
22
+
23
+ lazy var errorBanner = NotificationBanner(title: "", subtitle: "", style: .danger)
24
+
25
+ func getHeaders() -> [String : String]? {
26
+ if let userId = UserDefaults.standard.value(forKey: Constants.userId) as? String, let token = UserDefaults.standard.value(forKey: Constants.userAuthTokenKey) as? String {
27
+ // Token stored in UserDefaults.
28
+ var userAuthB64 = "Basic "
29
+ let userAuth = "\(userId):\(token)"
30
+ let userAuthData = userAuth.data(using: .utf8)!
31
+ userAuthB64 += userAuthData.base64EncodedString(options: [])
32
+
33
+ // TODO: check Accept variable, change mvcgen for project name
34
+ return [
35
+ "Authorization" : userAuthB64,
36
+ "Content-Type" : "application/json",
37
+ "Accept" : "application/vnd.mvcgen.v"+self.servicesVersion+"+json",
38
+ "X-app-version" : self.getVersionBuild(),
39
+ "X-app-device" : self.getDeviceInfo()
40
+ ]
41
+ }
42
+ return nil
43
+
44
+ }
45
+
46
+ func getVersionBuild() -> String {
47
+ var versionBuild = ""
48
+ if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
49
+ versionBuild = version
50
+ }
51
+ if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
52
+ versionBuild += " " + buildVersion
53
+ }
54
+ return versionBuild
55
+ }
56
+
57
+ func getDeviceInfo() -> String {
58
+ return UIDevice.current.model + " iOS: " + UIDevice.current.systemVersion
59
+ }
60
+
61
+ func wsResponse(onError error: Int){
62
+ switch error {
63
+ case 300..<400:
64
+ // Bad auth error
65
+ print("error is \(error)")
66
+ // let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
67
+ // appDelegate.logout()
68
+ case 801:
69
+ break
70
+ default:
71
+ print("error is \(error)")
72
+ break
73
+ }
74
+ }
75
+
76
+ func showSuccesMessage(with title : String, and subtitle : String){
77
+ NotificationBannerQueue.default.removeAll()
78
+ if !successBanner.isDisplaying{
79
+ successBanner.titleLabel?.text = title
80
+ successBanner.subtitleLabel?.text = subtitle
81
+ successBanner.show()
82
+ }
83
+ }
84
+
85
+ func showErrorMessage(with title : String, and subtitle : String){
86
+ NotificationBannerQueue.default.removeAll()
87
+ if !errorBanner.isDisplaying{
88
+ errorBanner.titleLabel?.text = title
89
+ errorBanner.subtitleLabel?.text = subtitle
90
+ errorBanner.show()
91
+ }
92
+ }
93
+ }
94
+
95
+ enum VoidResult {
96
+ case success
97
+ case failure
98
+ }