xcodeproj 0.19.4 → 0.20.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: 15d4866be3a0c0e6822284381fe063e88569c6d8
4
- data.tar.gz: 62bb5c0836656973f9abb42c45b338787c06efa9
3
+ metadata.gz: 52c251c9a9b1362652e5dc8ea5c23901b8c0327e
4
+ data.tar.gz: 56c1bfb43c09840aa85c5cff8655be63de176207
5
5
  SHA512:
6
- metadata.gz: 6957ded10d5c212485c7eba72d951c1be505c3d942f30fe2fbae73404698faeee0b8627da53ba31f5258693b8d34a18cabce13caea6bb96204b83257b3e70ec1
7
- data.tar.gz: 73959189a97c54fd761cbb14b8ffd6e9da579fd4371b6f549a4fec136528360003ddb161f7402360c78585426879d492bb8729832105f5111fdb1eb0535de9de
6
+ metadata.gz: 83d70e140a46ad9f7418ec5ca2587d0878c63ae67a0dcd51eb210fc1f271dd472690af92ffe579892fd405b5ee604500e582cd2950a2c83b5a342f5769a7fc85
7
+ data.tar.gz: 0b18b6ca17245519fcfa4955596c0163c5390db3f89a9d51a292ec21cad7a4d71c2374d70625fd67d549d77fac39b72cb2222bca637909d437c4e090828c9140
data/lib/xcodeproj.rb CHANGED
@@ -21,5 +21,3 @@ module Xcodeproj
21
21
  autoload :XCScheme, 'xcodeproj/scheme'
22
22
  autoload :XcodebuildHelper, 'xcodeproj/xcodebuild_helper'
23
23
  end
24
-
25
- require 'xcodeproj/ext'
@@ -37,6 +37,7 @@ module Xcodeproj
37
37
  PBXProject
38
38
  PBXTargetDependency
39
39
  PBXReferenceProxy
40
+ AbstractTarget
40
41
  ),
41
42
 
42
43
  'AbstractBuildPhase' => %w(
@@ -60,10 +61,6 @@ module Xcodeproj
60
61
  ),
61
62
  }.freeze
62
63
 
63
- # @return [Array] The list of the super classes for each ISA.
64
- #
65
- ISAS_SUPER_CLASSES = %w(AbstractObject AbstractBuildPhase PBXGroup)
66
-
67
64
  # @return [Hash] The known file types corresponding to each extension.
68
65
  #
69
66
  FILE_TYPES_BY_EXTENSION = {
@@ -216,6 +213,13 @@ module Xcodeproj
216
213
  :plug_ins => '13',
217
214
  }.freeze
218
215
 
216
+ # @return [Hash] The corresponding numeric value of each proxy type for
217
+ # PBXContainerItemProxy.
218
+ PROXY_TYPES = {
219
+ :native_target => '1',
220
+ :reference => '2',
221
+ }.freeze
222
+
219
223
  # @return [Hash] The extensions which are associated with header files.
220
224
  #
221
225
  HEADER_FILES_EXTENSIONS = %w(.h .hh .hpp .ipp).freeze
@@ -1,5 +1,5 @@
1
1
  module Xcodeproj
2
2
  # The version of the xcodeproj gem.
3
3
  #
4
- VERSION = '0.19.4' unless defined? Xcodeproj::VERSION
4
+ VERSION = '0.20.0' unless defined? Xcodeproj::VERSION
5
5
  end
@@ -37,6 +37,7 @@ module Xcodeproj
37
37
  raise TypeError, "The given `#{path}` must be a string or 'pathname'."
38
38
  end
39
39
  path = path.to_s
40
+ raise IOError, 'Empty path.' if path == ''
40
41
 
41
42
  CoreFoundation.RubyHashPropertyListWrite(hash, path)
42
43
  end
@@ -52,45 +53,22 @@ module Xcodeproj
52
53
  unless File.exist?(path)
53
54
  raise ArgumentError, "The plist file at path `#{path}` doesn't exist."
54
55
  end
56
+ if file_in_conflict?(path)
57
+ raise ArgumentError, "The file `#{path}` is in a merge conflict"
58
+ end
55
59
  CoreFoundation.RubyHashPropertyListRead(path)
56
60
  end
57
- end
58
- end
59
- end
60
61
 
61
- # Define compatibility with older Fiddle implementation in Ruby 1.9.3.
62
- #
63
- # @todo: Soon we will drop support for any Ruby < 2 and this should be removed.
64
- #
65
- # @!visibility private
66
- #
67
- module Fiddle
68
- unless defined?(NULL)
69
- require 'dl'
70
- NULL = DL::NULL
71
- end
72
-
73
- unless defined?(SIZEOF_INTPTR_T)
74
- require 'dl'
75
- SIZEOF_INTPTR_T = DL::SIZEOF_VOIDP
76
- end
77
-
78
- unless defined?(Handle)
79
- require 'dl'
80
- Handle = DL::Handle
81
- end
82
-
83
- unless respond_to?(:dlopen)
84
- require 'dl'
85
- def self.dlopen(library)
86
- DL.dlopen(library)
87
- end
88
- end
89
-
90
- class Function
91
- unless public_method_defined?(:to_i)
92
- def to_i
93
- @ptr.to_i
62
+ # @return [Bool] Checks whether there are merge conflicts in the file.
63
+ #
64
+ # @param [#to_s] path
65
+ # The path of the file.
66
+ #
67
+ def file_in_conflict?(path)
68
+ file = File.open(path)
69
+ file.each_line.any? { |l| l.match(/^(<|=|>){7}/) }
70
+ ensure
71
+ file.close
94
72
  end
95
73
  end
96
74
  end
@@ -5,6 +5,7 @@ require 'securerandom'
5
5
  require 'xcodeproj/project/object'
6
6
  require 'xcodeproj/project/project_helper'
7
7
  require 'xcodeproj/project/xcproj_helper'
8
+ require 'xcodeproj/plist_helper'
8
9
 
9
10
  module Xcodeproj
10
11
  # This class represents a Xcode project document.
@@ -471,14 +471,10 @@ require 'xcodeproj/project/object_list'
471
471
 
472
472
  # Required because some classes have cyclical references to each other.
473
473
  #
474
- # In ruby 1.8.7 the hash are not sorted so it is necessary to use an array to
475
- # preserve the proper loading order of the various super classes.
476
- #
477
474
  # @todo I'm sure that there is a method to achieve the same result which
478
475
  # doesn't present the risk of some rubist laughing at me :-)
479
476
  #
480
- Xcodeproj::Constants::ISAS_SUPER_CLASSES.each do |superclass_name|
481
- isas = Xcodeproj::Constants::KNOWN_ISAS[superclass_name]
477
+ Xcodeproj::Constants::KNOWN_ISAS.each do |superclass_name, isas|
482
478
  superklass = Xcodeproj::Project::Object.const_get(superclass_name)
483
479
  isas.each do |isa|
484
480
  c = Class.new(superklass)
@@ -195,6 +195,31 @@ module Xcodeproj
195
195
  # copied to.
196
196
  #
197
197
  attribute :dst_subfolder_spec, String, Constants::COPY_FILES_BUILD_PHASE_DESTINATIONS[:resources]
198
+
199
+ # Alias method for #dst_subfolder_spec=, which accepts symbol values
200
+ # instead of numeric string values.
201
+ #
202
+ # @param [Symbol] value
203
+ # one of `COPY_FILES_BUILD_PHASE_DESTINATIONS.keys`
204
+ #
205
+ # @raise [StandardError] if value is not a valid known key
206
+ #
207
+ def symbol_dst_subfolder_spec=(value)
208
+ numeric_value = Constants::COPY_FILES_BUILD_PHASE_DESTINATIONS[value]
209
+ raise "[Xcodeproj] Value checking error: got `#{value.inspect}` for" \
210
+ ' attribute: dst_subfolder_spec' if numeric_value.nil?
211
+ self.dst_subfolder_spec = numeric_value
212
+ end
213
+
214
+ # Alias method for #dst_subfolder_spec, which returns symbol values
215
+ # instead of numeric string values.
216
+ #
217
+ # @return [Symbol]
218
+ #
219
+ def symbol_dst_subfolder_spec
220
+ key = Constants::COPY_FILES_BUILD_PHASE_DESTINATIONS.find { |_, num| num == dst_subfolder_spec }
221
+ key ? key.first : nil
222
+ end
198
223
  end
199
224
 
200
225
  #-----------------------------------------------------------------------#
@@ -42,7 +42,7 @@ module Xcodeproj
42
42
 
43
43
  # @return [String] the type of the proxy.
44
44
  #
45
- # @note {PBXNativeTarget} is `1`.
45
+ # @note @see {Constants::PROXY_TYPE.values} for valid values.
46
46
  #
47
47
  attribute :proxy_type, String
48
48
 
@@ -65,6 +65,28 @@ module Xcodeproj
65
65
  # the proxy.
66
66
  #
67
67
  attribute :remote_info, String
68
+
69
+ # Checks whether the reference points to a remote project.
70
+ #
71
+ # @return [Bool]
72
+ #
73
+ def remote?
74
+ project.root_object.uuid != container_portal
75
+ end
76
+
77
+ # Get the proxied object
78
+ #
79
+ # @return [AbstractObject]
80
+ #
81
+ def proxied_object
82
+ if remote?
83
+ container_portal_file_ref = project.objects_by_uuid[container_portal]
84
+ container_portal_object = Project.open(container_portal_file_ref.real_path)
85
+ else
86
+ container_portal_object = project
87
+ end
88
+ container_portal_object.objects_by_uuid[remote_global_id_string]
89
+ end
68
90
  end
69
91
  end
70
92
  end
@@ -184,7 +184,7 @@ module Xcodeproj
184
184
  subproj.products_group.files.each do |product_reference|
185
185
  container_proxy = group.project.new(PBXContainerItemProxy)
186
186
  container_proxy.container_portal = ref.uuid
187
- container_proxy.proxy_type = '2'
187
+ container_proxy.proxy_type = Constants::PROXY_TYPES[:reference]
188
188
  container_proxy.remote_global_id_string = product_reference.uuid
189
189
  container_proxy.remote_info = 'Subproject'
190
190
 
@@ -194,7 +194,7 @@ module Xcodeproj
194
194
  # @return [void]
195
195
  #
196
196
  def add_dependency(target)
197
- unless dependencies.map(&:target).include?(target)
197
+ unless dependency_for_target(target)
198
198
  container_proxy = project.new(Xcodeproj::Project::PBXContainerItemProxy)
199
199
  if target.project == project
200
200
  container_proxy.container_portal = project.root_object.uuid
@@ -203,18 +203,36 @@ module Xcodeproj
203
203
  raise ArgumentError, 'add_dependency got target that belongs to a project is not this project and is not a subproject of this project' unless subproject_reference
204
204
  container_proxy.container_portal = subproject_reference.uuid
205
205
  end
206
- container_proxy.proxy_type = '1'
206
+ container_proxy.proxy_type = Constants::PROXY_TYPES[:native_target]
207
207
  container_proxy.remote_global_id_string = target.uuid
208
208
  container_proxy.remote_info = target.name
209
209
 
210
210
  dependency = project.new(Xcodeproj::Project::PBXTargetDependency)
211
- dependency.target = target
211
+ dependency.name = target.name
212
+ dependency.target = target if target.project == project
212
213
  dependency.target_proxy = container_proxy
213
214
 
214
215
  dependencies << dependency
215
216
  end
216
217
  end
217
218
 
219
+ # Checks whether this target has a dependency on the given target.
220
+ #
221
+ # @param [AbstractTarget] target
222
+ # the target to search for.
223
+ #
224
+ # @return [PBXTargetDependency]
225
+ #
226
+ def dependency_for_target(target)
227
+ dependencies.find do |dep|
228
+ if dep.target_proxy.remote?
229
+ dep.target_proxy.remote_global_id_string == target.uuid
230
+ else
231
+ dep.target == target
232
+ end
233
+ end
234
+ end
235
+
218
236
  # Creates a new copy files build phase.
219
237
  #
220
238
  # @param [String] name
@@ -382,10 +400,12 @@ module Xcodeproj
382
400
  # @param [Hash{String=>String}] compiler_flags
383
401
  # the compiler flags for the source files.
384
402
  #
385
- # @return [void]
403
+ # @yield_param [PBXBuildFile] each created build file.
404
+ #
405
+ # @return [Array<PBXBuildFile>] the created build files.
386
406
  #
387
407
  def add_file_references(file_references, compiler_flags = {})
388
- file_references.each do |file|
408
+ file_references.map do |file|
389
409
  build_file = project.new(PBXBuildFile)
390
410
  build_file.file_ref = file
391
411
 
@@ -399,6 +419,10 @@ module Xcodeproj
399
419
  end
400
420
  source_build_phase.files << build_file
401
421
  end
422
+
423
+ yield build_file if block_given?
424
+
425
+ build_file
402
426
  end
403
427
  end
404
428
 
@@ -424,19 +448,7 @@ module Xcodeproj
424
448
  # @return [PBXHeadersBuildPhase] the headers build phase.
425
449
  #
426
450
  def headers_build_phase
427
- unless @headers_build_phase
428
- headers_build_phase = build_phases.find { |bp| bp.class == PBXHeadersBuildPhase }
429
- unless headers_build_phase
430
- # Working around a bug in Xcode 4.2 betas, remove this once the
431
- # Xcode bug is fixed:
432
- # https://github.com/alloy/cocoapods/issues/13
433
- # phase = copy_header_phase || headers_build_phases.first
434
- headers_build_phase = project.new(PBXHeadersBuildPhase)
435
- build_phases << headers_build_phase
436
- end
437
- @headers_build_phase = headers_build_phase
438
- end
439
- @headers_build_phase
451
+ find_or_create_build_phase_by_class(PBXHeadersBuildPhase)
440
452
  end
441
453
 
442
454
  # Finds or creates the source build phase of the target.
@@ -446,15 +458,7 @@ module Xcodeproj
446
458
  # @return [PBXSourcesBuildPhase] the source build phase.
447
459
  #
448
460
  def source_build_phase
449
- unless @source_build_phase
450
- source_build_phase = build_phases.find { |bp| bp.class == PBXSourcesBuildPhase }
451
- unless source_build_phase
452
- source_build_phase = project.new(PBXSourcesBuildPhase)
453
- build_phases << source_build_phase
454
- end
455
- @source_build_phase = source_build_phase
456
- end
457
- @source_build_phase
461
+ find_or_create_build_phase_by_class(PBXSourcesBuildPhase)
458
462
  end
459
463
 
460
464
  # Finds or creates the frameworks build phase of the target.
@@ -464,12 +468,7 @@ module Xcodeproj
464
468
  # @return [PBXFrameworksBuildPhase] the frameworks build phase.
465
469
  #
466
470
  def frameworks_build_phase
467
- phase = build_phases.find { |bp| bp.class == PBXFrameworksBuildPhase }
468
- unless phase
469
- phase = project.new(PBXFrameworksBuildPhase)
470
- build_phases << phase
471
- end
472
- phase
471
+ find_or_create_build_phase_by_class(PBXFrameworksBuildPhase)
473
472
  end
474
473
 
475
474
  # Finds or creates the resources build phase of the target.
@@ -479,12 +478,27 @@ module Xcodeproj
479
478
  # @return [PBXResourcesBuildPhase] the resources build phase.
480
479
  #
481
480
  def resources_build_phase
482
- phase = build_phases.find { |bp| bp.class == PBXResourcesBuildPhase }
483
- unless phase
484
- phase = project.new(PBXResourcesBuildPhase)
485
- build_phases << phase
481
+ find_or_create_build_phase_by_class(PBXResourcesBuildPhase)
482
+ end
483
+
484
+ private
485
+
486
+ # @!group Internal Helpers
487
+ #--------------------------------------#
488
+
489
+ # Find or create a build phase by a given class
490
+ #
491
+ # @param [Class] phase_class the class of the build phase to find or create.
492
+ #
493
+ # @return [AbstractBuildPhase] the build phase whose class match the given phase_class.
494
+ #
495
+ def find_or_create_build_phase_by_class(phase_class)
496
+ @phases ||= {}
497
+ unless phase_class < AbstractBuildPhase
498
+ raise ArgumentError, "#{phase_class} must be a subclass of #{AbstractBuildPhase.class}"
486
499
  end
487
- phase
500
+ @phases[phase_class] ||= build_phases.find { |bp| bp.class == phase_class } \
501
+ || project.new(phase_class).tap { |bp| build_phases << bp }
488
502
  end
489
503
 
490
504
  public
@@ -9,6 +9,10 @@ module Xcodeproj
9
9
  class PBXReferenceProxy < AbstractObject
10
10
  # @!group Attributes
11
11
 
12
+ # @return [String] the name of the reference.
13
+ #
14
+ attribute :name, String
15
+
12
16
  # @return [String] the path of the referenced filed.
13
17
  #
14
18
  attribute :path, String
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.19.4
4
+ version: 0.20.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: 2014-10-15 00:00:00.000000000 Z
11
+ date: 2014-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -49,7 +49,6 @@ extra_rdoc_files: []
49
49
  files:
50
50
  - README.md
51
51
  - LICENSE
52
- - ext/xcodeproj/xcodeproj_ext.bundle
53
52
  - lib/xcodeproj/command/project_diff.rb
54
53
  - lib/xcodeproj/command/show.rb
55
54
  - lib/xcodeproj/command/sort.rb
@@ -59,7 +58,6 @@ files:
59
58
  - lib/xcodeproj/config.rb
60
59
  - lib/xcodeproj/constants.rb
61
60
  - lib/xcodeproj/differ.rb
62
- - lib/xcodeproj/ext.rb
63
61
  - lib/xcodeproj/gem_version.rb
64
62
  - lib/xcodeproj/helper.rb
65
63
  - lib/xcodeproj/plist_helper.rb
@@ -104,7 +102,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
104
102
  requirements:
105
103
  - - '>='
106
104
  - !ruby/object:Gem::Version
107
- version: '0'
105
+ version: 2.0.0
108
106
  required_rubygems_version: !ruby/object:Gem::Requirement
109
107
  requirements:
110
108
  - - '>='
Binary file
data/lib/xcodeproj/ext.rb DELETED
@@ -1,12 +0,0 @@
1
- begin
2
- require 'xcodeproj/plist_helper'
3
- rescue LoadError
4
- require 'rbconfig'
5
- if RUBY_VERSION == '1.8.7' && RbConfig::CONFIG['prefix'] =~ %r{^/System/Library/Frameworks/Ruby.framework/}
6
- $:.unshift(File.expand_path('../../../ext', __FILE__))
7
- require 'xcodeproj/xcodeproj_ext'
8
- else
9
- raise 'The xcodeproj gem is only supported on Ruby versions that include' \
10
- 'the Fiddle API or with Ruby 1.8.7 that came with OS X 10.8.x.'
11
- end
12
- end