xcake 0.6.19 → 0.6.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -1
  3. data/CHANGELOG.md +12 -1
  4. data/Gemfile.lock +8 -50
  5. data/README.md +1 -1
  6. data/Rakefile +3 -3
  7. data/_rubocop.yml +1 -1
  8. data/bin/console +2 -2
  9. data/bin/xcake +1 -1
  10. data/docs/Cakefile.md +17 -10
  11. data/docs/Xcode Project Support.md +1 -0
  12. data/fastlane-plugin-xcake/README.md +1 -1
  13. data/fastlane-plugin-xcake/Rakefile +3 -3
  14. data/fastlane-plugin-xcake/fastlane-plugin-xcake.gemspec +5 -5
  15. data/fastlane-plugin-xcake/lib/fastlane/plugin/xcake/actions/xcake_action.rb +3 -3
  16. data/lib/xcake/command/init.rb +4 -4
  17. data/lib/xcake/command/make.rb +7 -18
  18. data/lib/xcake/command.rb +5 -6
  19. data/lib/xcake/configurable.rb +24 -10
  20. data/lib/xcake/configuration/proxies/preproccessor_definitions_setting_proxy.rb +1 -1
  21. data/lib/xcake/configuration/sugar.rb +7 -7
  22. data/lib/xcake/configuration.rb +3 -4
  23. data/lib/xcake/context/xcodeproj_context.rb +10 -7
  24. data/lib/xcake/context.rb +3 -0
  25. data/lib/xcake/core_ext/array.rb +5 -0
  26. data/lib/xcake/core_ext/object.rb +7 -0
  27. data/lib/xcake/core_ext/string.rb +3 -3
  28. data/lib/xcake/dependency.rb +4 -9
  29. data/lib/xcake/dependency_provider.rb +11 -16
  30. data/lib/xcake/file_reference_installer/compile_source_file_reference_installer.rb +1 -2
  31. data/lib/xcake/file_reference_installer/compile_xcdatamodeld_file_reference_installer.rb +2 -5
  32. data/lib/xcake/file_reference_installer/copy_resources_file_reference_installer.rb +3 -4
  33. data/lib/xcake/file_reference_installer/copy_xcassets_file_reference_installer.rb +2 -5
  34. data/lib/xcake/file_reference_installer/link_library_file_reference_installer.rb +9 -3
  35. data/lib/xcake/file_reference_installer.rb +8 -4
  36. data/lib/xcake/generator/configuration_generator.rb +6 -15
  37. data/lib/xcake/generator/project_generator.rb +2 -3
  38. data/lib/xcake/generator/project_metadata_generator.rb +1 -1
  39. data/lib/xcake/generator/project_structure_generator.rb +2 -8
  40. data/lib/xcake/generator/scheme_generator.rb +1 -3
  41. data/lib/xcake/generator/target_build_phase_generator.rb +8 -10
  42. data/lib/xcake/generator/target_custom_build_phase_generator.rb +0 -1
  43. data/lib/xcake/generator/target_file_reference_generator.rb +6 -14
  44. data/lib/xcake/generator/target_framework_generator.rb +3 -1
  45. data/lib/xcake/generator/target_library_generator.rb +3 -3
  46. data/lib/xcake/generator.rb +4 -3
  47. data/lib/xcake/informative.rb +3 -4
  48. data/lib/xcake/node.rb +11 -17
  49. data/lib/xcake/plugin.rb +8 -16
  50. data/lib/xcake/project/hooks.rb +1 -1
  51. data/lib/xcake/project/sugar.rb +12 -13
  52. data/lib/xcake/project.rb +3 -5
  53. data/lib/xcake/resources/Cakefile +2 -2
  54. data/lib/xcake/target/sugar.rb +1 -1
  55. data/lib/xcake/target.rb +22 -23
  56. data/lib/xcake/ui.rb +0 -3
  57. data/lib/xcake/version.rb +1 -1
  58. data/lib/xcake/visitor.rb +0 -1
  59. data/lib/xcake/xcode/project.rb +162 -135
  60. data/lib/xcake/xcode/scheme_list.rb +9 -11
  61. data/lib/xcake.rb +36 -58
  62. data/xcake.gemspec +20 -22
  63. metadata +8 -21
  64. data/lib/xcake/file_reference_installer/xcconfig_file_reference_installer.rb +0 -17
@@ -1,8 +1,7 @@
1
- require "xcodeproj"
1
+ require 'xcodeproj'
2
2
 
3
3
  module Xcake
4
4
  class Project
5
-
6
5
  # Passes the project instance to a block. This is used to easily modify the
7
6
  # properties of the project in the DSL.
8
7
  #
@@ -10,8 +9,8 @@ module Xcake
10
9
  # @param [Proc] block
11
10
  # an optional block that configures the project through the DSL.
12
11
  #
13
- def project(&block)
14
- block.call(self) if block_given?
12
+ def project
13
+ yield(self) if block_given?
15
14
  self
16
15
  end
17
16
 
@@ -32,14 +31,14 @@ module Xcake
32
31
  # @return [Target] the application target
33
32
  # the newly created application target
34
33
  #
35
- def application_for(platform, deployment_target, language = :objc, &block)
34
+ def application_for(platform, deployment_target, language = :objc)
36
35
  target do |t|
37
36
  t.type = :application
38
37
  t.platform = platform
39
38
  t.deployment_target = deployment_target
40
39
  t.language = language
41
40
 
42
- block.call(t) if block_given?
41
+ yield(t) if block_given?
43
42
  end
44
43
  end
45
44
 
@@ -54,7 +53,7 @@ module Xcake
54
53
  # @return [Target] the unit test target
55
54
  # the newly created unit test target
56
55
  #
57
- def unit_tests_for(host_target, &block)
56
+ def unit_tests_for(host_target)
58
57
  target do |t|
59
58
  t.name = "#{host_target.name}Tests"
60
59
 
@@ -65,13 +64,13 @@ module Xcake
65
64
 
66
65
  host_path = "#{host_target.name}.app/#{host_target.name}"
67
66
  t.all_configurations.each do |c|
68
- c.settings["TEST_HOST"] = "$(BUILT_PRODUCTS_DIR)/#{host_path}"
67
+ c.settings['TEST_HOST'] = "$(BUILT_PRODUCTS_DIR)/#{host_path}"
69
68
  end
70
69
  t.all_configurations.each do |c|
71
- c.settings["BUNDLE_LOADER"] = "$(TEST_HOST)"
70
+ c.settings['BUNDLE_LOADER'] = '$(TEST_HOST)'
72
71
  end
73
72
 
74
- block.call(t) if block_given?
73
+ yield(t) if block_given?
75
74
  end
76
75
  end
77
76
 
@@ -85,7 +84,7 @@ module Xcake
85
84
  #
86
85
  # @return Void
87
86
  #
88
- def watch_app_for(host_target, deployment_target, language = :objc, &block)
87
+ def watch_app_for(host_target, deployment_target, language = :objc)
89
88
  watch_app_target = target do |t|
90
89
  t.name = "#{host_target.name}-Watch"
91
90
 
@@ -107,9 +106,9 @@ module Xcake
107
106
  host_target.target_dependencies << watch_app_target
108
107
  watch_app_target.target_dependencies << watch_extension_target
109
108
 
110
- block.call(watch_app_target, watch_extension_target) if block_given?
109
+ yield(watch_app_target, watch_extension_target) if block_given?
111
110
 
112
- return nil
111
+ nil
113
112
  end
114
113
  end
115
114
  end
data/lib/xcake/project.rb CHANGED
@@ -8,7 +8,6 @@ module Xcake
8
8
  # The Project creates a hiearchy of targets and configurations
9
9
  # necessary to generate a xcode project.
10
10
  class Project
11
-
12
11
  include Configurable
13
12
  include Visitable
14
13
 
@@ -47,12 +46,11 @@ module Xcake
47
46
  # c.application_for :ios, 8.0
48
47
  # end
49
48
  #
50
- def initialize(name="Project", &block)
51
-
49
+ def initialize(name = 'Project')
52
50
  self.name = name
53
51
  self.targets = []
54
52
 
55
- block.call(self) if block_given?
53
+ yield(self) if block_given?
56
54
  end
57
55
 
58
56
  # @!group Working with a project
@@ -68,7 +66,7 @@ module Xcake
68
66
  def target(&block)
69
67
  target = Target.new(project, &block)
70
68
 
71
- self.targets << target
69
+ targets << target
72
70
  target
73
71
  end
74
72
 
@@ -1,5 +1,5 @@
1
1
  # Change this to set a different Project file name
2
- #project.project_name = "Project"
2
+ #project.name = "Project"
3
3
 
4
4
  # Replace this with your class prefix for Objective-C files.
5
5
  project.class_prefix = "APP"
@@ -24,7 +24,7 @@ application_for :ios, 8.0 do |target|
24
24
  #
25
25
  # File patterns can be seen here https://guides.cocoapods.org/syntax/podspec.html#group_file_patterns
26
26
  #
27
- #target.all_configurations.each { |c| .supported_devices = :iphone_only}
27
+ #target.all_configurations.each { |c| c.supported_devices = :iphone_only}
28
28
 
29
29
  # Uncomment this to include additional files
30
30
  #
@@ -1,4 +1,4 @@
1
- require "xcodeproj"
1
+ require 'xcodeproj'
2
2
 
3
3
  module Xcake
4
4
  class Target
data/lib/xcake/target.rb CHANGED
@@ -175,12 +175,11 @@ module Xcake
175
175
  # t.name "test"
176
176
  # end
177
177
  #
178
- def initialize(project, &block)
179
-
178
+ def initialize(project)
180
179
  @project = project
181
180
  @build_phases = []
182
181
 
183
- block.call(self) if block_given?
182
+ yield(self) if block_given?
184
183
  end
185
184
 
186
185
  def include_files
@@ -192,7 +191,7 @@ module Xcake
192
191
  end
193
192
 
194
193
  def system_frameworks
195
- @system_frameworks ||= default_system_frameworks_for self.platform
194
+ @system_frameworks ||= default_system_frameworks_for platform
196
195
  end
197
196
 
198
197
  def system_libraries
@@ -214,19 +213,19 @@ module Xcake
214
213
  def default_system_frameworks_for(platform)
215
214
  case platform
216
215
  when :ios
217
- ['Foundation', 'UIKit']
216
+ %w(Foundation UIKit)
218
217
  when :osx
219
218
  ['Cocoa']
220
219
  when :tvos
221
- ['Foundation', 'UIKit']
220
+ %w(Foundation UIKit)
222
221
  when :watchos
223
- ['Foundation', 'UIKit', 'WatchKit']
222
+ %w(Foundation UIKit WatchKit)
224
223
  else
225
- abort "Platform not supported!"
224
+ abort 'Platform not supported!'
226
225
  end
227
226
  end
228
227
 
229
- #Configurable
228
+ # Configurable
230
229
 
231
230
  def parent_configurable
232
231
  @project
@@ -236,27 +235,27 @@ module Xcake
236
235
  # into here?
237
236
  def default_settings
238
237
  {
239
- "INFOPLIST_FILE" => "#{name}/Supporting Files/Info.plist"
238
+ 'INFOPLIST_FILE' => "#{name}/Supporting Files/Info.plist"
240
239
  }
241
240
  end
242
241
 
243
242
  def default_debug_settings
244
- Xcodeproj::Project::ProjectHelper.
245
- common_build_settings(:debug,
246
- platform,
247
- deployment_target.to_s,
248
- type,
249
- language).merge!(default_settings)
243
+ Xcodeproj::Project::ProjectHelper
244
+ .common_build_settings(:debug,
245
+ platform,
246
+ deployment_target.to_s,
247
+ type,
248
+ language).merge!(default_settings)
250
249
  end
251
250
 
252
251
  def default_release_settings
253
- Xcodeproj::Project::ProjectHelper.
254
- common_build_settings(:release,
255
- platform,
256
- deployment_target.to_s,
257
- type,
258
- language).
259
- merge!(default_settings)
252
+ Xcodeproj::Project::ProjectHelper
253
+ .common_build_settings(:release,
254
+ platform,
255
+ deployment_target.to_s,
256
+ type,
257
+ language)
258
+ .merge!(default_settings)
260
259
  end
261
260
  end
262
261
  end
data/lib/xcake/ui.rb CHANGED
@@ -1,7 +1,4 @@
1
- require "molinillo"
2
-
3
1
  module Xcake
4
2
  class UI
5
- include Molinillo::UI
6
3
  end
7
4
  end
data/lib/xcake/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Xcake
2
- VERSION = "0.6.19".freeze
2
+ VERSION = '0.6.20'.freeze
3
3
  end
data/lib/xcake/visitor.rb CHANGED
@@ -27,7 +27,6 @@ module Xcake
27
27
  # end
28
28
  #
29
29
  module Visitor
30
-
31
30
  # This is called when a visitor is visiting a
32
31
  # visitable item.
33
32
  #
@@ -3,144 +3,171 @@ require 'xcodeproj'
3
3
  module Xcake
4
4
  module Xcode
5
5
  class Project < Xcodeproj::Project
6
-
7
- # @return [Hash] the attributes of
8
- # the project
9
- #
10
- def attributes
11
- root_object.attributes
12
- end
13
-
14
- # @return [String] the class name for the project
15
- #
16
- def class_prefix
17
- attributes["CLASSPREFIX"]
18
- end
19
-
20
- # Sets the class prefix for the project
21
- #
22
- # @param [String] value to set
23
- #
24
- # @return [String] the class name for the project
25
- #
26
- def class_prefix=(class_prefix)
27
- attributes["CLASSPREFIX"] = class_prefix
28
- end
29
-
30
- # @return [String] the organization for the project
31
- #
32
- def organization
33
- attributes["ORGANIZATIONNAME"]
34
- end
35
-
36
- # Sets the organization for the project
37
- #
38
- # @param [String] value to set
39
- #
40
- # @return [SchemeList] the organization for the project
41
- #
42
- def organization=(organization)
43
- attributes["ORGANIZATIONNAME"] = organization
44
- end
45
-
46
- # @return [SchemeList] the scheme list
47
- #
48
- def scheme_list
49
- @scheme_list ||= SchemeList.new(self)
50
- end
51
-
52
- def object_version
53
- Xcodeproj::Constants::DEFAULT_OBJECT_VERSION.to_s
54
- end
55
-
56
- def recreate_user_schemes(*)
57
- puts "Creating Schemes..."
58
-
59
- scheme_list.recreate_schemes
60
- scheme_list.save(path)
61
- end
62
-
63
- # Configures the Project for use with Xcake.
64
- # This makes sure we have sensible defaults and
65
- # it as clean as possible.
66
- #
67
- def setup_for_xcake
68
- root_object.remove_referrer(self) if root_object
69
- root_object = new(Project::Object::PBXProject)
70
- root_object.add_referrer(self)
71
-
72
- config_list = new(XCConfigurationList)
73
- root_object.build_configuration_list = config_list
74
-
75
- root_object.main_group = new(PBXGroup)
76
- root_object.product_ref_group = root_object.main_group.new_group('Products')
77
-
78
- @root_object = root_object
79
- end
80
-
81
- # Creates a new xcode target from the target DSL
82
- #
83
- # @param [Target] target
84
- # target DSL to create target from
85
- #
86
- # @return [Target] new xcode target
87
- #
88
- def new_target(target)
89
- native_target = new(Xcodeproj::Project::Object::PBXNativeTarget)
90
- native_target.name = target.name
91
- native_target.product_name = target.name
92
-
93
- case target.type
94
- when Symbol
95
- native_target.product_type = Xcodeproj::Constants::PRODUCT_TYPE_UTI[target.type]
96
- when String
97
- native_target.product_type = target.type
98
- end
99
-
100
- native_target.build_configuration_list = new(Xcodeproj::Project::Object::XCConfigurationList)
101
-
102
- product = self.products_group.new_product_ref_for_target(native_target.product_name, native_target.product_type)
103
- native_target.product_reference = product
104
-
105
- self.targets << native_target
106
- native_target
107
- end
108
-
109
- # Creates a new xcode configuration from the configuration DSL
110
- #
111
- # @param [Configurarion] configuration
112
- # configuration DSL to create target from
113
- #
114
- # @return [Configurarion] new xcode configuration
115
- #
116
- def new_configuration(configuration)
117
- new(Xcodeproj::Project::Object::XCBuildConfiguration)
118
- end
119
-
120
- # Creates a new xcode group from the node
121
- #
122
- # @param [Node] node
123
- # configuration DSL to create target from
124
- #
125
- # @return [Group] new xcode group
126
- #
127
- def new_group(node)
128
- return main_group unless node.parent
129
- main_group.find_subpath(node.parent.path, true)
6
+ # @return [Hash] the attributes of
7
+ # the project
8
+ #
9
+ def attributes
10
+ root_object.attributes
11
+ end
12
+
13
+ # @return [String] the class name for the project
14
+ #
15
+ def class_prefix
16
+ attributes['CLASSPREFIX']
17
+ end
18
+
19
+ # Sets the class prefix for the project
20
+ #
21
+ # @param [String] value to set
22
+ #
23
+ # @return [String] the class name for the project
24
+ #
25
+ def class_prefix=(class_prefix)
26
+ attributes['CLASSPREFIX'] = class_prefix
27
+ end
28
+
29
+ # @return [String] the organization for the project
30
+ #
31
+ def organization
32
+ attributes['ORGANIZATIONNAME']
33
+ end
34
+
35
+ # Sets the organization for the project
36
+ #
37
+ # @param [String] value to set
38
+ #
39
+ # @return [SchemeList] the organization for the project
40
+ #
41
+ def organization=(organization)
42
+ attributes['ORGANIZATIONNAME'] = organization
43
+ end
44
+
45
+ # @return [SchemeList] the scheme list
46
+ #
47
+ def scheme_list
48
+ @scheme_list ||= SchemeList.new(self)
49
+ end
50
+
51
+ def object_version
52
+ Xcodeproj::Constants::DEFAULT_OBJECT_VERSION.to_s
53
+ end
54
+
55
+ def recreate_user_schemes(*)
56
+ puts 'Creating Schemes...'
57
+
58
+ scheme_list.recreate_schemes
59
+ scheme_list.save(path)
60
+ end
61
+
62
+ # Configures the Project for use with Xcake.
63
+ # This makes sure we have sensible defaults and
64
+ # it as clean as possible.
65
+ #
66
+ def setup_for_xcake
67
+ root_object.remove_referrer(self) if root_object
68
+ root_object = new(Project::Object::PBXProject)
69
+ root_object.add_referrer(self)
70
+
71
+ config_list = new(XCConfigurationList)
72
+ root_object.build_configuration_list = config_list
73
+
74
+ root_object.main_group = new(PBXGroup)
75
+ root_object.product_ref_group = root_object.main_group.new_group('Products')
76
+
77
+ @root_object = root_object
78
+ end
79
+
80
+ # Creates a new xcode target from the target DSL
81
+ #
82
+ # @param [Target] target
83
+ # target DSL to create target from
84
+ #
85
+ # @return [Target] new xcode target
86
+ #
87
+ def new_target(target)
88
+ native_target = new(Xcodeproj::Project::Object::PBXNativeTarget)
89
+ native_target.name = target.name
90
+ native_target.product_name = target.name
91
+
92
+ case target.type
93
+ when Symbol
94
+ native_target.product_type = Xcodeproj::Constants::PRODUCT_TYPE_UTI[target.type]
95
+ when String
96
+ native_target.product_type = target.type
130
97
  end
131
98
 
132
- # Finds a unit test target for a xcode target
133
- #
134
- # @param [Target] target
135
- # target to find a xcode target for.
136
- #
137
- # @return [Target] unit test target
138
- #
139
- def find_unit_test_target_for_target(target)
140
- targets.find do |t|
141
- t.name == "#{target.name}Tests"
142
- end
99
+ native_target.build_configuration_list = new(Xcodeproj::Project::Object::XCConfigurationList)
100
+
101
+ product = products_group.new_product_ref_for_target(native_target.product_name, native_target.product_type)
102
+ native_target.product_reference = product
103
+
104
+ targets << native_target
105
+ native_target
106
+ end
107
+
108
+ # Creates a new xcode configuration from the configuration DSL
109
+ #
110
+ # @param [Configurarion] configuration
111
+ # configuration DSL to create target from
112
+ #
113
+ # @return [Configurarion] new xcode configuration
114
+ #
115
+ def new_configuration(_configuration)
116
+ new(Xcodeproj::Project::Object::XCBuildConfiguration)
117
+ end
118
+
119
+ # Creates a new xcode group from the node
120
+ #
121
+ # @param [Node] node
122
+ # configuration DSL to create target from
123
+ #
124
+ # @return [Group] new xcode group
125
+ #
126
+ #
127
+ # TODO: Simplify this method figure out more reliable rules for group
128
+ # generation - maybe part of the new file installer in 0.7.
129
+ #
130
+ def new_group(node)
131
+ return main_group unless node.parent
132
+
133
+ group = main_group unless node.parent
134
+ group = main_group.find_subpath(node.parent.path, true) unless group
135
+ ensure_parent_path(group, node.parent)
136
+
137
+ group
138
+ end
139
+
140
+ # Creates a new xcode file reference from the node
141
+ #
142
+ # @param [String] path
143
+ # => path of the file reference from the source root
144
+ #
145
+ # @return [PBXFileReference] new xcode file refrence
146
+ #
147
+ def new_file_reference(path)
148
+ path_object = Pathname.new(path)
149
+ group = main_group.find_subpath(path_object.dirname.to_s, true)
150
+ group[path_object.basename.to_s] ||
151
+ group.new_reference(path_object.to_s)
152
+ end
153
+
154
+ def ensure_parent_path(group, node)
155
+ group.path = node.component
156
+ ensure_parent_path(group.parent, node.parent) unless node.parent.nil?
157
+ end
158
+
159
+ # Finds a unit test target for a xcode target
160
+ #
161
+ # @param [Target] target
162
+ # target to find a xcode target for.
163
+ #
164
+ # @return [Target] unit test target
165
+ #
166
+ def find_unit_test_target_for_target(target)
167
+ targets.find do |t|
168
+ t.name == "#{target.name}Tests"
143
169
  end
170
+ end
144
171
  end
145
172
  end
146
173
  end
@@ -48,8 +48,8 @@ module Xcake
48
48
  #
49
49
  def create_schemes_for_target(target)
50
50
  case target.product_type
51
- when Xcodeproj::Constants::PRODUCT_TYPE_UTI[:application]
52
- create_schemes_for_application(target)
51
+ when Xcodeproj::Constants::PRODUCT_TYPE_UTI[:application]
52
+ create_schemes_for_application(target)
53
53
  end
54
54
  end
55
55
 
@@ -63,7 +63,7 @@ module Xcake
63
63
  scheme = Scheme.new
64
64
 
65
65
  scheme.name = "#{target.name}-#{c.name}"
66
- @xcschememanagement['SuppressBuildableAutocreation'][target.uuid] = {"primary" => true}
66
+ @xcschememanagement['SuppressBuildableAutocreation'][target.uuid] = { 'primary' => true }
67
67
 
68
68
  unit_test_target = project.find_unit_test_target_for_target(target)
69
69
  scheme.configure_with_targets(target, unit_test_target)
@@ -74,10 +74,10 @@ module Xcake
74
74
  scheme.analyze_action.build_configuration = c.name
75
75
  scheme.archive_action.build_configuration = c.name
76
76
 
77
- #TODO: We should structure this stuff out
78
- if unit_test_target then
79
- unit_test_target.add_dependency(target)
80
- @xcschememanagement['SuppressBuildableAutocreation'][unit_test_target.uuid] = {"primary" => true}
77
+ # TODO: We should structure this stuff out
78
+ if unit_test_target
79
+ unit_test_target.add_dependency(target)
80
+ @xcschememanagement['SuppressBuildableAutocreation'][unit_test_target.uuid] = { 'primary' => true }
81
81
  end
82
82
 
83
83
  schemes << scheme
@@ -90,23 +90,21 @@ module Xcake
90
90
  # path to write to.
91
91
  #
92
92
  def save(writing_path)
93
-
94
93
  schemes_dir = Scheme.user_data_dir(writing_path)
95
94
 
96
95
  FileUtils.rm_rf(schemes_dir)
97
96
  FileUtils.mkdir_p(schemes_dir)
98
97
 
99
98
  schemes.each do |s|
100
-
101
99
  puts "Saving Scheme #{s.name}..."
102
100
  s.save_as(@project.path, s.name, true)
103
101
 
104
102
  @xcschememanagement['SchemeUserState']["#{s.name}.xcscheme_^#shared#^_"] = {
105
- "isShown" => true
103
+ 'isShown' => true
106
104
  }
107
105
  end
108
106
 
109
- puts "Saving Scheme List..."
107
+ puts 'Saving Scheme List...'
110
108
 
111
109
  xcschememanagement_path = schemes_dir + 'xcschememanagement.plist'
112
110
  write_plist(xcschememanagement_path)