libgems 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. data/ChangeLog +5811 -0
  2. data/History.txt +887 -0
  3. data/LICENSE.txt +51 -0
  4. data/README.md +87 -0
  5. data/Rakefile +113 -0
  6. data/lib/gauntlet_libgems.rb +50 -0
  7. data/lib/libgems.rb +1246 -0
  8. data/lib/libgems/builder.rb +102 -0
  9. data/lib/libgems/command.rb +534 -0
  10. data/lib/libgems/command_manager.rb +182 -0
  11. data/lib/libgems/commands/build_command.rb +53 -0
  12. data/lib/libgems/commands/cert_command.rb +86 -0
  13. data/lib/libgems/commands/check_command.rb +80 -0
  14. data/lib/libgems/commands/cleanup_command.rb +106 -0
  15. data/lib/libgems/commands/contents_command.rb +98 -0
  16. data/lib/libgems/commands/dependency_command.rb +195 -0
  17. data/lib/libgems/commands/environment_command.rb +133 -0
  18. data/lib/libgems/commands/fetch_command.rb +67 -0
  19. data/lib/libgems/commands/generate_index_command.rb +133 -0
  20. data/lib/libgems/commands/help_command.rb +172 -0
  21. data/lib/libgems/commands/install_command.rb +178 -0
  22. data/lib/libgems/commands/list_command.rb +35 -0
  23. data/lib/libgems/commands/lock_command.rb +110 -0
  24. data/lib/libgems/commands/mirror_command.rb +111 -0
  25. data/lib/libgems/commands/outdated_command.rb +33 -0
  26. data/lib/libgems/commands/owner_command.rb +75 -0
  27. data/lib/libgems/commands/pristine_command.rb +93 -0
  28. data/lib/libgems/commands/push_command.rb +56 -0
  29. data/lib/libgems/commands/query_command.rb +280 -0
  30. data/lib/libgems/commands/rdoc_command.rb +91 -0
  31. data/lib/libgems/commands/search_command.rb +31 -0
  32. data/lib/libgems/commands/server_command.rb +86 -0
  33. data/lib/libgems/commands/sources_command.rb +157 -0
  34. data/lib/libgems/commands/specification_command.rb +125 -0
  35. data/lib/libgems/commands/stale_command.rb +27 -0
  36. data/lib/libgems/commands/uninstall_command.rb +83 -0
  37. data/lib/libgems/commands/unpack_command.rb +121 -0
  38. data/lib/libgems/commands/update_command.rb +160 -0
  39. data/lib/libgems/commands/which_command.rb +86 -0
  40. data/lib/libgems/config_file.rb +345 -0
  41. data/lib/libgems/custom_require.rb +44 -0
  42. data/lib/libgems/defaults.rb +101 -0
  43. data/lib/libgems/dependency.rb +227 -0
  44. data/lib/libgems/dependency_installer.rb +286 -0
  45. data/lib/libgems/dependency_list.rb +208 -0
  46. data/lib/libgems/doc_manager.rb +242 -0
  47. data/lib/libgems/errors.rb +35 -0
  48. data/lib/libgems/exceptions.rb +91 -0
  49. data/lib/libgems/ext.rb +18 -0
  50. data/lib/libgems/ext/builder.rb +56 -0
  51. data/lib/libgems/ext/configure_builder.rb +25 -0
  52. data/lib/libgems/ext/ext_conf_builder.rb +24 -0
  53. data/lib/libgems/ext/rake_builder.rb +39 -0
  54. data/lib/libgems/format.rb +81 -0
  55. data/lib/libgems/gem_openssl.rb +92 -0
  56. data/lib/libgems/gem_path_searcher.rb +100 -0
  57. data/lib/libgems/gem_runner.rb +79 -0
  58. data/lib/libgems/gemcutter_utilities.rb +49 -0
  59. data/lib/libgems/indexer.rb +720 -0
  60. data/lib/libgems/install_update_options.rb +125 -0
  61. data/lib/libgems/installer.rb +604 -0
  62. data/lib/libgems/local_remote_options.rb +135 -0
  63. data/lib/libgems/old_format.rb +153 -0
  64. data/lib/libgems/package.rb +97 -0
  65. data/lib/libgems/package/f_sync_dir.rb +23 -0
  66. data/lib/libgems/package/tar_header.rb +266 -0
  67. data/lib/libgems/package/tar_input.rb +222 -0
  68. data/lib/libgems/package/tar_output.rb +144 -0
  69. data/lib/libgems/package/tar_reader.rb +106 -0
  70. data/lib/libgems/package/tar_reader/entry.rb +141 -0
  71. data/lib/libgems/package/tar_writer.rb +241 -0
  72. data/lib/libgems/package_task.rb +126 -0
  73. data/lib/libgems/platform.rb +183 -0
  74. data/lib/libgems/remote_fetcher.rb +414 -0
  75. data/lib/libgems/require_paths_builder.rb +18 -0
  76. data/lib/libgems/requirement.rb +153 -0
  77. data/lib/libgems/security.rb +814 -0
  78. data/lib/libgems/server.rb +872 -0
  79. data/lib/libgems/source_index.rb +597 -0
  80. data/lib/libgems/source_info_cache.rb +395 -0
  81. data/lib/libgems/source_info_cache_entry.rb +56 -0
  82. data/lib/libgems/spec_fetcher.rb +337 -0
  83. data/lib/libgems/specification.rb +1487 -0
  84. data/lib/libgems/test_utilities.rb +147 -0
  85. data/lib/libgems/text.rb +65 -0
  86. data/lib/libgems/uninstaller.rb +278 -0
  87. data/lib/libgems/user_interaction.rb +527 -0
  88. data/lib/libgems/validator.rb +240 -0
  89. data/lib/libgems/version.rb +316 -0
  90. data/lib/libgems/version_option.rb +65 -0
  91. data/lib/rbconfig/datadir.rb +20 -0
  92. data/test/bogussources.rb +8 -0
  93. data/test/data/gem-private_key.pem +27 -0
  94. data/test/data/gem-public_cert.pem +20 -0
  95. data/test/fake_certlib/openssl.rb +7 -0
  96. data/test/foo/discover.rb +0 -0
  97. data/test/gem_installer_test_case.rb +97 -0
  98. data/test/gem_package_tar_test_case.rb +132 -0
  99. data/test/gemutilities.rb +605 -0
  100. data/test/insure_session.rb +43 -0
  101. data/test/mockgemui.rb +56 -0
  102. data/test/plugin/exception/libgems_plugin.rb +2 -0
  103. data/test/plugin/load/libgems_plugin.rb +1 -0
  104. data/test/plugin/standarderror/libgems_plugin.rb +2 -0
  105. data/test/private_key.pem +27 -0
  106. data/test/public_cert.pem +20 -0
  107. data/test/rubygems_plugin.rb +21 -0
  108. data/test/simple_gem.rb +66 -0
  109. data/test/test_config.rb +12 -0
  110. data/test/test_gem.rb +780 -0
  111. data/test/test_gem_builder.rb +27 -0
  112. data/test/test_gem_command.rb +178 -0
  113. data/test/test_gem_command_manager.rb +207 -0
  114. data/test/test_gem_commands_build_command.rb +74 -0
  115. data/test/test_gem_commands_cert_command.rb +124 -0
  116. data/test/test_gem_commands_check_command.rb +18 -0
  117. data/test/test_gem_commands_contents_command.rb +156 -0
  118. data/test/test_gem_commands_dependency_command.rb +216 -0
  119. data/test/test_gem_commands_environment_command.rb +144 -0
  120. data/test/test_gem_commands_fetch_command.rb +76 -0
  121. data/test/test_gem_commands_generate_index_command.rb +135 -0
  122. data/test/test_gem_commands_install_command.rb +315 -0
  123. data/test/test_gem_commands_list_command.rb +36 -0
  124. data/test/test_gem_commands_lock_command.rb +68 -0
  125. data/test/test_gem_commands_mirror_command.rb +60 -0
  126. data/test/test_gem_commands_outdated_command.rb +40 -0
  127. data/test/test_gem_commands_owner_command.rb +105 -0
  128. data/test/test_gem_commands_pristine_command.rb +108 -0
  129. data/test/test_gem_commands_push_command.rb +81 -0
  130. data/test/test_gem_commands_query_command.rb +426 -0
  131. data/test/test_gem_commands_server_command.rb +59 -0
  132. data/test/test_gem_commands_sources_command.rb +209 -0
  133. data/test/test_gem_commands_specification_command.rb +139 -0
  134. data/test/test_gem_commands_stale_command.rb +38 -0
  135. data/test/test_gem_commands_uninstall_command.rb +83 -0
  136. data/test/test_gem_commands_unpack_command.rb +199 -0
  137. data/test/test_gem_commands_update_command.rb +207 -0
  138. data/test/test_gem_commands_which_command.rb +66 -0
  139. data/test/test_gem_config_file.rb +287 -0
  140. data/test/test_gem_dependency.rb +149 -0
  141. data/test/test_gem_dependency_installer.rb +661 -0
  142. data/test/test_gem_dependency_list.rb +230 -0
  143. data/test/test_gem_doc_manager.rb +31 -0
  144. data/test/test_gem_ext_configure_builder.rb +84 -0
  145. data/test/test_gem_ext_ext_conf_builder.rb +173 -0
  146. data/test/test_gem_ext_rake_builder.rb +81 -0
  147. data/test/test_gem_format.rb +70 -0
  148. data/test/test_gem_gem_path_searcher.rb +78 -0
  149. data/test/test_gem_gem_runner.rb +45 -0
  150. data/test/test_gem_gemcutter_utilities.rb +103 -0
  151. data/test/test_gem_indexer.rb +673 -0
  152. data/test/test_gem_install_update_options.rb +68 -0
  153. data/test/test_gem_installer.rb +857 -0
  154. data/test/test_gem_local_remote_options.rb +97 -0
  155. data/test/test_gem_package_tar_header.rb +130 -0
  156. data/test/test_gem_package_tar_input.rb +112 -0
  157. data/test/test_gem_package_tar_output.rb +97 -0
  158. data/test/test_gem_package_tar_reader.rb +46 -0
  159. data/test/test_gem_package_tar_reader_entry.rb +109 -0
  160. data/test/test_gem_package_tar_writer.rb +144 -0
  161. data/test/test_gem_package_task.rb +59 -0
  162. data/test/test_gem_platform.rb +264 -0
  163. data/test/test_gem_remote_fetcher.rb +740 -0
  164. data/test/test_gem_requirement.rb +292 -0
  165. data/test/test_gem_server.rb +356 -0
  166. data/test/test_gem_silent_ui.rb +113 -0
  167. data/test/test_gem_source_index.rb +461 -0
  168. data/test/test_gem_spec_fetcher.rb +410 -0
  169. data/test/test_gem_specification.rb +1334 -0
  170. data/test/test_gem_stream_ui.rb +218 -0
  171. data/test/test_gem_text.rb +43 -0
  172. data/test/test_gem_uninstaller.rb +146 -0
  173. data/test/test_gem_validator.rb +63 -0
  174. data/test/test_gem_version.rb +181 -0
  175. data/test/test_gem_version_option.rb +89 -0
  176. data/test/test_kernel.rb +59 -0
  177. metadata +402 -0
@@ -0,0 +1,395 @@
1
+ require 'fileutils'
2
+
3
+ require 'libgems'
4
+ require 'libgems/source_info_cache_entry'
5
+ require 'libgems/user_interaction'
6
+
7
+ ##
8
+ # SourceInfoCache stores a copy of the gem index for each gem source.
9
+ #
10
+ # There are two possible cache locations, the system cache and the user cache:
11
+ # * The system cache is preferred if it is writable or can be created.
12
+ # * The user cache is used otherwise
13
+ #
14
+ # Once a cache is selected, it will be used for all operations.
15
+ # SourceInfoCache will not switch between cache files dynamically.
16
+ #
17
+ # Cache data is a Hash mapping a source URI to a SourceInfoCacheEntry.
18
+ #
19
+ #--
20
+ # To keep things straight, this is how the cache objects all fit together:
21
+ #
22
+ # LibGems::SourceInfoCache
23
+ # @cache_data = {
24
+ # source_uri => LibGems::SourceInfoCacheEntry
25
+ # @size = source index size
26
+ # @source_index = LibGems::SourceIndex
27
+ # ...
28
+ # }
29
+
30
+ class LibGems::SourceInfoCache
31
+
32
+ include LibGems::UserInteraction
33
+
34
+ ##
35
+ # The singleton LibGems::SourceInfoCache. If +all+ is true, a full refresh will
36
+ # be performed if the singleton instance is being initialized.
37
+
38
+ def self.cache(all = false)
39
+ return @cache if @cache
40
+ @cache = new
41
+ @cache.refresh all if LibGems.configuration.update_sources
42
+ @cache
43
+ end
44
+
45
+ def self.cache_data
46
+ cache.cache_data
47
+ end
48
+
49
+ ##
50
+ # The name of the system cache file.
51
+
52
+ def self.latest_system_cache_file
53
+ File.join File.dirname(system_cache_file),
54
+ "latest_#{File.basename system_cache_file}"
55
+ end
56
+
57
+ ##
58
+ # The name of the latest user cache file.
59
+
60
+ def self.latest_user_cache_file
61
+ File.join File.dirname(user_cache_file),
62
+ "latest_#{File.basename user_cache_file}"
63
+ end
64
+
65
+ ##
66
+ # Reset all singletons, discarding any changes.
67
+
68
+ def self.reset
69
+ @cache = nil
70
+ @system_cache_file = nil
71
+ @user_cache_file = nil
72
+ end
73
+
74
+ ##
75
+ # Search all source indexes. See LibGems::SourceInfoCache#search.
76
+
77
+ def self.search(*args)
78
+ cache.search(*args)
79
+ end
80
+
81
+ ##
82
+ # Search all source indexes returning the source_uri. See
83
+ # LibGems::SourceInfoCache#search_with_source.
84
+
85
+ def self.search_with_source(*args)
86
+ cache.search_with_source(*args)
87
+ end
88
+
89
+ ##
90
+ # The name of the system cache file. (class method)
91
+
92
+ def self.system_cache_file
93
+ @system_cache_file ||= LibGems.default_system_source_cache_dir
94
+ end
95
+
96
+ ##
97
+ # The name of the user cache file.
98
+
99
+ def self.user_cache_file
100
+ @user_cache_file ||=
101
+ ENV['LIBGEMSCACHE'] || ENV['GEMCACHE'] || LibGems.default_user_source_cache_dir
102
+ end
103
+
104
+ def initialize # :nodoc:
105
+ @cache_data = nil
106
+ @cache_file = nil
107
+ @dirty = false
108
+ @only_latest = true
109
+ end
110
+
111
+ ##
112
+ # The most recent cache data.
113
+
114
+ def cache_data
115
+ return @cache_data if @cache_data
116
+ cache_file # HACK writable check
117
+
118
+ @only_latest = true
119
+
120
+ @cache_data = read_cache_data latest_cache_file
121
+
122
+ @cache_data
123
+ end
124
+
125
+ ##
126
+ # The name of the cache file.
127
+
128
+ def cache_file
129
+ return @cache_file if @cache_file
130
+ @cache_file = (try_file(system_cache_file) or
131
+ try_file(user_cache_file) or
132
+ raise "unable to locate a writable cache file")
133
+ end
134
+
135
+ ##
136
+ # Write the cache to a local file (if it is dirty).
137
+
138
+ def flush
139
+ write_cache if @dirty
140
+ @dirty = false
141
+ end
142
+
143
+ def latest_cache_data
144
+ latest_cache_data = {}
145
+
146
+ cache_data.each do |repo, sice|
147
+ latest = sice.source_index.latest_specs
148
+
149
+ new_si = LibGems::SourceIndex.new
150
+ new_si.add_specs(*latest)
151
+
152
+ latest_sice = LibGems::SourceInfoCacheEntry.new new_si, sice.size
153
+ latest_cache_data[repo] = latest_sice
154
+ end
155
+
156
+ latest_cache_data
157
+ end
158
+
159
+ ##
160
+ # The name of the latest cache file.
161
+
162
+ def latest_cache_file
163
+ File.join File.dirname(cache_file), "latest_#{File.basename cache_file}"
164
+ end
165
+
166
+ ##
167
+ # The name of the latest system cache file.
168
+
169
+ def latest_system_cache_file
170
+ self.class.latest_system_cache_file
171
+ end
172
+
173
+ ##
174
+ # The name of the latest user cache file.
175
+
176
+ def latest_user_cache_file
177
+ self.class.latest_user_cache_file
178
+ end
179
+
180
+ ##
181
+ # Merges the complete cache file into this LibGems::SourceInfoCache.
182
+
183
+ def read_all_cache_data
184
+ if @only_latest then
185
+ @only_latest = false
186
+ all_data = read_cache_data cache_file
187
+
188
+ cache_data.update all_data do |source_uri, latest_sice, all_sice|
189
+ all_sice.source_index.gems.update latest_sice.source_index.gems
190
+
191
+ LibGems::SourceInfoCacheEntry.new all_sice.source_index, latest_sice.size
192
+ end
193
+
194
+ begin
195
+ refresh true
196
+ rescue LibGems::RemoteFetcher::FetchError
197
+ end
198
+ end
199
+ end
200
+
201
+ ##
202
+ # Reads cached data from +file+.
203
+
204
+ def read_cache_data(file)
205
+ # Marshal loads 30-40% faster from a String, and 2MB on 20061116 is small
206
+ data = open file, 'rb' do |fp| fp.read end
207
+ cache_data = Marshal.load data
208
+
209
+ cache_data.each do |url, sice|
210
+ next unless sice.is_a?(Hash)
211
+ update
212
+
213
+ cache = sice['cache']
214
+ size = sice['size']
215
+
216
+ if cache.is_a?(LibGems::SourceIndex) and size.is_a?(Numeric) then
217
+ new_sice = LibGems::SourceInfoCacheEntry.new cache, size
218
+ cache_data[url] = new_sice
219
+ else # irreperable, force refetch.
220
+ reset_cache_for url, cache_data
221
+ end
222
+ end
223
+
224
+ cache_data
225
+ rescue Errno::ENOENT
226
+ {}
227
+ rescue => e
228
+ if LibGems.configuration.really_verbose then
229
+ say "Exception during cache_data handling: #{e.class} - #{e}"
230
+ say "Cache file was: #{file}"
231
+ say "\t#{e.backtrace.join "\n\t"}"
232
+ end
233
+
234
+ {}
235
+ end
236
+
237
+ ##
238
+ # Refreshes each source in the cache from its repository. If +all+ is
239
+ # false, only latest gems are updated.
240
+
241
+ def refresh(all)
242
+ LibGems.sources.each do |source_uri|
243
+ cache_entry = cache_data[source_uri]
244
+ if cache_entry.nil? then
245
+ cache_entry = LibGems::SourceInfoCacheEntry.new nil, 0
246
+ cache_data[source_uri] = cache_entry
247
+ end
248
+
249
+ update if cache_entry.refresh source_uri, all
250
+ end
251
+
252
+ flush
253
+ end
254
+
255
+ def reset_cache_for(url, cache_data)
256
+ say "Reseting cache for #{url}" if LibGems.configuration.really_verbose
257
+
258
+ sice = LibGems::SourceInfoCacheEntry.new LibGems::SourceIndex.new, 0
259
+ sice.refresh url, false # HACK may be unnecessary, see ::cache and #refresh
260
+
261
+ cache_data[url] = sice
262
+ cache_data
263
+ end
264
+
265
+ def reset_cache_data
266
+ @cache_data = nil
267
+ @only_latest = true
268
+ end
269
+
270
+ ##
271
+ # Force cache file to be reset, useful for integration testing of rubygems
272
+
273
+ def reset_cache_file
274
+ @cache_file = nil
275
+ end
276
+
277
+ ##
278
+ # Searches all source indexes. See LibGems::SourceIndex#search for details on
279
+ # +pattern+ and +platform_only+. If +all+ is set to true, the full index
280
+ # will be loaded before searching.
281
+
282
+ def search(pattern, platform_only = false, all = false)
283
+ read_all_cache_data if all
284
+
285
+ cache_data.map do |source_uri, sic_entry|
286
+ next unless LibGems.sources.include? source_uri
287
+ # TODO - Remove this gunk after 2008/11
288
+ unless pattern.kind_of? LibGems::Dependency then
289
+ pattern = LibGems::Dependency.new pattern, LibGems::Requirement.default
290
+ end
291
+ sic_entry.source_index.search pattern, platform_only
292
+ end.flatten.compact
293
+ end
294
+
295
+ ##
296
+ # Searches all source indexes for +pattern+. If +only_platform+ is true,
297
+ # only gems matching LibGems.platforms will be selected. Returns an Array of
298
+ # pairs containing the LibGems::Specification found and the source_uri it was
299
+ # found at.
300
+
301
+ def search_with_source(pattern, only_platform = false, all = false)
302
+ read_all_cache_data if all
303
+
304
+ results = []
305
+
306
+ cache_data.map do |source_uri, sic_entry|
307
+ next unless LibGems.sources.include? source_uri
308
+
309
+ # TODO - Remove this gunk after 2008/11
310
+ unless pattern.kind_of?(LibGems::Dependency)
311
+ pattern = LibGems::Dependency.new(pattern, LibGems::Requirement.default)
312
+ end
313
+
314
+ sic_entry.source_index.search(pattern, only_platform).each do |spec|
315
+ results << [spec, source_uri]
316
+ end
317
+ end
318
+
319
+ results
320
+ end
321
+
322
+ ##
323
+ # Set the source info cache data directly. This is mainly used for unit
324
+ # testing when we don't want to read a file system to grab the cached source
325
+ # index information. The +hash+ should map a source URL into a
326
+ # SourceInfoCacheEntry.
327
+
328
+ def set_cache_data(hash)
329
+ @cache_data = hash
330
+ update
331
+ end
332
+
333
+ ##
334
+ # The name of the system cache file.
335
+
336
+ def system_cache_file
337
+ self.class.system_cache_file
338
+ end
339
+
340
+ ##
341
+ # Determine if +path+ is a candidate for a cache file. Returns +path+ if
342
+ # it is, nil if not.
343
+
344
+ def try_file(path)
345
+ return path if File.writable? path
346
+ return nil if File.exist? path
347
+
348
+ dir = File.dirname path
349
+
350
+ unless File.exist? dir then
351
+ begin
352
+ FileUtils.mkdir_p dir
353
+ rescue RuntimeError, SystemCallError
354
+ return nil
355
+ end
356
+ end
357
+
358
+ return path if File.writable? dir
359
+
360
+ nil
361
+ end
362
+
363
+ ##
364
+ # Mark the cache as updated (i.e. dirty).
365
+
366
+ def update
367
+ @dirty = true
368
+ end
369
+
370
+ ##
371
+ # The name of the user cache file.
372
+
373
+ def user_cache_file
374
+ self.class.user_cache_file
375
+ end
376
+
377
+ ##
378
+ # Write data to the proper cache files.
379
+
380
+ def write_cache
381
+ if not File.exist?(cache_file) or not @only_latest then
382
+ open cache_file, 'wb' do |io|
383
+ io.write Marshal.dump(cache_data)
384
+ end
385
+ end
386
+
387
+ open latest_cache_file, 'wb' do |io|
388
+ io.write Marshal.dump(latest_cache_data)
389
+ end
390
+ end
391
+
392
+ reset
393
+
394
+ end
395
+
@@ -0,0 +1,56 @@
1
+ require 'libgems'
2
+ require 'libgems/source_index'
3
+ require 'libgems/remote_fetcher'
4
+
5
+ ##
6
+ # Entries held by a SourceInfoCache.
7
+
8
+ class LibGems::SourceInfoCacheEntry
9
+
10
+ ##
11
+ # The source index for this cache entry.
12
+
13
+ attr_reader :source_index
14
+
15
+ ##
16
+ # The size of the source entry. Used to determine if the source index has
17
+ # changed.
18
+
19
+ attr_reader :size
20
+
21
+ ##
22
+ # Create a cache entry.
23
+
24
+ def initialize(si, size)
25
+ @source_index = si || LibGems::SourceIndex.new({})
26
+ @size = size
27
+ @all = false
28
+ end
29
+
30
+ def refresh(source_uri, all)
31
+ begin
32
+ marshal_uri = URI.join source_uri.to_s, "Marshal.#{LibGems.marshal_version}"
33
+ remote_size = LibGems::RemoteFetcher.fetcher.fetch_size marshal_uri
34
+ rescue LibGems::RemoteSourceException
35
+ yaml_uri = URI.join source_uri.to_s, 'yaml'
36
+ remote_size = LibGems::RemoteFetcher.fetcher.fetch_size yaml_uri
37
+ end
38
+
39
+ # TODO Use index_signature instead of size?
40
+ return false if @size == remote_size and @all
41
+
42
+ updated = @source_index.update source_uri, all
43
+ @size = remote_size
44
+ @all = all
45
+
46
+ updated
47
+ end
48
+
49
+ def ==(other) # :nodoc:
50
+ self.class === other and
51
+ @size == other.size and
52
+ @source_index == other.source_index
53
+ end
54
+
55
+ end
56
+