ccios 5.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0173944aad4daed89817a5a20eb66ebeb7cacb57d96f6bd1ab60ff79569680b
4
- data.tar.gz: 927fecdf93f40d5636a1fcdefa173410b307ece874ffc6015ec9bb6e405cd7af
3
+ metadata.gz: dc6f5c81e7b9f2abf46e0f373717896e51762b3565f616205bd6a666d888fc65
4
+ data.tar.gz: 0f8661b91001f98ebe5e6435e8572bf1d671d871a22c120d85d29783d294cb36
5
5
  SHA512:
6
- metadata.gz: 35a7291a319e2384a3c25662d58925dc8a77ca459fabc606a16d84ed257618f03584c42eb7dfd98d3103e3f2b3b2ceabcfe0a5663397c16d58a98e7b18e2b9c7
7
- data.tar.gz: 5a254c0e5d56a4f9076da36dabab143673ae58a12351fc93eccb30ab7a1f07a9d240ee97f500d1a5023b210fcaf6fc6fbaa25507bca0257786fb79b97c31eabd
6
+ metadata.gz: 7113bdee060f5d5808bb43951a0e0485b45cc058d857ccd0c64e36702a6418ed893e62a6a1dc9695ffa2c770c177931b9705a533cf2f2f8727bbabbbe0c25244
7
+ data.tar.gz: b0d3109396e17b9d8d3b4979901b3c2b6183de19da7df9f60ad784d6e0c7b26b6da9a730f6f0c607f4fd344634d8ca9f1ae505207f86131e677261fee451a4a1
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.2.2
1
+ 3.3.0
data/CHANGELOG.md CHANGED
@@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [5.1.0]
8
+
9
+ ### Changed
10
+
11
+ - Target variable is now optional, an empty string or an unset value will use the first target of the project. This change allows templates to not overrides global target settings in `.ccios.yml`
12
+ - When multiple targets are provided for a file, `{{project_name}}` will now be replaced by the name of the project instead of the name of the first target
13
+ - `@MainActor` has been added to relevent files in Coordinator and Presenter templates to improve Swift 6 support
14
+ - dependency provider snippets has been updated to handle Swift 6 issue (see [this issue](https://github.com/Swinject/Swinject/issues/571) for why this is required)
15
+
7
16
  ## [5.0.0]
8
17
 
9
18
  This release is an entire rewrite of the templating system, allowing customization of template and settings.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ccios (5.0.0)
4
+ ccios (5.1.0)
5
5
  activesupport (> 4)
6
6
  mustache (~> 1.0)
7
7
  xcodeproj (~> 1.4)
@@ -9,33 +9,52 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- CFPropertyList (3.0.6)
12
+ CFPropertyList (3.0.7)
13
+ base64
14
+ nkf
13
15
  rexml
14
- activesupport (7.0.8)
15
- concurrent-ruby (~> 1.0, >= 1.0.2)
16
+ activesupport (8.0.1)
17
+ base64
18
+ benchmark (>= 0.3)
19
+ bigdecimal
20
+ concurrent-ruby (~> 1.0, >= 1.3.1)
21
+ connection_pool (>= 2.2.5)
22
+ drb
16
23
  i18n (>= 1.6, < 2)
24
+ logger (>= 1.4.2)
17
25
  minitest (>= 5.1)
18
- tzinfo (~> 2.0)
26
+ securerandom (>= 0.3)
27
+ tzinfo (~> 2.0, >= 2.0.5)
28
+ uri (>= 0.13.1)
19
29
  atomos (0.1.3)
30
+ base64 (0.2.0)
31
+ benchmark (0.4.0)
32
+ bigdecimal (3.1.9)
20
33
  claide (1.1.0)
21
34
  colored2 (3.1.2)
22
- concurrent-ruby (1.2.2)
23
- i18n (1.14.1)
35
+ concurrent-ruby (1.3.5)
36
+ connection_pool (2.5.0)
37
+ drb (2.2.1)
38
+ i18n (1.14.7)
24
39
  concurrent-ruby (~> 1.0)
25
- minitest (5.20.0)
40
+ logger (1.6.6)
41
+ minitest (5.25.4)
26
42
  mustache (1.1.1)
27
- nanaimo (0.3.0)
28
- rake (12.3.3)
29
- rexml (3.2.6)
43
+ nanaimo (0.4.0)
44
+ nkf (0.2.0)
45
+ rake (13.2.1)
46
+ rexml (3.4.1)
47
+ securerandom (0.4.1)
30
48
  tzinfo (2.0.6)
31
49
  concurrent-ruby (~> 1.0)
32
- xcodeproj (1.23.0)
50
+ uri (1.0.3)
51
+ xcodeproj (1.27.0)
33
52
  CFPropertyList (>= 2.3.3, < 4.0)
34
53
  atomos (~> 0.1.3)
35
54
  claide (>= 1.0.2, < 2.0)
36
55
  colored2 (~> 3.1)
37
- nanaimo (~> 0.3.0)
38
- rexml (~> 3.2.4)
56
+ nanaimo (~> 0.4.0)
57
+ rexml (>= 3.3.6, < 4.0)
39
58
 
40
59
  PLATFORMS
41
60
  ruby
@@ -43,7 +62,7 @@ PLATFORMS
43
62
  DEPENDENCIES
44
63
  ccios!
45
64
  minitest (~> 5.11)
46
- rake (~> 12.3)
65
+ rake (~> 13.2)
47
66
 
48
67
  BUNDLED WITH
49
68
  2.4.10
data/MAINTAINER.md ADDED
@@ -0,0 +1,8 @@
1
+
2
+ ## How to release a new version
3
+
4
+ - Create the release branch `release/vA.B.C`
5
+ - Complete the changelog and add the new vertion title
6
+ - Update the version in ccios.gemspec & run `bundle install`
7
+ - Create a Pull Request
8
+ - Once merged, create a tag `A.B.C` on the merged commit
data/README.md CHANGED
@@ -138,6 +138,7 @@ templates_collection: ccios/templates
138
138
  # Global overrides of variables [Optional]
139
139
  variables:
140
140
  project: Project.xcodeproj
141
+ target: SomeDefaultTarget
141
142
 
142
143
  # Per template variables override
143
144
  templates_config:
@@ -224,8 +225,8 @@ variables:
224
225
  project: "*.xcodeproj"
225
226
  # The base path used to generate an element. This variable must be defined once here, or on each elements below.
226
227
  base_path: "path/to/base_group"
227
- # The target in which files are added. Can be a string, a list of strings, or an empty string. This variable must be defined once here, or on each elements below. If an empty string is provided, it will use the first target found in the Xcode project.
228
- target: ""
228
+ # The target in which files are added. Can be a string, a list of strings, or an empty string. This variable must be defined once here, or on each elements below. If this variable is not set or if an empty string is provided, it will use the first target found in the Xcode project. If present it will override the global default target. [Optional]
229
+ target: "SomeTarget"
229
230
  # List of generated elements. [Required]
230
231
  # Each element can be a file (using `file`), or an empty folder (using `group`)
231
232
  generated_elements:
data/ccios.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'ccios'
3
- s.version = '5.0.0'
3
+ s.version = '5.1.0'
4
4
  s.executables << 'ccios'
5
5
  s.date = '2016-08-03'
6
6
  s.summary = "Clean Code iOS Generator"
@@ -15,6 +15,6 @@ Gem::Specification.new do |s|
15
15
  s.add_dependency 'xcodeproj', '~> 1.4'
16
16
  s.add_dependency "mustache", "~> 1.0"
17
17
 
18
- s.add_development_dependency 'rake', '~> 12.3'
18
+ s.add_development_dependency 'rake', '~> 13.2'
19
19
  s.add_development_dependency 'minitest', '~> 5.11'
20
20
  end
@@ -15,6 +15,13 @@ class Xcodeproj::Project::Object::PBXGroup
15
15
  end
16
16
  end
17
17
 
18
+ class Xcodeproj::Project
19
+
20
+ def project_name_from_path
21
+ File.basename(@path, File.extname(@path))
22
+ end
23
+ end
24
+
18
25
  class FileCreator
19
26
 
20
27
  def self.logger
@@ -25,12 +32,16 @@ class FileCreator
25
32
  FileCreator.logger
26
33
  end
27
34
 
28
- def templater_options(target)
35
+ def templater_options(targets, project)
29
36
  defaults = {
30
- project_name: target.display_name,
31
37
  full_username: git_username,
32
38
  date: DateTime.now.strftime("%d/%m/%Y"),
33
39
  }
40
+ if targets.count == 1
41
+ defaults["project_name"] = targets[0].display_name
42
+ else
43
+ defaults["project_name"] = project.project_name_from_path
44
+ end
34
45
  defaults
35
46
  end
36
47
 
@@ -44,7 +55,7 @@ class FileCreator
44
55
  tags
45
56
  end
46
57
 
47
- def create_file_using_template_path(template_path, generated_filename, group, targets, context)
58
+ def create_file_using_template_path(template_path, generated_filename, group, targets, project, context)
48
59
  file_path = File.join(group.real_path, generated_filename)
49
60
 
50
61
  raise "File #{file_path} already exists" if File.exist?(file_path)
@@ -52,7 +63,7 @@ class FileCreator
52
63
  FileUtils.mkdir_p dirname unless File.directory?(dirname)
53
64
  file = File.new(file_path, 'w')
54
65
 
55
- context = context.merge(templater_options(targets[0]))
66
+ context = context.merge(templater_options(targets, project))
56
67
  file_content = CodeTemplater.new.render_file_content_from_template(template_path, generated_filename, context)
57
68
 
58
69
  file.puts(file_content)
@@ -37,7 +37,7 @@ class FileTemplateDefinition
37
37
  raise "Base path \"#{base_path}\" is missing" if base_group.nil?
38
38
 
39
39
  target_name = merged_variables["target"]
40
- if target_name.is_a?(String)
40
+ if target_name.is_a?(String) || target_name.nil?
41
41
  target = parser.target_for(project, target_name)
42
42
  raise "Unable to find target \"#{target_name}\"" if target.nil?
43
43
  elsif target_name.is_a?(Array)
@@ -77,7 +77,7 @@ class FileTemplateDefinition
77
77
  target_name = merged_variables["target"]
78
78
 
79
79
  targets = []
80
- if target_name.is_a?(String)
80
+ if target_name.is_a?(String) || target_name.nil?
81
81
  targets = [parser.target_for(project, target_name)]
82
82
  elsif target_name.is_a?(Array)
83
83
  targets = target_name.map { |name| parser.target_for(project, name) }
@@ -88,6 +88,7 @@ class FileTemplateDefinition
88
88
  generated_filename,
89
89
  group,
90
90
  targets,
91
+ project,
91
92
  context
92
93
  )
93
94
  end
@@ -27,7 +27,7 @@ class PBXProjParser
27
27
  end
28
28
 
29
29
  def target_for(project, target_name)
30
- if target_name.blank?
30
+ if target_name.blank? || target_name.nil?
31
31
  project.targets.find { |t| t.product_type == "com.apple.product-type.application" }
32
32
  else
33
33
  project.targets.find { |t| t.name == target_name }
@@ -10,6 +10,7 @@ import Foundation
10
10
  import ADCoordinator
11
11
 
12
12
  {{#generate_delegate}}
13
+ @MainActor
13
14
  protocol {{name}}CoordinatorDelegate: AnyObject {
14
15
 
15
16
  }
@@ -23,8 +24,10 @@ class {{name}}Coordinator: Coordinator {
23
24
  private let dependencyProvider: ApplicationDependencyProvider
24
25
  private unowned var navigationController: UINavigationController
25
26
 
26
- init(navigationController: UINavigationController,
27
- dependencyProvider: ApplicationDependencyProvider) {
27
+ init(
28
+ navigationController: UINavigationController,
29
+ dependencyProvider: ApplicationDependencyProvider
30
+ ) {
28
31
  self.navigationController = navigationController
29
32
  self.dependencyProvider = dependencyProvider
30
33
  }
@@ -3,7 +3,6 @@ description: "Generate NameCoordinator"
3
3
  variables:
4
4
  project: "*.xcodeproj"
5
5
  base_path: "Coordinator"
6
- target: ""
7
6
  parameters:
8
7
  - argument: "name"
9
8
  removeSuffix: "Coordinator"
@@ -10,9 +10,9 @@ import Foundation
10
10
 
11
11
  public class {{name}}InteractorImplementation: {{name}}Interactor {
12
12
 
13
- public init() {
13
+ public init() {
14
14
 
15
- }
15
+ }
16
16
 
17
17
  // MARK: - {{name}}Interactor
18
18
 
@@ -6,7 +6,6 @@ parameters:
6
6
  variables:
7
7
  project: "*.xcodeproj"
8
8
  base_path: "Core/Interactor"
9
- target: ""
10
9
  generated_elements:
11
10
  - name: "interactor"
12
11
  file: "{{ name }}Interactor/{{ name }}Interactor.swift"
@@ -2,13 +2,17 @@
2
2
  func {{lowercased_name}}Presenter(viewContract: {{name}}ViewContract, presenterDelegate: {{name}}PresenterDelegate) -> {{name}}Presenter? {
3
3
  return presenterAssembler
4
4
  .resolver
5
- .resolve({{name}}Presenter.self, arguments: viewContract, presenterDelegate)
5
+ .resolve(
6
+ {{name}}Presenter.self,
7
+ arguments: viewContract as {{name}}ViewContract,
8
+ presenterDelegate as {{name}}PresenterDelegate
9
+ )
6
10
  }
7
11
  {{/generate_delegate}}
8
12
  {{^generate_delegate}}
9
13
  func {{lowercased_name}}Presenter(viewContract: {{name}}ViewContract) -> {{name}}Presenter? {
10
14
  return presenterAssembler
11
15
  .resolver
12
- .resolve({{name}}Presenter.self, argument: viewContract)
16
+ .resolve({{name}}Presenter.self, argument: viewContract as {{name}}ViewContract)
13
17
  }
14
18
  {{/generate_delegate}}
@@ -8,11 +8,13 @@
8
8
 
9
9
  import Foundation
10
10
 
11
+ @MainActor
11
12
  protocol {{name}}Presenter {
12
13
  func start()
13
14
  }
14
15
  {{#generate_delegate}}
15
16
 
17
+ @MainActor
16
18
  protocol {{name}}PresenterDelegate: AnyObject {
17
19
 
18
20
  }
@@ -15,6 +15,8 @@ class {{name}}PresenterImplementation: {{name}}Presenter {
15
15
  private weak var delegate: {{name}}PresenterDelegate?
16
16
  {{/generate_delegate}}
17
17
 
18
+ // MARK: - Lifecycle
19
+
18
20
  {{#generate_delegate}}
19
21
  init(viewContract: {{name}}ViewContract, delegate: {{name}}PresenterDelegate) {
20
22
  self.viewContract = viewContract
@@ -30,6 +32,7 @@ class {{name}}PresenterImplementation: {{name}}Presenter {
30
32
  // MARK: - {{name}}Presenter
31
33
 
32
34
  func start() {
33
-
35
+ let viewModel = {{name}}ViewModelMapper().map()
36
+ viewContract?.configure(with: viewModel)
34
37
  }
35
38
  }
@@ -11,7 +11,6 @@ parameters:
11
11
  variables:
12
12
  project: "*.xcodeproj"
13
13
  base_path: "App"
14
- target: ""
15
14
  generated_elements:
16
15
  - name: "ui_view_group"
17
16
  group: "{{ name }}/UI/View"
@@ -32,8 +31,13 @@ generated_elements:
32
31
  file: "{{ name }}/Presenter/{{ name }}PresenterImplementation.swift"
33
32
  template: "presenter_implementation"
34
33
  variables: {}
35
- - name: "model_group"
36
- group: "{{ name }}/Model"
34
+ - name: "view_model"
35
+ file: "{{ name }}/Model/{{ name }}ViewModel.swift"
36
+ template: "view_model"
37
+ variables: {}
38
+ - name: "view_model_mapper"
39
+ file: "{{ name }}/Model/Mapper/{{ name }}ViewModelMapper.swift"
40
+ template: "view_model_mapper"
37
41
  variables: {}
38
42
  code_snippets:
39
43
  - name: DependencyProvider
@@ -45,5 +49,7 @@ template_file_source:
45
49
  view_contract: "view_contract.mustache"
46
50
  presenter: "presenter.mustache"
47
51
  presenter_implementation: "presenter_implementation.mustache"
52
+ view_model: "view_model.mustache"
53
+ view_model_mapper: "view_model_mapper.mustache"
48
54
  dependency_provider: "dependency_provider.mustache"
49
55
  presenter_assembly: "presenter_assembly.mustache"
@@ -8,6 +8,7 @@
8
8
 
9
9
  import Foundation
10
10
 
11
+ @MainActor
11
12
  protocol {{name}}ViewContract: AnyObject {
12
-
13
+ func configure(with viewModel: {{name}}ViewModel)
13
14
  }
@@ -12,6 +12,8 @@ import UIKit
12
12
  class {{name}}ViewController: SharedViewController, {{name}}ViewContract {
13
13
  var presenter: {{name}}Presenter?
14
14
 
15
+ // MARK: - Lifecycle
16
+
15
17
  override func viewDidLoad() {
16
18
  super.viewDidLoad()
17
19
  presenter?.start()
@@ -19,4 +21,6 @@ class {{name}}ViewController: SharedViewController, {{name}}ViewContract {
19
21
 
20
22
  // MARK: - {{name}}ViewContract
21
23
 
24
+ func configure(with viewModel: {{name}}ViewModel) {
25
+ }
22
26
  }
@@ -0,0 +1,12 @@
1
+ //
2
+ // {{name}}ViewModel.swift
3
+ // {{project_name}}
4
+ //
5
+ // Created by {{full_username}} on {{date}}.
6
+ //
7
+ //
8
+
9
+ import Foundation
10
+
11
+ struct {{name}}ViewModel {
12
+ }
@@ -0,0 +1,16 @@
1
+ //
2
+ // {{name}}ViewModelMapper.swift
3
+ // {{project_name}}
4
+ //
5
+ // Created by {{full_username}} on {{date}}.
6
+ //
7
+ //
8
+
9
+ import Foundation
10
+
11
+ struct {{name}}ViewModelMapper {
12
+
13
+ func map() -> {{name}}ViewModel {
14
+ {{name}}ViewModel()
15
+ }
16
+ }
@@ -5,7 +5,6 @@ parameters:
5
5
  removeSuffix: "Repository"
6
6
  variables:
7
7
  project: "*.xcodeproj"
8
- target: ""
9
8
  generated_elements:
10
9
  - name: "repository"
11
10
  file: "{{ name }}/{{ name }}Repository.swift"
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: 5.0.0
4
+ version: 5.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre Felgines
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '12.3'
61
+ version: '13.2'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '12.3'
68
+ version: '13.2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: minitest
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -93,6 +93,7 @@ files:
93
93
  - CHANGELOG.md
94
94
  - Gemfile
95
95
  - Gemfile.lock
96
+ - MAINTAINER.md
96
97
  - Makefile
97
98
  - README.md
98
99
  - Rakefile
@@ -122,6 +123,8 @@ files:
122
123
  - lib/ccios/templates/Presenter/template.yml
123
124
  - lib/ccios/templates/Presenter/view_contract.mustache
124
125
  - lib/ccios/templates/Presenter/view_controller.mustache
126
+ - lib/ccios/templates/Presenter/view_model.mustache
127
+ - lib/ccios/templates/Presenter/view_model_mapper.mustache
125
128
  - lib/ccios/templates/Repository/repository.mustache
126
129
  - lib/ccios/templates/Repository/repository_assembly.mustache
127
130
  - lib/ccios/templates/Repository/repository_implementation.mustache
@@ -156,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
159
  - !ruby/object:Gem::Version
157
160
  version: '0'
158
161
  requirements: []
159
- rubygems_version: 3.5.6
162
+ rubygems_version: 3.5.3
160
163
  signing_key:
161
164
  specification_version: 4
162
165
  summary: Clean Code iOS Generator