xcake 0.7.1 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +11 -3
  3. data/CHANGELOG.md +15 -0
  4. data/README.md +3 -1
  5. data/bin/xcake +0 -1
  6. data/docs/Cakefile.md +82 -1
  7. data/docs/Xcode Project Support.md +5 -0
  8. data/example/app/CakeMania/CakeMania.xcodeproj/project.pbxproj +973 -0
  9. data/example/app/CakeMania/CakeMania.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  10. data/example/app/CakeMania/CakeMania.xcodeproj/project.xcworkspace/xcuserdata/maxim.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  11. data/example/app/CakeMania/CakeMania.xcodeproj/xcshareddata/xcschemes/CakeMania-AppStore.xcscheme +91 -0
  12. data/example/app/CakeMania/CakeMania.xcodeproj/xcshareddata/xcschemes/CakeMania-Debug.xcscheme +91 -0
  13. data/example/app/CakeMania/CakeMania.xcodeproj/xcshareddata/xcschemes/CakeMania-Production.xcscheme +91 -0
  14. data/example/app/CakeMania/CakeMania.xcodeproj/xcshareddata/xcschemes/CakeMania-RC.xcscheme +91 -0
  15. data/example/app/CakeMania/CakeMania.xcodeproj/xcshareddata/xcschemes/CakeMania-Staging.xcscheme +91 -0
  16. data/example/app/CakeMania/CakeMania.xcodeproj/xcuserdata/maxim.xcuserdatad/xcschemes/CakeManiaTst.xcscheme +56 -0
  17. data/example/app/CakeMania/CakeMania.xcodeproj/xcuserdata/maxim.xcuserdatad/xcschemes/CakeManiaUITst.xcscheme +56 -0
  18. data/example/app/CakeMania/CakeMania.xcodeproj/xcuserdata/maxim.xcuserdatad/xcschemes/xcschememanagement.plist +72 -0
  19. data/{docs/Sample → example/app/CakeMania}/Cakefile +80 -47
  20. data/example/app/CakeMania/Info/CakeMania.plist +38 -0
  21. data/example/app/CakeMania/Info/CakeManiaTst.plist +22 -0
  22. data/example/app/CakeMania/Info/CakeManiaUITst.plist +22 -0
  23. data/example/app/CakeMania/Res/CakeMania-test.entitlements +10 -0
  24. data/example/app/CakeMania/Res/CakeMania.entitlements +10 -0
  25. data/example/app/CakeMania/Res/CakeMania.xcassets/AppIcon.appiconset/Contents.json +48 -0
  26. data/example/app/CakeMania/Src/AppDelegate.swift +46 -0
  27. data/example/app/CakeMania/Src/Base.lproj/LaunchScreen.storyboard +27 -0
  28. data/example/app/CakeMania/Src/Base.lproj/Main.storyboard +26 -0
  29. data/example/app/CakeMania/Src/ObjC/CakeMania-Bridging-Header.h +3 -0
  30. data/example/app/CakeMania/Src/ObjC/Prefix.pch +14 -0
  31. data/example/app/CakeMania/Src/ViewController.swift +25 -0
  32. data/example/app/CakeMania/Tst/Main.swift +36 -0
  33. data/example/app/CakeMania/UITst/Main.swift +36 -0
  34. data/example/framework/Cakefile +133 -0
  35. data/gemfiles/Gemfile.xcodeproj-1.3.x +5 -0
  36. data/gemfiles/Gemfile.xcodeproj-1.4.x +5 -0
  37. data/gemfiles/Gemfile.xcodeproj-edge +5 -0
  38. data/lib/xcake/build_phase/headers_build_phase.rb +47 -0
  39. data/lib/xcake/build_phase/shell_script_build_phase.rb +24 -0
  40. data/lib/xcake/build_phase.rb +36 -0
  41. data/lib/xcake/constants.rb +82 -0
  42. data/lib/xcake/context/xcodeproj_context.rb +10 -0
  43. data/lib/xcake/context.rb +24 -0
  44. data/lib/xcake/generator/scheme_generator.rb +13 -2
  45. data/lib/xcake/generator/target_build_phase_generator.rb +11 -3
  46. data/lib/xcake/generator/target_dependency_generator.rb +1 -1
  47. data/lib/xcake/generator/target_file_reference_generator.rb +4 -5
  48. data/lib/xcake/generator/target_link_generator.rb +25 -0
  49. data/lib/xcake/informative.rb +0 -1
  50. data/lib/xcake/path_classifier.rb +5 -5
  51. data/lib/xcake/project/sugar.rb +7 -5
  52. data/lib/xcake/project.rb +0 -1
  53. data/lib/xcake/target/configurable.rb +2 -6
  54. data/lib/xcake/target/sugar.rb +28 -3
  55. data/lib/xcake/target.rb +34 -18
  56. data/lib/xcake/ui.rb +1 -4
  57. data/lib/xcake/version.rb +1 -1
  58. data/lib/xcake/xcode/project.rb +25 -13
  59. data/lib/xcake/xcode/scheme.rb +3 -0
  60. data/lib/xcake/xcode/scheme_list.rb +0 -23
  61. data/lib/xcake/xcodeproj_ext/PBXGroup.rb +3 -3
  62. data/lib/xcake/xcodeproj_ext/PBXNativeTarget.rb +0 -1
  63. data/lib/xcake.rb +10 -5
  64. data/rubocop.yml +0 -4
  65. data/xcake.gemspec +8 -7
  66. metadata +112 -80
  67. data/lib/xcake/generator/target_custom_build_phase_generator.rb +0 -16
  68. data/lib/xcake/shell_script_build_phase.rb +0 -15
data/lib/xcake/target.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Xcake
2
2
  # This class is used to describe a target for a
3
3
  # Xcode project; This forms part of the DSL
4
- # and is usally stored in files named `Cakefile`.
4
+ # and is usually stored in files named `Cakefile`.
5
5
  #
6
6
  class Target
7
7
  include Configurable
@@ -36,8 +36,8 @@ module Xcake
36
36
  #
37
37
  attr_accessor :language
38
38
 
39
- # @return [Array<Xcodeproj::Project::Object::AbstractBuildPhase>] the list
40
- # of custom build phases for the project.
39
+ # @return [Array<BuildPhase>] the list
40
+ # of build phases for the project.
41
41
  #
42
42
  attr_accessor :build_phases
43
43
 
@@ -122,6 +122,10 @@ module Xcake
122
122
  # Supports regular expressions,
123
123
  # Defaults to: ["./<Target Name>/*\*/\*.*"]
124
124
  #
125
+ #
126
+ # @note Xcake defaults to including files in the folder with the same name as
127
+ # the targt
128
+ #
125
129
  # @example
126
130
  #
127
131
  # spec.include_files = "Classes/**/*.{h,m}"
@@ -162,8 +166,14 @@ module Xcake
162
166
  #
163
167
  attr_accessor :target_dependencies
164
168
 
169
+ # @return [Array<Target>] targets to link to, use this
170
+ # when you want to use a library or framework target
171
+ # in another target
172
+ #
173
+ attr_accessor :linked_targets
174
+
165
175
  # @param [Proc] block
166
- # an optional block that configures the project through the DSL.
176
+ # an optional block that configures the target through the DSL.
167
177
  #
168
178
  # @example Creating a Target.
169
179
  #
@@ -173,29 +183,26 @@ module Xcake
173
183
  #
174
184
  def initialize(project)
175
185
  @project = project
186
+
176
187
  @build_phases = []
188
+ @exclude_files = []
189
+ @linked_targets = []
190
+ @system_libraries = []
191
+ @target_dependencies = []
177
192
 
178
193
  yield(self) if block_given?
179
194
  end
180
195
 
196
+ ## Getters
197
+
181
198
  def include_files
199
+ # Import files in folder with same name as target by default
182
200
  @include_files ||= ["./#{@name}/**/*.*"]
183
201
  end
184
202
 
185
- def exclude_files
186
- @exclude_files ||= []
187
- end
188
-
189
203
  def system_frameworks
190
- @system_frameworks ||= default_system_frameworks_for platform
191
- end
192
-
193
- def system_libraries
194
- @system_libraries ||= []
195
- end
196
-
197
- def target_dependencies
198
- @target_dependencies ||= []
204
+ # Use default frameworks by default
205
+ @system_frameworks ||= default_system_frameworks_for(platform)
199
206
  end
200
207
 
201
208
  # @!group Conversion
@@ -206,12 +213,21 @@ module Xcake
206
213
 
207
214
  protected
208
215
 
216
+ # Returns an array of default system frameworks
217
+ # to use for a given platform.
218
+ #
219
+ # @param [Symbol] platform
220
+ # platform the frameworks are for.
221
+ #
222
+ #
223
+ # @return [Array<String>] system frameworks to use
224
+ #
209
225
  def default_system_frameworks_for(platform)
210
226
  case platform
211
227
  when :ios
212
228
  %w(Foundation UIKit)
213
229
  when :osx
214
- ['Cocoa']
230
+ %w(Cocoa)
215
231
  when :tvos
216
232
  %w(Foundation UIKit)
217
233
  when :watchos
data/lib/xcake/ui.rb CHANGED
@@ -1,8 +1,5 @@
1
1
  require 'cork'
2
2
 
3
- # TODO: i18n this.
4
- # TODO: Different modes depending on --verbose, and CI
5
- # TODO: Split output and UI code into seperate concerns.
6
3
  module Xcake
7
4
  class UI
8
5
  def self.register_ui_hooks
@@ -69,7 +66,7 @@ module Xcake
69
66
  end
70
67
 
71
68
  EventHooks.before_adding_custom_build_phase do |phase, target|
72
- board.puts "- Adding custom phase \"#{phase.name}\" for #{target}"
69
+ board.puts "- Adding \"#{phase}\" to #{target}"
73
70
  end
74
71
 
75
72
  EventHooks.before_adding_embed_watch_app_phase do
data/lib/xcake/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Xcake
2
- VERSION = '0.7.1'.freeze
2
+ VERSION = '0.8.1'.freeze
3
3
  end
@@ -2,6 +2,9 @@ require 'xcodeproj'
2
2
 
3
3
  module Xcake
4
4
  module Xcode
5
+ # Special subclass of the Xcodeproj::Project which adds capabilities and
6
+ # helper methods xcake need
7
+ #
5
8
  class Project < Xcodeproj::Project
6
9
  # @return [Hash] the attributes of
7
10
  # the project
@@ -42,21 +45,10 @@ module Xcake
42
45
  attributes['ORGANIZATIONNAME'] = organization
43
46
  end
44
47
 
45
- # @return [SchemeList] the scheme list
46
- #
47
- def scheme_list
48
- @scheme_list ||= SchemeList.new(self)
49
- end
50
-
51
48
  def object_version
52
49
  Xcodeproj::Constants::DEFAULT_OBJECT_VERSION.to_s
53
50
  end
54
51
 
55
- def recreate_user_schemes(*)
56
- scheme_list.recreate_schemes
57
- scheme_list.save(path)
58
- end
59
-
60
52
  # Configures the Project for use with Xcake.
61
53
  # This makes sure we have sensible defaults and
62
54
  # it as clean as possible.
@@ -114,7 +106,7 @@ module Xcake
114
106
  new(Xcodeproj::Project::Object::XCBuildConfiguration)
115
107
  end
116
108
 
117
- # Creates a new xcode file reference from the node
109
+ # Creates a new xcode file reference for a path
118
110
  #
119
111
  # @param [Pathname] path
120
112
  # => path of the file reference from the source root
@@ -124,11 +116,21 @@ module Xcake
124
116
  def file_reference_for_path(path)
125
117
  group = group_for_file_reference_path(path)
126
118
  group_path = Pathname.new group.dirname
127
-
128
119
  file_path = path.cleanpath.relative_path_from group_path
120
+
121
+ ref = group.find_file_by_path file_path.to_s
122
+ return ref if ref
123
+
129
124
  group.new_reference(file_path.to_s)
130
125
  end
131
126
 
127
+ # Finds or Creates a new xcode group for a path
128
+ #
129
+ # @param [Pathname] path
130
+ # => path of the group from the source root
131
+ #
132
+ # @return [PBXGroup] existing or new xcode group
133
+ #
132
134
  def group_for_file_reference_path(path)
133
135
  clean_path = path.cleanpath
134
136
  group = variant_group_for_path(path)
@@ -138,6 +140,16 @@ module Xcake
138
140
 
139
141
  private
140
142
 
143
+ # Creates or finds a new xcode variant group for a path
144
+ #
145
+ # @note this method will return nil if the path isn't a valid
146
+ # variant group path
147
+ #
148
+ # @param [Pathname] path
149
+ # => path of the variant group from the source root
150
+ #
151
+ # @return [PBXVariantGroup] existing or new xcode variant group
152
+ #
141
153
  def variant_group_for_path(path)
142
154
  group_path = path.dirname.cleanpath
143
155
  base_name = group_path.basename
@@ -2,6 +2,9 @@ require 'xcodeproj'
2
2
 
3
3
  module Xcake
4
4
  module Xcode
5
+ # Special subclass of the Xcodeproj::XCScheme which adds capabilities and
6
+ # helper methods xcake need
7
+ #
5
8
  class Scheme < Xcodeproj::XCScheme
6
9
  # @return [String] name for the scheme.
7
10
  #
@@ -33,32 +33,12 @@ module Xcake
33
33
  }
34
34
  end
35
35
 
36
- # Creates the schemes based on the targets.
37
- #
38
- def recreate_schemes
39
- @project.targets.each do |t|
40
- create_schemes_for_target(t)
41
- end
42
- end
43
-
44
36
  # Creates schemes based on a target.
45
37
  #
46
38
  # @param [Target] target
47
39
  # target to create schemes for
48
40
  #
49
41
  def create_schemes_for_target(target)
50
- case target.product_type
51
- when Xcodeproj::Constants::PRODUCT_TYPE_UTI[:application]
52
- create_schemes_for_application(target)
53
- end
54
- end
55
-
56
- # Creates schemes based on a application target
57
- #
58
- # @param [Target] target
59
- # target to create application schemes for
60
- #
61
- def create_schemes_for_application(target)
62
42
  target.build_configurations.each do |c|
63
43
  scheme = Scheme.new
64
44
 
@@ -74,7 +54,6 @@ module Xcake
74
54
  scheme.analyze_action.build_configuration = c.name
75
55
  scheme.archive_action.build_configuration = c.name
76
56
 
77
- # TODO: We should structure this stuff out
78
57
  if unit_test_target
79
58
  unit_test_target.add_dependency(target)
80
59
  @xcschememanagement['SuppressBuildableAutocreation'][unit_test_target.uuid] = { 'primary' => true }
@@ -89,8 +68,6 @@ module Xcake
89
68
  # @param [String] writing_path
90
69
  # path to write to.
91
70
  #
92
- # TODO: Move to a Generator
93
- #
94
71
  def save(writing_path)
95
72
  schemes_dir = Scheme.user_data_dir(writing_path)
96
73
 
@@ -25,12 +25,12 @@ module Xcodeproj
25
25
  end
26
26
 
27
27
  def dirname
28
- return "." if parent.is_a? Xcake::Xcode::Project
29
- return "." if parent.is_a? PBXProject
28
+ return '.' if parent.is_a? Xcake::Xcode::Project
29
+ return '.' if parent.is_a? PBXProject
30
30
  return parent.dirname.to_s if is_a? PBXVariantGroup
31
31
 
32
32
  if display_name
33
- "#{parent.dirname.to_s}/#{display_name}"
33
+ "#{parent.dirname}/#{display_name}"
34
34
  else
35
35
  parent.dirname.to_s
36
36
  end
@@ -4,7 +4,6 @@ module Xcodeproj
4
4
  class Project
5
5
  module Object
6
6
  class PBXNativeTarget
7
- #TODO: BDD
8
7
  def build_phase_by_class(phase_class)
9
8
  find_or_create_build_phase_by_class(phase_class)
10
9
  end
data/lib/xcake.rb CHANGED
@@ -1,10 +1,16 @@
1
1
  require 'xcake/core_ext/array'
2
2
  require 'xcake/core_ext/object'
3
3
  require 'xcake/core_ext/string'
4
+
5
+ require 'xcake/xcode/project'
6
+ require 'xcake/xcode/scheme'
7
+ require 'xcake/xcode/scheme_list'
8
+
4
9
  require 'xcake/xcodeproj_ext/PBXGroup'
5
10
  require 'xcake/xcodeproj_ext/PBXNativeTarget'
6
- require 'xcake/modern_xcodeproj.rb'
7
11
 
12
+ require 'xcake/constants'
13
+ require 'xcake/modern_xcodeproj'
8
14
  require 'xcake/version'
9
15
  require 'xcake/event_hooks'
10
16
  require 'xcake/ui'
@@ -30,15 +36,14 @@ require 'xcake/project'
30
36
  require 'xcake/project/sugar'
31
37
  require 'xcake/project/hooks'
32
38
  require 'xcake/path_classifier'
33
- require 'xcake/shell_script_build_phase'
34
39
 
35
40
  require 'xcake/target'
36
41
  require 'xcake/target/sugar'
37
42
  require 'xcake/target/configurable'
38
43
 
39
- require 'xcake/xcode/project'
40
- require 'xcake/xcode/scheme'
41
- require 'xcake/xcode/scheme_list'
44
+ require 'xcake/build_phase'
45
+ require 'xcake/build_phase/headers_build_phase'
46
+ require 'xcake/build_phase/shell_script_build_phase'
42
47
 
43
48
  module Xcake
44
49
  end
data/rubocop.yml CHANGED
@@ -35,10 +35,6 @@ AllCops:
35
35
  Exclude:
36
36
  - 'lib/assets/custom_action_template.rb'
37
37
 
38
- ##################
39
- # TODO
40
- ##################
41
-
42
38
  # Offense count: 20
43
39
  Metrics/AbcSize:
44
40
  Max: 63
data/xcake.gemspec CHANGED
@@ -21,6 +21,14 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.required_ruby_version = '>= 2.0.0'
23
23
 
24
+ spec.add_dependency 'claide', '< 2.0', '>= 0.9.1'
25
+ spec.add_dependency 'cork'
26
+ spec.add_dependency 'hooks', '~> 0.4.1'
27
+ spec.add_dependency 'xcodeproj', '< 2.0.0', '>= 0.21'
28
+
29
+ # Lock `activesupport` (transitive dependency via `xcodeproj`) to keep supporting system ruby
30
+ spec.add_dependency 'activesupport', '< 5'
31
+
24
32
  spec.add_development_dependency 'bundler', '~> 1.10'
25
33
  spec.add_development_dependency 'rake', '~> 10.0'
26
34
  spec.add_development_dependency 'rspec', '~> 3.4.0'
@@ -28,11 +36,4 @@ Gem::Specification.new do |spec|
28
36
  spec.add_development_dependency 'rubocop-git', '~> 0.1.1'
29
37
  spec.add_development_dependency 'yard', '~> 0.8'
30
38
  spec.add_development_dependency 'pry', '~> 0.10'
31
- spec.add_dependency 'claide', '< 2.0', '>= 0.9.1'
32
- spec.add_dependency 'hooks', '~> 0.4.1'
33
- spec.add_dependency 'xcodeproj', '< 2.0.0', '>= 0.20'
34
- spec.add_dependency 'cork'
35
-
36
- # Lock `activesupport` (transitive depedency via `xcodeproj`) to keep supporting system ruby
37
- spec.add_dependency 'activesupport', '< 5'
38
39
  end