cocoapods 0.23.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a84359c5124c149ebe91ff9dfc1c13365810c69f
4
- data.tar.gz: c6603183ff3a4ff61f66adf32555d2eb031d4d0f
3
+ metadata.gz: 715b8dbbcd30e102cab744b29a1c7d2de026fdf5
4
+ data.tar.gz: f047dae069b1bc0cf5e8112f829e1e50b9f0e957
5
5
  SHA512:
6
- metadata.gz: e94d2d8af92dc3cde69a47ad25243848c55d5a5f5bd37d30dd75a302a1c6952110b8a4bb504cefba6662893f44a5633bc44a7c45a42c68e171e0fa1ce8e2a16c
7
- data.tar.gz: e4b4ff2b5023866af419cf77ddef26fef893b5cdc4652d112d4903d98dee98b532275d49ea4207cfb3284eab5e149eaa41b6d801bad2a806d5b004a15dac834f
6
+ metadata.gz: b07a220e098bd9f7a9f8a73b672dacdbef5ea867602ba5fb234c02e7ae1b9b03eb25358c0fed78c8c2691fe49b4b155c788fcb62237758e7773d81f1584b65e8
7
+ data.tar.gz: eb7e3c4cb5a1bd97f0f39016ed5241f14743dec70fa5a6bcbeb8748a63094e3ef02a22d7eb1a94750a9f4ced3ee279ef3a0bc9854b8512fb53e6bae038904d56
@@ -4,8 +4,79 @@ To install or update CocoaPods see this [guide](http://docs.cocoapods.org/guides
4
4
 
5
5
  ## Master
6
6
 
7
+
8
+ ## 0.24.0
9
+
10
+ ###### Enhancements
11
+ [CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.22.3...0.23.0.rc1)
12
+ • [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.22.3...0.23.0.rc1)
13
+ • [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.8.1...0.9.0)
14
+ • [cocoapods-downloader](https://github.com/CocoaPods/cocoapods-downloader/compare/0.1.1...0.1.2)
15
+
16
+
17
+ ###### Enhancements
18
+
19
+ * Added `pod init` command which generates a Podfile according to the
20
+ targets of the project stored in the working directory and to the templates
21
+ stored in the `~/.cocoapods/templates` folder. Tow templates are supported:
22
+ - the `Podfile.default` template for regular targets.
23
+ - and the `Podfile.test` template for test targets.
24
+
25
+ [Ian Ynda-Hummel](https://github.com/ianyh)
26
+ [#1106](https://github.com/CocoaPods/CocoaPods/issues/1106)
27
+ [#1045](https://github.com/CocoaPods/CocoaPods/issues/1045)
28
+
29
+ * CocoaPods will now leverage the [xcproj](https://github.com/0xced/xcproj)
30
+ command line tool if available in the path of the user to touch saved
31
+ projects. This will result in projects being serialized in the exact format
32
+ used by Xcode eliminating merge conflicts and other related issues. To learn
33
+ more about how to install xcproj see its
34
+ [readme](https://github.com/0xced/xcproj).
35
+ [Cédric Luthi](https://github.com/0xced)
36
+ [#1275](https://github.com/CocoaPods/CocoaPods/issues/1275)
37
+
38
+ * Rationalized and cleaned up Pods project group structure and path specification.
39
+
40
+ * Create all necessary build configurations for *Pods.xcodeproj* at the project level. If the user’s project has more than just *Debug* and *Release* build configurations, they may be explicitly specified in the Podfile:
41
+ `xcodeproj 'MyApp', 'App Store' => :release, 'Debug' => :debug, 'Release' => :release`
42
+ If build configurations aren’t specified in the Podfile then they will be automatically picked from the user’s project in *Release* mode.
43
+ These changes will ensure that the `libPods.a` static library is not stripped for all configurations, as explained in [#1217](https://github.com/CocoaPods/CocoaPods/pull/1217).
44
+ [Cédric Luthi](https://github.com/0xced)
45
+ [#1294](https://github.com/CocoaPods/CocoaPods/issues/1294)
46
+
47
+ * Added basic support for Bazaar repositories.
48
+ [Fred McCann](https://github.com/fmccann)
49
+ [cocoapods-downloader#4](https://github.com/CocoaPods/cocoapods-downloader/pull/4)
50
+
51
+ ###### Bug Fixes
52
+
53
+ * Fixed crash in `pod spec cat`.
54
+
55
+ * Use the `TARGET_BUILD_DIR` environment variable for installing resource bundles.
56
+ [Cédric Luthi](https://github.com/0xced)
57
+ [#1268](https://github.com/CocoaPods/CocoaPods/issues/1268)
58
+
59
+ * CoreData versioned models are now properly handled respecting the contents of
60
+ the `.xccurrentversion` file.
61
+ [#1288](https://github.com/CocoaPods/CocoaPods/issues/1288),
62
+ [Xcodeproj#83](https://github.com/CocoaPods/Xcodeproj/pull/83)
63
+ [Ashton-W](https://github.com/Ashton-W)
64
+
65
+ * OS X frameworks are now copied to the Resources folder using rsync to
66
+ properly overwrite existing files.
67
+ [Nikolaj Schumacher](https://github.com/nschum)
68
+ [#1063](https://github.com/CocoaPods/CocoaPods/issues/1063)
69
+
70
+ * User defined build configurations are now added to the resource bundle
71
+ targets.
72
+ [#1309](https://github.com/CocoaPods/CocoaPods/issues/1309),
73
+
74
+
7
75
  ## 0.23.0
8
76
 
77
+
78
+ ## 0.23.0.rc1
79
+
9
80
  ###### Enhancements
10
81
  [CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.22.3...0.23.0.rc1)
11
82
  • [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.22.3...0.23.0.rc1)
data/LICENSE CHANGED
@@ -1,3 +1,5 @@
1
+ This project is licensed under the MIT license.
2
+
1
3
  Copyright (c) 2011 - 2012 Eloy Durán <eloy.de.enige@gmail.com>
2
4
  Copyright (c) 2012 Fabio Pelosin <fabiopelosin@gmail.com>
3
5
 
@@ -1,6 +1,5 @@
1
1
  require 'rubygems'
2
-
3
- autoload :Xcodeproj, 'xcodeproj'
2
+ require 'xcodeproj'
4
3
 
5
4
  module Pod
6
5
  require 'pathname'
@@ -20,6 +20,7 @@ module Pod
20
20
  require 'cocoapods/command/search'
21
21
  require 'cocoapods/command/setup'
22
22
  require 'cocoapods/command/spec'
23
+ require 'cocoapods/command/init'
23
24
 
24
25
  self.abstract_command = true
25
26
  self.default_subcommand = 'install'
@@ -0,0 +1,90 @@
1
+ require 'xcodeproj'
2
+ require 'active_support/core_ext/string/strip'
3
+
4
+ module Pod
5
+ class Command
6
+ class Init < Command
7
+
8
+ self.summary = 'Generate a Podfile for the current directory.'
9
+ self.description = <<-DESC
10
+ Creates a Podfile for the current directory if none currently exists. If
11
+ an Xcode project file is specified or if there is only a single project
12
+ file in the current directory, targets will be automatically generated
13
+ based on targets defined in the project.
14
+
15
+ It is possible to specify a list of dependencies which will be used by
16
+ the template in the `Podfile.default` (normal targets) `Podfile.test`
17
+ (test targets) files which should be stored in the
18
+ `~/.cocoapods/templates` folder.
19
+ DESC
20
+ self.arguments = '[XCODEPROJ]'
21
+
22
+ def initialize(argv)
23
+ @podfile_path = Pathname.pwd + "Podfile"
24
+ @project_path = argv.shift_argument
25
+ @project_paths = Pathname.pwd.children.select { |pn| pn.extname == '.xcodeproj' }
26
+ super
27
+ end
28
+
29
+ def validate!
30
+ super
31
+ raise Informative, "Existing Podfile found in directory" unless config.podfile.nil?
32
+ if @project_path
33
+ help! "Xcode project at #{@project_path} does not exist" unless File.exist? @project_path
34
+ else
35
+ raise Informative, "No xcode project found, please specify one" unless @project_paths.length > 0
36
+ raise Informative, "Multiple xcode projects found, please specify one" unless @project_paths.length == 1
37
+ @project_path = @project_paths.first
38
+ end
39
+ @xcode_project = Xcodeproj::Project.open(@project_path)
40
+ end
41
+
42
+ def run
43
+ @podfile_path.open('w') { |f| f << podfile_template(@xcode_project) }
44
+ end
45
+
46
+ private
47
+
48
+ # @param [Xcodeproj::Project] project
49
+ # The xcode project to generate a podfile for.
50
+ #
51
+ # @return [String] the text of the Podfile for the provided project
52
+ #
53
+ def podfile_template(project)
54
+ podfile = <<-PLATFORM.strip_heredoc
55
+ # Uncomment this line to define a global platform for your project
56
+ # platform :ios, "6.0"
57
+ PLATFORM
58
+ for target in project.targets
59
+ podfile << target_module(target)
60
+ end
61
+ podfile << "\n"
62
+ end
63
+
64
+ # @param [Xcodeproj::PBXTarget] target
65
+ # A target to generate a Podfile target module for.
66
+ #
67
+ # @return [String] the text for the target module
68
+ #
69
+ def target_module(target)
70
+ target_module = "\ntarget \"#{target.name}\" do\n"
71
+
72
+ if target.name =~ /tests?/i
73
+ target_module << template_contents(config.default_test_podfile_path)
74
+ else
75
+ target_module << template_contents(config.default_podfile_path)
76
+ end
77
+ target_module << "\nend\n"
78
+ end
79
+
80
+
81
+ def template_contents(path)
82
+ if path.exist?
83
+ path.read.chomp.lines.map{ |line| " #{line}" }.join("\n")
84
+ else
85
+ String.new
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -6,7 +6,7 @@ module Pod
6
6
  self.summary = 'Setup the CocoaPods environment'
7
7
 
8
8
  self.description = <<-DESC
9
- Creates a directory at `~/.cocoapods` which will hold your spec-repos.
9
+ Creates a directory at `~/.cocoapods/repos` which will hold your spec-repos.
10
10
  This is where it will create a clone of the public `master` spec-repo from:
11
11
 
12
12
  https://github.com/CocoaPods/Specs
@@ -304,7 +304,7 @@ module Pod
304
304
  # @return [Pathname] the absolute path of the given spec and source
305
305
  #
306
306
  def pathname_from_spec(spec, source)
307
- Pathname.new("~/.cocoapods/#{ source }/#{ spec.name }/#{ spec.version }/#{ spec.name }.podspec").expand_path
307
+ config.repos_dir + "#{source}/#{spec.name}/#{spec.version}/#{spec.name}.podspec"
308
308
  end
309
309
 
310
310
  # @return [String] of spec paths one on each line
@@ -147,6 +147,12 @@ module Pod
147
147
 
148
148
  attr_writer :repos_dir
149
149
 
150
+ # @return [Pathname] the directory where the CocoaPods templates are stored.
151
+ #
152
+ def templates_dir
153
+ @templates_dir ||= Pathname.new(ENV['CP_TEMPLATES_DIR'] || "~/.cocoapods/templates").expand_path
154
+ end
155
+
150
156
  # @return [Pathname] the root of the CocoaPods installation where the
151
157
  # Podfile is located.
152
158
  #
@@ -223,6 +229,26 @@ module Pod
223
229
  @lockfile_path ||= installation_root + 'Podfile.lock'
224
230
  end
225
231
 
232
+ # Returns the path of the default Podfile pods.
233
+ #
234
+ # @note The file is expected to be named Podfile.default
235
+ #
236
+ # @return [Pathname]
237
+ #
238
+ def default_podfile_path
239
+ @default_podfile_path ||= templates_dir + "Podfile.default"
240
+ end
241
+
242
+ # Returns the path of the default Podfile test pods.
243
+ #
244
+ # @note The file is expected to be named Podfile.test
245
+ #
246
+ # @return [Pathname]
247
+ #
248
+ def default_test_podfile_path
249
+ @default_test_podfile_path ||= templates_dir + "Podfile.test"
250
+ end
251
+
226
252
  # @return [Pathname] The file to use a cache of the statistics provider.
227
253
  #
228
254
  def statistics_cache_file
@@ -1,6 +1,6 @@
1
1
  module Pod
2
2
  # The version of the cocoapods command line tool.
3
3
  #
4
- VERSION = '0.23.0' unless defined? Pod::VERSION
4
+ VERSION = '0.24.0' unless defined? Pod::VERSION
5
5
  end
6
6
 
@@ -98,8 +98,8 @@ install_resource()
98
98
  *.framework)
99
99
  echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
100
100
  mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
101
- echo "cp -fpR ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
102
- cp -fpR "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
101
+ echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
102
+ rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
103
103
  ;;
104
104
  *.xcdatamodel)
105
105
  echo "xcrun momc \\"${PODS_ROOT}/$1\\" \\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\\""
@@ -285,10 +285,23 @@ module Pod
285
285
  #
286
286
  def prepare_pods_project
287
287
  UI.message "- Creating Pods project" do
288
- @pods_project = Pod::Project.new(sandbox)
288
+ @pods_project = Pod::Project.new(sandbox.project_path)
289
+
290
+ analysis_result.all_user_build_configurations.each do |name, type|
291
+ @pods_project.add_build_configuration(name, type)
292
+ end
293
+
294
+ pod_names = pod_targets.map(&:pod_name).uniq
295
+ pod_names.each do |pod_name|
296
+ path = sandbox.pod_dir(pod_name)
297
+ local = sandbox.local?(pod_name)
298
+ @pods_project.add_pod_group(pod_name, path, local)
299
+ end
300
+
289
301
  if config.podfile_path
290
302
  @pods_project.add_podfile(config.podfile_path)
291
303
  end
304
+
292
305
  sandbox.project = @pods_project
293
306
  platforms = aggregate_targets.map(&:platform)
294
307
  osx_deployment_target = platforms.select { |p| p.name == :osx }.map(&:deployment_target).min
@@ -331,6 +344,16 @@ module Pod
331
344
  target_installer = AggregateTargetInstaller.new(sandbox, target)
332
345
  target_installer.install!
333
346
  end
347
+
348
+ # TODO
349
+ # Move and add specs
350
+ pod_targets.sort_by(&:name).each do |pod_target|
351
+ pod_target.file_accessors.each do |file_accessor|
352
+ file_accessor.spec_consumer.frameworks.each do |framework|
353
+ ref = pods_project.add_system_framework(framework, pod_target.target)
354
+ end
355
+ end
356
+ end
334
357
  end
335
358
  end
336
359
 
@@ -360,10 +383,9 @@ module Pod
360
383
  #
361
384
  def link_aggregate_target
362
385
  aggregate_targets.each do |aggregate_target|
363
- native_target = pods_project.targets.select { |t| t.name == aggregate_target.name }.first
364
- products = pods_project.products_group
386
+ native_target = aggregate_target.target
365
387
  aggregate_target.pod_targets.each do |pod_target|
366
- product = products.files.select { |f| f.path == pod_target.product_name }.first
388
+ product = pod_target.target.product_reference
367
389
  native_target.frameworks_build_phase.add_file_reference(product)
368
390
  end
369
391
  end
@@ -375,9 +397,10 @@ module Pod
375
397
  #
376
398
  def write_pod_project
377
399
  UI.message "- Writing Xcode project file to #{UI.path sandbox.project_path}" do
378
- pods_project.main_group.sort_by_type!
379
- pods_project['Frameworks'].sort_by_type!
380
- pods_project.save_as(sandbox.project_path)
400
+ pods_project.pods.remove_from_project if pods_project.pods.empty?
401
+ pods_project.development_pods.remove_from_project if pods_project.development_pods.empty?
402
+ pods_project.main_group.recursively_sort_by_type
403
+ pods_project.save
381
404
  end
382
405
  end
383
406
 
@@ -169,7 +169,7 @@ module Pod
169
169
 
170
170
  if config.integrate_targets?
171
171
  project_path = compute_user_project_path(target_definition)
172
- user_project = Xcodeproj::Project.new(project_path)
172
+ user_project = Xcodeproj::Project.open(project_path)
173
173
  native_targets = compute_user_project_targets(target_definition, user_project)
174
174
 
175
175
  target.user_project_path = project_path
@@ -449,7 +449,7 @@ module Pod
449
449
  podfile.target_definition_list.each do |target_definition|
450
450
  if config.integrate_targets?
451
451
  project_path = compute_user_project_path(target_definition)
452
- user_project = Xcodeproj::Project.new(project_path)
452
+ user_project = Xcodeproj::Project.open(project_path)
453
453
  targets = compute_user_project_targets(target_definition, user_project)
454
454
  platform = compute_platform_for_target_definition(target_definition, targets)
455
455
  else
@@ -488,6 +488,16 @@ module Pod
488
488
  #
489
489
  attr_accessor :targets
490
490
 
491
+ # @return [Hash{String=>Symbol}] A hash representing all the user build
492
+ # configurations across all integration targets. Each key
493
+ # corresponds to the name of a configuration and its value to
494
+ # its type (`:debug` or `:release`).
495
+ #
496
+ def all_user_build_configurations
497
+ targets.inject({}) do |result, target|
498
+ result.merge(target.user_build_configurations)
499
+ end
500
+ end
491
501
  end
492
502
 
493
503
  #-----------------------------------------------------------------------#
@@ -65,15 +65,11 @@ module Pod
65
65
  # @note The source files are grouped by Pod and in turn by subspec
66
66
  # (recursively).
67
67
  #
68
- # @note Pods are generally added to the `Pods` group, however, if they
69
- # have a local source they are added to the
70
- # `Local Pods` group.
71
- #
72
68
  # @return [void]
73
69
  #
74
70
  def add_source_files_references
75
71
  UI.message "- Adding source files to Pods project" do
76
- add_file_acessors_paths_to_pods_group(:source_files, :source_files)
72
+ add_file_accessors_paths_to_pods_group(:source_files, :source_files)
77
73
  end
78
74
  end
79
75
 
@@ -83,7 +79,7 @@ module Pod
83
79
  #
84
80
  def add_frameworks_bundles
85
81
  UI.message "- Adding frameworks to Pods project" do
86
- add_file_acessors_paths_to_pods_group(:vendored_frameworks, :frameworks_and_libraries)
82
+ add_file_accessors_paths_to_pods_group(:vendored_frameworks, :frameworks_and_libraries)
87
83
  end
88
84
  end
89
85
 
@@ -93,7 +89,7 @@ module Pod
93
89
  #
94
90
  def add_vendored_libraries
95
91
  UI.message "- Adding frameworks to Pods project" do
96
- add_file_acessors_paths_to_pods_group(:vendored_libraries, :frameworks_and_libraries)
92
+ add_file_accessors_paths_to_pods_group(:vendored_libraries, :frameworks_and_libraries)
97
93
  end
98
94
  end
99
95
 
@@ -106,8 +102,8 @@ module Pod
106
102
  #
107
103
  def add_resources
108
104
  UI.message "- Adding resources to Pods project" do
109
- add_file_acessors_paths_to_pods_group(:resources, :resources)
110
- add_file_acessors_paths_to_pods_group(:resource_bundle_files, :resources)
105
+ add_file_accessors_paths_to_pods_group(:resources, :resources)
106
+ add_file_accessors_paths_to_pods_group(:resource_bundle_files, :resources)
111
107
  end
112
108
  end
113
109
 
@@ -160,7 +156,7 @@ module Pod
160
156
  #
161
157
  # @return [void]
162
158
  #
163
- def add_file_acessors_paths_to_pods_group(file_accessor_key, group_key)
159
+ def add_file_accessors_paths_to_pods_group(file_accessor_key, group_key)
164
160
  file_accessors.each do |file_accessor|
165
161
  paths = file_accessor.send(file_accessor_key)
166
162
  paths.each do |path|
@@ -52,13 +52,7 @@ module Pod
52
52
  @target.build_settings('Release').merge!(settings)
53
53
 
54
54
  library.user_build_configurations.each do |bc_name, type|
55
- unless @target.build_configurations.map(&:name).include?(bc_name)
56
- build_config = project.new(Xcodeproj::Project::XCBuildConfiguration)
57
- build_config.name = bc_name
58
- settings = @target.build_settings(type.to_s.capitalize).dup
59
- build_config.build_settings = settings
60
- target.build_configurations << build_config
61
- end
55
+ @target.add_build_configuration(bc_name, type)
62
56
  end
63
57
 
64
58
  library.target = @target
@@ -126,8 +120,7 @@ module Pod
126
120
  # @return [PBXFileReference] the file reference of the added file.
127
121
  #
128
122
  def add_file_to_support_group(path)
129
- relative_path = path.relative_path_from(sandbox.root)
130
- support_files_group.new_file(relative_path)
123
+ support_files_group.new_file(path)
131
124
  end
132
125
 
133
126
  #-----------------------------------------------------------------------#
@@ -90,8 +90,8 @@ module Pod
90
90
  path = library.copy_resources_script_path
91
91
  UI.message "- Generating copy resources script at #{UI.path(path)}" do
92
92
  file_accessors = library.pod_targets.map(&:file_accessors).flatten
93
- resource_paths = file_accessors.map { |accessor| accessor.resources.flatten.map {|res| project.relativize(res)} }.flatten
94
- resource_bundles = file_accessors.map { |accessor| accessor.resource_bundles.keys.map {|name| "${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/#{name}.bundle" } }.flatten
93
+ resource_paths = file_accessors.map { |accessor| accessor.resources.flatten.map { |res| res.relative_path_from(project.path.dirname) }}.flatten
94
+ resource_bundles = file_accessors.map { |accessor| accessor.resource_bundles.keys.map {|name| "${TARGET_BUILD_DIR}/#{name}.bundle" } }.flatten
95
95
  resources = []
96
96
  resources.concat(resource_paths)
97
97
  resources.concat(resource_bundles)
@@ -13,9 +13,10 @@ module Pod
13
13
  def install!
14
14
  UI.message "- Installing target `#{library.name}` #{library.platform}" do
15
15
  add_target
16
+ move_target_product_file_reference
16
17
  add_files_to_build_phases
17
18
  add_resources_bundle_targets
18
- create_suport_files_group
19
+ # create_suport_files_group
19
20
  create_xcconfig_file
20
21
  create_prefix_header
21
22
  create_dummy_source
@@ -40,16 +41,19 @@ module Pod
40
41
  consumer = file_accessor.spec_consumer
41
42
  flags = compiler_flags_for_consumer(consumer)
42
43
  source_files = file_accessor.source_files
43
- file_refs = source_files.map { |sf| project.file_reference(sf) }
44
+ file_refs = source_files.map { |sf| project.reference_for_path(sf) }
44
45
  target.add_file_references(file_refs, flags)
45
46
 
46
- file_accessor.spec_consumer.frameworks.each do |framework|
47
- project.add_system_framework(framework, target)
48
- end
49
47
  end
50
48
  end
51
49
  end
52
50
 
51
+ def move_target_product_file_reference
52
+ pod_name = library.pod_name
53
+ group = project.group_for_spec(pod_name, :products)
54
+ target.product_reference.move(group)
55
+ end
56
+
53
57
  # Adds the resources of the Pods to the Pods project.
54
58
  #
55
59
  # @note The source files are grouped by Pod and in turn by subspec
@@ -61,12 +65,16 @@ module Pod
61
65
  UI.message "- Adding resource bundles to Pods project" do
62
66
  library.file_accessors.each do |file_accessor|
63
67
  file_accessor.resource_bundles.each do |bundle_name, paths|
64
- file_references = paths.map { |sf| project.file_reference(sf) }
65
- group = project.group_for_spec(file_accessor.spec.name, :resources)
68
+ file_references = paths.map { |sf| project.reference_for_path(sf) }
69
+ group = project.group_for_spec(file_accessor.spec.name, :products)
66
70
  product_group = project.group_for_spec(file_accessor.spec.name, :resources)
67
71
  bundle_target = project.new_resources_bundle(bundle_name, file_accessor.spec_consumer.platform_name, product_group)
68
72
  bundle_target.add_resources(file_references)
69
73
 
74
+ library.user_build_configurations.each do |bc_name, type|
75
+ bundle_target.add_build_configuration(bc_name, type)
76
+ end
77
+
70
78
  target.add_dependency(bundle_target)
71
79
  end
72
80
  end
@@ -179,6 +187,19 @@ module Pod
179
187
  flags * " "
180
188
  end
181
189
 
190
+ # Adds a reference to the given file in the support group of this target.
191
+ #
192
+ # @param [Pathname] path
193
+ # The path of the file to which the reference should be added.
194
+ #
195
+ # @return [PBXFileReference] the file reference of the added file.
196
+ #
197
+ def add_file_to_support_group(path)
198
+ pod_name = library.pod_name
199
+ group = project.group_for_spec(pod_name, :support_files)
200
+ group.new_file(path)
201
+ end
202
+
182
203
  #-----------------------------------------------------------------------#
183
204
 
184
205
  end
@@ -32,7 +32,7 @@ module Pod
32
32
  add_pods_library
33
33
  add_copy_resources_script_phase
34
34
  add_check_manifest_lock_script_phase
35
- save_user_project
35
+ user_project.save
36
36
  end
37
37
  end
38
38
 
@@ -66,14 +66,14 @@ module Pod
66
66
  # other TargetIntegrators might have modified it.
67
67
  #
68
68
  def user_project
69
- @user_project ||= Xcodeproj::Project.new(target.user_project_path)
69
+ @user_project ||= Xcodeproj::Project.open(target.user_project_path)
70
70
  end
71
71
 
72
72
  # Read the pods project from the disk to ensure that it is up to date as
73
73
  # other TargetIntegrators might have modified it.
74
74
  #
75
75
  def pods_project
76
- @pods_project ||= Xcodeproj::Project.new(target.sandbox.project_path)
76
+ @pods_project ||= Xcodeproj::Project.open(target.sandbox.project_path)
77
77
  end
78
78
 
79
79
  # @return [String] a string representation suitable for debugging.
@@ -182,14 +182,6 @@ module Pod
182
182
  end
183
183
  end
184
184
 
185
- # Saves the changes to the user project to the disk.
186
- #
187
- # @return [void]
188
- #
189
- def save_user_project
190
- user_project.save_as(target.user_project_path)
191
- end
192
-
193
185
  #---------------------------------------------------------------------#
194
186
 
195
187
  # @!group Private helpers.
@@ -9,230 +9,202 @@ module Pod
9
9
  #
10
10
  class Project < Xcodeproj::Project
11
11
 
12
-
13
- # @return [Sandbox] the sandbox which returns the information about which
14
- # Pods are local.
15
- #
16
- attr_reader :sandbox
17
-
18
- # @param [Sandbox] sandbox @see #sandbox
12
+ # @param [Pathname, String] path @see path
13
+ # @param [Bool] skip_initialization
14
+ # Wether the project should be initialized from scratch.
19
15
  #
20
- def initialize(sandbox)
21
- super(nil) # Recreate the project from scratch for now.
22
- # TODO
23
- raise unless sandbox.is_a?(Sandbox)
24
- @sandbox = sandbox
25
- @path = sandbox.project_path
16
+ def initialize(path, skip_initialization = false)
17
+ super(path, skip_initialization)
26
18
  @support_files_group = new_group('Targets Support Files')
27
-
28
19
  @refs_by_absolute_path = {}
20
+ @pods = new_group('Pods')
21
+ @development_pods = new_group('Development Pods')
29
22
  end
30
23
 
31
- # @return [Pathname] the path of the xcodeproj file which stores the
32
- # project.
24
+ # @return [PBXGroup] The group for the support files of the aggregate
25
+ # targets.
33
26
  #
34
- attr_reader :path
27
+ attr_reader :support_files_group
35
28
 
36
- # @return [Pathname] the directory where the project is stored.
29
+ # @return [PBXGroup] The group for the Pods.
37
30
  #
38
- def root
39
- @root ||= path.dirname
40
- end
31
+ attr_reader :pods
41
32
 
42
- # @return [Pathname] Returns the relative path from the project root.
33
+ # @return [PBXGroup] The group for Development Pods.
43
34
  #
44
- # @param [Pathname] path
45
- # The path that needs to be converted to the relative format.
35
+ attr_reader :development_pods
36
+
37
+
38
+ public
39
+
40
+ # @!group Pod Groups
41
+ #-------------------------------------------------------------------------#
42
+
43
+ # Creates a new group for the Pod with the given name and configures its
44
+ # path.
46
45
  #
47
- # @note If the two absolute paths don't share the same root directory an
48
- # extra `../` is added to the result of
49
- # {Pathname#relative_path_from}.
46
+ # @param [String] pod_name
47
+ # The name of the Pod.
50
48
  #
51
- # @example
49
+ # @param [#to_s] path
50
+ # The path to the root of the Pod.
52
51
  #
53
- # path = Pathname.new('/Users/dir')
54
- # @sandbox.root #=> Pathname('/tmp/CocoaPods/Lint/Pods')
52
+ # @param [Bool] development
53
+ # Wether the group should be added to the Development Pods group.
55
54
  #
56
- # @sandbox.relativize(path) #=> '../../../../Users/dir'
57
- # @sandbox.relativize(path) #=> '../../../../../Users/dir'
55
+ # @param [Bool] absolute
56
+ # Wether the path of the group should be set as absolute.
58
57
  #
59
- def relativize(path)
60
- unless path.absolute?
61
- raise StandardError, "[Bug] Attempt to add relative path `#{path}` to the Pods project"
62
- end
58
+ # @return [PBXGroup] The new group.
59
+ #
60
+ def add_pod_group(pod_name, path, development = false, absolute = false)
61
+ raise "[BUG]" if pod_group(pod_name)
63
62
 
64
- result = path.relative_path_from(root)
65
- unless root.to_s.split('/')[1] == path.to_s.split('/')[1]
66
- result = Pathname.new('../') + result
67
- end
68
- result
63
+ parent_group = development ? development_pods : pods
64
+ source_tree = absolute ? :absolute : :group
65
+ group = parent_group.new_group(pod_name, path, source_tree)
66
+ support_files_group = group.new_group(SPEC_SUBGROUPS[:support_files])
67
+ support_files_group.source_tree = 'SOURCE_ROOT'
68
+ group
69
69
  end
70
70
 
71
- # @return [String] a string representation suited for debugging.
71
+ # @return [Array<PBXGroup>] Returns all the group of the Pods.
72
72
  #
73
- def inspect
74
- "#<#{self.class}> path:#{path}"
73
+ def pod_groups
74
+ pods.children.objects + development_pods.children.objects
75
75
  end
76
76
 
77
- #-------------------------------------------------------------------------#
78
-
79
- public
80
-
81
- # @!group Groups
82
-
83
- # @return [PBXGroup] the group where the support files for the Pod
84
- # libraries should be added.
77
+ # Returns the group for the Pod with the given name.
85
78
  #
86
- attr_reader :support_files_group
87
-
88
- # Returns the `Pods` group, creating it if needed.
79
+ # @param [String] pod_name
80
+ # The name of the Pod.
89
81
  #
90
- # @return [PBXGroup] the group.
82
+ # @return [PBXGroup] The group.
91
83
  #
92
- def pods
93
- @pods ||= new_group('Pods')
84
+ def pod_group(pod_name)
85
+ pod_groups.find { |group| group.name == pod_name }
94
86
  end
95
87
 
96
- # Returns the `Local Pods` group, creating it if needed. This group is used
97
- # to contain locally sourced pods.
88
+ # @return [Hash] The names of the specification subgroups by key.
98
89
  #
99
- # @return [PBXGroup] the group.
100
- #
101
- def local_pods
102
- @local_pods ||= new_group('Local Pods')
103
- end
90
+ SPEC_SUBGROUPS = {
91
+ :source_files => 'Source Files',
92
+ :resources => 'Resources',
93
+ :frameworks_and_libraries => 'Frameworks & Libraries',
94
+ :support_files => 'Support Files',
95
+ :subspecs => 'Subspecs',
96
+ :products => 'Products',
97
+ }
104
98
 
105
- # Returns the `Local Pods` group, creating it if needed. This group is used
106
- # to contain locally sourced pods.
99
+ # Returns the group for the specification with the give name creating it if
100
+ # needed.
107
101
  #
108
- # @return [PBXGroup] the group.
102
+ # @param [String] spec_name
103
+ # The full name of the specification.
109
104
  #
110
- def resources
111
- @resources ||= new_group('Resources')
112
- end
113
-
114
-
115
- # @return [PBXGroup] the group for the spec with the given name.
105
+ # @param [Symbol] subgroup_key
106
+ # The optional key of the subgroup (@see #{SPEC_SUBGROUPS})
116
107
  #
117
- def group_for_spec(spec_name, type = nil)
118
- local = sandbox.local?(spec_name)
119
- parent_group = local ? local_pods : pods
120
- spec_group = add_spec_group(spec_name, parent_group)
121
- if type
122
- case type
123
- when :source_files then sub_group = 'Source Files'
124
- when :resources then sub_group = 'Resources'
125
- when :frameworks_and_libraries then sub_group = 'Frameworks & Libraries'
126
- when :support_files then sub_group = 'Support Files'
127
- else raise "[BUG]"
128
- end
129
- spec_group.find_subpath(sub_group, true)
108
+ # @return [PBXGroup] The group.
109
+ #
110
+ def group_for_spec(spec_name, subgroup_key = nil)
111
+ spec_group = spec_group(spec_name)
112
+ if subgroup_key
113
+ subgroup = SPEC_SUBGROUPS[subgroup_key]
114
+ raise ArgumentError, "Unrecognized subgroup `#{subgroup_key}`" unless subgroup
115
+ spec_group.find_subpath(subgroup, true)
130
116
  else
131
117
  spec_group
132
118
  end
133
119
  end
134
120
 
135
- #-------------------------------------------------------------------------#
136
121
 
137
122
  public
138
123
 
139
124
  # @!group File references
125
+ #-------------------------------------------------------------------------#
140
126
 
141
- # Adds a file reference for each one of the given files in the specified
142
- # group, namespaced by specification unless a file reference for the given
143
- # path already exits.
127
+ # Adds a file reference to given path as a child of the given group.
144
128
  #
145
- # @note With this set-up different subspecs might not reference the same
146
- # file (i.e. the first will win). Not sure thought if this is a
147
- # limitation or a feature.
129
+ # @param [Array<Pathname,String>] absolute_path
130
+ # The path of the file.
148
131
  #
149
- # @param [Array<Pathname,String>] paths
150
- # The files for which the file reference is needed.
132
+ # @param [PBXGroup] group
133
+ # The group for the new file reference.
151
134
  #
152
- # @param [String] spec_name
153
- # The full name of the specification.
154
- #
155
- # @param [PBXGroup] parent_group
156
- # The group where the file references should be added.
135
+ # @return [PBXFileReference] The new file reference.
157
136
  #
158
- # @return [void]
159
- #
160
- def add_file_references(absolute_path, spec_name, parent_group)
161
- group = group_for_spec(spec_name, :source_files)
162
- absolute_path.each do |file|
163
- existing = file_reference(file)
164
- unless existing
165
- file = Pathname.new(file)
166
- ref = group.new_file(relativize(file))
167
- @refs_by_absolute_path[file] = ref
168
- end
137
+ def add_file_reference(absolute_path, group)
138
+ unless Pathname.new(absolute_path).absolute?
139
+ raise ArgumentError, "Paths must be absolute #{absolute_path}"
169
140
  end
170
- end
171
141
 
172
- # TODO: missing customization for file reference
173
- #
174
- def add_file_reference(absolute_path, group)
175
- ref = group.new_file(relativize(absolute_path))
176
- @refs_by_absolute_path[absolute_path] = ref
142
+ if ref = reference_for_path(absolute_path)
143
+ ref
144
+ else
145
+ ref = group.new_file(absolute_path)
146
+ @refs_by_absolute_path[absolute_path.to_s] = ref
147
+ end
177
148
  end
178
149
 
179
- # Returns the file reference for the given absolute file path.
150
+ # Returns the file reference for the given absolute path.
180
151
  #
181
- # @param [Pathname,String] absolute_path
152
+ # @param [#to_s] absolute_path
182
153
  # The absolute path of the file whose reference is needed.
183
154
  #
184
155
  # @return [PBXFileReference] The file reference.
185
156
  # @return [Nil] If no file reference could be found.
186
157
  #
187
- def file_reference(absolute_path)
188
- absolute_path = Pathname.new(absolute_path)
189
- refs_by_absolute_path[absolute_path]
158
+ def reference_for_path(absolute_path)
159
+ unless Pathname.new(absolute_path).absolute?
160
+ raise ArgumentError, "Paths must be absolute #{absolute_path}"
161
+ end
162
+
163
+ refs_by_absolute_path[absolute_path.to_s]
190
164
  end
191
165
 
192
- # Adds a file reference to the podfile.
166
+ # Adds a file reference to the Podfile.
193
167
  #
194
- # @param [Pathname,String] podfile_path
195
- # the path of the podfile
168
+ # @param [#to_s] podfile_path
169
+ # The path of the Podfile.
196
170
  #
197
- # @return [PBXFileReference] the file reference.
171
+ # @return [PBXFileReference] The new file reference.
198
172
  #
199
173
  def add_podfile(podfile_path)
200
- podfile_path = Pathname.new(podfile_path)
201
- podfile_ref = new_file(relativize(podfile_path))
174
+ podfile_ref = new_file(podfile_path, :project)
202
175
  podfile_ref.xc_language_specification_identifier = 'xcode.lang.ruby'
203
176
  podfile_ref.last_known_file_type = 'text'
204
177
  podfile_ref
205
178
  end
206
179
 
207
- #-------------------------------------------------------------------------#
208
180
 
209
181
  private
210
182
 
211
183
  # @!group Private helpers
184
+ #-------------------------------------------------------------------------#
212
185
 
213
- # @return [Hash{Pathname => PBXFileReference}] The file references grouped
186
+ # @return [Hash{String => PBXFileReference}] The file references grouped
214
187
  # by absolute path.
215
188
  #
216
189
  attr_reader :refs_by_absolute_path
217
190
 
218
- # Returns a subgroup of the give group for the given spec creating it if
219
- # needed.
191
+ # Returns the group for the given specification creating it if needed.
220
192
  #
221
193
  # @param [String] spec_name
222
194
  # The full name of the specification.
223
195
  #
224
- # @param [PBXGroup] root_group
225
- # The group where to add the specification. Either `Pods` or `Local
226
- # Pods`.
227
- #
228
- # @return [PBXGroup] the group for the spec with the given name.
229
- #
230
- def add_spec_group(spec_name, root_group)
231
- current_group = root_group
232
- group = nil
233
- spec_name.split('/').each do |name|
234
- group = current_group[name] || current_group.new_group(name)
235
- current_group = group
196
+ # @return [PBXGroup] The group for the spec with the given name.
197
+ #
198
+ def spec_group(spec_name)
199
+ pod_name = Specification.root_name(spec_name)
200
+ group = pod_group(pod_name)
201
+ raise "[Bug] Unable to locate group for Pod named `#{pod_name}`" unless group
202
+ if spec_name != pod_name
203
+ subspecs_names = spec_name.gsub(pod_name + '/', '').split('/')
204
+ subspecs_names.each do |name|
205
+ subspecs_group = group[SPEC_SUBGROUPS[:subspecs]] || group.new_group(SPEC_SUBGROUPS[:subspecs])
206
+ group = subspecs_group[name] || subspecs_group.new_group(name)
207
+ end
236
208
  end
237
209
  group
238
210
  end
@@ -67,7 +67,7 @@ module Pod
67
67
  @predownloaded_pods = []
68
68
  @head_pods = []
69
69
  @checkout_sources = {}
70
- @local_pods = {}
70
+ @development_pods = {}
71
71
  FileUtils.mkdir_p(@root)
72
72
  end
73
73
 
@@ -152,7 +152,7 @@ module Pod
152
152
  def pod_dir(name)
153
153
  root_name = Specification.root_name(name)
154
154
  if local?(root_name)
155
- Pathname.new(local_pods[root_name])
155
+ Pathname.new(development_pods[root_name])
156
156
  else
157
157
  # root + "Sources/#{name}"
158
158
  root + root_name
@@ -342,7 +342,7 @@ module Pod
342
342
  #
343
343
  def store_local_path(name, path)
344
344
  root_name = Specification.root_name(name)
345
- local_pods[root_name] = path.to_s
345
+ development_pods[root_name] = path.to_s
346
346
  end
347
347
 
348
348
  # @return [Hash{String=>String}] The path of the Pods with a local source
@@ -350,7 +350,7 @@ module Pod
350
350
  #
351
351
  # @todo Rename (e.g. `pods_with_local_path`)
352
352
  #
353
- attr_reader :local_pods
353
+ attr_reader :development_pods
354
354
 
355
355
  # Checks if a Pod is locally sourced?
356
356
  #
@@ -361,7 +361,7 @@ module Pod
361
361
  #
362
362
  def local?(name)
363
363
  root_name = Specification.root_name(name)
364
- !local_pods[root_name].nil?
364
+ !development_pods[root_name].nil?
365
365
  end
366
366
 
367
367
  #-------------------------------------------------------------------------#
@@ -283,23 +283,41 @@ module Pod
283
283
  end
284
284
  UI = UserInterface
285
285
 
286
+ #---------------------------------------------------------------------------#
287
+
286
288
  # Redirects cocoapods-core UI.
287
289
  #
288
290
  module CoreUI
289
291
 
290
292
  class << self
291
293
 
292
- # @todo enable in CocoaPods 0.17.0 release
293
- #
294
294
  def puts(message)
295
- # UI.puts message
295
+ UI.puts message
296
296
  end
297
297
 
298
- # @todo enable in CocoaPods 0.17.0 release
299
- #
300
298
  def warn(message)
301
- # UI.warn message
299
+ UI.warn message
302
300
  end
303
301
  end
304
302
  end
305
303
  end
304
+
305
+ #---------------------------------------------------------------------------#
306
+
307
+ module Xcodeproj
308
+
309
+ # Redirects xcodeproj UI.
310
+ #
311
+ module UserInterface
312
+
313
+ def self.puts(message)
314
+ ::Pod::UI.puts message
315
+ end
316
+
317
+ def self.warn(message)
318
+ ::Pod::UI.warn message
319
+ end
320
+
321
+ end
322
+ end
323
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.23.0
4
+ version: 0.24.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Duran
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-08 00:00:00.000000000 Z
12
+ date: 2013-09-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cocoapods-core
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - '='
19
19
  - !ruby/object:Gem::Version
20
- version: 0.23.0
20
+ version: 0.24.0
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - '='
26
26
  - !ruby/object:Gem::Version
27
- version: 0.23.0
27
+ version: 0.24.0
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: claide
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -45,28 +45,28 @@ dependencies:
45
45
  requirements:
46
46
  - - ~>
47
47
  - !ruby/object:Gem::Version
48
- version: 0.1.2
48
+ version: 0.2.0
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - ~>
54
54
  - !ruby/object:Gem::Version
55
- version: 0.1.2
55
+ version: 0.2.0
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: xcodeproj
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - ~>
61
61
  - !ruby/object:Gem::Version
62
- version: 0.9.0
62
+ version: 0.10.0
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: 0.9.0
69
+ version: 0.10.0
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: colored
72
72
  requirement: !ruby/object:Gem::Requirement
@@ -101,42 +101,42 @@ dependencies:
101
101
  requirements:
102
102
  - - ~>
103
103
  - !ruby/object:Gem::Version
104
- version: 1.8.0
104
+ version: '1.8'
105
105
  type: :runtime
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
109
  - - ~>
110
110
  - !ruby/object:Gem::Version
111
- version: 1.8.0
111
+ version: '1.8'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: open4
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
116
  - - ~>
117
117
  - !ruby/object:Gem::Version
118
- version: 1.3.0
118
+ version: '1.3'
119
119
  type: :runtime
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - ~>
124
124
  - !ruby/object:Gem::Version
125
- version: 1.3.0
125
+ version: '1.3'
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: activesupport
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
130
  - - ~>
131
131
  - !ruby/object:Gem::Version
132
- version: 3.2.13
132
+ version: '3.0'
133
133
  type: :runtime
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
137
  - - ~>
138
138
  - !ruby/object:Gem::Version
139
- version: 3.2.13
139
+ version: '3.0'
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: bacon
142
142
  requirement: !ruby/object:Gem::Requirement
@@ -167,6 +167,7 @@ extensions: []
167
167
  extra_rdoc_files: []
168
168
  files:
169
169
  - lib/cocoapods/command/help.rb
170
+ - lib/cocoapods/command/init.rb
170
171
  - lib/cocoapods/command/inter_process_communication.rb
171
172
  - lib/cocoapods/command/lib.rb
172
173
  - lib/cocoapods/command/list.rb
@@ -234,39 +235,42 @@ homepage: https://github.com/CocoaPods/CocoaPods
234
235
  licenses:
235
236
  - MIT
236
237
  metadata: {}
237
- post_install_message: "\nCHANGELOG:\n\n## 0.23.0\n\n###### Enhancements\n[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.22.3...0.23.0.rc1)\n•
238
+ post_install_message: "\nCHANGELOG:\n\n## 0.24.0\n\n###### Enhancements\n[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.22.3...0.23.0.rc1)\n•
238
239
  [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.22.3...0.23.0.rc1)\n•
239
- [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.8.1...0.9.0)\n• [cocoapods-downloader](https://github.com/CocoaPods/cocoapods-downloader/compare/0.1.1...0.1.2)\n\n*
240
- Added `prepare_command` attribute to Specification DSL. The prepare command\n will
241
- replace the `pre_install` hook. The `post_install` hook has also been\n deprecated.\n
242
- \ [#1247](https://github.com/CocoaPods/CocoaPods/issues/1247)\n\n The reason we
243
- provided Ruby hooks at first, was because we wanted to offer\n the option to make
244
- any required configuration possible. By now, however, we\n have a pretty good idea
245
- of the use-cases and are therefore locking down the\n freedom that was once available.
246
- In turn, we’re adding attributes that can\n replace the most common use-cases.
247
- _(See the enhancements directly following\n this entry for more info)._\n\n The
248
- second reason we need to lock this down is because this is the last\n remaining
249
- obstacle to fully serialize specifications, which we need in order\n to move to
250
- a ‘spec push’ web-service in the future.\n\n* Added `resource_bundles` attribute
251
- to the Specification DSL. \n [#743](https://github.com/CocoaPods/CocoaPods/issues/743)\n
252
- \ [#1186](https://github.com/CocoaPods/CocoaPods/issues/1186)\n\n* Added `vendored_frameworks`
253
- attribute to the Specification DSL. \n [#809](https://github.com/CocoaPods/CocoaPods/issues/809)\n
254
- \ [#1075](https://github.com/CocoaPods/CocoaPods/issues/1075)\n\n* Added `vendored_libraries`
255
- attribute to the Specification DSL. \n [#809](https://github.com/CocoaPods/CocoaPods/issues/809)\n
256
- \ [#1075](https://github.com/CocoaPods/CocoaPods/issues/1075)\n\n* Restructured
257
- `.cocoapods` folder to contain repos in a subdirectory. \n [Ian Ynda-Hummel](https://github.com/ianyh)\n
258
- \ [#1150](https://github.com/CocoaPods/CocoaPods/issues/1150) \n\n* Improved `pod
259
- spec create` template. \n [#1223](https://github.com/CocoaPods/CocoaPods/issues/1223)\n\n*
260
- Added copy&paste-friendly dependency to `pod search`. \n [#1073](https://github.com/CocoaPods/CocoaPods/issues/1073)\n\n*
261
- Improved performance of the installation of Pods with git\n sources which specify
262
- a tag. \n [#1077](https://github.com/CocoaPods/CocoaPods/issues/1077)\n\n* Core
263
- Data `xcdatamodeld` files are now properly referenced from the Pods\n project.
264
- \ \n [#1155](https://github.com/CocoaPods/CocoaPods/issues/1155)\n\n* Removed punctuation
265
- check from the specification validations. \n [#1242](https://github.com/CocoaPods/CocoaPods/issues/1242)\n\n*
266
- Deprecated the `documentation` attribute of the Specification DSL. \n [Core#20](https://github.com/CocoaPods/Core/issues/20)\n\n######
267
- Bug Fixes\n\n* Fix copy resource script issue related to filenames with spaces.
268
- \ \n [Denis Hennessy](https://github.com/dhennessy)\n [#1231](https://github.com/CocoaPods/CocoaPods/issues/1231)
269
- \ \n\n\n\n"
240
+ [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.8.1...0.9.0)\n• [cocoapods-downloader](https://github.com/CocoaPods/cocoapods-downloader/compare/0.1.1...0.1.2)\n\n\n######
241
+ Enhancements\n\n* Added `pod init` command which generates a Podfile according to
242
+ the\n targets of the project stored in the working directory and to the templates\n
243
+ \ stored in the `~/.cocoapods/templates` folder. Tow templates are supported: \n
244
+ \ - the `Podfile.default` template for regular targets.\n - and the `Podfile.test`
245
+ template for test targets. \n \n [Ian Ynda-Hummel](https://github.com/ianyh)\n
246
+ \ [#1106](https://github.com/CocoaPods/CocoaPods/issues/1106) \n [#1045](https://github.com/CocoaPods/CocoaPods/issues/1045)
247
+ \ \n\n* CocoaPods will now leverage the [xcproj](https://github.com/0xced/xcproj)\n
248
+ \ command line tool if available in the path of the user to touch saved\n projects.
249
+ This will result in projects being serialized in the exact format\n used by Xcode
250
+ eliminating merge conflicts and other related issues. To learn\n more about how
251
+ to install xcproj see its\n [readme](https://github.com/0xced/xcproj). \n [Cédric
252
+ Luthi](https://github.com/0xced) \n [#1275](https://github.com/CocoaPods/CocoaPods/issues/1275)
253
+ \ \n \n* Rationalized and cleaned up Pods project group structure and path specification.\n\n*
254
+ Create all necessary build configurations for *Pods.xcodeproj* at the project level.
255
+ If the user’s project has more than just *Debug* and *Release* build configurations,
256
+ they may be explicitly specified in the Podfile: \n`xcodeproj 'MyApp', 'App Store'
257
+ => :release, 'Debug' => :debug, 'Release' => :release` \n If build configurations
258
+ aren’t specified in the Podfile then they will be automatically picked from the
259
+ user’s project in *Release* mode. \n These changes will ensure that the `libPods.a`
260
+ static library is not stripped for all configurations, as explained in [#1217](https://github.com/CocoaPods/CocoaPods/pull/1217).
261
+ \ \n [Cédric Luthi](https://github.com/0xced) \n [#1294](https://github.com/CocoaPods/CocoaPods/issues/1294)\n\n*
262
+ Added basic support for Bazaar repositories. \n [Fred McCann](https://github.com/fmccann)
263
+ \ \n [cocoapods-downloader#4](https://github.com/CocoaPods/cocoapods-downloader/pull/4)\n\n######
264
+ Bug Fixes\n\n* Fixed crash in `pod spec cat`.\n\n* Use the `TARGET_BUILD_DIR` environment
265
+ variable for installing resource bundles. \n [Cédric Luthi](https://github.com/0xced)
266
+ \ \n [#1268](https://github.com/CocoaPods/CocoaPods/issues/1268) \n\n* CoreData
267
+ versioned models are now properly handled respecting the contents of\n the `.xccurrentversion`
268
+ file. \n [#1288](https://github.com/CocoaPods/CocoaPods/issues/1288),\n [Xcodeproj#83](https://github.com/CocoaPods/Xcodeproj/pull/83)
269
+ \ \n [Ashton-W](https://github.com/Ashton-W)\n\n* OS X frameworks are now copied
270
+ to the Resources folder using rsync to\n properly overwrite existing files. \n
271
+ \ [Nikolaj Schumacher](https://github.com/nschum)\n [#1063](https://github.com/CocoaPods/CocoaPods/issues/1063)\n\n*
272
+ User defined build configurations are now added to the resource bundle\n targets.
273
+ \ \n [#1309](https://github.com/CocoaPods/CocoaPods/issues/1309),\n\n\n"
270
274
  rdoc_options: []
271
275
  require_paths:
272
276
  - lib