xcodeproj 0.5.5 → 0.6.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
  SHA1:
3
- metadata.gz: 1d0bd284686d9b298ce9e336a2e39312b692d4c4
4
- data.tar.gz: 2dde723b3dd726db454c2df48128b19279f95e59
3
+ metadata.gz: 68eed1e98656c82c9900d49e52bd8c22b3a82ccf
4
+ data.tar.gz: 06e3be0d616290a94bc7bd6abd1b12a8d719e153
5
5
  SHA512:
6
- metadata.gz: e35fe3e08eb59daca5d919959c289dabd680640620b6fdad288b69de28f8d10df6cb4fdcb81e43df2744cc00224be17bd0f4895faddcc86515ac0879c0eb7733
7
- data.tar.gz: 994da7e4ea40df27ba68ba467210113d0d1cc1b4eef0c171c25b0996e7ebb36e9f55565b52b66cccda1305b3dc22d00278d9ff1f408d486e794ff30c1083d380
6
+ metadata.gz: 71f4b96a96f05f285440bd3ee45e75979284d06e4a432e29959ebe9944cd76e87ce7cf373e195155c02ff42b9cd7bf945af411b3c3013d32a128f2a32c6e76fa
7
+ data.tar.gz: 8e79143ff631216843b156982acf94dff0f1d12e46d8822dbe147068ef49abfc4a234003315aad21db1cf8bddb3496f54d8da405fba2bbf1e44471e13a4af512
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/CocoaPods/Xcodeproj.png?branch=master)](https://travis-ci.org/CocoaPods/Xcodeproj)
4
4
  [![Coverage Status](https://coveralls.io/repos/CocoaPods/Xcodeproj/badge.png?branch=master)](https://coveralls.io/r/CocoaPods/Xcodeproj)
5
+ [![Code Climate](https://codeclimate.com/github/CocoaPods/Xcodeproj.png)](https://codeclimate.com/github/CocoaPods/Xcodeproj)
5
6
 
6
7
  Xcodeproj lets you create and modify Xcode projects from [Ruby][ruby].
7
8
  Script boring management tasks or build Xcode-friendly libraries. Also includes
data/lib/xcodeproj.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Xcodeproj
2
- VERSION = '0.5.5' unless defined? Xcodeproj::VERSION
2
+ VERSION = '0.6.0' unless defined? Xcodeproj::VERSION
3
3
 
4
4
  class PlainInformative < StandardError
5
5
  end
@@ -18,4 +18,5 @@ module Xcodeproj
18
18
  autoload :Project, 'xcodeproj/project'
19
19
  autoload :UI, 'xcodeproj/user_interface'
20
20
  autoload :Workspace, 'xcodeproj/workspace'
21
+ autoload :XCScheme, 'xcodeproj/scheme'
21
22
  end
@@ -67,7 +67,8 @@ module Xcodeproj
67
67
  # @return [String] The serialized internal data.
68
68
  #
69
69
  def to_s
70
- to_hash.sort_by(&:first).map { |k, v| "#{k} = #{v}" }.join("\n")
70
+ [includes.map { |i| "#include \"#{i}\""} +
71
+ to_hash.sort_by(&:first).map { |k, v| "#{k} = #{v}" }].join("\n")
71
72
  end
72
73
 
73
74
  # Writes the serialized representation of the internal data to the given
@@ -0,0 +1,272 @@
1
+ require 'rexml/document'
2
+
3
+ module Xcodeproj
4
+
5
+ # This class represents a Scheme document represented by a ".xcscheme" file usually stored
6
+ # in a xcuserdata or xcshareddata (for a shared scheme) folder.
7
+ #
8
+ class XCScheme
9
+
10
+ # @return [REXML::Document] the XML object that will be manipulated to save the scheme file after.
11
+ #
12
+ attr_reader :doc
13
+
14
+ # @return [String] the name of the container (the project name file without the extension) that have the targets
15
+ # used by the scheme.
16
+ #
17
+ attr_reader :container
18
+
19
+ # @return [Xcodeproj::Project::Object::AbstractTarget] the target used by scheme in the build step.
20
+ #
21
+ attr_reader :build_target
22
+
23
+ # @return [Xcodeproj::Project::Object::AbstractTarget] the target used by scheme in the test step.
24
+ #
25
+ attr_reader :test_target
26
+
27
+ # Share a User Scheme. Basically this method move the xcscheme file from the xcuserdata folder to xcshareddata
28
+ # folder.
29
+ #
30
+ # @param project_path [String] Path of the .xcodeproj folder.
31
+ #
32
+ # @param scheme_name [String] The name of scheme that will be shared.
33
+ #
34
+ # @param user [String] The user name that have the scheme
35
+ #
36
+ def self.share_scheme(project_path, scheme_name, user = ENV['USER'])
37
+ from = File.join project_path, 'xcuserdata', "#{user}.xcuserdatad", 'xcschemes', "#{scheme_name}.xcscheme"
38
+ to_folder = File.join project_path, 'xcshareddata', 'xcschemes'
39
+ Pathname(to_folder).mkpath
40
+ to = File.join to_folder, "#{scheme_name}.xcscheme"
41
+ FileUtils.mv from, to
42
+ end
43
+
44
+ # Create a new XCScheme instance
45
+ #
46
+ # @param [String] container
47
+ # The name of the container (the project name file without the extension) that have the targets used by the
48
+ # scheme.
49
+ #
50
+ # @param [Xcodeproj::Project::Object::AbstractTarget] build_target
51
+ # The target used by scheme in the build step.
52
+ #
53
+ # @param [Xcodeproj::Project::Object::AbstractTarget] test_target
54
+ # The target used by scheme in the test step.
55
+ #
56
+ # @example
57
+ # Xcodeproj::XCScheme.new 'Cocoa Application', project.targets[0], project.targets[1]
58
+ #
59
+ def initialize(container, build_target, test_target = nil)
60
+ @container = container
61
+ @build_target = build_target
62
+ @test_target = test_target
63
+
64
+ @doc = REXML::Document.new
65
+ @doc << REXML::XMLDecl.new(REXML::XMLDecl::DEFAULT_VERSION, 'UTF-8')
66
+ @doc.context[:attribute_quote] = :quote
67
+
68
+ scheme = @doc.add_element 'Scheme'
69
+ scheme.attributes['LastUpgradeVersion'] = build_target.project.root_object.attributes['LastUpgradeCheck']
70
+ scheme.attributes['version'] = '1.3'
71
+
72
+ build_action = scheme.add_element 'BuildAction'
73
+ build_action.attributes['parallelizeBuildables'] = 'YES'
74
+ build_action.attributes['buildImplicitDependencies'] = 'YES'
75
+
76
+ if (build_target.product_type == 'com.apple.product-type.application') then
77
+ build_action_entries = build_action.add_element 'BuildActionEntries'
78
+
79
+ build_action_entry = build_action_entries.add_element 'BuildActionEntry'
80
+ build_action_entry.attributes['buildForTesting'] = 'YES'
81
+ build_action_entry.attributes['buildForRunning'] = 'YES'
82
+ build_action_entry.attributes['buildForProfiling'] = 'YES'
83
+ build_action_entry.attributes['buildForArchiving'] = 'YES'
84
+ build_action_entry.attributes['buildForAnalyzing'] = 'YES'
85
+
86
+ buildable_reference = build_action_entry.add_element 'BuildableReference'
87
+ buildable_reference.attributes['BuildableIdentifier'] = 'primary'
88
+ buildable_reference.attributes['BlueprintIdentifier'] = build_target.uuid
89
+ buildable_reference.attributes['BuildableName'] = "#{build_target.name}.app"
90
+ buildable_reference.attributes['BlueprintName'] = build_target.name
91
+ buildable_reference.attributes['ReferencedContainer'] = "container:#{container}.xcodeproj"
92
+ end
93
+
94
+ test_action = scheme.add_element 'TestAction'
95
+ test_action.attributes['selectedDebuggerIdentifier'] = 'Xcode.DebuggerFoundation.Debugger.LLDB'
96
+ test_action.attributes['selectedLauncherIdentifier'] = 'Xcode.DebuggerFoundation.Launcher.LLDB'
97
+ test_action.attributes['shouldUseLaunchSchemeArgsEnv'] = 'YES'
98
+ test_action.attributes['buildConfiguration'] = 'Debug'
99
+
100
+ testables = test_action.add_element 'Testables'
101
+
102
+ if (test_target != nil) then
103
+ testable_reference = testables.add_element 'TestableReference'
104
+ testable_reference.attributes['skipped'] = 'NO'
105
+
106
+ buildable_reference = testable_reference.add_element 'BuildableReference'
107
+ buildable_reference.attributes['BuildableIdentifier'] = 'primary'
108
+ buildable_reference.attributes['BlueprintIdentifier'] = test_target.uuid
109
+ buildable_reference.attributes['BuildableName'] = "#{test_target.name}.octest"
110
+ buildable_reference.attributes['BlueprintName'] = test_target.name
111
+ buildable_reference.attributes['ReferencedContainer'] = "container:#{container}.xcodeproj"
112
+
113
+ if (build_target.product_type == 'com.apple.product-type.application') then
114
+ macro_expansion = test_action.add_element 'MacroExpansion'
115
+
116
+ buildable_reference = macro_expansion.add_element 'BuildableReference'
117
+ buildable_reference.attributes['BuildableIdentifier'] = 'primary'
118
+ buildable_reference.attributes['BlueprintIdentifier'] = build_target.uuid
119
+ buildable_reference.attributes['BuildableName'] = "#{build_target.name}.app"
120
+ buildable_reference.attributes['BlueprintName'] = build_target.name
121
+ buildable_reference.attributes['ReferencedContainer'] = "container:#{container}.xcodeproj"
122
+ end
123
+ end
124
+
125
+ launch_action = scheme.add_element 'LaunchAction'
126
+ launch_action.attributes['selectedDebuggerIdentifier'] = 'Xcode.DebuggerFoundation.Debugger.LLDB'
127
+ launch_action.attributes['selectedLauncherIdentifier'] = 'Xcode.DebuggerFoundation.Launcher.LLDB'
128
+ launch_action.attributes['launchStyle'] = '0'
129
+ launch_action.attributes['useCustomWorkingDirectory'] = 'NO'
130
+ launch_action.attributes['buildConfiguration'] = 'Debug'
131
+ launch_action.attributes['ignoresPersistentStateOnLaunch'] = 'NO'
132
+ launch_action.attributes['debugDocumentVersioning'] = 'YES'
133
+ launch_action.attributes['allowLocationSimulation'] = 'YES'
134
+
135
+ if (build_target.product_type == 'com.apple.product-type.application') then
136
+ buildable_product_runnable = launch_action.add_element 'BuildableProductRunnable'
137
+
138
+ buildable_reference = buildable_product_runnable.add_element 'BuildableReference'
139
+ buildable_reference.attributes['BuildableIdentifier'] = 'primary'
140
+ buildable_reference.attributes['BlueprintIdentifier'] = build_target.uuid
141
+ buildable_reference.attributes['BuildableName'] = "#{build_target.name}.app"
142
+ buildable_reference.attributes['BlueprintName'] = build_target.name
143
+ buildable_reference.attributes['ReferencedContainer'] = "container:#{container}.xcodeproj"
144
+ end
145
+
146
+ additional_options = launch_action.add_element 'AdditionalOptions'
147
+
148
+ profile_action = scheme.add_element 'ProfileAction'
149
+ profile_action.attributes['shouldUseLaunchSchemeArgsEnv'] = 'YES'
150
+ profile_action.attributes['savedToolIdentifier'] = ''
151
+ profile_action.attributes['useCustomWorkingDirectory'] = 'NO'
152
+ profile_action.attributes['buildConfiguration'] = 'Release'
153
+ profile_action.attributes['debugDocumentVersioning'] = 'YES'
154
+
155
+ if (build_target.product_type == 'com.apple.product-type.application') then
156
+ buildable_product_runnable = profile_action.add_element 'BuildableProductRunnable'
157
+
158
+ buildable_reference = buildable_product_runnable.add_element 'BuildableReference'
159
+ buildable_reference.attributes['BuildableIdentifier'] = 'primary'
160
+ buildable_reference.attributes['BlueprintIdentifier'] = build_target.uuid
161
+ buildable_reference.attributes['BuildableName'] = "#{build_target.name}.app"
162
+ buildable_reference.attributes['BlueprintName'] = build_target.name
163
+ buildable_reference.attributes['ReferencedContainer'] = "container:#{container}.xcodeproj"
164
+ end
165
+
166
+ analyze_action = scheme.add_element 'AnalyzeAction'
167
+ analyze_action.attributes['buildConfiguration'] = 'Debug'
168
+
169
+ archive_action = scheme.add_element 'ArchiveAction'
170
+ archive_action.attributes['buildConfiguration'] = 'Release'
171
+ archive_action.attributes['revealArchiveInOrganizer'] = 'YES'
172
+ end
173
+
174
+ # Returns the current value if the build target must be runned during the build step.
175
+ #
176
+ # @return [Boolean]
177
+ # true => run during the build step
178
+ # false => not run during the build step
179
+ #
180
+ def build_target_for_running?
181
+ build_target_for_running = ''
182
+
183
+ if build_action = @doc.root.elements['BuildAction']
184
+ if build_action_entries = build_action.elements['BuildActionEntries']
185
+ if build_action_entry = build_action_entries.elements['BuildActionEntry']
186
+ build_target_for_running = build_action_entry.attributes['buildForRunning']
187
+ end
188
+ end
189
+ end
190
+
191
+ build_target_for_running == 'YES'
192
+ end
193
+
194
+ # Set the build target to run or not run during the build step.
195
+ # Useful for cases where the build target is a unit test bundle.
196
+ #
197
+ # @param [Boolean] build_target_for_running
198
+ # true => run during the build step
199
+ # false => not run during the build step
200
+ #
201
+ def build_target_for_running=(build_target_for_running)
202
+ build_action = @doc.root.elements['BuildAction']
203
+
204
+ if (build_action.elements['BuildActionEntries'] == nil) then
205
+ build_action_entries = build_action.add_element 'BuildActionEntries'
206
+ else
207
+ build_action_entries = build_action.elements['BuildActionEntries']
208
+ end
209
+
210
+ if (build_action_entries.elements['BuildActionEntry'] == nil) then
211
+ build_action_entry = build_action_entries.add_element 'BuildActionEntry'
212
+ build_action_entry.attributes['buildForTesting'] = 'YES'
213
+ build_action_entry.attributes['buildForProfiling'] = 'NO'
214
+ build_action_entry.attributes['buildForArchiving'] = 'NO'
215
+ build_action_entry.attributes['buildForAnalyzing'] = 'NO'
216
+ else
217
+ build_action_entry = build_action_entries.elements['BuildActionEntry']
218
+ end
219
+
220
+ build_action_entry.attributes['buildForRunning'] = build_target_for_running ? 'YES' : 'NO'
221
+
222
+ if (build_action_entry.elements['BuildableReference'] == nil) then
223
+ buildable_reference = build_action_entry.add_element 'BuildableReference'
224
+ buildable_reference.attributes['BuildableIdentifier'] = 'primary'
225
+ buildable_reference.attributes['BlueprintIdentifier'] = build_target.uuid
226
+ buildable_reference.attributes['BuildableName'] = "#{build_target.name}.octest"
227
+ buildable_reference.attributes['BlueprintName'] = build_target.name
228
+ buildable_reference.attributes['ReferencedContainer'] = "container:#{container}.xcodeproj"
229
+ end
230
+ end
231
+
232
+ # Serializes the current state of the object to a String
233
+ #
234
+ # @return [String] the XML string value of the current state of the object
235
+ #
236
+ def to_s
237
+ formatter = REXML::Formatters::Pretty.new(2)
238
+ formatter.compact = true
239
+ out = ''
240
+ formatter.write(@doc, out)
241
+ out
242
+ end
243
+
244
+ # Serializes the current state of the object to a ".xcscheme" file.
245
+ #
246
+ # @param [String, Pathname] project_path
247
+ # The path where the ".xcscheme" file should be stored.
248
+ #
249
+ # @param [Boolean] shared
250
+ # true => if the scheme must be a shared scheme (default value)
251
+ # false => if the scheme must be a user scheme
252
+ #
253
+ # @return [void]
254
+ #
255
+ # @example Saving a scheme
256
+ # scheme.save_as('path/to/Project.xcodeproj') #=> true
257
+ #
258
+ def save_as(project_path, shared = true)
259
+ if shared then
260
+ scheme_folder_path = File.join(project_path, 'xcshareddata', 'xcschemes')
261
+ else
262
+ scheme_folder_path = File.join(project_path, 'xcuserdata', "#{ENV['USER']}.xcuserdatad", 'xcschemes')
263
+ end
264
+ Pathname(scheme_folder_path).mkpath
265
+ scheme_path = File.join(scheme_folder_path, "#{build_target.display_name}.xcscheme")
266
+ File.open(scheme_path, 'w') do |f|
267
+ f.write(self)
268
+ end
269
+ end
270
+
271
+ end
272
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcodeproj
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Duran
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-08 00:00:00.000000000 Z
11
+ date: 2013-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -73,6 +73,7 @@ files:
73
73
  - lib/xcodeproj/project/object_dictionary.rb
74
74
  - lib/xcodeproj/project/object_list.rb
75
75
  - lib/xcodeproj/project.rb
76
+ - lib/xcodeproj/scheme.rb
76
77
  - lib/xcodeproj/user_interface.rb
77
78
  - lib/xcodeproj/workspace.rb
78
79
  - lib/xcodeproj.rb
@@ -102,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
103
  version: '0'
103
104
  requirements: []
104
105
  rubyforge_project:
105
- rubygems_version: 2.0.0
106
+ rubygems_version: 2.0.3
106
107
  signing_key:
107
108
  specification_version: 3
108
109
  summary: Create and modify Xcode projects from Ruby.