rubyfox-server 2.3.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rvmrc +1 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +23 -0
- data/Rakefile +1 -0
- data/bin/smartfox +7 -0
- data/lib/rubyfox/server/cli.rb +59 -0
- data/lib/rubyfox/server/data/config/.keep +0 -0
- data/lib/rubyfox/server/data/config/_backups/.keep +0 -0
- data/lib/rubyfox/server/data/config/ascii/boot.txt +5 -0
- data/lib/rubyfox/server/data/config/ascii/ready.txt +9 -0
- data/lib/rubyfox/server/data/config/core.xml +44 -0
- data/lib/rubyfox/server/data/config/crossdomain.xml +10 -0
- data/lib/rubyfox/server/data/config/descriptors/.keep +0 -0
- data/lib/rubyfox/server/data/config/descriptors/config_room.txt +323 -0
- data/lib/rubyfox/server/data/config/descriptors/config_server.txt +621 -0
- data/lib/rubyfox/server/data/config/descriptors/config_zone.txt +1021 -0
- data/lib/rubyfox/server/data/config/descriptors/runtime_game.txt +63 -0
- data/lib/rubyfox/server/data/config/descriptors/runtime_room.txt +377 -0
- data/lib/rubyfox/server/data/config/descriptors/runtime_user.txt +589 -0
- data/lib/rubyfox/server/data/config/descriptors/runtime_zone.txt +354 -0
- data/lib/rubyfox/server/data/config/jetty/.keep +0 -0
- data/lib/rubyfox/server/data/config/jetty/jetty.xml +214 -0
- data/lib/rubyfox/server/data/config/jetty/realm.properties +21 -0
- data/lib/rubyfox/server/data/config/jetty/webdefault.xml +410 -0
- data/lib/rubyfox/server/data/config/log4j.properties +75 -0
- data/lib/rubyfox/server/data/config/myprop.properties +5 -0
- data/lib/rubyfox/server/data/config/server.xml +65 -0
- data/lib/rubyfox/server/data/config/templates/sfs2x.unix.txt +12 -0
- data/lib/rubyfox/server/data/config/templates/sfs2x.windows.txt +1 -0
- data/lib/rubyfox/server/data/config/templates/vmoptions.txt +3 -0
- data/lib/rubyfox/server/data/config/wordsFile.txt +13 -0
- data/lib/rubyfox/server/data/data/bannedusers/.keep +0 -0
- data/lib/rubyfox/server/data/data/bannedusers/users.bin +0 -0
- data/lib/rubyfox/server/data/data/buddylists/.keep +0 -0
- data/lib/rubyfox/server/data/data/buddylists/BasicExamples/7364666773646667 +0 -0
- data/lib/rubyfox/server/data/extensions/.keep +0 -0
- data/lib/rubyfox/server/data/extensions/__lib__/.keep +0 -0
- data/lib/rubyfox/server/data/lib/Jetty/.keep +0 -0
- data/lib/rubyfox/server/data/lib/Jetty/ant-1.6.5.jar +0 -0
- data/lib/rubyfox/server/data/lib/Jetty/core-3.1.1.jar +0 -0
- data/lib/rubyfox/server/data/lib/Jetty/jetty-6.1.26.jar +0 -0
- data/lib/rubyfox/server/data/lib/Jetty/jetty-util-6.1.26.jar +0 -0
- data/lib/rubyfox/server/data/lib/Jetty/jsp-2.1-glassfish-2.1.v20091210.jar +0 -0
- data/lib/rubyfox/server/data/lib/Jetty/jsp-2.1-jetty-6.1.26.jar +0 -0
- data/lib/rubyfox/server/data/lib/Jetty/jsp-api-2.1-glassfish-2.1.v20091210.jar +0 -0
- data/lib/rubyfox/server/data/lib/Jetty/servlet-api-2.5-20081211.jar +0 -0
- data/lib/rubyfox/server/data/lib/Lib/BaseHTTPServer.py +484 -0
- data/lib/rubyfox/server/data/lib/Lib/CGIHTTPServer.py +325 -0
- data/lib/rubyfox/server/data/lib/Lib/ConfigParser.py +472 -0
- data/lib/rubyfox/server/data/lib/Lib/Cookie.py +742 -0
- data/lib/rubyfox/server/data/lib/Lib/HTMLParser.py +383 -0
- data/lib/rubyfox/server/data/lib/Lib/MimeWriter.py +181 -0
- data/lib/rubyfox/server/data/lib/Lib/Queue.py +151 -0
- data/lib/rubyfox/server/data/lib/Lib/SimpleHTTPServer.py +198 -0
- data/lib/rubyfox/server/data/lib/Lib/SimpleXMLRPCServer.py +274 -0
- data/lib/rubyfox/server/data/lib/Lib/SocketServer.py +576 -0
- data/lib/rubyfox/server/data/lib/Lib/StringIO.py +239 -0
- data/lib/rubyfox/server/data/lib/Lib/UserDict$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/UserDict.py +60 -0
- data/lib/rubyfox/server/data/lib/Lib/UserList.py +94 -0
- data/lib/rubyfox/server/data/lib/Lib/UserString.py +182 -0
- data/lib/rubyfox/server/data/lib/Lib/__future__$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/__future__.py +104 -0
- data/lib/rubyfox/server/data/lib/Lib/aifc.py +961 -0
- data/lib/rubyfox/server/data/lib/Lib/anydbm.py +86 -0
- data/lib/rubyfox/server/data/lib/Lib/atexit.py +50 -0
- data/lib/rubyfox/server/data/lib/Lib/base64.py +77 -0
- data/lib/rubyfox/server/data/lib/Lib/bdb.py +563 -0
- data/lib/rubyfox/server/data/lib/Lib/binhex.py +531 -0
- data/lib/rubyfox/server/data/lib/Lib/bisect.py +78 -0
- data/lib/rubyfox/server/data/lib/Lib/calendar.py +246 -0
- data/lib/rubyfox/server/data/lib/Lib/cgi.py +1040 -0
- data/lib/rubyfox/server/data/lib/Lib/chunk.py +167 -0
- data/lib/rubyfox/server/data/lib/Lib/cmd.py +336 -0
- data/lib/rubyfox/server/data/lib/Lib/code$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/code.py +311 -0
- data/lib/rubyfox/server/data/lib/Lib/codecs$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/codecs.py +636 -0
- data/lib/rubyfox/server/data/lib/Lib/codeop$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/codeop.py +131 -0
- data/lib/rubyfox/server/data/lib/Lib/colorsys.py +123 -0
- data/lib/rubyfox/server/data/lib/Lib/commands.py +84 -0
- data/lib/rubyfox/server/data/lib/Lib/compileall.py +148 -0
- data/lib/rubyfox/server/data/lib/Lib/copy.py +330 -0
- data/lib/rubyfox/server/data/lib/Lib/copy_reg$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/copy_reg.py +78 -0
- data/lib/rubyfox/server/data/lib/Lib/datetime$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/datetime.py +2007 -0
- data/lib/rubyfox/server/data/lib/Lib/dbexts.py +726 -0
- data/lib/rubyfox/server/data/lib/Lib/difflib.py +1088 -0
- data/lib/rubyfox/server/data/lib/Lib/dircache.py +44 -0
- data/lib/rubyfox/server/data/lib/Lib/doctest.py +1173 -0
- data/lib/rubyfox/server/data/lib/Lib/dospath.py +341 -0
- data/lib/rubyfox/server/data/lib/Lib/dumbdbm.py +170 -0
- data/lib/rubyfox/server/data/lib/Lib/email/Charset.py +393 -0
- data/lib/rubyfox/server/data/lib/Lib/email/Encoders.py +94 -0
- data/lib/rubyfox/server/data/lib/Lib/email/Errors.py +26 -0
- data/lib/rubyfox/server/data/lib/Lib/email/Generator.py +378 -0
- data/lib/rubyfox/server/data/lib/Lib/email/Header.py +515 -0
- data/lib/rubyfox/server/data/lib/Lib/email/Iterators.py +25 -0
- data/lib/rubyfox/server/data/lib/Lib/email/MIMEAudio.py +71 -0
- data/lib/rubyfox/server/data/lib/Lib/email/MIMEBase.py +24 -0
- data/lib/rubyfox/server/data/lib/Lib/email/MIMEImage.py +45 -0
- data/lib/rubyfox/server/data/lib/Lib/email/MIMEMessage.py +32 -0
- data/lib/rubyfox/server/data/lib/Lib/email/MIMEMultipart.py +37 -0
- data/lib/rubyfox/server/data/lib/Lib/email/MIMENonMultipart.py +24 -0
- data/lib/rubyfox/server/data/lib/Lib/email/MIMEText.py +45 -0
- data/lib/rubyfox/server/data/lib/Lib/email/Message.py +837 -0
- data/lib/rubyfox/server/data/lib/Lib/email/Parser.py +292 -0
- data/lib/rubyfox/server/data/lib/Lib/email/Utils.py +340 -0
- data/lib/rubyfox/server/data/lib/Lib/email/__init__.py +72 -0
- data/lib/rubyfox/server/data/lib/Lib/email/_compat21.py +69 -0
- data/lib/rubyfox/server/data/lib/Lib/email/_compat22.py +70 -0
- data/lib/rubyfox/server/data/lib/Lib/email/_parseaddr.py +480 -0
- data/lib/rubyfox/server/data/lib/Lib/email/base64MIME.py +184 -0
- data/lib/rubyfox/server/data/lib/Lib/email/quopriMIME.py +323 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/__init__.py +2 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/PyBanner048.gif +0 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/audiotest.au +0 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_01.txt +19 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_02.txt +135 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_03.txt +16 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_04.txt +37 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_05.txt +28 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_06.txt +33 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_07.txt +83 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_08.txt +24 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_09.txt +24 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_10.txt +32 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_11.txt +7 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_12.txt +36 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_13.txt +94 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_14.txt +23 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_15.txt +52 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_16.txt +123 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_17.txt +12 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_18.txt +6 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_19.txt +43 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_20.txt +22 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_21.txt +20 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_22.txt +46 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_23.txt +8 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_24.txt +10 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_25.txt +117 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_26.txt +45 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_27.txt +15 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_28.txt +25 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_29.txt +22 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_30.txt +23 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_31.txt +15 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_32.txt +14 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_33.txt +29 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_34.txt +19 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/data/msg_35.txt +4 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/test_email.py +2718 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/test_email_codecs.py +68 -0
- data/lib/rubyfox/server/data/lib/Lib/email/test/test_email_torture.py +136 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/__init__$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/__init__.py +97 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/aliases$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/aliases.py +115 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/ascii.py +35 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/base64_codec.py +62 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/charmap.py +51 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp037.py +280 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1006.py +138 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1026.py +280 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1140.py +45 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1250.py +123 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1251.py +157 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1252.py +76 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1253.py +151 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1254.py +82 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1255.py +143 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1256.py +129 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1257.py +131 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp1258.py +90 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp424.py +280 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp437.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp500.py +280 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp737.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp775.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp850.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp852.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp855.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp856.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp857.py +171 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp860.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp861.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp862.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp863.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp864.py +170 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp865.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp866.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp869.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp874.py +171 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/cp875.py +281 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/hex_codec.py +62 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_1.py +44 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_10.py +90 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_13.py +100 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_14.py +75 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_15.py +52 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_2.py +101 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_3.py +79 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_4.py +94 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_5.py +138 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_6.py +137 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_7.py +124 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_8.py +112 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/iso8859_9.py +50 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/koi8_r.py +172 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/koi8_u.py +54 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/latin_1.py +35 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/mac_cyrillic.py +167 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/mac_greek.py +170 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/mac_iceland.py +166 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/mac_latin2.py +170 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/mac_roman.py +167 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/mac_turkish.py +167 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/mbcs.py +36 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/quopri_codec.py +58 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/raw_unicode_escape.py +30 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/rot_13.py +105 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/undefined.py +34 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/unicode_escape.py +30 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/unicode_internal.py +30 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/utf_16.py +61 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/utf_16_be.py +31 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/utf_16_le.py +31 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/utf_7.py +27 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/utf_8$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/utf_8.py +31 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/uu_codec.py +112 -0
- data/lib/rubyfox/server/data/lib/Lib/encodings/zlib_codec.py +63 -0
- data/lib/rubyfox/server/data/lib/Lib/fileinput.py +349 -0
- data/lib/rubyfox/server/data/lib/Lib/fnmatch.py +107 -0
- data/lib/rubyfox/server/data/lib/Lib/formatter.py +454 -0
- data/lib/rubyfox/server/data/lib/Lib/fpformat.py +142 -0
- data/lib/rubyfox/server/data/lib/Lib/ftplib.py +804 -0
- data/lib/rubyfox/server/data/lib/Lib/getopt.py +143 -0
- data/lib/rubyfox/server/data/lib/Lib/glob.py +56 -0
- data/lib/rubyfox/server/data/lib/Lib/gopherlib.py +205 -0
- data/lib/rubyfox/server/data/lib/Lib/gzip.py +390 -0
- data/lib/rubyfox/server/data/lib/Lib/hmac.py +99 -0
- data/lib/rubyfox/server/data/lib/Lib/htmlentitydefs.py +257 -0
- data/lib/rubyfox/server/data/lib/Lib/htmllib.py +475 -0
- data/lib/rubyfox/server/data/lib/Lib/httplib.py +1238 -0
- data/lib/rubyfox/server/data/lib/Lib/imaplib.py +1208 -0
- data/lib/rubyfox/server/data/lib/Lib/imghdr.py +154 -0
- data/lib/rubyfox/server/data/lib/Lib/inspect$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/inspect.py +787 -0
- data/lib/rubyfox/server/data/lib/Lib/isql.py +238 -0
- data/lib/rubyfox/server/data/lib/Lib/javaos$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/javaos.py +395 -0
- data/lib/rubyfox/server/data/lib/Lib/javapath$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/javapath.py +349 -0
- data/lib/rubyfox/server/data/lib/Lib/javashell.py +194 -0
- data/lib/rubyfox/server/data/lib/Lib/jreload.py +119 -0
- data/lib/rubyfox/server/data/lib/Lib/jxxload_help/DiscardHelp.java +59 -0
- data/lib/rubyfox/server/data/lib/Lib/jxxload_help/JavaLoaderFactory.java +9 -0
- data/lib/rubyfox/server/data/lib/Lib/jxxload_help/PackageManager.java +58 -0
- data/lib/rubyfox/server/data/lib/Lib/jxxload_help/PathVFS.java +98 -0
- data/lib/rubyfox/server/data/lib/Lib/jxxload_help/PathVFSJavaLoader.java +49 -0
- data/lib/rubyfox/server/data/lib/Lib/keyword.py +97 -0
- data/lib/rubyfox/server/data/lib/Lib/linecache$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/linecache.py +101 -0
- data/lib/rubyfox/server/data/lib/Lib/macpath.py +242 -0
- data/lib/rubyfox/server/data/lib/Lib/macurl2path.py +95 -0
- data/lib/rubyfox/server/data/lib/Lib/mailbox.py +313 -0
- data/lib/rubyfox/server/data/lib/Lib/mailcap.py +255 -0
- data/lib/rubyfox/server/data/lib/Lib/markupbase.py +317 -0
- data/lib/rubyfox/server/data/lib/Lib/marshal.py +315 -0
- data/lib/rubyfox/server/data/lib/Lib/mhlib.py +1003 -0
- data/lib/rubyfox/server/data/lib/Lib/mimetools.py +226 -0
- data/lib/rubyfox/server/data/lib/Lib/mimetypes.py +435 -0
- data/lib/rubyfox/server/data/lib/Lib/mimify.py +464 -0
- data/lib/rubyfox/server/data/lib/Lib/multifile.py +160 -0
- data/lib/rubyfox/server/data/lib/Lib/mutex.py +51 -0
- data/lib/rubyfox/server/data/lib/Lib/netrc.py +108 -0
- data/lib/rubyfox/server/data/lib/Lib/nntplib.py +575 -0
- data/lib/rubyfox/server/data/lib/Lib/ntpath.py +482 -0
- data/lib/rubyfox/server/data/lib/Lib/nturl2path.py +66 -0
- data/lib/rubyfox/server/data/lib/Lib/pawt/__init__.py +35 -0
- data/lib/rubyfox/server/data/lib/Lib/pawt/colors.py +144 -0
- data/lib/rubyfox/server/data/lib/Lib/pawt/swing.py +42 -0
- data/lib/rubyfox/server/data/lib/Lib/pdb.py +979 -0
- data/lib/rubyfox/server/data/lib/Lib/pickle.py +990 -0
- data/lib/rubyfox/server/data/lib/Lib/pipes.py +297 -0
- data/lib/rubyfox/server/data/lib/Lib/popen2.py +304 -0
- data/lib/rubyfox/server/data/lib/Lib/poplib.py +335 -0
- data/lib/rubyfox/server/data/lib/Lib/posixfile.py +240 -0
- data/lib/rubyfox/server/data/lib/Lib/posixpath.py +414 -0
- data/lib/rubyfox/server/data/lib/Lib/pprint.py +310 -0
- data/lib/rubyfox/server/data/lib/Lib/profile.py +556 -0
- data/lib/rubyfox/server/data/lib/Lib/pstats.py +641 -0
- data/lib/rubyfox/server/data/lib/Lib/pyclbr.py +337 -0
- data/lib/rubyfox/server/data/lib/Lib/quopri.py +237 -0
- data/lib/rubyfox/server/data/lib/Lib/random$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/random.py +779 -0
- data/lib/rubyfox/server/data/lib/Lib/re$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/re.py +11 -0
- data/lib/rubyfox/server/data/lib/Lib/reconvert.py +192 -0
- data/lib/rubyfox/server/data/lib/Lib/reindex$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/repr.py +95 -0
- data/lib/rubyfox/server/data/lib/Lib/rfc822.py +1010 -0
- data/lib/rubyfox/server/data/lib/Lib/sched.py +106 -0
- data/lib/rubyfox/server/data/lib/Lib/select.py +211 -0
- data/lib/rubyfox/server/data/lib/Lib/servlet-api-2.5-20081211.jar +0 -0
- data/lib/rubyfox/server/data/lib/Lib/setsfactory.py +10 -0
- data/lib/rubyfox/server/data/lib/Lib/sfs2x-lms.jar +0 -0
- data/lib/rubyfox/server/data/lib/Lib/sgmllib.py +516 -0
- data/lib/rubyfox/server/data/lib/Lib/shelve.py +158 -0
- data/lib/rubyfox/server/data/lib/Lib/shlex.py +209 -0
- data/lib/rubyfox/server/data/lib/Lib/shutil$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/shutil.py +138 -0
- data/lib/rubyfox/server/data/lib/Lib/site.py +263 -0
- data/lib/rubyfox/server/data/lib/Lib/smtplib.py +729 -0
- data/lib/rubyfox/server/data/lib/Lib/sndhdr.py +228 -0
- data/lib/rubyfox/server/data/lib/Lib/socket.py +902 -0
- data/lib/rubyfox/server/data/lib/Lib/sre$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/sre.py +311 -0
- data/lib/rubyfox/server/data/lib/Lib/sre_compile$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/sre_compile.py +455 -0
- data/lib/rubyfox/server/data/lib/Lib/sre_constants$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/sre_constants.py +259 -0
- data/lib/rubyfox/server/data/lib/Lib/sre_parse$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/sre_parse.py +738 -0
- data/lib/rubyfox/server/data/lib/Lib/stat$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/stat.py +86 -0
- data/lib/rubyfox/server/data/lib/Lib/string$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/string.py +437 -0
- data/lib/rubyfox/server/data/lib/Lib/symbol.py +95 -0
- data/lib/rubyfox/server/data/lib/Lib/telnetlib.py +662 -0
- data/lib/rubyfox/server/data/lib/Lib/tempfile.py +255 -0
- data/lib/rubyfox/server/data/lib/Lib/test/Graph.py +62 -0
- data/lib/rubyfox/server/data/lib/Lib/test/README +372 -0
- data/lib/rubyfox/server/data/lib/Lib/test/__init__.py +1 -0
- data/lib/rubyfox/server/data/lib/Lib/test/audiotest.au +0 -0
- data/lib/rubyfox/server/data/lib/Lib/test/autotest.py +6 -0
- data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_future3.py +10 -0
- data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_future4.py +10 -0
- data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_future5.py +12 -0
- data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_future6.py +10 -0
- data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_future7.py +11 -0
- data/lib/rubyfox/server/data/lib/Lib/test/badsyntax_nocaret.py +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/blob.jar +0 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/bugs100.py +139 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/bugs101.py +57 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/jdkbugs.py +10 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr101.py +59 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr104.py +9 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr112.py +14 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr119.py +16 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr127.py +10 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr133/__init__.py +1 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr133/test.py +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr133.py +12 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr134.py +9 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr139.py +7 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr142.py +1 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr144.py +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr148.py +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr149.py +7 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr155.py +13 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr170.py +7 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr171.py +9 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr174.py +9 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr178.py +10 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr183.py +5 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr186.py +10 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr191.py +5 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr192.py +81 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr195.py +11 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr208.py +26 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr233.py +8 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr234.py +16 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr235.py +14 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr239.py +6 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr241.py +16 -0
- data/lib/rubyfox/server/data/lib/Lib/test/bugs/pr242.py +12 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/PyBanner048.gif +0 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_01.txt +19 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_02.txt +135 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_03.txt +16 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_04.txt +37 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_05.txt +28 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_06.txt +33 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_07.txt +83 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_08.txt +24 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_09.txt +24 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_10.txt +32 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_11.txt +7 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_12.txt +36 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_13.txt +94 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_14.txt +23 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_15.txt +52 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_16.txt +123 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_17.txt +12 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_18.txt +6 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_19.txt +43 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_20.txt +22 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_21.txt +22 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_22.txt +46 -0
- data/lib/rubyfox/server/data/lib/Lib/test/data/msg_23.txt +8 -0
- data/lib/rubyfox/server/data/lib/Lib/test/double_const.py +30 -0
- data/lib/rubyfox/server/data/lib/Lib/test/greyrgb.uue +1547 -0
- data/lib/rubyfox/server/data/lib/Lib/test/javatests/AnonInner.java +20 -0
- data/lib/rubyfox/server/data/lib/Lib/test/javatests/Foo.java +3 -0
- data/lib/rubyfox/server/data/lib/Lib/test/javatests/JOverload.java +132 -0
- data/lib/rubyfox/server/data/lib/Lib/test/javatests/ListTest.java +638 -0
- data/lib/rubyfox/server/data/lib/Lib/test/javatests/SubFoo.java +3 -0
- data/lib/rubyfox/server/data/lib/Lib/test/javatests/TestSupport.java +49 -0
- data/lib/rubyfox/server/data/lib/Lib/test/javatests/__init__.py +0 -0
- data/lib/rubyfox/server/data/lib/Lib/test/jser2_classes.py +47 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_MimeWriter +110 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_array +4 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_asynchat +3 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_augassign +51 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_binascii +29 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_builtin +53 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_cfgparser +9 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_cgi +29 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_charmapcodec +16 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_class +101 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_coercion +1054 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_compare +101 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_compile +7 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_cookie +32 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_exceptions +52 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_extcall +112 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_frozen +4 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_future +9 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_gettext +46 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_global +5 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_grammar +66 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_httplib +10 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_janoninner +5 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_javalist +6 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_jbasic +13 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_jser +12 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_jsubclass +5 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_linuxaudiodev +7 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_longexp +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_math +26 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_md5 +9 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_methods +6 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_mimetools +5 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_mmap +34 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_new +7 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_nis +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_opcodes +4 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_openpty +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_operations +28 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_pkg +45 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_poll +17 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_popen2 +9 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_posixpath +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_pow +17 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_profile +17 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_pty +3 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_pwd +7 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_pyexpat +110 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_re +15 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_regex +29 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_rgbimg +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_richcmp +187 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_rotor +5 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_scope +24 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_signal +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_string +18 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_thread +4 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_threadedtempfile +5 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_time +9 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_tokenize +648 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_types +15 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_ucn +7 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_unicode +21 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_unicode_file +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_unicodedata +5 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_unpack +15 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_urlparse +47 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_winreg +3 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_winsound +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/output/test_xreadline +4 -0
- data/lib/rubyfox/server/data/lib/Lib/test/pickletester.py +285 -0
- data/lib/rubyfox/server/data/lib/Lib/test/pydocfodder.py +210 -0
- data/lib/rubyfox/server/data/lib/Lib/test/pystone.py +252 -0
- data/lib/rubyfox/server/data/lib/Lib/test/re_tests.py +590 -0
- data/lib/rubyfox/server/data/lib/Lib/test/regex_tests.py +287 -0
- data/lib/rubyfox/server/data/lib/Lib/test/regrtest.py +1096 -0
- data/lib/rubyfox/server/data/lib/Lib/test/reperf.py +23 -0
- data/lib/rubyfox/server/data/lib/Lib/test/sortperf.py +141 -0
- data/lib/rubyfox/server/data/lib/Lib/test/string_tests.py +265 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test.xml +115 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test.xml.out +115 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_MimeWriter.py +170 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_SimpleXMLRPCServer.py +88 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_StringIO.py +113 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test___all__.py +158 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test___future__.py +59 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_al.py +23 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_array.py +438 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_asynchat.py +58 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_atexit.py +66 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_audioop.py +264 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_augassign.py +261 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_b1.py +632 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_b2.py +365 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_base64.py +53 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_bastion.py +3 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_binascii.py +119 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_binhex.py +50 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_binop.py +328 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_bisect.py +127 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_bsddb.py +76 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_bufio.py +60 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_bugfixes.py +31 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_builtin.py +13 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_calendar.py +61 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_call.py +131 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_capi.py +16 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_cd.py +26 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_cfgparser.py +284 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_cgi.py +188 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_charmapcodec.py +43 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_cl.py +78 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_class.py +317 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_cmath.py +35 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_codecs.py +31 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_codeop.py +190 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_coercion.py +118 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_commands.py +52 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_compare.py +56 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_compile.py +129 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_complex.py +68 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_contains.py +133 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_cookie.py +47 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_copy_reg.py +30 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_cpickle.py +81 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_crypt.py +11 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_curses.py +210 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_datetime.py +2958 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_dbm.py +43 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_descr.py +4094 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_descrtut.py +501 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_difflib.py +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_dircache.py +74 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_dl.py +33 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_doctest.py +2 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_doctest2.py +108 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_dospath.py +61 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_dumbdbm.py +79 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_email.py +13 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_email_codecs.py +11 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_enumerate.py +150 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_errno.py +49 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_exceptions.py +206 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_extcall.py +268 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_fcntl.py +53 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_file.py +63 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_fileinput.py +159 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_fnmatch.py +46 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_fork1.py +75 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_format.py +218 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_fpformat.py +75 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_frozen.py +26 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_funcattrs.py +384 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_future.py +47 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_future1.py +11 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_future2.py +10 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_future3.py +11 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_gc.py +346 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_gdbm.py +46 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_generators.py +1385 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_getargs.py +26 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_getopt.py +110 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_gettext.py +200 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_gl.py +150 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_glob.py +115 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_global.py +51 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_grammar.py +732 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_grp.py +27 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_gzip.py +82 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_hash.py +36 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_hmac.py +108 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_hotshot.py +117 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_htmllib.py +42 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_htmlparser.py +294 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_httplib.py +58 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_imageop.py +171 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_imgfile.py +116 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_import.py +71 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_importhooks.py +215 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_inspect.py +365 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_iter.py +784 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_janoninner.py +15 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_javalist.py +53 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_javashell.py +182 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_jbasic.py +119 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_joverload.py +138 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_jreload.py +33 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_jser.py +57 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_jser2.py +93 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_jsubclass.py +49 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_jy_compile.py +168 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_jy_generators.py +165 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_jy_internals.py +130 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_largefile.py +169 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_linuxaudiodev.py +89 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_locale.py +44 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_long.py +445 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_long_future.py +55 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_long_int_args.py +61 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_longexp.py +16 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_mailbox.py +113 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_marshal.py +44 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_math.py +153 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_md5.py +30 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_methods.py +62 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_mhlib.py +353 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_mimetools.py +18 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_mimetypes.py +59 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_minidom.py +648 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_mmap.py +317 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_module.py +77 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_multifile.py +66 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_mutants.py +285 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_netrc.py +42 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_new.py +108 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_nis.py +32 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_ntpath.py +114 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_opcodes.py +65 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_openpty.py +21 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_operations.py +475 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_operator.py +218 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_os.py +187 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_parser.py +383 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_pep247.py +50 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_pickle.py +40 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_pkg.py +259 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_pkgimport.py +84 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_poll.py +3 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_popen2.py +72 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_posixpath.py +40 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_pow.py +107 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_pprint.py +104 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_profile.py +86 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_profilehooks.py +360 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_pty.py +98 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_pwd.py +71 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_pyclbr.py +154 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_pyexpat.py +202 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_queue.py +158 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_quopri.py +157 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_random.py +19 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_re.py +304 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_regex.py +113 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_repr.py +278 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_rfc822.py +211 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_rgbimg.py +63 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_richcmp.py +261 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_rotor.py +28 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_sax.py +727 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_scope.py +530 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_select.py +228 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_select_new.py +229 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_sets.py +793 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_sgmllib.py +314 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_sha.py +52 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_signal.py +66 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_socket.py +1116 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_socket_ssl.py +27 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_socketserver.py +165 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_sre.py +434 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_str2unicode.py +90 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_strftime.py +146 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_string.py +223 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_strop.py +133 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_struct.py +441 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_structseq.py +28 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_subclasses.py +204 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_sunaudiodev.py +28 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_sundry.py +102 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_support.py +265 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_symtable.py +8 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_tempfile.py +10 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_thread.py +116 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_threaded_import.py +56 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_threadedtempfile.py +86 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_threading.py +55 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_time.py +47 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_timing.py +21 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_tokenize.py +9 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_trace.py +219 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_traceback.py +49 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_types.py +762 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_ucn.py +113 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_unary.py +58 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_unicode.py +815 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_unicode_file.py +95 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_unicodedata.py +125 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_unpack.py +105 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_urllib.py +109 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_urllib2.py +31 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_urlparse.py +94 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_userdict.py +120 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_userlist.py +269 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_userstring.py +43 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_uu.py +158 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_wave.py +34 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_weakref.py +573 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_winreg.py +151 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_winsound.py +6 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_xmllib.py +35 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_xmlrpc.py +37 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_xreadline.py +43 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_zipfile.py +78 -0
- data/lib/rubyfox/server/data/lib/Lib/test/test_zlib.py +482 -0
- data/lib/rubyfox/server/data/lib/Lib/test/testall.py +43 -0
- data/lib/rubyfox/server/data/lib/Lib/test/testcodec.py +48 -0
- data/lib/rubyfox/server/data/lib/Lib/test/testimg.uue +1170 -0
- data/lib/rubyfox/server/data/lib/Lib/test/testimgr.uue +1170 -0
- data/lib/rubyfox/server/data/lib/Lib/test/testrgb.uue +971 -0
- data/lib/rubyfox/server/data/lib/Lib/test/tokenize_tests.py +175 -0
- data/lib/rubyfox/server/data/lib/Lib/test/whrandom.py +96 -0
- data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/dbextstest.py +266 -0
- data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/jndi.py +33 -0
- data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/runner.py +204 -0
- data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/sptest.py +227 -0
- data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/test.xml +363 -0
- data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/test_zxjdbc_dbapi20.py +26 -0
- data/lib/rubyfox/server/data/lib/Lib/test/zxjdbc/zxtest.py +1242 -0
- data/lib/rubyfox/server/data/lib/Lib/this.py +28 -0
- data/lib/rubyfox/server/data/lib/Lib/threading.py +698 -0
- data/lib/rubyfox/server/data/lib/Lib/token$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/token.py +140 -0
- data/lib/rubyfox/server/data/lib/Lib/tokenize$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/tokenize.py +287 -0
- data/lib/rubyfox/server/data/lib/Lib/traceback$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/traceback.py +301 -0
- data/lib/rubyfox/server/data/lib/Lib/tzparse.py +98 -0
- data/lib/rubyfox/server/data/lib/Lib/unittest.py +723 -0
- data/lib/rubyfox/server/data/lib/Lib/urllib.py +1465 -0
- data/lib/rubyfox/server/data/lib/Lib/urllib2.py +1144 -0
- data/lib/rubyfox/server/data/lib/Lib/urlparse.py +276 -0
- data/lib/rubyfox/server/data/lib/Lib/user.py +45 -0
- data/lib/rubyfox/server/data/lib/Lib/uu.py +195 -0
- data/lib/rubyfox/server/data/lib/Lib/warnings$py.class +0 -0
- data/lib/rubyfox/server/data/lib/Lib/warnings.py +258 -0
- data/lib/rubyfox/server/data/lib/Lib/weakref.py +280 -0
- data/lib/rubyfox/server/data/lib/Lib/whichdb.py +87 -0
- data/lib/rubyfox/server/data/lib/Lib/whrandom.py +140 -0
- data/lib/rubyfox/server/data/lib/Lib/xdrlib.py +285 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/FtCore.py +58 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/Uri.py +380 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/__init__.py +41 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/dom/MessageSource.py +54 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/dom/NodeFilter.py +27 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/dom/__init__.py +232 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/dom/domreg.py +99 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/dom/minicompat.py +184 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/dom/minidom.py +1943 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/dom/pulldom.py +350 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/dom/xmlbuilder.py +388 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/sax/__init__.py +102 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/sax/_exceptions.py +127 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/sax/drivers2/__init__.py +1 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/sax/drivers2/drv_javasax.py +333 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/sax/handler.py +345 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/sax/saxlib.py +430 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/sax/saxutils.py +813 -0
- data/lib/rubyfox/server/data/lib/Lib/xml/sax/xmlreader.py +378 -0
- data/lib/rubyfox/server/data/lib/Lib/xmllib.py +926 -0
- data/lib/rubyfox/server/data/lib/Lib/xmlrpclib.py +1019 -0
- data/lib/rubyfox/server/data/lib/Lib/zipfile.py +586 -0
- data/lib/rubyfox/server/data/lib/Lib/zlib.py +156 -0
- data/lib/rubyfox/server/data/lib/boot.jar +0 -0
- data/lib/rubyfox/server/data/lib/cachedir/.keep +0 -0
- data/lib/rubyfox/server/data/lib/commons-beanutils-1.7.0.jar +0 -0
- data/lib/rubyfox/server/data/lib/commons-collections-3.2.1.jar +0 -0
- data/lib/rubyfox/server/data/lib/commons-dbcp-1.4.jar +0 -0
- data/lib/rubyfox/server/data/lib/commons-io-1.4.jar +0 -0
- data/lib/rubyfox/server/data/lib/commons-lang-2.4.jar +0 -0
- data/lib/rubyfox/server/data/lib/commons-logging-1.1.1.jar +0 -0
- data/lib/rubyfox/server/data/lib/commons-pool-1.5.4.jar +0 -0
- data/lib/rubyfox/server/data/lib/commons-vfs-1.0.jar +0 -0
- data/lib/rubyfox/server/data/lib/ezmorph-1.0.6.jar +0 -0
- data/lib/rubyfox/server/data/lib/httpclient-4.0.3.jar +0 -0
- data/lib/rubyfox/server/data/lib/httpcore-4.0.1.jar +0 -0
- data/lib/rubyfox/server/data/lib/imap.jar +0 -0
- data/lib/rubyfox/server/data/lib/jconsole/COPYING.txt +504 -0
- data/lib/rubyfox/server/data/lib/jconsole/bug_test_case.py +49 -0
- data/lib/rubyfox/server/data/lib/jconsole/console$py.class +0 -0
- data/lib/rubyfox/server/data/lib/jconsole/console.py +439 -0
- data/lib/rubyfox/server/data/lib/jconsole/history$py.class +0 -0
- data/lib/rubyfox/server/data/lib/jconsole/history.py +82 -0
- data/lib/rubyfox/server/data/lib/jconsole/history_test_case.py +133 -0
- data/lib/rubyfox/server/data/lib/jconsole/introspect$py.class +0 -0
- data/lib/rubyfox/server/data/lib/jconsole/introspect.py +373 -0
- data/lib/rubyfox/server/data/lib/jconsole/introspect_test_case.py +19 -0
- data/lib/rubyfox/server/data/lib/jconsole/issue_17_test_case.py +36 -0
- data/lib/rubyfox/server/data/lib/jconsole/jintrospect$py.class +0 -0
- data/lib/rubyfox/server/data/lib/jconsole/jintrospect.py +316 -0
- data/lib/rubyfox/server/data/lib/jconsole/jintrospect_test_case.py +107 -0
- data/lib/rubyfox/server/data/lib/jconsole/popup$py.class +0 -0
- data/lib/rubyfox/server/data/lib/jconsole/popup.py +178 -0
- data/lib/rubyfox/server/data/lib/jconsole/run_tests.py +8 -0
- data/lib/rubyfox/server/data/lib/jconsole/static_test_case.py +36 -0
- data/lib/rubyfox/server/data/lib/jconsole/testcase.py +38 -0
- data/lib/rubyfox/server/data/lib/jconsole/tip$py.class +0 -0
- data/lib/rubyfox/server/data/lib/jconsole/tip.py +47 -0
- data/lib/rubyfox/server/data/lib/jmx-util-1.2.3.jar +0 -0
- data/lib/rubyfox/server/data/lib/joda-time-1.6.jar +0 -0
- data/lib/rubyfox/server/data/lib/js.jar +0 -0
- data/lib/rubyfox/server/data/lib/json-lib-2.2.3-jdk15.jar +0 -0
- data/lib/rubyfox/server/data/lib/jython.jar +0 -0
- data/lib/rubyfox/server/data/lib/log4j-1.2.15.jar +0 -0
- data/lib/rubyfox/server/data/lib/logs-backup-app.jar +0 -0
- data/lib/rubyfox/server/data/lib/mailapi.jar +0 -0
- data/lib/rubyfox/server/data/lib/pop3.jar +0 -0
- data/lib/rubyfox/server/data/lib/scala-library.jar +0 -0
- data/lib/rubyfox/server/data/lib/sfs2x-admin.jar +0 -0
- data/lib/rubyfox/server/data/lib/sfs2x-core.jar +0 -0
- data/lib/rubyfox/server/data/lib/sfs2x-util.jar +0 -0
- data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
- data/lib/rubyfox/server/data/lib/slf4j-api-1.5.10.jar +0 -0
- data/lib/rubyfox/server/data/lib/slf4j-log4j12.jar +0 -0
- data/lib/rubyfox/server/data/lib/smtp.jar +0 -0
- data/lib/rubyfox/server/data/lib/terracotta-api-1.1.1.jar +0 -0
- data/lib/rubyfox/server/data/lib/ws-engine.jar +0 -0
- data/lib/rubyfox/server/data/lib/xpp3_min-1.1.4c.jar +0 -0
- data/lib/rubyfox/server/data/lib/xstream-1.3.1.jar +0 -0
- data/lib/rubyfox/server/data/logs/.keep +0 -0
- data/lib/rubyfox/server/data/logs/bluebox/.keep +0 -0
- data/lib/rubyfox/server/data/logs/boot/.keep +0 -0
- data/lib/rubyfox/server/data/logs/http/.keep +0 -0
- data/lib/rubyfox/server/data/logs/smartfox.log +295 -0
- data/lib/rubyfox/server/data/root/.keep +0 -0
- data/lib/rubyfox/server/data/root/_css_/default.css +170 -0
- data/lib/rubyfox/server/data/root/_css_/reset.css +49 -0
- data/lib/rubyfox/server/data/root/_images_/background_gradient.png +0 -0
- data/lib/rubyfox/server/data/root/_images_/background_logo.png +0 -0
- data/lib/rubyfox/server/data/root/_images_/favicon.png +0 -0
- data/lib/rubyfox/server/data/root/_images_/logo_smartfoxserver.png +0 -0
- data/lib/rubyfox/server/data/root/admin/.keep +0 -0
- data/lib/rubyfox/server/data/root/admin/AdminTool.html +108 -0
- data/lib/rubyfox/server/data/root/admin/AdminTool.swf +0 -0
- data/lib/rubyfox/server/data/root/admin/ReleaseNotes.txt +29 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/adobeFlashPlayer.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/advanced.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/banManager.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/bannedIPs.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/bannedUsernames.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/bookmarks.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/bootLog.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/buddyList.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/buddyProperties.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/connection.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/databaseManager.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/floodFilter.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/gameSettings.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/general.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/globalServerStatus.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/iPFilter.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/jVMSettings.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/logsDownload.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/mailer.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/permissionsAndEvents.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/privilegeManager.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/remoteAdmin.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/roomExtension.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/roomVariables.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/roomsAndGroups.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/runtimeLog.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/runtimeRoomSettings.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/runtimeUserSettings.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/runtimeZoneSettings.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/systemQueueStatus.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/userManagement.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/userVariables.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/usersTraffic.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/webServer.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/wordsFilter.png +0 -0
- data/lib/rubyfox/server/data/root/admin/assets/icons/tabs/zoneExtension.png +0 -0
- data/lib/rubyfox/server/data/root/admin/index.html +108 -0
- data/lib/rubyfox/server/data/root/admin/modules/BanManager/BanManager.swf +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/BanManager/icon.png +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/BlueBoxMonitor/BlueBoxMonitor.swf +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/BlueBoxMonitor/icon.png +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/LicenseManager/LicenseManager.swf +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/LicenseManager/icon.png +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/LogViewer/LogViewer.swf +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/LogViewer/icon.png +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/RuntimeStatistics/RuntimeStatistics.swf +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/RuntimeStatistics/icon.png +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/ServerConfigurator/ServerConfigurator.swf +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/ServerConfigurator/icon.png +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/ZoneConfigurator/ZoneConfigurator.swf +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/ZoneConfigurator/icon.png +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/ZoneMonitor/ZoneMonitor.swf +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/ZoneMonitor/icon.png +0 -0
- data/lib/rubyfox/server/data/root/admin/modules/config.xml +12 -0
- data/lib/rubyfox/server/data/root/admin/playerProductInstall.swf +0 -0
- data/lib/rubyfox/server/data/root/admin/swfobject.js +777 -0
- data/lib/rubyfox/server/data/root/crossdomain.xml +6 -0
- data/lib/rubyfox/server/data/root/index.html +63 -0
- data/lib/rubyfox/server/data/sfs2x-service +435 -0
- data/lib/rubyfox/server/data/sfs2x-service.vmoptions +5 -0
- data/lib/rubyfox/server/data/sfs2x.sh +12 -0
- data/lib/rubyfox/server/data/www/.keep +0 -0
- data/lib/rubyfox/server/data/www/BlueBox.war +0 -0
- data/lib/rubyfox/server/data/www/root/_css_/default.css +170 -0
- data/lib/rubyfox/server/data/www/root/_css_/reset.css +49 -0
- data/lib/rubyfox/server/data/www/root/_images_/background_gradient.png +0 -0
- data/lib/rubyfox/server/data/www/root/_images_/background_logo.png +0 -0
- data/lib/rubyfox/server/data/www/root/_images_/favicon.png +0 -0
- data/lib/rubyfox/server/data/www/root/_images_/logo_smartfoxserver.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/.keep +0 -0
- data/lib/rubyfox/server/data/www/root/admin/AdminTool.html +108 -0
- data/lib/rubyfox/server/data/www/root/admin/AdminTool.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/ReleaseNotes.txt +63 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/adobeFlashPlayer.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/advanced.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/banManager.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedIPs.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedUsernames.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bookmarks.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bootLog.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyList.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyProperties.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/connection.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/databaseManager.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/floodFilter.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/gameSettings.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/general.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/globalServerStatus.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/hTML5WebSockets.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPFilter.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/jVMSettings.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/logsDownload.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mailer.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/permissionsAndEvents.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/privilegeManager.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/remoteAdmin.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomExtension.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomVariables.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomsAndGroups.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeLog.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeRoomSettings.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeUserSettings.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeZoneSettings.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/systemQueueStatus.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userManagement.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userVariables.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/usersTraffic.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/webServer.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/wordsFilter.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneExtension.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/index.html +108 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/BanManager/BanManager.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/BanManager/icon.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/BlueBoxMonitor/BlueBoxMonitor.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/BlueBoxMonitor/icon.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/Dashboard/Dashboard.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/Dashboard/icon.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/LicenseManager/LicenseManager.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/LicenseManager/icon.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/LogViewer/LogViewer.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/LogViewer/icon.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/RuntimeStatistics/RuntimeStatistics.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/RuntimeStatistics/icon.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/ServerConfigurator/ServerConfigurator.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/ServerConfigurator/icon.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/ZoneConfigurator/ZoneConfigurator.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/ZoneConfigurator/icon.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/ZoneMonitor/ZoneMonitor.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/ZoneMonitor/icon.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/config.xml +12 -0
- data/lib/rubyfox/server/data/www/root/admin/playerProductInstall.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/swfobject.js +777 -0
- data/lib/rubyfox/server/data/www/root/crossdomain.xml +6 -0
- data/lib/rubyfox/server/data/www/root/examples/.keep +0 -0
- data/lib/rubyfox/server/data/www/root/examples/index.html +43 -0
- data/lib/rubyfox/server/data/www/root/index.html +63 -0
- data/lib/rubyfox/server/data/zones/.keep +0 -0
- data/lib/rubyfox/server/environment.rb +31 -0
- data/lib/rubyfox/server/version.rb +5 -0
- data/lib/rubyfox/server.rb +9 -0
- data/rubyfox-server.gemspec +22 -0
- metadata +1076 -0
@@ -0,0 +1,1385 @@
|
|
1
|
+
from __future__ import generators
|
2
|
+
|
3
|
+
tutorial_tests = """
|
4
|
+
Let's try a simple generator:
|
5
|
+
|
6
|
+
>>> def f():
|
7
|
+
... yield 1
|
8
|
+
... yield 2
|
9
|
+
|
10
|
+
>>> for i in f():
|
11
|
+
... print i
|
12
|
+
1
|
13
|
+
2
|
14
|
+
>>> g = f()
|
15
|
+
>>> g.next()
|
16
|
+
1
|
17
|
+
>>> g.next()
|
18
|
+
2
|
19
|
+
|
20
|
+
"Falling off the end" stops the generator:
|
21
|
+
|
22
|
+
>>> g.next()
|
23
|
+
Traceback (most recent call last):
|
24
|
+
File "<stdin>", line 1, in ?
|
25
|
+
File "<stdin>", line 2, in g
|
26
|
+
StopIteration
|
27
|
+
|
28
|
+
"return" also stops the generator:
|
29
|
+
|
30
|
+
>>> def f():
|
31
|
+
... yield 1
|
32
|
+
... return
|
33
|
+
... yield 2 # never reached
|
34
|
+
...
|
35
|
+
>>> g = f()
|
36
|
+
>>> g.next()
|
37
|
+
1
|
38
|
+
>>> g.next()
|
39
|
+
Traceback (most recent call last):
|
40
|
+
File "<stdin>", line 1, in ?
|
41
|
+
File "<stdin>", line 3, in f
|
42
|
+
StopIteration
|
43
|
+
>>> g.next() # once stopped, can't be resumed
|
44
|
+
Traceback (most recent call last):
|
45
|
+
File "<stdin>", line 1, in ?
|
46
|
+
StopIteration
|
47
|
+
|
48
|
+
"raise StopIteration" stops the generator too:
|
49
|
+
|
50
|
+
>>> def f():
|
51
|
+
... yield 1
|
52
|
+
... raise StopIteration
|
53
|
+
... yield 2 # never reached
|
54
|
+
...
|
55
|
+
>>> g = f()
|
56
|
+
>>> g.next()
|
57
|
+
1
|
58
|
+
>>> g.next()
|
59
|
+
Traceback (most recent call last):
|
60
|
+
File "<stdin>", line 1, in ?
|
61
|
+
StopIteration
|
62
|
+
>>> g.next()
|
63
|
+
Traceback (most recent call last):
|
64
|
+
File "<stdin>", line 1, in ?
|
65
|
+
StopIteration
|
66
|
+
|
67
|
+
However, they are not exactly equivalent:
|
68
|
+
|
69
|
+
>>> def g1():
|
70
|
+
... try:
|
71
|
+
... return
|
72
|
+
... except:
|
73
|
+
... yield 1
|
74
|
+
...
|
75
|
+
>>> list(g1())
|
76
|
+
[]
|
77
|
+
|
78
|
+
>>> def g2():
|
79
|
+
... try:
|
80
|
+
... raise StopIteration
|
81
|
+
... except:
|
82
|
+
... yield 42
|
83
|
+
>>> print list(g2())
|
84
|
+
[42]
|
85
|
+
|
86
|
+
This may be surprising at first:
|
87
|
+
|
88
|
+
>>> def g3():
|
89
|
+
... try:
|
90
|
+
... return
|
91
|
+
... finally:
|
92
|
+
... yield 1
|
93
|
+
...
|
94
|
+
>>> list(g3())
|
95
|
+
[1]
|
96
|
+
|
97
|
+
Let's create an alternate range() function implemented as a generator:
|
98
|
+
|
99
|
+
>>> def yrange(n):
|
100
|
+
... for i in range(n):
|
101
|
+
... yield i
|
102
|
+
...
|
103
|
+
>>> list(yrange(5))
|
104
|
+
[0, 1, 2, 3, 4]
|
105
|
+
|
106
|
+
Generators always return to the most recent caller:
|
107
|
+
|
108
|
+
>>> def creator():
|
109
|
+
... r = yrange(5)
|
110
|
+
... print "creator", r.next()
|
111
|
+
... return r
|
112
|
+
...
|
113
|
+
>>> def caller():
|
114
|
+
... r = creator()
|
115
|
+
... for i in r:
|
116
|
+
... print "caller", i
|
117
|
+
...
|
118
|
+
>>> caller()
|
119
|
+
creator 0
|
120
|
+
caller 1
|
121
|
+
caller 2
|
122
|
+
caller 3
|
123
|
+
caller 4
|
124
|
+
|
125
|
+
Generators can call other generators:
|
126
|
+
|
127
|
+
>>> def zrange(n):
|
128
|
+
... for i in yrange(n):
|
129
|
+
... yield i
|
130
|
+
...
|
131
|
+
>>> list(zrange(5))
|
132
|
+
[0, 1, 2, 3, 4]
|
133
|
+
|
134
|
+
"""
|
135
|
+
|
136
|
+
# The examples from PEP 255.
|
137
|
+
|
138
|
+
pep_tests = """
|
139
|
+
|
140
|
+
Specification: Yield
|
141
|
+
|
142
|
+
Restriction: A generator cannot be resumed while it is actively
|
143
|
+
running:
|
144
|
+
|
145
|
+
>>> def g():
|
146
|
+
... i = me.next()
|
147
|
+
... yield i
|
148
|
+
>>> me = g()
|
149
|
+
>>> me.next()
|
150
|
+
Traceback (most recent call last):
|
151
|
+
...
|
152
|
+
File "<string>", line 2, in g
|
153
|
+
ValueError: generator already executing
|
154
|
+
|
155
|
+
Specification: Return
|
156
|
+
|
157
|
+
Note that return isn't always equivalent to raising StopIteration: the
|
158
|
+
difference lies in how enclosing try/except constructs are treated.
|
159
|
+
For example,
|
160
|
+
|
161
|
+
>>> def f1():
|
162
|
+
... try:
|
163
|
+
... return
|
164
|
+
... except:
|
165
|
+
... yield 1
|
166
|
+
>>> print list(f1())
|
167
|
+
[]
|
168
|
+
|
169
|
+
because, as in any function, return simply exits, but
|
170
|
+
|
171
|
+
>>> def f2():
|
172
|
+
... try:
|
173
|
+
... raise StopIteration
|
174
|
+
... except:
|
175
|
+
... yield 42
|
176
|
+
>>> print list(f2())
|
177
|
+
[42]
|
178
|
+
|
179
|
+
because StopIteration is captured by a bare "except", as is any
|
180
|
+
exception.
|
181
|
+
|
182
|
+
Specification: Generators and Exception Propagation
|
183
|
+
|
184
|
+
>>> def f():
|
185
|
+
... return 1//0
|
186
|
+
>>> def g():
|
187
|
+
... yield f() # the zero division exception propagates
|
188
|
+
... yield 42 # and we'll never get here
|
189
|
+
>>> k = g()
|
190
|
+
>>> k.next()
|
191
|
+
Traceback (most recent call last):
|
192
|
+
File "<stdin>", line 1, in ?
|
193
|
+
File "<stdin>", line 2, in g
|
194
|
+
File "<stdin>", line 2, in f
|
195
|
+
ZeroDivisionError: integer division or modulo by zero
|
196
|
+
>>> k.next() # and the generator cannot be resumed
|
197
|
+
Traceback (most recent call last):
|
198
|
+
File "<stdin>", line 1, in ?
|
199
|
+
StopIteration
|
200
|
+
>>>
|
201
|
+
|
202
|
+
Specification: Try/Except/Finally
|
203
|
+
|
204
|
+
>>> def f():
|
205
|
+
... try:
|
206
|
+
... yield 1
|
207
|
+
... try:
|
208
|
+
... yield 2
|
209
|
+
... 1//0
|
210
|
+
... yield 3 # never get here
|
211
|
+
... except ZeroDivisionError:
|
212
|
+
... yield 4
|
213
|
+
... yield 5
|
214
|
+
... raise
|
215
|
+
... except:
|
216
|
+
... yield 6
|
217
|
+
... yield 7 # the "raise" above stops this
|
218
|
+
... except:
|
219
|
+
... yield 8
|
220
|
+
... yield 9
|
221
|
+
... try:
|
222
|
+
... x = 12
|
223
|
+
... finally:
|
224
|
+
... yield 10
|
225
|
+
... yield 11
|
226
|
+
>>> print list(f())
|
227
|
+
[1, 2, 4, 5, 8, 9, 10, 11]
|
228
|
+
>>>
|
229
|
+
|
230
|
+
Guido's binary tree example.
|
231
|
+
|
232
|
+
>>> # A binary tree class.
|
233
|
+
>>> class Tree:
|
234
|
+
...
|
235
|
+
... def __init__(self, label, left=None, right=None):
|
236
|
+
... self.label = label
|
237
|
+
... self.left = left
|
238
|
+
... self.right = right
|
239
|
+
...
|
240
|
+
... def __repr__(self, level=0, indent=" "):
|
241
|
+
... s = level*indent + `self.label`
|
242
|
+
... if self.left:
|
243
|
+
... s = s + "\\n" + self.left.__repr__(level+1, indent)
|
244
|
+
... if self.right:
|
245
|
+
... s = s + "\\n" + self.right.__repr__(level+1, indent)
|
246
|
+
... return s
|
247
|
+
...
|
248
|
+
... def __iter__(self):
|
249
|
+
... return inorder(self)
|
250
|
+
|
251
|
+
>>> # Create a Tree from a list.
|
252
|
+
>>> def tree(list):
|
253
|
+
... n = len(list)
|
254
|
+
... if n == 0:
|
255
|
+
... return []
|
256
|
+
... i = n // 2
|
257
|
+
... return Tree(list[i], tree(list[:i]), tree(list[i+1:]))
|
258
|
+
|
259
|
+
>>> # Show it off: create a tree.
|
260
|
+
>>> t = tree("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
261
|
+
|
262
|
+
>>> # A recursive generator that generates Tree leaves in in-order.
|
263
|
+
>>> def inorder(t):
|
264
|
+
... if t:
|
265
|
+
... for x in inorder(t.left):
|
266
|
+
... yield x
|
267
|
+
... yield t.label
|
268
|
+
... for x in inorder(t.right):
|
269
|
+
... yield x
|
270
|
+
|
271
|
+
>>> # Show it off: create a tree.
|
272
|
+
... t = tree("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
273
|
+
... # Print the nodes of the tree in in-order.
|
274
|
+
... for x in t:
|
275
|
+
... print x,
|
276
|
+
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
|
277
|
+
|
278
|
+
>>> # A non-recursive generator.
|
279
|
+
>>> def inorder(node):
|
280
|
+
... stack = []
|
281
|
+
... while node:
|
282
|
+
... while node.left:
|
283
|
+
... stack.append(node)
|
284
|
+
... node = node.left
|
285
|
+
... yield node.label
|
286
|
+
... while not node.right:
|
287
|
+
... try:
|
288
|
+
... node = stack.pop()
|
289
|
+
... except IndexError:
|
290
|
+
... return
|
291
|
+
... yield node.label
|
292
|
+
... node = node.right
|
293
|
+
|
294
|
+
>>> # Exercise the non-recursive generator.
|
295
|
+
>>> for x in t:
|
296
|
+
... print x,
|
297
|
+
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
|
298
|
+
|
299
|
+
"""
|
300
|
+
|
301
|
+
# Examples from Iterator-List and Python-Dev and c.l.py.
|
302
|
+
|
303
|
+
email_tests = """
|
304
|
+
|
305
|
+
The difference between yielding None and returning it.
|
306
|
+
|
307
|
+
>>> def g():
|
308
|
+
... for i in range(3):
|
309
|
+
... yield None
|
310
|
+
... yield None
|
311
|
+
... return
|
312
|
+
>>> list(g())
|
313
|
+
[None, None, None, None]
|
314
|
+
|
315
|
+
Ensure that explicitly raising StopIteration acts like any other exception
|
316
|
+
in try/except, not like a return.
|
317
|
+
|
318
|
+
>>> def g():
|
319
|
+
... yield 1
|
320
|
+
... try:
|
321
|
+
... raise StopIteration
|
322
|
+
... except:
|
323
|
+
... yield 2
|
324
|
+
... yield 3
|
325
|
+
>>> list(g())
|
326
|
+
[1, 2, 3]
|
327
|
+
|
328
|
+
Next one was posted to c.l.py.
|
329
|
+
|
330
|
+
>>> def gcomb(x, k):
|
331
|
+
... "Generate all combinations of k elements from list x."
|
332
|
+
...
|
333
|
+
... if k > len(x):
|
334
|
+
... return
|
335
|
+
... if k == 0:
|
336
|
+
... yield []
|
337
|
+
... else:
|
338
|
+
... first, rest = x[0], x[1:]
|
339
|
+
... # A combination does or doesn't contain first.
|
340
|
+
... # If it does, the remainder is a k-1 comb of rest.
|
341
|
+
... for c in gcomb(rest, k-1):
|
342
|
+
... c.insert(0, first)
|
343
|
+
... yield c
|
344
|
+
... # If it doesn't contain first, it's a k comb of rest.
|
345
|
+
... for c in gcomb(rest, k):
|
346
|
+
... yield c
|
347
|
+
|
348
|
+
>>> seq = range(1, 5)
|
349
|
+
>>> for k in range(len(seq) + 2):
|
350
|
+
... print "%d-combs of %s:" % (k, seq)
|
351
|
+
... for c in gcomb(seq, k):
|
352
|
+
... print " ", c
|
353
|
+
0-combs of [1, 2, 3, 4]:
|
354
|
+
[]
|
355
|
+
1-combs of [1, 2, 3, 4]:
|
356
|
+
[1]
|
357
|
+
[2]
|
358
|
+
[3]
|
359
|
+
[4]
|
360
|
+
2-combs of [1, 2, 3, 4]:
|
361
|
+
[1, 2]
|
362
|
+
[1, 3]
|
363
|
+
[1, 4]
|
364
|
+
[2, 3]
|
365
|
+
[2, 4]
|
366
|
+
[3, 4]
|
367
|
+
3-combs of [1, 2, 3, 4]:
|
368
|
+
[1, 2, 3]
|
369
|
+
[1, 2, 4]
|
370
|
+
[1, 3, 4]
|
371
|
+
[2, 3, 4]
|
372
|
+
4-combs of [1, 2, 3, 4]:
|
373
|
+
[1, 2, 3, 4]
|
374
|
+
5-combs of [1, 2, 3, 4]:
|
375
|
+
|
376
|
+
From the Iterators list, about the types of these things.
|
377
|
+
|
378
|
+
>>> def g():
|
379
|
+
... yield 1
|
380
|
+
...
|
381
|
+
>>> type(g)
|
382
|
+
<type 'function'>
|
383
|
+
>>> i = g()
|
384
|
+
>>> type(i)
|
385
|
+
<type 'generator'>
|
386
|
+
>>> [s for s in dir(i) if not s.startswith('_')]
|
387
|
+
['gi_frame', 'gi_running', 'next']
|
388
|
+
>>> print i.next.__doc__
|
389
|
+
x.next() -> the next value, or raise StopIteration
|
390
|
+
>>> iter(i) is i
|
391
|
+
1
|
392
|
+
>>> import types
|
393
|
+
>>> isinstance(i, types.GeneratorType)
|
394
|
+
1
|
395
|
+
|
396
|
+
And more, added later.
|
397
|
+
|
398
|
+
>>> i.gi_running
|
399
|
+
0
|
400
|
+
>>> type(i.gi_frame)
|
401
|
+
<type 'frame'>
|
402
|
+
>>> i.gi_running = 42
|
403
|
+
Traceback (most recent call last):
|
404
|
+
...
|
405
|
+
AttributeError: object internal __set__ impl is abstract
|
406
|
+
>>> def g():
|
407
|
+
... yield me.gi_running
|
408
|
+
>>> me = g()
|
409
|
+
>>> me.gi_running
|
410
|
+
0
|
411
|
+
>>> me.next()
|
412
|
+
1
|
413
|
+
>>> me.gi_running
|
414
|
+
0
|
415
|
+
|
416
|
+
A clever union-find implementation from c.l.py, due to David Eppstein.
|
417
|
+
Sent: Friday, June 29, 2001 12:16 PM
|
418
|
+
To: python-list@python.org
|
419
|
+
Subject: Re: PEP 255: Simple Generators
|
420
|
+
|
421
|
+
>>> class disjointSet:
|
422
|
+
... def __init__(self, name):
|
423
|
+
... self.name = name
|
424
|
+
... self.parent = None
|
425
|
+
... self.generator = self.generate()
|
426
|
+
...
|
427
|
+
... def generate(self):
|
428
|
+
... while not self.parent:
|
429
|
+
... yield self
|
430
|
+
... for x in self.parent.generator:
|
431
|
+
... yield x
|
432
|
+
...
|
433
|
+
... def find(self):
|
434
|
+
... return self.generator.next()
|
435
|
+
...
|
436
|
+
... def union(self, parent):
|
437
|
+
... if self.parent:
|
438
|
+
... raise ValueError("Sorry, I'm not a root!")
|
439
|
+
... self.parent = parent
|
440
|
+
...
|
441
|
+
... def __str__(self):
|
442
|
+
... return self.name
|
443
|
+
|
444
|
+
>>> names = "ABCDEFGHIJKLM"
|
445
|
+
>>> sets = [disjointSet(name) for name in names]
|
446
|
+
>>> roots = sets[:]
|
447
|
+
|
448
|
+
>>> import random
|
449
|
+
>>> random.seed(42)
|
450
|
+
>>> while 1:
|
451
|
+
... for s in sets:
|
452
|
+
... print "%s->%s" % (s, s.find()),
|
453
|
+
... print
|
454
|
+
... if len(roots) > 1:
|
455
|
+
... s1 = random.choice(roots)
|
456
|
+
... roots.remove(s1)
|
457
|
+
... s2 = random.choice(roots)
|
458
|
+
... s1.union(s2)
|
459
|
+
... print "merged", s1, "into", s2
|
460
|
+
... else:
|
461
|
+
... break
|
462
|
+
A->A B->B C->C D->D E->E F->F G->G H->H I->I J->J K->K L->L M->M
|
463
|
+
merged D into G
|
464
|
+
A->A B->B C->C D->G E->E F->F G->G H->H I->I J->J K->K L->L M->M
|
465
|
+
merged C into F
|
466
|
+
A->A B->B C->F D->G E->E F->F G->G H->H I->I J->J K->K L->L M->M
|
467
|
+
merged L into A
|
468
|
+
A->A B->B C->F D->G E->E F->F G->G H->H I->I J->J K->K L->A M->M
|
469
|
+
merged H into E
|
470
|
+
A->A B->B C->F D->G E->E F->F G->G H->E I->I J->J K->K L->A M->M
|
471
|
+
merged B into E
|
472
|
+
A->A B->E C->F D->G E->E F->F G->G H->E I->I J->J K->K L->A M->M
|
473
|
+
merged J into G
|
474
|
+
A->A B->E C->F D->G E->E F->F G->G H->E I->I J->G K->K L->A M->M
|
475
|
+
merged E into G
|
476
|
+
A->A B->G C->F D->G E->G F->F G->G H->G I->I J->G K->K L->A M->M
|
477
|
+
merged M into G
|
478
|
+
A->A B->G C->F D->G E->G F->F G->G H->G I->I J->G K->K L->A M->G
|
479
|
+
merged I into K
|
480
|
+
A->A B->G C->F D->G E->G F->F G->G H->G I->K J->G K->K L->A M->G
|
481
|
+
merged K into A
|
482
|
+
A->A B->G C->F D->G E->G F->F G->G H->G I->A J->G K->A L->A M->G
|
483
|
+
merged F into A
|
484
|
+
A->A B->G C->A D->G E->G F->A G->G H->G I->A J->G K->A L->A M->G
|
485
|
+
merged A into G
|
486
|
+
A->G B->G C->G D->G E->G F->G G->G H->G I->G J->G K->G L->G M->G
|
487
|
+
"""
|
488
|
+
|
489
|
+
# Fun tests (for sufficiently warped notions of "fun").
|
490
|
+
|
491
|
+
fun_tests = """
|
492
|
+
|
493
|
+
Build up to a recursive Sieve of Eratosthenes generator.
|
494
|
+
|
495
|
+
>>> def firstn(g, n):
|
496
|
+
... return [g.next() for i in range(n)]
|
497
|
+
|
498
|
+
>>> def intsfrom(i):
|
499
|
+
... while 1:
|
500
|
+
... yield i
|
501
|
+
... i += 1
|
502
|
+
|
503
|
+
>>> firstn(intsfrom(5), 7)
|
504
|
+
[5, 6, 7, 8, 9, 10, 11]
|
505
|
+
|
506
|
+
>>> def exclude_multiples(n, ints):
|
507
|
+
... for i in ints:
|
508
|
+
... if i % n:
|
509
|
+
... yield i
|
510
|
+
|
511
|
+
>>> firstn(exclude_multiples(3, intsfrom(1)), 6)
|
512
|
+
[1, 2, 4, 5, 7, 8]
|
513
|
+
|
514
|
+
>>> def sieve(ints):
|
515
|
+
... prime = ints.next()
|
516
|
+
... yield prime
|
517
|
+
... not_divisible_by_prime = exclude_multiples(prime, ints)
|
518
|
+
... for p in sieve(not_divisible_by_prime):
|
519
|
+
... yield p
|
520
|
+
|
521
|
+
>>> primes = sieve(intsfrom(2))
|
522
|
+
>>> firstn(primes, 20)
|
523
|
+
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]
|
524
|
+
|
525
|
+
|
526
|
+
Another famous problem: generate all integers of the form
|
527
|
+
2**i * 3**j * 5**k
|
528
|
+
in increasing order, where i,j,k >= 0. Trickier than it may look at first!
|
529
|
+
Try writing it without generators, and correctly, and without generating
|
530
|
+
3 internal results for each result output.
|
531
|
+
|
532
|
+
>>> def times(n, g):
|
533
|
+
... for i in g:
|
534
|
+
... yield n * i
|
535
|
+
>>> firstn(times(10, intsfrom(1)), 10)
|
536
|
+
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
|
537
|
+
|
538
|
+
>>> def merge(g, h):
|
539
|
+
... ng = g.next()
|
540
|
+
... nh = h.next()
|
541
|
+
... while 1:
|
542
|
+
... if ng < nh:
|
543
|
+
... yield ng
|
544
|
+
... ng = g.next()
|
545
|
+
... elif ng > nh:
|
546
|
+
... yield nh
|
547
|
+
... nh = h.next()
|
548
|
+
... else:
|
549
|
+
... yield ng
|
550
|
+
... ng = g.next()
|
551
|
+
... nh = h.next()
|
552
|
+
|
553
|
+
The following works, but is doing a whale of a lot of redundant work --
|
554
|
+
it's not clear how to get the internal uses of m235 to share a single
|
555
|
+
generator. Note that me_times2 (etc) each need to see every element in the
|
556
|
+
result sequence. So this is an example where lazy lists are more natural
|
557
|
+
(you can look at the head of a lazy list any number of times).
|
558
|
+
|
559
|
+
>>> def m235():
|
560
|
+
... yield 1
|
561
|
+
... me_times2 = times(2, m235())
|
562
|
+
... me_times3 = times(3, m235())
|
563
|
+
... me_times5 = times(5, m235())
|
564
|
+
... for i in merge(merge(me_times2,
|
565
|
+
... me_times3),
|
566
|
+
... me_times5):
|
567
|
+
... yield i
|
568
|
+
|
569
|
+
Don't print "too many" of these -- the implementation above is extremely
|
570
|
+
inefficient: each call of m235() leads to 3 recursive calls, and in
|
571
|
+
turn each of those 3 more, and so on, and so on, until we've descended
|
572
|
+
enough levels to satisfy the print stmts. Very odd: when I printed 5
|
573
|
+
lines of results below, this managed to screw up Win98's malloc in "the
|
574
|
+
usual" way, i.e. the heap grew over 4Mb so Win98 started fragmenting
|
575
|
+
address space, and it *looked* like a very slow leak.
|
576
|
+
|
577
|
+
>>> result = m235()
|
578
|
+
>>> for i in range(3):
|
579
|
+
... print firstn(result, 15)
|
580
|
+
[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24]
|
581
|
+
[25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80]
|
582
|
+
[81, 90, 96, 100, 108, 120, 125, 128, 135, 144, 150, 160, 162, 180, 192]
|
583
|
+
|
584
|
+
Heh. Here's one way to get a shared list, complete with an excruciating
|
585
|
+
namespace renaming trick. The *pretty* part is that the times() and merge()
|
586
|
+
functions can be reused as-is, because they only assume their stream
|
587
|
+
arguments are iterable -- a LazyList is the same as a generator to times().
|
588
|
+
|
589
|
+
>>> class LazyList:
|
590
|
+
... def __init__(self, g):
|
591
|
+
... self.sofar = []
|
592
|
+
... self.fetch = g.next
|
593
|
+
...
|
594
|
+
... def __getitem__(self, i):
|
595
|
+
... sofar, fetch = self.sofar, self.fetch
|
596
|
+
... while i >= len(sofar):
|
597
|
+
... sofar.append(fetch())
|
598
|
+
... return sofar[i]
|
599
|
+
|
600
|
+
>>> def m235():
|
601
|
+
... yield 1
|
602
|
+
... # Gack: m235 below actually refers to a LazyList.
|
603
|
+
... me_times2 = times(2, m235)
|
604
|
+
... me_times3 = times(3, m235)
|
605
|
+
... me_times5 = times(5, m235)
|
606
|
+
... for i in merge(merge(me_times2,
|
607
|
+
... me_times3),
|
608
|
+
... me_times5):
|
609
|
+
... yield i
|
610
|
+
|
611
|
+
Print as many of these as you like -- *this* implementation is memory-
|
612
|
+
efficient.
|
613
|
+
|
614
|
+
>>> m235 = LazyList(m235())
|
615
|
+
>>> for i in range(5):
|
616
|
+
... print [m235[j] for j in range(15*i, 15*(i+1))]
|
617
|
+
[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24]
|
618
|
+
[25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80]
|
619
|
+
[81, 90, 96, 100, 108, 120, 125, 128, 135, 144, 150, 160, 162, 180, 192]
|
620
|
+
[200, 216, 225, 240, 243, 250, 256, 270, 288, 300, 320, 324, 360, 375, 384]
|
621
|
+
[400, 405, 432, 450, 480, 486, 500, 512, 540, 576, 600, 625, 640, 648, 675]
|
622
|
+
|
623
|
+
|
624
|
+
Ye olde Fibonacci generator, LazyList style.
|
625
|
+
|
626
|
+
>>> def fibgen(a, b):
|
627
|
+
...
|
628
|
+
... def sum(g, h):
|
629
|
+
... while 1:
|
630
|
+
... yield g.next() + h.next()
|
631
|
+
...
|
632
|
+
... def tail(g):
|
633
|
+
... g.next() # throw first away
|
634
|
+
... for x in g:
|
635
|
+
... yield x
|
636
|
+
...
|
637
|
+
... yield a
|
638
|
+
... yield b
|
639
|
+
... for s in sum(iter(fib),
|
640
|
+
... tail(iter(fib))):
|
641
|
+
... yield s
|
642
|
+
|
643
|
+
>>> fib = LazyList(fibgen(1, 2))
|
644
|
+
>>> firstn(iter(fib), 17)
|
645
|
+
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584]
|
646
|
+
"""
|
647
|
+
|
648
|
+
# syntax_tests mostly provokes SyntaxErrors. Also fiddling with #if 0
|
649
|
+
# hackery.
|
650
|
+
|
651
|
+
syntax_tests = """
|
652
|
+
|
653
|
+
>>> def f():
|
654
|
+
... return 22
|
655
|
+
... yield 1
|
656
|
+
Traceback (most recent call last):
|
657
|
+
...
|
658
|
+
SyntaxError: 'return' with argument inside generator
|
659
|
+
|
660
|
+
>>> def f():
|
661
|
+
... yield 1
|
662
|
+
... return 22
|
663
|
+
Traceback (most recent call last):
|
664
|
+
...
|
665
|
+
SyntaxError: 'return' with argument inside generator
|
666
|
+
|
667
|
+
"return None" is not the same as "return" in a generator:
|
668
|
+
|
669
|
+
>>> def f():
|
670
|
+
... yield 1
|
671
|
+
... return None
|
672
|
+
Traceback (most recent call last):
|
673
|
+
...
|
674
|
+
SyntaxError: 'return' with argument inside generator
|
675
|
+
|
676
|
+
This one is fine:
|
677
|
+
|
678
|
+
>>> def f():
|
679
|
+
... yield 1
|
680
|
+
... return
|
681
|
+
|
682
|
+
>>> def f():
|
683
|
+
... try:
|
684
|
+
... yield 1
|
685
|
+
... finally:
|
686
|
+
... pass
|
687
|
+
Traceback (most recent call last):
|
688
|
+
...
|
689
|
+
SyntaxError: 'yield' not allowed in a 'try' block with a 'finally' clause
|
690
|
+
|
691
|
+
>>> def f():
|
692
|
+
... try:
|
693
|
+
... try:
|
694
|
+
... 1//0
|
695
|
+
... except ZeroDivisionError:
|
696
|
+
... yield 666 # bad because *outer* try has finally
|
697
|
+
... except:
|
698
|
+
... pass
|
699
|
+
... finally:
|
700
|
+
... pass
|
701
|
+
Traceback (most recent call last):
|
702
|
+
...
|
703
|
+
SyntaxError: 'yield' not allowed in a 'try' block with a 'finally' clause
|
704
|
+
|
705
|
+
But this is fine:
|
706
|
+
|
707
|
+
>>> def f():
|
708
|
+
... try:
|
709
|
+
... try:
|
710
|
+
... yield 12
|
711
|
+
... 1//0
|
712
|
+
... except ZeroDivisionError:
|
713
|
+
... yield 666
|
714
|
+
... except:
|
715
|
+
... try:
|
716
|
+
... x = 12
|
717
|
+
... finally:
|
718
|
+
... yield 12
|
719
|
+
... except:
|
720
|
+
... return
|
721
|
+
>>> list(f())
|
722
|
+
[12, 666]
|
723
|
+
|
724
|
+
>>> def f():
|
725
|
+
... yield
|
726
|
+
Traceback (most recent call last):
|
727
|
+
SyntaxError: invalid syntax
|
728
|
+
|
729
|
+
>>> def f():
|
730
|
+
... if 0:
|
731
|
+
... yield
|
732
|
+
Traceback (most recent call last):
|
733
|
+
SyntaxError: invalid syntax
|
734
|
+
|
735
|
+
>>> def f():
|
736
|
+
... if 0:
|
737
|
+
... yield 1
|
738
|
+
>>> type(f())
|
739
|
+
<type 'generator'>
|
740
|
+
|
741
|
+
>>> def f():
|
742
|
+
... if "":
|
743
|
+
... yield None
|
744
|
+
>>> type(f())
|
745
|
+
<type 'generator'>
|
746
|
+
|
747
|
+
>>> def f():
|
748
|
+
... return
|
749
|
+
... try:
|
750
|
+
... if x==4:
|
751
|
+
... pass
|
752
|
+
... elif 0:
|
753
|
+
... try:
|
754
|
+
... 1//0
|
755
|
+
... except SyntaxError:
|
756
|
+
... pass
|
757
|
+
... else:
|
758
|
+
... if 0:
|
759
|
+
... while 12:
|
760
|
+
... x += 1
|
761
|
+
... yield 2 # don't blink
|
762
|
+
... f(a, b, c, d, e)
|
763
|
+
... else:
|
764
|
+
... pass
|
765
|
+
... except:
|
766
|
+
... x = 1
|
767
|
+
... return
|
768
|
+
>>> type(f())
|
769
|
+
<type 'generator'>
|
770
|
+
|
771
|
+
>>> def f():
|
772
|
+
... if 0:
|
773
|
+
... def g():
|
774
|
+
... yield 1
|
775
|
+
...
|
776
|
+
>>> type(f())
|
777
|
+
<type 'NoneType'>
|
778
|
+
|
779
|
+
>>> def f():
|
780
|
+
... if 0:
|
781
|
+
... class C:
|
782
|
+
... def __init__(self):
|
783
|
+
... yield 1
|
784
|
+
... def f(self):
|
785
|
+
... yield 2
|
786
|
+
>>> type(f())
|
787
|
+
<type 'NoneType'>
|
788
|
+
|
789
|
+
>>> def f():
|
790
|
+
... if 0:
|
791
|
+
... return
|
792
|
+
... if 0:
|
793
|
+
... yield 2
|
794
|
+
>>> type(f())
|
795
|
+
<type 'generator'>
|
796
|
+
|
797
|
+
|
798
|
+
>>> def f():
|
799
|
+
... if 0:
|
800
|
+
... lambda x: x # shouldn't trigger here
|
801
|
+
... def f(i): # note: removed a bare return in this test.
|
802
|
+
... return 2*i # or here
|
803
|
+
... if 0:
|
804
|
+
... return 3 # but *this* sucks (line 8)
|
805
|
+
... if 0:
|
806
|
+
... yield 2 # because it's a generator
|
807
|
+
Traceback (most recent call last):
|
808
|
+
SyntaxError: 'return' with argument inside generator
|
809
|
+
|
810
|
+
This one caused a crash (see SF bug 567538):
|
811
|
+
|
812
|
+
>>> def f():
|
813
|
+
... for i in range(3):
|
814
|
+
... try:
|
815
|
+
... continue
|
816
|
+
... finally:
|
817
|
+
... yield i
|
818
|
+
...
|
819
|
+
>>> g = f()
|
820
|
+
>>> print g.next()
|
821
|
+
0
|
822
|
+
>>> print g.next()
|
823
|
+
1
|
824
|
+
>>> print g.next()
|
825
|
+
2
|
826
|
+
>>> print g.next()
|
827
|
+
Traceback (most recent call last):
|
828
|
+
StopIteration
|
829
|
+
"""
|
830
|
+
|
831
|
+
# conjoin is a simple backtracking generator, named in honor of Icon's
|
832
|
+
# "conjunction" control structure. Pass a list of no-argument functions
|
833
|
+
# that return iterable objects. Easiest to explain by example: assume the
|
834
|
+
# function list [x, y, z] is passed. Then conjoin acts like:
|
835
|
+
#
|
836
|
+
# def g():
|
837
|
+
# values = [None] * 3
|
838
|
+
# for values[0] in x():
|
839
|
+
# for values[1] in y():
|
840
|
+
# for values[2] in z():
|
841
|
+
# yield values
|
842
|
+
#
|
843
|
+
# So some 3-lists of values *may* be generated, each time we successfully
|
844
|
+
# get into the innermost loop. If an iterator fails (is exhausted) before
|
845
|
+
# then, it "backtracks" to get the next value from the nearest enclosing
|
846
|
+
# iterator (the one "to the left"), and starts all over again at the next
|
847
|
+
# slot (pumps a fresh iterator). Of course this is most useful when the
|
848
|
+
# iterators have side-effects, so that which values *can* be generated at
|
849
|
+
# each slot depend on the values iterated at previous slots.
|
850
|
+
|
851
|
+
def conjoin(gs):
|
852
|
+
|
853
|
+
values = [None] * len(gs)
|
854
|
+
|
855
|
+
def gen(i, values=values):
|
856
|
+
if i >= len(gs):
|
857
|
+
yield values
|
858
|
+
else:
|
859
|
+
for values[i] in gs[i]():
|
860
|
+
for x in gen(i+1):
|
861
|
+
yield x
|
862
|
+
|
863
|
+
for x in gen(0):
|
864
|
+
yield x
|
865
|
+
|
866
|
+
# That works fine, but recursing a level and checking i against len(gs) for
|
867
|
+
# each item produced is inefficient. By doing manual loop unrolling across
|
868
|
+
# generator boundaries, it's possible to eliminate most of that overhead.
|
869
|
+
# This isn't worth the bother *in general* for generators, but conjoin() is
|
870
|
+
# a core building block for some CPU-intensive generator applications.
|
871
|
+
|
872
|
+
def conjoin(gs):
|
873
|
+
|
874
|
+
n = len(gs)
|
875
|
+
values = [None] * n
|
876
|
+
|
877
|
+
# Do one loop nest at time recursively, until the # of loop nests
|
878
|
+
# remaining is divisible by 3.
|
879
|
+
|
880
|
+
def gen(i, values=values):
|
881
|
+
if i >= n:
|
882
|
+
yield values
|
883
|
+
|
884
|
+
elif (n-i) % 3:
|
885
|
+
ip1 = i+1
|
886
|
+
for values[i] in gs[i]():
|
887
|
+
for x in gen(ip1):
|
888
|
+
yield x
|
889
|
+
|
890
|
+
else:
|
891
|
+
for x in _gen3(i):
|
892
|
+
yield x
|
893
|
+
|
894
|
+
# Do three loop nests at a time, recursing only if at least three more
|
895
|
+
# remain. Don't call directly: this is an internal optimization for
|
896
|
+
# gen's use.
|
897
|
+
|
898
|
+
def _gen3(i, values=values):
|
899
|
+
assert i < n and (n-i) % 3 == 0
|
900
|
+
ip1, ip2, ip3 = i+1, i+2, i+3
|
901
|
+
g, g1, g2 = gs[i : ip3]
|
902
|
+
|
903
|
+
if ip3 >= n:
|
904
|
+
# These are the last three, so we can yield values directly.
|
905
|
+
for values[i] in g():
|
906
|
+
for values[ip1] in g1():
|
907
|
+
for values[ip2] in g2():
|
908
|
+
yield values
|
909
|
+
|
910
|
+
else:
|
911
|
+
# At least 6 loop nests remain; peel off 3 and recurse for the
|
912
|
+
# rest.
|
913
|
+
for values[i] in g():
|
914
|
+
for values[ip1] in g1():
|
915
|
+
for values[ip2] in g2():
|
916
|
+
for x in _gen3(ip3):
|
917
|
+
yield x
|
918
|
+
|
919
|
+
for x in gen(0):
|
920
|
+
yield x
|
921
|
+
|
922
|
+
# And one more approach: For backtracking apps like the Knight's Tour
|
923
|
+
# solver below, the number of backtracking levels can be enormous (one
|
924
|
+
# level per square, for the Knight's Tour, so that e.g. a 100x100 board
|
925
|
+
# needs 10,000 levels). In such cases Python is likely to run out of
|
926
|
+
# stack space due to recursion. So here's a recursion-free version of
|
927
|
+
# conjoin too.
|
928
|
+
# NOTE WELL: This allows large problems to be solved with only trivial
|
929
|
+
# demands on stack space. Without explicitly resumable generators, this is
|
930
|
+
# much harder to achieve. OTOH, this is much slower (up to a factor of 2)
|
931
|
+
# than the fancy unrolled recursive conjoin.
|
932
|
+
|
933
|
+
def flat_conjoin(gs): # rename to conjoin to run tests with this instead
|
934
|
+
n = len(gs)
|
935
|
+
values = [None] * n
|
936
|
+
iters = [None] * n
|
937
|
+
_StopIteration = StopIteration # make local because caught a *lot*
|
938
|
+
i = 0
|
939
|
+
while 1:
|
940
|
+
# Descend.
|
941
|
+
try:
|
942
|
+
while i < n:
|
943
|
+
it = iters[i] = gs[i]().next
|
944
|
+
values[i] = it()
|
945
|
+
i += 1
|
946
|
+
except _StopIteration:
|
947
|
+
pass
|
948
|
+
else:
|
949
|
+
assert i == n
|
950
|
+
yield values
|
951
|
+
|
952
|
+
# Backtrack until an older iterator can be resumed.
|
953
|
+
i -= 1
|
954
|
+
while i >= 0:
|
955
|
+
try:
|
956
|
+
values[i] = iters[i]()
|
957
|
+
# Success! Start fresh at next level.
|
958
|
+
i += 1
|
959
|
+
break
|
960
|
+
except _StopIteration:
|
961
|
+
# Continue backtracking.
|
962
|
+
i -= 1
|
963
|
+
else:
|
964
|
+
assert i < 0
|
965
|
+
break
|
966
|
+
|
967
|
+
# A conjoin-based N-Queens solver.
|
968
|
+
|
969
|
+
class Queens:
|
970
|
+
def __init__(self, n):
|
971
|
+
self.n = n
|
972
|
+
rangen = range(n)
|
973
|
+
|
974
|
+
# Assign a unique int to each column and diagonal.
|
975
|
+
# columns: n of those, range(n).
|
976
|
+
# NW-SE diagonals: 2n-1 of these, i-j unique and invariant along
|
977
|
+
# each, smallest i-j is 0-(n-1) = 1-n, so add n-1 to shift to 0-
|
978
|
+
# based.
|
979
|
+
# NE-SW diagonals: 2n-1 of these, i+j unique and invariant along
|
980
|
+
# each, smallest i+j is 0, largest is 2n-2.
|
981
|
+
|
982
|
+
# For each square, compute a bit vector of the columns and
|
983
|
+
# diagonals it covers, and for each row compute a function that
|
984
|
+
# generates the possiblities for the columns in that row.
|
985
|
+
self.rowgenerators = []
|
986
|
+
for i in rangen:
|
987
|
+
rowuses = [(1L << j) | # column ordinal
|
988
|
+
(1L << (n + i-j + n-1)) | # NW-SE ordinal
|
989
|
+
(1L << (n + 2*n-1 + i+j)) # NE-SW ordinal
|
990
|
+
for j in rangen]
|
991
|
+
|
992
|
+
def rowgen(rowuses=rowuses):
|
993
|
+
for j in rangen:
|
994
|
+
uses = rowuses[j]
|
995
|
+
if uses & self.used == 0:
|
996
|
+
self.used |= uses
|
997
|
+
yield j
|
998
|
+
self.used &= ~uses
|
999
|
+
|
1000
|
+
self.rowgenerators.append(rowgen)
|
1001
|
+
|
1002
|
+
# Generate solutions.
|
1003
|
+
def solve(self):
|
1004
|
+
self.used = 0
|
1005
|
+
for row2col in conjoin(self.rowgenerators):
|
1006
|
+
yield row2col
|
1007
|
+
|
1008
|
+
def printsolution(self, row2col):
|
1009
|
+
n = self.n
|
1010
|
+
assert n == len(row2col)
|
1011
|
+
sep = "+" + "-+" * n
|
1012
|
+
print sep
|
1013
|
+
for i in range(n):
|
1014
|
+
squares = [" " for j in range(n)]
|
1015
|
+
squares[row2col[i]] = "Q"
|
1016
|
+
print "|" + "|".join(squares) + "|"
|
1017
|
+
print sep
|
1018
|
+
|
1019
|
+
# A conjoin-based Knight's Tour solver. This is pretty sophisticated
|
1020
|
+
# (e.g., when used with flat_conjoin above, and passing hard=1 to the
|
1021
|
+
# constructor, a 200x200 Knight's Tour was found quickly -- note that we're
|
1022
|
+
# creating 10s of thousands of generators then!), and is lengthy.
|
1023
|
+
|
1024
|
+
class Knights:
|
1025
|
+
def __init__(self, m, n, hard=0):
|
1026
|
+
self.m, self.n = m, n
|
1027
|
+
|
1028
|
+
# solve() will set up succs[i] to be a list of square #i's
|
1029
|
+
# successors.
|
1030
|
+
succs = self.succs = []
|
1031
|
+
|
1032
|
+
# Remove i0 from each of its successor's successor lists, i.e.
|
1033
|
+
# successors can't go back to i0 again. Return 0 if we can
|
1034
|
+
# detect this makes a solution impossible, else return 1.
|
1035
|
+
|
1036
|
+
def remove_from_successors(i0, len=len):
|
1037
|
+
# If we remove all exits from a free square, we're dead:
|
1038
|
+
# even if we move to it next, we can't leave it again.
|
1039
|
+
# If we create a square with one exit, we must visit it next;
|
1040
|
+
# else somebody else will have to visit it, and since there's
|
1041
|
+
# only one adjacent, there won't be a way to leave it again.
|
1042
|
+
# Finelly, if we create more than one free square with a
|
1043
|
+
# single exit, we can only move to one of them next, leaving
|
1044
|
+
# the other one a dead end.
|
1045
|
+
ne0 = ne1 = 0
|
1046
|
+
for i in succs[i0]:
|
1047
|
+
s = succs[i]
|
1048
|
+
s.remove(i0)
|
1049
|
+
e = len(s)
|
1050
|
+
if e == 0:
|
1051
|
+
ne0 += 1
|
1052
|
+
elif e == 1:
|
1053
|
+
ne1 += 1
|
1054
|
+
return ne0 == 0 and ne1 < 2
|
1055
|
+
|
1056
|
+
# Put i0 back in each of its successor's successor lists.
|
1057
|
+
|
1058
|
+
def add_to_successors(i0):
|
1059
|
+
for i in succs[i0]:
|
1060
|
+
succs[i].append(i0)
|
1061
|
+
|
1062
|
+
# Generate the first move.
|
1063
|
+
def first():
|
1064
|
+
if m < 1 or n < 1:
|
1065
|
+
return
|
1066
|
+
|
1067
|
+
# Since we're looking for a cycle, it doesn't matter where we
|
1068
|
+
# start. Starting in a corner makes the 2nd move easy.
|
1069
|
+
corner = self.coords2index(0, 0)
|
1070
|
+
remove_from_successors(corner)
|
1071
|
+
self.lastij = corner
|
1072
|
+
yield corner
|
1073
|
+
add_to_successors(corner)
|
1074
|
+
|
1075
|
+
# Generate the second moves.
|
1076
|
+
def second():
|
1077
|
+
corner = self.coords2index(0, 0)
|
1078
|
+
assert self.lastij == corner # i.e., we started in the corner
|
1079
|
+
if m < 3 or n < 3:
|
1080
|
+
return
|
1081
|
+
assert len(succs[corner]) == 2
|
1082
|
+
assert self.coords2index(1, 2) in succs[corner]
|
1083
|
+
assert self.coords2index(2, 1) in succs[corner]
|
1084
|
+
# Only two choices. Whichever we pick, the other must be the
|
1085
|
+
# square picked on move m*n, as it's the only way to get back
|
1086
|
+
# to (0, 0). Save its index in self.final so that moves before
|
1087
|
+
# the last know it must be kept free.
|
1088
|
+
for i, j in (1, 2), (2, 1):
|
1089
|
+
this = self.coords2index(i, j)
|
1090
|
+
final = self.coords2index(3-i, 3-j)
|
1091
|
+
self.final = final
|
1092
|
+
|
1093
|
+
remove_from_successors(this)
|
1094
|
+
succs[final].append(corner)
|
1095
|
+
self.lastij = this
|
1096
|
+
yield this
|
1097
|
+
succs[final].remove(corner)
|
1098
|
+
add_to_successors(this)
|
1099
|
+
|
1100
|
+
# Generate moves 3 thru m*n-1.
|
1101
|
+
def advance(len=len):
|
1102
|
+
# If some successor has only one exit, must take it.
|
1103
|
+
# Else favor successors with fewer exits.
|
1104
|
+
candidates = []
|
1105
|
+
for i in succs[self.lastij]:
|
1106
|
+
e = len(succs[i])
|
1107
|
+
assert e > 0, "else remove_from_successors() pruning flawed"
|
1108
|
+
if e == 1:
|
1109
|
+
candidates = [(e, i)]
|
1110
|
+
break
|
1111
|
+
candidates.append((e, i))
|
1112
|
+
else:
|
1113
|
+
candidates.sort()
|
1114
|
+
|
1115
|
+
for e, i in candidates:
|
1116
|
+
if i != self.final:
|
1117
|
+
if remove_from_successors(i):
|
1118
|
+
self.lastij = i
|
1119
|
+
yield i
|
1120
|
+
add_to_successors(i)
|
1121
|
+
|
1122
|
+
# Generate moves 3 thru m*n-1. Alternative version using a
|
1123
|
+
# stronger (but more expensive) heuristic to order successors.
|
1124
|
+
# Since the # of backtracking levels is m*n, a poor move early on
|
1125
|
+
# can take eons to undo. Smallest square board for which this
|
1126
|
+
# matters a lot is 52x52.
|
1127
|
+
def advance_hard(vmid=(m-1)/2.0, hmid=(n-1)/2.0, len=len):
|
1128
|
+
# If some successor has only one exit, must take it.
|
1129
|
+
# Else favor successors with fewer exits.
|
1130
|
+
# Break ties via max distance from board centerpoint (favor
|
1131
|
+
# corners and edges whenever possible).
|
1132
|
+
candidates = []
|
1133
|
+
for i in succs[self.lastij]:
|
1134
|
+
e = len(succs[i])
|
1135
|
+
assert e > 0, "else remove_from_successors() pruning flawed"
|
1136
|
+
if e == 1:
|
1137
|
+
candidates = [(e, 0, i)]
|
1138
|
+
break
|
1139
|
+
i1, j1 = self.index2coords(i)
|
1140
|
+
d = (i1 - vmid)**2 + (j1 - hmid)**2
|
1141
|
+
candidates.append((e, -d, i))
|
1142
|
+
else:
|
1143
|
+
candidates.sort()
|
1144
|
+
|
1145
|
+
for e, d, i in candidates:
|
1146
|
+
if i != self.final:
|
1147
|
+
if remove_from_successors(i):
|
1148
|
+
self.lastij = i
|
1149
|
+
yield i
|
1150
|
+
add_to_successors(i)
|
1151
|
+
|
1152
|
+
# Generate the last move.
|
1153
|
+
def last():
|
1154
|
+
assert self.final in succs[self.lastij]
|
1155
|
+
yield self.final
|
1156
|
+
|
1157
|
+
if m*n < 4:
|
1158
|
+
self.squaregenerators = [first]
|
1159
|
+
else:
|
1160
|
+
self.squaregenerators = [first, second] + \
|
1161
|
+
[hard and advance_hard or advance] * (m*n - 3) + \
|
1162
|
+
[last]
|
1163
|
+
|
1164
|
+
def coords2index(self, i, j):
|
1165
|
+
assert 0 <= i < self.m
|
1166
|
+
assert 0 <= j < self.n
|
1167
|
+
return i * self.n + j
|
1168
|
+
|
1169
|
+
def index2coords(self, index):
|
1170
|
+
assert 0 <= index < self.m * self.n
|
1171
|
+
return divmod(index, self.n)
|
1172
|
+
|
1173
|
+
def _init_board(self):
|
1174
|
+
succs = self.succs
|
1175
|
+
del succs[:]
|
1176
|
+
m, n = self.m, self.n
|
1177
|
+
c2i = self.coords2index
|
1178
|
+
|
1179
|
+
offsets = [( 1, 2), ( 2, 1), ( 2, -1), ( 1, -2),
|
1180
|
+
(-1, -2), (-2, -1), (-2, 1), (-1, 2)]
|
1181
|
+
rangen = range(n)
|
1182
|
+
for i in range(m):
|
1183
|
+
for j in rangen:
|
1184
|
+
s = [c2i(i+io, j+jo) for io, jo in offsets
|
1185
|
+
if 0 <= i+io < m and
|
1186
|
+
0 <= j+jo < n]
|
1187
|
+
succs.append(s)
|
1188
|
+
|
1189
|
+
# Generate solutions.
|
1190
|
+
def solve(self):
|
1191
|
+
self._init_board()
|
1192
|
+
for x in conjoin(self.squaregenerators):
|
1193
|
+
yield x
|
1194
|
+
|
1195
|
+
def printsolution(self, x):
|
1196
|
+
m, n = self.m, self.n
|
1197
|
+
assert len(x) == m*n
|
1198
|
+
w = len(str(m*n))
|
1199
|
+
format = "%" + str(w) + "d"
|
1200
|
+
|
1201
|
+
squares = [[None] * n for i in range(m)]
|
1202
|
+
k = 1
|
1203
|
+
for i in x:
|
1204
|
+
i1, j1 = self.index2coords(i)
|
1205
|
+
squares[i1][j1] = format % k
|
1206
|
+
k += 1
|
1207
|
+
|
1208
|
+
sep = "+" + ("-" * w + "+") * n
|
1209
|
+
print sep
|
1210
|
+
for i in range(m):
|
1211
|
+
row = squares[i]
|
1212
|
+
print "|" + "|".join(row) + "|"
|
1213
|
+
print sep
|
1214
|
+
|
1215
|
+
conjoin_tests = """
|
1216
|
+
|
1217
|
+
Generate the 3-bit binary numbers in order. This illustrates dumbest-
|
1218
|
+
possible use of conjoin, just to generate the full cross-product.
|
1219
|
+
|
1220
|
+
>>> for c in conjoin([lambda: iter((0, 1))] * 3):
|
1221
|
+
... print c
|
1222
|
+
[0, 0, 0]
|
1223
|
+
[0, 0, 1]
|
1224
|
+
[0, 1, 0]
|
1225
|
+
[0, 1, 1]
|
1226
|
+
[1, 0, 0]
|
1227
|
+
[1, 0, 1]
|
1228
|
+
[1, 1, 0]
|
1229
|
+
[1, 1, 1]
|
1230
|
+
|
1231
|
+
For efficiency in typical backtracking apps, conjoin() yields the same list
|
1232
|
+
object each time. So if you want to save away a full account of its
|
1233
|
+
generated sequence, you need to copy its results.
|
1234
|
+
|
1235
|
+
>>> def gencopy(iterator):
|
1236
|
+
... for x in iterator:
|
1237
|
+
... yield x[:]
|
1238
|
+
|
1239
|
+
>>> for n in range(10):
|
1240
|
+
... all = list(gencopy(conjoin([lambda: iter((0, 1))] * n)))
|
1241
|
+
... print n, len(all), all[0] == [0] * n, all[-1] == [1] * n
|
1242
|
+
0 1 1 1
|
1243
|
+
1 2 1 1
|
1244
|
+
2 4 1 1
|
1245
|
+
3 8 1 1
|
1246
|
+
4 16 1 1
|
1247
|
+
5 32 1 1
|
1248
|
+
6 64 1 1
|
1249
|
+
7 128 1 1
|
1250
|
+
8 256 1 1
|
1251
|
+
9 512 1 1
|
1252
|
+
|
1253
|
+
And run an 8-queens solver.
|
1254
|
+
|
1255
|
+
>>> q = Queens(8)
|
1256
|
+
>>> LIMIT = 2
|
1257
|
+
>>> count = 0
|
1258
|
+
>>> for row2col in q.solve():
|
1259
|
+
... count += 1
|
1260
|
+
... if count <= LIMIT:
|
1261
|
+
... print "Solution", count
|
1262
|
+
... q.printsolution(row2col)
|
1263
|
+
Solution 1
|
1264
|
+
+-+-+-+-+-+-+-+-+
|
1265
|
+
|Q| | | | | | | |
|
1266
|
+
+-+-+-+-+-+-+-+-+
|
1267
|
+
| | | | |Q| | | |
|
1268
|
+
+-+-+-+-+-+-+-+-+
|
1269
|
+
| | | | | | | |Q|
|
1270
|
+
+-+-+-+-+-+-+-+-+
|
1271
|
+
| | | | | |Q| | |
|
1272
|
+
+-+-+-+-+-+-+-+-+
|
1273
|
+
| | |Q| | | | | |
|
1274
|
+
+-+-+-+-+-+-+-+-+
|
1275
|
+
| | | | | | |Q| |
|
1276
|
+
+-+-+-+-+-+-+-+-+
|
1277
|
+
| |Q| | | | | | |
|
1278
|
+
+-+-+-+-+-+-+-+-+
|
1279
|
+
| | | |Q| | | | |
|
1280
|
+
+-+-+-+-+-+-+-+-+
|
1281
|
+
Solution 2
|
1282
|
+
+-+-+-+-+-+-+-+-+
|
1283
|
+
|Q| | | | | | | |
|
1284
|
+
+-+-+-+-+-+-+-+-+
|
1285
|
+
| | | | | |Q| | |
|
1286
|
+
+-+-+-+-+-+-+-+-+
|
1287
|
+
| | | | | | | |Q|
|
1288
|
+
+-+-+-+-+-+-+-+-+
|
1289
|
+
| | |Q| | | | | |
|
1290
|
+
+-+-+-+-+-+-+-+-+
|
1291
|
+
| | | | | | |Q| |
|
1292
|
+
+-+-+-+-+-+-+-+-+
|
1293
|
+
| | | |Q| | | | |
|
1294
|
+
+-+-+-+-+-+-+-+-+
|
1295
|
+
| |Q| | | | | | |
|
1296
|
+
+-+-+-+-+-+-+-+-+
|
1297
|
+
| | | | |Q| | | |
|
1298
|
+
+-+-+-+-+-+-+-+-+
|
1299
|
+
|
1300
|
+
>>> print count, "solutions in all."
|
1301
|
+
92 solutions in all.
|
1302
|
+
|
1303
|
+
And run a Knight's Tour on a 10x10 board. Note that there are about
|
1304
|
+
20,000 solutions even on a 6x6 board, so don't dare run this to exhaustion.
|
1305
|
+
|
1306
|
+
>>> k = Knights(10, 10)
|
1307
|
+
>>> LIMIT = 2
|
1308
|
+
>>> count = 0
|
1309
|
+
>>> for x in k.solve():
|
1310
|
+
... count += 1
|
1311
|
+
... if count <= LIMIT:
|
1312
|
+
... print "Solution", count
|
1313
|
+
... k.printsolution(x)
|
1314
|
+
... else:
|
1315
|
+
... break
|
1316
|
+
Solution 1
|
1317
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1318
|
+
| 1| 58| 27| 34| 3| 40| 29| 10| 5| 8|
|
1319
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1320
|
+
| 26| 35| 2| 57| 28| 33| 4| 7| 30| 11|
|
1321
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1322
|
+
| 59|100| 73| 36| 41| 56| 39| 32| 9| 6|
|
1323
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1324
|
+
| 74| 25| 60| 55| 72| 37| 42| 49| 12| 31|
|
1325
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1326
|
+
| 61| 86| 99| 76| 63| 52| 47| 38| 43| 50|
|
1327
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1328
|
+
| 24| 75| 62| 85| 54| 71| 64| 51| 48| 13|
|
1329
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1330
|
+
| 87| 98| 91| 80| 77| 84| 53| 46| 65| 44|
|
1331
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1332
|
+
| 90| 23| 88| 95| 70| 79| 68| 83| 14| 17|
|
1333
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1334
|
+
| 97| 92| 21| 78| 81| 94| 19| 16| 45| 66|
|
1335
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1336
|
+
| 22| 89| 96| 93| 20| 69| 82| 67| 18| 15|
|
1337
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1338
|
+
Solution 2
|
1339
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1340
|
+
| 1| 58| 27| 34| 3| 40| 29| 10| 5| 8|
|
1341
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1342
|
+
| 26| 35| 2| 57| 28| 33| 4| 7| 30| 11|
|
1343
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1344
|
+
| 59|100| 73| 36| 41| 56| 39| 32| 9| 6|
|
1345
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1346
|
+
| 74| 25| 60| 55| 72| 37| 42| 49| 12| 31|
|
1347
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1348
|
+
| 61| 86| 99| 76| 63| 52| 47| 38| 43| 50|
|
1349
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1350
|
+
| 24| 75| 62| 85| 54| 71| 64| 51| 48| 13|
|
1351
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1352
|
+
| 87| 98| 89| 80| 77| 84| 53| 46| 65| 44|
|
1353
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1354
|
+
| 90| 23| 92| 95| 70| 79| 68| 83| 14| 17|
|
1355
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1356
|
+
| 97| 88| 21| 78| 81| 94| 19| 16| 45| 66|
|
1357
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1358
|
+
| 22| 91| 96| 93| 20| 69| 82| 67| 18| 15|
|
1359
|
+
+---+---+---+---+---+---+---+---+---+---+
|
1360
|
+
"""
|
1361
|
+
|
1362
|
+
__test__ = {"tut": tutorial_tests,
|
1363
|
+
"pep": pep_tests,
|
1364
|
+
"email": email_tests,
|
1365
|
+
"fun": fun_tests,
|
1366
|
+
"syntax": syntax_tests,
|
1367
|
+
"conjoin": conjoin_tests}
|
1368
|
+
|
1369
|
+
# Magic test name that regrtest.py invokes *after* importing this module.
|
1370
|
+
# This worms around a bootstrap problem.
|
1371
|
+
# Note that doctest and regrtest both look in sys.argv for a "-v" argument,
|
1372
|
+
# so this works as expected in both ways of running regrtest.
|
1373
|
+
def test_main(verbose=None):
|
1374
|
+
import doctest, test_support, test_generators
|
1375
|
+
if 0: # change to 1 to run forever (to check for leaks)
|
1376
|
+
while 1:
|
1377
|
+
doctest.master = None
|
1378
|
+
test_support.run_doctest(test_generators, verbose)
|
1379
|
+
print ".",
|
1380
|
+
else:
|
1381
|
+
test_support.run_doctest(test_generators, verbose)
|
1382
|
+
|
1383
|
+
# This part isn't needed for regrtest, but for running the test directly.
|
1384
|
+
if __name__ == "__main__":
|
1385
|
+
test_main(1)
|