cocoapods-square-stable 0.19.3

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.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1296 -0
  3. data/LICENSE +20 -0
  4. data/README.md +94 -0
  5. data/bin/pod +16 -0
  6. data/bin/sandbox-pod +120 -0
  7. data/lib/cocoapods.rb +77 -0
  8. data/lib/cocoapods/command.rb +116 -0
  9. data/lib/cocoapods/command/help.rb +23 -0
  10. data/lib/cocoapods/command/inter_process_communication.rb +178 -0
  11. data/lib/cocoapods/command/list.rb +77 -0
  12. data/lib/cocoapods/command/outdated.rb +56 -0
  13. data/lib/cocoapods/command/podfile_info.rb +91 -0
  14. data/lib/cocoapods/command/project.rb +88 -0
  15. data/lib/cocoapods/command/push.rb +172 -0
  16. data/lib/cocoapods/command/repo.rb +145 -0
  17. data/lib/cocoapods/command/search.rb +61 -0
  18. data/lib/cocoapods/command/setup.rb +134 -0
  19. data/lib/cocoapods/command/spec.rb +590 -0
  20. data/lib/cocoapods/config.rb +231 -0
  21. data/lib/cocoapods/downloader.rb +59 -0
  22. data/lib/cocoapods/executable.rb +118 -0
  23. data/lib/cocoapods/external_sources.rb +363 -0
  24. data/lib/cocoapods/file_list.rb +36 -0
  25. data/lib/cocoapods/gem_version.rb +7 -0
  26. data/lib/cocoapods/generator/acknowledgements.rb +107 -0
  27. data/lib/cocoapods/generator/acknowledgements/markdown.rb +40 -0
  28. data/lib/cocoapods/generator/acknowledgements/plist.rb +64 -0
  29. data/lib/cocoapods/generator/bridge_support.rb +22 -0
  30. data/lib/cocoapods/generator/copy_resources_script.rb +54 -0
  31. data/lib/cocoapods/generator/dummy_source.rb +22 -0
  32. data/lib/cocoapods/generator/prefix_header.rb +82 -0
  33. data/lib/cocoapods/generator/target_environment_header.rb +86 -0
  34. data/lib/cocoapods/generator/xcconfig.rb +185 -0
  35. data/lib/cocoapods/hooks/installer_representation.rb +134 -0
  36. data/lib/cocoapods/hooks/library_representation.rb +94 -0
  37. data/lib/cocoapods/hooks/pod_representation.rb +74 -0
  38. data/lib/cocoapods/installer.rb +571 -0
  39. data/lib/cocoapods/installer/analyzer.rb +559 -0
  40. data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +253 -0
  41. data/lib/cocoapods/installer/file_references_installer.rb +179 -0
  42. data/lib/cocoapods/installer/pod_source_installer.rb +248 -0
  43. data/lib/cocoapods/installer/target_installer.rb +379 -0
  44. data/lib/cocoapods/installer/user_project_integrator.rb +180 -0
  45. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +224 -0
  46. data/lib/cocoapods/library.rb +202 -0
  47. data/lib/cocoapods/open_uri.rb +24 -0
  48. data/lib/cocoapods/project.rb +209 -0
  49. data/lib/cocoapods/resolver.rb +212 -0
  50. data/lib/cocoapods/sandbox.rb +343 -0
  51. data/lib/cocoapods/sandbox/file_accessor.rb +217 -0
  52. data/lib/cocoapods/sandbox/headers_store.rb +96 -0
  53. data/lib/cocoapods/sandbox/path_list.rb +208 -0
  54. data/lib/cocoapods/sources_manager.rb +276 -0
  55. data/lib/cocoapods/user_interface.rb +304 -0
  56. data/lib/cocoapods/user_interface/error_report.rb +101 -0
  57. data/lib/cocoapods/validator.rb +350 -0
  58. metadata +238 -0
@@ -0,0 +1,224 @@
1
+ require 'active_support'
2
+
3
+ module Pod
4
+ class Installer
5
+ class UserProjectIntegrator
6
+
7
+ # This class is responsible for integrating the library generated by a
8
+ # {TargetDefinition} with its destination project.
9
+ #
10
+ class TargetIntegrator
11
+
12
+ # @return [Library] the library that should be integrated.
13
+ #
14
+ attr_reader :library
15
+
16
+ # @param [Library] library @see #target_definition
17
+ #
18
+ def initialize(library)
19
+ @library = library
20
+ end
21
+
22
+ # Integrates the user project targets. Only the targets that do **not**
23
+ # already have the Pods library in their frameworks build phase are
24
+ # processed.
25
+ #
26
+ # @return [void]
27
+ #
28
+ def integrate!
29
+ return if targets.empty?
30
+ UI.section(integration_message) do
31
+ add_xcconfig_base_configuration
32
+ add_pods_library
33
+ add_copy_resources_script_phase
34
+ add_check_manifest_lock_script_phase
35
+ save_user_project
36
+ end
37
+ end
38
+
39
+ # @return [Array<PBXNativeTarget>] the list of targets that the Pods
40
+ # lib that need to be integrated.
41
+ #
42
+ # @note A target is considered integrated if it already references
43
+ #
44
+ def targets
45
+ unless @targets
46
+ target_uuids = library.user_target_uuids
47
+ targets = target_uuids.map do |uuid|
48
+ target = user_project.objects_by_uuid[uuid]
49
+ unless target
50
+ raise Informative, "[Bug] Unable to find the target with " \
51
+ "the `#{uuid}` UUID for the `#{library}` library"
52
+ end
53
+ target
54
+ end
55
+ non_integrated = targets.reject do |target|
56
+ target.frameworks_build_phase.files.any? do |build_file|
57
+ file_ref = build_file.file_ref
58
+ file_ref &&
59
+ file_ref.isa == 'PBXFileReference' &&
60
+ file_ref.display_name == library.product_name
61
+ end
62
+ end
63
+ @targets = non_integrated
64
+ end
65
+ @targets
66
+ end
67
+
68
+ # Read the project from the disk to ensure that it is up to date as
69
+ # other TargetIntegrators might have modified it.
70
+ #
71
+ def user_project
72
+ @user_project ||= Xcodeproj::Project.new(library.user_project_path)
73
+ end
74
+
75
+ # @return [String] a string representation suitable for debugging.
76
+ #
77
+ def inspect
78
+ "#<#{self.class} for target `#{target_definition.label}'>"
79
+ end
80
+
81
+ #---------------------------------------------------------------------#
82
+
83
+ # @!group Integration steps
84
+
85
+ private
86
+
87
+ # Adds the `xcconfig` configurations files generated for the current
88
+ # {TargetDefinition} to the build configurations of the targets that
89
+ # should be integrated.
90
+ #
91
+ # @note It also checks if any build setting of the build
92
+ # configurations overrides the `xcconfig` file and warns the
93
+ # user.
94
+ #
95
+ # @todo If the xcconfig is already set don't override it and inform
96
+ # the user.
97
+ #
98
+ # @return [void]
99
+ #
100
+ def add_xcconfig_base_configuration
101
+ xcconfig = user_project.new_file(library.xcconfig_relative_path)
102
+ targets.each do |target|
103
+ check_overridden_build_settings(library.xcconfig, target)
104
+ target.build_configurations.each do |config|
105
+ config.base_configuration_reference = xcconfig
106
+ end
107
+ end
108
+ end
109
+
110
+ # Adds a file reference to the library of the {TargetDefinition} and
111
+ # adds it to the frameworks build phase of the targets.
112
+ #
113
+ # @return [void]
114
+ #
115
+ def add_pods_library
116
+ frameworks = user_project.frameworks_group
117
+ pods_library = frameworks.new_static_library(library.label)
118
+ targets.each do |target|
119
+ target.frameworks_build_phase.add_file_reference(pods_library)
120
+ end
121
+ end
122
+
123
+ # Adds a shell script build phase responsible to copy the resources
124
+ # generated by the TargetDefinition to the bundle of the product of the
125
+ # targets.
126
+ #
127
+ # @return [void]
128
+ #
129
+ def add_copy_resources_script_phase
130
+ targets.each do |target|
131
+ phase = target.new_shell_script_build_phase('Copy Pods Resources')
132
+ path = library.copy_resources_script_relative_path
133
+ phase.shell_script = %{"#{path}"\n}
134
+ end
135
+ end
136
+
137
+ # Adds a shell script build phase responsible for checking if the Pods
138
+ # locked in the Pods/Manifest.lock file are in sync with the Pods defined
139
+ # in the Podfile.lock.
140
+ #
141
+ # @note The build phase is appended to the front because to fail
142
+ # fast.
143
+ #
144
+ # @return [void]
145
+ #
146
+ def add_check_manifest_lock_script_phase
147
+ targets.each do |target|
148
+ phase = target.project.new(Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
149
+ target.build_phases.unshift(phase)
150
+ phase.name = 'Check Pods Manifest.lock'
151
+ phase.shell_script = <<-EOS.strip_heredoc
152
+ diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
153
+ if [[ $? != 0 ]] ; then
154
+ cat << EOM
155
+ error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
156
+ EOM
157
+ exit 1
158
+ fi
159
+ EOS
160
+ end
161
+ end
162
+
163
+ # Saves the changes to the user project to the disk.
164
+ #
165
+ # @return [void]
166
+ #
167
+ def save_user_project
168
+ user_project.save_as(library.user_project_path)
169
+ end
170
+
171
+ #---------------------------------------------------------------------#
172
+
173
+ # @!group Private helpers.
174
+
175
+ private
176
+
177
+ # Informs the user about any build setting of the target which might
178
+ # override the given xcconfig file.
179
+ #
180
+ # @return [void]
181
+ #
182
+ def check_overridden_build_settings(xcconfig, target)
183
+ return unless xcconfig
184
+
185
+ configs_by_overridden_key = {}
186
+ target.build_configurations.each do |config|
187
+ xcconfig.attributes.keys.each do |key|
188
+ target_value = config.build_settings[key]
189
+
190
+ if target_value && !target_value.include?('$(inherited)')
191
+ configs_by_overridden_key[key] ||= []
192
+ configs_by_overridden_key[key] << config.name
193
+ end
194
+ end
195
+
196
+ configs_by_overridden_key.each do |key, config_names|
197
+ name = "#{target.name} [#{config_names.join(' - ')}]"
198
+ actions = [
199
+ "Use the `$(inherited)` flag, or",
200
+ "Remove the build settings from the target."
201
+ ]
202
+ UI.warn("The target `#{name}` overrides the `#{key}` build " \
203
+ "setting defined in `#{library.xcconfig_relative_path}'.",
204
+ actions)
205
+ end
206
+ end
207
+ end
208
+
209
+ # @return [String] the message that should be displayed for the target
210
+ # integration.
211
+ #
212
+ def integration_message
213
+ "Integrating `#{library.product_name}` into " \
214
+ "#{'target'.pluralize(targets.size)} " \
215
+ "`#{targets.map(&:name).to_sentence}` " \
216
+ "of project #{UI.path library.user_project_path}."
217
+ end
218
+
219
+ #---------------------------------------------------------------------#
220
+
221
+ end
222
+ end
223
+ end
224
+ end
@@ -0,0 +1,202 @@
1
+ module Pod
2
+
3
+ # Model class which describes a Pods library.
4
+ #
5
+ # The Library class stores and provides the information necessary for
6
+ # working with a library in the Pods project and in the user projects
7
+ # through the installation process.
8
+ #
9
+ class Library
10
+
11
+ # @return [PBXNativeTarget] the target definition of the Podfile that
12
+ # generated this library.
13
+ #
14
+ attr_reader :target_definition
15
+
16
+ # @param [TargetDefinition] target_definition @see target_definition
17
+ # @param [PBXNativeTarget] target @see target
18
+ #
19
+ def initialize(target_definition)
20
+ @target_definition = target_definition
21
+ end
22
+
23
+ # @return [String] the label for the library.
24
+ #
25
+ def label
26
+ target_definition.label.to_s
27
+ end
28
+
29
+ # @return [String] the name of the library.
30
+ #
31
+ def name
32
+ target_definition.label.to_s
33
+ end
34
+
35
+ # @return [String] the name of the library.
36
+ #
37
+ def product_name
38
+ "lib#{target_definition.label}.a"
39
+ end
40
+
41
+ # @return [String] A string suitable for debugging.
42
+ #
43
+ def inspect
44
+ "<#{self.class} name=#{name} platform=#{platform}>"
45
+ end
46
+
47
+ #-------------------------------------------------------------------------#
48
+
49
+ # @!group Information storage
50
+
51
+ # @return [Pathname] the folder where to store the support files of this
52
+ # library.
53
+ #
54
+ attr_accessor :support_files_root
55
+
56
+ # @return [Pathname] the folder where the client is stored used for
57
+ # computing the relative paths. If integrating it should be the
58
+ # folder where the user project is stored, otherwise it should
59
+ # be the installation root.
60
+ #
61
+ attr_accessor :client_root
62
+
63
+ # @return [Pathname] the path of the user project that this library will
64
+ # integrate as identified by the analyzer.
65
+ #
66
+ # @note The project instance is not stored to prevent editing different
67
+ # instances.
68
+ #
69
+ attr_accessor :user_project_path
70
+
71
+ # @return [String] the list of the UUIDs of the user targets that will be
72
+ # integrated by this library as identified by the analizer.
73
+ #
74
+ # @note The target instances are not stored to prevent editing different
75
+ # instances.
76
+ #
77
+ attr_accessor :user_target_uuids
78
+
79
+ # @return [Hash{String=>Symbol}] A hash representing the user build
80
+ # configurations where each key corresponds to the name of a
81
+ # configuration and its value to its type (`:debug` or `:release`).
82
+ #
83
+ attr_accessor :user_build_configurations
84
+
85
+ # @return [Platform] the platform for this library.
86
+ #
87
+ attr_accessor :platform
88
+
89
+ # @return [PBXNativeTarget] the target generated in the Pods project for
90
+ # this library.
91
+ #
92
+ attr_accessor :target
93
+
94
+ # @return [Xcodeproj::Config] the configuration file of the library
95
+ #
96
+ # @note The configuration is generated by the {TargetInstaller} and
97
+ # used by {UserProjectIntegrator} to check for any overridden
98
+ # values.
99
+ #
100
+ attr_accessor :xcconfig
101
+
102
+ # @return [Array<Specification>] the specifications of this library.
103
+ #
104
+ attr_accessor :specs
105
+
106
+ # @return [Array<Sandbox::FileAccessor>] the file accessors for the
107
+ # specifications of this library.
108
+ #
109
+ attr_accessor :file_accessors
110
+
111
+ #-------------------------------------------------------------------------#
112
+
113
+ # @!group Support files
114
+
115
+ # @return [Pathname] the absolute path of the xcconfig file.
116
+ #
117
+ def xcconfig_path
118
+ support_files_root + "#{label}.xcconfig"
119
+ end
120
+
121
+ # @return [Pathname] the absolute path of the copy resources script.
122
+ #
123
+ def copy_resources_script_path
124
+ support_files_root + "#{label}-resources.sh"
125
+ end
126
+
127
+ # @return [Pathname] the absolute path of the header file which contains
128
+ # the information about the installed pods.
129
+ #
130
+ def target_environment_header_path
131
+ support_files_root + "#{label}-environment.h"
132
+ end
133
+
134
+ # @return [Pathname] the absolute path of the prefix header file.
135
+ #
136
+ def prefix_header_path
137
+ support_files_root + "#{label}-prefix.pch"
138
+ end
139
+
140
+ # @return [Pathname] the absolute path of the bridge support file.
141
+ #
142
+ def bridge_support_path
143
+ support_files_root + "#{label}.bridgesupport"
144
+ end
145
+
146
+ # @return [Pathname] the absolute path of acknowledgements file.
147
+ #
148
+ # @note The acknowledgements generators add the extension according to
149
+ # the file type.
150
+ #
151
+ def acknowledgements_basepath
152
+ support_files_root + "#{label}-acknowledgements"
153
+ end
154
+
155
+ # @return [Pathname] the path of the dummy source generated by CocoaPods
156
+ #
157
+ def dummy_source_path
158
+ support_files_root + "#{label}-dummy.m"
159
+ end
160
+
161
+ #--------------------------------------#
162
+
163
+ # @return [String] The xcconfig path of the root from the `$(SRCROOT)`
164
+ # variable of the user's project.
165
+ #
166
+ def relative_pods_root
167
+ "${SRCROOT}/#{support_files_root.relative_path_from(client_root)}"
168
+ end
169
+
170
+ # @return [String] the path of the xcconfig file relative to the root of
171
+ # the user project.
172
+ #
173
+ def xcconfig_relative_path
174
+ relative_to_srcroot(xcconfig_path).to_s
175
+ end
176
+
177
+ # @return [String] the path of the copy resources script relative to the
178
+ # root of the user project.
179
+ #
180
+ def copy_resources_script_relative_path
181
+ "${SRCROOT}/#{relative_to_srcroot(copy_resources_script_path)}"
182
+ end
183
+
184
+ #-------------------------------------------------------------------------#
185
+
186
+ # @!group Private Helpers
187
+
188
+ private
189
+
190
+ # Computes the relative path of a sandboxed file from the `$(SRCROOT)`
191
+ # variable of the user's project.
192
+ #
193
+ # @param [Pathname] path
194
+ # A relative path from the root of the sandbox.
195
+ #
196
+ # @return [String] the computed path.
197
+ #
198
+ def relative_to_srcroot(path)
199
+ path.relative_path_from(client_root).to_s
200
+ end
201
+ end
202
+ end
@@ -0,0 +1,24 @@
1
+ require 'open-uri'
2
+
3
+ # Allow OpenURI to follow http to https redirects.
4
+ #
5
+ module OpenURI
6
+
7
+ # Whether {#open} should follow a redirect.
8
+ #
9
+ # Inspiration from: https://gist.github.com/1271420
10
+ # Relevant issue: http://redmine.ruby-lang.org/issues/3719
11
+ # Source here: https://github.com/ruby/ruby/blob/trunk/lib/open-uri.rb
12
+ #
13
+ # This test is intended to forbid a redirection from http://... to
14
+ # file:///etc/passwd, file:///dev/zero, etc. CVE-2011-1521
15
+ # https to http redirect is also forbidden intentionally.
16
+ # It avoids sending secure cookie or referrer by non-secure HTTP protocol.
17
+ # (RFC 2109 4.3.1, RFC 2965 3.3, RFC 2616 15.1.3)
18
+ # However this is ad hoc. It should be extensible/configurable.
19
+ #
20
+ def OpenURI.redirectable?(uri1, uri2)
21
+ uri1.scheme.downcase == uri2.scheme.downcase ||
22
+ (/\A(?:http|ftp)\z/i =~ uri1.scheme && /\A(?:https?|ftp)\z/i =~ uri2.scheme)
23
+ end
24
+ end