xcodeproj 0.18.0 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/bin/xcodeproj +5 -5
  3. data/lib/xcodeproj.rb +0 -2
  4. data/lib/xcodeproj/command.rb +26 -17
  5. data/lib/xcodeproj/command/project_diff.rb +8 -11
  6. data/lib/xcodeproj/command/show.rb +8 -10
  7. data/lib/xcodeproj/command/sort.rb +4 -7
  8. data/lib/xcodeproj/command/target_diff.rb +4 -5
  9. data/lib/xcodeproj/config.rb +64 -57
  10. data/lib/xcodeproj/config/other_linker_flags_parser.rb +62 -0
  11. data/lib/xcodeproj/constants.rb +31 -30
  12. data/lib/xcodeproj/differ.rb +5 -9
  13. data/lib/xcodeproj/gem_version.rb +1 -2
  14. data/lib/xcodeproj/helper.rb +5 -4
  15. data/lib/xcodeproj/plist_helper.rb +46 -11
  16. data/lib/xcodeproj/project.rb +16 -20
  17. data/lib/xcodeproj/project/case_converter.rb +59 -0
  18. data/lib/xcodeproj/project/object.rb +40 -30
  19. data/lib/xcodeproj/project/object/build_configuration.rb +1 -5
  20. data/lib/xcodeproj/project/object/build_file.rb +1 -4
  21. data/lib/xcodeproj/project/object/build_phase.rb +2 -13
  22. data/lib/xcodeproj/project/object/build_rule.rb +0 -3
  23. data/lib/xcodeproj/project/object/configuration_list.rb +0 -4
  24. data/lib/xcodeproj/project/object/container_item_proxy.rb +2 -4
  25. data/lib/xcodeproj/project/object/file_reference.rb +3 -6
  26. data/lib/xcodeproj/project/object/group.rb +6 -14
  27. data/lib/xcodeproj/project/object/helpers/file_references_factory.rb +64 -13
  28. data/lib/xcodeproj/project/object/helpers/groupable_helper.rb +4 -6
  29. data/lib/xcodeproj/project/object/native_target.rb +18 -29
  30. data/lib/xcodeproj/project/object/reference_proxy.rb +0 -4
  31. data/lib/xcodeproj/project/object/root_object.rb +4 -8
  32. data/lib/xcodeproj/project/object/target_dependency.rb +1 -4
  33. data/lib/xcodeproj/project/object_attributes.rb +76 -33
  34. data/lib/xcodeproj/project/object_dictionary.rb +76 -63
  35. data/lib/xcodeproj/project/object_list.rb +5 -9
  36. data/lib/xcodeproj/project/project_helper.rb +2 -7
  37. data/lib/xcodeproj/project/xcproj_helper.rb +0 -2
  38. data/lib/xcodeproj/scheme.rb +12 -15
  39. data/lib/xcodeproj/user_interface.rb +0 -4
  40. data/lib/xcodeproj/workspace.rb +36 -23
  41. data/lib/xcodeproj/workspace/file_reference.rb +3 -3
  42. data/lib/xcodeproj/xcodebuild_helper.rb +0 -6
  43. metadata +20 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 06c48b7bd46aeb7eb795a2ec7ec6e5ae9df37873
4
- data.tar.gz: 61e02524ef77d19d327a31a198823db5f2c8a8ee
3
+ metadata.gz: 3e60fb9981ce8111af008a6fede49f4bdb85da8d
4
+ data.tar.gz: b15a3c5bc25c0f775d4c55785a15ff7bd73a1dcb
5
5
  SHA512:
6
- metadata.gz: 6d3bcde97af5710149529b4225a666a45ad092f1525e610f07930ff8e48bfd032034f58dce7462fe4c2b3e34618a5400c9fad9d96443121b9e85e2dfdc8c6a29
7
- data.tar.gz: a703e835b631554b38738a1ec248f6fb9e25c29dc07b58f54f576569a7f1ce939bed45b4709919b336b72a357893df7ef27c6913541b778af072175f603e0f96
6
+ metadata.gz: 7f2fcf6d8a4676c47ea208ce946a8782718d1484bdd81fd7edc70e7ffcfa0d02f732f2727e5beac6a22fadcd18bb42ca9848949b2ba387afd894fbfabf8136da
7
+ data.tar.gz: d0b1e17ccdaba4f89ea2985a6278f742d003297e2c9d2c884e84ad73e8befb5246bf5329a95b74f1f498c0fafc4ad7f728fd9e63f5508a75cf3073c31b728f6e
data/bin/xcodeproj CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- if $0 == __FILE__
3
+ if $PROGRAM_NAME == __FILE__
4
4
  ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
5
- require "rubygems"
6
- require "bundler/setup"
7
- $:.unshift File.expand_path('../../ext', __FILE__)
8
- $:.unshift File.expand_path('../../lib', __FILE__)
5
+ require 'rubygems'
6
+ require 'bundler/setup'
7
+ $LOAD_PATH.unshift File.expand_path('../../ext', __FILE__)
8
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
9
9
  end
10
10
 
11
11
  require 'xcodeproj'
data/lib/xcodeproj.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  module Xcodeproj
2
-
3
2
  class PlainInformative < StandardError
4
3
  end
5
4
 
@@ -22,7 +21,6 @@ module Xcodeproj
22
21
  autoload :XCScheme, 'xcodeproj/scheme'
23
22
  autoload :XcodebuildHelper, 'xcodeproj/xcodebuild_helper'
24
23
 
25
-
26
24
  # TODO: Delete me (compatibility with CocoaPods 0.33.1)
27
25
  def self.read_plist(path)
28
26
  PlistHelper.read(path)
@@ -1,5 +1,4 @@
1
1
  module Xcodeproj
2
-
3
2
  require 'colored'
4
3
 
5
4
  class Command
@@ -33,16 +32,27 @@ module Xcodeproj
33
32
  def options
34
33
  options = @command_class.options
35
34
  keys = options.map(&:first)
36
- key_size = keys.inject(0) { |size, key| key.size > size ? key.size : size }
35
+ key_size = keys.reduce(0) { |size, key| key.size > size ? key.size : size }
37
36
  options.map { |key, desc| " #{key.ljust(key_size)} #{desc}" }.join("\n")
38
37
  end
39
38
  end
40
39
 
41
40
  class ARGV < Array
42
- def options; select { |x| x.to_s[0,1] == '-' }; end
43
- def arguments; self - options; end
44
- def option(name); !!delete(name); end
45
- def shift_argument; (arg = arguments[0]) && delete(arg); end
41
+ def options
42
+ select { |x| x.to_s[0, 1] == '-' }
43
+ end
44
+
45
+ def arguments
46
+ self - options
47
+ end
48
+
49
+ def option(name)
50
+ !!delete(name)
51
+ end
52
+
53
+ def shift_argument
54
+ (arg = arguments[0]) && delete(arg)
55
+ end
46
56
  end
47
57
 
48
58
  def self.banner
@@ -66,14 +76,14 @@ module Xcodeproj
66
76
  sub_command.run
67
77
 
68
78
  rescue Interrupt
69
- puts "[!] Cancelled".red
70
- #Config.instance.verbose? ? raise : exit(1)
79
+ puts '[!] Cancelled'.red
80
+ # Config.instance.verbose? ? raise : exit(1)
71
81
  exit(1)
72
82
 
73
- rescue Exception => e
83
+ rescue => e
74
84
  puts e.message
75
85
  unless e.is_a?(Informative) || e.is_a?(Help)
76
- puts *e.backtrace
86
+ puts e.backtrace
77
87
  end
78
88
  exit 1
79
89
  end
@@ -88,14 +98,14 @@ module Xcodeproj
88
98
 
89
99
  show_help = argv.option('--help')
90
100
 
91
- String.send(:define_method, :colorize) { |string , _| string } if argv.option( '--no-color' )
101
+ String.send(:define_method, :colorize) { |string, _| string } if argv.option('--no-color')
92
102
 
93
103
  command_class = case command_argument = argv.shift_argument
94
- when 'target-diff' then TargetDiff
95
- when 'project-diff' then ProjectDiff
96
- when 'show' then Show
97
- when 'sort' then Sort
98
- end
104
+ when 'target-diff' then TargetDiff
105
+ when 'project-diff' then ProjectDiff
106
+ when 'show' then Show
107
+ when 'sort' then Sort
108
+ end
99
109
 
100
110
  if command_class.nil?
101
111
  raise Help.new(self, argv, command_argument)
@@ -134,4 +144,3 @@ module Xcodeproj
134
144
  end
135
145
  end
136
146
  end
137
-
@@ -2,25 +2,25 @@ module Xcodeproj
2
2
  class Command
3
3
  class ProjectDiff < Command
4
4
  def self.banner
5
- %{Shows the difference between two projects:
5
+ %{Shows the difference between two projects:
6
6
 
7
- $ project-diff PROJECT_1 PROJECT_2
7
+ $ project-diff PROJECT_1 PROJECT_2
8
8
 
9
- It shows the difference in a UUID agnostic fashion.
9
+ It shows the difference in a UUID agnostic fashion.
10
10
 
11
- To reduce the noise (and to simplify implementation) differences in the
12
- order of arrays are ignored.}
11
+ To reduce the noise (and to simplify implementation) differences in the
12
+ order of arrays are ignored.}
13
13
  end
14
14
 
15
15
  def self.options
16
- [ ["--ignore KEY", "A key to ignore in the comparison. Can be specified multiple times."] ].concat(super)
16
+ [['--ignore KEY', 'A key to ignore in the comparison. Can be specified multiple times.']].concat(super)
17
17
  end
18
18
 
19
19
  def initialize(argv)
20
20
  @path_project1 = argv.shift_argument
21
21
  @path_project2 = argv.shift_argument
22
22
  unless @path_project1 && @path_project2
23
- raise Informative, "Two project paths are required."
23
+ raise Informative, 'Two project paths are required.'
24
24
  end
25
25
  @keys_to_ignore = []
26
26
  while (idx = argv.index('--ignore'))
@@ -30,7 +30,6 @@ module Xcodeproj
30
30
  super unless argv.empty?
31
31
  end
32
32
 
33
-
34
33
  def run
35
34
  hash_1 = Project.new(@path_project1).to_tree_hash.dup
36
35
  hash_2 = Project.new(@path_project2).to_tree_hash.dup
@@ -45,11 +44,9 @@ module Xcodeproj
45
44
  yaml = diff.to_yaml
46
45
  yaml = yaml.gsub(@path_project1, @path_project1.cyan)
47
46
  yaml = yaml.gsub(@path_project2, @path_project2.magenta)
48
- yaml = yaml.gsub(":diff:", "diff:".yellow)
47
+ yaml = yaml.gsub(':diff:', 'diff:'.yellow)
49
48
  puts yaml
50
49
  end
51
50
  end
52
51
  end
53
52
  end
54
-
55
-
@@ -2,17 +2,17 @@ module Xcodeproj
2
2
  class Command
3
3
  class Show < Command
4
4
  def self.banner
5
- %{Shows an overview of a project in a YAML representation.'
5
+ %(Shows an overview of a project in a YAML representation.'
6
6
 
7
- $ show [PROJECT]
7
+ $ show [PROJECT]
8
8
 
9
- If no `PROJECT' is specified then the current work directory is searched
10
- for one.}
9
+ If no `PROJECT' is specified then the current work directory is searched
10
+ for one.)
11
11
  end
12
12
 
13
13
  def self.options
14
14
  [
15
- ["--format [hash|tree_hash|raw]", "YAML output format, optional"],
15
+ ['--format [hash|tree_hash|raw]', 'YAML output format, optional'],
16
16
  ].concat(super)
17
17
  end
18
18
 
@@ -47,10 +47,10 @@ module Xcodeproj
47
47
  pretty_print = xcodeproj.pretty_print
48
48
  sections = []
49
49
  pretty_print.each do |key, value|
50
- section = key.green
50
+ section = key.green
51
51
  yaml = value.to_yaml
52
- yaml.gsub!(/^---$/,'')
53
- yaml.gsub!(/^-/,"\n-")
52
+ yaml.gsub!(/^---$/, '')
53
+ yaml.gsub!(/^-/, "\n-")
54
54
  section << yaml
55
55
  sections << section
56
56
  end
@@ -59,5 +59,3 @@ module Xcodeproj
59
59
  end
60
60
  end
61
61
  end
62
-
63
-
@@ -2,12 +2,12 @@ module Xcodeproj
2
2
  class Command
3
3
  class Sort < Command
4
4
  def self.banner
5
- %{Sorts the give project
5
+ %(Sorts the give project
6
6
 
7
- $ sort [PROJECT]
7
+ $ sort [PROJECT]
8
8
 
9
- If no `PROJECT' is specified then the current work directory is searched
10
- for one.}
9
+ If no `PROJECT' is specified then the current work directory is searched
10
+ for one.)
11
11
  end
12
12
 
13
13
  def initialize(argv)
@@ -24,6 +24,3 @@ module Xcodeproj
24
24
  end
25
25
  end
26
26
  end
27
-
28
-
29
-
@@ -2,16 +2,16 @@ module Xcodeproj
2
2
  class Command
3
3
  class TargetDiff < Command
4
4
  def self.banner
5
- %{Shows the difference between two targets:
5
+ %(Shows the difference between two targets:
6
6
 
7
- $ targets-diff [target 1] [target 2]
7
+ $ targets-diff [target 1] [target 2]
8
8
 
9
- Only supports build source files atm.}
9
+ Only supports build source files atm.)
10
10
  end
11
11
 
12
12
  def self.options
13
13
  [
14
- ["--project PATH", "The Xcode project document to use."],
14
+ ['--project PATH', 'The Xcode project document to use.'],
15
15
  ].concat(super)
16
16
  end
17
17
 
@@ -39,4 +39,3 @@ module Xcodeproj
39
39
  end
40
40
  end
41
41
  end
42
-
@@ -1,12 +1,11 @@
1
1
  require 'shellwords'
2
+ require 'xcodeproj/config/other_linker_flags_parser'
2
3
 
3
4
  module Xcodeproj
4
-
5
5
  # This class holds the data for a Xcode build settings file (xcconfig) and
6
6
  # provides support for serialization.
7
7
  #
8
8
  class Config
9
-
10
9
  require 'set'
11
10
 
12
11
  # @return [Hash{String => String}] The attributes of the settings file
@@ -14,20 +13,11 @@ module Xcodeproj
14
13
  #
15
14
  attr_accessor :attributes
16
15
 
17
- # @return [Set<String>] The list of the frameworks required by this
18
- # settings file.
19
- #
20
- attr_accessor :frameworks
21
-
22
- # @return [Set<String>] The list of the *weak* frameworks required by
23
- # this settings file.
24
- #
25
- attr_accessor :weak_frameworks
26
-
27
- # @return [Set<String>] The list of the libraries required by this
28
- # settings file.
16
+ # @return [Hash{Symbol => Set<String>}] The other linker flags by key.
17
+ # Xcodeproj handles them in a dedicated way to prevent duplication
18
+ # of the libraries and of the frameworks.
29
19
  #
30
- attr_accessor :libraries
20
+ attr_accessor :other_linker_flags
31
21
 
32
22
  # @return [Array] The list of the configuration files included by this
33
23
  # configuration file (`#include "SomeConfig"`).
@@ -40,7 +30,10 @@ module Xcodeproj
40
30
  def initialize(xcconfig_hash_or_file = {})
41
31
  @attributes = {}
42
32
  @includes = []
43
- @frameworks, @weak_frameworks, @libraries = Set.new, Set.new, Set.new
33
+ @other_linker_flags = {}
34
+ [:simple, :frameworks, :weak_frameworks, :libraries].each do |key|
35
+ @other_linker_flags[key] = Set.new
36
+ end
44
37
  merge!(extract_hash(xcconfig_hash_or_file))
45
38
  end
46
39
 
@@ -49,14 +42,13 @@ module Xcodeproj
49
42
  end
50
43
 
51
44
  def ==(other)
52
- other.respond_to?(:to_hash) && other.to_hash == self.to_hash
45
+ other.respond_to?(:to_hash) && other.to_hash == to_hash
53
46
  end
54
47
 
55
- #-------------------------------------------------------------------------#
56
-
57
48
  public
58
49
 
59
50
  # @!group Serialization
51
+ #-------------------------------------------------------------------------#
60
52
 
61
53
  # Sorts the internal data by setting name and serializes it in the xcconfig
62
54
  # format.
@@ -69,7 +61,7 @@ module Xcodeproj
69
61
  # @return [String] The serialized internal data.
70
62
  #
71
63
  def to_s(prefix = nil)
72
- include_lines = includes.map { |path| "#include \"#{normalized_xcconfig_path(path)}\""}
64
+ include_lines = includes.map { |path| "#include \"#{normalized_xcconfig_path(path)}\"" }
73
65
  settings = to_hash(prefix).sort_by(&:first).map { |k, v| "#{k} = #{v}" }
74
66
  [include_lines + settings].join("\n")
75
67
  end
@@ -87,8 +79,8 @@ module Xcodeproj
87
79
  end
88
80
 
89
81
  # The hash representation of the xcconfig. The hash includes the
90
- # frameworks, the weak frameworks and the libraries in the `Other Linker
91
- # Flags` (`OTHER_LDFLAGS`).
82
+ # frameworks, the weak frameworks, the libraries and the simple other
83
+ # linker flags in the `Other Linker Flags` (`OTHER_LDFLAGS`).
92
84
  #
93
85
  # @note All the values are sorted to have a consistent output in Ruby
94
86
  # 1.8.7.
@@ -96,26 +88,54 @@ module Xcodeproj
96
88
  # @return [Hash] The hash representation
97
89
  #
98
90
  def to_hash(prefix = nil)
99
- hash = @attributes.dup
100
- flags = hash['OTHER_LDFLAGS'] || ''
101
- flags = flags.dup.strip
102
- flags << libraries.to_a.sort.reduce('') {| memo, l | memo << " -l#{l}" }
103
- flags << frameworks.to_a.sort.reduce('') {| memo, f | memo << " -framework #{f}" }
104
- flags << weak_frameworks.to_a.sort.reduce('') {| memo, f | memo << " -weak_framework #{f}" }
105
- hash['OTHER_LDFLAGS'] = flags.strip
106
- hash.delete('OTHER_LDFLAGS') if flags.strip.empty?
91
+ list = []
92
+ list += other_linker_flags[:simple].to_a.sort
93
+ modifiers = {
94
+ :frameworks => '-framework',
95
+ :weak_frameworks => '-weak_framework',
96
+ :libraries => '-l',
97
+ }
98
+ [:libraries, :frameworks, :weak_frameworks].each do |key|
99
+ modifier = modifiers[key]
100
+ sorted = other_linker_flags[key].to_a.sort
101
+ list += sorted.map { |l| %(#{modifier} "#{l}") }
102
+ end
103
+
104
+ result = attributes.dup
105
+ result['OTHER_LDFLAGS'] = list.join(' ') unless list.empty?
106
+
107
107
  if prefix
108
- Hash[hash.map {|k, v| [prefix + k, v]}]
108
+ Hash[result.map { |k, v| [prefix + k, v] }]
109
109
  else
110
- hash
110
+ result
111
111
  end
112
112
  end
113
113
 
114
- #-------------------------------------------------------------------------#
114
+ # @return [Set<String>] The list of the frameworks required by this
115
+ # settings file.
116
+ #
117
+ def frameworks
118
+ other_linker_flags[:frameworks]
119
+ end
120
+
121
+ # @return [Set<String>] The list of the *weak* frameworks required by
122
+ # this settings file.
123
+ #
124
+ def weak_frameworks
125
+ other_linker_flags[:weak_frameworks]
126
+ end
127
+
128
+ # @return [Set<String>] The list of the libraries required by this
129
+ # settings file.
130
+ #
131
+ def libraries
132
+ other_linker_flags[:libraries]
133
+ end
115
134
 
116
135
  public
117
136
 
118
137
  # @!group Merging
138
+ #-------------------------------------------------------------------------#
119
139
 
120
140
  # Merges the given xcconfig representation in the receiver.
121
141
  #
@@ -139,29 +159,17 @@ module Xcodeproj
139
159
  def merge!(xcconfig)
140
160
  if xcconfig.is_a? Config
141
161
  merge_attributes!(xcconfig.attributes)
142
- @libraries.merge(xcconfig.libraries)
143
- @frameworks.merge(xcconfig.frameworks)
144
- @weak_frameworks.merge(xcconfig.weak_frameworks)
162
+ other_linker_flags.keys.each do |key|
163
+ other_linker_flags[key].merge(xcconfig.other_linker_flags[key])
164
+ end
145
165
  else
146
166
  merge_attributes!(xcconfig.to_hash)
147
-
148
- # Parse frameworks and libraries. Then remove them from the linker
149
- # flags
150
- flags = @attributes['OTHER_LDFLAGS']
151
- return unless flags
152
-
153
- frameworks = flags.scan(/(?:\A|\s)-framework\s+([^\s]+)/).map { |m| m[0] }
154
- weak_frameworks = flags.scan(/(?:\A|\s)-weak_framework\s+([^\s]+)/).map { |m| m[0] }
155
- libraries = flags.scan(/(?:\A|\s)-l ?([^\s]+)/).map { |m| m[0] }
156
- @frameworks.merge frameworks
157
- @weak_frameworks.merge weak_frameworks
158
- @libraries.merge libraries
159
-
160
- new_flags = flags.dup
161
- frameworks.each {|f| new_flags.gsub!("-framework #{f}", "") }
162
- weak_frameworks.each {|f| new_flags.gsub!("-weak_framework #{f}", "") }
163
- libraries.each {|l| new_flags.gsub!("-l#{l}", ""); new_flags.gsub!("-l #{l}", "") }
164
- @attributes['OTHER_LDFLAGS'] = new_flags.gsub("\w*", ' ').strip
167
+ if flags = attributes.delete('OTHER_LDFLAGS')
168
+ flags_by_key = OtherLinkerFlagsParser.parse(flags)
169
+ other_linker_flags.keys.each do |key|
170
+ other_linker_flags[key].merge(flags_by_key[key])
171
+ end
172
+ end
165
173
  end
166
174
  end
167
175
  alias_method :<<, :merge!
@@ -175,13 +183,13 @@ module Xcodeproj
175
183
  # @return [Config] the new xcconfig.
176
184
  #
177
185
  def merge(config)
178
- self.dup.tap { |x| x.merge!(config) }
186
+ dup.tap { |x| x.merge!(config) }
179
187
  end
180
188
 
181
189
  # @return [Config] A copy of the receiver.
182
190
  #
183
191
  def dup
184
- Xcodeproj::Config.new(self.to_hash.dup)
192
+ Xcodeproj::Config.new(to_hash.dup)
185
193
  end
186
194
 
187
195
  #-------------------------------------------------------------------------#
@@ -302,6 +310,5 @@ module Xcodeproj
302
310
  end
303
311
 
304
312
  #-------------------------------------------------------------------------#
305
-
306
313
  end
307
314
  end