xcocoapods 1.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +6303 -0
  3. data/LICENSE +28 -0
  4. data/README.md +80 -0
  5. data/bin/pod +56 -0
  6. data/bin/sandbox-pod +168 -0
  7. data/lib/cocoapods.rb +73 -0
  8. data/lib/cocoapods/command.rb +175 -0
  9. data/lib/cocoapods/command/cache.rb +28 -0
  10. data/lib/cocoapods/command/cache/clean.rb +90 -0
  11. data/lib/cocoapods/command/cache/list.rb +69 -0
  12. data/lib/cocoapods/command/env.rb +66 -0
  13. data/lib/cocoapods/command/init.rb +128 -0
  14. data/lib/cocoapods/command/install.rb +45 -0
  15. data/lib/cocoapods/command/ipc.rb +19 -0
  16. data/lib/cocoapods/command/ipc/list.rb +40 -0
  17. data/lib/cocoapods/command/ipc/podfile.rb +31 -0
  18. data/lib/cocoapods/command/ipc/podfile_json.rb +30 -0
  19. data/lib/cocoapods/command/ipc/repl.rb +51 -0
  20. data/lib/cocoapods/command/ipc/spec.rb +29 -0
  21. data/lib/cocoapods/command/ipc/update_search_index.rb +24 -0
  22. data/lib/cocoapods/command/lib.rb +11 -0
  23. data/lib/cocoapods/command/lib/create.rb +105 -0
  24. data/lib/cocoapods/command/lib/lint.rb +121 -0
  25. data/lib/cocoapods/command/list.rb +39 -0
  26. data/lib/cocoapods/command/options/project_directory.rb +36 -0
  27. data/lib/cocoapods/command/options/repo_update.rb +34 -0
  28. data/lib/cocoapods/command/outdated.rb +140 -0
  29. data/lib/cocoapods/command/repo.rb +29 -0
  30. data/lib/cocoapods/command/repo/add.rb +103 -0
  31. data/lib/cocoapods/command/repo/lint.rb +82 -0
  32. data/lib/cocoapods/command/repo/list.rb +93 -0
  33. data/lib/cocoapods/command/repo/push.rb +281 -0
  34. data/lib/cocoapods/command/repo/remove.rb +36 -0
  35. data/lib/cocoapods/command/repo/update.rb +28 -0
  36. data/lib/cocoapods/command/setup.rb +103 -0
  37. data/lib/cocoapods/command/spec.rb +112 -0
  38. data/lib/cocoapods/command/spec/cat.rb +51 -0
  39. data/lib/cocoapods/command/spec/create.rb +283 -0
  40. data/lib/cocoapods/command/spec/edit.rb +87 -0
  41. data/lib/cocoapods/command/spec/env_spec.rb +53 -0
  42. data/lib/cocoapods/command/spec/lint.rb +137 -0
  43. data/lib/cocoapods/command/spec/which.rb +43 -0
  44. data/lib/cocoapods/command/update.rb +101 -0
  45. data/lib/cocoapods/config.rb +347 -0
  46. data/lib/cocoapods/core_overrides.rb +1 -0
  47. data/lib/cocoapods/downloader.rb +190 -0
  48. data/lib/cocoapods/downloader/cache.rb +233 -0
  49. data/lib/cocoapods/downloader/request.rb +86 -0
  50. data/lib/cocoapods/downloader/response.rb +16 -0
  51. data/lib/cocoapods/executable.rb +222 -0
  52. data/lib/cocoapods/external_sources.rb +57 -0
  53. data/lib/cocoapods/external_sources/abstract_external_source.rb +205 -0
  54. data/lib/cocoapods/external_sources/downloader_source.rb +30 -0
  55. data/lib/cocoapods/external_sources/path_source.rb +55 -0
  56. data/lib/cocoapods/external_sources/podspec_source.rb +54 -0
  57. data/lib/cocoapods/gem_version.rb +5 -0
  58. data/lib/cocoapods/generator/acknowledgements.rb +107 -0
  59. data/lib/cocoapods/generator/acknowledgements/markdown.rb +44 -0
  60. data/lib/cocoapods/generator/acknowledgements/plist.rb +94 -0
  61. data/lib/cocoapods/generator/app_target_helper.rb +244 -0
  62. data/lib/cocoapods/generator/bridge_support.rb +22 -0
  63. data/lib/cocoapods/generator/constant.rb +19 -0
  64. data/lib/cocoapods/generator/copy_resources_script.rb +230 -0
  65. data/lib/cocoapods/generator/dummy_source.rb +31 -0
  66. data/lib/cocoapods/generator/embed_frameworks_script.rb +215 -0
  67. data/lib/cocoapods/generator/header.rb +103 -0
  68. data/lib/cocoapods/generator/info_plist_file.rb +116 -0
  69. data/lib/cocoapods/generator/module_map.rb +99 -0
  70. data/lib/cocoapods/generator/prefix_header.rb +60 -0
  71. data/lib/cocoapods/generator/umbrella_header.rb +46 -0
  72. data/lib/cocoapods/hooks_manager.rb +132 -0
  73. data/lib/cocoapods/installer.rb +703 -0
  74. data/lib/cocoapods/installer/analyzer.rb +972 -0
  75. data/lib/cocoapods/installer/analyzer/analysis_result.rb +87 -0
  76. data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +98 -0
  77. data/lib/cocoapods/installer/analyzer/pod_variant.rb +67 -0
  78. data/lib/cocoapods/installer/analyzer/pod_variant_set.rb +157 -0
  79. data/lib/cocoapods/installer/analyzer/podfile_dependency_cache.rb +54 -0
  80. data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +240 -0
  81. data/lib/cocoapods/installer/analyzer/specs_state.rb +84 -0
  82. data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +53 -0
  83. data/lib/cocoapods/installer/analyzer/target_inspector.rb +260 -0
  84. data/lib/cocoapods/installer/installation_options.rb +158 -0
  85. data/lib/cocoapods/installer/pod_source_installer.rb +202 -0
  86. data/lib/cocoapods/installer/pod_source_preparer.rb +77 -0
  87. data/lib/cocoapods/installer/podfile_validator.rb +139 -0
  88. data/lib/cocoapods/installer/post_install_hooks_context.rb +132 -0
  89. data/lib/cocoapods/installer/pre_install_hooks_context.rb +51 -0
  90. data/lib/cocoapods/installer/source_provider_hooks_context.rb +34 -0
  91. data/lib/cocoapods/installer/user_project_integrator.rb +250 -0
  92. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +463 -0
  93. data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +146 -0
  94. data/lib/cocoapods/installer/xcode.rb +8 -0
  95. data/lib/cocoapods/installer/xcode/pods_project_generator.rb +416 -0
  96. data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +181 -0
  97. data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +84 -0
  98. data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +334 -0
  99. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +777 -0
  100. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +116 -0
  101. data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +86 -0
  102. data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +256 -0
  103. data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer_helper.rb +68 -0
  104. data/lib/cocoapods/installer/xcode/target_validator.rb +147 -0
  105. data/lib/cocoapods/open-uri.rb +33 -0
  106. data/lib/cocoapods/project.rb +414 -0
  107. data/lib/cocoapods/resolver.rb +585 -0
  108. data/lib/cocoapods/resolver/lazy_specification.rb +79 -0
  109. data/lib/cocoapods/sandbox.rb +404 -0
  110. data/lib/cocoapods/sandbox/file_accessor.rb +444 -0
  111. data/lib/cocoapods/sandbox/headers_store.rb +146 -0
  112. data/lib/cocoapods/sandbox/path_list.rb +220 -0
  113. data/lib/cocoapods/sandbox/pod_dir_cleaner.rb +85 -0
  114. data/lib/cocoapods/sandbox/podspec_finder.rb +23 -0
  115. data/lib/cocoapods/sources_manager.rb +157 -0
  116. data/lib/cocoapods/target.rb +261 -0
  117. data/lib/cocoapods/target/aggregate_target.rb +338 -0
  118. data/lib/cocoapods/target/build_settings.rb +1075 -0
  119. data/lib/cocoapods/target/pod_target.rb +559 -0
  120. data/lib/cocoapods/user_interface.rb +459 -0
  121. data/lib/cocoapods/user_interface/error_report.rb +187 -0
  122. data/lib/cocoapods/user_interface/inspector_reporter.rb +109 -0
  123. data/lib/cocoapods/validator.rb +981 -0
  124. metadata +533 -0
@@ -0,0 +1,79 @@
1
+ require 'delegate'
2
+ module Pod
3
+ class Specification
4
+ class Set
5
+ class SpecWithSource < DelegateClass(Specification)
6
+ attr_reader :spec_source
7
+ def initialize(spec, source)
8
+ super(spec)
9
+ @spec_source = source
10
+ end
11
+
12
+ undef is_a?
13
+ end
14
+
15
+ class LazySpecification < DelegateClass(Specification)
16
+ attr_reader :name, :version, :spec_source
17
+
18
+ def initialize(name, version, spec_source)
19
+ @name = name
20
+ @version = version
21
+ @spec_source = spec_source
22
+ end
23
+
24
+ def subspec_by_name(name = nil, raise_if_missing = true, include_test_specifications = false)
25
+ subspec =
26
+ if !name || name == self.name
27
+ self
28
+ else
29
+ specification.subspec_by_name(name, raise_if_missing, include_test_specifications)
30
+ end
31
+ return unless subspec
32
+
33
+ SpecWithSource.new subspec, spec_source
34
+ end
35
+
36
+ def specification
37
+ @specification ||= spec_source.specification(name, version.version)
38
+ end
39
+ alias __getobj__ specification
40
+
41
+ undef is_a?
42
+ end
43
+
44
+ class External
45
+ def all_specifications(_warn_for_multiple_pod_sources)
46
+ [specification]
47
+ end
48
+ end
49
+
50
+ # returns the highest versioned spec last
51
+ def all_specifications(warn_for_multiple_pod_sources)
52
+ @all_specifications ||= begin
53
+ sources_by_version = {}
54
+ versions_by_source.each do |source, versions|
55
+ versions.each { |v| (sources_by_version[v] ||= []) << source }
56
+ end
57
+
58
+ if warn_for_multiple_pod_sources
59
+ duplicate_versions = sources_by_version.select { |_version, sources| sources.count > 1 }
60
+
61
+ duplicate_versions.each do |version, sources|
62
+ UI.warn "Found multiple specifications for `#{name} (#{version})`:\n" +
63
+ sources.
64
+ map { |s| s.specification_path(name, version) }.
65
+ map { |v| "- #{v}" }.join("\n")
66
+ end
67
+ end
68
+
69
+ # sort versions from high to low
70
+ sources_by_version.sort_by(&:first).flat_map do |version, sources|
71
+ # within each version, we want the prefered (first-specified) source
72
+ # to be the _last_ one
73
+ sources.reverse_each.map { |source| LazySpecification.new(name, version, source) }
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,404 @@
1
+ require 'fileutils'
2
+
3
+ module Pod
4
+ # The sandbox provides support for the directory that CocoaPods uses for an
5
+ # installation. In this directory the Pods projects, the support files and
6
+ # the sources of the Pods are stored.
7
+ #
8
+ # CocoaPods assumes to have control of the sandbox.
9
+ #
10
+ # Once completed the sandbox will have the following file structure:
11
+ #
12
+ # Pods
13
+ # |
14
+ # +-- Headers
15
+ # | +-- Private
16
+ # | | +-- [Pod Name]
17
+ # | +-- Public
18
+ # | +-- [Pod Name]
19
+ # |
20
+ # +-- Local Podspecs
21
+ # | +-- External Sources
22
+ # | +-- Normal Sources
23
+ # |
24
+ # +-- Target Support Files
25
+ # | +-- [Target Name]
26
+ # | +-- Pods-acknowledgements.markdown
27
+ # | +-- Pods-acknowledgements.plist
28
+ # | +-- Pods-dummy.m
29
+ # | +-- Pods-prefix.pch
30
+ # | +-- Pods.xcconfig
31
+ # |
32
+ # +-- [Pod Name]
33
+ # |
34
+ # +-- Manifest.lock
35
+ # |
36
+ # +-- Pods.xcodeproj
37
+ #
38
+ class Sandbox
39
+ autoload :FileAccessor, 'cocoapods/sandbox/file_accessor'
40
+ autoload :HeadersStore, 'cocoapods/sandbox/headers_store'
41
+ autoload :PathList, 'cocoapods/sandbox/path_list'
42
+ autoload :PodDirCleaner, 'cocoapods/sandbox/pod_dir_cleaner'
43
+ autoload :PodspecFinder, 'cocoapods/sandbox/podspec_finder'
44
+
45
+ # @return [Pathname] the root of the sandbox.
46
+ #
47
+ attr_reader :root
48
+
49
+ # @return [HeadersStore] the header directory for the user targets.
50
+ #
51
+ attr_reader :public_headers
52
+
53
+ # Initialize a new instance
54
+ #
55
+ # @param [String, Pathname] root @see #root
56
+ #
57
+ def initialize(root)
58
+ FileUtils.mkdir_p(root)
59
+ @root = Pathname.new(root).realpath
60
+ @public_headers = HeadersStore.new(self, 'Public', :public)
61
+ @predownloaded_pods = []
62
+ @checkout_sources = {}
63
+ @development_pods = {}
64
+ @pods_with_absolute_path = []
65
+ @stored_podspecs = {}
66
+ end
67
+
68
+ # @return [Lockfile] the manifest which contains the information about the
69
+ # installed pods.
70
+ #
71
+ attr_accessor :manifest
72
+
73
+ def manifest
74
+ @manifest ||= begin
75
+ Lockfile.from_file(manifest_path) if manifest_path.exist?
76
+ end
77
+ end
78
+
79
+ # @return [Project] the Pods project.
80
+ #
81
+ attr_accessor :project
82
+
83
+ # Removes the files of the Pod with the given name from the sandbox.
84
+ #
85
+ # @return [void]
86
+ #
87
+ def clean_pod(name)
88
+ root_name = Specification.root_name(name)
89
+ unless local?(root_name)
90
+ path = pod_dir(name)
91
+ path.rmtree if path.exist?
92
+ end
93
+ podspec_path = specification_path(name)
94
+ podspec_path.rmtree if podspec_path
95
+ end
96
+
97
+ # Prepares the sandbox for a new installation removing any file that will
98
+ # be regenerated and ensuring that the directories exists.
99
+ #
100
+ def prepare
101
+ FileUtils.rm_rf(headers_root)
102
+
103
+ FileUtils.mkdir_p(headers_root)
104
+ FileUtils.mkdir_p(sources_root)
105
+ FileUtils.mkdir_p(specifications_root)
106
+ FileUtils.mkdir_p(target_support_files_root)
107
+ end
108
+
109
+ # @return [String] a string representation suitable for debugging.
110
+ #
111
+ def inspect
112
+ "#<#{self.class}> with root #{root}"
113
+ end
114
+
115
+ #-------------------------------------------------------------------------#
116
+
117
+ public
118
+
119
+ # @!group Paths
120
+
121
+ # @return [Pathname] the path of the manifest.
122
+ #
123
+ def manifest_path
124
+ root + 'Manifest.lock'
125
+ end
126
+
127
+ # @return [Pathname] the path of the Pods project.
128
+ #
129
+ def project_path
130
+ root + 'Pods.xcodeproj'
131
+ end
132
+
133
+ # Returns the path for the directory where the support files of
134
+ # a target are stored.
135
+ #
136
+ # @param [String] name
137
+ # The name of the target.
138
+ #
139
+ # @return [Pathname] the path of the support files.
140
+ #
141
+ def target_support_files_dir(name)
142
+ target_support_files_root + name
143
+ end
144
+
145
+ # Returns the path where the Pod with the given name is stored, taking into
146
+ # account whether the Pod is locally sourced.
147
+ #
148
+ # @param [String] name
149
+ # The name of the Pod.
150
+ #
151
+ # @return [Pathname] the path of the Pod.
152
+ #
153
+ def pod_dir(name)
154
+ root_name = Specification.root_name(name)
155
+ if local?(root_name)
156
+ Pathname.new(development_pods[root_name].dirname)
157
+ else
158
+ sources_root + root_name
159
+ end
160
+ end
161
+
162
+ # Returns true if the path as originally specified was absolute.
163
+ #
164
+ # @param [String] name
165
+ #
166
+ # @return [Bool] true if originally absolute
167
+ #
168
+ def local_path_was_absolute?(name)
169
+ @pods_with_absolute_path.include? name
170
+ end
171
+
172
+ # @return [Pathname] The directory where headers are stored.
173
+ #
174
+ def headers_root
175
+ root + 'Headers'
176
+ end
177
+
178
+ # @return [Pathname] The directory where the downloaded sources of
179
+ # the Pods are stored.
180
+ #
181
+ def sources_root
182
+ root
183
+ end
184
+
185
+ # @return [Pathname] the path for the directory where the
186
+ # specifications are stored.
187
+ #
188
+ def specifications_root
189
+ root + 'Local Podspecs'
190
+ end
191
+
192
+ # @return [Pathname] The directory where the files generated by
193
+ # CocoaPods to support the umbrella targets are stored.
194
+ #
195
+ def target_support_files_root
196
+ root + 'Target Support Files'
197
+ end
198
+
199
+ #-------------------------------------------------------------------------#
200
+
201
+ public
202
+
203
+ # @!group Specification store
204
+
205
+ # Returns the specification for the Pod with the given name.
206
+ #
207
+ # @param [String] name
208
+ # the name of the Pod for which the specification is requested.
209
+ #
210
+ # @return [Specification] the specification if the file is found.
211
+ #
212
+ def specification(name)
213
+ @stored_podspecs[name] ||= if file = specification_path(name)
214
+ original_path = development_pods[name]
215
+ Specification.from_file(original_path || file)
216
+ end
217
+ end
218
+
219
+ # Returns the path of the specification for the Pod with the
220
+ # given name, if one is stored.
221
+ #
222
+ # @param [String] name
223
+ # the name of the Pod for which the podspec file is requested.
224
+ #
225
+ # @return [Pathname] the path or nil.
226
+ # @return [Nil] if the podspec is not stored.
227
+ #
228
+ def specification_path(name)
229
+ name = Specification.root_name(name)
230
+ path = specifications_root + "#{name}.podspec"
231
+ if path.exist?
232
+ path
233
+ else
234
+ path = specifications_root + "#{name}.podspec.json"
235
+ if path.exist?
236
+ path
237
+ end
238
+ end
239
+ end
240
+
241
+ # Stores a specification in the `Local Podspecs` folder.
242
+ #
243
+ # @param [String] name
244
+ # the name of the pod
245
+ #
246
+ # @param [String, Pathname, Specification] podspec
247
+ # The contents of the specification (String) or the path to a
248
+ # podspec file (Pathname).
249
+ #
250
+ # @return [void]
251
+ #
252
+ #
253
+ def store_podspec(name, podspec, _external_source = false, json = false)
254
+ file_name = json ? "#{name}.podspec.json" : "#{name}.podspec"
255
+ output_path = specifications_root + file_name
256
+
257
+ case podspec
258
+ when String
259
+ output_path.open('w') { |f| f.puts(podspec) }
260
+ when Pathname
261
+ unless podspec.exist?
262
+ raise Informative, "No podspec found for `#{name}` in #{podspec}"
263
+ end
264
+ spec = Specification.from_file(podspec)
265
+ FileUtils.copy(podspec, output_path)
266
+ when Specification
267
+ raise ArgumentError, 'can only store Specification objects as json' unless json
268
+ output_path.open('w') { |f| f.puts(podspec.to_pretty_json) }
269
+ spec = podspec.dup
270
+ else
271
+ raise ArgumentError, "Unknown type for podspec: #{podspec.inspect}"
272
+ end
273
+
274
+ spec ||= Specification.from_file(output_path)
275
+ spec.defined_in_file ||= output_path
276
+
277
+ unless spec.name == name
278
+ raise Informative, "The name of the given podspec `#{spec.name}` doesn't match the expected one `#{name}`"
279
+ end
280
+ @stored_podspecs[spec.name] = spec
281
+ end
282
+
283
+ #-------------------------------------------------------------------------#
284
+
285
+ public
286
+
287
+ # @!group Pods information
288
+
289
+ # Marks a Pod as pre-downloaded
290
+ #
291
+ # @param [String] name
292
+ # The name of the Pod.
293
+ #
294
+ # @return [void]
295
+ #
296
+ def store_pre_downloaded_pod(name)
297
+ root_name = Specification.root_name(name)
298
+ predownloaded_pods << root_name
299
+ end
300
+
301
+ # @return [Array<String>] The names of the pods that have been
302
+ # pre-downloaded from an external source.
303
+ #
304
+ attr_reader :predownloaded_pods
305
+
306
+ # Checks if a Pod has been pre-downloaded by the resolver in order to fetch
307
+ # the podspec.
308
+ #
309
+ # @param [String] name
310
+ # The name of the Pod.
311
+ #
312
+ # @return [Bool] Whether the Pod has been pre-downloaded.
313
+ #
314
+ def predownloaded?(name)
315
+ root_name = Specification.root_name(name)
316
+ predownloaded_pods.include?(root_name)
317
+ end
318
+
319
+ #--------------------------------------#
320
+
321
+ # Stores the local path of a Pod.
322
+ #
323
+ # @param [String] name
324
+ # The name of the Pod.
325
+ #
326
+ # @param [Hash] source
327
+ # The hash which contains the options as returned by the
328
+ # downloader.
329
+ #
330
+ # @return [void]
331
+ #
332
+ def store_checkout_source(name, source)
333
+ root_name = Specification.root_name(name)
334
+ checkout_sources[root_name] = source
335
+ end
336
+
337
+ # Removes the checkout source of a Pod.
338
+ #
339
+ # @param [String] name
340
+ # The name of the Pod.
341
+ #
342
+ # @return [void]
343
+ #
344
+ def remove_checkout_source(name)
345
+ root_name = Specification.root_name(name)
346
+ checkout_sources.delete(root_name)
347
+ end
348
+
349
+ # @return [Hash{String=>Hash}] The options necessary to recreate the exact
350
+ # checkout of a given Pod grouped by its name.
351
+ #
352
+ attr_reader :checkout_sources
353
+
354
+ #--------------------------------------#
355
+
356
+ # Stores the local path of a Pod.
357
+ #
358
+ # @param [String] name
359
+ # The name of the Pod.
360
+ #
361
+ # @param [Pathname, String] path
362
+ # The path to the local Podspec
363
+ #
364
+ # @param [Bool] was_absolute
365
+ # True if the specified local path was absolute.
366
+ #
367
+ # @return [void]
368
+ #
369
+ def store_local_path(name, path, was_absolute = false)
370
+ root_name = Specification.root_name(name)
371
+ path = Pathname.new(path) unless path.is_a?(Pathname)
372
+ development_pods[root_name] = path
373
+ @pods_with_absolute_path << root_name if was_absolute
374
+ end
375
+
376
+ # @return [Hash{String=>Pathname}] The path of the Pods' podspecs with a local source
377
+ # grouped by their root name.
378
+ #
379
+ attr_reader :development_pods
380
+
381
+ # Checks if a Pod is locally sourced?
382
+ #
383
+ # @param [String] name
384
+ # The name of the Pod.
385
+ #
386
+ # @return [Bool] Whether the Pod is locally sourced.
387
+ #
388
+ def local?(name)
389
+ !local_podspec(name).nil?
390
+ end
391
+
392
+ # @param [String] name
393
+ # The name of a locally specified Pod
394
+ #
395
+ # @return [Pathname] Path to the local Podspec of the Pod
396
+ #
397
+ def local_podspec(name)
398
+ root_name = Specification.root_name(name)
399
+ development_pods[root_name]
400
+ end
401
+
402
+ #-------------------------------------------------------------------------#
403
+ end
404
+ end