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,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
+ }