ccios 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c88ba12634db23d2c4e956b6f03b721a127dbbc49897c49cd2b9fe15a295704b
4
- data.tar.gz: eadb6778ddd52ce31071e3f3addc37c523fcfb1272a00f212bad6eb73d0e089d
3
+ metadata.gz: 17e45b6aa153c86b30ee9975a172b6a9e010c796633936310497a4d7eafea7e4
4
+ data.tar.gz: 61769b9cdd9d07510d855ccbbbdcace5a79fb171391872db91d93778bfbc0448
5
5
  SHA512:
6
- metadata.gz: 8cf76e8f0ed4b932cf9d653bc0e30fe970806025b48ae6490232b37f3cc62cd2ce756f4e1a9560603f9d06338e3ffb85c388797c975a80b3b54974f8205b6431
7
- data.tar.gz: 9753729e4574c4f30a047168590b77195cb3f51566179b1c98cadc97320b47e3b7d3dd3547d8c082b64b01419c5be2cd329a1ebd01e2dcfc45cefadf3857e5e7
6
+ metadata.gz: d0782622ea52267f207de88a45a60fdcffe93629b3c6fcb8542c2ee256dccc7fd44e1aeb4b2dc1b2e4fb5514b836fbe561968e18bda962d50b4d5b23884cad34
7
+ data.tar.gz: a744aaa03b197360105b3656580dfecc9675138269a9bf7116093b1daa208919ac5cf77ece3ca735b92906a303b2e79dbe95df22f12653b631c4cb0d53c842ee
@@ -0,0 +1,20 @@
1
+ name: Ruby
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ build:
7
+
8
+ runs-on: ubuntu-latest
9
+
10
+ steps:
11
+ - uses: actions/checkout@v1
12
+ - name: Set up Ruby 2.6
13
+ uses: actions/setup-ruby@v1
14
+ with:
15
+ ruby-version: 2.6.x
16
+ - name: Build and test with Rake
17
+ run: |
18
+ gem install bundler
19
+ bundle install --jobs 4 --retry 3
20
+ bundle exec rake
data/.gitignore CHANGED
@@ -1 +1,3 @@
1
- ccios-*.gem
1
+ ccios-*.gem
2
+ xcuserdata
3
+ .DS_Store
@@ -0,0 +1,8 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+ `ADUtils` adheres to [Semantic Versioning](http://semver.org/).
4
+
5
+ ## [2.2.0]
6
+
7
+ ### Added
8
+ - Create configuration with optional `.ccios.yml` file
@@ -1,122 +1,133 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ccios (1.0.3)
4
+ ccios (2.2.0)
5
5
  mustache (~> 1.0)
6
- rails
6
+ rails (~> 5.1)
7
7
  xcodeproj (~> 1.4)
8
8
 
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- CFPropertyList (2.3.5)
13
- actioncable (5.1.3)
14
- actionpack (= 5.1.3)
12
+ CFPropertyList (3.0.2)
13
+ actioncable (5.2.4.2)
14
+ actionpack (= 5.2.4.2)
15
15
  nio4r (~> 2.0)
16
- websocket-driver (~> 0.6.1)
17
- actionmailer (5.1.3)
18
- actionpack (= 5.1.3)
19
- actionview (= 5.1.3)
20
- activejob (= 5.1.3)
16
+ websocket-driver (>= 0.6.1)
17
+ actionmailer (5.2.4.2)
18
+ actionpack (= 5.2.4.2)
19
+ actionview (= 5.2.4.2)
20
+ activejob (= 5.2.4.2)
21
21
  mail (~> 2.5, >= 2.5.4)
22
22
  rails-dom-testing (~> 2.0)
23
- actionpack (5.1.3)
24
- actionview (= 5.1.3)
25
- activesupport (= 5.1.3)
26
- rack (~> 2.0)
27
- rack-test (~> 0.6.3)
23
+ actionpack (5.2.4.2)
24
+ actionview (= 5.2.4.2)
25
+ activesupport (= 5.2.4.2)
26
+ rack (~> 2.0, >= 2.0.8)
27
+ rack-test (>= 0.6.3)
28
28
  rails-dom-testing (~> 2.0)
29
29
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
30
- actionview (5.1.3)
31
- activesupport (= 5.1.3)
30
+ actionview (5.2.4.2)
31
+ activesupport (= 5.2.4.2)
32
32
  builder (~> 3.1)
33
33
  erubi (~> 1.4)
34
34
  rails-dom-testing (~> 2.0)
35
35
  rails-html-sanitizer (~> 1.0, >= 1.0.3)
36
- activejob (5.1.3)
37
- activesupport (= 5.1.3)
36
+ activejob (5.2.4.2)
37
+ activesupport (= 5.2.4.2)
38
38
  globalid (>= 0.3.6)
39
- activemodel (5.1.3)
40
- activesupport (= 5.1.3)
41
- activerecord (5.1.3)
42
- activemodel (= 5.1.3)
43
- activesupport (= 5.1.3)
44
- arel (~> 8.0)
45
- activesupport (5.1.3)
39
+ activemodel (5.2.4.2)
40
+ activesupport (= 5.2.4.2)
41
+ activerecord (5.2.4.2)
42
+ activemodel (= 5.2.4.2)
43
+ activesupport (= 5.2.4.2)
44
+ arel (>= 9.0)
45
+ activestorage (5.2.4.2)
46
+ actionpack (= 5.2.4.2)
47
+ activerecord (= 5.2.4.2)
48
+ marcel (~> 0.3.1)
49
+ activesupport (5.2.4.2)
46
50
  concurrent-ruby (~> 1.0, >= 1.0.2)
47
- i18n (~> 0.7)
51
+ i18n (>= 0.7, < 2)
48
52
  minitest (~> 5.1)
49
53
  tzinfo (~> 1.1)
50
- arel (8.0.0)
51
- builder (3.2.3)
52
- claide (1.0.2)
54
+ arel (9.0.0)
55
+ atomos (0.1.3)
56
+ builder (3.2.4)
57
+ claide (1.0.3)
53
58
  colored2 (3.1.2)
54
- concurrent-ruby (1.0.5)
55
- erubi (1.6.1)
56
- globalid (0.4.0)
59
+ concurrent-ruby (1.1.6)
60
+ crass (1.0.6)
61
+ erubi (1.9.0)
62
+ globalid (0.4.2)
57
63
  activesupport (>= 4.2.0)
58
- i18n (0.8.6)
59
- loofah (2.0.3)
64
+ i18n (1.8.2)
65
+ concurrent-ruby (~> 1.0)
66
+ loofah (2.5.0)
67
+ crass (~> 1.0.2)
60
68
  nokogiri (>= 1.5.9)
61
- mail (2.6.6)
62
- mime-types (>= 1.16, < 4)
63
- method_source (0.8.2)
64
- mime-types (3.1)
65
- mime-types-data (~> 3.2015)
66
- mime-types-data (3.2016.0521)
67
- mini_portile2 (2.2.0)
68
- minitest (5.10.3)
69
- mustache (1.0.5)
70
- nanaimo (0.2.3)
71
- nio4r (2.1.0)
72
- nokogiri (1.8.0)
73
- mini_portile2 (~> 2.2.0)
74
- rack (2.0.3)
75
- rack-test (0.6.3)
76
- rack (>= 1.0)
77
- rails (5.1.3)
78
- actioncable (= 5.1.3)
79
- actionmailer (= 5.1.3)
80
- actionpack (= 5.1.3)
81
- actionview (= 5.1.3)
82
- activejob (= 5.1.3)
83
- activemodel (= 5.1.3)
84
- activerecord (= 5.1.3)
85
- activesupport (= 5.1.3)
69
+ mail (2.7.1)
70
+ mini_mime (>= 0.1.1)
71
+ marcel (0.3.3)
72
+ mimemagic (~> 0.3.2)
73
+ method_source (1.0.0)
74
+ mimemagic (0.3.4)
75
+ mini_mime (1.0.2)
76
+ mini_portile2 (2.4.0)
77
+ minitest (5.14.0)
78
+ mustache (1.1.1)
79
+ nanaimo (0.2.6)
80
+ nio4r (2.5.2)
81
+ nokogiri (1.10.9)
82
+ mini_portile2 (~> 2.4.0)
83
+ rack (2.2.2)
84
+ rack-test (1.1.0)
85
+ rack (>= 1.0, < 3)
86
+ rails (5.2.4.2)
87
+ actioncable (= 5.2.4.2)
88
+ actionmailer (= 5.2.4.2)
89
+ actionpack (= 5.2.4.2)
90
+ actionview (= 5.2.4.2)
91
+ activejob (= 5.2.4.2)
92
+ activemodel (= 5.2.4.2)
93
+ activerecord (= 5.2.4.2)
94
+ activestorage (= 5.2.4.2)
95
+ activesupport (= 5.2.4.2)
86
96
  bundler (>= 1.3.0)
87
- railties (= 5.1.3)
97
+ railties (= 5.2.4.2)
88
98
  sprockets-rails (>= 2.0.0)
89
99
  rails-dom-testing (2.0.3)
90
100
  activesupport (>= 4.2.0)
91
101
  nokogiri (>= 1.6)
92
- rails-html-sanitizer (1.0.3)
93
- loofah (~> 2.0)
94
- railties (5.1.3)
95
- actionpack (= 5.1.3)
96
- activesupport (= 5.1.3)
102
+ rails-html-sanitizer (1.3.0)
103
+ loofah (~> 2.3)
104
+ railties (5.2.4.2)
105
+ actionpack (= 5.2.4.2)
106
+ activesupport (= 5.2.4.2)
97
107
  method_source
98
108
  rake (>= 0.8.7)
99
- thor (>= 0.18.1, < 2.0)
100
- rake (12.0.0)
101
- sprockets (3.7.1)
109
+ thor (>= 0.19.0, < 2.0)
110
+ rake (13.0.1)
111
+ sprockets (4.0.0)
102
112
  concurrent-ruby (~> 1.0)
103
113
  rack (> 1, < 3)
104
- sprockets-rails (3.2.0)
114
+ sprockets-rails (3.2.1)
105
115
  actionpack (>= 4.0)
106
116
  activesupport (>= 4.0)
107
117
  sprockets (>= 3.0.0)
108
- thor (0.20.0)
118
+ thor (1.0.1)
109
119
  thread_safe (0.3.6)
110
- tzinfo (1.2.3)
120
+ tzinfo (1.2.7)
111
121
  thread_safe (~> 0.1)
112
- websocket-driver (0.6.5)
122
+ websocket-driver (0.7.1)
113
123
  websocket-extensions (>= 0.1.0)
114
- websocket-extensions (0.1.2)
115
- xcodeproj (1.5.1)
116
- CFPropertyList (~> 2.3.3)
124
+ websocket-extensions (0.1.4)
125
+ xcodeproj (1.16.0)
126
+ CFPropertyList (>= 2.3.3, < 4.0)
127
+ atomos (~> 0.1.3)
117
128
  claide (>= 1.0.2, < 2.0)
118
129
  colored2 (~> 3.1)
119
- nanaimo (~> 0.2.3)
130
+ nanaimo (~> 0.2.6)
120
131
 
121
132
  PLATFORMS
122
133
  ruby
@@ -125,4 +136,4 @@ DEPENDENCIES
125
136
  ccios!
126
137
 
127
138
  BUNDLED WITH
128
- 1.12.3
139
+ 1.17.3
@@ -0,0 +1,11 @@
1
+ build:
2
+ gem build ccios.gemspec
3
+
4
+ install: clean build
5
+ gem install ccios-*.gem
6
+
7
+ clean:
8
+ rm -f ccios-*.gem
9
+
10
+ tests:
11
+ rake test
data/README.md CHANGED
@@ -101,3 +101,58 @@ The following structure is created for you in the Xcode project:
101
101
  +-- Coordinator/
102
102
  | +-- ExampleCoordinator
103
103
  ```
104
+
105
+ ## Configuration
106
+
107
+
108
+ Each project is different. You can configure the groups to use in the xcodeproj for the new files.
109
+
110
+ Create a file `.ccios.yml` at the root of your project.
111
+
112
+ By default, if no file is present, the following configuration will be used:
113
+ ```
114
+ app:
115
+ project: MyProject.xcodeproj
116
+ presenter:
117
+ group: Classes/App
118
+ coordinator:
119
+ group: Classes/Coordinator
120
+
121
+ core:
122
+ project: MyProject.xcodeproj
123
+ interactor:
124
+ group: Classes/Core/Interactor
125
+ repository:
126
+ group: Classes/Core/Data
127
+
128
+ data:
129
+ project: MyProject.xcodeproj
130
+ repository:
131
+ group: Classes/Data
132
+ ```
133
+
134
+ But you could imagine more complex project structures with multiple xcodeproj:
135
+ ```
136
+ app:
137
+ project: MyProject/MyProject.xcodeproj
138
+ presenter:
139
+ group: Classes/App
140
+ coordinator:
141
+ group: Classes/Coordinator
142
+
143
+ core:
144
+ project: MyProjectCore/MyProjectCore.xcodeproj
145
+ interactor:
146
+ group: MyProjectCore/Interactors
147
+ repository:
148
+ group: MyProjectCore/Repository
149
+
150
+ data:
151
+ project: MyProjectData/MyProjectData.xcodeproj
152
+ repository:
153
+ group: MyProjectData/Sources/Repositories
154
+
155
+ ```
156
+
157
+ *Note*: The path of the new files will be infered from the path of the group. It works with *Group with folder* and *Group without folder* in Xcode.
158
+
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'ccios'
3
- s.version = '2.1.0'
3
+ s.version = '2.2.0'
4
4
  s.executables << 'ccios'
5
5
  s.date = '2016-08-03'
6
6
  s.summary = "Clean Code iOS Generator"
@@ -6,6 +6,7 @@ require 'ccios/presenter_generator'
6
6
  require 'ccios/coordinator_generator'
7
7
  require 'ccios/interactor_generator'
8
8
  require 'ccios/repository_generator'
9
+ require 'ccios/config'
9
10
 
10
11
  options = {}
11
12
  OptionParser.new do |opts|
@@ -35,31 +36,32 @@ OptionParser.new do |opts|
35
36
  end.parse!
36
37
 
37
38
  source_path = Dir.pwd
38
- parser = PBXProjParser.new source_path
39
+ config = Config.parse ".ccios.yml"
40
+ parser = PBXProjParser.new(source_path, config)
39
41
 
40
42
  if options[:presenter]
41
43
  presenter_name = options[:presenter]
42
- presenter_generator = PresenterGenerator.new parser
44
+ presenter_generator = PresenterGenerator.new(parser, config)
43
45
  generator_options = {generate_delegate: options[:generate_delegate]}
44
46
  presenter_generator.generate(presenter_name, generator_options)
45
47
  end
46
48
 
47
49
  if options[:coordinator]
48
50
  coordinator_name = options[:coordinator]
49
- coordinator_generator = CoordinatorGenerator.new parser
51
+ coordinator_generator = CoordinatorGenerator.new(parser, config)
50
52
  generator_options = {generate_delegate: options[:generate_delegate]}
51
53
  coordinator_generator.generate(coordinator_name, generator_options)
52
54
  end
53
55
 
54
56
  if options[:interactor]
55
57
  interactor_name = options[:interactor]
56
- interactor_generator = InteractorGenerator.new parser
58
+ interactor_generator = InteractorGenerator.new(parser, config)
57
59
  interactor_generator.generate(interactor_name)
58
60
  end
59
61
 
60
62
  if options[:repository]
61
63
  repository_name = options[:repository]
62
- repository_generator = RepositoryGenerator.new parser
64
+ repository_generator = RepositoryGenerator.new(parser, config)
63
65
  repository_generator.generate(repository_name)
64
66
  end
65
67
 
@@ -0,0 +1,113 @@
1
+ require 'yaml'
2
+
3
+ class Config
4
+
5
+ attr_reader :app, :core, :data
6
+
7
+ def self.parse(source_path)
8
+ if File.exist?(source_path)
9
+ config = YAML.load_file(source_path)
10
+ self.new config, source_path
11
+ else
12
+ puts "File #{source_path} does not exists. Using default config."
13
+ self.default
14
+ end
15
+ end
16
+
17
+ def self.default_config_hash
18
+ project = "*.xcodeproj"
19
+ {
20
+ "app" => {
21
+ "project" => project,
22
+ "presenter" => {"group" => "Classes/App"},
23
+ "coordinator" => {"group" => "Classes/Coordinator"}
24
+ },
25
+ "core" => {
26
+ "project" => project,
27
+ "interactor" => {"group" => "Classes/Core/Interactor"},
28
+ "repository" => {"group" => "Classes/Core/Data"}
29
+ },
30
+ "data" => {
31
+ "project" => project,
32
+ "repository" => {"group" => "Classes/Data"}
33
+ }
34
+ }
35
+ end
36
+
37
+ def self.default
38
+ self.new default_config_hash
39
+ end
40
+
41
+ def initialize(config_hash, source_path = nil)
42
+ @source_path = source_path
43
+ validate config_hash
44
+ @app = AppConfig.new config_hash["app"]
45
+ @core = CoreConfig.new config_hash["core"]
46
+ @data = DataConfig.new config_hash["data"]
47
+ end
48
+
49
+ def validate(hash)
50
+ validate_path hash, "app.project"
51
+ validate_path hash, "app.presenter.group"
52
+ validate_path hash, "app.coordinator.group"
53
+
54
+ validate_path hash, "core.project"
55
+ validate_path hash, "core.interactor.group"
56
+ validate_path hash, "core.repository.group"
57
+
58
+ validate_path hash, "data.project"
59
+ validate_path hash, "data.repository.group"
60
+ end
61
+
62
+ def validate_path(hash, path)
63
+ components = path.split(".")
64
+ keys = []
65
+ components.each do |component|
66
+ hash = hash[component]
67
+ keys << component
68
+ if hash.nil?
69
+ message = "Key \"#{keys.join(".")}\" is missing"
70
+ message += " in #{@source_path}" unless @source_path.nil?
71
+ raise message
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ class AppConfig
78
+ attr_reader :project, :presenter, :coordinator
79
+
80
+ def initialize(hash)
81
+ @project = hash["project"]
82
+ @presenter = ObjectConfig.new hash["presenter"]
83
+ @coordinator = ObjectConfig.new hash["coordinator"]
84
+ end
85
+ end
86
+
87
+ class CoreConfig
88
+ attr_reader :project, :interactor, :repository
89
+
90
+ def initialize(hash)
91
+ @project = hash["project"]
92
+ @interactor = ObjectConfig.new hash["interactor"]
93
+ @repository = ObjectConfig.new hash["repository"]
94
+ end
95
+ end
96
+
97
+ class DataConfig
98
+ attr_reader :project, :repository
99
+
100
+ def initialize(hash)
101
+ @project = hash["project"]
102
+ @repository = ObjectConfig.new hash["repository"]
103
+ end
104
+ end
105
+
106
+ class ObjectConfig
107
+
108
+ attr_reader :group
109
+
110
+ def initialize(hash)
111
+ @group = hash["group"]
112
+ end
113
+ end
@@ -3,14 +3,15 @@ require_relative "pbxproj_parser"
3
3
 
4
4
  class CoordinatorGenerator
5
5
 
6
- def initialize(parser)
6
+ def initialize(parser, config)
7
7
  @parser = parser
8
+ @config = config
8
9
  end
9
10
 
10
11
  def generate(coordinator_name, options = {})
11
12
  coordinator_group = @parser.coordinator_group
12
- file_creator = FileCreator.new(@parser.source_path, options)
13
- target = @parser.main_target
13
+ file_creator = FileCreator.new(options)
14
+ target = @parser.app_target
14
15
  file_creator.create_file(coordinator_name, 'Coordinator', coordinator_group, target)
15
16
  end
16
17
  end
@@ -1,9 +1,17 @@
1
1
  require_relative 'code_templater'
2
+ require 'fileutils'
2
3
 
3
4
  class FileCreator
4
- def initialize(source_path, options = {})
5
- @source_path = source_path
6
- @classes_path = source_path + '/Classes'
5
+
6
+ def self.logger
7
+ @@logger ||= create_logger
8
+ end
9
+
10
+ def logger
11
+ FileCreator.logger
12
+ end
13
+
14
+ def initialize(options = {})
7
15
  @options = options
8
16
  end
9
17
 
@@ -17,13 +25,15 @@ class FileCreator
17
25
  end
18
26
 
19
27
  def git_username
20
- `cd #{@source_path}; git config user.name`.strip
28
+ `git config user.name`.strip
21
29
  end
22
30
 
23
31
  def create_file(prefix, suffix, group, target)
24
- file_path = @classes_path + '/' + prefix + suffix + '.swift'
32
+ file_path = File.join(group.real_path, prefix + suffix + '.swift')
25
33
 
26
- raise "File #{file_path} already exists" if File.exists?(file_path)
34
+ raise "File #{file_path} already exists" if File.exist?(file_path)
35
+ dirname = File.dirname(file_path)
36
+ FileUtils.mkdir_p dirname unless File.directory?(dirname)
27
37
  file = File.new(file_path, 'w')
28
38
 
29
39
  templater_options = templater_options(target)
@@ -36,14 +46,30 @@ class FileCreator
36
46
  target.add_file_references([file_ref])
37
47
  end
38
48
 
49
+ def create_empty_directory(group)
50
+ dirname = group.real_path
51
+ FileUtils.mkdir_p dirname unless File.directory?(dirname)
52
+
53
+ git_keep_path = File.join(dirname, ".gitkeep")
54
+ FileUtils.touch(git_keep_path) if Dir.empty?(dirname)
55
+ end
56
+
39
57
  def print_file_content(prefix, suffix)
40
- file_path = @classes_path + '/' + suffix + '.swift'
58
+ file_name = suffix + '.swift'
41
59
 
42
60
  code_templater = CodeTemplater.new(@options)
43
61
  template = code_templater.content_for_suffix(prefix, suffix)
44
62
 
45
- puts "Add this snippet to #{file_path}"
46
- puts template
47
- puts "\n"
63
+ logger.info "Add this snippet to #{file_name}"
64
+ logger.info template
65
+ end
66
+
67
+ private
68
+
69
+ def self.create_logger
70
+ logger = Logger.new(STDOUT)
71
+ logger.level = Logger::DEBUG
72
+ logger.formatter = proc { |severity, datetime, progname, msg| msg + "\n" }
73
+ logger
48
74
  end
49
75
  end
@@ -3,18 +3,23 @@ require_relative "pbxproj_parser"
3
3
 
4
4
  class InteractorGenerator
5
5
 
6
- def initialize(parser)
6
+ def initialize(parser, config)
7
7
  @parser = parser
8
+ @config = config
8
9
  end
9
10
 
10
11
  def generate(interactor_name, options = {})
11
12
  interactor_group = @parser.interactor_group
12
13
  new_group_name = "#{interactor_name}Interactor"
14
+
15
+ associate_path_to_group = !interactor_group.path.nil?
16
+
13
17
  raise "[Error] Group #{new_group_name} already exists in #{app_group.display_name}" if interactor_group[new_group_name]
14
- new_group = interactor_group.new_group(new_group_name)
18
+ new_group_path = File.join(interactor_group.real_path, new_group_name)
19
+ new_group = interactor_group.new_group(new_group_name, associate_path_to_group ? new_group_path : nil)
15
20
 
16
- file_creator = FileCreator.new(@parser.source_path, options)
17
- target = @parser.main_target
21
+ file_creator = FileCreator.new(options)
22
+ target = @parser.core_target
18
23
  file_creator.create_file(interactor_name, 'Interactor', new_group, target)
19
24
  file_creator.create_file(interactor_name, 'InteractorImplementation', new_group, target)
20
25
 
@@ -2,49 +2,77 @@ require 'xcodeproj'
2
2
 
3
3
  class PBXProjParser
4
4
 
5
- attr_accessor :source_path, :project
5
+ attr_accessor :source_path
6
6
 
7
- def initialize(source_path)
7
+ def initialize(source_path, config)
8
8
  @source_path = source_path
9
- if project_path.nil?
10
- raise "[Error] There is no xcodeproj at path #{@source_path}"
11
- end
12
- @project = Xcodeproj::Project.open(project_path)
13
- end
14
-
15
- def project_path
16
- Dir.glob("#{@source_path}/*.xcodeproj").first
9
+ @config = config
10
+ @projects = {}
17
11
  end
18
12
 
19
- def main_target
20
- @project.targets.first
13
+ def app_project
14
+ project_for(@config.app.project)
21
15
  end
22
16
 
23
- def classes_group
24
- @project.groups.find { |g| g.display_name === "Classes" }
17
+ def core_project
18
+ project_for(@config.core.project)
25
19
  end
26
20
 
27
- def app_group
28
- classes_group["App"]
21
+ def data_project
22
+ project_for(@config.data.project)
29
23
  end
30
24
 
31
- def core_group
32
- classes_group["Core"]
25
+ def presenter_group
26
+ path = @config.app.presenter.group
27
+ app_project[path]
33
28
  end
34
29
 
35
30
  def coordinator_group
36
- classes_group["Coordinator"]
31
+ path = @config.app.coordinator.group
32
+ app_project[path]
37
33
  end
38
34
 
39
35
  def interactor_group
40
- core_group["Interactor"]
36
+ path = @config.core.interactor.group
37
+ core_project[path]
38
+ end
39
+
40
+ def repository_core_group
41
+ path = @config.core.repository.group
42
+ core_project[path]
43
+ end
44
+
45
+ def repository_data_group
46
+ path = @config.data.repository.group
47
+ data_project[path]
41
48
  end
42
49
 
43
- def data_group
44
- classes_group["Data"]
50
+ def app_target
51
+ app_project.targets.first
52
+ end
53
+
54
+ def core_target
55
+ core_project.targets.first
56
+ end
57
+
58
+ def data_target
59
+ data_project.targets.first
45
60
  end
46
61
 
47
62
  def save
48
- @project.save
63
+ app_project.save
64
+ core_project.save
65
+ data_project.save
66
+ end
67
+
68
+ private
69
+
70
+ def project_for(path)
71
+ module_project_path = File.join(source_path, path)
72
+ resolved_module_project_path = Dir.glob(module_project_path).first
73
+ if !File.exist?(resolved_module_project_path)
74
+ raise "[Error] There is no xcodeproj at path #{module_project_path}"
75
+ end
76
+ @projects[module_project_path] ||= Xcodeproj::Project.open(resolved_module_project_path)
49
77
  end
50
78
  end
@@ -3,27 +3,43 @@ require_relative "pbxproj_parser"
3
3
 
4
4
  class PresenterGenerator
5
5
 
6
- def initialize(parser)
6
+ def initialize(parser, config)
7
7
  @parser = parser
8
+ @config = config
8
9
  end
9
10
 
10
11
  def generate(presenter_name, options = {})
11
- app_group = @parser.app_group
12
+ app_group = @parser.presenter_group
13
+
14
+ associate_path_to_group = !app_group.path.nil?
15
+
12
16
  raise "[Error] Group #{presenter_name} already exists in #{app_group.display_name}" if app_group[presenter_name]
13
- new_group = app_group.new_group(presenter_name)
17
+ new_group_path = File.join(app_group.real_path, presenter_name)
18
+ new_group = app_group.new_group(presenter_name, associate_path_to_group ? new_group_path : nil)
19
+
20
+ ui_group_path = File.join(new_group_path, "UI")
21
+ ui_group = new_group.new_group("UI", associate_path_to_group ? ui_group_path : nil)
22
+
23
+ view_group_path = File.join(ui_group_path, "View")
24
+ view_group = ui_group.new_group("View", associate_path_to_group ? view_group_path : nil)
25
+
26
+ view_controller_group_path = File.join(ui_group_path, "ViewController")
27
+ view_controller_group = ui_group.new_group("ViewController", associate_path_to_group ? view_controller_group_path : nil)
28
+
29
+ presenter_group_path = File.join(new_group_path, "Presenter")
30
+ presenter_group = new_group.new_group("Presenter", associate_path_to_group ? presenter_group_path : nil)
14
31
 
15
- ui_group = new_group.new_group("UI")
16
- ui_group.new_group("View")
17
- view_controller_group = ui_group.new_group("ViewController")
18
- presenter_group = new_group.new_group("Presenter")
19
- model_group = new_group.new_group("Model")
32
+ model_group_path = File.join(new_group_path, "Model")
33
+ model_group = new_group.new_group("Model", associate_path_to_group ? model_group_path : nil)
20
34
 
21
- file_creator = FileCreator.new(@parser.source_path, options)
22
- target = @parser.main_target
35
+ file_creator = FileCreator.new(options)
36
+ target = @parser.app_target
23
37
  file_creator.create_file(presenter_name, 'ViewContract', ui_group, target)
24
38
  file_creator.create_file(presenter_name, 'ViewController', view_controller_group, target)
25
39
  file_creator.create_file(presenter_name, 'Presenter', presenter_group, target)
26
40
  file_creator.create_file(presenter_name, 'PresenterImplementation', presenter_group, target)
41
+ file_creator.create_empty_directory(model_group)
42
+ file_creator.create_empty_directory(view_group)
27
43
 
28
44
  file_creator.print_file_content(presenter_name, 'DependencyProvider')
29
45
  file_creator.print_file_content(presenter_name, 'PresenterAssembly')
@@ -3,24 +3,32 @@ require_relative "pbxproj_parser"
3
3
 
4
4
  class RepositoryGenerator
5
5
 
6
- def initialize(parser)
6
+ def initialize(parser, config)
7
7
  @parser = parser
8
+ @config = config
8
9
  end
9
10
 
10
11
  def generate(repository_name, options = {})
11
- core_group = @parser.core_group
12
- core_data_group = core_group["Data"]
13
- data_group = @parser.data_group
14
- raise "[Error] Group #{repository_name} already exists in #{core_data_group.display_name}" if core_data_group[repository_name]
15
- core_data_new_group = core_data_group.new_group(repository_name)
12
+ core_group = @parser.repository_core_group
13
+ data_group = @parser.repository_data_group
14
+
15
+ raise "[Error] Group #{repository_name} already exists in #{core_group.display_name}" if core_group[repository_name]
16
+ associate_path_to_group = !core_group.path.nil?
17
+ core_data_new_group_path = File.join(core_group.real_path, repository_name)
18
+ core_data_new_group = core_group.new_group(repository_name, associate_path_to_group ? core_data_new_group_path : nil)
16
19
 
17
20
  raise "[Error] Group #{repository_name} already exists in #{data_group.display_name}" if data_group[repository_name]
18
- data_new_group = data_group.new_group(repository_name)
21
+ associate_path_to_group = !data_group.path.nil?
22
+ data_new_group_path = File.join(data_group.real_path, repository_name)
23
+ data_new_group = data_group.new_group(repository_name, associate_path_to_group ? data_new_group_path : nil)
24
+
25
+ file_creator = FileCreator.new(options)
26
+ core_target = @parser.core_target
27
+ file_creator.create_file(repository_name, 'Repository', core_data_new_group, core_target)
19
28
 
20
- file_creator = FileCreator.new(@parser.source_path, options)
21
- target = @parser.main_target
22
- file_creator.create_file(repository_name, 'Repository', core_data_new_group, target)
23
- file_creator.create_file(repository_name, 'RepositoryImplementation', data_new_group, target)
29
+ file_creator = FileCreator.new(options)
30
+ data_target = @parser.data_target
31
+ file_creator.create_file(repository_name, 'RepositoryImplementation', data_new_group, data_target)
24
32
 
25
33
  file_creator.print_file_content(repository_name, 'RepositoryAssembly')
26
34
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ccios
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre Felgines
@@ -59,15 +59,19 @@ executables:
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - ".github/workflows/ruby.yml"
62
63
  - ".gitignore"
64
+ - CHANGELOG.md
63
65
  - Gemfile
64
66
  - Gemfile.lock
67
+ - Makefile
65
68
  - README.md
66
69
  - Rakefile
67
70
  - bin/ccios
68
71
  - ccios.gemspec
69
72
  - lib/ccios.rb
70
73
  - lib/ccios/code_templater.rb
74
+ - lib/ccios/config.rb
71
75
  - lib/ccios/coordinator_generator.rb
72
76
  - lib/ccios/file_creator.rb
73
77
  - lib/ccios/interactor_generator.rb
@@ -106,8 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
110
  - !ruby/object:Gem::Version
107
111
  version: '0'
108
112
  requirements: []
109
- rubyforge_project:
110
- rubygems_version: 2.7.6
113
+ rubygems_version: 3.0.3
111
114
  signing_key:
112
115
  specification_version: 4
113
116
  summary: Clean Code iOS Generator