shoesgem 0.1424.0 → 0.1426.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (320) hide show
  1. data/README.rdoc +3 -0
  2. data/shoes/CHANGELOG.txt +21 -21
  3. data/shoes/COPYING.txt +30 -30
  4. data/shoes/VERSION.txt +1 -1
  5. data/shoes/freetype6.dll +0 -0
  6. data/shoes/lib/shoes/cache.rb +54 -54
  7. data/shoes/lib/shoes/data.rb +39 -39
  8. data/shoes/lib/shoes/help.rb +421 -421
  9. data/shoes/lib/shoes/image.rb +25 -25
  10. data/shoes/lib/shoes/inspect.rb +128 -128
  11. data/shoes/lib/shoes/log.rb +48 -48
  12. data/shoes/lib/shoes/minitar.rb +986 -986
  13. data/shoes/lib/shoes/override.rb +38 -38
  14. data/shoes/lib/shoes/pack.rb +503 -503
  15. data/shoes/lib/shoes/search.rb +46 -46
  16. data/shoes/lib/shoes/setup.rb +329 -329
  17. data/shoes/lib/shoes/shy.rb +131 -131
  18. data/shoes/lib/shoes/shybuilder.rb +44 -44
  19. data/shoes/lib/shoes.rb +522 -522
  20. data/shoes/libcairo-2.dll +0 -0
  21. data/shoes/libeay32.dll +0 -0
  22. data/shoes/libexpat-1.dll +0 -0
  23. data/shoes/libfontconfig-1.dll +0 -0
  24. data/shoes/libgio-2.0-0.dll +0 -0
  25. data/shoes/libglib-2.0-0.dll +0 -0
  26. data/shoes/libgmodule-2.0-0.dll +0 -0
  27. data/shoes/libgobject-2.0-0.dll +0 -0
  28. data/shoes/libgthread-2.0-0.dll +0 -0
  29. data/shoes/libiconv2.dll +0 -0
  30. data/shoes/libjpeg-8.dll +0 -0
  31. data/shoes/libpango-1.0-0.dll +0 -0
  32. data/shoes/libpangocairo-1.0-0.dll +0 -0
  33. data/shoes/libpangoft2-1.0-0.dll +0 -0
  34. data/shoes/libpangowin32-1.0-0.dll +0 -0
  35. data/shoes/libpng14-14.dll +0 -0
  36. data/shoes/libportaudio-2.dll +0 -0
  37. data/shoes/libshoes.dll +0 -0
  38. data/shoes/libssl32.dll +0 -0
  39. data/shoes/libungif4.dll +0 -0
  40. data/shoes/msvcrt-ruby191.dll +0 -0
  41. data/shoes/nsis/base.nsi +644 -0
  42. data/shoes/nsis/installer-1.bmp +0 -0
  43. data/shoes/nsis/installer-2.bmp +0 -0
  44. data/shoes/nsis/setup.ico +0 -0
  45. data/shoes/nsis/shoes.exe.manifest +17 -0
  46. data/shoes/nsis/shoes.ico +0 -0
  47. data/shoes/nsis/shoes.nsi +644 -0
  48. data/shoes/nsis/stub-inject.c +59 -0
  49. data/shoes/nsis/stub.c +271 -0
  50. data/shoes/nsis/stub32.h +14 -0
  51. data/shoes/nsis/stub32.rc +16 -0
  52. data/shoes/readline5.dll +0 -0
  53. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/fast_xs.so +0 -0
  54. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/blankslate.rb +63 -63
  55. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/builder.rb +216 -216
  56. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/elements.rb +510 -510
  57. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/htmlinfo.rb +691 -691
  58. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/inspect.rb +103 -103
  59. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/modules.rb +40 -40
  60. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/parse.rb +38 -38
  61. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/tag.rb +202 -202
  62. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/tags.rb +164 -164
  63. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/traverse.rb +838 -838
  64. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/xchar.rb +94 -94
  65. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot.rb +26 -26
  66. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot_scan.so +0 -0
  67. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/add/core.rb +135 -135
  68. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/add/rails.rb +58 -58
  69. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/common.rb +354 -354
  70. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext/generator.so +0 -0
  71. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext/parser.so +0 -0
  72. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext.rb +13 -13
  73. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/version.rb +9 -9
  74. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json.rb +8 -8
  75. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/constants.rb +49 -49
  76. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/database.rb +721 -721
  77. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/dl/api.rb +152 -152
  78. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/dl/driver.rb +307 -307
  79. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/native/driver.rb +219 -219
  80. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/errors.rb +68 -68
  81. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/pragmas.rb +271 -271
  82. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/resultset.rb +180 -180
  83. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/statement.rb +231 -231
  84. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/translator.rb +109 -109
  85. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/value.rb +57 -57
  86. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/version.rb +16 -16
  87. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3.rb +1 -1
  88. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3_api.so +0 -0
  89. data/shoes/ruby/gems/1.9.1/specifications/hpricot-0.8.1.gemspec +32 -32
  90. data/shoes/ruby/gems/1.9.1/specifications/json-shoes-1.1.3.gemspec +34 -34
  91. data/shoes/ruby/gems/1.9.1/specifications/sqlite3-ruby-1.2.5-x86-mswin32.gemspec +46 -46
  92. data/shoes/ruby/lib/ftsearch/analysis/analyzer.rb +16 -16
  93. data/shoes/ruby/lib/ftsearch/analysis/simple_identifier_analyzer.rb +23 -23
  94. data/shoes/ruby/lib/ftsearch/analysis/whitespace_analyzer.rb +22 -22
  95. data/shoes/ruby/lib/ftsearch/document_map_reader.rb +106 -106
  96. data/shoes/ruby/lib/ftsearch/document_map_writer.rb +46 -46
  97. data/shoes/ruby/lib/ftsearch/field_infos.rb +46 -46
  98. data/shoes/ruby/lib/ftsearch/fragment_writer.rb +114 -114
  99. data/shoes/ruby/lib/ftsearch/fulltext_reader.rb +52 -52
  100. data/shoes/ruby/lib/ftsearch/fulltext_writer.rb +75 -75
  101. data/shoes/ruby/lib/ftsearch/suffix_array_reader.rb +275 -275
  102. data/shoes/ruby/lib/ftsearch/suffix_array_writer.rb +99 -99
  103. data/shoes/ruby/lib/ftsearch/util.rb +21 -21
  104. data/shoes/ruby/lib/i386-mingw32/bigdecimal.so +0 -0
  105. data/shoes/ruby/lib/i386-mingw32/binject.so +0 -0
  106. data/shoes/ruby/lib/i386-mingw32/bloops.so +0 -0
  107. data/shoes/ruby/lib/i386-mingw32/continuation.so +0 -0
  108. data/shoes/ruby/lib/i386-mingw32/coverage.so +0 -0
  109. data/shoes/ruby/lib/i386-mingw32/curses.so +0 -0
  110. data/shoes/ruby/lib/i386-mingw32/digest/bubblebabble.so +0 -0
  111. data/shoes/ruby/lib/i386-mingw32/digest/md5.so +0 -0
  112. data/shoes/ruby/lib/i386-mingw32/digest/rmd160.so +0 -0
  113. data/shoes/ruby/lib/i386-mingw32/digest/sha1.so +0 -0
  114. data/shoes/ruby/lib/i386-mingw32/digest/sha2.so +0 -0
  115. data/shoes/ruby/lib/i386-mingw32/digest.so +0 -0
  116. data/shoes/ruby/lib/i386-mingw32/dl.so +0 -0
  117. data/shoes/ruby/lib/i386-mingw32/enc/big5.so +0 -0
  118. data/shoes/ruby/lib/i386-mingw32/enc/cp949.so +0 -0
  119. data/shoes/ruby/lib/i386-mingw32/enc/emacs_mule.so +0 -0
  120. data/shoes/ruby/lib/i386-mingw32/enc/encdb.so +0 -0
  121. data/shoes/ruby/lib/i386-mingw32/enc/euc_jp.so +0 -0
  122. data/shoes/ruby/lib/i386-mingw32/enc/euc_kr.so +0 -0
  123. data/shoes/ruby/lib/i386-mingw32/enc/euc_tw.so +0 -0
  124. data/shoes/ruby/lib/i386-mingw32/enc/gb18030.so +0 -0
  125. data/shoes/ruby/lib/i386-mingw32/enc/gb2312.so +0 -0
  126. data/shoes/ruby/lib/i386-mingw32/enc/gbk.so +0 -0
  127. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_1.so +0 -0
  128. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_10.so +0 -0
  129. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_11.so +0 -0
  130. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_13.so +0 -0
  131. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_14.so +0 -0
  132. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_15.so +0 -0
  133. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_16.so +0 -0
  134. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_2.so +0 -0
  135. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_3.so +0 -0
  136. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_4.so +0 -0
  137. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_5.so +0 -0
  138. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_6.so +0 -0
  139. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_7.so +0 -0
  140. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_8.so +0 -0
  141. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_9.so +0 -0
  142. data/shoes/ruby/lib/i386-mingw32/enc/koi8_r.so +0 -0
  143. data/shoes/ruby/lib/i386-mingw32/enc/koi8_u.so +0 -0
  144. data/shoes/ruby/lib/i386-mingw32/enc/shift_jis.so +0 -0
  145. data/shoes/ruby/lib/i386-mingw32/enc/trans/big5.so +0 -0
  146. data/shoes/ruby/lib/i386-mingw32/enc/trans/chinese.so +0 -0
  147. data/shoes/ruby/lib/i386-mingw32/enc/trans/escape.so +0 -0
  148. data/shoes/ruby/lib/i386-mingw32/enc/trans/gb18030.so +0 -0
  149. data/shoes/ruby/lib/i386-mingw32/enc/trans/gbk.so +0 -0
  150. data/shoes/ruby/lib/i386-mingw32/enc/trans/iso2022.so +0 -0
  151. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese.so +0 -0
  152. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese_euc.so +0 -0
  153. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese_sjis.so +0 -0
  154. data/shoes/ruby/lib/i386-mingw32/enc/trans/korean.so +0 -0
  155. data/shoes/ruby/lib/i386-mingw32/enc/trans/single_byte.so +0 -0
  156. data/shoes/ruby/lib/i386-mingw32/enc/trans/transdb.so +0 -0
  157. data/shoes/ruby/lib/i386-mingw32/enc/trans/utf_16_32.so +0 -0
  158. data/shoes/ruby/lib/i386-mingw32/enc/utf_16be.so +0 -0
  159. data/shoes/ruby/lib/i386-mingw32/enc/utf_16le.so +0 -0
  160. data/shoes/ruby/lib/i386-mingw32/enc/utf_32be.so +0 -0
  161. data/shoes/ruby/lib/i386-mingw32/enc/utf_32le.so +0 -0
  162. data/shoes/ruby/lib/i386-mingw32/enc/windows_1251.so +0 -0
  163. data/shoes/ruby/lib/i386-mingw32/etc.so +0 -0
  164. data/shoes/ruby/lib/i386-mingw32/fcntl.so +0 -0
  165. data/shoes/ruby/lib/i386-mingw32/fiber.so +0 -0
  166. data/shoes/ruby/lib/i386-mingw32/ftsearchrt.so +0 -0
  167. data/shoes/ruby/lib/i386-mingw32/gdbm.so +0 -0
  168. data/shoes/ruby/lib/i386-mingw32/iconv.so +0 -0
  169. data/shoes/ruby/lib/i386-mingw32/io/wait.so +0 -0
  170. data/shoes/ruby/lib/i386-mingw32/json/ext/generator.so +0 -0
  171. data/shoes/ruby/lib/i386-mingw32/json/ext/parser.so +0 -0
  172. data/shoes/ruby/lib/i386-mingw32/mathn/complex.so +0 -0
  173. data/shoes/ruby/lib/i386-mingw32/mathn/rational.so +0 -0
  174. data/shoes/ruby/lib/i386-mingw32/nkf.so +0 -0
  175. data/shoes/ruby/lib/i386-mingw32/openssl.so +0 -0
  176. data/shoes/ruby/lib/i386-mingw32/racc/cparse.so +0 -0
  177. data/shoes/ruby/lib/i386-mingw32/rbconfig.rb +2 -2
  178. data/shoes/ruby/lib/i386-mingw32/readline.so +0 -0
  179. data/shoes/ruby/lib/i386-mingw32/ripper.so +0 -0
  180. data/shoes/ruby/lib/i386-mingw32/sdbm.so +0 -0
  181. data/shoes/ruby/lib/i386-mingw32/socket.so +0 -0
  182. data/shoes/ruby/lib/i386-mingw32/stringio.so +0 -0
  183. data/shoes/ruby/lib/i386-mingw32/strscan.so +0 -0
  184. data/shoes/ruby/lib/i386-mingw32/syck.so +0 -0
  185. data/shoes/ruby/lib/i386-mingw32/win32ole.so +0 -0
  186. data/shoes/ruby/lib/i386-mingw32/zlib.so +0 -0
  187. data/shoes/ruby/lib/rbconfig/datadir.rb +24 -24
  188. data/shoes/ruby/lib/rubygems/builder.rb +88 -88
  189. data/shoes/ruby/lib/rubygems/command.rb +406 -406
  190. data/shoes/ruby/lib/rubygems/command_manager.rb +146 -146
  191. data/shoes/ruby/lib/rubygems/commands/build_command.rb +53 -53
  192. data/shoes/ruby/lib/rubygems/commands/cert_command.rb +86 -86
  193. data/shoes/ruby/lib/rubygems/commands/check_command.rb +75 -75
  194. data/shoes/ruby/lib/rubygems/commands/cleanup_command.rb +91 -91
  195. data/shoes/ruby/lib/rubygems/commands/contents_command.rb +74 -74
  196. data/shoes/ruby/lib/rubygems/commands/dependency_command.rb +188 -188
  197. data/shoes/ruby/lib/rubygems/commands/environment_command.rb +128 -128
  198. data/shoes/ruby/lib/rubygems/commands/fetch_command.rb +62 -62
  199. data/shoes/ruby/lib/rubygems/commands/generate_index_command.rb +57 -57
  200. data/shoes/ruby/lib/rubygems/commands/help_command.rb +172 -172
  201. data/shoes/ruby/lib/rubygems/commands/install_command.rb +148 -148
  202. data/shoes/ruby/lib/rubygems/commands/list_command.rb +35 -35
  203. data/shoes/ruby/lib/rubygems/commands/lock_command.rb +110 -110
  204. data/shoes/ruby/lib/rubygems/commands/mirror_command.rb +111 -111
  205. data/shoes/ruby/lib/rubygems/commands/outdated_command.rb +33 -33
  206. data/shoes/ruby/lib/rubygems/commands/pristine_command.rb +93 -93
  207. data/shoes/ruby/lib/rubygems/commands/query_command.rb +233 -233
  208. data/shoes/ruby/lib/rubygems/commands/rdoc_command.rb +82 -82
  209. data/shoes/ruby/lib/rubygems/commands/search_command.rb +37 -37
  210. data/shoes/ruby/lib/rubygems/commands/server_command.rb +48 -48
  211. data/shoes/ruby/lib/rubygems/commands/sources_command.rb +152 -152
  212. data/shoes/ruby/lib/rubygems/commands/specification_command.rb +77 -77
  213. data/shoes/ruby/lib/rubygems/commands/stale_command.rb +27 -27
  214. data/shoes/ruby/lib/rubygems/commands/uninstall_command.rb +73 -73
  215. data/shoes/ruby/lib/rubygems/commands/unpack_command.rb +95 -95
  216. data/shoes/ruby/lib/rubygems/commands/update_command.rb +181 -181
  217. data/shoes/ruby/lib/rubygems/commands/which_command.rb +87 -87
  218. data/shoes/ruby/lib/rubygems/config_file.rb +266 -266
  219. data/shoes/ruby/lib/rubygems/custom_require.rb +46 -46
  220. data/shoes/ruby/lib/rubygems/defaults.rb +89 -89
  221. data/shoes/ruby/lib/rubygems/dependency.rb +119 -119
  222. data/shoes/ruby/lib/rubygems/dependency_installer.rb +258 -258
  223. data/shoes/ruby/lib/rubygems/dependency_list.rb +165 -165
  224. data/shoes/ruby/lib/rubygems/digest/digest_adapter.rb +39 -39
  225. data/shoes/ruby/lib/rubygems/digest/md5.rb +23 -23
  226. data/shoes/ruby/lib/rubygems/digest/sha1.rb +16 -16
  227. data/shoes/ruby/lib/rubygems/digest/sha2.rb +17 -17
  228. data/shoes/ruby/lib/rubygems/doc_manager.rb +214 -214
  229. data/shoes/ruby/lib/rubygems/exceptions.rb +84 -84
  230. data/shoes/ruby/lib/rubygems/ext/builder.rb +56 -56
  231. data/shoes/ruby/lib/rubygems/ext/configure_builder.rb +24 -24
  232. data/shoes/ruby/lib/rubygems/ext/ext_conf_builder.rb +23 -23
  233. data/shoes/ruby/lib/rubygems/ext/rake_builder.rb +27 -27
  234. data/shoes/ruby/lib/rubygems/ext.rb +18 -18
  235. data/shoes/ruby/lib/rubygems/format.rb +87 -87
  236. data/shoes/ruby/lib/rubygems/gem_openssl.rb +83 -83
  237. data/shoes/ruby/lib/rubygems/gem_path_searcher.rb +100 -100
  238. data/shoes/ruby/lib/rubygems/gem_runner.rb +58 -58
  239. data/shoes/ruby/lib/rubygems/indexer.rb +370 -370
  240. data/shoes/ruby/lib/rubygems/install_update_options.rb +113 -113
  241. data/shoes/ruby/lib/rubygems/installer.rb +578 -578
  242. data/shoes/ruby/lib/rubygems/local_remote_options.rb +134 -134
  243. data/shoes/ruby/lib/rubygems/old_format.rb +148 -148
  244. data/shoes/ruby/lib/rubygems/package/f_sync_dir.rb +24 -24
  245. data/shoes/ruby/lib/rubygems/package/tar_header.rb +245 -245
  246. data/shoes/ruby/lib/rubygems/package/tar_input.rb +219 -219
  247. data/shoes/ruby/lib/rubygems/package/tar_output.rb +143 -143
  248. data/shoes/ruby/lib/rubygems/package/tar_reader/entry.rb +99 -99
  249. data/shoes/ruby/lib/rubygems/package/tar_reader.rb +86 -86
  250. data/shoes/ruby/lib/rubygems/package/tar_writer.rb +180 -180
  251. data/shoes/ruby/lib/rubygems/package.rb +95 -95
  252. data/shoes/ruby/lib/rubygems/platform.rb +178 -178
  253. data/shoes/ruby/lib/rubygems/remote_fetcher.rb +344 -344
  254. data/shoes/ruby/lib/rubygems/require_paths_builder.rb +14 -14
  255. data/shoes/ruby/lib/rubygems/requirement.rb +163 -163
  256. data/shoes/ruby/lib/rubygems/rubygems_version.rb +6 -6
  257. data/shoes/ruby/lib/rubygems/security.rb +786 -786
  258. data/shoes/ruby/lib/rubygems/server.rb +629 -629
  259. data/shoes/ruby/lib/rubygems/source_index.rb +559 -559
  260. data/shoes/ruby/lib/rubygems/source_info_cache.rb +393 -393
  261. data/shoes/ruby/lib/rubygems/source_info_cache_entry.rb +56 -56
  262. data/shoes/ruby/lib/rubygems/spec_fetcher.rb +249 -249
  263. data/shoes/ruby/lib/rubygems/specification.rb +1262 -1262
  264. data/shoes/ruby/lib/rubygems/test_utilities.rb +131 -131
  265. data/shoes/ruby/lib/rubygems/timer.rb +25 -25
  266. data/shoes/ruby/lib/rubygems/uninstaller.rb +242 -242
  267. data/shoes/ruby/lib/rubygems/user_interaction.rb +360 -360
  268. data/shoes/ruby/lib/rubygems/validator.rb +208 -208
  269. data/shoes/ruby/lib/rubygems/version.rb +167 -167
  270. data/shoes/ruby/lib/rubygems/version_option.rb +48 -48
  271. data/shoes/ruby/lib/rubygems.rb +888 -888
  272. data/shoes/ruby/lib/ubygems.rb +10 -10
  273. data/shoes/samples/class-book.rb +43 -43
  274. data/shoes/samples/class-book.yaml +387 -387
  275. data/shoes/samples/expert-definr.rb +23 -23
  276. data/shoes/samples/expert-funnies.rb +51 -51
  277. data/shoes/samples/expert-irb.rb +112 -112
  278. data/shoes/samples/expert-minesweeper.rb +267 -267
  279. data/shoes/samples/expert-othello.rb +319 -319
  280. data/shoes/samples/expert-pong.rb +62 -62
  281. data/shoes/samples/expert-tankspank.rb +385 -385
  282. data/shoes/samples/good-arc.rb +37 -37
  283. data/shoes/samples/good-clock.rb +51 -51
  284. data/shoes/samples/good-follow.rb +26 -26
  285. data/shoes/samples/good-reminder.rb +174 -174
  286. data/shoes/samples/good-vjot.rb +56 -56
  287. data/shoes/samples/simple-accordion.rb +75 -75
  288. data/shoes/samples/simple-anim-shapes.rb +17 -17
  289. data/shoes/samples/simple-anim-text.rb +13 -13
  290. data/shoes/samples/simple-arc.rb +23 -23
  291. data/shoes/samples/simple-bounce.rb +24 -24
  292. data/shoes/samples/simple-calc.rb +70 -70
  293. data/shoes/samples/simple-control-sizes.rb +24 -24
  294. data/shoes/samples/simple-curve.rb +26 -26
  295. data/shoes/samples/simple-dialogs.rb +29 -29
  296. data/shoes/samples/simple-downloader.rb +27 -27
  297. data/shoes/samples/simple-draw.rb +13 -13
  298. data/shoes/samples/simple-editor.rb +28 -28
  299. data/shoes/samples/simple-form.rb +28 -28
  300. data/shoes/samples/simple-mask.rb +21 -21
  301. data/shoes/samples/simple-menu.rb +31 -31
  302. data/shoes/samples/simple-menu1.rb +35 -35
  303. data/shoes/samples/simple-rubygems.rb +29 -29
  304. data/shoes/samples/simple-slide.rb +45 -45
  305. data/shoes/samples/simple-sphere.rb +28 -28
  306. data/shoes/samples/simple-timer.rb +13 -13
  307. data/shoes/samples/simple-video.rb +13 -13
  308. data/shoes/shoes.exe +0 -0
  309. data/shoes/sqlite3.dll +0 -0
  310. data/shoes/static/code_highlighter.js +188 -188
  311. data/shoes/static/code_highlighter_ruby.js +26 -26
  312. data/shoes/static/manual-en.txt +2783 -2783
  313. data/shoes/static/manual-ja.txt +2780 -2780
  314. data/shoes/static/manual.css +167 -167
  315. data/shoes/static/stubs/blank.run +375 -375
  316. data/shoes/static/stubs/sh-install +48 -48
  317. data/shoes/zlib.dll +0 -0
  318. data/shoes/zlib1.dll +0 -0
  319. metadata +15 -5
  320. data/shoes/static/Thumbs.db +0 -0
@@ -1,629 +1,629 @@
1
- require 'webrick'
2
- require 'yaml'
3
- require 'zlib'
4
- require 'erb'
5
-
6
- require 'rubygems'
7
- require 'rubygems/doc_manager'
8
-
9
- ##
10
- # Gem::Server and allows users to serve gems for consumption by
11
- # `gem --remote-install`.
12
- #
13
- # gem_server starts an HTTP server on the given port and serves the following:
14
- # * "/" - Browsing of gem spec files for installed gems
15
- # * "/specs.#{Gem.marshal_version}.gz" - specs name/version/platform index
16
- # * "/latest_specs.#{Gem.marshal_version}.gz" - latest specs
17
- # name/version/platform index
18
- # * "/quick/" - Individual gemspecs
19
- # * "/gems" - Direct access to download the installable gems
20
- # * legacy indexes:
21
- # * "/Marshal.#{Gem.marshal_version}" - Full SourceIndex dump of metadata
22
- # for installed gems
23
- # * "/yaml" - YAML dump of metadata for installed gems - deprecated
24
- #
25
- # == Usage
26
- #
27
- # gem_server = Gem::Server.new Gem.dir, 8089, false
28
- # gem_server.run
29
- #
30
- #--
31
- # TODO Refactor into a real WEBrick servlet to remove code duplication.
32
-
33
- class Gem::Server
34
-
35
- include Gem::UserInteraction
36
-
37
- DOC_TEMPLATE = <<-'WEBPAGE'
38
- <?xml version="1.0" encoding="iso-8859-1"?>
39
- <!DOCTYPE html
40
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
41
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
-
43
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
44
- <head>
45
- <title>RubyGems Documentation Index</title>
46
- <link rel="stylesheet" href="gem-server-rdoc-style.css" type="text/css" media="screen" />
47
- </head>
48
- <body>
49
- <div id="fileHeader">
50
- <h1>RubyGems Documentation Index</h1>
51
- </div>
52
- <!-- banner header -->
53
-
54
- <div id="bodyContent">
55
- <div id="contextContent">
56
- <div id="description">
57
- <h1>Summary</h1>
58
- <p>There are <%=values["gem_count"]%> gems installed:</p>
59
- <p>
60
- <%= values["specs"].map { |v| "<a href=\"##{v["name"]}\">#{v["name"]}</a>" }.join ', ' %>.
61
- <h1>Gems</h1>
62
-
63
- <dl>
64
- <% values["specs"].each do |spec| %>
65
- <dt>
66
- <% if spec["first_name_entry"] then %>
67
- <a name="<%=spec["name"]%>"></a>
68
- <% end %>
69
-
70
- <b><%=spec["name"]%> <%=spec["version"]%></b>
71
-
72
- <% if spec["rdoc_installed"] then %>
73
- <a href="<%=spec["doc_path"]%>">[rdoc]</a>
74
- <% else %>
75
- <span title="rdoc not installed">[rdoc]</span>
76
- <% end %>
77
-
78
- <% if spec["homepage"] then %>
79
- <a href="<%=spec["homepage"]%>" title="<%=spec["homepage"]%>">[www]</a>
80
- <% else %>
81
- <span title="no homepage available">[www]</span>
82
- <% end %>
83
-
84
- <% if spec["has_deps"] then %>
85
- - depends on
86
- <%= spec["dependencies"].map { |v| "<a href=\"##{v["name"]}\">#{v["name"]}</a>" }.join ', ' %>.
87
- <% end %>
88
- </dt>
89
- <dd>
90
- <%=spec["summary"]%>
91
- <% if spec["executables"] then %>
92
- <br/>
93
-
94
- <% if spec["only_one_executable"] then %>
95
- Executable is
96
- <% else %>
97
- Executables are
98
- <%end%>
99
-
100
- <%= spec["executables"].map { |v| "<span class=\"context-item-name\">#{v["executable"]}</span>"}.join ', ' %>.
101
-
102
- <%end%>
103
- <br/>
104
- <br/>
105
- </dd>
106
- <% end %>
107
- </dl>
108
-
109
- </div>
110
- </div>
111
- </div>
112
- <div id="validator-badges">
113
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
114
- </div>
115
- </body>
116
- </html>
117
- WEBPAGE
118
-
119
- # CSS is copy & paste from rdoc-style.css, RDoc V1.0.1 - 20041108
120
- RDOC_CSS = <<-RDOCCSS
121
- body {
122
- font-family: Verdana,Arial,Helvetica,sans-serif;
123
- font-size: 90%;
124
- margin: 0;
125
- margin-left: 40px;
126
- padding: 0;
127
- background: white;
128
- }
129
-
130
- h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
131
- h1 { font-size: 150%; }
132
- h2,h3,h4 { margin-top: 1em; }
133
-
134
- a { background: #eef; color: #039; text-decoration: none; }
135
- a:hover { background: #039; color: #eef; }
136
-
137
- /* Override the base stylesheets Anchor inside a table cell */
138
- td > a {
139
- background: transparent;
140
- color: #039;
141
- text-decoration: none;
142
- }
143
-
144
- /* and inside a section title */
145
- .section-title > a {
146
- background: transparent;
147
- color: #eee;
148
- text-decoration: none;
149
- }
150
-
151
- /* === Structural elements =================================== */
152
-
153
- div#index {
154
- margin: 0;
155
- margin-left: -40px;
156
- padding: 0;
157
- font-size: 90%;
158
- }
159
-
160
-
161
- div#index a {
162
- margin-left: 0.7em;
163
- }
164
-
165
- div#index .section-bar {
166
- margin-left: 0px;
167
- padding-left: 0.7em;
168
- background: #ccc;
169
- font-size: small;
170
- }
171
-
172
-
173
- div#classHeader, div#fileHeader {
174
- width: auto;
175
- color: white;
176
- padding: 0.5em 1.5em 0.5em 1.5em;
177
- margin: 0;
178
- margin-left: -40px;
179
- border-bottom: 3px solid #006;
180
- }
181
-
182
- div#classHeader a, div#fileHeader a {
183
- background: inherit;
184
- color: white;
185
- }
186
-
187
- div#classHeader td, div#fileHeader td {
188
- background: inherit;
189
- color: white;
190
- }
191
-
192
-
193
- div#fileHeader {
194
- background: #057;
195
- }
196
-
197
- div#classHeader {
198
- background: #048;
199
- }
200
-
201
-
202
- .class-name-in-header {
203
- font-size: 180%;
204
- font-weight: bold;
205
- }
206
-
207
-
208
- div#bodyContent {
209
- padding: 0 1.5em 0 1.5em;
210
- }
211
-
212
- div#description {
213
- padding: 0.5em 1.5em;
214
- background: #efefef;
215
- border: 1px dotted #999;
216
- }
217
-
218
- div#description h1,h2,h3,h4,h5,h6 {
219
- color: #125;;
220
- background: transparent;
221
- }
222
-
223
- div#validator-badges {
224
- text-align: center;
225
- }
226
- div#validator-badges img { border: 0; }
227
-
228
- div#copyright {
229
- color: #333;
230
- background: #efefef;
231
- font: 0.75em sans-serif;
232
- margin-top: 5em;
233
- margin-bottom: 0;
234
- padding: 0.5em 2em;
235
- }
236
-
237
-
238
- /* === Classes =================================== */
239
-
240
- table.header-table {
241
- color: white;
242
- font-size: small;
243
- }
244
-
245
- .type-note {
246
- font-size: small;
247
- color: #DEDEDE;
248
- }
249
-
250
- .xxsection-bar {
251
- background: #eee;
252
- color: #333;
253
- padding: 3px;
254
- }
255
-
256
- .section-bar {
257
- color: #333;
258
- border-bottom: 1px solid #999;
259
- margin-left: -20px;
260
- }
261
-
262
-
263
- .section-title {
264
- background: #79a;
265
- color: #eee;
266
- padding: 3px;
267
- margin-top: 2em;
268
- margin-left: -30px;
269
- border: 1px solid #999;
270
- }
271
-
272
- .top-aligned-row { vertical-align: top }
273
- .bottom-aligned-row { vertical-align: bottom }
274
-
275
- /* --- Context section classes ----------------------- */
276
-
277
- .context-row { }
278
- .context-item-name { font-family: monospace; font-weight: bold; color: black; }
279
- .context-item-value { font-size: small; color: #448; }
280
- .context-item-desc { color: #333; padding-left: 2em; }
281
-
282
- /* --- Method classes -------------------------- */
283
- .method-detail {
284
- background: #efefef;
285
- padding: 0;
286
- margin-top: 0.5em;
287
- margin-bottom: 1em;
288
- border: 1px dotted #ccc;
289
- }
290
- .method-heading {
291
- color: black;
292
- background: #ccc;
293
- border-bottom: 1px solid #666;
294
- padding: 0.2em 0.5em 0 0.5em;
295
- }
296
- .method-signature { color: black; background: inherit; }
297
- .method-name { font-weight: bold; }
298
- .method-args { font-style: italic; }
299
- .method-description { padding: 0 0.5em 0 0.5em; }
300
-
301
- /* --- Source code sections -------------------- */
302
-
303
- a.source-toggle { font-size: 90%; }
304
- div.method-source-code {
305
- background: #262626;
306
- color: #ffdead;
307
- margin: 1em;
308
- padding: 0.5em;
309
- border: 1px dashed #999;
310
- overflow: hidden;
311
- }
312
-
313
- div.method-source-code pre { color: #ffdead; overflow: hidden; }
314
-
315
- /* --- Ruby keyword styles --------------------- */
316
-
317
- .standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
318
-
319
- .ruby-constant { color: #7fffd4; background: transparent; }
320
- .ruby-keyword { color: #00ffff; background: transparent; }
321
- .ruby-ivar { color: #eedd82; background: transparent; }
322
- .ruby-operator { color: #00ffee; background: transparent; }
323
- .ruby-identifier { color: #ffdead; background: transparent; }
324
- .ruby-node { color: #ffa07a; background: transparent; }
325
- .ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
326
- .ruby-regexp { color: #ffa07a; background: transparent; }
327
- .ruby-value { color: #7fffd4; background: transparent; }
328
- RDOCCSS
329
-
330
- def self.run(options)
331
- new(options[:gemdir], options[:port], options[:daemon]).run
332
- end
333
-
334
- def initialize(gem_dir, port, daemon)
335
- Socket.do_not_reverse_lookup = true
336
-
337
- @gem_dir = gem_dir
338
- @port = port
339
- @daemon = daemon
340
- logger = WEBrick::Log.new nil, WEBrick::BasicLog::FATAL
341
- @server = WEBrick::HTTPServer.new :DoNotListen => true, :Logger => logger
342
-
343
- @spec_dir = File.join @gem_dir, 'specifications'
344
-
345
- unless File.directory? @spec_dir then
346
- raise ArgumentError, "#{@gem_dir} does not appear to be a gem repository"
347
- end
348
-
349
- @source_index = Gem::SourceIndex.from_gems_in @spec_dir
350
- end
351
-
352
- def Marshal(req, res)
353
- @source_index.refresh!
354
-
355
- res['date'] = File.stat(@spec_dir).mtime
356
-
357
- index = Marshal.dump @source_index
358
-
359
- if req.request_method == 'HEAD' then
360
- res['content-length'] = index.length
361
- return
362
- end
363
-
364
- if req.path =~ /Z$/ then
365
- res['content-type'] = 'application/x-deflate'
366
- index = Gem.deflate index
367
- else
368
- res['content-type'] = 'application/octet-stream'
369
- end
370
-
371
- res.body << index
372
- end
373
-
374
- def latest_specs(req, res)
375
- @source_index.refresh!
376
-
377
- res['content-type'] = 'application/x-gzip'
378
-
379
- res['date'] = File.stat(@spec_dir).mtime
380
-
381
- specs = @source_index.latest_specs.sort.map do |spec|
382
- platform = spec.original_platform
383
- platform = Gem::Platform::RUBY if platform.nil?
384
- [spec.name, spec.version, platform]
385
- end
386
-
387
- specs = Marshal.dump specs
388
-
389
- if req.path =~ /\.gz$/ then
390
- specs = Gem.gzip specs
391
- res['content-type'] = 'application/x-gzip'
392
- else
393
- res['content-type'] = 'application/octet-stream'
394
- end
395
-
396
- if req.request_method == 'HEAD' then
397
- res['content-length'] = specs.length
398
- else
399
- res.body << specs
400
- end
401
- end
402
-
403
- def quick(req, res)
404
- @source_index.refresh!
405
-
406
- res['content-type'] = 'text/plain'
407
- res['date'] = File.stat(@spec_dir).mtime
408
-
409
- case req.request_uri.path
410
- when '/quick/index' then
411
- res.body << @source_index.map { |name,| name }.sort.join("\n")
412
- when '/quick/index.rz' then
413
- index = @source_index.map { |name,| name }.sort.join("\n")
414
- res['content-type'] = 'application/x-deflate'
415
- res.body << Gem.deflate(index)
416
- when '/quick/latest_index' then
417
- index = @source_index.latest_specs.map { |spec| spec.full_name }
418
- res.body << index.sort.join("\n")
419
- when '/quick/latest_index.rz' then
420
- index = @source_index.latest_specs.map { |spec| spec.full_name }
421
- res['content-type'] = 'application/x-deflate'
422
- res.body << Gem.deflate(index.sort.join("\n"))
423
- when %r|^/quick/(Marshal.#{Regexp.escape Gem.marshal_version}/)?(.*?)-([0-9.]+)(-.*?)?\.gemspec\.rz$| then
424
- dep = Gem::Dependency.new $2, $3
425
- specs = @source_index.search dep
426
- marshal_format = $1
427
-
428
- selector = [$2, $3, $4].map { |s| s.inspect }.join ' '
429
-
430
- platform = if $4 then
431
- Gem::Platform.new $4.sub(/^-/, '')
432
- else
433
- Gem::Platform::RUBY
434
- end
435
-
436
- specs = specs.select { |s| s.platform == platform }
437
-
438
- if specs.empty? then
439
- res.status = 404
440
- res.body = "No gems found matching #{selector}"
441
- elsif specs.length > 1 then
442
- res.status = 500
443
- res.body = "Multiple gems found matching #{selector}"
444
- elsif marshal_format then
445
- res['content-type'] = 'application/x-deflate'
446
- res.body << Gem.deflate(Marshal.dump(specs.first))
447
- else # deprecated YAML format
448
- res['content-type'] = 'application/x-deflate'
449
- res.body << Gem.deflate(specs.first.to_yaml)
450
- end
451
- else
452
- raise WEBrick::HTTPStatus::NotFound, "`#{req.path}' not found."
453
- end
454
- end
455
-
456
- def root(req, res)
457
- @source_index.refresh!
458
- res['date'] = File.stat(@spec_dir).mtime
459
-
460
- raise WEBrick::HTTPStatus::NotFound, "`#{req.path}' not found." unless
461
- req.path == '/'
462
-
463
- specs = []
464
- total_file_count = 0
465
-
466
- @source_index.each do |path, spec|
467
- total_file_count += spec.files.size
468
- deps = spec.dependencies.map do |dep|
469
- { "name" => dep.name,
470
- "type" => dep.type,
471
- "version" => dep.version_requirements.to_s, }
472
- end
473
-
474
- deps = deps.sort_by { |dep| [dep["name"].downcase, dep["version"]] }
475
- deps.last["is_last"] = true unless deps.empty?
476
-
477
- # executables
478
- executables = spec.executables.sort.collect { |exec| {"executable" => exec} }
479
- executables = nil if executables.empty?
480
- executables.last["is_last"] = true if executables
481
-
482
- specs << {
483
- "authors" => spec.authors.sort.join(", "),
484
- "date" => spec.date.to_s,
485
- "dependencies" => deps,
486
- "doc_path" => "/doc_root/#{spec.full_name}/rdoc/index.html",
487
- "executables" => executables,
488
- "only_one_executable" => (executables && executables.size == 1),
489
- "full_name" => spec.full_name,
490
- "has_deps" => !deps.empty?,
491
- "homepage" => spec.homepage,
492
- "name" => spec.name,
493
- "rdoc_installed" => Gem::DocManager.new(spec).rdoc_installed?,
494
- "summary" => spec.summary,
495
- "version" => spec.version.to_s,
496
- }
497
- end
498
-
499
- specs << {
500
- "authors" => "Chad Fowler, Rich Kilmer, Jim Weirich, Eric Hodel and others",
501
- "dependencies" => [],
502
- "doc_path" => "/doc_root/rubygems-#{Gem::RubyGemsVersion}/rdoc/index.html",
503
- "executables" => [{"executable" => 'gem', "is_last" => true}],
504
- "only_one_executable" => true,
505
- "full_name" => "rubygems-#{Gem::RubyGemsVersion}",
506
- "has_deps" => false,
507
- "homepage" => "http://rubygems.org/",
508
- "name" => 'rubygems',
509
- "rdoc_installed" => true,
510
- "summary" => "RubyGems itself",
511
- "version" => Gem::RubyGemsVersion,
512
- }
513
-
514
- specs = specs.sort_by { |spec| [spec["name"].downcase, spec["version"]] }
515
- specs.last["is_last"] = true
516
-
517
- # tag all specs with first_name_entry
518
- last_spec = nil
519
- specs.each do |spec|
520
- is_first = last_spec.nil? || (last_spec["name"].downcase != spec["name"].downcase)
521
- spec["first_name_entry"] = is_first
522
- last_spec = spec
523
- end
524
-
525
- # create page from template
526
- template = ERB.new(DOC_TEMPLATE)
527
- res['content-type'] = 'text/html'
528
-
529
- values = { "gem_count" => specs.size.to_s, "specs" => specs,
530
- "total_file_count" => total_file_count.to_s }
531
-
532
- result = template.result binding
533
- res.body = result
534
- end
535
-
536
- def run
537
- @server.listen nil, @port
538
-
539
- say "Starting gem server on http://localhost:#{@port}/"
540
-
541
- WEBrick::Daemon.start if @daemon
542
-
543
- @server.mount_proc "/yaml", method(:yaml)
544
- @server.mount_proc "/yaml.Z", method(:yaml)
545
-
546
- @server.mount_proc "/Marshal.#{Gem.marshal_version}", method(:Marshal)
547
- @server.mount_proc "/Marshal.#{Gem.marshal_version}.Z", method(:Marshal)
548
-
549
- @server.mount_proc "/specs.#{Gem.marshal_version}", method(:specs)
550
- @server.mount_proc "/specs.#{Gem.marshal_version}.gz", method(:specs)
551
-
552
- @server.mount_proc "/latest_specs.#{Gem.marshal_version}",
553
- method(:latest_specs)
554
- @server.mount_proc "/latest_specs.#{Gem.marshal_version}.gz",
555
- method(:latest_specs)
556
-
557
- @server.mount_proc "/quick/", method(:quick)
558
-
559
- @server.mount_proc("/gem-server-rdoc-style.css") do |req, res|
560
- res['content-type'] = 'text/css'
561
- res['date'] = File.stat(@spec_dir).mtime
562
- res.body << RDOC_CSS
563
- end
564
-
565
- @server.mount_proc "/", method(:root)
566
-
567
- paths = { "/gems" => "/cache/", "/doc_root" => "/doc/" }
568
- paths.each do |mount_point, mount_dir|
569
- @server.mount(mount_point, WEBrick::HTTPServlet::FileHandler,
570
- File.join(@gem_dir, mount_dir), true)
571
- end
572
-
573
- trap("INT") { @server.shutdown; exit! }
574
- trap("TERM") { @server.shutdown; exit! }
575
-
576
- @server.start
577
- end
578
-
579
- def specs(req, res)
580
- @source_index.refresh!
581
-
582
- res['date'] = File.stat(@spec_dir).mtime
583
-
584
- specs = @source_index.sort.map do |_, spec|
585
- platform = spec.original_platform
586
- platform = Gem::Platform::RUBY if platform.nil?
587
- [spec.name, spec.version, platform]
588
- end
589
-
590
- specs = Marshal.dump specs
591
-
592
- if req.path =~ /\.gz$/ then
593
- specs = Gem.gzip specs
594
- res['content-type'] = 'application/x-gzip'
595
- else
596
- res['content-type'] = 'application/octet-stream'
597
- end
598
-
599
- if req.request_method == 'HEAD' then
600
- res['content-length'] = specs.length
601
- else
602
- res.body << specs
603
- end
604
- end
605
-
606
- def yaml(req, res)
607
- @source_index.refresh!
608
-
609
- res['date'] = File.stat(@spec_dir).mtime
610
-
611
- index = @source_index.to_yaml
612
-
613
- if req.path =~ /Z$/ then
614
- res['content-type'] = 'application/x-deflate'
615
- index = Gem.deflate index
616
- else
617
- res['content-type'] = 'text/plain'
618
- end
619
-
620
- if req.request_method == 'HEAD' then
621
- res['content-length'] = index.length
622
- return
623
- end
624
-
625
- res.body << index
626
- end
627
-
628
- end
629
-
1
+ require 'webrick'
2
+ require 'yaml'
3
+ require 'zlib'
4
+ require 'erb'
5
+
6
+ require 'rubygems'
7
+ require 'rubygems/doc_manager'
8
+
9
+ ##
10
+ # Gem::Server and allows users to serve gems for consumption by
11
+ # `gem --remote-install`.
12
+ #
13
+ # gem_server starts an HTTP server on the given port and serves the following:
14
+ # * "/" - Browsing of gem spec files for installed gems
15
+ # * "/specs.#{Gem.marshal_version}.gz" - specs name/version/platform index
16
+ # * "/latest_specs.#{Gem.marshal_version}.gz" - latest specs
17
+ # name/version/platform index
18
+ # * "/quick/" - Individual gemspecs
19
+ # * "/gems" - Direct access to download the installable gems
20
+ # * legacy indexes:
21
+ # * "/Marshal.#{Gem.marshal_version}" - Full SourceIndex dump of metadata
22
+ # for installed gems
23
+ # * "/yaml" - YAML dump of metadata for installed gems - deprecated
24
+ #
25
+ # == Usage
26
+ #
27
+ # gem_server = Gem::Server.new Gem.dir, 8089, false
28
+ # gem_server.run
29
+ #
30
+ #--
31
+ # TODO Refactor into a real WEBrick servlet to remove code duplication.
32
+
33
+ class Gem::Server
34
+
35
+ include Gem::UserInteraction
36
+
37
+ DOC_TEMPLATE = <<-'WEBPAGE'
38
+ <?xml version="1.0" encoding="iso-8859-1"?>
39
+ <!DOCTYPE html
40
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
41
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42
+
43
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
44
+ <head>
45
+ <title>RubyGems Documentation Index</title>
46
+ <link rel="stylesheet" href="gem-server-rdoc-style.css" type="text/css" media="screen" />
47
+ </head>
48
+ <body>
49
+ <div id="fileHeader">
50
+ <h1>RubyGems Documentation Index</h1>
51
+ </div>
52
+ <!-- banner header -->
53
+
54
+ <div id="bodyContent">
55
+ <div id="contextContent">
56
+ <div id="description">
57
+ <h1>Summary</h1>
58
+ <p>There are <%=values["gem_count"]%> gems installed:</p>
59
+ <p>
60
+ <%= values["specs"].map { |v| "<a href=\"##{v["name"]}\">#{v["name"]}</a>" }.join ', ' %>.
61
+ <h1>Gems</h1>
62
+
63
+ <dl>
64
+ <% values["specs"].each do |spec| %>
65
+ <dt>
66
+ <% if spec["first_name_entry"] then %>
67
+ <a name="<%=spec["name"]%>"></a>
68
+ <% end %>
69
+
70
+ <b><%=spec["name"]%> <%=spec["version"]%></b>
71
+
72
+ <% if spec["rdoc_installed"] then %>
73
+ <a href="<%=spec["doc_path"]%>">[rdoc]</a>
74
+ <% else %>
75
+ <span title="rdoc not installed">[rdoc]</span>
76
+ <% end %>
77
+
78
+ <% if spec["homepage"] then %>
79
+ <a href="<%=spec["homepage"]%>" title="<%=spec["homepage"]%>">[www]</a>
80
+ <% else %>
81
+ <span title="no homepage available">[www]</span>
82
+ <% end %>
83
+
84
+ <% if spec["has_deps"] then %>
85
+ - depends on
86
+ <%= spec["dependencies"].map { |v| "<a href=\"##{v["name"]}\">#{v["name"]}</a>" }.join ', ' %>.
87
+ <% end %>
88
+ </dt>
89
+ <dd>
90
+ <%=spec["summary"]%>
91
+ <% if spec["executables"] then %>
92
+ <br/>
93
+
94
+ <% if spec["only_one_executable"] then %>
95
+ Executable is
96
+ <% else %>
97
+ Executables are
98
+ <%end%>
99
+
100
+ <%= spec["executables"].map { |v| "<span class=\"context-item-name\">#{v["executable"]}</span>"}.join ', ' %>.
101
+
102
+ <%end%>
103
+ <br/>
104
+ <br/>
105
+ </dd>
106
+ <% end %>
107
+ </dl>
108
+
109
+ </div>
110
+ </div>
111
+ </div>
112
+ <div id="validator-badges">
113
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
114
+ </div>
115
+ </body>
116
+ </html>
117
+ WEBPAGE
118
+
119
+ # CSS is copy & paste from rdoc-style.css, RDoc V1.0.1 - 20041108
120
+ RDOC_CSS = <<-RDOCCSS
121
+ body {
122
+ font-family: Verdana,Arial,Helvetica,sans-serif;
123
+ font-size: 90%;
124
+ margin: 0;
125
+ margin-left: 40px;
126
+ padding: 0;
127
+ background: white;
128
+ }
129
+
130
+ h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
131
+ h1 { font-size: 150%; }
132
+ h2,h3,h4 { margin-top: 1em; }
133
+
134
+ a { background: #eef; color: #039; text-decoration: none; }
135
+ a:hover { background: #039; color: #eef; }
136
+
137
+ /* Override the base stylesheets Anchor inside a table cell */
138
+ td > a {
139
+ background: transparent;
140
+ color: #039;
141
+ text-decoration: none;
142
+ }
143
+
144
+ /* and inside a section title */
145
+ .section-title > a {
146
+ background: transparent;
147
+ color: #eee;
148
+ text-decoration: none;
149
+ }
150
+
151
+ /* === Structural elements =================================== */
152
+
153
+ div#index {
154
+ margin: 0;
155
+ margin-left: -40px;
156
+ padding: 0;
157
+ font-size: 90%;
158
+ }
159
+
160
+
161
+ div#index a {
162
+ margin-left: 0.7em;
163
+ }
164
+
165
+ div#index .section-bar {
166
+ margin-left: 0px;
167
+ padding-left: 0.7em;
168
+ background: #ccc;
169
+ font-size: small;
170
+ }
171
+
172
+
173
+ div#classHeader, div#fileHeader {
174
+ width: auto;
175
+ color: white;
176
+ padding: 0.5em 1.5em 0.5em 1.5em;
177
+ margin: 0;
178
+ margin-left: -40px;
179
+ border-bottom: 3px solid #006;
180
+ }
181
+
182
+ div#classHeader a, div#fileHeader a {
183
+ background: inherit;
184
+ color: white;
185
+ }
186
+
187
+ div#classHeader td, div#fileHeader td {
188
+ background: inherit;
189
+ color: white;
190
+ }
191
+
192
+
193
+ div#fileHeader {
194
+ background: #057;
195
+ }
196
+
197
+ div#classHeader {
198
+ background: #048;
199
+ }
200
+
201
+
202
+ .class-name-in-header {
203
+ font-size: 180%;
204
+ font-weight: bold;
205
+ }
206
+
207
+
208
+ div#bodyContent {
209
+ padding: 0 1.5em 0 1.5em;
210
+ }
211
+
212
+ div#description {
213
+ padding: 0.5em 1.5em;
214
+ background: #efefef;
215
+ border: 1px dotted #999;
216
+ }
217
+
218
+ div#description h1,h2,h3,h4,h5,h6 {
219
+ color: #125;;
220
+ background: transparent;
221
+ }
222
+
223
+ div#validator-badges {
224
+ text-align: center;
225
+ }
226
+ div#validator-badges img { border: 0; }
227
+
228
+ div#copyright {
229
+ color: #333;
230
+ background: #efefef;
231
+ font: 0.75em sans-serif;
232
+ margin-top: 5em;
233
+ margin-bottom: 0;
234
+ padding: 0.5em 2em;
235
+ }
236
+
237
+
238
+ /* === Classes =================================== */
239
+
240
+ table.header-table {
241
+ color: white;
242
+ font-size: small;
243
+ }
244
+
245
+ .type-note {
246
+ font-size: small;
247
+ color: #DEDEDE;
248
+ }
249
+
250
+ .xxsection-bar {
251
+ background: #eee;
252
+ color: #333;
253
+ padding: 3px;
254
+ }
255
+
256
+ .section-bar {
257
+ color: #333;
258
+ border-bottom: 1px solid #999;
259
+ margin-left: -20px;
260
+ }
261
+
262
+
263
+ .section-title {
264
+ background: #79a;
265
+ color: #eee;
266
+ padding: 3px;
267
+ margin-top: 2em;
268
+ margin-left: -30px;
269
+ border: 1px solid #999;
270
+ }
271
+
272
+ .top-aligned-row { vertical-align: top }
273
+ .bottom-aligned-row { vertical-align: bottom }
274
+
275
+ /* --- Context section classes ----------------------- */
276
+
277
+ .context-row { }
278
+ .context-item-name { font-family: monospace; font-weight: bold; color: black; }
279
+ .context-item-value { font-size: small; color: #448; }
280
+ .context-item-desc { color: #333; padding-left: 2em; }
281
+
282
+ /* --- Method classes -------------------------- */
283
+ .method-detail {
284
+ background: #efefef;
285
+ padding: 0;
286
+ margin-top: 0.5em;
287
+ margin-bottom: 1em;
288
+ border: 1px dotted #ccc;
289
+ }
290
+ .method-heading {
291
+ color: black;
292
+ background: #ccc;
293
+ border-bottom: 1px solid #666;
294
+ padding: 0.2em 0.5em 0 0.5em;
295
+ }
296
+ .method-signature { color: black; background: inherit; }
297
+ .method-name { font-weight: bold; }
298
+ .method-args { font-style: italic; }
299
+ .method-description { padding: 0 0.5em 0 0.5em; }
300
+
301
+ /* --- Source code sections -------------------- */
302
+
303
+ a.source-toggle { font-size: 90%; }
304
+ div.method-source-code {
305
+ background: #262626;
306
+ color: #ffdead;
307
+ margin: 1em;
308
+ padding: 0.5em;
309
+ border: 1px dashed #999;
310
+ overflow: hidden;
311
+ }
312
+
313
+ div.method-source-code pre { color: #ffdead; overflow: hidden; }
314
+
315
+ /* --- Ruby keyword styles --------------------- */
316
+
317
+ .standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
318
+
319
+ .ruby-constant { color: #7fffd4; background: transparent; }
320
+ .ruby-keyword { color: #00ffff; background: transparent; }
321
+ .ruby-ivar { color: #eedd82; background: transparent; }
322
+ .ruby-operator { color: #00ffee; background: transparent; }
323
+ .ruby-identifier { color: #ffdead; background: transparent; }
324
+ .ruby-node { color: #ffa07a; background: transparent; }
325
+ .ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
326
+ .ruby-regexp { color: #ffa07a; background: transparent; }
327
+ .ruby-value { color: #7fffd4; background: transparent; }
328
+ RDOCCSS
329
+
330
+ def self.run(options)
331
+ new(options[:gemdir], options[:port], options[:daemon]).run
332
+ end
333
+
334
+ def initialize(gem_dir, port, daemon)
335
+ Socket.do_not_reverse_lookup = true
336
+
337
+ @gem_dir = gem_dir
338
+ @port = port
339
+ @daemon = daemon
340
+ logger = WEBrick::Log.new nil, WEBrick::BasicLog::FATAL
341
+ @server = WEBrick::HTTPServer.new :DoNotListen => true, :Logger => logger
342
+
343
+ @spec_dir = File.join @gem_dir, 'specifications'
344
+
345
+ unless File.directory? @spec_dir then
346
+ raise ArgumentError, "#{@gem_dir} does not appear to be a gem repository"
347
+ end
348
+
349
+ @source_index = Gem::SourceIndex.from_gems_in @spec_dir
350
+ end
351
+
352
+ def Marshal(req, res)
353
+ @source_index.refresh!
354
+
355
+ res['date'] = File.stat(@spec_dir).mtime
356
+
357
+ index = Marshal.dump @source_index
358
+
359
+ if req.request_method == 'HEAD' then
360
+ res['content-length'] = index.length
361
+ return
362
+ end
363
+
364
+ if req.path =~ /Z$/ then
365
+ res['content-type'] = 'application/x-deflate'
366
+ index = Gem.deflate index
367
+ else
368
+ res['content-type'] = 'application/octet-stream'
369
+ end
370
+
371
+ res.body << index
372
+ end
373
+
374
+ def latest_specs(req, res)
375
+ @source_index.refresh!
376
+
377
+ res['content-type'] = 'application/x-gzip'
378
+
379
+ res['date'] = File.stat(@spec_dir).mtime
380
+
381
+ specs = @source_index.latest_specs.sort.map do |spec|
382
+ platform = spec.original_platform
383
+ platform = Gem::Platform::RUBY if platform.nil?
384
+ [spec.name, spec.version, platform]
385
+ end
386
+
387
+ specs = Marshal.dump specs
388
+
389
+ if req.path =~ /\.gz$/ then
390
+ specs = Gem.gzip specs
391
+ res['content-type'] = 'application/x-gzip'
392
+ else
393
+ res['content-type'] = 'application/octet-stream'
394
+ end
395
+
396
+ if req.request_method == 'HEAD' then
397
+ res['content-length'] = specs.length
398
+ else
399
+ res.body << specs
400
+ end
401
+ end
402
+
403
+ def quick(req, res)
404
+ @source_index.refresh!
405
+
406
+ res['content-type'] = 'text/plain'
407
+ res['date'] = File.stat(@spec_dir).mtime
408
+
409
+ case req.request_uri.path
410
+ when '/quick/index' then
411
+ res.body << @source_index.map { |name,| name }.sort.join("\n")
412
+ when '/quick/index.rz' then
413
+ index = @source_index.map { |name,| name }.sort.join("\n")
414
+ res['content-type'] = 'application/x-deflate'
415
+ res.body << Gem.deflate(index)
416
+ when '/quick/latest_index' then
417
+ index = @source_index.latest_specs.map { |spec| spec.full_name }
418
+ res.body << index.sort.join("\n")
419
+ when '/quick/latest_index.rz' then
420
+ index = @source_index.latest_specs.map { |spec| spec.full_name }
421
+ res['content-type'] = 'application/x-deflate'
422
+ res.body << Gem.deflate(index.sort.join("\n"))
423
+ when %r|^/quick/(Marshal.#{Regexp.escape Gem.marshal_version}/)?(.*?)-([0-9.]+)(-.*?)?\.gemspec\.rz$| then
424
+ dep = Gem::Dependency.new $2, $3
425
+ specs = @source_index.search dep
426
+ marshal_format = $1
427
+
428
+ selector = [$2, $3, $4].map { |s| s.inspect }.join ' '
429
+
430
+ platform = if $4 then
431
+ Gem::Platform.new $4.sub(/^-/, '')
432
+ else
433
+ Gem::Platform::RUBY
434
+ end
435
+
436
+ specs = specs.select { |s| s.platform == platform }
437
+
438
+ if specs.empty? then
439
+ res.status = 404
440
+ res.body = "No gems found matching #{selector}"
441
+ elsif specs.length > 1 then
442
+ res.status = 500
443
+ res.body = "Multiple gems found matching #{selector}"
444
+ elsif marshal_format then
445
+ res['content-type'] = 'application/x-deflate'
446
+ res.body << Gem.deflate(Marshal.dump(specs.first))
447
+ else # deprecated YAML format
448
+ res['content-type'] = 'application/x-deflate'
449
+ res.body << Gem.deflate(specs.first.to_yaml)
450
+ end
451
+ else
452
+ raise WEBrick::HTTPStatus::NotFound, "`#{req.path}' not found."
453
+ end
454
+ end
455
+
456
+ def root(req, res)
457
+ @source_index.refresh!
458
+ res['date'] = File.stat(@spec_dir).mtime
459
+
460
+ raise WEBrick::HTTPStatus::NotFound, "`#{req.path}' not found." unless
461
+ req.path == '/'
462
+
463
+ specs = []
464
+ total_file_count = 0
465
+
466
+ @source_index.each do |path, spec|
467
+ total_file_count += spec.files.size
468
+ deps = spec.dependencies.map do |dep|
469
+ { "name" => dep.name,
470
+ "type" => dep.type,
471
+ "version" => dep.version_requirements.to_s, }
472
+ end
473
+
474
+ deps = deps.sort_by { |dep| [dep["name"].downcase, dep["version"]] }
475
+ deps.last["is_last"] = true unless deps.empty?
476
+
477
+ # executables
478
+ executables = spec.executables.sort.collect { |exec| {"executable" => exec} }
479
+ executables = nil if executables.empty?
480
+ executables.last["is_last"] = true if executables
481
+
482
+ specs << {
483
+ "authors" => spec.authors.sort.join(", "),
484
+ "date" => spec.date.to_s,
485
+ "dependencies" => deps,
486
+ "doc_path" => "/doc_root/#{spec.full_name}/rdoc/index.html",
487
+ "executables" => executables,
488
+ "only_one_executable" => (executables && executables.size == 1),
489
+ "full_name" => spec.full_name,
490
+ "has_deps" => !deps.empty?,
491
+ "homepage" => spec.homepage,
492
+ "name" => spec.name,
493
+ "rdoc_installed" => Gem::DocManager.new(spec).rdoc_installed?,
494
+ "summary" => spec.summary,
495
+ "version" => spec.version.to_s,
496
+ }
497
+ end
498
+
499
+ specs << {
500
+ "authors" => "Chad Fowler, Rich Kilmer, Jim Weirich, Eric Hodel and others",
501
+ "dependencies" => [],
502
+ "doc_path" => "/doc_root/rubygems-#{Gem::RubyGemsVersion}/rdoc/index.html",
503
+ "executables" => [{"executable" => 'gem', "is_last" => true}],
504
+ "only_one_executable" => true,
505
+ "full_name" => "rubygems-#{Gem::RubyGemsVersion}",
506
+ "has_deps" => false,
507
+ "homepage" => "http://rubygems.org/",
508
+ "name" => 'rubygems',
509
+ "rdoc_installed" => true,
510
+ "summary" => "RubyGems itself",
511
+ "version" => Gem::RubyGemsVersion,
512
+ }
513
+
514
+ specs = specs.sort_by { |spec| [spec["name"].downcase, spec["version"]] }
515
+ specs.last["is_last"] = true
516
+
517
+ # tag all specs with first_name_entry
518
+ last_spec = nil
519
+ specs.each do |spec|
520
+ is_first = last_spec.nil? || (last_spec["name"].downcase != spec["name"].downcase)
521
+ spec["first_name_entry"] = is_first
522
+ last_spec = spec
523
+ end
524
+
525
+ # create page from template
526
+ template = ERB.new(DOC_TEMPLATE)
527
+ res['content-type'] = 'text/html'
528
+
529
+ values = { "gem_count" => specs.size.to_s, "specs" => specs,
530
+ "total_file_count" => total_file_count.to_s }
531
+
532
+ result = template.result binding
533
+ res.body = result
534
+ end
535
+
536
+ def run
537
+ @server.listen nil, @port
538
+
539
+ say "Starting gem server on http://localhost:#{@port}/"
540
+
541
+ WEBrick::Daemon.start if @daemon
542
+
543
+ @server.mount_proc "/yaml", method(:yaml)
544
+ @server.mount_proc "/yaml.Z", method(:yaml)
545
+
546
+ @server.mount_proc "/Marshal.#{Gem.marshal_version}", method(:Marshal)
547
+ @server.mount_proc "/Marshal.#{Gem.marshal_version}.Z", method(:Marshal)
548
+
549
+ @server.mount_proc "/specs.#{Gem.marshal_version}", method(:specs)
550
+ @server.mount_proc "/specs.#{Gem.marshal_version}.gz", method(:specs)
551
+
552
+ @server.mount_proc "/latest_specs.#{Gem.marshal_version}",
553
+ method(:latest_specs)
554
+ @server.mount_proc "/latest_specs.#{Gem.marshal_version}.gz",
555
+ method(:latest_specs)
556
+
557
+ @server.mount_proc "/quick/", method(:quick)
558
+
559
+ @server.mount_proc("/gem-server-rdoc-style.css") do |req, res|
560
+ res['content-type'] = 'text/css'
561
+ res['date'] = File.stat(@spec_dir).mtime
562
+ res.body << RDOC_CSS
563
+ end
564
+
565
+ @server.mount_proc "/", method(:root)
566
+
567
+ paths = { "/gems" => "/cache/", "/doc_root" => "/doc/" }
568
+ paths.each do |mount_point, mount_dir|
569
+ @server.mount(mount_point, WEBrick::HTTPServlet::FileHandler,
570
+ File.join(@gem_dir, mount_dir), true)
571
+ end
572
+
573
+ trap("INT") { @server.shutdown; exit! }
574
+ trap("TERM") { @server.shutdown; exit! }
575
+
576
+ @server.start
577
+ end
578
+
579
+ def specs(req, res)
580
+ @source_index.refresh!
581
+
582
+ res['date'] = File.stat(@spec_dir).mtime
583
+
584
+ specs = @source_index.sort.map do |_, spec|
585
+ platform = spec.original_platform
586
+ platform = Gem::Platform::RUBY if platform.nil?
587
+ [spec.name, spec.version, platform]
588
+ end
589
+
590
+ specs = Marshal.dump specs
591
+
592
+ if req.path =~ /\.gz$/ then
593
+ specs = Gem.gzip specs
594
+ res['content-type'] = 'application/x-gzip'
595
+ else
596
+ res['content-type'] = 'application/octet-stream'
597
+ end
598
+
599
+ if req.request_method == 'HEAD' then
600
+ res['content-length'] = specs.length
601
+ else
602
+ res.body << specs
603
+ end
604
+ end
605
+
606
+ def yaml(req, res)
607
+ @source_index.refresh!
608
+
609
+ res['date'] = File.stat(@spec_dir).mtime
610
+
611
+ index = @source_index.to_yaml
612
+
613
+ if req.path =~ /Z$/ then
614
+ res['content-type'] = 'application/x-deflate'
615
+ index = Gem.deflate index
616
+ else
617
+ res['content-type'] = 'text/plain'
618
+ end
619
+
620
+ if req.request_method == 'HEAD' then
621
+ res['content-length'] = index.length
622
+ return
623
+ end
624
+
625
+ res.body << index
626
+ end
627
+
628
+ end
629
+