libgems 0.0.1

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 (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
+