rubygems-update 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubygems-update might be problematic. Click here for more details.

Files changed (105) hide show
  1. data/.document +4 -0
  2. data/ChangeLog +458 -0
  3. data/GPL.txt +340 -0
  4. data/LICENSE.txt +53 -0
  5. data/Rakefile +26 -10
  6. data/TODO +0 -1
  7. data/bin/gem_server +2 -434
  8. data/bin/gemlock +1 -1
  9. data/bin/index_gem_repository.rb +34 -12
  10. data/examples/application/an-app.gemspec +4 -2
  11. data/examples/application/ext/Makefile +139 -0
  12. data/examples/application/ext/extconf.rb +3 -0
  13. data/examples/application/ext/foo.c +1 -0
  14. data/lib/gemconfigure.rb +2 -2
  15. data/lib/rubygems.rb +85 -46
  16. data/lib/rubygems/cmd_manager.rb +14 -11
  17. data/lib/rubygems/command.rb +18 -9
  18. data/lib/rubygems/config_file.rb +17 -16
  19. data/lib/rubygems/custom_require.rb +7 -12
  20. data/lib/rubygems/dependency_list.rb +38 -38
  21. data/lib/rubygems/gem_commands.rb +471 -242
  22. data/lib/rubygems/gem_openssl.rb +1 -1
  23. data/lib/rubygems/gem_runner.rb +2 -1
  24. data/lib/rubygems/installer.rb +189 -143
  25. data/lib/rubygems/package.rb +625 -621
  26. data/lib/rubygems/remote_fetcher.rb +142 -0
  27. data/lib/rubygems/remote_installer.rb +85 -465
  28. data/lib/rubygems/rubygems_version.rb +1 -1
  29. data/lib/rubygems/security.rb +54 -11
  30. data/lib/rubygems/server.rb +486 -0
  31. data/lib/rubygems/source_index.rb +187 -21
  32. data/lib/rubygems/source_info_cache.rb +153 -0
  33. data/lib/rubygems/source_info_cache_entry.rb +31 -0
  34. data/lib/rubygems/specification.rb +71 -30
  35. data/lib/rubygems/user_interaction.rb +22 -20
  36. data/lib/rubygems/validator.rb +8 -7
  37. data/lib/rubygems/version.rb +32 -17
  38. data/pkgs/sources/sources-0.0.1.gem +0 -0
  39. data/post-install.rb +42 -3
  40. data/scripts/gemdoc.rb +3 -3
  41. data/scripts/runtest.rb +1 -1
  42. data/scripts/upload_gemdoc.rb +11 -11
  43. data/setup.rb +14 -7
  44. data/test/brokenbuildgem.rb +35 -0
  45. data/test/data/a-0.0.1.gem +0 -0
  46. data/test/data/a-0.0.2.gem +0 -0
  47. data/test/data/b-0.0.2.gem +0 -0
  48. data/test/data/broken-1.0.0.gem +0 -0
  49. data/test/data/broken_build/broken-build.gemspec +20 -0
  50. data/test/data/broken_build/ext/extconf.rb +3 -0
  51. data/test/data/broken_build/ext/foo.c +1 -0
  52. data/test/data/c-1.2.gem +0 -0
  53. data/test/data/gemhome/cache/a-0.0.1.gem +0 -0
  54. data/test/data/gemhome/cache/a-0.0.2.gem +0 -0
  55. data/test/data/gemhome/cache/b-0.0.2.gem +0 -0
  56. data/test/data/gemhome/cache/c-1.2.gem +0 -0
  57. data/test/data/gemhome/gems/a-0.0.1/lib/code.rb +0 -6
  58. data/test/data/gemhome/gems/a-0.0.2/lib/code.rb +0 -6
  59. data/test/data/gemhome/gems/b-0.0.2/lib/code.rb +0 -6
  60. data/test/data/gemhome/gems/c-1.2/lib/code.rb +0 -6
  61. data/test/data/gemhome/specifications/a-0.0.1.gemspec +1 -1
  62. data/test/data/gemhome/specifications/a-0.0.2.gemspec +1 -1
  63. data/test/data/gemhome/specifications/b-0.0.2.gemspec +1 -1
  64. data/test/data/gemhome/specifications/c-1.2.gemspec +1 -1
  65. data/test/data/lib/code.rb +0 -6
  66. data/test/data/one/one-0.0.1.gem +0 -0
  67. data/test/functional.rb +24 -21
  68. data/test/functional_extension_gems.rb +48 -0
  69. data/test/functional_generate_yaml_index.rb +6 -3
  70. data/test/gemenvironment.rb +27 -22
  71. data/test/gemutilities.rb +95 -5
  72. data/test/insure_session.rb +2 -2
  73. data/test/io_capture.rb +33 -0
  74. data/test/test_check_command.rb +2 -2
  75. data/test/test_command.rb +16 -13
  76. data/test/test_dependency_list.rb +20 -20
  77. data/test/test_file_list.rb +10 -11
  78. data/test/test_format.rb +19 -46
  79. data/test/test_gem.rb +25 -0
  80. data/test/test_gem_ext_configure_builder.rb +88 -0
  81. data/test/test_gem_ext_ext_conf_builder.rb +122 -0
  82. data/test/test_gem_ext_rake_builder.rb +61 -0
  83. data/test/test_gem_outdated_command.rb +37 -0
  84. data/test/test_gem_source_info_cache.rb +196 -0
  85. data/test/test_gem_source_info_cache_entry.rb +44 -0
  86. data/test/test_gem_sources_command.rb +130 -0
  87. data/test/test_installer.rb +137 -9
  88. data/test/test_package.rb +521 -531
  89. data/test/test_parse_commands.rb +7 -7
  90. data/test/test_process_commands.rb +1 -1
  91. data/test/test_remote_fetcher.rb +187 -45
  92. data/test/test_remote_installer.rb +35 -52
  93. data/test/test_require_gem.rb +12 -12
  94. data/test/test_source_index.rb +194 -48
  95. data/test/test_specification.rb +154 -0
  96. data/test/test_user_interaction.rb +48 -0
  97. data/test/test_validator.rb +1 -1
  98. data/test/test_version_comparison.rb +116 -5
  99. metadata +33 -10
  100. data/lib/rubygems/incremental_fetcher.rb +0 -136
  101. data/lib/rubygems/loadpath_manager.rb +0 -114
  102. data/lib/rubygems/open-uri.rb +0 -756
  103. data/test/test_cached_fetcher.rb +0 -64
  104. data/test/test_incremental_fetcher.rb +0 -175
  105. data/test/test_local_cache.rb +0 -106
data/TODO CHANGED
@@ -1,7 +1,6 @@
1
1
  * support for installing binary (pre-compiled), platform-dependent gems. This already works as long as you pick the right gem manually, but I'd like the remote installer to intelligently select the right one and for the installer to throw an error (or a warning) if you attempt o install (e.g.) a Windows gem on a linux system. Requires a lot of data to be collected on platform dependency fulfillment.
2
2
  * syncing gem repositories
3
3
  * optional dependencies: "semitar can use REXML, but it works better if you have the ruby raptor library installed", or not so optional as in: "you need Ruby/RSS > = 1.0 OR rss > 0.91 for this library to work"
4
- * ri data generation
5
4
  * Integration with platform-native packaging systems
6
5
  * MD5 summing stuff doesn't work right on the new format (0.8.0+)
7
6
  * Rethink testing strategy. May need to write a document describing how to avoid doing things in unit tests that won't work outside of `pwd`
@@ -1,438 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- DOC_TEMPLATE = <<-WEBPAGE
4
- <?xml version="1.0" encoding="iso-8859-1"?>
5
- <!DOCTYPE html
6
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
7
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ require 'rubygems/server'
8
4
 
9
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
10
- <head>
11
- <title>RubyGems Documentation Index</title>
12
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
13
- <link rel="stylesheet" href="rdoc-style.css" type="text/css" media="screen" />
14
- </head>
15
- <body>
16
- <div id="fileHeader">
17
- <h1>RubyGems Documentation Index</h1>
18
- </div>
19
- <!-- banner header -->
5
+ Gem::Server.run ARGV
20
6
 
21
- <div id="bodyContent">
22
- <div id="contextContent">
23
- <div id="description">
24
- <h1>Summary</h1>
25
- <p>There are %gem_count% gems installed:</p>
26
- <p>
27
- START:specs
28
- IFNOT:is_last
29
- <a href="#%name%">%name%</a>,
30
- ENDIF:is_last
31
- IF:is_last
32
- <a href="#%name%">%name%</a>.
33
- ENDIF:is_last
34
- END:specs
35
- <h1>Gems</h1>
36
-
37
- <dl>
38
- START:specs
39
- <dt>
40
- IF:first_name_entry
41
- <a name="%name%"></a>
42
- ENDIF:first_name_entry
43
- <b>%name% %version%</b>
44
- IF:rdoc_installed
45
- <a href="%doc_path%">[rdoc]</a>
46
- ENDIF:rdoc_installed
47
- IFNOT:rdoc_installed
48
- <span title="rdoc not installed">[rdoc]</span>
49
- ENDIF:rdoc_installed
50
- IF:homepage
51
- <a href="%homepage%" target="_blank" title="%homepage%">[www]</a>
52
- ENDIF:homepage
53
- IFNOT:homepage
54
- <span title="no homepage available">[www]</span>
55
- ENDIF:homepage
56
- IF:has_deps
57
- - depends on
58
- START:dependencies
59
- IFNOT:is_last
60
- <a href="#%name%" title="%version%">%name%</a>,
61
- ENDIF:is_last
62
- IF:is_last
63
- <a href="#%name%" title="%version%">%name%</a>.
64
- ENDIF:is_last
65
- END:dependencies
66
- ENDIF:has_deps
67
- </dt>
68
- <dd>
69
- %summary%
70
- IF:executables
71
- <br/>
72
-
73
- IF:only_one_executable
74
- Executable is
75
- ENDIF:only_one_executable
76
-
77
- IFNOT:only_one_executable
78
- Executables are
79
- ENDIF:only_one_executable
80
-
81
- START:executables
82
- IFNOT:is_last
83
- <span class="context-item-name">%executable%</span>,
84
- ENDIF:is_last
85
- IF:is_last
86
- <span class="context-item-name">%executable%</span>.
87
- ENDIF:is_last
88
- END:executables
89
- ENDIF:executables
90
- <br/>
91
- <br/>
92
- </dd>
93
- END:specs
94
- </dl>
95
-
96
- </div>
97
- </div>
98
- </div>
99
- <div id="validator-badges">
100
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
101
- </div>
102
- </body>
103
- </html>
104
- WEBPAGE
105
-
106
-
107
- # CSS is copy & paste from rdoc-style.css, RDoc V1.0.1 - 20041108
108
- RDOC_CSS = <<-RDOCCSS
109
- body {
110
- font-family: Verdana,Arial,Helvetica,sans-serif;
111
- font-size: 90%;
112
- margin: 0;
113
- margin-left: 40px;
114
- padding: 0;
115
- background: white;
116
- }
117
-
118
- h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
119
- h1 { font-size: 150%; }
120
- h2,h3,h4 { margin-top: 1em; }
121
-
122
- a { background: #eef; color: #039; text-decoration: none; }
123
- a:hover { background: #039; color: #eef; }
124
-
125
- /* Override the base stylesheets Anchor inside a table cell */
126
- td > a {
127
- background: transparent;
128
- color: #039;
129
- text-decoration: none;
130
- }
131
-
132
- /* and inside a section title */
133
- .section-title > a {
134
- background: transparent;
135
- color: #eee;
136
- text-decoration: none;
137
- }
138
-
139
- /* === Structural elements =================================== */
140
-
141
- div#index {
142
- margin: 0;
143
- margin-left: -40px;
144
- padding: 0;
145
- font-size: 90%;
146
- }
147
-
148
-
149
- div#index a {
150
- margin-left: 0.7em;
151
- }
152
-
153
- div#index .section-bar {
154
- margin-left: 0px;
155
- padding-left: 0.7em;
156
- background: #ccc;
157
- font-size: small;
158
- }
159
-
160
-
161
- div#classHeader, div#fileHeader {
162
- width: auto;
163
- color: white;
164
- padding: 0.5em 1.5em 0.5em 1.5em;
165
- margin: 0;
166
- margin-left: -40px;
167
- border-bottom: 3px solid #006;
168
- }
169
-
170
- div#classHeader a, div#fileHeader a {
171
- background: inherit;
172
- color: white;
173
- }
174
-
175
- div#classHeader td, div#fileHeader td {
176
- background: inherit;
177
- color: white;
178
- }
179
-
180
-
181
- div#fileHeader {
182
- background: #057;
183
- }
184
-
185
- div#classHeader {
186
- background: #048;
187
- }
188
-
189
-
190
- .class-name-in-header {
191
- font-size: 180%;
192
- font-weight: bold;
193
- }
194
-
195
-
196
- div#bodyContent {
197
- padding: 0 1.5em 0 1.5em;
198
- }
199
-
200
- div#description {
201
- padding: 0.5em 1.5em;
202
- background: #efefef;
203
- border: 1px dotted #999;
204
- }
205
-
206
- div#description h1,h2,h3,h4,h5,h6 {
207
- color: #125;;
208
- background: transparent;
209
- }
210
-
211
- div#validator-badges {
212
- text-align: center;
213
- }
214
- div#validator-badges img { border: 0; }
215
-
216
- div#copyright {
217
- color: #333;
218
- background: #efefef;
219
- font: 0.75em sans-serif;
220
- margin-top: 5em;
221
- margin-bottom: 0;
222
- padding: 0.5em 2em;
223
- }
224
-
225
-
226
- /* === Classes =================================== */
227
-
228
- table.header-table {
229
- color: white;
230
- font-size: small;
231
- }
232
-
233
- .type-note {
234
- font-size: small;
235
- color: #DEDEDE;
236
- }
237
-
238
- .xxsection-bar {
239
- background: #eee;
240
- color: #333;
241
- padding: 3px;
242
- }
243
-
244
- .section-bar {
245
- color: #333;
246
- border-bottom: 1px solid #999;
247
- margin-left: -20px;
248
- }
249
-
250
-
251
- .section-title {
252
- background: #79a;
253
- color: #eee;
254
- padding: 3px;
255
- margin-top: 2em;
256
- margin-left: -30px;
257
- border: 1px solid #999;
258
- }
259
-
260
- .top-aligned-row { vertical-align: top }
261
- .bottom-aligned-row { vertical-align: bottom }
262
-
263
- /* --- Context section classes ----------------------- */
264
-
265
- .context-row { }
266
- .context-item-name { font-family: monospace; font-weight: bold; color: black; }
267
- .context-item-value { font-size: small; color: #448; }
268
- .context-item-desc { color: #333; padding-left: 2em; }
269
-
270
- /* --- Method classes -------------------------- */
271
- .method-detail {
272
- background: #efefef;
273
- padding: 0;
274
- margin-top: 0.5em;
275
- margin-bottom: 1em;
276
- border: 1px dotted #ccc;
277
- }
278
- .method-heading {
279
- color: black;
280
- background: #ccc;
281
- border-bottom: 1px solid #666;
282
- padding: 0.2em 0.5em 0 0.5em;
283
- }
284
- .method-signature { color: black; background: inherit; }
285
- .method-name { font-weight: bold; }
286
- .method-args { font-style: italic; }
287
- .method-description { padding: 0 0.5em 0 0.5em; }
288
-
289
- /* --- Source code sections -------------------- */
290
-
291
- a.source-toggle { font-size: 90%; }
292
- div.method-source-code {
293
- background: #262626;
294
- color: #ffdead;
295
- margin: 1em;
296
- padding: 0.5em;
297
- border: 1px dashed #999;
298
- overflow: hidden;
299
- }
300
-
301
- div.method-source-code pre { color: #ffdead; overflow: hidden; }
302
-
303
- /* --- Ruby keyword styles --------------------- */
304
-
305
- .standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
306
-
307
- .ruby-constant { color: #7fffd4; background: transparent; }
308
- .ruby-keyword { color: #00ffff; background: transparent; }
309
- .ruby-ivar { color: #eedd82; background: transparent; }
310
- .ruby-operator { color: #00ffee; background: transparent; }
311
- .ruby-identifier { color: #ffdead; background: transparent; }
312
- .ruby-node { color: #ffa07a; background: transparent; }
313
- .ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
314
- .ruby-regexp { color: #ffa07a; background: transparent; }
315
- .ruby-value { color: #7fffd4; background: transparent; }
316
- RDOCCSS
317
-
318
-
319
- # gem_server and gem_server.cgi are equivalent programs that allow
320
- # users to serve gems for consumption by `gem --remote-install`.
321
- #
322
- # gem_server starts an HTTP server on the given port, and serves the folowing:
323
- # * "/" - Browsing of gem spec files for installed gems
324
- # * "/yaml" - Full yaml dump of metadata for installed gems
325
- # * "/gems" - Direct access to download the installable gems
326
- #
327
- # Usage: gem_server [-p portnum] [-d gem_path]
328
- # port_num:: The TCP port the HTTP server will bind to
329
- # gem_path::
330
- # Root gem directory containing both "cache" and "specifications"
331
- # subdirectories.
332
- if __FILE__ == $0
333
- require 'rubygems'
334
- Gem.manage_gems
335
- require 'webrick'
336
- require 'yaml'
337
- require 'optparse'
338
- require 'rdoc/template'
339
- Socket.do_not_reverse_lookup=true
340
- options = {}
341
- ARGV.options do |opts|
342
- opts.on_tail("--help",
343
- "show this message") {puts opts; exit}
344
- opts.on('-pPORT','--port=PORT',
345
- "Specify the port to listen on") { |options[:port]| }
346
- opts.on('-dGEMDIR','--dir=GEMDIR',
347
- "Specify the directory from which to serve Gems") { |options[:gemdir]| }
348
- opts.parse!
349
- end
350
-
351
- s = WEBrick::HTTPServer.new(:Port => options[:port] || 8808)
352
- s.mount_proc("/yaml") { |req, res|
353
- fn = File.join(options[:gemdir] || Gem.dir, "specifications")
354
- res['content-type'] = 'text/plain'
355
- res['date'] = File.stat(fn).mtime
356
- res.body << Gem::SourceIndex.from_gems_in(fn).to_yaml
357
- }
358
-
359
- s.mount_proc("/rdoc-style.css") { |req, res|
360
- fn = File.join(options[:gemdir] || Gem.dir, "specifications")
361
- res['content-type'] = 'text/css'
362
- res['date'] = File.stat(fn).mtime
363
- res.body << RDOC_CSS
364
- }
365
-
366
- s.mount_proc("/") { |req, res|
367
- specs = []
368
- specifications_dir = File.join(options[:gemdir] || Gem.dir, "specifications")
369
- total_file_count = 0
370
- Gem::SourceIndex.from_gems_in(specifications_dir).each do |path, spec|
371
- total_file_count += spec.files.size
372
- deps = spec.dependencies.collect { |dep|
373
- {
374
- "name" => dep.name,
375
- "version" => dep.version_requirements.to_s,
376
- }
377
- }
378
- deps = deps.sort_by { |dep| [dep["name"].downcase, dep["version"]] }
379
- deps.last["is_last"] = true unless deps.empty?
380
-
381
- # executables
382
- executables = spec.executables.sort.collect { |exec| {"executable" => exec} }
383
- executables = nil if executables.empty?
384
- executables.last["is_last"] = true if executables
385
-
386
- specs << {
387
- "authors" => spec.authors.sort.join(", "),
388
- "date" => spec.date.to_s,
389
- "dependencies" => deps,
390
- "doc_path" => ('/doc_root/' + spec.full_name + '/rdoc/index.html'),
391
- "executables" => executables,
392
- "only_one_executable" => (executables && executables.size==1),
393
- "full_name" => spec.full_name,
394
- "has_deps" => !deps.empty?,
395
- "homepage" => spec.homepage,
396
- "name" => spec.name,
397
- "rdoc_installed" => Gem::DocManager.new(spec).rdoc_installed?,
398
- "summary" => spec.summary,
399
- "version" => spec.version.to_s,
400
- }
401
- end
402
- specs = specs.sort_by { |spec| [spec["name"].downcase, spec["version"]] }
403
- specs.last["is_last"] = true
404
-
405
- # tag all specs with first_name_entry
406
- last_spec = nil
407
- specs.each do |spec|
408
- is_first = last_spec.nil? || (last_spec["name"].downcase != spec["name"].downcase)
409
- spec["first_name_entry"] = is_first
410
- last_spec = spec
411
- end
412
-
413
- # create page from template
414
- template = TemplatePage.new(DOC_TEMPLATE)
415
- res['content-type'] = 'text/html'
416
- template.write_html_on(
417
- res.body,
418
- {
419
- "gem_count" => specs.size.to_s,
420
- "specs" => specs,
421
- "total_file_count" => total_file_count.to_s,
422
- }
423
- )
424
-
425
- }
426
- {
427
- "/gems" => "/cache/",
428
- "/doc_root" => "/doc/",
429
- }.each do |mount_point, mount_dir|
430
- s.mount(
431
- mount_point,
432
- WEBrick::HTTPServlet::FileHandler,
433
- File.join(options[:gemdir] || Gem.dir, mount_dir),
434
- true)
435
- end
436
- trap("INT") { s.shutdown; exit! }
437
- s.start
438
- end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # Usage: gemlock gem_name-version...
13
13
  #
14
- # gemlock will generate a list of require_gem statements that will
14
+ # gemlock will generate a list of +gem+ statements that will
15
15
  # lock down the versions for the gem given in the command line. It
16
16
  # will specify exact versions in the requirements list to ensure that
17
17
  # the gems loaded will always be consistent. A full recursive search