viperaptor 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.codeclimate.yml +10 -0
- data/.gitignore +8 -0
- data/.rspec +2 -0
- data/.travis.yml +16 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +64 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/bin/viperaptor +8 -0
- data/lib/viperaptor/cli/cli.rb +16 -0
- data/lib/viperaptor/cli/gen_command.rb +132 -0
- data/lib/viperaptor/cli/setup_command.rb +122 -0
- data/lib/viperaptor/cli/setup_username_command.rb +21 -0
- data/lib/viperaptor/cli/template/template_create_command.rb +40 -0
- data/lib/viperaptor/cli/template/template_group.rb +14 -0
- data/lib/viperaptor/cli/template/template_install_command.rb +21 -0
- data/lib/viperaptor/cli/template/template_list_command.rb +16 -0
- data/lib/viperaptor/cli/template/template_search_command.rb +30 -0
- data/lib/viperaptor/cli/thor_extension.rb +47 -0
- data/lib/viperaptor/cli/version_command.rb +25 -0
- data/lib/viperaptor/code_generation/Rambafile.liquid +54 -0
- data/lib/viperaptor/code_generation/code_module.rb +104 -0
- data/lib/viperaptor/code_generation/content_generator.rb +43 -0
- data/lib/viperaptor/code_generation/module_template.rb +28 -0
- data/lib/viperaptor/code_generation/rambafile_generator.rb +23 -0
- data/lib/viperaptor/configuration/user_preferences.rb +87 -0
- data/lib/viperaptor/constants/constants.rb +13 -0
- data/lib/viperaptor/constants/rambafile_constants.rb +34 -0
- data/lib/viperaptor/constants/rambaspec_constants.rb +18 -0
- data/lib/viperaptor/constants/user_preferences_constants.rb +7 -0
- data/lib/viperaptor/helpers/dependency_checker.rb +54 -0
- data/lib/viperaptor/helpers/gen_command_table_parameters_formatter.rb +33 -0
- data/lib/viperaptor/helpers/module_info_generator.rb +33 -0
- data/lib/viperaptor/helpers/module_validator.rb +85 -0
- data/lib/viperaptor/helpers/print_table.rb +17 -0
- data/lib/viperaptor/helpers/rambafile.rb +75 -0
- data/lib/viperaptor/helpers/template_helper.rb +76 -0
- data/lib/viperaptor/helpers/xcodeproj_helper.rb +256 -0
- data/lib/viperaptor/module_generator.rb +104 -0
- data/lib/viperaptor/template/creator/new_template/Code/Service/service.h.liquid +11 -0
- data/lib/viperaptor/template/creator/new_template/Code/Service/service.m.liquid +13 -0
- data/lib/viperaptor/template/creator/new_template/Tests/Service/service_tests.m.liquid +35 -0
- data/lib/viperaptor/template/creator/new_template/template.rambaspec.liquid +20 -0
- data/lib/viperaptor/template/creator/template_creator.rb +39 -0
- data/lib/viperaptor/template/helpers/catalog_downloader.rb +107 -0
- data/lib/viperaptor/template/helpers/catalog_template_list_helper.rb +55 -0
- data/lib/viperaptor/template/helpers/catalog_template_search_helper.rb +27 -0
- data/lib/viperaptor/template/helpers/catalog_terminator.rb +21 -0
- data/lib/viperaptor/template/helpers/rambaspec_validator.rb +52 -0
- data/lib/viperaptor/template/installer/abstract_installer.rb +9 -0
- data/lib/viperaptor/template/installer/catalog_installer.rb +78 -0
- data/lib/viperaptor/template/installer/local_installer.rb +32 -0
- data/lib/viperaptor/template/installer/remote_installer.rb +51 -0
- data/lib/viperaptor/template/installer/template_installer_factory.rb +22 -0
- data/lib/viperaptor/template/processor/template_declaration.rb +36 -0
- data/lib/viperaptor/template/processor/template_processor.rb +73 -0
- data/lib/viperaptor/tools/string-colorize.rb +23 -0
- data/lib/viperaptor/version.rb +5 -0
- data/lib/viperaptor.rb +16 -0
- data/viperaptor.gemspec +36 -0
- metadata +274 -0
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'git'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Viperaptor
|
5
|
+
|
6
|
+
# Provides the functionality to download template catalogs from the remote repository
|
7
|
+
class CatalogDownloader
|
8
|
+
|
9
|
+
def external_catalogs_filepaths
|
10
|
+
|
11
|
+
catalogs_path = Pathname.new(ENV['HOME'])
|
12
|
+
.join(APP_HOME_DIR)
|
13
|
+
.join(CATALOGS_DIR)
|
14
|
+
|
15
|
+
return [] unless catalogs_path.exist?
|
16
|
+
|
17
|
+
catalogs_path.children.select { |child|
|
18
|
+
child.directory? && child.split.last.to_s[0] != '.'
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
# Updates all of the template catalogs and returns their filepaths.
|
23
|
+
# If there is a Rambafile in the current directory, it also updates all of the catalogs specified there.
|
24
|
+
#
|
25
|
+
# @return [Array] An array of filepaths to downloaded catalogs
|
26
|
+
def update_all_catalogs_and_return_filepaths(throttled = false)
|
27
|
+
does_rambafile_exist = Rambafile.exist
|
28
|
+
|
29
|
+
if does_rambafile_exist
|
30
|
+
rambafile = Rambafile.rambafile
|
31
|
+
catalogs = rambafile[CATALOGS_KEY]
|
32
|
+
end
|
33
|
+
|
34
|
+
# terminator = CatalogTerminator.new
|
35
|
+
# terminator.remove_all_catalogs
|
36
|
+
|
37
|
+
repos = (Viperaptor::UserPreferences.obtain_custom_catalogs_repos || []) + PREDEFINED_CATALOG_REPOS
|
38
|
+
|
39
|
+
catalog_paths = repos.map do |repo|
|
40
|
+
name = repo.split('/').last
|
41
|
+
|
42
|
+
catalogs_local_path = Pathname.new(ENV['HOME'])
|
43
|
+
.join(APP_HOME_DIR)
|
44
|
+
.join(CATALOGS_DIR)
|
45
|
+
current_catalog_path = catalogs_local_path
|
46
|
+
.join(name)
|
47
|
+
|
48
|
+
if !current_catalog_path.exist? || !throttled || (Time.now - current_catalog_path.mtime) > 3600.0 * 12.0
|
49
|
+
download_catalog(name, repo)
|
50
|
+
end
|
51
|
+
|
52
|
+
current_catalog_path
|
53
|
+
end
|
54
|
+
|
55
|
+
if catalogs != nil && catalogs.count > 0
|
56
|
+
catalogs.each do |catalog_url|
|
57
|
+
|
58
|
+
name = catalog_url.split('://').last
|
59
|
+
name = name.gsub('/', '-');
|
60
|
+
|
61
|
+
catalogs_local_path = Pathname.new(ENV['HOME'])
|
62
|
+
.join(APP_HOME_DIR)
|
63
|
+
.join(CATALOGS_DIR)
|
64
|
+
current_catalog_path = catalogs_local_path
|
65
|
+
.join(name)
|
66
|
+
|
67
|
+
if !current_catalog_path.exist? || !throttled || (Time.now - current_catalog_path.mtime) > 3600.0 * 12.0
|
68
|
+
download_catalog(name, catalog_url)
|
69
|
+
end
|
70
|
+
|
71
|
+
catalog_paths.push(current_catalog_path)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
return catalog_paths
|
75
|
+
end
|
76
|
+
|
77
|
+
# Clones a template catalog from a remote repository
|
78
|
+
#
|
79
|
+
# @param name [String] The name of the template catalog
|
80
|
+
# @param url [String] The url of the repository
|
81
|
+
#
|
82
|
+
# @return [Pathname] A filepath to the downloaded catalog
|
83
|
+
def download_catalog(name, url)
|
84
|
+
|
85
|
+
catalogs_local_path = Pathname.new(ENV['HOME'])
|
86
|
+
.join(APP_HOME_DIR)
|
87
|
+
.join(CATALOGS_DIR)
|
88
|
+
current_catalog_path = catalogs_local_path
|
89
|
+
.join(name)
|
90
|
+
|
91
|
+
puts("Updating #{name} specs (#{url})...")
|
92
|
+
|
93
|
+
git_dir = current_catalog_path.join('.git')
|
94
|
+
|
95
|
+
if File.directory?(git_dir)
|
96
|
+
g = Git.open(current_catalog_path)
|
97
|
+
g.pull
|
98
|
+
FileUtils.touch current_catalog_path
|
99
|
+
else
|
100
|
+
FileUtils.rm_rf current_catalog_path
|
101
|
+
Git.clone(url, name, :path => catalogs_local_path)
|
102
|
+
end
|
103
|
+
|
104
|
+
return current_catalog_path
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Viperaptor
|
2
|
+
|
3
|
+
# Provides the functionality to list all of the templates, available in the catalog
|
4
|
+
class CatalogTemplateListHelper
|
5
|
+
|
6
|
+
# Finds out all of the templates located in a catalog
|
7
|
+
#
|
8
|
+
# @param catalog_path [Pathname] The path to a template catalog
|
9
|
+
#
|
10
|
+
# @return [Array] An array with template names
|
11
|
+
def obtain_all_templates_from_a_catalog(catalog_path)
|
12
|
+
|
13
|
+
return [] unless catalog_path.exist?
|
14
|
+
|
15
|
+
contains_specs = catalog_path.children.count { |c|
|
16
|
+
c.extname == RAMBASPEC_EXTENSION
|
17
|
+
} > 0
|
18
|
+
|
19
|
+
skip_testable = ENV['RACK_ENV'] != 'test'
|
20
|
+
|
21
|
+
if contains_specs
|
22
|
+
|
23
|
+
if !skip_testable || catalog_path.split.last.to_s.start_with?("test-")
|
24
|
+
return []
|
25
|
+
end
|
26
|
+
|
27
|
+
return catalog_path.children
|
28
|
+
.map { |child| child.split.last.to_s }
|
29
|
+
.select { |i| /^[a-z0-9_]+\.rambaspec$/.match(i) }
|
30
|
+
.map { |i| i.gsub RAMBASPEC_EXTENSION, '' }
|
31
|
+
else
|
32
|
+
return catalog_path.children
|
33
|
+
.select {|child| child.directory? && child.split.last.to_s[0] != '.' }
|
34
|
+
.select {|child| !skip_testable || !child.split.last.to_s.start_with?("test-") }
|
35
|
+
.select {|child|
|
36
|
+
child.join(child.split.last.to_s.gsub('/','') + RAMBASPEC_EXTENSION).exist? }
|
37
|
+
.map { |child| child.split.last.to_s }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def template_path(catalog_path, template_name)
|
42
|
+
contains_specs = catalog_path.children.count { |c|
|
43
|
+
c.extname == RAMBASPEC_EXTENSION
|
44
|
+
} > 0
|
45
|
+
|
46
|
+
if contains_specs
|
47
|
+
return catalog_path
|
48
|
+
else
|
49
|
+
return catalog_path.join(template_name)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Viperaptor
|
2
|
+
|
3
|
+
# Provides the functionality to search templates, in catalogs
|
4
|
+
class CatalogTemplateSearchHelper
|
5
|
+
|
6
|
+
# Finds out all of the templates located in a catalog
|
7
|
+
#
|
8
|
+
# @param catalog_path [Pathname] The path to a template catalog
|
9
|
+
#
|
10
|
+
# @return [Array] An array with template names
|
11
|
+
def search_templates_in_a_catalog(catalog_path, search_term)
|
12
|
+
template_names = []
|
13
|
+
|
14
|
+
catalog_path.children.select { |child|
|
15
|
+
File.directory?(child) && child.split.last.to_s[0] != '.'
|
16
|
+
}.map { |template_path|
|
17
|
+
template_path.split.last.to_s
|
18
|
+
}.select { |template_name|
|
19
|
+
template_name.include?(search_term)
|
20
|
+
}.each { |template_name|
|
21
|
+
template_names.push(template_name)
|
22
|
+
}
|
23
|
+
|
24
|
+
return template_names
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Viperaptor
|
2
|
+
|
3
|
+
# Provides a functionality to terminate all previously installed catalogs
|
4
|
+
#
|
5
|
+
# @return [Void]
|
6
|
+
class CatalogTerminator
|
7
|
+
def remove_all_catalogs
|
8
|
+
catalogs_path = Pathname.new(ENV['HOME'])
|
9
|
+
.join(APP_HOME_DIR)
|
10
|
+
.join(CATALOGS_DIR)
|
11
|
+
if Dir.exist?(catalogs_path) == false
|
12
|
+
FileUtils.mkdir_p catalogs_path
|
13
|
+
end
|
14
|
+
catalogs_path.children.select { |child|
|
15
|
+
child.directory? && child.split.last.to_s[0] != '.'
|
16
|
+
}.each { |catalog_path|
|
17
|
+
FileUtils.rm_rf(catalog_path)
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Viperaptor
|
2
|
+
|
3
|
+
# Provides methods that validate .rambaspec file existance and structure
|
4
|
+
class RambaspecValidator
|
5
|
+
|
6
|
+
# Validates the existance of a .rambaspec file for a given template
|
7
|
+
#
|
8
|
+
# @param template_name [String] The name of the template
|
9
|
+
# @param template_path [String] The local filepath to the template
|
10
|
+
#
|
11
|
+
# @return [Bool]
|
12
|
+
def self.validate_spec_existance(template_name, template_path)
|
13
|
+
local_spec_path = self.obtain_spec_path(template_name, template_path)
|
14
|
+
File.file?(local_spec_path)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Validates the structure of a .rambaspec file for a given template
|
18
|
+
#
|
19
|
+
# @param template_name [String] The name of the template
|
20
|
+
# @param template_path [String] The local filepath to the template
|
21
|
+
#
|
22
|
+
# @return [Bool]
|
23
|
+
def self.validate_spec(template_name, template_path)
|
24
|
+
spec_path = self.obtain_spec_path(template_name, template_path)
|
25
|
+
|
26
|
+
spec_source = IO.read(spec_path)
|
27
|
+
spec_template = Liquid::Template.parse(spec_source)
|
28
|
+
spec_content = spec_template.render
|
29
|
+
spec = YAML.load(spec_content)
|
30
|
+
|
31
|
+
is_spec_valid =
|
32
|
+
spec[TEMPLATE_NAME_KEY] != nil &&
|
33
|
+
spec[TEMPLATE_AUTHOR_KEY] != nil &&
|
34
|
+
spec[TEMPLATE_VERSION_KEY] != nil &&
|
35
|
+
(spec[TEMPLATE_CODE_FILES_KEY] != nil || spec[TEMPLATE_TEST_FILES_KEY] != nil)
|
36
|
+
return is_spec_valid
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# Returns a filepath for a given .rambaspec filename
|
42
|
+
#
|
43
|
+
# @param template_name [String] The name of the template
|
44
|
+
# @param template_path [String] The local filepath to the template
|
45
|
+
#
|
46
|
+
# @return [Bool]
|
47
|
+
def self.obtain_spec_path(template_name, template_path)
|
48
|
+
spec_filename = template_name + RAMBASPEC_EXTENSION
|
49
|
+
Pathname.new(template_path).join(spec_filename)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'viperaptor/template/installer/abstract_installer.rb'
|
2
|
+
require 'viperaptor/template/helpers/rambaspec_validator.rb'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tmpdir'
|
5
|
+
|
6
|
+
module Viperaptor
|
7
|
+
|
8
|
+
# Incapsulates the logic of installing Viperaptor templates from the template catalog
|
9
|
+
class CatalogInstaller < AbstractInstaller
|
10
|
+
def install_template(template_declaration)
|
11
|
+
template_name = template_declaration.name
|
12
|
+
puts("Installing #{template_name}...")
|
13
|
+
|
14
|
+
template_name = template_declaration.name
|
15
|
+
catalogs_path = Pathname.new(ENV['HOME'])
|
16
|
+
.join(APP_HOME_DIR)
|
17
|
+
.join(CATALOGS_DIR)
|
18
|
+
|
19
|
+
catalog_path = catalogs_path.children.select { |child|
|
20
|
+
child.directory? && child.split.last.to_s[0] != '.'
|
21
|
+
}.select { |catalog_path|
|
22
|
+
template_path = browse_catalog_for_a_template(catalog_path, template_name)
|
23
|
+
template_path != nil
|
24
|
+
}.first
|
25
|
+
|
26
|
+
if catalog_path == nil
|
27
|
+
error_description = "Cannot find #{template_name} in any catalog. Try another name.".red
|
28
|
+
puts(error_description)
|
29
|
+
return
|
30
|
+
end
|
31
|
+
|
32
|
+
template_path = catalog_path.join(template_name)
|
33
|
+
rambaspec_exist = Viperaptor::RambaspecValidator.validate_spec_existance(template_name, template_path)
|
34
|
+
unless rambaspec_exist
|
35
|
+
error_description = "Cannot find #{template_name + RAMBASPEC_EXTENSION} in the template catalog #{catalog_path}. Try another name.".red
|
36
|
+
puts(error_description)
|
37
|
+
return
|
38
|
+
end
|
39
|
+
|
40
|
+
rambaspec_valid = Viperaptor::RambaspecValidator.validate_spec(template_name, template_path)
|
41
|
+
unless rambaspec_valid
|
42
|
+
error_description = "#{template_name + RAMBASPEC_EXTENSION} is not valid.".red
|
43
|
+
puts(error_description)
|
44
|
+
return
|
45
|
+
end
|
46
|
+
|
47
|
+
install_path = Pathname.new(Rambafile.suffix(TEMPLATES_FOLDER))
|
48
|
+
.join(template_name)
|
49
|
+
FileUtils.mkdir_p install_path
|
50
|
+
|
51
|
+
src = template_path.to_s + '/.'
|
52
|
+
FileUtils.cp_r(src, install_path)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
# Browses a given catalog and returns a template path
|
58
|
+
#
|
59
|
+
# @param catalog_path [Pathname] A path to a catalog
|
60
|
+
# @param template_name [String] A name of the template
|
61
|
+
#
|
62
|
+
# @return [Pathname] A path to a template, if found
|
63
|
+
def browse_catalog_for_a_template(catalog_path, template_name)
|
64
|
+
template_path_as_folder = catalog_path.join(template_name)
|
65
|
+
template_path_as_spec = catalog_path.join(template_name + RAMBASPEC_EXTENSION)
|
66
|
+
|
67
|
+
if File.exist?(template_path_as_spec)
|
68
|
+
return catalog_path
|
69
|
+
end
|
70
|
+
|
71
|
+
if Dir.exist?(template_path_as_folder)
|
72
|
+
return template_path_as_folder
|
73
|
+
end
|
74
|
+
|
75
|
+
return nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'viperaptor/template/installer/abstract_installer.rb'
|
2
|
+
require 'viperaptor/template/helpers/rambaspec_validator.rb'
|
3
|
+
|
4
|
+
module Viperaptor
|
5
|
+
|
6
|
+
# Incapsulates the logic of verifying and installing local templates
|
7
|
+
class LocalInstaller < AbstractInstaller
|
8
|
+
def install_template(template_declaration)
|
9
|
+
template_name = template_declaration.name
|
10
|
+
puts("Installing #{template_name}...")
|
11
|
+
|
12
|
+
local_path = template_declaration.local
|
13
|
+
rambaspec_exist = Viperaptor::RambaspecValidator.validate_spec_existance(template_name, local_path)
|
14
|
+
|
15
|
+
unless rambaspec_exist
|
16
|
+
error_description = "Cannot find #{template_name + RAMBASPEC_EXTENSION} in the specified directory. Try another path or name.".red
|
17
|
+
raise StandardError.new(error_description)
|
18
|
+
end
|
19
|
+
|
20
|
+
rambaspec_valid = Viperaptor::RambaspecValidator.validate_spec(template_name, local_path)
|
21
|
+
unless rambaspec_valid
|
22
|
+
error_description = "#{template_name + RAMBASPEC_EXTENSION} is not valid.".red
|
23
|
+
raise StandardError.new(error_description)
|
24
|
+
end
|
25
|
+
|
26
|
+
install_path = Pathname.new(Rambafile.suffix(TEMPLATES_FOLDER))
|
27
|
+
.join(template_name)
|
28
|
+
FileUtils.mkdir_p install_path
|
29
|
+
FileUtils.copy_entry(local_path, install_path)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'viperaptor/template/installer/abstract_installer.rb'
|
2
|
+
require 'viperaptor/template/helpers/rambaspec_validator.rb'
|
3
|
+
require 'git'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'tmpdir'
|
6
|
+
|
7
|
+
module Viperaptor
|
8
|
+
|
9
|
+
# Incapsulates the logic of fetching remote templates, verifying and installing them
|
10
|
+
class RemoteInstaller < AbstractInstaller
|
11
|
+
def install_template(template_declaration)
|
12
|
+
template_name = template_declaration.name
|
13
|
+
puts("Installing #{template_name}...")
|
14
|
+
|
15
|
+
repo_url = template_declaration.git
|
16
|
+
repo_branch = template_declaration.branch
|
17
|
+
|
18
|
+
Dir.mktmpdir do |temp_path|
|
19
|
+
template_dir = Pathname.new(temp_path).join(template_name)
|
20
|
+
|
21
|
+
if repo_branch != nil
|
22
|
+
Git.export(repo_url, template_name, :branch => repo_branch, :path => temp_path)
|
23
|
+
else
|
24
|
+
Git.clone(repo_url, template_name, :path => temp_path)
|
25
|
+
end
|
26
|
+
|
27
|
+
template_path = "#{template_dir}"
|
28
|
+
|
29
|
+
rambaspec_exist = Viperaptor::RambaspecValidator.validate_spec_existance(template_name, template_path)
|
30
|
+
unless rambaspec_exist
|
31
|
+
FileUtils.rm_rf(temp_path)
|
32
|
+
error_description = "Cannot find #{template_name + RAMBASPEC_EXTENSION} in the root directory of specified repository.".red
|
33
|
+
raise StandardError.new(error_description)
|
34
|
+
end
|
35
|
+
|
36
|
+
rambaspec_valid = Viperaptor::RambaspecValidator.validate_spec(template_name, template_path)
|
37
|
+
unless rambaspec_valid
|
38
|
+
error_description = "#{template_name + RAMBASPEC_EXTENSION} is not valid.".red
|
39
|
+
raise StandardError.new(error_description)
|
40
|
+
end
|
41
|
+
|
42
|
+
install_path = Pathname.new(Rambafile.suffix(TEMPLATES_FOLDER))
|
43
|
+
.join(template_name)
|
44
|
+
FileUtils.mkdir_p install_path
|
45
|
+
FileUtils.copy_entry(template_path, install_path)
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'viperaptor/template/processor/template_declaration'
|
2
|
+
|
3
|
+
module Viperaptor
|
4
|
+
|
5
|
+
# Factory that creates a proper installer for a given template type
|
6
|
+
class TemplateInstallerFactory
|
7
|
+
|
8
|
+
# Provides the appropriate strategy for a given template type
|
9
|
+
def installer_for_type(type)
|
10
|
+
case type
|
11
|
+
when TemplateDeclarationType::LOCAL_TEMPLATE
|
12
|
+
return Viperaptor::LocalInstaller.new
|
13
|
+
when TemplateDeclarationType::REMOTE_TEMPLATE
|
14
|
+
return Viperaptor::RemoteInstaller.new
|
15
|
+
when TemplateDeclarationType::CATALOG_TEMPLATE
|
16
|
+
return Viperaptor::CatalogInstaller.new
|
17
|
+
else
|
18
|
+
return nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Viperaptor
|
2
|
+
|
3
|
+
# This class acts as an Enumeration for TemplateDeclaration types
|
4
|
+
class TemplateDeclarationType
|
5
|
+
# A local template - usually it's stored somewhere outside the current project directory
|
6
|
+
LOCAL_TEMPLATE = 0
|
7
|
+
|
8
|
+
# A remote template - it's stored in a remote Git repository
|
9
|
+
REMOTE_TEMPLATE = 1
|
10
|
+
|
11
|
+
# A template from our shared catalog
|
12
|
+
CATALOG_TEMPLATE = 2
|
13
|
+
end
|
14
|
+
|
15
|
+
# Describes a Viperaptor template declaration model
|
16
|
+
class TemplateDeclaration
|
17
|
+
|
18
|
+
attr_reader :name, :local, :git, :branch, :type
|
19
|
+
|
20
|
+
def initialize(template_hash)
|
21
|
+
@name = template_hash[TEMPLATE_DECLARATION_NAME_KEY]
|
22
|
+
@local = template_hash[TEMPLATE_DECLARATION_LOCAL_KEY]
|
23
|
+
@git = template_hash[TEMPLATE_DECLARATION_GIT_KEY]
|
24
|
+
@branch = template_hash[TEMPLATE_DECLARATION_BRANCH_KEY]
|
25
|
+
|
26
|
+
@type = TemplateDeclarationType::LOCAL_TEMPLATE if @local
|
27
|
+
@type = TemplateDeclarationType::REMOTE_TEMPLATE if @git
|
28
|
+
@type = TemplateDeclarationType::CATALOG_TEMPLATE if @git == nil && @local == nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def install(strategy)
|
32
|
+
strategy.install_template(self)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'viperaptor/template/processor/template_declaration.rb'
|
2
|
+
require 'viperaptor/template/installer/local_installer.rb'
|
3
|
+
require 'viperaptor/template/installer/remote_installer.rb'
|
4
|
+
require 'viperaptor/template/installer/catalog_installer.rb'
|
5
|
+
require 'viperaptor/template/helpers/catalog_downloader.rb'
|
6
|
+
require 'viperaptor/template/helpers/catalog_terminator'
|
7
|
+
require 'git'
|
8
|
+
|
9
|
+
module Viperaptor
|
10
|
+
|
11
|
+
# Incapsulates logic of processing templates declaration section from Rambafile
|
12
|
+
class TemplateProcessor
|
13
|
+
|
14
|
+
def initialize(catalog_downloader, installer_factory)
|
15
|
+
@catalog_downloader = catalog_downloader
|
16
|
+
@installer_factory = installer_factory
|
17
|
+
end
|
18
|
+
|
19
|
+
# This method parses Rambafile, serializes templates hashes into model objects and install them
|
20
|
+
def install_templates(rambafile)
|
21
|
+
# We always clear previously installed templates to avoid conflicts in different versions
|
22
|
+
clear_installed_templates
|
23
|
+
|
24
|
+
templates = rambafile[TEMPLATES_KEY] || []
|
25
|
+
|
26
|
+
# Mapping hashes to model objects
|
27
|
+
templates = templates.map { |template_hash|
|
28
|
+
Viperaptor::TemplateDeclaration.new(template_hash)
|
29
|
+
}
|
30
|
+
|
31
|
+
catalogs = rambafile[CATALOGS_KEY] || []
|
32
|
+
|
33
|
+
# If there is at least one template from catalogs, we should update our local copy of the catalog
|
34
|
+
update_catalogs_if_needed(catalogs, templates)
|
35
|
+
|
36
|
+
templates.each do |template_declaration|
|
37
|
+
strategy = @installer_factory.installer_for_type(template_declaration.type)
|
38
|
+
template_declaration.install(strategy)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
# Clears all of the currently installed templates
|
45
|
+
def clear_installed_templates
|
46
|
+
install_path = Pathname.new(Rambafile.suffix(TEMPLATES_FOLDER))
|
47
|
+
FileUtils.rm_rf(Dir.glob(install_path))
|
48
|
+
end
|
49
|
+
|
50
|
+
# Clones remote template catalogs to the local directory
|
51
|
+
def update_catalogs_if_needed(catalogs, templates)
|
52
|
+
needs_update = templates.any? {|template| template.type == TemplateDeclarationType::CATALOG_TEMPLATE}
|
53
|
+
|
54
|
+
return unless needs_update
|
55
|
+
|
56
|
+
terminator = CatalogTerminator.new
|
57
|
+
terminator.remove_all_catalogs
|
58
|
+
puts('Updating shared catalogs specs...')
|
59
|
+
|
60
|
+
catalogs.each do |catalog_url|
|
61
|
+
@catalog_downloader.download_catalog(catalog_url.split('/').last, catalog_url)
|
62
|
+
end
|
63
|
+
|
64
|
+
return unless catalogs != nil && catalogs.count > 0
|
65
|
+
|
66
|
+
catalogs.each do |catalog_url|
|
67
|
+
catalog_name = catalog_url.split('://').last
|
68
|
+
catalog_name = catalog_name.gsub('/', '-');
|
69
|
+
@catalog_downloader.download_catalog(catalog_name, catalog_url)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Adds a number of methods for colorizing output strings
|
2
|
+
class String
|
3
|
+
|
4
|
+
def colorize(color_code)
|
5
|
+
"\e[#{color_code}m#{self}\e[0m"
|
6
|
+
end
|
7
|
+
|
8
|
+
def red
|
9
|
+
colorize(31)
|
10
|
+
end
|
11
|
+
|
12
|
+
def green
|
13
|
+
colorize(32)
|
14
|
+
end
|
15
|
+
|
16
|
+
def yellow
|
17
|
+
colorize(33)
|
18
|
+
end
|
19
|
+
|
20
|
+
def blue
|
21
|
+
colorize(34)
|
22
|
+
end
|
23
|
+
end
|
data/lib/viperaptor.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
module Viperaptor
|
2
|
+
require 'viperaptor/constants/constants.rb'
|
3
|
+
require 'viperaptor/constants/rambafile_constants.rb'
|
4
|
+
require 'viperaptor/constants/rambaspec_constants.rb'
|
5
|
+
require 'viperaptor/cli/cli.rb'
|
6
|
+
require 'viperaptor/code_generation/code_module.rb'
|
7
|
+
require 'viperaptor/code_generation/module_template.rb'
|
8
|
+
require 'viperaptor/code_generation/content_generator.rb'
|
9
|
+
require 'viperaptor/code_generation/rambafile_generator.rb'
|
10
|
+
require 'viperaptor/module_generator.rb'
|
11
|
+
require 'viperaptor/template/processor/template_processor.rb'
|
12
|
+
require 'viperaptor/template/installer/template_installer_factory'
|
13
|
+
require 'viperaptor/configuration/user_preferences.rb'
|
14
|
+
require 'viperaptor/template/creator/template_creator.rb'
|
15
|
+
require 'viperaptor/tools/string-colorize.rb'
|
16
|
+
end
|
data/viperaptor.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'viperaptor/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'viperaptor'
|
8
|
+
spec.version = Viperaptor::VERSION
|
9
|
+
spec.authors = ['Siarhei Ladzeika']
|
10
|
+
spec.email = 'sergey.ladeiko@gmail.com'
|
11
|
+
|
12
|
+
spec.summary = 'Advanced code generator for Xcode projects with a nice and flexible template system.'
|
13
|
+
spec.description = 'New reincarnation of Rambler Generamba tool (original code got from Generamba)'
|
14
|
+
spec.homepage = 'https://github.com/ladeiko/Viperaptor'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.executables = ['viperaptor']
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.required_ruby_version = '>= 2.3'
|
22
|
+
|
23
|
+
spec.add_runtime_dependency 'thor', '1.0.1'
|
24
|
+
spec.add_runtime_dependency 'xcodeproj', '1.19.0'
|
25
|
+
spec.add_runtime_dependency 'liquid', '4.0.3'
|
26
|
+
spec.add_runtime_dependency 'git', '1.7.0'
|
27
|
+
spec.add_runtime_dependency 'cocoapods-core', '1.10.0'
|
28
|
+
spec.add_runtime_dependency 'terminal-table', '2.0.0'
|
29
|
+
spec.add_runtime_dependency 'tty-prompt', '~> 0.23.0'
|
30
|
+
|
31
|
+
spec.add_development_dependency 'bundler', '>= 1.16'
|
32
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
33
|
+
spec.add_development_dependency 'rspec', '~> 3.7'
|
34
|
+
spec.add_development_dependency 'fakefs', '~> 1.3'
|
35
|
+
spec.add_development_dependency 'activesupport', '~> 5.2'
|
36
|
+
end
|