ccios 4.1.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +187 -56
  5. data/ccios.gemspec +1 -1
  6. data/lib/ccios/argument_template_parameter.rb +33 -0
  7. data/lib/ccios/code_templater.rb +24 -8
  8. data/lib/ccios/config.rb +41 -91
  9. data/lib/ccios/file_creator.rb +24 -22
  10. data/lib/ccios/file_template_definition.rb +94 -0
  11. data/lib/ccios/flag_template_parameter.rb +17 -0
  12. data/lib/ccios/group_template_definition.rb +54 -0
  13. data/lib/ccios/pbxproj_parser.rb +3 -54
  14. data/lib/ccios/snippet_template_definition.rb +27 -0
  15. data/lib/ccios/template_definition.rb +116 -0
  16. data/lib/ccios/templates/Coordinator/template.yml +20 -0
  17. data/lib/ccios/templates/Interactor/template.yml +25 -0
  18. data/lib/ccios/templates/Presenter/template.yml +49 -0
  19. data/lib/ccios/templates/Repository/template.yml +26 -0
  20. data/lib/ccios/templates_loader.rb +31 -0
  21. data/lib/ccios.rb +65 -43
  22. data/templates_library/async/Coordinator/template.yml +20 -0
  23. data/templates_library/async/Presenter/template.yml +49 -0
  24. metadata +35 -32
  25. data/lib/ccios/coordinator_generator.rb +0 -18
  26. data/lib/ccios/interactor_generator.rb +0 -33
  27. data/lib/ccios/presenter_generator.rb +0 -71
  28. data/lib/ccios/repository_generator.rb +0 -44
  29. data/templates_library/async/interactor.mustache +0 -13
  30. data/templates_library/async/interactor_assembly.mustache +0 -5
  31. data/templates_library/async/interactor_implementation.mustache +0 -22
  32. data/templates_library/async/repository.mustache +0 -13
  33. data/templates_library/async/repository_assembly.mustache +0 -6
  34. data/templates_library/async/repository_implementation.mustache +0 -20
  35. /data/lib/ccios/templates/{coordinator.mustache → Coordinator/coordinator.mustache} +0 -0
  36. /data/lib/ccios/templates/{interactor.mustache → Interactor/interactor.mustache} +0 -0
  37. /data/lib/ccios/templates/{interactor_assembly.mustache → Interactor/interactor_assembly.mustache} +0 -0
  38. /data/lib/ccios/templates/{interactor_implementation.mustache → Interactor/interactor_implementation.mustache} +0 -0
  39. /data/lib/ccios/templates/{dependency_provider.mustache → Presenter/dependency_provider.mustache} +0 -0
  40. /data/lib/ccios/templates/{presenter.mustache → Presenter/presenter.mustache} +0 -0
  41. /data/lib/ccios/templates/{presenter_assembly.mustache → Presenter/presenter_assembly.mustache} +0 -0
  42. /data/lib/ccios/templates/{presenter_implementation.mustache → Presenter/presenter_implementation.mustache} +0 -0
  43. /data/lib/ccios/templates/{view_contract.mustache → Presenter/view_contract.mustache} +0 -0
  44. /data/lib/ccios/templates/{view_controller.mustache → Presenter/view_controller.mustache} +0 -0
  45. /data/lib/ccios/templates/{repository.mustache → Repository/repository.mustache} +0 -0
  46. /data/lib/ccios/templates/{repository_assembly.mustache → Repository/repository_assembly.mustache} +0 -0
  47. /data/lib/ccios/templates/{repository_implementation.mustache → Repository/repository_implementation.mustache} +0 -0
  48. /data/templates_library/async/{coordinator.mustache → Coordinator/coordinator.mustache} +0 -0
  49. /data/templates_library/async/{dependency_provider.mustache → Presenter/dependency_provider.mustache} +0 -0
  50. /data/templates_library/async/{presenter.mustache → Presenter/presenter.mustache} +0 -0
  51. /data/templates_library/async/{presenter_assembly.mustache → Presenter/presenter_assembly.mustache} +0 -0
  52. /data/templates_library/async/{presenter_implementation.mustache → Presenter/presenter_implementation.mustache} +0 -0
  53. /data/templates_library/async/{view_contract.mustache → Presenter/view_contract.mustache} +0 -0
  54. /data/templates_library/async/{view_controller.mustache → Presenter/view_controller.mustache} +0 -0
@@ -1,6 +1,7 @@
1
1
  require_relative 'code_templater'
2
2
  require 'fileutils'
3
3
  require 'logger'
4
+ require 'xcodeproj'
4
5
 
5
6
  class Xcodeproj::Project::Object::PBXGroup
6
7
 
@@ -24,40 +25,51 @@ class FileCreator
24
25
  FileCreator.logger
25
26
  end
26
27
 
27
- def initialize(options = {}, config)
28
- @options = options
29
- @config = config
30
- end
31
-
32
28
  def templater_options(target)
33
29
  defaults = {
34
30
  project_name: target.display_name,
35
31
  full_username: git_username,
36
32
  date: DateTime.now.strftime("%d/%m/%Y"),
37
33
  }
38
- defaults.merge(@options)
34
+ defaults
39
35
  end
40
36
 
41
37
  def git_username
42
38
  `git config user.name`.strip
43
39
  end
44
40
 
45
- def create_file(prefix, suffix, group, target)
46
- file_path = File.join(group.real_path, prefix + suffix + '.swift')
41
+ def get_unknown_template_tags_for(template_path)
42
+ tags = CodeTemplater.new.get_unknown_context_keys_for_template(template_path)
43
+ tags.subtract(Set["project_name", "full_username", "date"])
44
+ tags
45
+ end
46
+
47
+ def create_file_using_template_path(template_path, generated_filename, group, targets, context)
48
+ file_path = File.join(group.real_path, generated_filename)
47
49
 
48
50
  raise "File #{file_path} already exists" if File.exist?(file_path)
49
51
  dirname = File.dirname(file_path)
50
52
  FileUtils.mkdir_p dirname unless File.directory?(dirname)
51
53
  file = File.new(file_path, 'w')
52
54
 
53
- templater_options = templater_options(target)
54
- code_templater = CodeTemplater.new(templater_options, @config.templates.path)
55
- file_content = code_templater.content_for_suffix(prefix, suffix)
55
+ context = context.merge(templater_options(targets[0]))
56
+ file_content = CodeTemplater.new.render_file_content_from_template(template_path, generated_filename, context)
57
+
56
58
  file.puts(file_content)
57
59
 
58
60
  file.close
59
61
  file_ref = group.new_reference(file_path)
60
- target.add_file_references([file_ref])
62
+ targets.each do |target|
63
+ target.add_file_references([file_ref])
64
+ end
65
+ end
66
+
67
+ def print_file_content_using_template(filename, template_path, context)
68
+ file_content = CodeTemplater.new.render_file_content_from_template(template_path, filename, context)
69
+ Mustache.render(File.read(template_path), context)
70
+
71
+ logger.info "Add this snippet to #{filename}"
72
+ logger.info file_content
61
73
  end
62
74
 
63
75
  def create_empty_directory(group)
@@ -68,16 +80,6 @@ class FileCreator
68
80
  FileUtils.touch(git_keep_path) if Dir.empty?(dirname)
69
81
  end
70
82
 
71
- def print_file_content(prefix, suffix)
72
- file_name = suffix + '.swift'
73
-
74
- code_templater = CodeTemplater.new(@options, @config.templates.path)
75
- template = code_templater.content_for_suffix(prefix, suffix)
76
-
77
- logger.info "Add this snippet to #{file_name}"
78
- logger.info template
79
- end
80
-
81
83
  private
82
84
 
83
85
  def self.create_logger
@@ -0,0 +1,94 @@
1
+ require_relative 'code_templater'
2
+ require_relative 'file_creator'
3
+ require_relative 'pbxproj_parser'
4
+
5
+ class FileTemplateDefinition
6
+ def initialize(file_template_definition_hash)
7
+ @name = file_template_definition_hash["name"]
8
+ @path = file_template_definition_hash["file"]
9
+ @template = file_template_definition_hash["template"]
10
+ @variables = file_template_definition_hash["variables"] || {}
11
+ end
12
+
13
+ def validate(parser, project, context, template_definition, config)
14
+
15
+ merged_variables = config.variables_for_template_element(template_definition, @name, @variables)
16
+
17
+ code_templater = CodeTemplater.new
18
+ expected_context_keys = template_definition.provided_context_keys
19
+ pathTags = code_templater.get_unknown_context_keys_for_string(@path)
20
+ pathTags.each do |tag|
21
+ raise "Unknown parameter \"#{tag}\" in path \"#{@path}\"" unless expected_context_keys.include?(tag)
22
+ end
23
+
24
+ file_path = code_templater.render_string(@path, context)
25
+ raise "File #{file_path} already exists" if File.exist?(file_path)
26
+
27
+ file_creator = FileCreator.new
28
+ contentTags = file_creator.get_unknown_template_tags_for(template_definition.template_source_file(@template))
29
+ contentTags.each do |tag|
30
+ raise "Unknown parameter \"#{tag}\" in template \"#{@template}\"" unless expected_context_keys.include?(tag)
31
+ end
32
+
33
+ base_path = merged_variables["base_path"]
34
+ raise "Missing base_path variable" if base_path.nil?
35
+
36
+ base_group = project[base_path]
37
+ raise "Base path \"#{base_path}\" is missing" if base_group.nil?
38
+
39
+ target_name = merged_variables["target"]
40
+ if target_name.is_a?(String)
41
+ target = parser.target_for(project, target_name)
42
+ raise "Unable to find target \"#{target_name}\"" if target.nil?
43
+ elsif target_name.is_a?(Array)
44
+ target_name.each do |target_name|
45
+ target = parser.target_for(project, target_name)
46
+ raise "Unable to find target \"#{target_name}\"" if target.nil?
47
+ end
48
+ else
49
+ raise "Invalid target in template #{@name}"
50
+ end
51
+
52
+ end
53
+
54
+ def generate(parser, project, context, template_definition, config)
55
+ merged_variables = config.variables_for_template_element(template_definition, @name, @variables)
56
+
57
+ base_path = merged_variables["base_path"]
58
+ base_group = project[base_path]
59
+ file_path = CodeTemplater.new.render_string(@path, context)
60
+
61
+ intermediates_groups = file_path.split("/")[0...-1]
62
+ generated_filename = file_path.split("/")[-1]
63
+
64
+ group = base_group
65
+ associate_path_to_group = !base_group.path.nil?
66
+
67
+ intermediates_groups.each do |group_name|
68
+ new_group_path = File.join(group.real_path, group_name)
69
+ existing_group = group.groups.find { |g| g.display_name == group_name }
70
+ group = existing_group || group.pf_new_group(
71
+ associate_path_to_group: associate_path_to_group,
72
+ name: group_name,
73
+ path: new_group_path
74
+ )
75
+ end
76
+
77
+ target_name = merged_variables["target"]
78
+
79
+ targets = []
80
+ if target_name.is_a?(String)
81
+ targets = [parser.target_for(project, target_name)]
82
+ elsif target_name.is_a?(Array)
83
+ targets = target_name.map { |name| parser.target_for(project, name) }
84
+ end
85
+
86
+ FileCreator.new.create_file_using_template_path(
87
+ template_definition.template_source_file(@template),
88
+ generated_filename,
89
+ group,
90
+ targets,
91
+ context
92
+ )
93
+ end
94
+ end
@@ -0,0 +1,17 @@
1
+ class FlagTemplateParameter
2
+ attr_reader :name, :short_name, :description, :template_variable_name
3
+
4
+ def initialize(parameter_template_definition_hash)
5
+ @name = parameter_template_definition_hash["flag"]
6
+ @short_name = parameter_template_definition_hash["short_name"]
7
+ @description = parameter_template_definition_hash["description"] || ""
8
+ @template_variable_name = parameter_template_definition_hash["template_variable_name"] || @name
9
+
10
+ raise "Missing flag name" if @name.nil? || @name.empty?
11
+ raise "Invalid flag template_variable_name for #{@name}" if @template_variable_name.nil? || template_variable_name.empty?
12
+ end
13
+
14
+ def provided_context_keys
15
+ [@template_variable_name]
16
+ end
17
+ end
@@ -0,0 +1,54 @@
1
+ require_relative 'code_templater'
2
+ require_relative 'file_creator'
3
+ require_relative 'pbxproj_parser'
4
+
5
+ class GroupTemplateDefinition
6
+ def initialize(group_template_definition_hash)
7
+ @name = group_template_definition_hash["name"]
8
+ @path = group_template_definition_hash["group"]
9
+ @template = group_template_definition_hash["path"]
10
+ @variables = group_template_definition_hash["variables"] || {}
11
+ end
12
+
13
+ def validate(parser, project, context, template_definition, config)
14
+ merged_variables = config.variables_for_template_element(template_definition, @name, @variables)
15
+
16
+ code_templater = CodeTemplater.new
17
+ pathTags = code_templater.get_unknown_context_keys_for_string(@path)
18
+ pathTags.each do |tag|
19
+ raise "Unknown parameter \"#{tag}\" in path \"#{@path}\"" if context[tag].nil?
20
+ end
21
+
22
+ base_path = merged_variables["base_path"]
23
+ raise "Missing base_path variable" if base_path.nil?
24
+
25
+ base_group = project[base_path]
26
+ raise "Base path \"#{base_path}\" is missing" if base_group.nil?
27
+ end
28
+
29
+ def generate(parser, project, context, template_definition, config)
30
+ merged_variables = config.variables_for_template_element(template_definition, @name, @variables)
31
+
32
+ base_path = merged_variables["base_path"]
33
+ base_group = project[base_path]
34
+ group_path = CodeTemplater.new.render_string(@path, context)
35
+
36
+ group_path = group_path.split("/")
37
+
38
+ group = base_group
39
+ associate_path_to_group = !base_group.path.nil?
40
+
41
+ group_path.each do |group_name|
42
+ new_group_path = File.join(group.real_path, group_name)
43
+ existing_group = group.groups.find { |g| g.display_name == group_name }
44
+ group = existing_group || group.pf_new_group(
45
+ associate_path_to_group: associate_path_to_group,
46
+ name: group_name,
47
+ path: new_group_path
48
+ )
49
+ end
50
+
51
+ file_creator = FileCreator.new
52
+ file_creator.create_empty_directory(group)
53
+ end
54
+ end
@@ -11,63 +11,12 @@ class PBXProjParser
11
11
  @projects = {}
12
12
  end
13
13
 
14
- def app_project
15
- project_for(@config.app.project)
16
- end
17
-
18
- def core_project
19
- project_for(@config.core.project)
20
- end
21
-
22
- def data_project
23
- project_for(@config.data.project)
24
- end
25
-
26
- def presenter_group
27
- path = @config.app.presenter.group
28
- app_project[path]
29
- end
30
-
31
- def coordinator_group
32
- path = @config.app.coordinator.group
33
- app_project[path]
34
- end
35
-
36
- def interactor_group
37
- path = @config.core.interactor.group
38
- core_project[path]
39
- end
40
-
41
- def repository_core_group
42
- path = @config.core.repository.group
43
- core_project[path]
44
- end
45
-
46
- def repository_data_group
47
- path = @config.data.repository.group
48
- data_project[path]
49
- end
50
-
51
- def app_target
52
- target_for(app_project, @config.app.target)
53
- end
54
-
55
- def core_target
56
- target_for(core_project, @config.core.target)
57
- end
58
-
59
- def data_target
60
- target_for(data_project, @config.data.target)
61
- end
62
-
63
14
  def save
64
- app_project.save
65
- core_project.save
66
- data_project.save
15
+ @projects.each do |path, value|
16
+ value.save
17
+ end
67
18
  end
68
19
 
69
- private
70
-
71
20
  def project_for(path)
72
21
  module_project_path = File.join(source_path, path)
73
22
  resolved_module_project_path = Dir.glob(module_project_path).first
@@ -0,0 +1,27 @@
1
+ require_relative 'file_creator'
2
+
3
+ class SnippetTemplateDefinition
4
+ def initialize(snippet_template_definition_hash)
5
+ @name = snippet_template_definition_hash["name"]
6
+ @template = snippet_template_definition_hash["template"]
7
+ end
8
+
9
+ def validate(template_definition)
10
+ expected_context_keys = template_definition.provided_context_keys
11
+ file_creator = FileCreator.new
12
+ contentTags = file_creator.get_unknown_template_tags_for(template_definition.template_source_file(@template))
13
+ contentTags.each do |tag|
14
+ raise "Unknown parameter \"#{tag}\" in template \"#{@template}\"" unless expected_context_keys.include?(tag)
15
+ end
16
+ end
17
+
18
+ def generate(context, template_definition)
19
+
20
+ file_creator = FileCreator.new
21
+ file_creator.print_file_content_using_template(
22
+ @name,
23
+ template_definition.template_source_file(@template),
24
+ context
25
+ )
26
+ end
27
+ end
@@ -0,0 +1,116 @@
1
+ require 'yaml'
2
+
3
+ require_relative 'file_creator'
4
+ require_relative 'pbxproj_parser'
5
+ require_relative 'argument_template_parameter'
6
+ require_relative 'flag_template_parameter'
7
+ require_relative 'file_template_definition'
8
+ require_relative 'group_template_definition'
9
+ require_relative 'snippet_template_definition'
10
+
11
+ class TemplateDefinition
12
+
13
+ attr_reader :name, :description, :template_path, :template_file_source, :parameters, :variables
14
+
15
+ def self.parse(template_path)
16
+ template_definition = File.join(template_path, 'template.yml')
17
+ if File.exist?(template_definition)
18
+ template_definition = YAML.load_file(template_definition)
19
+ self.new template_definition, template_path
20
+ else
21
+ puts "Template #{template_path} is invalid: file #{template_definition} not found."
22
+ nil
23
+ end
24
+ end
25
+
26
+ def initialize(template_definition_hash, template_path)
27
+ @template_definition_hash = template_definition_hash
28
+ @template_path = template_path
29
+
30
+ @name = template_definition_hash["name"]
31
+ @description = template_definition_hash["description"] || ""
32
+ @variables = template_definition_hash["variables"] || {}
33
+
34
+ @parameters = template_definition_hash["parameters"].map { |hash|
35
+ next ArgumentTemplateParameter.new(hash) unless hash["argument"].nil?
36
+ next FlagTemplateParameter.new(hash) unless hash["flag"].nil?
37
+ }.compact
38
+
39
+ @generated_elements = template_definition_hash["generated_elements"].map { |hash|
40
+ next FileTemplateDefinition.new(hash) unless hash["file"].nil?
41
+ next GroupTemplateDefinition.new(hash) unless hash["group"].nil?
42
+ next nil
43
+ }.compact
44
+
45
+ if template_definition_hash["code_snippets"].nil?
46
+ @snippets = []
47
+ else
48
+ @snippets = template_definition_hash["code_snippets"].map { |hash|
49
+ SnippetTemplateDefinition.new(hash)
50
+ }
51
+ end
52
+
53
+ @template_file_source = template_definition_hash["template_file_source"] || {}
54
+ end
55
+
56
+ def validate(parser, options, config)
57
+
58
+ raise "Error: missing name in template" if @name.nil?
59
+ raise "Error: invalid template name" unless @name.is_a? String
60
+
61
+ merged_variables = config.variables_for_template(self)
62
+ project_path = merged_variables["project"]
63
+
64
+ project = parser.project_for(project_path)
65
+ raise "Error: Unable to find project \"#{project_path}\"" if project.nil?
66
+
67
+ @template_file_source.each do |file_template_name, path|
68
+ raise "Missing template source file for \"#{file_template_name}\"" unless File.exist?(self.template_source_file(file_template_name))
69
+ end
70
+
71
+ options = agrument_transformed_options(options)
72
+
73
+ @generated_elements.each do |generated_element|
74
+ generated_element.validate(parser, project, options, self, config)
75
+ end
76
+
77
+ @snippets.each do |snippet|
78
+ snippet.validate(self)
79
+ end
80
+ end
81
+
82
+ def template_source_file(name)
83
+ raise "Unknown template file #{name}" if @template_file_source[name].nil?
84
+ File.join(@template_path, @template_file_source[name])
85
+ end
86
+
87
+ def provided_context_keys
88
+ @parameters.flat_map { |p| p.provided_context_keys }.to_set
89
+ end
90
+
91
+ def generate(parser, options, config)
92
+
93
+ options = agrument_transformed_options(options)
94
+
95
+ merged_variables = config.variables_for_template(self)
96
+ project_path = merged_variables["project"]
97
+
98
+ project = parser.project_for project_path
99
+
100
+ @generated_elements.each do |element|
101
+ element.generate(parser, project, options, self, config)
102
+ end
103
+
104
+ @snippets.each do |snippet|
105
+ snippet.generate(options, self)
106
+ end
107
+ end
108
+
109
+ def agrument_transformed_options(options)
110
+ @parameters.select { |p| p.is_a? ArgumentTemplateParameter }.each do |argument|
111
+ options = argument.update_context(options)
112
+ end
113
+ options
114
+ end
115
+
116
+ end
@@ -0,0 +1,20 @@
1
+ name: "coordinator"
2
+ description: "Generate NameCoordinator"
3
+ variables:
4
+ project: "*.xcodeproj"
5
+ base_path: "Coordinator"
6
+ target: ""
7
+ parameters:
8
+ - argument: "name"
9
+ removeSuffix: "Coordinator"
10
+ - flag: "delegate"
11
+ short_name: "d"
12
+ template_variable_name: "generate_delegate"
13
+ description: "Generate delegate protocols when provided"
14
+ generated_elements:
15
+ - name: "coordinator"
16
+ file: "{{ name }}Coordinator.swift"
17
+ template: "coordinator"
18
+ variables: {}
19
+ template_file_source:
20
+ coordinator: "coordinator.mustache"
@@ -0,0 +1,25 @@
1
+ name: "interactor"
2
+ description: "Generate NameInteractor and NameInteractorImplementation"
3
+ parameters:
4
+ - argument: "name"
5
+ removeSuffix: "Interactor"
6
+ variables:
7
+ project: "*.xcodeproj"
8
+ base_path: "Core/Interactor"
9
+ target: ""
10
+ generated_elements:
11
+ - name: "interactor"
12
+ file: "{{ name }}Interactor/{{ name }}Interactor.swift"
13
+ template: "interactor"
14
+ variables: {}
15
+ - name: "interactor_implementation"
16
+ file: "{{ name }}Interactor/{{ name }}InteractorImplementation.swift"
17
+ template: "interactor_implementation"
18
+ variables: {}
19
+ code_snippets:
20
+ - name: InteractorAssembly
21
+ template: "interactor_assembly"
22
+ template_file_source:
23
+ interactor: "interactor.mustache"
24
+ interactor_implementation: "interactor_implementation.mustache"
25
+ interactor_assembly: "interactor_assembly.mustache"
@@ -0,0 +1,49 @@
1
+ name: "presenter"
2
+ description: "Generate NamePresenter, NamePresenterImplementation, NameViewContract and NameViewController"
3
+ parameters:
4
+ - argument: "name"
5
+ removeSuffix: "Presenter"
6
+ lowercased_variable_name: "lowercased_name"
7
+ - flag: "delegate"
8
+ short_name: "d"
9
+ template_variable_name: "generate_delegate"
10
+ description: "Generate delegate protocols when provided"
11
+ variables:
12
+ project: "*.xcodeproj"
13
+ base_path: "App"
14
+ target: ""
15
+ generated_elements:
16
+ - name: "ui_view_group"
17
+ group: "{{ name }}/UI/View"
18
+ variables: {}
19
+ - name: "view_controller"
20
+ file: "{{ name }}/UI/ViewController/{{ name }}ViewController.swift"
21
+ template: "view_controller"
22
+ variables: {}
23
+ - name: "view_contract"
24
+ file: "{{ name }}/UI/{{ name }}ViewContract.swift"
25
+ template: "view_contract"
26
+ variables: {}
27
+ - name: "presenter"
28
+ file: "{{ name }}/Presenter/{{ name }}Presenter.swift"
29
+ template: "presenter"
30
+ variables: {}
31
+ - name: "presenter_implementation"
32
+ file: "{{ name }}/Presenter/{{ name }}PresenterImplementation.swift"
33
+ template: "presenter_implementation"
34
+ variables: {}
35
+ - name: "model_group"
36
+ group: "{{ name }}/Model"
37
+ variables: {}
38
+ code_snippets:
39
+ - name: DependencyProvider
40
+ template: "dependency_provider"
41
+ - name: PresenterAssembly
42
+ template: "presenter_assembly"
43
+ template_file_source:
44
+ view_controller: "view_controller.mustache"
45
+ view_contract: "view_contract.mustache"
46
+ presenter: "presenter.mustache"
47
+ presenter_implementation: "presenter_implementation.mustache"
48
+ dependency_provider: "dependency_provider.mustache"
49
+ presenter_assembly: "presenter_assembly.mustache"
@@ -0,0 +1,26 @@
1
+ name: "repository"
2
+ description: "Generate NameRepository and NameRepositoryImplementation"
3
+ parameters:
4
+ - argument: "name"
5
+ removeSuffix: "Repository"
6
+ variables:
7
+ project: "*.xcodeproj"
8
+ target: ""
9
+ generated_elements:
10
+ - name: "repository"
11
+ file: "{{ name }}/{{ name }}Repository.swift"
12
+ template: "repository"
13
+ variables:
14
+ base_path: "Core/Data"
15
+ - name: "repository_implementation"
16
+ file: "{{ name }}/{{ name }}RepositoryImplementation.swift"
17
+ template: "repository_implementation"
18
+ variables:
19
+ base_path: "Data"
20
+ code_snippets:
21
+ - name: RepositoryAssembly
22
+ template: "repository_assembly"
23
+ template_file_source:
24
+ repository: "repository.mustache"
25
+ repository_implementation: "repository_implementation.mustache"
26
+ repository_assembly: "repository_assembly.mustache"
@@ -0,0 +1,31 @@
1
+ require_relative 'config'
2
+ require_relative 'template_definition'
3
+
4
+ class TemplatesLoader
5
+
6
+ def get_templates(config)
7
+ default_template_folder = File.join(File.dirname(__FILE__), "templates")
8
+ default_templates = load_templates_from_collection(default_template_folder)
9
+ custom_templates = []
10
+ if !config.templates_collection.nil?
11
+ custom_templates = load_templates_from_collection(config.templates_collection)
12
+ end
13
+ templates = {}
14
+ all_templates = default_templates + custom_templates
15
+ all_templates.each do |template|
16
+ templates[template.name] = template
17
+ end
18
+ Hash[templates.sort_by{|k,v| k}]
19
+ end
20
+
21
+ private
22
+
23
+ def load_templates_from_collection(collection_path)
24
+ template_paths = Dir.children(collection_path)
25
+ .map { |name| File.join(collection_path, name) }
26
+ .select { |path| File.directory? path }
27
+ template_paths
28
+ .map { |template_path| TemplateDefinition.parse(template_path) }
29
+ .compact
30
+ end
31
+ end