rubyfox-server 2.3.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (993) hide show
  1. data/.gitignore +17 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +23 -0
  6. data/Rakefile +1 -0
  7. data/bin/smartfox +7 -0
  8. data/lib/rubyfox/server/cli.rb +59 -0
  9. data/lib/rubyfox/server/data/config/.keep +0 -0
  10. data/lib/rubyfox/server/data/config/_backups/.keep +0 -0
  11. data/lib/rubyfox/server/data/config/ascii/boot.txt +5 -0
  12. data/lib/rubyfox/server/data/config/ascii/ready.txt +9 -0
  13. data/lib/rubyfox/server/data/config/core.xml +44 -0
  14. data/lib/rubyfox/server/data/config/crossdomain.xml +10 -0
  15. data/lib/rubyfox/server/data/config/descriptors/.keep +0 -0
  16. data/lib/rubyfox/server/data/config/descriptors/config_room.txt +323 -0
  17. data/lib/rubyfox/server/data/config/descriptors/config_server.txt +621 -0
  18. data/lib/rubyfox/server/data/config/descriptors/config_zone.txt +1021 -0
  19. data/lib/rubyfox/server/data/config/descriptors/runtime_game.txt +63 -0
  20. data/lib/rubyfox/server/data/config/descriptors/runtime_room.txt +377 -0
  21. data/lib/rubyfox/server/data/config/descriptors/runtime_user.txt +589 -0
  22. data/lib/rubyfox/server/data/config/descriptors/runtime_zone.txt +354 -0
  23. data/lib/rubyfox/server/data/config/jetty/.keep +0 -0
  24. data/lib/rubyfox/server/data/config/jetty/jetty.xml +214 -0
  25. data/lib/rubyfox/server/data/config/jetty/realm.properties +21 -0
  26. data/lib/rubyfox/server/data/config/jetty/webdefault.xml +410 -0
  27. data/lib/rubyfox/server/data/config/log4j.properties +75 -0
  28. data/lib/rubyfox/server/data/config/myprop.properties +5 -0
  29. data/lib/rubyfox/server/data/config/server.xml +65 -0
  30. data/lib/rubyfox/server/data/config/templates/sfs2x.unix.txt +12 -0
  31. data/lib/rubyfox/server/data/config/templates/sfs2x.windows.txt +1 -0
  32. data/lib/rubyfox/server/data/config/templates/vmoptions.txt +3 -0
  33. data/lib/rubyfox/server/data/config/wordsFile.txt +13 -0
  34. data/lib/rubyfox/server/data/data/bannedusers/.keep +0 -0
  35. data/lib/rubyfox/server/data/data/bannedusers/users.bin +0 -0
  36. data/lib/rubyfox/server/data/data/buddylists/.keep +0 -0
  37. data/lib/rubyfox/server/data/data/buddylists/BasicExamples/7364666773646667 +0 -0
  38. data/lib/rubyfox/server/data/extensions/.keep +0 -0
  39. data/lib/rubyfox/server/data/extensions/__lib__/.keep +0 -0
  40. data/lib/rubyfox/server/data/lib/Jetty/.keep +0 -0
  41. data/lib/rubyfox/server/data/lib/Jetty/ant-1.6.5.jar +0 -0
  42. data/lib/rubyfox/server/data/lib/Jetty/core-3.1.1.jar +0 -0
  43. data/lib/rubyfox/server/data/lib/Jetty/jetty-6.1.26.jar +0 -0
  44. data/lib/rubyfox/server/data/lib/Jetty/jetty-util-6.1.26.jar +0 -0
  45. data/lib/rubyfox/server/data/lib/Jetty/jsp-2.1-glassfish-2.1.v20091210.jar +0 -0
  46. data/lib/rubyfox/server/data/lib/Jetty/jsp-2.1-jetty-6.1.26.jar +0 -0
  47. data/lib/rubyfox/server/data/lib/Jetty/jsp-api-2.1-glassfish-2.1.v20091210.jar +0 -0
  48. data/lib/rubyfox/server/data/lib/Jetty/servlet-api-2.5-20081211.jar +0 -0
  49. data/lib/rubyfox/server/data/lib/Lib/BaseHTTPServer.py +484 -0
  50. data/lib/rubyfox/server/data/lib/Lib/CGIHTTPServer.py +325 -0
  51. data/lib/rubyfox/server/data/lib/Lib/ConfigParser.py +472 -0
  52. data/lib/rubyfox/server/data/lib/Lib/Cookie.py +742 -0
  53. data/lib/rubyfox/server/data/lib/Lib/HTMLParser.py +383 -0
  54. data/lib/rubyfox/server/data/lib/Lib/MimeWriter.py +181 -0
  55. data/lib/rubyfox/server/data/lib/Lib/Queue.py +151 -0
  56. data/lib/rubyfox/server/data/lib/Lib/SimpleHTTPServer.py +198 -0
  57. data/lib/rubyfox/server/data/lib/Lib/SimpleXMLRPCServer.py +274 -0
  58. data/lib/rubyfox/server/data/lib/Lib/SocketServer.py +576 -0
  59. data/lib/rubyfox/server/data/lib/Lib/StringIO.py +239 -0
  60. data/lib/rubyfox/server/data/lib/Lib/UserDict$py.class +0 -0
  61. data/lib/rubyfox/server/data/lib/Lib/UserDict.py +60 -0
  62. data/lib/rubyfox/server/data/lib/Lib/UserList.py +94 -0
  63. data/lib/rubyfox/server/data/lib/Lib/UserString.py +182 -0
  64. data/lib/rubyfox/server/data/lib/Lib/__future__$py.class +0 -0
  65. data/lib/rubyfox/server/data/lib/Lib/__future__.py +104 -0
  66. data/lib/rubyfox/server/data/lib/Lib/aifc.py +961 -0
  67. data/lib/rubyfox/server/data/lib/Lib/anydbm.py +86 -0
  68. data/lib/rubyfox/server/data/lib/Lib/atexit.py +50 -0
  69. data/lib/rubyfox/server/data/lib/Lib/base64.py +77 -0
  70. data/lib/rubyfox/server/data/lib/Lib/bdb.py +563 -0
  71. data/lib/rubyfox/server/data/lib/Lib/binhex.py +531 -0
  72. data/lib/rubyfox/server/data/lib/Lib/bisect.py +78 -0
  73. data/lib/rubyfox/server/data/lib/Lib/calendar.py +246 -0
  74. data/lib/rubyfox/server/data/lib/Lib/cgi.py +1040 -0
  75. data/lib/rubyfox/server/data/lib/Lib/chunk.py +167 -0
  76. data/lib/rubyfox/server/data/lib/Lib/cmd.py +336 -0
  77. data/lib/rubyfox/server/data/lib/Lib/code$py.class +0 -0
  78. data/lib/rubyfox/server/data/lib/Lib/code.py +311 -0
  79. data/lib/rubyfox/server/data/lib/Lib/codecs$py.class +0 -0
  80. data/lib/rubyfox/server/data/lib/Lib/codecs.py +636 -0
  81. data/lib/rubyfox/server/data/lib/Lib/codeop$py.class +0 -0
  82. data/lib/rubyfox/server/data/lib/Lib/codeop.py +131 -0
  83. data/lib/rubyfox/server/data/lib/Lib/colorsys.py +123 -0
  84. data/lib/rubyfox/server/data/lib/Lib/commands.py +84 -0
  85. data/lib/rubyfox/server/data/lib/Lib/compileall.py +148 -0
  86. data/lib/rubyfox/server/data/lib/Lib/copy.py +330 -0
  87. data/lib/rubyfox/server/data/lib/Lib/copy_reg$py.class +0 -0
  88. data/lib/rubyfox/server/data/lib/Lib/copy_reg.py +78 -0
  89. data/lib/rubyfox/server/data/lib/Lib/datetime$py.class +0 -0
  90. data/lib/rubyfox/server/data/lib/Lib/datetime.py +2007 -0
  91. data/lib/rubyfox/server/data/lib/Lib/dbexts.py +726 -0
  92. data/lib/rubyfox/server/data/lib/Lib/difflib.py +1088 -0
  93. data/lib/rubyfox/server/data/lib/Lib/dircache.py +44 -0
  94. data/lib/rubyfox/server/data/lib/Lib/doctest.py +1173 -0
  95. data/lib/rubyfox/server/data/lib/Lib/dospath.py +341 -0
  96. data/lib/rubyfox/server/data/lib/Lib/dumbdbm.py +170 -0
  97. data/lib/rubyfox/server/data/lib/Lib/email/Charset.py +393 -0
  98. data/lib/rubyfox/server/data/lib/Lib/email/Encoders.py +94 -0
  99. data/lib/rubyfox/server/data/lib/Lib/email/Errors.py +26 -0
  100. data/lib/rubyfox/server/data/lib/Lib/email/Generator.py +378 -0
  101. data/lib/rubyfox/server/data/lib/Lib/email/Header.py +515 -0
  102. data/lib/rubyfox/server/data/lib/Lib/email/Iterators.py +25 -0
  103. data/lib/rubyfox/server/data/lib/Lib/email/MIMEAudio.py +71 -0
  104. data/lib/rubyfox/server/data/lib/Lib/email/MIMEBase.py +24 -0
  105. data/lib/rubyfox/server/data/lib/Lib/email/MIMEImage.py +45 -0
  106. data/lib/rubyfox/server/data/lib/Lib/email/MIMEMessage.py +32 -0
  107. data/lib/rubyfox/server/data/lib/Lib/email/MIMEMultipart.py +37 -0
  108. data/lib/rubyfox/server/data/lib/Lib/email/MIMENonMultipart.py +24 -0
  109. data/lib/rubyfox/server/data/lib/Lib/email/MIMEText.py +45 -0
  110. data/lib/rubyfox/server/data/lib/Lib/email/Message.py +837 -0
  111. data/lib/rubyfox/server/data/lib/Lib/email/Parser.py +292 -0
  112. data/lib/rubyfox/server/data/lib/Lib/email/Utils.py +340 -0
  113. data/lib/rubyfox/server/data/lib/Lib/email/__init__.py +72 -0
  114. data/lib/rubyfox/server/data/lib/Lib/email/_compat21.py +69 -0
  115. data/lib/rubyfox/server/data/lib/Lib/email/_compat22.py +70 -0
  116. data/lib/rubyfox/server/data/lib/Lib/email/_parseaddr.py +480 -0
  117. data/lib/rubyfox/server/data/lib/Lib/email/base64MIME.py +184 -0
  118. data/lib/rubyfox/server/data/lib/Lib/email/quopriMIME.py +323 -0
  119. data/lib/rubyfox/server/data/lib/Lib/email/test/__init__.py +2 -0
  120. data/lib/rubyfox/server/data/lib/Lib/email/test/data/PyBanner048.gif +0 -0
  121. data/lib/rubyfox/server/data/lib/Lib/email/test/data/audiotest.au +0 -0
  122. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_01.txt +19 -0
  123. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_02.txt +135 -0
  124. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_03.txt +16 -0
  125. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_04.txt +37 -0
  126. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_05.txt +28 -0
  127. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_06.txt +33 -0
  128. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_07.txt +83 -0
  129. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_08.txt +24 -0
  130. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_09.txt +24 -0
  131. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_10.txt +32 -0
  132. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_11.txt +7 -0
  133. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_12.txt +36 -0
  134. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_13.txt +94 -0
  135. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_14.txt +23 -0
  136. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_15.txt +52 -0
  137. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_16.txt +123 -0
  138. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_17.txt +12 -0
  139. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_18.txt +6 -0
  140. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_19.txt +43 -0
  141. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_20.txt +22 -0
  142. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_21.txt +20 -0
  143. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_22.txt +46 -0
  144. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_23.txt +8 -0
  145. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_24.txt +10 -0
  146. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_25.txt +117 -0
  147. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_26.txt +45 -0
  148. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_27.txt +15 -0
  149. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_28.txt +25 -0
  150. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_29.txt +22 -0
  151. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_30.txt +23 -0
  152. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_31.txt +15 -0
  153. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_32.txt +14 -0
  154. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_33.txt +29 -0
  155. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_34.txt +19 -0
  156. data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_35.txt +4 -0
  157. data/lib/rubyfox/server/data/lib/Lib/email/test/test_email.py +2718 -0
  158. data/lib/rubyfox/server/data/lib/Lib/email/test/test_email_codecs.py +68 -0
  159. data/lib/rubyfox/server/data/lib/Lib/email/test/test_email_torture.py +136 -0
  160. data/lib/rubyfox/server/data/lib/Lib/encodings/__init__$py.class +0 -0
  161. data/lib/rubyfox/server/data/lib/Lib/encodings/__init__.py +97 -0
  162. data/lib/rubyfox/server/data/lib/Lib/encodings/aliases$py.class +0 -0
  163. data/lib/rubyfox/server/data/lib/Lib/encodings/aliases.py +115 -0
  164. data/lib/rubyfox/server/data/lib/Lib/encodings/ascii.py +35 -0
  165. data/lib/rubyfox/server/data/lib/Lib/encodings/base64_codec.py +62 -0
  166. data/lib/rubyfox/server/data/lib/Lib/encodings/charmap.py +51 -0
  167. data/lib/rubyfox/server/data/lib/Lib/encodings/cp037.py +280 -0
  168. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1006.py +138 -0
  169. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1026.py +280 -0
  170. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1140.py +45 -0
  171. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1250.py +123 -0
  172. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1251.py +157 -0
  173. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1252.py +76 -0
  174. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1253.py +151 -0
  175. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1254.py +82 -0
  176. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1255.py +143 -0
  177. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1256.py +129 -0
  178. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1257.py +131 -0
  179. data/lib/rubyfox/server/data/lib/Lib/encodings/cp1258.py +90 -0
  180. data/lib/rubyfox/server/data/lib/Lib/encodings/cp424.py +280 -0
  181. data/lib/rubyfox/server/data/lib/Lib/encodings/cp437.py +172 -0
  182. data/lib/rubyfox/server/data/lib/Lib/encodings/cp500.py +280 -0
  183. data/lib/rubyfox/server/data/lib/Lib/encodings/cp737.py +172 -0
  184. data/lib/rubyfox/server/data/lib/Lib/encodings/cp775.py +172 -0
  185. data/lib/rubyfox/server/data/lib/Lib/encodings/cp850.py +172 -0
  186. data/lib/rubyfox/server/data/lib/Lib/encodings/cp852.py +172 -0
  187. data/lib/rubyfox/server/data/lib/Lib/encodings/cp855.py +172 -0
  188. data/lib/rubyfox/server/data/lib/Lib/encodings/cp856.py +172 -0
  189. data/lib/rubyfox/server/data/lib/Lib/encodings/cp857.py +171 -0
  190. data/lib/rubyfox/server/data/lib/Lib/encodings/cp860.py +172 -0
  191. data/lib/rubyfox/server/data/lib/Lib/encodings/cp861.py +172 -0
  192. data/lib/rubyfox/server/data/lib/Lib/encodings/cp862.py +172 -0
  193. data/lib/rubyfox/server/data/lib/Lib/encodings/cp863.py +172 -0
  194. data/lib/rubyfox/server/data/lib/Lib/encodings/cp864.py +170 -0
  195. data/lib/rubyfox/server/data/lib/Lib/encodings/cp865.py +172 -0
  196. data/lib/rubyfox/server/data/lib/Lib/encodings/cp866.py +172 -0
  197. data/lib/rubyfox/server/data/lib/Lib/encodings/cp869.py +172 -0
  198. data/lib/rubyfox/server/data/lib/Lib/encodings/cp874.py +171 -0
  199. data/lib/rubyfox/server/data/lib/Lib/encodings/cp875.py +281 -0
  200. data/lib/rubyfox/server/data/lib/Lib/encodings/hex_codec.py +62 -0
  201. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_1.py +44 -0
  202. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_10.py +90 -0
  203. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_13.py +100 -0
  204. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_14.py +75 -0
  205. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_15.py +52 -0
  206. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_2.py +101 -0
  207. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_3.py +79 -0
  208. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_4.py +94 -0
  209. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_5.py +138 -0
  210. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_6.py +137 -0
  211. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_7.py +124 -0
  212. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_8.py +112 -0
  213. data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_9.py +50 -0
  214. data/lib/rubyfox/server/data/lib/Lib/encodings/koi8_r.py +172 -0
  215. data/lib/rubyfox/server/data/lib/Lib/encodings/koi8_u.py +54 -0
  216. data/lib/rubyfox/server/data/lib/Lib/encodings/latin_1.py +35 -0
  217. data/lib/rubyfox/server/data/lib/Lib/encodings/mac_cyrillic.py +167 -0
  218. data/lib/rubyfox/server/data/lib/Lib/encodings/mac_greek.py +170 -0
  219. data/lib/rubyfox/server/data/lib/Lib/encodings/mac_iceland.py +166 -0
  220. data/lib/rubyfox/server/data/lib/Lib/encodings/mac_latin2.py +170 -0
  221. data/lib/rubyfox/server/data/lib/Lib/encodings/mac_roman.py +167 -0
  222. data/lib/rubyfox/server/data/lib/Lib/encodings/mac_turkish.py +167 -0
  223. data/lib/rubyfox/server/data/lib/Lib/encodings/mbcs.py +36 -0
  224. data/lib/rubyfox/server/data/lib/Lib/encodings/quopri_codec.py +58 -0
  225. data/lib/rubyfox/server/data/lib/Lib/encodings/raw_unicode_escape.py +30 -0
  226. data/lib/rubyfox/server/data/lib/Lib/encodings/rot_13.py +105 -0
  227. data/lib/rubyfox/server/data/lib/Lib/encodings/undefined.py +34 -0
  228. data/lib/rubyfox/server/data/lib/Lib/encodings/unicode_escape.py +30 -0
  229. data/lib/rubyfox/server/data/lib/Lib/encodings/unicode_internal.py +30 -0
  230. data/lib/rubyfox/server/data/lib/Lib/encodings/utf_16.py +61 -0
  231. data/lib/rubyfox/server/data/lib/Lib/encodings/utf_16_be.py +31 -0
  232. data/lib/rubyfox/server/data/lib/Lib/encodings/utf_16_le.py +31 -0
  233. data/lib/rubyfox/server/data/lib/Lib/encodings/utf_7.py +27 -0
  234. data/lib/rubyfox/server/data/lib/Lib/encodings/utf_8$py.class +0 -0
  235. data/lib/rubyfox/server/data/lib/Lib/encodings/utf_8.py +31 -0
  236. data/lib/rubyfox/server/data/lib/Lib/encodings/uu_codec.py +112 -0
  237. data/lib/rubyfox/server/data/lib/Lib/encodings/zlib_codec.py +63 -0
  238. data/lib/rubyfox/server/data/lib/Lib/fileinput.py +349 -0
  239. data/lib/rubyfox/server/data/lib/Lib/fnmatch.py +107 -0
  240. data/lib/rubyfox/server/data/lib/Lib/formatter.py +454 -0
  241. data/lib/rubyfox/server/data/lib/Lib/fpformat.py +142 -0
  242. data/lib/rubyfox/server/data/lib/Lib/ftplib.py +804 -0
  243. data/lib/rubyfox/server/data/lib/Lib/getopt.py +143 -0
  244. data/lib/rubyfox/server/data/lib/Lib/glob.py +56 -0
  245. data/lib/rubyfox/server/data/lib/Lib/gopherlib.py +205 -0
  246. data/lib/rubyfox/server/data/lib/Lib/gzip.py +390 -0
  247. data/lib/rubyfox/server/data/lib/Lib/hmac.py +99 -0
  248. data/lib/rubyfox/server/data/lib/Lib/htmlentitydefs.py +257 -0
  249. data/lib/rubyfox/server/data/lib/Lib/htmllib.py +475 -0
  250. data/lib/rubyfox/server/data/lib/Lib/httplib.py +1238 -0
  251. data/lib/rubyfox/server/data/lib/Lib/imaplib.py +1208 -0
  252. data/lib/rubyfox/server/data/lib/Lib/imghdr.py +154 -0
  253. data/lib/rubyfox/server/data/lib/Lib/inspect$py.class +0 -0
  254. data/lib/rubyfox/server/data/lib/Lib/inspect.py +787 -0
  255. data/lib/rubyfox/server/data/lib/Lib/isql.py +238 -0
  256. data/lib/rubyfox/server/data/lib/Lib/javaos$py.class +0 -0
  257. data/lib/rubyfox/server/data/lib/Lib/javaos.py +395 -0
  258. data/lib/rubyfox/server/data/lib/Lib/javapath$py.class +0 -0
  259. data/lib/rubyfox/server/data/lib/Lib/javapath.py +349 -0
  260. data/lib/rubyfox/server/data/lib/Lib/javashell.py +194 -0
  261. data/lib/rubyfox/server/data/lib/Lib/jreload.py +119 -0
  262. data/lib/rubyfox/server/data/lib/Lib/jxxload_help/DiscardHelp.java +59 -0
  263. data/lib/rubyfox/server/data/lib/Lib/jxxload_help/JavaLoaderFactory.java +9 -0
  264. data/lib/rubyfox/server/data/lib/Lib/jxxload_help/PackageManager.java +58 -0
  265. data/lib/rubyfox/server/data/lib/Lib/jxxload_help/PathVFS.java +98 -0
  266. data/lib/rubyfox/server/data/lib/Lib/jxxload_help/PathVFSJavaLoader.java +49 -0
  267. data/lib/rubyfox/server/data/lib/Lib/keyword.py +97 -0
  268. data/lib/rubyfox/server/data/lib/Lib/linecache$py.class +0 -0
  269. data/lib/rubyfox/server/data/lib/Lib/linecache.py +101 -0
  270. data/lib/rubyfox/server/data/lib/Lib/macpath.py +242 -0
  271. data/lib/rubyfox/server/data/lib/Lib/macurl2path.py +95 -0
  272. data/lib/rubyfox/server/data/lib/Lib/mailbox.py +313 -0
  273. data/lib/rubyfox/server/data/lib/Lib/mailcap.py +255 -0
  274. data/lib/rubyfox/server/data/lib/Lib/markupbase.py +317 -0
  275. data/lib/rubyfox/server/data/lib/Lib/marshal.py +315 -0
  276. data/lib/rubyfox/server/data/lib/Lib/mhlib.py +1003 -0
  277. data/lib/rubyfox/server/data/lib/Lib/mimetools.py +226 -0
  278. data/lib/rubyfox/server/data/lib/Lib/mimetypes.py +435 -0
  279. data/lib/rubyfox/server/data/lib/Lib/mimify.py +464 -0
  280. data/lib/rubyfox/server/data/lib/Lib/multifile.py +160 -0
  281. data/lib/rubyfox/server/data/lib/Lib/mutex.py +51 -0
  282. data/lib/rubyfox/server/data/lib/Lib/netrc.py +108 -0
  283. data/lib/rubyfox/server/data/lib/Lib/nntplib.py +575 -0
  284. data/lib/rubyfox/server/data/lib/Lib/ntpath.py +482 -0
  285. data/lib/rubyfox/server/data/lib/Lib/nturl2path.py +66 -0
  286. data/lib/rubyfox/server/data/lib/Lib/pawt/__init__.py +35 -0
  287. data/lib/rubyfox/server/data/lib/Lib/pawt/colors.py +144 -0
  288. data/lib/rubyfox/server/data/lib/Lib/pawt/swing.py +42 -0
  289. data/lib/rubyfox/server/data/lib/Lib/pdb.py +979 -0
  290. data/lib/rubyfox/server/data/lib/Lib/pickle.py +990 -0
  291. data/lib/rubyfox/server/data/lib/Lib/pipes.py +297 -0
  292. data/lib/rubyfox/server/data/lib/Lib/popen2.py +304 -0
  293. data/lib/rubyfox/server/data/lib/Lib/poplib.py +335 -0
  294. data/lib/rubyfox/server/data/lib/Lib/posixfile.py +240 -0
  295. data/lib/rubyfox/server/data/lib/Lib/posixpath.py +414 -0
  296. data/lib/rubyfox/server/data/lib/Lib/pprint.py +310 -0
  297. data/lib/rubyfox/server/data/lib/Lib/profile.py +556 -0
  298. data/lib/rubyfox/server/data/lib/Lib/pstats.py +641 -0
  299. data/lib/rubyfox/server/data/lib/Lib/pyclbr.py +337 -0
  300. data/lib/rubyfox/server/data/lib/Lib/quopri.py +237 -0
  301. data/lib/rubyfox/server/data/lib/Lib/random$py.class +0 -0
  302. data/lib/rubyfox/server/data/lib/Lib/random.py +779 -0
  303. data/lib/rubyfox/server/data/lib/Lib/re$py.class +0 -0
  304. data/lib/rubyfox/server/data/lib/Lib/re.py +11 -0
  305. data/lib/rubyfox/server/data/lib/Lib/reconvert.py +192 -0
  306. data/lib/rubyfox/server/data/lib/Lib/reindex$py.class +0 -0
  307. data/lib/rubyfox/server/data/lib/Lib/repr.py +95 -0
  308. data/lib/rubyfox/server/data/lib/Lib/rfc822.py +1010 -0
  309. data/lib/rubyfox/server/data/lib/Lib/sched.py +106 -0
  310. data/lib/rubyfox/server/data/lib/Lib/select.py +211 -0
  311. data/lib/rubyfox/server/data/lib/Lib/servlet-api-2.5-20081211.jar +0 -0
  312. data/lib/rubyfox/server/data/lib/Lib/setsfactory.py +10 -0
  313. data/lib/rubyfox/server/data/lib/Lib/sfs2x-lms.jar +0 -0
  314. data/lib/rubyfox/server/data/lib/Lib/sgmllib.py +516 -0
  315. data/lib/rubyfox/server/data/lib/Lib/shelve.py +158 -0
  316. data/lib/rubyfox/server/data/lib/Lib/shlex.py +209 -0
  317. data/lib/rubyfox/server/data/lib/Lib/shutil$py.class +0 -0
  318. data/lib/rubyfox/server/data/lib/Lib/shutil.py +138 -0
  319. data/lib/rubyfox/server/data/lib/Lib/site.py +263 -0
  320. data/lib/rubyfox/server/data/lib/Lib/smtplib.py +729 -0
  321. data/lib/rubyfox/server/data/lib/Lib/sndhdr.py +228 -0
  322. data/lib/rubyfox/server/data/lib/Lib/socket.py +902 -0
  323. data/lib/rubyfox/server/data/lib/Lib/sre$py.class +0 -0
  324. data/lib/rubyfox/server/data/lib/Lib/sre.py +311 -0
  325. data/lib/rubyfox/server/data/lib/Lib/sre_compile$py.class +0 -0
  326. data/lib/rubyfox/server/data/lib/Lib/sre_compile.py +455 -0
  327. data/lib/rubyfox/server/data/lib/Lib/sre_constants$py.class +0 -0
  328. data/lib/rubyfox/server/data/lib/Lib/sre_constants.py +259 -0
  329. data/lib/rubyfox/server/data/lib/Lib/sre_parse$py.class +0 -0
  330. data/lib/rubyfox/server/data/lib/Lib/sre_parse.py +738 -0
  331. data/lib/rubyfox/server/data/lib/Lib/stat$py.class +0 -0
  332. data/lib/rubyfox/server/data/lib/Lib/stat.py +86 -0
  333. data/lib/rubyfox/server/data/lib/Lib/string$py.class +0 -0
  334. data/lib/rubyfox/server/data/lib/Lib/string.py +437 -0
  335. data/lib/rubyfox/server/data/lib/Lib/symbol.py +95 -0
  336. data/lib/rubyfox/server/data/lib/Lib/telnetlib.py +662 -0
  337. data/lib/rubyfox/server/data/lib/Lib/tempfile.py +255 -0
  338. data/lib/rubyfox/server/data/lib/Lib/test/Graph.py +62 -0
  339. data/lib/rubyfox/server/data/lib/Lib/test/README +372 -0
  340. data/lib/rubyfox/server/data/lib/Lib/test/__init__.py +1 -0
  341. data/lib/rubyfox/server/data/lib/Lib/test/audiotest.au +0 -0
  342. data/lib/rubyfox/server/data/lib/Lib/test/autotest.py +6 -0
  343. data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_future3.py +10 -0
  344. data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_future4.py +10 -0
  345. data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_future5.py +12 -0
  346. data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_future6.py +10 -0
  347. data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_future7.py +11 -0
  348. data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_nocaret.py +2 -0
  349. data/lib/rubyfox/server/data/lib/Lib/test/blob.jar +0 -0
  350. data/lib/rubyfox/server/data/lib/Lib/test/bugs/bugs100.py +139 -0
  351. data/lib/rubyfox/server/data/lib/Lib/test/bugs/bugs101.py +57 -0
  352. data/lib/rubyfox/server/data/lib/Lib/test/bugs/jdkbugs.py +10 -0
  353. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr101.py +59 -0
  354. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr104.py +9 -0
  355. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr112.py +14 -0
  356. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr119.py +16 -0
  357. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr127.py +10 -0
  358. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr133/__init__.py +1 -0
  359. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr133/test.py +2 -0
  360. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr133.py +12 -0
  361. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr134.py +9 -0
  362. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr139.py +7 -0
  363. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr142.py +1 -0
  364. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr144.py +2 -0
  365. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr148.py +2 -0
  366. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr149.py +7 -0
  367. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr155.py +13 -0
  368. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr170.py +7 -0
  369. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr171.py +9 -0
  370. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr174.py +9 -0
  371. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr178.py +10 -0
  372. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr183.py +5 -0
  373. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr186.py +10 -0
  374. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr191.py +5 -0
  375. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr192.py +81 -0
  376. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr195.py +11 -0
  377. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr208.py +26 -0
  378. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr233.py +8 -0
  379. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr234.py +16 -0
  380. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr235.py +14 -0
  381. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr239.py +6 -0
  382. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr241.py +16 -0
  383. data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr242.py +12 -0
  384. data/lib/rubyfox/server/data/lib/Lib/test/data/PyBanner048.gif +0 -0
  385. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_01.txt +19 -0
  386. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_02.txt +135 -0
  387. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_03.txt +16 -0
  388. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_04.txt +37 -0
  389. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_05.txt +28 -0
  390. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_06.txt +33 -0
  391. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_07.txt +83 -0
  392. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_08.txt +24 -0
  393. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_09.txt +24 -0
  394. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_10.txt +32 -0
  395. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_11.txt +7 -0
  396. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_12.txt +36 -0
  397. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_13.txt +94 -0
  398. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_14.txt +23 -0
  399. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_15.txt +52 -0
  400. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_16.txt +123 -0
  401. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_17.txt +12 -0
  402. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_18.txt +6 -0
  403. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_19.txt +43 -0
  404. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_20.txt +22 -0
  405. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_21.txt +22 -0
  406. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_22.txt +46 -0
  407. data/lib/rubyfox/server/data/lib/Lib/test/data/msg_23.txt +8 -0
  408. data/lib/rubyfox/server/data/lib/Lib/test/double_const.py +30 -0
  409. data/lib/rubyfox/server/data/lib/Lib/test/greyrgb.uue +1547 -0
  410. data/lib/rubyfox/server/data/lib/Lib/test/javatests/AnonInner.java +20 -0
  411. data/lib/rubyfox/server/data/lib/Lib/test/javatests/Foo.java +3 -0
  412. data/lib/rubyfox/server/data/lib/Lib/test/javatests/JOverload.java +132 -0
  413. data/lib/rubyfox/server/data/lib/Lib/test/javatests/ListTest.java +638 -0
  414. data/lib/rubyfox/server/data/lib/Lib/test/javatests/SubFoo.java +3 -0
  415. data/lib/rubyfox/server/data/lib/Lib/test/javatests/TestSupport.java +49 -0
  416. data/lib/rubyfox/server/data/lib/Lib/test/javatests/__init__.py +0 -0
  417. data/lib/rubyfox/server/data/lib/Lib/test/jser2_classes.py +47 -0
  418. data/lib/rubyfox/server/data/lib/Lib/test/output/test_MimeWriter +110 -0
  419. data/lib/rubyfox/server/data/lib/Lib/test/output/test_array +4 -0
  420. data/lib/rubyfox/server/data/lib/Lib/test/output/test_asynchat +3 -0
  421. data/lib/rubyfox/server/data/lib/Lib/test/output/test_augassign +51 -0
  422. data/lib/rubyfox/server/data/lib/Lib/test/output/test_binascii +29 -0
  423. data/lib/rubyfox/server/data/lib/Lib/test/output/test_builtin +53 -0
  424. data/lib/rubyfox/server/data/lib/Lib/test/output/test_cfgparser +9 -0
  425. data/lib/rubyfox/server/data/lib/Lib/test/output/test_cgi +29 -0
  426. data/lib/rubyfox/server/data/lib/Lib/test/output/test_charmapcodec +16 -0
  427. data/lib/rubyfox/server/data/lib/Lib/test/output/test_class +101 -0
  428. data/lib/rubyfox/server/data/lib/Lib/test/output/test_coercion +1054 -0
  429. data/lib/rubyfox/server/data/lib/Lib/test/output/test_compare +101 -0
  430. data/lib/rubyfox/server/data/lib/Lib/test/output/test_compile +7 -0
  431. data/lib/rubyfox/server/data/lib/Lib/test/output/test_cookie +32 -0
  432. data/lib/rubyfox/server/data/lib/Lib/test/output/test_exceptions +52 -0
  433. data/lib/rubyfox/server/data/lib/Lib/test/output/test_extcall +112 -0
  434. data/lib/rubyfox/server/data/lib/Lib/test/output/test_frozen +4 -0
  435. data/lib/rubyfox/server/data/lib/Lib/test/output/test_future +9 -0
  436. data/lib/rubyfox/server/data/lib/Lib/test/output/test_gettext +46 -0
  437. data/lib/rubyfox/server/data/lib/Lib/test/output/test_global +5 -0
  438. data/lib/rubyfox/server/data/lib/Lib/test/output/test_grammar +66 -0
  439. data/lib/rubyfox/server/data/lib/Lib/test/output/test_httplib +10 -0
  440. data/lib/rubyfox/server/data/lib/Lib/test/output/test_janoninner +5 -0
  441. data/lib/rubyfox/server/data/lib/Lib/test/output/test_javalist +6 -0
  442. data/lib/rubyfox/server/data/lib/Lib/test/output/test_jbasic +13 -0
  443. data/lib/rubyfox/server/data/lib/Lib/test/output/test_jser +12 -0
  444. data/lib/rubyfox/server/data/lib/Lib/test/output/test_jsubclass +5 -0
  445. data/lib/rubyfox/server/data/lib/Lib/test/output/test_linuxaudiodev +7 -0
  446. data/lib/rubyfox/server/data/lib/Lib/test/output/test_longexp +2 -0
  447. data/lib/rubyfox/server/data/lib/Lib/test/output/test_math +26 -0
  448. data/lib/rubyfox/server/data/lib/Lib/test/output/test_md5 +9 -0
  449. data/lib/rubyfox/server/data/lib/Lib/test/output/test_methods +6 -0
  450. data/lib/rubyfox/server/data/lib/Lib/test/output/test_mimetools +5 -0
  451. data/lib/rubyfox/server/data/lib/Lib/test/output/test_mmap +34 -0
  452. data/lib/rubyfox/server/data/lib/Lib/test/output/test_new +7 -0
  453. data/lib/rubyfox/server/data/lib/Lib/test/output/test_nis +2 -0
  454. data/lib/rubyfox/server/data/lib/Lib/test/output/test_opcodes +4 -0
  455. data/lib/rubyfox/server/data/lib/Lib/test/output/test_openpty +2 -0
  456. data/lib/rubyfox/server/data/lib/Lib/test/output/test_operations +28 -0
  457. data/lib/rubyfox/server/data/lib/Lib/test/output/test_pkg +45 -0
  458. data/lib/rubyfox/server/data/lib/Lib/test/output/test_poll +17 -0
  459. data/lib/rubyfox/server/data/lib/Lib/test/output/test_popen2 +9 -0
  460. data/lib/rubyfox/server/data/lib/Lib/test/output/test_posixpath +2 -0
  461. data/lib/rubyfox/server/data/lib/Lib/test/output/test_pow +17 -0
  462. data/lib/rubyfox/server/data/lib/Lib/test/output/test_profile +17 -0
  463. data/lib/rubyfox/server/data/lib/Lib/test/output/test_pty +3 -0
  464. data/lib/rubyfox/server/data/lib/Lib/test/output/test_pwd +7 -0
  465. data/lib/rubyfox/server/data/lib/Lib/test/output/test_pyexpat +110 -0
  466. data/lib/rubyfox/server/data/lib/Lib/test/output/test_re +15 -0
  467. data/lib/rubyfox/server/data/lib/Lib/test/output/test_regex +29 -0
  468. data/lib/rubyfox/server/data/lib/Lib/test/output/test_rgbimg +2 -0
  469. data/lib/rubyfox/server/data/lib/Lib/test/output/test_richcmp +187 -0
  470. data/lib/rubyfox/server/data/lib/Lib/test/output/test_rotor +5 -0
  471. data/lib/rubyfox/server/data/lib/Lib/test/output/test_scope +24 -0
  472. data/lib/rubyfox/server/data/lib/Lib/test/output/test_signal +2 -0
  473. data/lib/rubyfox/server/data/lib/Lib/test/output/test_string +18 -0
  474. data/lib/rubyfox/server/data/lib/Lib/test/output/test_thread +4 -0
  475. data/lib/rubyfox/server/data/lib/Lib/test/output/test_threadedtempfile +5 -0
  476. data/lib/rubyfox/server/data/lib/Lib/test/output/test_time +9 -0
  477. data/lib/rubyfox/server/data/lib/Lib/test/output/test_tokenize +648 -0
  478. data/lib/rubyfox/server/data/lib/Lib/test/output/test_types +15 -0
  479. data/lib/rubyfox/server/data/lib/Lib/test/output/test_ucn +7 -0
  480. data/lib/rubyfox/server/data/lib/Lib/test/output/test_unicode +21 -0
  481. data/lib/rubyfox/server/data/lib/Lib/test/output/test_unicode_file +2 -0
  482. data/lib/rubyfox/server/data/lib/Lib/test/output/test_unicodedata +5 -0
  483. data/lib/rubyfox/server/data/lib/Lib/test/output/test_unpack +15 -0
  484. data/lib/rubyfox/server/data/lib/Lib/test/output/test_urlparse +47 -0
  485. data/lib/rubyfox/server/data/lib/Lib/test/output/test_winreg +3 -0
  486. data/lib/rubyfox/server/data/lib/Lib/test/output/test_winsound +2 -0
  487. data/lib/rubyfox/server/data/lib/Lib/test/output/test_xreadline +4 -0
  488. data/lib/rubyfox/server/data/lib/Lib/test/pickletester.py +285 -0
  489. data/lib/rubyfox/server/data/lib/Lib/test/pydocfodder.py +210 -0
  490. data/lib/rubyfox/server/data/lib/Lib/test/pystone.py +252 -0
  491. data/lib/rubyfox/server/data/lib/Lib/test/re_tests.py +590 -0
  492. data/lib/rubyfox/server/data/lib/Lib/test/regex_tests.py +287 -0
  493. data/lib/rubyfox/server/data/lib/Lib/test/regrtest.py +1096 -0
  494. data/lib/rubyfox/server/data/lib/Lib/test/reperf.py +23 -0
  495. data/lib/rubyfox/server/data/lib/Lib/test/sortperf.py +141 -0
  496. data/lib/rubyfox/server/data/lib/Lib/test/string_tests.py +265 -0
  497. data/lib/rubyfox/server/data/lib/Lib/test/test.xml +115 -0
  498. data/lib/rubyfox/server/data/lib/Lib/test/test.xml.out +115 -0
  499. data/lib/rubyfox/server/data/lib/Lib/test/test_MimeWriter.py +170 -0
  500. data/lib/rubyfox/server/data/lib/Lib/test/test_SimpleXMLRPCServer.py +88 -0
  501. data/lib/rubyfox/server/data/lib/Lib/test/test_StringIO.py +113 -0
  502. data/lib/rubyfox/server/data/lib/Lib/test/test___all__.py +158 -0
  503. data/lib/rubyfox/server/data/lib/Lib/test/test___future__.py +59 -0
  504. data/lib/rubyfox/server/data/lib/Lib/test/test_al.py +23 -0
  505. data/lib/rubyfox/server/data/lib/Lib/test/test_array.py +438 -0
  506. data/lib/rubyfox/server/data/lib/Lib/test/test_asynchat.py +58 -0
  507. data/lib/rubyfox/server/data/lib/Lib/test/test_atexit.py +66 -0
  508. data/lib/rubyfox/server/data/lib/Lib/test/test_audioop.py +264 -0
  509. data/lib/rubyfox/server/data/lib/Lib/test/test_augassign.py +261 -0
  510. data/lib/rubyfox/server/data/lib/Lib/test/test_b1.py +632 -0
  511. data/lib/rubyfox/server/data/lib/Lib/test/test_b2.py +365 -0
  512. data/lib/rubyfox/server/data/lib/Lib/test/test_base64.py +53 -0
  513. data/lib/rubyfox/server/data/lib/Lib/test/test_bastion.py +3 -0
  514. data/lib/rubyfox/server/data/lib/Lib/test/test_binascii.py +119 -0
  515. data/lib/rubyfox/server/data/lib/Lib/test/test_binhex.py +50 -0
  516. data/lib/rubyfox/server/data/lib/Lib/test/test_binop.py +328 -0
  517. data/lib/rubyfox/server/data/lib/Lib/test/test_bisect.py +127 -0
  518. data/lib/rubyfox/server/data/lib/Lib/test/test_bsddb.py +76 -0
  519. data/lib/rubyfox/server/data/lib/Lib/test/test_bufio.py +60 -0
  520. data/lib/rubyfox/server/data/lib/Lib/test/test_bugfixes.py +31 -0
  521. data/lib/rubyfox/server/data/lib/Lib/test/test_builtin.py +13 -0
  522. data/lib/rubyfox/server/data/lib/Lib/test/test_calendar.py +61 -0
  523. data/lib/rubyfox/server/data/lib/Lib/test/test_call.py +131 -0
  524. data/lib/rubyfox/server/data/lib/Lib/test/test_capi.py +16 -0
  525. data/lib/rubyfox/server/data/lib/Lib/test/test_cd.py +26 -0
  526. data/lib/rubyfox/server/data/lib/Lib/test/test_cfgparser.py +284 -0
  527. data/lib/rubyfox/server/data/lib/Lib/test/test_cgi.py +188 -0
  528. data/lib/rubyfox/server/data/lib/Lib/test/test_charmapcodec.py +43 -0
  529. data/lib/rubyfox/server/data/lib/Lib/test/test_cl.py +78 -0
  530. data/lib/rubyfox/server/data/lib/Lib/test/test_class.py +317 -0
  531. data/lib/rubyfox/server/data/lib/Lib/test/test_cmath.py +35 -0
  532. data/lib/rubyfox/server/data/lib/Lib/test/test_codecs.py +31 -0
  533. data/lib/rubyfox/server/data/lib/Lib/test/test_codeop.py +190 -0
  534. data/lib/rubyfox/server/data/lib/Lib/test/test_coercion.py +118 -0
  535. data/lib/rubyfox/server/data/lib/Lib/test/test_commands.py +52 -0
  536. data/lib/rubyfox/server/data/lib/Lib/test/test_compare.py +56 -0
  537. data/lib/rubyfox/server/data/lib/Lib/test/test_compile.py +129 -0
  538. data/lib/rubyfox/server/data/lib/Lib/test/test_complex.py +68 -0
  539. data/lib/rubyfox/server/data/lib/Lib/test/test_contains.py +133 -0
  540. data/lib/rubyfox/server/data/lib/Lib/test/test_cookie.py +47 -0
  541. data/lib/rubyfox/server/data/lib/Lib/test/test_copy_reg.py +30 -0
  542. data/lib/rubyfox/server/data/lib/Lib/test/test_cpickle.py +81 -0
  543. data/lib/rubyfox/server/data/lib/Lib/test/test_crypt.py +11 -0
  544. data/lib/rubyfox/server/data/lib/Lib/test/test_curses.py +210 -0
  545. data/lib/rubyfox/server/data/lib/Lib/test/test_datetime.py +2958 -0
  546. data/lib/rubyfox/server/data/lib/Lib/test/test_dbm.py +43 -0
  547. data/lib/rubyfox/server/data/lib/Lib/test/test_descr.py +4094 -0
  548. data/lib/rubyfox/server/data/lib/Lib/test/test_descrtut.py +501 -0
  549. data/lib/rubyfox/server/data/lib/Lib/test/test_difflib.py +2 -0
  550. data/lib/rubyfox/server/data/lib/Lib/test/test_dircache.py +74 -0
  551. data/lib/rubyfox/server/data/lib/Lib/test/test_dl.py +33 -0
  552. data/lib/rubyfox/server/data/lib/Lib/test/test_doctest.py +2 -0
  553. data/lib/rubyfox/server/data/lib/Lib/test/test_doctest2.py +108 -0
  554. data/lib/rubyfox/server/data/lib/Lib/test/test_dospath.py +61 -0
  555. data/lib/rubyfox/server/data/lib/Lib/test/test_dumbdbm.py +79 -0
  556. data/lib/rubyfox/server/data/lib/Lib/test/test_email.py +13 -0
  557. data/lib/rubyfox/server/data/lib/Lib/test/test_email_codecs.py +11 -0
  558. data/lib/rubyfox/server/data/lib/Lib/test/test_enumerate.py +150 -0
  559. data/lib/rubyfox/server/data/lib/Lib/test/test_errno.py +49 -0
  560. data/lib/rubyfox/server/data/lib/Lib/test/test_exceptions.py +206 -0
  561. data/lib/rubyfox/server/data/lib/Lib/test/test_extcall.py +268 -0
  562. data/lib/rubyfox/server/data/lib/Lib/test/test_fcntl.py +53 -0
  563. data/lib/rubyfox/server/data/lib/Lib/test/test_file.py +63 -0
  564. data/lib/rubyfox/server/data/lib/Lib/test/test_fileinput.py +159 -0
  565. data/lib/rubyfox/server/data/lib/Lib/test/test_fnmatch.py +46 -0
  566. data/lib/rubyfox/server/data/lib/Lib/test/test_fork1.py +75 -0
  567. data/lib/rubyfox/server/data/lib/Lib/test/test_format.py +218 -0
  568. data/lib/rubyfox/server/data/lib/Lib/test/test_fpformat.py +75 -0
  569. data/lib/rubyfox/server/data/lib/Lib/test/test_frozen.py +26 -0
  570. data/lib/rubyfox/server/data/lib/Lib/test/test_funcattrs.py +384 -0
  571. data/lib/rubyfox/server/data/lib/Lib/test/test_future.py +47 -0
  572. data/lib/rubyfox/server/data/lib/Lib/test/test_future1.py +11 -0
  573. data/lib/rubyfox/server/data/lib/Lib/test/test_future2.py +10 -0
  574. data/lib/rubyfox/server/data/lib/Lib/test/test_future3.py +11 -0
  575. data/lib/rubyfox/server/data/lib/Lib/test/test_gc.py +346 -0
  576. data/lib/rubyfox/server/data/lib/Lib/test/test_gdbm.py +46 -0
  577. data/lib/rubyfox/server/data/lib/Lib/test/test_generators.py +1385 -0
  578. data/lib/rubyfox/server/data/lib/Lib/test/test_getargs.py +26 -0
  579. data/lib/rubyfox/server/data/lib/Lib/test/test_getopt.py +110 -0
  580. data/lib/rubyfox/server/data/lib/Lib/test/test_gettext.py +200 -0
  581. data/lib/rubyfox/server/data/lib/Lib/test/test_gl.py +150 -0
  582. data/lib/rubyfox/server/data/lib/Lib/test/test_glob.py +115 -0
  583. data/lib/rubyfox/server/data/lib/Lib/test/test_global.py +51 -0
  584. data/lib/rubyfox/server/data/lib/Lib/test/test_grammar.py +732 -0
  585. data/lib/rubyfox/server/data/lib/Lib/test/test_grp.py +27 -0
  586. data/lib/rubyfox/server/data/lib/Lib/test/test_gzip.py +82 -0
  587. data/lib/rubyfox/server/data/lib/Lib/test/test_hash.py +36 -0
  588. data/lib/rubyfox/server/data/lib/Lib/test/test_hmac.py +108 -0
  589. data/lib/rubyfox/server/data/lib/Lib/test/test_hotshot.py +117 -0
  590. data/lib/rubyfox/server/data/lib/Lib/test/test_htmllib.py +42 -0
  591. data/lib/rubyfox/server/data/lib/Lib/test/test_htmlparser.py +294 -0
  592. data/lib/rubyfox/server/data/lib/Lib/test/test_httplib.py +58 -0
  593. data/lib/rubyfox/server/data/lib/Lib/test/test_imageop.py +171 -0
  594. data/lib/rubyfox/server/data/lib/Lib/test/test_imgfile.py +116 -0
  595. data/lib/rubyfox/server/data/lib/Lib/test/test_import.py +71 -0
  596. data/lib/rubyfox/server/data/lib/Lib/test/test_importhooks.py +215 -0
  597. data/lib/rubyfox/server/data/lib/Lib/test/test_inspect.py +365 -0
  598. data/lib/rubyfox/server/data/lib/Lib/test/test_iter.py +784 -0
  599. data/lib/rubyfox/server/data/lib/Lib/test/test_janoninner.py +15 -0
  600. data/lib/rubyfox/server/data/lib/Lib/test/test_javalist.py +53 -0
  601. data/lib/rubyfox/server/data/lib/Lib/test/test_javashell.py +182 -0
  602. data/lib/rubyfox/server/data/lib/Lib/test/test_jbasic.py +119 -0
  603. data/lib/rubyfox/server/data/lib/Lib/test/test_joverload.py +138 -0
  604. data/lib/rubyfox/server/data/lib/Lib/test/test_jreload.py +33 -0
  605. data/lib/rubyfox/server/data/lib/Lib/test/test_jser.py +57 -0
  606. data/lib/rubyfox/server/data/lib/Lib/test/test_jser2.py +93 -0
  607. data/lib/rubyfox/server/data/lib/Lib/test/test_jsubclass.py +49 -0
  608. data/lib/rubyfox/server/data/lib/Lib/test/test_jy_compile.py +168 -0
  609. data/lib/rubyfox/server/data/lib/Lib/test/test_jy_generators.py +165 -0
  610. data/lib/rubyfox/server/data/lib/Lib/test/test_jy_internals.py +130 -0
  611. data/lib/rubyfox/server/data/lib/Lib/test/test_largefile.py +169 -0
  612. data/lib/rubyfox/server/data/lib/Lib/test/test_linuxaudiodev.py +89 -0
  613. data/lib/rubyfox/server/data/lib/Lib/test/test_locale.py +44 -0
  614. data/lib/rubyfox/server/data/lib/Lib/test/test_long.py +445 -0
  615. data/lib/rubyfox/server/data/lib/Lib/test/test_long_future.py +55 -0
  616. data/lib/rubyfox/server/data/lib/Lib/test/test_long_int_args.py +61 -0
  617. data/lib/rubyfox/server/data/lib/Lib/test/test_longexp.py +16 -0
  618. data/lib/rubyfox/server/data/lib/Lib/test/test_mailbox.py +113 -0
  619. data/lib/rubyfox/server/data/lib/Lib/test/test_marshal.py +44 -0
  620. data/lib/rubyfox/server/data/lib/Lib/test/test_math.py +153 -0
  621. data/lib/rubyfox/server/data/lib/Lib/test/test_md5.py +30 -0
  622. data/lib/rubyfox/server/data/lib/Lib/test/test_methods.py +62 -0
  623. data/lib/rubyfox/server/data/lib/Lib/test/test_mhlib.py +353 -0
  624. data/lib/rubyfox/server/data/lib/Lib/test/test_mimetools.py +18 -0
  625. data/lib/rubyfox/server/data/lib/Lib/test/test_mimetypes.py +59 -0
  626. data/lib/rubyfox/server/data/lib/Lib/test/test_minidom.py +648 -0
  627. data/lib/rubyfox/server/data/lib/Lib/test/test_mmap.py +317 -0
  628. data/lib/rubyfox/server/data/lib/Lib/test/test_module.py +77 -0
  629. data/lib/rubyfox/server/data/lib/Lib/test/test_multifile.py +66 -0
  630. data/lib/rubyfox/server/data/lib/Lib/test/test_mutants.py +285 -0
  631. data/lib/rubyfox/server/data/lib/Lib/test/test_netrc.py +42 -0
  632. data/lib/rubyfox/server/data/lib/Lib/test/test_new.py +108 -0
  633. data/lib/rubyfox/server/data/lib/Lib/test/test_nis.py +32 -0
  634. data/lib/rubyfox/server/data/lib/Lib/test/test_ntpath.py +114 -0
  635. data/lib/rubyfox/server/data/lib/Lib/test/test_opcodes.py +65 -0
  636. data/lib/rubyfox/server/data/lib/Lib/test/test_openpty.py +21 -0
  637. data/lib/rubyfox/server/data/lib/Lib/test/test_operations.py +475 -0
  638. data/lib/rubyfox/server/data/lib/Lib/test/test_operator.py +218 -0
  639. data/lib/rubyfox/server/data/lib/Lib/test/test_os.py +187 -0
  640. data/lib/rubyfox/server/data/lib/Lib/test/test_parser.py +383 -0
  641. data/lib/rubyfox/server/data/lib/Lib/test/test_pep247.py +50 -0
  642. data/lib/rubyfox/server/data/lib/Lib/test/test_pickle.py +40 -0
  643. data/lib/rubyfox/server/data/lib/Lib/test/test_pkg.py +259 -0
  644. data/lib/rubyfox/server/data/lib/Lib/test/test_pkgimport.py +84 -0
  645. data/lib/rubyfox/server/data/lib/Lib/test/test_poll.py +3 -0
  646. data/lib/rubyfox/server/data/lib/Lib/test/test_popen2.py +72 -0
  647. data/lib/rubyfox/server/data/lib/Lib/test/test_posixpath.py +40 -0
  648. data/lib/rubyfox/server/data/lib/Lib/test/test_pow.py +107 -0
  649. data/lib/rubyfox/server/data/lib/Lib/test/test_pprint.py +104 -0
  650. data/lib/rubyfox/server/data/lib/Lib/test/test_profile.py +86 -0
  651. data/lib/rubyfox/server/data/lib/Lib/test/test_profilehooks.py +360 -0
  652. data/lib/rubyfox/server/data/lib/Lib/test/test_pty.py +98 -0
  653. data/lib/rubyfox/server/data/lib/Lib/test/test_pwd.py +71 -0
  654. data/lib/rubyfox/server/data/lib/Lib/test/test_pyclbr.py +154 -0
  655. data/lib/rubyfox/server/data/lib/Lib/test/test_pyexpat.py +202 -0
  656. data/lib/rubyfox/server/data/lib/Lib/test/test_queue.py +158 -0
  657. data/lib/rubyfox/server/data/lib/Lib/test/test_quopri.py +157 -0
  658. data/lib/rubyfox/server/data/lib/Lib/test/test_random.py +19 -0
  659. data/lib/rubyfox/server/data/lib/Lib/test/test_re.py +304 -0
  660. data/lib/rubyfox/server/data/lib/Lib/test/test_regex.py +113 -0
  661. data/lib/rubyfox/server/data/lib/Lib/test/test_repr.py +278 -0
  662. data/lib/rubyfox/server/data/lib/Lib/test/test_rfc822.py +211 -0
  663. data/lib/rubyfox/server/data/lib/Lib/test/test_rgbimg.py +63 -0
  664. data/lib/rubyfox/server/data/lib/Lib/test/test_richcmp.py +261 -0
  665. data/lib/rubyfox/server/data/lib/Lib/test/test_rotor.py +28 -0
  666. data/lib/rubyfox/server/data/lib/Lib/test/test_sax.py +727 -0
  667. data/lib/rubyfox/server/data/lib/Lib/test/test_scope.py +530 -0
  668. data/lib/rubyfox/server/data/lib/Lib/test/test_select.py +228 -0
  669. data/lib/rubyfox/server/data/lib/Lib/test/test_select_new.py +229 -0
  670. data/lib/rubyfox/server/data/lib/Lib/test/test_sets.py +793 -0
  671. data/lib/rubyfox/server/data/lib/Lib/test/test_sgmllib.py +314 -0
  672. data/lib/rubyfox/server/data/lib/Lib/test/test_sha.py +52 -0
  673. data/lib/rubyfox/server/data/lib/Lib/test/test_signal.py +66 -0
  674. data/lib/rubyfox/server/data/lib/Lib/test/test_socket.py +1116 -0
  675. data/lib/rubyfox/server/data/lib/Lib/test/test_socket_ssl.py +27 -0
  676. data/lib/rubyfox/server/data/lib/Lib/test/test_socketserver.py +165 -0
  677. data/lib/rubyfox/server/data/lib/Lib/test/test_sre.py +434 -0
  678. data/lib/rubyfox/server/data/lib/Lib/test/test_str2unicode.py +90 -0
  679. data/lib/rubyfox/server/data/lib/Lib/test/test_strftime.py +146 -0
  680. data/lib/rubyfox/server/data/lib/Lib/test/test_string.py +223 -0
  681. data/lib/rubyfox/server/data/lib/Lib/test/test_strop.py +133 -0
  682. data/lib/rubyfox/server/data/lib/Lib/test/test_struct.py +441 -0
  683. data/lib/rubyfox/server/data/lib/Lib/test/test_structseq.py +28 -0
  684. data/lib/rubyfox/server/data/lib/Lib/test/test_subclasses.py +204 -0
  685. data/lib/rubyfox/server/data/lib/Lib/test/test_sunaudiodev.py +28 -0
  686. data/lib/rubyfox/server/data/lib/Lib/test/test_sundry.py +102 -0
  687. data/lib/rubyfox/server/data/lib/Lib/test/test_support.py +265 -0
  688. data/lib/rubyfox/server/data/lib/Lib/test/test_symtable.py +8 -0
  689. data/lib/rubyfox/server/data/lib/Lib/test/test_tempfile.py +10 -0
  690. data/lib/rubyfox/server/data/lib/Lib/test/test_thread.py +116 -0
  691. data/lib/rubyfox/server/data/lib/Lib/test/test_threaded_import.py +56 -0
  692. data/lib/rubyfox/server/data/lib/Lib/test/test_threadedtempfile.py +86 -0
  693. data/lib/rubyfox/server/data/lib/Lib/test/test_threading.py +55 -0
  694. data/lib/rubyfox/server/data/lib/Lib/test/test_time.py +47 -0
  695. data/lib/rubyfox/server/data/lib/Lib/test/test_timing.py +21 -0
  696. data/lib/rubyfox/server/data/lib/Lib/test/test_tokenize.py +9 -0
  697. data/lib/rubyfox/server/data/lib/Lib/test/test_trace.py +219 -0
  698. data/lib/rubyfox/server/data/lib/Lib/test/test_traceback.py +49 -0
  699. data/lib/rubyfox/server/data/lib/Lib/test/test_types.py +762 -0
  700. data/lib/rubyfox/server/data/lib/Lib/test/test_ucn.py +113 -0
  701. data/lib/rubyfox/server/data/lib/Lib/test/test_unary.py +58 -0
  702. data/lib/rubyfox/server/data/lib/Lib/test/test_unicode.py +815 -0
  703. data/lib/rubyfox/server/data/lib/Lib/test/test_unicode_file.py +95 -0
  704. data/lib/rubyfox/server/data/lib/Lib/test/test_unicodedata.py +125 -0
  705. data/lib/rubyfox/server/data/lib/Lib/test/test_unpack.py +105 -0
  706. data/lib/rubyfox/server/data/lib/Lib/test/test_urllib.py +109 -0
  707. data/lib/rubyfox/server/data/lib/Lib/test/test_urllib2.py +31 -0
  708. data/lib/rubyfox/server/data/lib/Lib/test/test_urlparse.py +94 -0
  709. data/lib/rubyfox/server/data/lib/Lib/test/test_userdict.py +120 -0
  710. data/lib/rubyfox/server/data/lib/Lib/test/test_userlist.py +269 -0
  711. data/lib/rubyfox/server/data/lib/Lib/test/test_userstring.py +43 -0
  712. data/lib/rubyfox/server/data/lib/Lib/test/test_uu.py +158 -0
  713. data/lib/rubyfox/server/data/lib/Lib/test/test_wave.py +34 -0
  714. data/lib/rubyfox/server/data/lib/Lib/test/test_weakref.py +573 -0
  715. data/lib/rubyfox/server/data/lib/Lib/test/test_winreg.py +151 -0
  716. data/lib/rubyfox/server/data/lib/Lib/test/test_winsound.py +6 -0
  717. data/lib/rubyfox/server/data/lib/Lib/test/test_xmllib.py +35 -0
  718. data/lib/rubyfox/server/data/lib/Lib/test/test_xmlrpc.py +37 -0
  719. data/lib/rubyfox/server/data/lib/Lib/test/test_xreadline.py +43 -0
  720. data/lib/rubyfox/server/data/lib/Lib/test/test_zipfile.py +78 -0
  721. data/lib/rubyfox/server/data/lib/Lib/test/test_zlib.py +482 -0
  722. data/lib/rubyfox/server/data/lib/Lib/test/testall.py +43 -0
  723. data/lib/rubyfox/server/data/lib/Lib/test/testcodec.py +48 -0
  724. data/lib/rubyfox/server/data/lib/Lib/test/testimg.uue +1170 -0
  725. data/lib/rubyfox/server/data/lib/Lib/test/testimgr.uue +1170 -0
  726. data/lib/rubyfox/server/data/lib/Lib/test/testrgb.uue +971 -0
  727. data/lib/rubyfox/server/data/lib/Lib/test/tokenize_tests.py +175 -0
  728. data/lib/rubyfox/server/data/lib/Lib/test/whrandom.py +96 -0
  729. data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/dbextstest.py +266 -0
  730. data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/jndi.py +33 -0
  731. data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/runner.py +204 -0
  732. data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/sptest.py +227 -0
  733. data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/test.xml +363 -0
  734. data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/test_zxjdbc_dbapi20.py +26 -0
  735. data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/zxtest.py +1242 -0
  736. data/lib/rubyfox/server/data/lib/Lib/this.py +28 -0
  737. data/lib/rubyfox/server/data/lib/Lib/threading.py +698 -0
  738. data/lib/rubyfox/server/data/lib/Lib/token$py.class +0 -0
  739. data/lib/rubyfox/server/data/lib/Lib/token.py +140 -0
  740. data/lib/rubyfox/server/data/lib/Lib/tokenize$py.class +0 -0
  741. data/lib/rubyfox/server/data/lib/Lib/tokenize.py +287 -0
  742. data/lib/rubyfox/server/data/lib/Lib/traceback$py.class +0 -0
  743. data/lib/rubyfox/server/data/lib/Lib/traceback.py +301 -0
  744. data/lib/rubyfox/server/data/lib/Lib/tzparse.py +98 -0
  745. data/lib/rubyfox/server/data/lib/Lib/unittest.py +723 -0
  746. data/lib/rubyfox/server/data/lib/Lib/urllib.py +1465 -0
  747. data/lib/rubyfox/server/data/lib/Lib/urllib2.py +1144 -0
  748. data/lib/rubyfox/server/data/lib/Lib/urlparse.py +276 -0
  749. data/lib/rubyfox/server/data/lib/Lib/user.py +45 -0
  750. data/lib/rubyfox/server/data/lib/Lib/uu.py +195 -0
  751. data/lib/rubyfox/server/data/lib/Lib/warnings$py.class +0 -0
  752. data/lib/rubyfox/server/data/lib/Lib/warnings.py +258 -0
  753. data/lib/rubyfox/server/data/lib/Lib/weakref.py +280 -0
  754. data/lib/rubyfox/server/data/lib/Lib/whichdb.py +87 -0
  755. data/lib/rubyfox/server/data/lib/Lib/whrandom.py +140 -0
  756. data/lib/rubyfox/server/data/lib/Lib/xdrlib.py +285 -0
  757. data/lib/rubyfox/server/data/lib/Lib/xml/FtCore.py +58 -0
  758. data/lib/rubyfox/server/data/lib/Lib/xml/Uri.py +380 -0
  759. data/lib/rubyfox/server/data/lib/Lib/xml/__init__.py +41 -0
  760. data/lib/rubyfox/server/data/lib/Lib/xml/dom/MessageSource.py +54 -0
  761. data/lib/rubyfox/server/data/lib/Lib/xml/dom/NodeFilter.py +27 -0
  762. data/lib/rubyfox/server/data/lib/Lib/xml/dom/__init__.py +232 -0
  763. data/lib/rubyfox/server/data/lib/Lib/xml/dom/domreg.py +99 -0
  764. data/lib/rubyfox/server/data/lib/Lib/xml/dom/minicompat.py +184 -0
  765. data/lib/rubyfox/server/data/lib/Lib/xml/dom/minidom.py +1943 -0
  766. data/lib/rubyfox/server/data/lib/Lib/xml/dom/pulldom.py +350 -0
  767. data/lib/rubyfox/server/data/lib/Lib/xml/dom/xmlbuilder.py +388 -0
  768. data/lib/rubyfox/server/data/lib/Lib/xml/sax/__init__.py +102 -0
  769. data/lib/rubyfox/server/data/lib/Lib/xml/sax/_exceptions.py +127 -0
  770. data/lib/rubyfox/server/data/lib/Lib/xml/sax/drivers2/__init__.py +1 -0
  771. data/lib/rubyfox/server/data/lib/Lib/xml/sax/drivers2/drv_javasax.py +333 -0
  772. data/lib/rubyfox/server/data/lib/Lib/xml/sax/handler.py +345 -0
  773. data/lib/rubyfox/server/data/lib/Lib/xml/sax/saxlib.py +430 -0
  774. data/lib/rubyfox/server/data/lib/Lib/xml/sax/saxutils.py +813 -0
  775. data/lib/rubyfox/server/data/lib/Lib/xml/sax/xmlreader.py +378 -0
  776. data/lib/rubyfox/server/data/lib/Lib/xmllib.py +926 -0
  777. data/lib/rubyfox/server/data/lib/Lib/xmlrpclib.py +1019 -0
  778. data/lib/rubyfox/server/data/lib/Lib/zipfile.py +586 -0
  779. data/lib/rubyfox/server/data/lib/Lib/zlib.py +156 -0
  780. data/lib/rubyfox/server/data/lib/boot.jar +0 -0
  781. data/lib/rubyfox/server/data/lib/cachedir/.keep +0 -0
  782. data/lib/rubyfox/server/data/lib/commons-beanutils-1.7.0.jar +0 -0
  783. data/lib/rubyfox/server/data/lib/commons-collections-3.2.1.jar +0 -0
  784. data/lib/rubyfox/server/data/lib/commons-dbcp-1.4.jar +0 -0
  785. data/lib/rubyfox/server/data/lib/commons-io-1.4.jar +0 -0
  786. data/lib/rubyfox/server/data/lib/commons-lang-2.4.jar +0 -0
  787. data/lib/rubyfox/server/data/lib/commons-logging-1.1.1.jar +0 -0
  788. data/lib/rubyfox/server/data/lib/commons-pool-1.5.4.jar +0 -0
  789. data/lib/rubyfox/server/data/lib/commons-vfs-1.0.jar +0 -0
  790. data/lib/rubyfox/server/data/lib/ezmorph-1.0.6.jar +0 -0
  791. data/lib/rubyfox/server/data/lib/httpclient-4.0.3.jar +0 -0
  792. data/lib/rubyfox/server/data/lib/httpcore-4.0.1.jar +0 -0
  793. data/lib/rubyfox/server/data/lib/imap.jar +0 -0
  794. data/lib/rubyfox/server/data/lib/jconsole/COPYING.txt +504 -0
  795. data/lib/rubyfox/server/data/lib/jconsole/bug_test_case.py +49 -0
  796. data/lib/rubyfox/server/data/lib/jconsole/console$py.class +0 -0
  797. data/lib/rubyfox/server/data/lib/jconsole/console.py +439 -0
  798. data/lib/rubyfox/server/data/lib/jconsole/history$py.class +0 -0
  799. data/lib/rubyfox/server/data/lib/jconsole/history.py +82 -0
  800. data/lib/rubyfox/server/data/lib/jconsole/history_test_case.py +133 -0
  801. data/lib/rubyfox/server/data/lib/jconsole/introspect$py.class +0 -0
  802. data/lib/rubyfox/server/data/lib/jconsole/introspect.py +373 -0
  803. data/lib/rubyfox/server/data/lib/jconsole/introspect_test_case.py +19 -0
  804. data/lib/rubyfox/server/data/lib/jconsole/issue_17_test_case.py +36 -0
  805. data/lib/rubyfox/server/data/lib/jconsole/jintrospect$py.class +0 -0
  806. data/lib/rubyfox/server/data/lib/jconsole/jintrospect.py +316 -0
  807. data/lib/rubyfox/server/data/lib/jconsole/jintrospect_test_case.py +107 -0
  808. data/lib/rubyfox/server/data/lib/jconsole/popup$py.class +0 -0
  809. data/lib/rubyfox/server/data/lib/jconsole/popup.py +178 -0
  810. data/lib/rubyfox/server/data/lib/jconsole/run_tests.py +8 -0
  811. data/lib/rubyfox/server/data/lib/jconsole/static_test_case.py +36 -0
  812. data/lib/rubyfox/server/data/lib/jconsole/testcase.py +38 -0
  813. data/lib/rubyfox/server/data/lib/jconsole/tip$py.class +0 -0
  814. data/lib/rubyfox/server/data/lib/jconsole/tip.py +47 -0
  815. data/lib/rubyfox/server/data/lib/jmx-util-1.2.3.jar +0 -0
  816. data/lib/rubyfox/server/data/lib/joda-time-1.6.jar +0 -0
  817. data/lib/rubyfox/server/data/lib/js.jar +0 -0
  818. data/lib/rubyfox/server/data/lib/json-lib-2.2.3-jdk15.jar +0 -0
  819. data/lib/rubyfox/server/data/lib/jython.jar +0 -0
  820. data/lib/rubyfox/server/data/lib/log4j-1.2.15.jar +0 -0
  821. data/lib/rubyfox/server/data/lib/logs-backup-app.jar +0 -0
  822. data/lib/rubyfox/server/data/lib/mailapi.jar +0 -0
  823. data/lib/rubyfox/server/data/lib/pop3.jar +0 -0
  824. data/lib/rubyfox/server/data/lib/scala-library.jar +0 -0
  825. data/lib/rubyfox/server/data/lib/sfs2x-admin.jar +0 -0
  826. data/lib/rubyfox/server/data/lib/sfs2x-core.jar +0 -0
  827. data/lib/rubyfox/server/data/lib/sfs2x-util.jar +0 -0
  828. data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
  829. data/lib/rubyfox/server/data/lib/slf4j-api-1.5.10.jar +0 -0
  830. data/lib/rubyfox/server/data/lib/slf4j-log4j12.jar +0 -0
  831. data/lib/rubyfox/server/data/lib/smtp.jar +0 -0
  832. data/lib/rubyfox/server/data/lib/terracotta-api-1.1.1.jar +0 -0
  833. data/lib/rubyfox/server/data/lib/ws-engine.jar +0 -0
  834. data/lib/rubyfox/server/data/lib/xpp3_min-1.1.4c.jar +0 -0
  835. data/lib/rubyfox/server/data/lib/xstream-1.3.1.jar +0 -0
  836. data/lib/rubyfox/server/data/logs/.keep +0 -0
  837. data/lib/rubyfox/server/data/logs/bluebox/.keep +0 -0
  838. data/lib/rubyfox/server/data/logs/boot/.keep +0 -0
  839. data/lib/rubyfox/server/data/logs/http/.keep +0 -0
  840. data/lib/rubyfox/server/data/logs/smartfox.log +295 -0
  841. data/lib/rubyfox/server/data/root/.keep +0 -0
  842. data/lib/rubyfox/server/data/root/_css_/default.css +170 -0
  843. data/lib/rubyfox/server/data/root/_css_/reset.css +49 -0
  844. data/lib/rubyfox/server/data/root/_images_/background_gradient.png +0 -0
  845. data/lib/rubyfox/server/data/root/_images_/background_logo.png +0 -0
  846. data/lib/rubyfox/server/data/root/_images_/favicon.png +0 -0
  847. data/lib/rubyfox/server/data/root/_images_/logo_smartfoxserver.png +0 -0
  848. data/lib/rubyfox/server/data/root/admin/.keep +0 -0
  849. data/lib/rubyfox/server/data/root/admin/AdminTool.html +108 -0
  850. data/lib/rubyfox/server/data/root/admin/AdminTool.swf +0 -0
  851. data/lib/rubyfox/server/data/root/admin/ReleaseNotes.txt +29 -0
  852. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/adobeFlashPlayer.png +0 -0
  853. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/advanced.png +0 -0
  854. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/banManager.png +0 -0
  855. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/bannedIPs.png +0 -0
  856. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/bannedUsernames.png +0 -0
  857. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/bookmarks.png +0 -0
  858. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/bootLog.png +0 -0
  859. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/buddyList.png +0 -0
  860. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/buddyProperties.png +0 -0
  861. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/connection.png +0 -0
  862. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/databaseManager.png +0 -0
  863. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/floodFilter.png +0 -0
  864. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/gameSettings.png +0 -0
  865. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/general.png +0 -0
  866. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/globalServerStatus.png +0 -0
  867. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/iPFilter.png +0 -0
  868. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/jVMSettings.png +0 -0
  869. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/logsDownload.png +0 -0
  870. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/mailer.png +0 -0
  871. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/permissionsAndEvents.png +0 -0
  872. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/privilegeManager.png +0 -0
  873. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/remoteAdmin.png +0 -0
  874. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/roomExtension.png +0 -0
  875. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/roomVariables.png +0 -0
  876. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/roomsAndGroups.png +0 -0
  877. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/runtimeLog.png +0 -0
  878. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/runtimeRoomSettings.png +0 -0
  879. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/runtimeUserSettings.png +0 -0
  880. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/runtimeZoneSettings.png +0 -0
  881. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/systemQueueStatus.png +0 -0
  882. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/userManagement.png +0 -0
  883. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/userVariables.png +0 -0
  884. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/usersTraffic.png +0 -0
  885. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/webServer.png +0 -0
  886. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/wordsFilter.png +0 -0
  887. data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/zoneExtension.png +0 -0
  888. data/lib/rubyfox/server/data/root/admin/index.html +108 -0
  889. data/lib/rubyfox/server/data/root/admin/modules/BanManager/BanManager.swf +0 -0
  890. data/lib/rubyfox/server/data/root/admin/modules/BanManager/icon.png +0 -0
  891. data/lib/rubyfox/server/data/root/admin/modules/BlueBoxMonitor/BlueBoxMonitor.swf +0 -0
  892. data/lib/rubyfox/server/data/root/admin/modules/BlueBoxMonitor/icon.png +0 -0
  893. data/lib/rubyfox/server/data/root/admin/modules/LicenseManager/LicenseManager.swf +0 -0
  894. data/lib/rubyfox/server/data/root/admin/modules/LicenseManager/icon.png +0 -0
  895. data/lib/rubyfox/server/data/root/admin/modules/LogViewer/LogViewer.swf +0 -0
  896. data/lib/rubyfox/server/data/root/admin/modules/LogViewer/icon.png +0 -0
  897. data/lib/rubyfox/server/data/root/admin/modules/RuntimeStatistics/RuntimeStatistics.swf +0 -0
  898. data/lib/rubyfox/server/data/root/admin/modules/RuntimeStatistics/icon.png +0 -0
  899. data/lib/rubyfox/server/data/root/admin/modules/ServerConfigurator/ServerConfigurator.swf +0 -0
  900. data/lib/rubyfox/server/data/root/admin/modules/ServerConfigurator/icon.png +0 -0
  901. data/lib/rubyfox/server/data/root/admin/modules/ZoneConfigurator/ZoneConfigurator.swf +0 -0
  902. data/lib/rubyfox/server/data/root/admin/modules/ZoneConfigurator/icon.png +0 -0
  903. data/lib/rubyfox/server/data/root/admin/modules/ZoneMonitor/ZoneMonitor.swf +0 -0
  904. data/lib/rubyfox/server/data/root/admin/modules/ZoneMonitor/icon.png +0 -0
  905. data/lib/rubyfox/server/data/root/admin/modules/config.xml +12 -0
  906. data/lib/rubyfox/server/data/root/admin/playerProductInstall.swf +0 -0
  907. data/lib/rubyfox/server/data/root/admin/swfobject.js +777 -0
  908. data/lib/rubyfox/server/data/root/crossdomain.xml +6 -0
  909. data/lib/rubyfox/server/data/root/index.html +63 -0
  910. data/lib/rubyfox/server/data/sfs2x-service +435 -0
  911. data/lib/rubyfox/server/data/sfs2x-service.vmoptions +5 -0
  912. data/lib/rubyfox/server/data/sfs2x.sh +12 -0
  913. data/lib/rubyfox/server/data/www/.keep +0 -0
  914. data/lib/rubyfox/server/data/www/BlueBox.war +0 -0
  915. data/lib/rubyfox/server/data/www/root/_css_/default.css +170 -0
  916. data/lib/rubyfox/server/data/www/root/_css_/reset.css +49 -0
  917. data/lib/rubyfox/server/data/www/root/_images_/background_gradient.png +0 -0
  918. data/lib/rubyfox/server/data/www/root/_images_/background_logo.png +0 -0
  919. data/lib/rubyfox/server/data/www/root/_images_/favicon.png +0 -0
  920. data/lib/rubyfox/server/data/www/root/_images_/logo_smartfoxserver.png +0 -0
  921. data/lib/rubyfox/server/data/www/root/admin/.keep +0 -0
  922. data/lib/rubyfox/server/data/www/root/admin/AdminTool.html +108 -0
  923. data/lib/rubyfox/server/data/www/root/admin/AdminTool.swf +0 -0
  924. data/lib/rubyfox/server/data/www/root/admin/ReleaseNotes.txt +63 -0
  925. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/adobeFlashPlayer.png +0 -0
  926. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/advanced.png +0 -0
  927. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/banManager.png +0 -0
  928. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedIPs.png +0 -0
  929. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedUsernames.png +0 -0
  930. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bookmarks.png +0 -0
  931. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bootLog.png +0 -0
  932. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyList.png +0 -0
  933. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyProperties.png +0 -0
  934. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/connection.png +0 -0
  935. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/databaseManager.png +0 -0
  936. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/floodFilter.png +0 -0
  937. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/gameSettings.png +0 -0
  938. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/general.png +0 -0
  939. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/globalServerStatus.png +0 -0
  940. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/hTML5WebSockets.png +0 -0
  941. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPFilter.png +0 -0
  942. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/jVMSettings.png +0 -0
  943. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/logsDownload.png +0 -0
  944. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mailer.png +0 -0
  945. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/permissionsAndEvents.png +0 -0
  946. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/privilegeManager.png +0 -0
  947. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/remoteAdmin.png +0 -0
  948. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomExtension.png +0 -0
  949. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomVariables.png +0 -0
  950. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomsAndGroups.png +0 -0
  951. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeLog.png +0 -0
  952. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeRoomSettings.png +0 -0
  953. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeUserSettings.png +0 -0
  954. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeZoneSettings.png +0 -0
  955. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/systemQueueStatus.png +0 -0
  956. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userManagement.png +0 -0
  957. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userVariables.png +0 -0
  958. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/usersTraffic.png +0 -0
  959. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/webServer.png +0 -0
  960. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/wordsFilter.png +0 -0
  961. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneExtension.png +0 -0
  962. data/lib/rubyfox/server/data/www/root/admin/index.html +108 -0
  963. data/lib/rubyfox/server/data/www/root/admin/modules/BanManager/BanManager.swf +0 -0
  964. data/lib/rubyfox/server/data/www/root/admin/modules/BanManager/icon.png +0 -0
  965. data/lib/rubyfox/server/data/www/root/admin/modules/BlueBoxMonitor/BlueBoxMonitor.swf +0 -0
  966. data/lib/rubyfox/server/data/www/root/admin/modules/BlueBoxMonitor/icon.png +0 -0
  967. data/lib/rubyfox/server/data/www/root/admin/modules/Dashboard/Dashboard.swf +0 -0
  968. data/lib/rubyfox/server/data/www/root/admin/modules/Dashboard/icon.png +0 -0
  969. data/lib/rubyfox/server/data/www/root/admin/modules/LicenseManager/LicenseManager.swf +0 -0
  970. data/lib/rubyfox/server/data/www/root/admin/modules/LicenseManager/icon.png +0 -0
  971. data/lib/rubyfox/server/data/www/root/admin/modules/LogViewer/LogViewer.swf +0 -0
  972. data/lib/rubyfox/server/data/www/root/admin/modules/LogViewer/icon.png +0 -0
  973. data/lib/rubyfox/server/data/www/root/admin/modules/RuntimeStatistics/RuntimeStatistics.swf +0 -0
  974. data/lib/rubyfox/server/data/www/root/admin/modules/RuntimeStatistics/icon.png +0 -0
  975. data/lib/rubyfox/server/data/www/root/admin/modules/ServerConfigurator/ServerConfigurator.swf +0 -0
  976. data/lib/rubyfox/server/data/www/root/admin/modules/ServerConfigurator/icon.png +0 -0
  977. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneConfigurator/ZoneConfigurator.swf +0 -0
  978. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneConfigurator/icon.png +0 -0
  979. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneMonitor/ZoneMonitor.swf +0 -0
  980. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneMonitor/icon.png +0 -0
  981. data/lib/rubyfox/server/data/www/root/admin/modules/config.xml +12 -0
  982. data/lib/rubyfox/server/data/www/root/admin/playerProductInstall.swf +0 -0
  983. data/lib/rubyfox/server/data/www/root/admin/swfobject.js +777 -0
  984. data/lib/rubyfox/server/data/www/root/crossdomain.xml +6 -0
  985. data/lib/rubyfox/server/data/www/root/examples/.keep +0 -0
  986. data/lib/rubyfox/server/data/www/root/examples/index.html +43 -0
  987. data/lib/rubyfox/server/data/www/root/index.html +63 -0
  988. data/lib/rubyfox/server/data/zones/.keep +0 -0
  989. data/lib/rubyfox/server/environment.rb +31 -0
  990. data/lib/rubyfox/server/version.rb +5 -0
  991. data/lib/rubyfox/server.rb +9 -0
  992. data/rubyfox-server.gemspec +22 -0
  993. metadata +1076 -0
@@ -0,0 +1,1088 @@
1
+ #! /usr/bin/env python
2
+
3
+ from __future__ import generators
4
+
5
+ """
6
+ Module difflib -- helpers for computing deltas between objects.
7
+
8
+ Function get_close_matches(word, possibilities, n=3, cutoff=0.6):
9
+ Use SequenceMatcher to return list of the best "good enough" matches.
10
+
11
+ Function ndiff(a, b):
12
+ Return a delta: the difference between `a` and `b` (lists of strings).
13
+
14
+ Function restore(delta, which):
15
+ Return one of the two sequences that generated an ndiff delta.
16
+
17
+ Class SequenceMatcher:
18
+ A flexible class for comparing pairs of sequences of any type.
19
+
20
+ Class Differ:
21
+ For producing human-readable deltas from sequences of lines of text.
22
+ """
23
+
24
+ __all__ = ['get_close_matches', 'ndiff', 'restore', 'SequenceMatcher',
25
+ 'Differ', 'IS_CHARACTER_JUNK', 'IS_LINE_JUNK']
26
+
27
+ def _calculate_ratio(matches, length):
28
+ if length:
29
+ return 2.0 * matches / length
30
+ return 1.0
31
+
32
+ class SequenceMatcher:
33
+
34
+ """
35
+ SequenceMatcher is a flexible class for comparing pairs of sequences of
36
+ any type, so long as the sequence elements are hashable. The basic
37
+ algorithm predates, and is a little fancier than, an algorithm
38
+ published in the late 1980's by Ratcliff and Obershelp under the
39
+ hyperbolic name "gestalt pattern matching". The basic idea is to find
40
+ the longest contiguous matching subsequence that contains no "junk"
41
+ elements (R-O doesn't address junk). The same idea is then applied
42
+ recursively to the pieces of the sequences to the left and to the right
43
+ of the matching subsequence. This does not yield minimal edit
44
+ sequences, but does tend to yield matches that "look right" to people.
45
+
46
+ SequenceMatcher tries to compute a "human-friendly diff" between two
47
+ sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the
48
+ longest *contiguous* & junk-free matching subsequence. That's what
49
+ catches peoples' eyes. The Windows(tm) windiff has another interesting
50
+ notion, pairing up elements that appear uniquely in each sequence.
51
+ That, and the method here, appear to yield more intuitive difference
52
+ reports than does diff. This method appears to be the least vulnerable
53
+ to synching up on blocks of "junk lines", though (like blank lines in
54
+ ordinary text files, or maybe "<P>" lines in HTML files). That may be
55
+ because this is the only method of the 3 that has a *concept* of
56
+ "junk" <wink>.
57
+
58
+ Example, comparing two strings, and considering blanks to be "junk":
59
+
60
+ >>> s = SequenceMatcher(lambda x: x == " ",
61
+ ... "private Thread currentThread;",
62
+ ... "private volatile Thread currentThread;")
63
+ >>>
64
+
65
+ .ratio() returns a float in [0, 1], measuring the "similarity" of the
66
+ sequences. As a rule of thumb, a .ratio() value over 0.6 means the
67
+ sequences are close matches:
68
+
69
+ >>> print round(s.ratio(), 3)
70
+ 0.866
71
+ >>>
72
+
73
+ If you're only interested in where the sequences match,
74
+ .get_matching_blocks() is handy:
75
+
76
+ >>> for block in s.get_matching_blocks():
77
+ ... print "a[%d] and b[%d] match for %d elements" % block
78
+ a[0] and b[0] match for 8 elements
79
+ a[8] and b[17] match for 6 elements
80
+ a[14] and b[23] match for 15 elements
81
+ a[29] and b[38] match for 0 elements
82
+
83
+ Note that the last tuple returned by .get_matching_blocks() is always a
84
+ dummy, (len(a), len(b), 0), and this is the only case in which the last
85
+ tuple element (number of elements matched) is 0.
86
+
87
+ If you want to know how to change the first sequence into the second,
88
+ use .get_opcodes():
89
+
90
+ >>> for opcode in s.get_opcodes():
91
+ ... print "%6s a[%d:%d] b[%d:%d]" % opcode
92
+ equal a[0:8] b[0:8]
93
+ insert a[8:8] b[8:17]
94
+ equal a[8:14] b[17:23]
95
+ equal a[14:29] b[23:38]
96
+
97
+ See the Differ class for a fancy human-friendly file differencer, which
98
+ uses SequenceMatcher both to compare sequences of lines, and to compare
99
+ sequences of characters within similar (near-matching) lines.
100
+
101
+ See also function get_close_matches() in this module, which shows how
102
+ simple code building on SequenceMatcher can be used to do useful work.
103
+
104
+ Timing: Basic R-O is cubic time worst case and quadratic time expected
105
+ case. SequenceMatcher is quadratic time for the worst case and has
106
+ expected-case behavior dependent in a complicated way on how many
107
+ elements the sequences have in common; best case time is linear.
108
+
109
+ Methods:
110
+
111
+ __init__(isjunk=None, a='', b='')
112
+ Construct a SequenceMatcher.
113
+
114
+ set_seqs(a, b)
115
+ Set the two sequences to be compared.
116
+
117
+ set_seq1(a)
118
+ Set the first sequence to be compared.
119
+
120
+ set_seq2(b)
121
+ Set the second sequence to be compared.
122
+
123
+ find_longest_match(alo, ahi, blo, bhi)
124
+ Find longest matching block in a[alo:ahi] and b[blo:bhi].
125
+
126
+ get_matching_blocks()
127
+ Return list of triples describing matching subsequences.
128
+
129
+ get_opcodes()
130
+ Return list of 5-tuples describing how to turn a into b.
131
+
132
+ ratio()
133
+ Return a measure of the sequences' similarity (float in [0,1]).
134
+
135
+ quick_ratio()
136
+ Return an upper bound on .ratio() relatively quickly.
137
+
138
+ real_quick_ratio()
139
+ Return an upper bound on ratio() very quickly.
140
+ """
141
+
142
+ def __init__(self, isjunk=None, a='', b=''):
143
+ """Construct a SequenceMatcher.
144
+
145
+ Optional arg isjunk is None (the default), or a one-argument
146
+ function that takes a sequence element and returns true iff the
147
+ element is junk. None is equivalent to passing "lambda x: 0", i.e.
148
+ no elements are considered to be junk. For example, pass
149
+ lambda x: x in " \\t"
150
+ if you're comparing lines as sequences of characters, and don't
151
+ want to synch up on blanks or hard tabs.
152
+
153
+ Optional arg a is the first of two sequences to be compared. By
154
+ default, an empty string. The elements of a must be hashable. See
155
+ also .set_seqs() and .set_seq1().
156
+
157
+ Optional arg b is the second of two sequences to be compared. By
158
+ default, an empty string. The elements of b must be hashable. See
159
+ also .set_seqs() and .set_seq2().
160
+ """
161
+
162
+ # Members:
163
+ # a
164
+ # first sequence
165
+ # b
166
+ # second sequence; differences are computed as "what do
167
+ # we need to do to 'a' to change it into 'b'?"
168
+ # b2j
169
+ # for x in b, b2j[x] is a list of the indices (into b)
170
+ # at which x appears; junk elements do not appear
171
+ # b2jhas
172
+ # b2j.has_key
173
+ # fullbcount
174
+ # for x in b, fullbcount[x] == the number of times x
175
+ # appears in b; only materialized if really needed (used
176
+ # only for computing quick_ratio())
177
+ # matching_blocks
178
+ # a list of (i, j, k) triples, where a[i:i+k] == b[j:j+k];
179
+ # ascending & non-overlapping in i and in j; terminated by
180
+ # a dummy (len(a), len(b), 0) sentinel
181
+ # opcodes
182
+ # a list of (tag, i1, i2, j1, j2) tuples, where tag is
183
+ # one of
184
+ # 'replace' a[i1:i2] should be replaced by b[j1:j2]
185
+ # 'delete' a[i1:i2] should be deleted
186
+ # 'insert' b[j1:j2] should be inserted
187
+ # 'equal' a[i1:i2] == b[j1:j2]
188
+ # isjunk
189
+ # a user-supplied function taking a sequence element and
190
+ # returning true iff the element is "junk" -- this has
191
+ # subtle but helpful effects on the algorithm, which I'll
192
+ # get around to writing up someday <0.9 wink>.
193
+ # DON'T USE! Only __chain_b uses this. Use isbjunk.
194
+ # isbjunk
195
+ # for x in b, isbjunk(x) == isjunk(x) but much faster;
196
+ # it's really the has_key method of a hidden dict.
197
+ # DOES NOT WORK for x in a!
198
+
199
+ self.isjunk = isjunk
200
+ self.a = self.b = None
201
+ self.set_seqs(a, b)
202
+
203
+ def set_seqs(self, a, b):
204
+ """Set the two sequences to be compared.
205
+
206
+ >>> s = SequenceMatcher()
207
+ >>> s.set_seqs("abcd", "bcde")
208
+ >>> s.ratio()
209
+ 0.75
210
+ """
211
+
212
+ self.set_seq1(a)
213
+ self.set_seq2(b)
214
+
215
+ def set_seq1(self, a):
216
+ """Set the first sequence to be compared.
217
+
218
+ The second sequence to be compared is not changed.
219
+
220
+ >>> s = SequenceMatcher(None, "abcd", "bcde")
221
+ >>> s.ratio()
222
+ 0.75
223
+ >>> s.set_seq1("bcde")
224
+ >>> s.ratio()
225
+ 1.0
226
+ >>>
227
+
228
+ SequenceMatcher computes and caches detailed information about the
229
+ second sequence, so if you want to compare one sequence S against
230
+ many sequences, use .set_seq2(S) once and call .set_seq1(x)
231
+ repeatedly for each of the other sequences.
232
+
233
+ See also set_seqs() and set_seq2().
234
+ """
235
+
236
+ if a is self.a:
237
+ return
238
+ self.a = a
239
+ self.matching_blocks = self.opcodes = None
240
+
241
+ def set_seq2(self, b):
242
+ """Set the second sequence to be compared.
243
+
244
+ The first sequence to be compared is not changed.
245
+
246
+ >>> s = SequenceMatcher(None, "abcd", "bcde")
247
+ >>> s.ratio()
248
+ 0.75
249
+ >>> s.set_seq2("abcd")
250
+ >>> s.ratio()
251
+ 1.0
252
+ >>>
253
+
254
+ SequenceMatcher computes and caches detailed information about the
255
+ second sequence, so if you want to compare one sequence S against
256
+ many sequences, use .set_seq2(S) once and call .set_seq1(x)
257
+ repeatedly for each of the other sequences.
258
+
259
+ See also set_seqs() and set_seq1().
260
+ """
261
+
262
+ if b is self.b:
263
+ return
264
+ self.b = b
265
+ self.matching_blocks = self.opcodes = None
266
+ self.fullbcount = None
267
+ self.__chain_b()
268
+
269
+ # For each element x in b, set b2j[x] to a list of the indices in
270
+ # b where x appears; the indices are in increasing order; note that
271
+ # the number of times x appears in b is len(b2j[x]) ...
272
+ # when self.isjunk is defined, junk elements don't show up in this
273
+ # map at all, which stops the central find_longest_match method
274
+ # from starting any matching block at a junk element ...
275
+ # also creates the fast isbjunk function ...
276
+ # note that this is only called when b changes; so for cross-product
277
+ # kinds of matches, it's best to call set_seq2 once, then set_seq1
278
+ # repeatedly
279
+
280
+ def __chain_b(self):
281
+ # Because isjunk is a user-defined (not C) function, and we test
282
+ # for junk a LOT, it's important to minimize the number of calls.
283
+ # Before the tricks described here, __chain_b was by far the most
284
+ # time-consuming routine in the whole module! If anyone sees
285
+ # Jim Roskind, thank him again for profile.py -- I never would
286
+ # have guessed that.
287
+ # The first trick is to build b2j ignoring the possibility
288
+ # of junk. I.e., we don't call isjunk at all yet. Throwing
289
+ # out the junk later is much cheaper than building b2j "right"
290
+ # from the start.
291
+ b = self.b
292
+ self.b2j = b2j = {}
293
+ self.b2jhas = b2jhas = b2j.has_key
294
+ for i in xrange(len(b)):
295
+ elt = b[i]
296
+ if b2jhas(elt):
297
+ b2j[elt].append(i)
298
+ else:
299
+ b2j[elt] = [i]
300
+
301
+ # Now b2j.keys() contains elements uniquely, and especially when
302
+ # the sequence is a string, that's usually a good deal smaller
303
+ # than len(string). The difference is the number of isjunk calls
304
+ # saved.
305
+ isjunk, junkdict = self.isjunk, {}
306
+ if isjunk:
307
+ for elt in b2j.keys():
308
+ if isjunk(elt):
309
+ junkdict[elt] = 1 # value irrelevant; it's a set
310
+ del b2j[elt]
311
+
312
+ # Now for x in b, isjunk(x) == junkdict.has_key(x), but the
313
+ # latter is much faster. Note too that while there may be a
314
+ # lot of junk in the sequence, the number of *unique* junk
315
+ # elements is probably small. So the memory burden of keeping
316
+ # this dict alive is likely trivial compared to the size of b2j.
317
+ self.isbjunk = junkdict.has_key
318
+
319
+ def find_longest_match(self, alo, ahi, blo, bhi):
320
+ """Find longest matching block in a[alo:ahi] and b[blo:bhi].
321
+
322
+ If isjunk is not defined:
323
+
324
+ Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where
325
+ alo <= i <= i+k <= ahi
326
+ blo <= j <= j+k <= bhi
327
+ and for all (i',j',k') meeting those conditions,
328
+ k >= k'
329
+ i <= i'
330
+ and if i == i', j <= j'
331
+
332
+ In other words, of all maximal matching blocks, return one that
333
+ starts earliest in a, and of all those maximal matching blocks that
334
+ start earliest in a, return the one that starts earliest in b.
335
+
336
+ >>> s = SequenceMatcher(None, " abcd", "abcd abcd")
337
+ >>> s.find_longest_match(0, 5, 0, 9)
338
+ (0, 4, 5)
339
+
340
+ If isjunk is defined, first the longest matching block is
341
+ determined as above, but with the additional restriction that no
342
+ junk element appears in the block. Then that block is extended as
343
+ far as possible by matching (only) junk elements on both sides. So
344
+ the resulting block never matches on junk except as identical junk
345
+ happens to be adjacent to an "interesting" match.
346
+
347
+ Here's the same example as before, but considering blanks to be
348
+ junk. That prevents " abcd" from matching the " abcd" at the tail
349
+ end of the second sequence directly. Instead only the "abcd" can
350
+ match, and matches the leftmost "abcd" in the second sequence:
351
+
352
+ >>> s = SequenceMatcher(lambda x: x==" ", " abcd", "abcd abcd")
353
+ >>> s.find_longest_match(0, 5, 0, 9)
354
+ (1, 0, 4)
355
+
356
+ If no blocks match, return (alo, blo, 0).
357
+
358
+ >>> s = SequenceMatcher(None, "ab", "c")
359
+ >>> s.find_longest_match(0, 2, 0, 1)
360
+ (0, 0, 0)
361
+ """
362
+
363
+ # CAUTION: stripping common prefix or suffix would be incorrect.
364
+ # E.g.,
365
+ # ab
366
+ # acab
367
+ # Longest matching block is "ab", but if common prefix is
368
+ # stripped, it's "a" (tied with "b"). UNIX(tm) diff does so
369
+ # strip, so ends up claiming that ab is changed to acab by
370
+ # inserting "ca" in the middle. That's minimal but unintuitive:
371
+ # "it's obvious" that someone inserted "ac" at the front.
372
+ # Windiff ends up at the same place as diff, but by pairing up
373
+ # the unique 'b's and then matching the first two 'a's.
374
+
375
+ a, b, b2j, isbjunk = self.a, self.b, self.b2j, self.isbjunk
376
+ besti, bestj, bestsize = alo, blo, 0
377
+ # find longest junk-free match
378
+ # during an iteration of the loop, j2len[j] = length of longest
379
+ # junk-free match ending with a[i-1] and b[j]
380
+ j2len = {}
381
+ nothing = []
382
+ for i in xrange(alo, ahi):
383
+ # look at all instances of a[i] in b; note that because
384
+ # b2j has no junk keys, the loop is skipped if a[i] is junk
385
+ j2lenget = j2len.get
386
+ newj2len = {}
387
+ for j in b2j.get(a[i], nothing):
388
+ # a[i] matches b[j]
389
+ if j < blo:
390
+ continue
391
+ if j >= bhi:
392
+ break
393
+ k = newj2len[j] = j2lenget(j-1, 0) + 1
394
+ if k > bestsize:
395
+ besti, bestj, bestsize = i-k+1, j-k+1, k
396
+ j2len = newj2len
397
+
398
+ # Now that we have a wholly interesting match (albeit possibly
399
+ # empty!), we may as well suck up the matching junk on each
400
+ # side of it too. Can't think of a good reason not to, and it
401
+ # saves post-processing the (possibly considerable) expense of
402
+ # figuring out what to do with it. In the case of an empty
403
+ # interesting match, this is clearly the right thing to do,
404
+ # because no other kind of match is possible in the regions.
405
+ while besti > alo and bestj > blo and \
406
+ isbjunk(b[bestj-1]) and \
407
+ a[besti-1] == b[bestj-1]:
408
+ besti, bestj, bestsize = besti-1, bestj-1, bestsize+1
409
+ while besti+bestsize < ahi and bestj+bestsize < bhi and \
410
+ isbjunk(b[bestj+bestsize]) and \
411
+ a[besti+bestsize] == b[bestj+bestsize]:
412
+ bestsize = bestsize + 1
413
+
414
+ return besti, bestj, bestsize
415
+
416
+ def get_matching_blocks(self):
417
+ """Return list of triples describing matching subsequences.
418
+
419
+ Each triple is of the form (i, j, n), and means that
420
+ a[i:i+n] == b[j:j+n]. The triples are monotonically increasing in
421
+ i and in j.
422
+
423
+ The last triple is a dummy, (len(a), len(b), 0), and is the only
424
+ triple with n==0.
425
+
426
+ >>> s = SequenceMatcher(None, "abxcd", "abcd")
427
+ >>> s.get_matching_blocks()
428
+ [(0, 0, 2), (3, 2, 2), (5, 4, 0)]
429
+ """
430
+
431
+ if self.matching_blocks is not None:
432
+ return self.matching_blocks
433
+ self.matching_blocks = []
434
+ la, lb = len(self.a), len(self.b)
435
+ self.__helper(0, la, 0, lb, self.matching_blocks)
436
+ self.matching_blocks.append( (la, lb, 0) )
437
+ return self.matching_blocks
438
+
439
+ # builds list of matching blocks covering a[alo:ahi] and
440
+ # b[blo:bhi], appending them in increasing order to answer
441
+
442
+ def __helper(self, alo, ahi, blo, bhi, answer):
443
+ i, j, k = x = self.find_longest_match(alo, ahi, blo, bhi)
444
+ # a[alo:i] vs b[blo:j] unknown
445
+ # a[i:i+k] same as b[j:j+k]
446
+ # a[i+k:ahi] vs b[j+k:bhi] unknown
447
+ if k:
448
+ if alo < i and blo < j:
449
+ self.__helper(alo, i, blo, j, answer)
450
+ answer.append(x)
451
+ if i+k < ahi and j+k < bhi:
452
+ self.__helper(i+k, ahi, j+k, bhi, answer)
453
+
454
+ def get_opcodes(self):
455
+ """Return list of 5-tuples describing how to turn a into b.
456
+
457
+ Each tuple is of the form (tag, i1, i2, j1, j2). The first tuple
458
+ has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the
459
+ tuple preceding it, and likewise for j1 == the previous j2.
460
+
461
+ The tags are strings, with these meanings:
462
+
463
+ 'replace': a[i1:i2] should be replaced by b[j1:j2]
464
+ 'delete': a[i1:i2] should be deleted.
465
+ Note that j1==j2 in this case.
466
+ 'insert': b[j1:j2] should be inserted at a[i1:i1].
467
+ Note that i1==i2 in this case.
468
+ 'equal': a[i1:i2] == b[j1:j2]
469
+
470
+ >>> a = "qabxcd"
471
+ >>> b = "abycdf"
472
+ >>> s = SequenceMatcher(None, a, b)
473
+ >>> for tag, i1, i2, j1, j2 in s.get_opcodes():
474
+ ... print ("%7s a[%d:%d] (%s) b[%d:%d] (%s)" %
475
+ ... (tag, i1, i2, a[i1:i2], j1, j2, b[j1:j2]))
476
+ delete a[0:1] (q) b[0:0] ()
477
+ equal a[1:3] (ab) b[0:2] (ab)
478
+ replace a[3:4] (x) b[2:3] (y)
479
+ equal a[4:6] (cd) b[3:5] (cd)
480
+ insert a[6:6] () b[5:6] (f)
481
+ """
482
+
483
+ if self.opcodes is not None:
484
+ return self.opcodes
485
+ i = j = 0
486
+ self.opcodes = answer = []
487
+ for ai, bj, size in self.get_matching_blocks():
488
+ # invariant: we've pumped out correct diffs to change
489
+ # a[:i] into b[:j], and the next matching block is
490
+ # a[ai:ai+size] == b[bj:bj+size]. So we need to pump
491
+ # out a diff to change a[i:ai] into b[j:bj], pump out
492
+ # the matching block, and move (i,j) beyond the match
493
+ tag = ''
494
+ if i < ai and j < bj:
495
+ tag = 'replace'
496
+ elif i < ai:
497
+ tag = 'delete'
498
+ elif j < bj:
499
+ tag = 'insert'
500
+ if tag:
501
+ answer.append( (tag, i, ai, j, bj) )
502
+ i, j = ai+size, bj+size
503
+ # the list of matching blocks is terminated by a
504
+ # sentinel with size 0
505
+ if size:
506
+ answer.append( ('equal', ai, i, bj, j) )
507
+ return answer
508
+
509
+ def ratio(self):
510
+ """Return a measure of the sequences' similarity (float in [0,1]).
511
+
512
+ Where T is the total number of elements in both sequences, and
513
+ M is the number of matches, this is 2,0*M / T.
514
+ Note that this is 1 if the sequences are identical, and 0 if
515
+ they have nothing in common.
516
+
517
+ .ratio() is expensive to compute if you haven't already computed
518
+ .get_matching_blocks() or .get_opcodes(), in which case you may
519
+ want to try .quick_ratio() or .real_quick_ratio() first to get an
520
+ upper bound.
521
+
522
+ >>> s = SequenceMatcher(None, "abcd", "bcde")
523
+ >>> s.ratio()
524
+ 0.75
525
+ >>> s.quick_ratio()
526
+ 0.75
527
+ >>> s.real_quick_ratio()
528
+ 1.0
529
+ """
530
+
531
+ matches = reduce(lambda sum, triple: sum + triple[-1],
532
+ self.get_matching_blocks(), 0)
533
+ return _calculate_ratio(matches, len(self.a) + len(self.b))
534
+
535
+ def quick_ratio(self):
536
+ """Return an upper bound on ratio() relatively quickly.
537
+
538
+ This isn't defined beyond that it is an upper bound on .ratio(), and
539
+ is faster to compute.
540
+ """
541
+
542
+ # viewing a and b as multisets, set matches to the cardinality
543
+ # of their intersection; this counts the number of matches
544
+ # without regard to order, so is clearly an upper bound
545
+ if self.fullbcount is None:
546
+ self.fullbcount = fullbcount = {}
547
+ for elt in self.b:
548
+ fullbcount[elt] = fullbcount.get(elt, 0) + 1
549
+ fullbcount = self.fullbcount
550
+ # avail[x] is the number of times x appears in 'b' less the
551
+ # number of times we've seen it in 'a' so far ... kinda
552
+ avail = {}
553
+ availhas, matches = avail.has_key, 0
554
+ for elt in self.a:
555
+ if availhas(elt):
556
+ numb = avail[elt]
557
+ else:
558
+ numb = fullbcount.get(elt, 0)
559
+ avail[elt] = numb - 1
560
+ if numb > 0:
561
+ matches = matches + 1
562
+ return _calculate_ratio(matches, len(self.a) + len(self.b))
563
+
564
+ def real_quick_ratio(self):
565
+ """Return an upper bound on ratio() very quickly.
566
+
567
+ This isn't defined beyond that it is an upper bound on .ratio(), and
568
+ is faster to compute than either .ratio() or .quick_ratio().
569
+ """
570
+
571
+ la, lb = len(self.a), len(self.b)
572
+ # can't have more matches than the number of elements in the
573
+ # shorter sequence
574
+ return _calculate_ratio(min(la, lb), la + lb)
575
+
576
+ def get_close_matches(word, possibilities, n=3, cutoff=0.6):
577
+ """Use SequenceMatcher to return list of the best "good enough" matches.
578
+
579
+ word is a sequence for which close matches are desired (typically a
580
+ string).
581
+
582
+ possibilities is a list of sequences against which to match word
583
+ (typically a list of strings).
584
+
585
+ Optional arg n (default 3) is the maximum number of close matches to
586
+ return. n must be > 0.
587
+
588
+ Optional arg cutoff (default 0.6) is a float in [0, 1]. Possibilities
589
+ that don't score at least that similar to word are ignored.
590
+
591
+ The best (no more than n) matches among the possibilities are returned
592
+ in a list, sorted by similarity score, most similar first.
593
+
594
+ >>> get_close_matches("appel", ["ape", "apple", "peach", "puppy"])
595
+ ['apple', 'ape']
596
+ >>> import keyword as _keyword
597
+ >>> get_close_matches("wheel", _keyword.kwlist)
598
+ ['while']
599
+ >>> get_close_matches("apple", _keyword.kwlist)
600
+ []
601
+ >>> get_close_matches("accept", _keyword.kwlist)
602
+ ['except']
603
+ """
604
+
605
+ if not n > 0:
606
+ raise ValueError("n must be > 0: " + `n`)
607
+ if not 0.0 <= cutoff <= 1.0:
608
+ raise ValueError("cutoff must be in [0.0, 1.0]: " + `cutoff`)
609
+ result = []
610
+ s = SequenceMatcher()
611
+ s.set_seq2(word)
612
+ for x in possibilities:
613
+ s.set_seq1(x)
614
+ if s.real_quick_ratio() >= cutoff and \
615
+ s.quick_ratio() >= cutoff and \
616
+ s.ratio() >= cutoff:
617
+ result.append((s.ratio(), x))
618
+ # Sort by score.
619
+ result.sort()
620
+ # Retain only the best n.
621
+ result = result[-n:]
622
+ # Move best-scorer to head of list.
623
+ result.reverse()
624
+ # Strip scores.
625
+ return [x for score, x in result]
626
+
627
+
628
+ def _count_leading(line, ch):
629
+ """
630
+ Return number of `ch` characters at the start of `line`.
631
+
632
+ Example:
633
+
634
+ >>> _count_leading(' abc', ' ')
635
+ 3
636
+ """
637
+
638
+ i, n = 0, len(line)
639
+ while i < n and line[i] == ch:
640
+ i += 1
641
+ return i
642
+
643
+ class Differ:
644
+ r"""
645
+ Differ is a class for comparing sequences of lines of text, and
646
+ producing human-readable differences or deltas. Differ uses
647
+ SequenceMatcher both to compare sequences of lines, and to compare
648
+ sequences of characters within similar (near-matching) lines.
649
+
650
+ Each line of a Differ delta begins with a two-letter code:
651
+
652
+ '- ' line unique to sequence 1
653
+ '+ ' line unique to sequence 2
654
+ ' ' line common to both sequences
655
+ '? ' line not present in either input sequence
656
+
657
+ Lines beginning with '? ' attempt to guide the eye to intraline
658
+ differences, and were not present in either input sequence. These lines
659
+ can be confusing if the sequences contain tab characters.
660
+
661
+ Note that Differ makes no claim to produce a *minimal* diff. To the
662
+ contrary, minimal diffs are often counter-intuitive, because they synch
663
+ up anywhere possible, sometimes accidental matches 100 pages apart.
664
+ Restricting synch points to contiguous matches preserves some notion of
665
+ locality, at the occasional cost of producing a longer diff.
666
+
667
+ Example: Comparing two texts.
668
+
669
+ First we set up the texts, sequences of individual single-line strings
670
+ ending with newlines (such sequences can also be obtained from the
671
+ `readlines()` method of file-like objects):
672
+
673
+ >>> text1 = ''' 1. Beautiful is better than ugly.
674
+ ... 2. Explicit is better than implicit.
675
+ ... 3. Simple is better than complex.
676
+ ... 4. Complex is better than complicated.
677
+ ... '''.splitlines(1)
678
+ >>> len(text1)
679
+ 4
680
+ >>> text1[0][-1]
681
+ '\n'
682
+ >>> text2 = ''' 1. Beautiful is better than ugly.
683
+ ... 3. Simple is better than complex.
684
+ ... 4. Complicated is better than complex.
685
+ ... 5. Flat is better than nested.
686
+ ... '''.splitlines(1)
687
+
688
+ Next we instantiate a Differ object:
689
+
690
+ >>> d = Differ()
691
+
692
+ Note that when instantiating a Differ object we may pass functions to
693
+ filter out line and character 'junk'. See Differ.__init__ for details.
694
+
695
+ Finally, we compare the two:
696
+
697
+ >>> result = list(d.compare(text1, text2))
698
+
699
+ 'result' is a list of strings, so let's pretty-print it:
700
+
701
+ >>> from pprint import pprint as _pprint
702
+ >>> _pprint(result)
703
+ [' 1. Beautiful is better than ugly.\n',
704
+ '- 2. Explicit is better than implicit.\n',
705
+ '- 3. Simple is better than complex.\n',
706
+ '+ 3. Simple is better than complex.\n',
707
+ '? ++\n',
708
+ '- 4. Complex is better than complicated.\n',
709
+ '? ^ ---- ^\n',
710
+ '+ 4. Complicated is better than complex.\n',
711
+ '? ++++ ^ ^\n',
712
+ '+ 5. Flat is better than nested.\n']
713
+
714
+ As a single multi-line string it looks like this:
715
+
716
+ >>> print ''.join(result),
717
+ 1. Beautiful is better than ugly.
718
+ - 2. Explicit is better than implicit.
719
+ - 3. Simple is better than complex.
720
+ + 3. Simple is better than complex.
721
+ ? ++
722
+ - 4. Complex is better than complicated.
723
+ ? ^ ---- ^
724
+ + 4. Complicated is better than complex.
725
+ ? ++++ ^ ^
726
+ + 5. Flat is better than nested.
727
+
728
+ Methods:
729
+
730
+ __init__(linejunk=None, charjunk=None)
731
+ Construct a text differencer, with optional filters.
732
+
733
+ compare(a, b)
734
+ Compare two sequences of lines; generate the resulting delta.
735
+ """
736
+
737
+ def __init__(self, linejunk=None, charjunk=None):
738
+ """
739
+ Construct a text differencer, with optional filters.
740
+
741
+ The two optional keyword parameters are for filter functions:
742
+
743
+ - `linejunk`: A function that should accept a single string argument,
744
+ and return true iff the string is junk. The module-level function
745
+ `IS_LINE_JUNK` may be used to filter out lines without visible
746
+ characters, except for at most one splat ('#').
747
+
748
+ - `charjunk`: A function that should accept a string of length 1. The
749
+ module-level function `IS_CHARACTER_JUNK` may be used to filter out
750
+ whitespace characters (a blank or tab; **note**: bad idea to include
751
+ newline in this!).
752
+ """
753
+
754
+ self.linejunk = linejunk
755
+ self.charjunk = charjunk
756
+
757
+ def compare(self, a, b):
758
+ r"""
759
+ Compare two sequences of lines; generate the resulting delta.
760
+
761
+ Each sequence must contain individual single-line strings ending with
762
+ newlines. Such sequences can be obtained from the `readlines()` method
763
+ of file-like objects. The delta generated also consists of newline-
764
+ terminated strings, ready to be printed as-is via the writeline()
765
+ method of a file-like object.
766
+
767
+ Example:
768
+
769
+ >>> print ''.join(Differ().compare('one\ntwo\nthree\n'.splitlines(1),
770
+ ... 'ore\ntree\nemu\n'.splitlines(1))),
771
+ - one
772
+ ? ^
773
+ + ore
774
+ ? ^
775
+ - two
776
+ - three
777
+ ? -
778
+ + tree
779
+ + emu
780
+ """
781
+
782
+ cruncher = SequenceMatcher(self.linejunk, a, b)
783
+ for tag, alo, ahi, blo, bhi in cruncher.get_opcodes():
784
+ if tag == 'replace':
785
+ g = self._fancy_replace(a, alo, ahi, b, blo, bhi)
786
+ elif tag == 'delete':
787
+ g = self._dump('-', a, alo, ahi)
788
+ elif tag == 'insert':
789
+ g = self._dump('+', b, blo, bhi)
790
+ elif tag == 'equal':
791
+ g = self._dump(' ', a, alo, ahi)
792
+ else:
793
+ raise ValueError, 'unknown tag ' + `tag`
794
+
795
+ for line in g:
796
+ yield line
797
+
798
+ def _dump(self, tag, x, lo, hi):
799
+ """Generate comparison results for a same-tagged range."""
800
+ for i in xrange(lo, hi):
801
+ yield '%s %s' % (tag, x[i])
802
+
803
+ def _plain_replace(self, a, alo, ahi, b, blo, bhi):
804
+ assert alo < ahi and blo < bhi
805
+ # dump the shorter block first -- reduces the burden on short-term
806
+ # memory if the blocks are of very different sizes
807
+ if bhi - blo < ahi - alo:
808
+ first = self._dump('+', b, blo, bhi)
809
+ second = self._dump('-', a, alo, ahi)
810
+ else:
811
+ first = self._dump('-', a, alo, ahi)
812
+ second = self._dump('+', b, blo, bhi)
813
+
814
+ for g in first, second:
815
+ for line in g:
816
+ yield line
817
+
818
+ def _fancy_replace(self, a, alo, ahi, b, blo, bhi):
819
+ r"""
820
+ When replacing one block of lines with another, search the blocks
821
+ for *similar* lines; the best-matching pair (if any) is used as a
822
+ synch point, and intraline difference marking is done on the
823
+ similar pair. Lots of work, but often worth it.
824
+
825
+ Example:
826
+
827
+ >>> d = Differ()
828
+ >>> d._fancy_replace(['abcDefghiJkl\n'], 0, 1, ['abcdefGhijkl\n'], 0, 1)
829
+ >>> print ''.join(d.results),
830
+ - abcDefghiJkl
831
+ ? ^ ^ ^
832
+ + abcdefGhijkl
833
+ ? ^ ^ ^
834
+ """
835
+
836
+ # don't synch up unless the lines have a similarity score of at
837
+ # least cutoff; best_ratio tracks the best score seen so far
838
+ best_ratio, cutoff = 0.74, 0.75
839
+ cruncher = SequenceMatcher(self.charjunk)
840
+ eqi, eqj = None, None # 1st indices of equal lines (if any)
841
+
842
+ # search for the pair that matches best without being identical
843
+ # (identical lines must be junk lines, & we don't want to synch up
844
+ # on junk -- unless we have to)
845
+ for j in xrange(blo, bhi):
846
+ bj = b[j]
847
+ cruncher.set_seq2(bj)
848
+ for i in xrange(alo, ahi):
849
+ ai = a[i]
850
+ if ai == bj:
851
+ if eqi is None:
852
+ eqi, eqj = i, j
853
+ continue
854
+ cruncher.set_seq1(ai)
855
+ # computing similarity is expensive, so use the quick
856
+ # upper bounds first -- have seen this speed up messy
857
+ # compares by a factor of 3.
858
+ # note that ratio() is only expensive to compute the first
859
+ # time it's called on a sequence pair; the expensive part
860
+ # of the computation is cached by cruncher
861
+ if cruncher.real_quick_ratio() > best_ratio and \
862
+ cruncher.quick_ratio() > best_ratio and \
863
+ cruncher.ratio() > best_ratio:
864
+ best_ratio, best_i, best_j = cruncher.ratio(), i, j
865
+ if best_ratio < cutoff:
866
+ # no non-identical "pretty close" pair
867
+ if eqi is None:
868
+ # no identical pair either -- treat it as a straight replace
869
+ for line in self._plain_replace(a, alo, ahi, b, blo, bhi):
870
+ yield line
871
+ return
872
+ # no close pair, but an identical pair -- synch up on that
873
+ best_i, best_j, best_ratio = eqi, eqj, 1.0
874
+ else:
875
+ # there's a close pair, so forget the identical pair (if any)
876
+ eqi = None
877
+
878
+ # a[best_i] very similar to b[best_j]; eqi is None iff they're not
879
+ # identical
880
+
881
+ # pump out diffs from before the synch point
882
+ for line in self._fancy_helper(a, alo, best_i, b, blo, best_j):
883
+ yield line
884
+
885
+ # do intraline marking on the synch pair
886
+ aelt, belt = a[best_i], b[best_j]
887
+ if eqi is None:
888
+ # pump out a '-', '?', '+', '?' quad for the synched lines
889
+ atags = btags = ""
890
+ cruncher.set_seqs(aelt, belt)
891
+ for tag, ai1, ai2, bj1, bj2 in cruncher.get_opcodes():
892
+ la, lb = ai2 - ai1, bj2 - bj1
893
+ if tag == 'replace':
894
+ atags += '^' * la
895
+ btags += '^' * lb
896
+ elif tag == 'delete':
897
+ atags += '-' * la
898
+ elif tag == 'insert':
899
+ btags += '+' * lb
900
+ elif tag == 'equal':
901
+ atags += ' ' * la
902
+ btags += ' ' * lb
903
+ else:
904
+ raise ValueError, 'unknown tag ' + `tag`
905
+ for line in self._qformat(aelt, belt, atags, btags):
906
+ yield line
907
+ else:
908
+ # the synch pair is identical
909
+ yield ' ' + aelt
910
+
911
+ # pump out diffs from after the synch point
912
+ for line in self._fancy_helper(a, best_i+1, ahi, b, best_j+1, bhi):
913
+ yield line
914
+
915
+ def _fancy_helper(self, a, alo, ahi, b, blo, bhi):
916
+ g = []
917
+ if alo < ahi:
918
+ if blo < bhi:
919
+ g = self._fancy_replace(a, alo, ahi, b, blo, bhi)
920
+ else:
921
+ g = self._dump('-', a, alo, ahi)
922
+ elif blo < bhi:
923
+ g = self._dump('+', b, blo, bhi)
924
+
925
+ for line in g:
926
+ yield line
927
+
928
+ def _qformat(self, aline, bline, atags, btags):
929
+ r"""
930
+ Format "?" output and deal with leading tabs.
931
+
932
+ Example:
933
+
934
+ >>> d = Differ()
935
+ >>> d._qformat('\tabcDefghiJkl\n', '\t\tabcdefGhijkl\n',
936
+ ... ' ^ ^ ^ ', '+ ^ ^ ^ ')
937
+ >>> for line in d.results: print repr(line)
938
+ ...
939
+ '- \tabcDefghiJkl\n'
940
+ '? \t ^ ^ ^\n'
941
+ '+ \t\tabcdefGhijkl\n'
942
+ '? \t ^ ^ ^\n'
943
+ """
944
+
945
+ # Can hurt, but will probably help most of the time.
946
+ common = min(_count_leading(aline, "\t"),
947
+ _count_leading(bline, "\t"))
948
+ common = min(common, _count_leading(atags[:common], " "))
949
+ atags = atags[common:].rstrip()
950
+ btags = btags[common:].rstrip()
951
+
952
+ yield "- " + aline
953
+ if atags:
954
+ yield "? %s%s\n" % ("\t" * common, atags)
955
+
956
+ yield "+ " + bline
957
+ if btags:
958
+ yield "? %s%s\n" % ("\t" * common, btags)
959
+
960
+ # With respect to junk, an earlier version of ndiff simply refused to
961
+ # *start* a match with a junk element. The result was cases like this:
962
+ # before: private Thread currentThread;
963
+ # after: private volatile Thread currentThread;
964
+ # If you consider whitespace to be junk, the longest contiguous match
965
+ # not starting with junk is "e Thread currentThread". So ndiff reported
966
+ # that "e volatil" was inserted between the 't' and the 'e' in "private".
967
+ # While an accurate view, to people that's absurd. The current version
968
+ # looks for matching blocks that are entirely junk-free, then extends the
969
+ # longest one of those as far as possible but only with matching junk.
970
+ # So now "currentThread" is matched, then extended to suck up the
971
+ # preceding blank; then "private" is matched, and extended to suck up the
972
+ # following blank; then "Thread" is matched; and finally ndiff reports
973
+ # that "volatile " was inserted before "Thread". The only quibble
974
+ # remaining is that perhaps it was really the case that " volatile"
975
+ # was inserted after "private". I can live with that <wink>.
976
+
977
+ import re
978
+
979
+ def IS_LINE_JUNK(line, pat=re.compile(r"\s*#?\s*$").match):
980
+ r"""
981
+ Return 1 for ignorable line: iff `line` is blank or contains a single '#'.
982
+
983
+ Examples:
984
+
985
+ >>> IS_LINE_JUNK('\n')
986
+ 1
987
+ >>> IS_LINE_JUNK(' # \n')
988
+ 1
989
+ >>> IS_LINE_JUNK('hello\n')
990
+ 0
991
+ """
992
+
993
+ return pat(line) is not None
994
+
995
+ def IS_CHARACTER_JUNK(ch, ws=" \t"):
996
+ r"""
997
+ Return 1 for ignorable character: iff `ch` is a space or tab.
998
+
999
+ Examples:
1000
+
1001
+ >>> IS_CHARACTER_JUNK(' ')
1002
+ 1
1003
+ >>> IS_CHARACTER_JUNK('\t')
1004
+ 1
1005
+ >>> IS_CHARACTER_JUNK('\n')
1006
+ 0
1007
+ >>> IS_CHARACTER_JUNK('x')
1008
+ 0
1009
+ """
1010
+
1011
+ return ch in ws
1012
+
1013
+ del re
1014
+
1015
+ def ndiff(a, b, linejunk=IS_LINE_JUNK, charjunk=IS_CHARACTER_JUNK):
1016
+ r"""
1017
+ Compare `a` and `b` (lists of strings); return a `Differ`-style delta.
1018
+
1019
+ Optional keyword parameters `linejunk` and `charjunk` are for filter
1020
+ functions (or None):
1021
+
1022
+ - linejunk: A function that should accept a single string argument, and
1023
+ return true iff the string is junk. The default is module-level function
1024
+ IS_LINE_JUNK, which filters out lines without visible characters, except
1025
+ for at most one splat ('#').
1026
+
1027
+ - charjunk: A function that should accept a string of length 1. The
1028
+ default is module-level function IS_CHARACTER_JUNK, which filters out
1029
+ whitespace characters (a blank or tab; note: bad idea to include newline
1030
+ in this!).
1031
+
1032
+ Tools/scripts/ndiff.py is a command-line front-end to this function.
1033
+
1034
+ Example:
1035
+
1036
+ >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
1037
+ ... 'ore\ntree\nemu\n'.splitlines(1))
1038
+ >>> print ''.join(diff),
1039
+ - one
1040
+ ? ^
1041
+ + ore
1042
+ ? ^
1043
+ - two
1044
+ - three
1045
+ ? -
1046
+ + tree
1047
+ + emu
1048
+ """
1049
+ return Differ(linejunk, charjunk).compare(a, b)
1050
+
1051
+ def restore(delta, which):
1052
+ r"""
1053
+ Generate one of the two sequences that generated a delta.
1054
+
1055
+ Given a `delta` produced by `Differ.compare()` or `ndiff()`, extract
1056
+ lines originating from file 1 or 2 (parameter `which`), stripping off line
1057
+ prefixes.
1058
+
1059
+ Examples:
1060
+
1061
+ >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
1062
+ ... 'ore\ntree\nemu\n'.splitlines(1))
1063
+ >>> diff = list(diff)
1064
+ >>> print ''.join(restore(diff, 1)),
1065
+ one
1066
+ two
1067
+ three
1068
+ >>> print ''.join(restore(diff, 2)),
1069
+ ore
1070
+ tree
1071
+ emu
1072
+ """
1073
+ try:
1074
+ tag = {1: "- ", 2: "+ "}[int(which)]
1075
+ except KeyError:
1076
+ raise ValueError, ('unknown delta choice (must be 1 or 2): %r'
1077
+ % which)
1078
+ prefixes = (" ", tag)
1079
+ for line in delta:
1080
+ if line[:2] in prefixes:
1081
+ yield line[2:]
1082
+
1083
+ def _test():
1084
+ import doctest, difflib
1085
+ return doctest.testmod(difflib)
1086
+
1087
+ if __name__ == "__main__":
1088
+ _test()