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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 171c12fa910bd62024c0a177a336b7a2a2817045
4
+ data.tar.gz: 6a3e967271ab52b634c8704691783e7b237d1141
5
+ SHA512:
6
+ metadata.gz: 9b8ef45ef1a1b94816abde42829e607f402a70be323e35fb9191deea1c78c538d9501ca939cb17956f34346367163b9d1cf903f9e417ca043d59510e603c3bcf
7
+ data.tar.gz: 69fa37c0dc1bc63aeb2f5ddc845679716c0986868f1bb8ac13bd1717f24e8660399b08ee327b0537dfa7e05d6710a173aa6d05a460e9a2d53cb33be2a188f6ee
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Redbooth
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,115 @@
1
+ MVC Module Generator
2
+ ======================
3
+
4
+ <!-- ## :warning: This project is no longer maintained.
5
+
6
+ Gem to generate MVC modules to use them in your Swift projects
7
+ The implementation scheme returned by this generator is hardly inspired in the example and post of Objc.io, http://www.objc.io/issue-13/viper.html .
8
+
9
+ - [Features](#features)
10
+ - [Changelog](#changelog-0.1)
11
+ - [Expected in version 0.2](#expected-in-version-0.2)
12
+ - [MVC files structure](#mvc-files-structure)
13
+ - [How to install mvcgen](#how-to-install-vipergen)
14
+ - [How to generate a MVC module with a given name?](#how-to-generate-viper-module-with-a-given-name?)
15
+ - [Developer tips](#developer-tips)
16
+ - [Update the gem](#update-the-gem)
17
+ - [Add a new template](#add-a-new-template)
18
+ - [Resources](#resources)
19
+
20
+ ## Features
21
+ - Generates the module in Swift and Objective-C
22
+ - Ready to be installed as a gem https://rubygems.org/gems/VIPERGen
23
+
24
+ ### Changelog 0.1.6
25
+ - Added `templates` command to know which templates are available
26
+ - YAML file in each template with the information about the template (more scalable)
27
+
28
+ ### Changelog 0.1
29
+ - Added default template
30
+ - Fully components tested
31
+
32
+ ### Expected in version 0.2
33
+ - Example project of Redbooth login with notifications
34
+ - FetchedResultsController template
35
+ - Default template in Swift
36
+ - Login template
37
+ - Integrate with XCode as a plugin (http://nshipster.com/xcode-plugins/)
38
+
39
+ ## Viper files structure
40
+ ```bash
41
+ .objc
42
+ +-- DataManager
43
+ | +-- VIPERDataManager.h
44
+ | +-- VIPERDataManager.m
45
+ +-- Interactor
46
+ | +-- VIPERInteractor.h
47
+ | +-- VIPERInteractor.m
48
+ +-- Presenter
49
+ | +-- VIPERPresenter.h
50
+ | +-- VIPERPresenter.m
51
+ +-- ViewController
52
+ | +-- VIPERViewController.h
53
+ | +-- VIPERViewController.m
54
+ +-- WireFrame
55
+ | +-- VIPERWireFrame.h
56
+ | +-- VIPERWireFrame.m
57
+ +-- Protocols
58
+ | +-- VIPERProtocols.h
59
+ .swift
60
+ +-- DataManager
61
+ | +-- VIPERDataManager.swift
62
+ +-- Interactor
63
+ | +-- VIPERInteractor.swift
64
+ +-- Presenter
65
+ | +-- VIPERPresenter.swift
66
+ +-- ViewController
67
+ | +-- VIPERViewController.swift
68
+ +-- WireFrame
69
+ | +-- VIPERWireFrame.swift
70
+ +-- Protocols
71
+ | +-- VIPERProtocols.swift
72
+ ```
73
+ ## How to install vipergen ?
74
+ You can install it easily as using the gem. With ruby installed in your OSX execute:
75
+ ```bash
76
+ sudo gem install vipergen
77
+ ```
78
+ If everything were right, you should have now the vipergem command available in your system console
79
+
80
+ ## How to generate a VIPER module with a given name?
81
+ You have just to execute the following command
82
+ ```bash
83
+ vipergen generate MyFirstViperModule --path=~/myproject/shared
84
+ ```
85
+ And then the files structure will be automatically created. Don't forget to add this folder to your project dragging it into the XCode/Appcode inspector
86
+
87
+ ## Developer tips
88
+ ### Update the gem
89
+ When the gem is updated it has to be reported to the gem repository. I followed this tutorial http://amaras-tech.co.uk/article/43/Creating_executable_gems that basically says that once you have your gem ready execute:
90
+ ```bash
91
+ gem build vipergen.gemspec
92
+ gem install vipergen-0.1.gem
93
+ gem push vipergen-0.1.gem
94
+ ```
95
+ Then you'll be asked for your credentials in order to make the update in the repo (http://guides.rubygems.org/publishing/)
96
+
97
+ ### Add a new template
98
+ Are you interested in VIPER and you would like to contribute with this gem adding new templates? Feel free to do it. It's pretty easy. You've just to:
99
+ - Create a folder inside `templates` with the name of your template
100
+ - You'll have to create inside the templates in both languages, Swift and Objective-C (get inspired from existing templates)
101
+ - Use the word VIPER where you want the name to be replaced in.
102
+ - Remember to add the file viperspec.yml with the description of your template as below:
103
+ ```yaml
104
+ author: pepi
105
+ author_email: pepibumur@gmail.com
106
+ template_description: Default template with the simplest structure using VIPER
107
+ updated_at: 2014-08-24
108
+ ```
109
+ - Report it as a PR in this repo updating the gem version in Gemspec.
110
+
111
+ ## Resources
112
+ - Rspec documentation: http://rubydoc.info/gems/rspec-expectations/frames
113
+ - XCode Plugins: http://nshipster.com/xcode-plugins/
114
+ - XCodeProj gem (to modify project groups structure): https://github.com/CocoaPods/Xcodeproj
115
+ - Thor, powerful Ruby library for command line: http://whatisthor.com/ -->
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #require 'rubygems'
4
+ require 'mvcgen/mvcthor'
5
+
6
+ puts "------- MVC GENERATOR---------\n"
7
+ puts ARGV
8
+ MVCgen::MVCThor.start(ARGV)
9
+ puts "--------------------------------\n"
@@ -0,0 +1,6 @@
1
+ require 'mvcgen/generator'
2
+ require 'mvcgen/filemanager'
3
+ require 'mvcgen/dirutils'
4
+ require 'mvcgen/version'
5
+ require 'mvcgen/mvcthor'
6
+ require 'mvcgen/templatemanager'
@@ -0,0 +1,17 @@
1
+ module MVCgen
2
+ class DirUtils
3
+ # Return a directory with the project libraries.
4
+ def self.gem_libdir
5
+ t = ["#{File.dirname(File.expand_path($0))}/../lib/#{MVCgen::NAME}",
6
+ "#{Gem.dir}/gems/#{MVCgen::NAME}-#{MVCgen::VERSION}/lib/#{MVCgen::NAME}"]
7
+ t.each {|i| return i if File.readable?(i) }
8
+ raise "both paths are invalid: #{t}"
9
+ end
10
+
11
+ # Returns the directories inside a given one
12
+ def self.directories_in(directory)
13
+ expanded_dir = File.expand_path(directory)
14
+ return Dir.glob(File.join(expanded_dir,'*')).select {|f| File.directory? f}
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,51 @@
1
+ module MVCgen
2
+ # File manager class
3
+ class FileManager
4
+
5
+ # Returns if the template is valid by the MVC generator
6
+ def self.is_template_valid(template)
7
+ return MVCgen::TemplateManager.templates.include? template
8
+ end
9
+
10
+ # Returns if the language is valid by the MVC generator
11
+ def self.is_language_valid(language)
12
+ return (MVCgen::Generator::LANGUAGES).include? language
13
+ end
14
+
15
+ # Return the path if valid template and language
16
+ # @return String with valid path
17
+ def self.path_from(template, language)
18
+ return nil if !is_language_valid(language) || !is_template_valid(template)
19
+ return File.join(MVCgen::TemplateManager.templates_dir, template, language)
20
+ end
21
+
22
+ # Returns an array with files in a given path
23
+ # @return Array with the files in a given path
24
+ def self.files_in_path(path)
25
+ return Dir[File.join("#{path}","/**/*")].select {|f| File.file?(f)}
26
+ end
27
+
28
+ # Returns the destination mvc path
29
+ # @return Destination root path
30
+ def self.destination_mvc_path(path, name)
31
+ expand_path = File.expand_path(path)
32
+ return File.join(expand_path,name)
33
+ end
34
+
35
+ # Copy a system item to another place
36
+ def self.copy(from, to)
37
+ to_expand_path = File.expand_path(to)
38
+ from_expand_path = File.expand_path(from)
39
+ FileUtils.mkdir_p (to_expand_path)
40
+ FileUtils.copy_entry(from_expand_path, to_expand_path)
41
+ end
42
+
43
+ # Move a system item to another place
44
+ def self.move(from, to)
45
+ to_expand_path = File.expand_path(to)
46
+ from_expand_path = File.expand_path(from)
47
+ FileUtils.move(from_expand_path, to_expand_path)
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,58 @@
1
+ module MVCgen
2
+ # Cosntants
3
+ class Generator
4
+ # Constants
5
+ LANGUAGES = ["swift"]
6
+ REPLACEMENT_KEY = "MVC"
7
+
8
+ # Main method that generate the MVC files structure
9
+ def self.generate_mvc(template, language, name, path)
10
+ puts "Generating MVC-Module"
11
+ puts "Template: #{template}"
12
+ puts "Language: #{language}"
13
+ puts "Name: #{name}"
14
+ puts "Path: #{path}"
15
+ path_from = MVCgen::FileManager.path_from(template, language)
16
+ path_to = MVCgen::FileManager.destination_mvc_path(path, name)
17
+ MVCgen::FileManager.copy(path_from, path_to)
18
+ files = MVCgen::FileManager.files_in_path(path_to)
19
+ rename_files(files,name)
20
+ end
21
+
22
+ # Rename all the files in the files array
23
+ # - It renames the name of the file
24
+ # - It renames the content of the file
25
+ def self.rename_files(files, name)
26
+ files.each do |file|
27
+ raise SyntaxError unless file.include? (MVCgen::Generator::REPLACEMENT_KEY)
28
+ rename_file(file, name)
29
+ end
30
+ end
31
+
32
+ # Rename a given file
33
+ # - It renames the name of the file
34
+ # - It renames the content of the file
35
+ def self.rename_file(file, name)
36
+ new_path = file.gsub((MVCgen::Generator::REPLACEMENT_KEY), name)
37
+ MVCgen::FileManager.move(file, new_path)
38
+ rename_file_content(new_path, name)
39
+ end
40
+
41
+ # Rename the file content
42
+ # @return: An String with the every MVC replaced by 'name'
43
+ def self.rename_file_content(filename, name)
44
+ # Reading content
45
+ file = File.open(filename, "rb")
46
+ content = file.read
47
+ file.close
48
+
49
+ # Replacing content
50
+ content = content.gsub((MVCgen::Generator::REPLACEMENT_KEY), name)
51
+
52
+ # Saving content with replaced string
53
+ File.open(filename, "w+") do |file|
54
+ file.write(content)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,19 @@
1
+ require 'thor'
2
+ require 'mvcgen'
3
+
4
+ module MVCgen
5
+ class MVCThor < Thor
6
+ desc "generate", "Generate a MVC module"
7
+ option :language, :required => false, :default => 'swift', :type => :string, :desc => "The language of the generated module (swift, objc)"
8
+ option :template, :required => false, :default => 'default', :type => :string , :desc => "Template for the generation"
9
+ option :path, :required => true, :type => :string , :desc => "Path where the output module is going to be saved"
10
+ def generate(name)
11
+ MVCgen::Generator.generate_mvc(options[:template], options[:language], name, options[:path])
12
+ end
13
+
14
+ desc "templates", "Get a list of available templates"
15
+ def templates()
16
+ puts MVCgen::TemplateManager.templates_description()
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,53 @@
1
+ require 'yaml'
2
+ module MVCgen
3
+ class TemplateManager
4
+
5
+ # Returns the templates dir
6
+ def self.templates_dir
7
+ t = "#{Gem.dir}/gems/#{MVCgen::NAME}-#{MVCgen::VERSION}/lib/templates"
8
+ end
9
+
10
+ # Get the available templates paths
11
+ # @return Array[String] with available templates paths
12
+ def self.templates_paths()
13
+ template_dir = MVCgen::TemplateManager.templates_dir
14
+ return MVCgen::DirUtils.directories_in(template_dir)
15
+ end
16
+
17
+ # Get the templates names
18
+ # @return Array[String] with templates names (got from the folder)
19
+ def self.templates()
20
+ templates_paths.map{|template_path| template_name_from_path(template_path)}
21
+ end
22
+
23
+ # Returns the template name from a given template_path
24
+ # @return String with the template name
25
+ def self.template_name_from_path(template_path)
26
+ return template_path.split("/").last
27
+ end
28
+
29
+ # Returns the description of all the templates available
30
+ # @return String with the entire description
31
+ def self.templates_description()
32
+ description = "\nAvailable templates \n"
33
+ description += "------------------- \n"
34
+ self.templates_paths.each do |template_path|
35
+ description += "> #{template_description(template_path)} \n"
36
+ end
37
+ return description
38
+ end
39
+
40
+ # Returns the description of a given template
41
+ # @param template String with the template path whose description is going to be returned
42
+ # @return String with the template description
43
+ def self.template_description(template_path)
44
+ template_description = ""
45
+
46
+ # Reading yaml
47
+ template_content = YAML.load_file(File.join(template_path,'mvcspec.yml'))
48
+
49
+ # Generating string
50
+ template_description+= "| #{template_name_from_path(template_path)} by #{template_content["author"]} |: #{template_content["template_description"]}"
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,4 @@
1
+ module MVCgen
2
+ NAME = "mvcgen"
3
+ VERSION = "0.1.2"
4
+ end
@@ -0,0 +1,4 @@
1
+ author: daniel
2
+ author_email: daniel.martinezcg@gmail.com
3
+ template_description: Default template with the simplest structure using MVC
4
+ updated_at: 2018-07-23
@@ -0,0 +1,15 @@
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
+
9
+
10
+ @interface VIPERDataManager : NSObject <VIPERDataManagerInputProtocol>
11
+
12
+ // Properties
13
+ @property (nonatomic, weak) id <VIPERDataManagerOutputProtocol> interactor;
14
+
15
+ @end
@@ -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 "VIPERDataManager.h"
7
+
8
+
9
+ @implementation VIPERDataManager
10
+
11
+ @end
@@ -0,0 +1,16 @@
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
+
9
+
10
+ @interface VIPERInteractor : NSObject <VIPERInteractorInputProtocol, VIPERDataManagerOutputProtocol>
11
+
12
+ // Properties
13
+ @property (nonatomic, weak) id <VIPERInteractorOutputProtocol> presenter;
14
+ @property (nonatomic, strong) id <VIPERDataManagerInputProtocol> dataManager;
15
+
16
+ @end
@@ -0,0 +1,10 @@
1
+ //
2
+ // Created by Pedro Piñera Buendía on 2014.
3
+ // Copyright (c) 2014 Redbooth. All rights reserved.
4
+ //
5
+
6
+ #import "VIPERInteractor.h"
7
+
8
+ @implementation VIPERInteractor
9
+
10
+ @end
@@ -0,0 +1,18 @@
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
+
9
+ @class VIPERWireFrame;
10
+
11
+ @interface VIPERPresenter : NSObject <VIPERPresenterProtocol, VIPERInteractorOutputProtocol>
12
+
13
+ // Properties
14
+ @property (nonatomic, weak) id <VIPERViewProtocol> view;
15
+ @property (nonatomic, strong) id <VIPERInteractorInputProtocol> interactor;
16
+ @property (nonatomic, strong) VIPERWireFrame *wireFrame;
17
+
18
+ @end